int breaks[MAX_OPTIONS];\r
int checks, combos, buttons, layout, groups;\r
char title[MSG_SIZ];\r
-char *engineName, *engineDir, *engineChoice, *engineLine, *nickName, *params;\r
+char *engineName, *engineDir, *protocolChoice, *engineLine, *nickName, *params;\r
Boolean isUCI, hasBook, storeVariant, v1, addToList, useNick, isUCCI;\r
extern Option installOptions[], matchOptions[];\r
char *engineList[MAXENGINES] = {""}, *engineMnemonic[MAXENGINES] = {""};\r
case PathName:\r
case Slider:\r
case Label:\r
+ case GroupBox:\r
case Spin: stop++;\r
default:\r
case Message: ; // cannot happen\r
// look if we hit a group of options having names that start with the same word\r
int groupSize = 1, groupNameLength = 50;\r
sscanf(optionList[k].name, "%s", buf); // get first word of option name\r
+ if(optionList[k].type == GroupBox) groupSize = optionList[k].max, groupNameLength = -strlen(optionList[k].name), groupNameList[groups+1] = k; else\r
while(k + groupSize < nrOpt &&\r
strstr(optionList[k+groupSize].name, buf) == optionList[k+groupSize].name) {\r
int j;\r
LayoutOptions(n, k, "", optionList); // flush all solitary options appearing before the group\r
groupNameList[groups] = groupNameLength;\r
boxList[groups++] = layout; // group start in even entries\r
+ if(groupNameLength <= 0) n = ++k;\r
LayoutOptions(k, k+groupSize, buf, optionList); // flush the group\r
boxList[groups++] = layout; // group end in odd entries\r
k = n = k + groupSize;\r
if(layoutList[k] < 0) continue;\r
for(p=0; p<groupNameList[i]; p++) buf[p] = optionList[layoutList[k]].name[p];\r
buf[p] = 0;\r
+ if(groupNameList[i] < 0) safeStrCpy(buf, optionList[groupNameList[i+1]].name, MSG_SIZ);\r
SetDlgItemText( hDlg, 2000+2*(id+MAX_OPTIONS), buf );\r
}\r
}\r
for(k=0; k<optionList[j].max; k++) {\r
if(choices[k] && !strcmp(choices[k], newText)) new = k;\r
}\r
- if(!cps && new > 0) {\r
+ if(!cps && new >= 0) {\r
if(*(char**)optionList[j].target) free(*(char**)optionList[j].target);\r
*(char**)optionList[j].target = strdup(optionList[j].choice[new]);\r
break;\r
template.header.cdit = 0;\r
template.header.cx = 307;\r
buttonRows = (buttons + 1 + 3)/4; // 4 per row, rounded up\r
- if(nr > 50) {\r
+ if(nr > 48) {\r
breakPoint = (nr+2*buttonRows+1)/2 & ~1;\r
template.header.cx = 625;\r
}\r
for(ii=0; ii<nr; ii++) {\r
i = ii^1; if(i == nr) i = ii; // if two on one line, swap order of treatment, to get good (left to right) tabbing order.\r
if(k < groups && ii == boxList[k]) {\r
+ int tlen = groupNameList[k]; if(tlen < 0) tlen = -tlen;\r
y += 10;\r
AddControl(x+2, y+13*(i>>1)-2, 301, 13*(boxList[k+1]-boxList[k]>>1)+8,\r
0x0082, WS_VISIBLE | WS_CHILD | SS_BLACKFRAME, 2400);\r
- AddControl(x+60, y+13*(i>>1)-6, 10*groupNameList[k]/3, 10,\r
+ AddControl(x+60, y+13*(i>>1)-6, 10*tlen/3, 10,\r
0x0082, SS_ENDELLIPSIS | WS_VISIBLE | WS_CHILD, 2*(ii+MAX_OPTIONS));\r
}\r
j = layoutList[i];\r
int EnterGroup P((HWND hDlg));\r
\r
static int engineNr, selected;\r
+char *protocols[] = { "autodetect", "WB", "UCI", "USI/UCCI", "WB v1", NULL };\r
\r
int InstallOK()\r
{\r
if(selected >= 0) { ASSIGN(engineLine, engineList[selected]); }\r
if(engineLine[0] == '#') { DisplayError(_("Select single engine from the group"), 0); return 0; }\r
+ if(!strcmp(protocolChoice, protocols[0])) isUCI = 3; else\r
+ if(!strcmp(protocolChoice, protocols[2])) isUCI = 1; else\r
+ if(!strcmp(protocolChoice, protocols[3])) isUCCI = 1; else\r
+ if(!strcmp(protocolChoice, protocols[4])) v1 = 1;\r
if(isUCCI) isUCI = 2;\r
if(!engineNr) Load(&first, 0); else Load(&second, 1);\r
return 1;\r
// { 0, 0, 0, NULL, (void*) &engineLine, (char*) engineMnemonic, engineList, ComboBox, N_("Select engine from list:") },\r
{ 195, 14, 0, NULL, (void*) &EnterGroup, (char*) &selected, engineMnemonic, ListBox, N_("Select engine from list:") },\r
{ 0, 0, 0, NULL, NULL, NULL, NULL, Label, N_("or specify one below:") },\r
+ { 0, 0, 32+3, NULL, (void*) &engineName, NULL, NULL, FileName, N_("Engine (.exe or .jar):") },\r
+ { 0, 0, 5, NULL, (void*) &protocolChoice, (char*) protocols, protocols, ComboBox, N_("Engine protocol") },\r
+ { 0, 0, 5, NULL, NULL, NULL, NULL, GroupBox, N_("Optional user preferences") },\r
{ 0, 0, 0, NULL, (void*) &nickName, NULL, NULL, TextBox, N_("Nickname (optional):") },\r
+ { 0, 0, 0, NULL, (void*) &addToList, NULL, NULL, CheckBox, N_("Add this engine to the list") },\r
+ { 0, 0, 0, NULL, (void*) &hasBook, NULL, NULL, CheckBox, N_("Must not use GUI book") },\r
{ 0, 0, 0, NULL, (void*) &useNick, NULL, NULL, CheckBox, N_("Use nickname in PGN tag") },\r
- { 0, 0, 32+3, NULL, (void*) &engineName, NULL, NULL, FileName, N_("Engine (.exe or .jar):") },\r
+ { 0, 0, 0, NULL, (void*) &storeVariant, NULL, NULL, CheckBox, N_("Force current variant with this engine") },\r
+ { 0, 0, 4, NULL, NULL, NULL, NULL, GroupBox, N_("Advanced (special cases only, as per engine README file)") },\r
{ 0, 0, 0, NULL, (void*) ¶ms, NULL, NULL, TextBox, N_("command-line parameters:") },\r
{ 0, 0, 0, NULL, (void*) &wbOptions, NULL, NULL, TextBox, N_("Special WinBoard options:") },\r
{ 0, 0, 0, NULL, (void*) &engineDir, NULL, NULL, PathName, N_("directory:") },\r
{ 95, 0, 0, NULL, NULL, NULL, NULL, Label, N_("(Directory will be derived from engine path when left empty)") },\r
- { 0, 0, 0, NULL, (void*) &addToList, NULL, NULL, CheckBox, N_("Add this engine to the list") },\r
- { 0, 0, 0, NULL, (void*) &hasBook, NULL, NULL, CheckBox, N_("Must not use GUI book") },\r
- { 0, 0, 0, NULL, (void*) &storeVariant, NULL, NULL, CheckBox, N_("Force current variant with this engine") },\r
- { 0, 0, 0, NULL, (void*) &isUCI, NULL, NULL, CheckBox, N_("UCI") },\r
- { 0, 0, 0, NULL, (void*) &v1, NULL, NULL, CheckBox, N_("WB protocol v1 (skip waiting for features)") },\r
- { 0, 0, 0, NULL, (void*) &isUCCI, NULL, NULL, CheckBox, N_("UCCI/USI/Arena960 (through /uxiAdapter)") },\r
{ 0, 1, 0, NULL, (void*) &InstallOK, "", NULL, EndMark , "" }\r
};\r
\r
\r
void LoadEnginePopUp(HWND hwnd, int nr)\r
{\r
- if(*engineListFile) ParseSettingsFile(engineListFile, &engineListFile); // contains engine list\r
isUCI = isUCCI = storeVariant = v1 = useNick = FALSE; addToList = hasBook = TRUE; // defaults\r
engineNr = nr;\r
if(engineDir) free(engineDir); engineDir = strdup("");\r