]> git.pld-linux.org Git - packages/cgoban.git/blame - cgoban-1.9.12-et1.patch
- added info about ver. 1.9.14 on DEVEL branch
[packages/cgoban.git] / cgoban-1.9.12-et1.patch
CommitLineData
9b3e9736 1[The patch is further down.]
2
3Bug fixes:
4
5- Fixed a bug in the networking read loop
6 (conn.c:newNetData). The loop around the read()
7 breaks when taken more than once. Results were
8 damaged game/player lists and garbage in the
9 terminal window.
10
11- Fixed a bug in the bPropW handling in the rc-file.
12 Small windows sizes were not stored. [Note: When
13 starting cgoban (with an old config file) the first
14 time after applying the patch windows will be half
15 the wide that they used to be.]
16
17- Fixed a bug when inserting text into a text window.
18 The passed width was wrong so that it forces a line
19 break of the string when it was not neccesary.
20
21- Inserted a missing str_clip(cmdBuild,0) into
22 client/game.c.
23
24- Fixed a bug in CTRL-D handling of the tbin widget.
25 (SEGV when pressed on last char in last line (not
26 always immediate))
27
28- NNGS guest login sometimes hang. Server sends "#> "
29 (two spaces) which was not recognized as a prompt.
30
31
32Enhancements:
33
34- Added cross mark support (on board, in sgf files, in
35 editor).
36
37- Added support for "titled games". IGS send a "Game
38 is titled: ...." for each move of a titled game.
39 These were shown in the terminal window. I forward
40 these titles to the goban widget where they will be
41 displayed in the title box.
42
43- Added the player names into the timer/score boxes.
44 The rows of black/white stones are reduced to a
45 single stone and the player's name and rank are
46 shown right of that stone. (That was done after I
47 noticed that the names may not be visible in titled
48 games.)
49
50- Optional (compile time support) for a fixed width
51 font in the terminal window. IGS output assumes a
52 fixed width font and the ASCII-graphics, tables, and
53 help files will be messed up with proportional fonts.
54 Change the TBIN_FONTNUM define in
55 wmslib/src/but/tbin.h.
56
57- Made the game list window a little bit larger so that
58 3-digit game numbers will fit into the first column.
59
60- In the game list window the common values of some
61 fields (board size=19, move number=0, handicap=0,
62 observers=0) are replaced by a single dot. Not only
63 makes this the window cleaner, it's also easier to
64 look for special games (unusual board size, high
65 handycap, etc).
66
67- Added a key (XK_Insert) to insert the current
68 selection.
69
70- The resource name changed to "CGoban" from
71 "Basicwin". That way the window manager can properly
72 identify the windows.
73
74- Added a '-connect <name>' command line option and
75 changed the '-nngs/igs' option slightly. '-connect'
76 looks for the given name in the setup's server list
77 and uses that server entry to connect to.
78 '-nngs/igs' has become a shortcut for '-connect
79 NNGS/IGS'. (Original -nngs/igs took always the
80 first/second entry of the list whatever server that
81 may be.)
82 (TODO: gmpSetup still has the same problem).
83
84- '-connect/-igs/-nngs' does an autologin without
85 putting up the username/password requester. Old
86 behaviour selectable by #if. (I'm not sure if the
87 cliData_decRef(cd) in src/main.c:connect_to is
88 required. It seems to be but even without everything
89 seems to work correct...)
90
91- When playing/observing the say/kibitz input box is
92 activated by default. (Pressing RETURN on an empty
93 line still switches back to 'browse-game-mode'. And
94 the input box is empty on start...)
95
96- Use the bold font for the remaining time / score.
97 (And added some space too.)
98
99- Put Helvetica as the first font in the font lists.
100 The serif fonts are too hard to read with these low
101 resolutions.
102
103- I removed all these strange cursor shapes (annoying,
104 especially with the different hotspot locations).
105
106- Made the idle cursor look dull (recolored to some
107 shades of gray).
108
109- Made the scroll speed faster (8 lines/second instead
110 of 2).
111
112
113Ciao, ET. <froese@gmx.de>
114
115
116diff -ru cgoban-1.9.12-orig/src/cgbuts.c cgoban-1.9.12-et1/src/cgbuts.c
117--- cgoban-1.9.12-orig/src/cgbuts.c Tue Jan 25 05:40:24 2000
118+++ cgoban-1.9.12-et1/src/cgbuts.c Mon May 13 22:52:48 2002
119@@ -481,7 +481,10 @@
120 lw = (w + 7) / 15;
121 if (lw < 1)
122 lw = 1;
123- XSetLineAttributes(dpy, gc, lw, LineSolid, CapButt, JoinMiter);
124+ XSetLineAttributes(dpy, gc, lw, LineSolid, CapProjecting, JoinMiter);
125+ /* all of them require abs coordinates */
126+ x -= win->xOff;
127+ y -= win->yOff;
128 }
129 if (piece == goStone_black)
130 butEnv_setXFg(env, BUT_WHITE);
131@@ -490,35 +493,43 @@
132 switch(markType) {
133 case goMark_none:
134 break;
135+ case goMark_cross:
136+ off = w/3;
137+ XDrawLine(dpy, win->win, gc, x+off, y+off, x+2*off, y+2*off);
138+ XDrawLine(dpy, win->win, gc, x+2*off, y+off, x+off, y+2*off);
139+ break;
140 case goMark_triangle:
141- points[0].x = x+w/2 - win->xOff;
142- points[0].y = y+lw - win->yOff;
143- points[1].x = x+((w*0.9330127)-(lw*0.8660254)+0.5) - win->xOff;
144- points[1].y = y+((w*0.75)-(lw*0.5)+0.5) - win->yOff;
145- points[2].x = x+((w*0.0669873)+(lw*0.8660254)+0.5) - win->xOff;
146+ #define SIN60 0.8660254038
147+ #define COS60 0.5
148+ points[0].x = x+w/2;
149+ points[0].y = y+lw-1;
150+ points[1].x = x+(w*(0.5+SIN60/2) - lw*SIN60 + 0.5);
151+ points[1].y = y+(w*(0.5+COS60/2) - lw*COS60 + 0.5);
152+ points[2].x = x+(w*(0.5-SIN60/2) + lw*SIN60 - 0.5);
153 points[2].y = points[1].y;
154 points[3] = points[0];
155 XDrawLines(dpy, win->win, gc, points, 4, CoordModeOrigin);
156 break;
157 case goMark_ko:
158 case goMark_square:
159- off = (int)(w*0.14644661+lw*0.5+0.5);
160- XDrawRectangle(dpy, win->win, gc, x + off - win->xOff, y + off - win->yOff,
161- w-off*2-(lw&1),w-off*2-(lw&1));
162+ #define SIN45 0.7071067812
163+ off = w*(1-SIN45) + lw + 1;
164+ XDrawRectangle(dpy, win->win, gc, x + off/2, y + off/2, w-off, w-off);
165 break;
166 case goMark_lastMove:
167 case goMark_circle:
168 off = (w + 1) / 4;
169- XDrawArc(dpy, win->win, gc, x + off - win->xOff, y + off - win->yOff,
170+ XDrawArc(dpy, win->win, gc, x + off, y + off,
171 w-off*2-1,w-off*2-1, 0,360*64);
172 break;
173 case goMark_smBlack:
174 case goMark_smWhite:
175+ off = (w + 1) / 4;
176 if (markType == goMark_smBlack)
177- cgbuts_drawp(b, win, goStone_black, FALSE, x+(w+1)/4,y+(w+1)/4, w/2,
178+ cgbuts_drawp(b, win, goStone_black, FALSE, x+off,y+off, w/2,
179 stoneVersion, dx,dy,dw,dh);
180 else
181- cgbuts_drawp(b, win, goStone_white, FALSE, x+(w+1)/4,y+(w+1)/4, w/2,
182+ cgbuts_drawp(b, win, goStone_white, FALSE, x+off,y+off, w/2,
183 stoneVersion, dx,dy,dw,dh);
184 break;
185 case goMark_letter:
186@@ -531,7 +542,7 @@
187 assert(markAux >= 0);
188 if (markAux > 999)
189 markAux = 999;
190- if ((markAux > 99) && (w < butEnv_fontH(env, 0) * 2))
191+ if ((markAux > 99) && (w < butEnv_fontH(env, 1) * 2))
192 sprintf(text, "%02d", markAux % 100);
193 else
194 sprintf(text, "%d", markAux);
195diff -ru cgoban-1.9.12-orig/src/cgbuts.h cgoban-1.9.12-et1/src/cgbuts.h
196--- cgoban-1.9.12-orig/src/cgbuts.h Tue Jan 25 05:40:24 2000
197+++ cgoban-1.9.12-et1/src/cgbuts.h Sun Apr 21 20:04:13 2002
198@@ -75,7 +75,7 @@
199
200 typedef enum {
201 goMark_none, goMark_lastMove, goMark_ko,
202- goMark_triangle, goMark_square, goMark_circle,
203+ goMark_cross, goMark_triangle, goMark_square, goMark_circle,
204 goMark_letter, goMark_number, goMark_smWhite, goMark_smBlack
205 } GoMarkType;
206 #define goMark_max (goMark_ko + 1)
207diff -ru cgoban-1.9.12-orig/src/cgoban.c cgoban-1.9.12-et1/src/cgoban.c
208--- cgoban-1.9.12-orig/src/cgoban.c Thu Feb 28 04:34:35 2002
209+++ cgoban-1.9.12-et1/src/cgoban.c Mon May 13 14:46:31 2002
210@@ -91,6 +91,7 @@
211 {"board.showCoords", "t", NULL, CLPSETUP_SHOWBOOL|CLPSETUP_BOOL, NULL},
212 CLPSETUP_MSG(""),
213 {"edit", "", "Edit SGF file", CLPSETUP_NOSAVE, NULL},
214+ {"connect", "", "Connect to given server", CLPSETUP_NOSAVE, NULL},
215 {"nngs", "f", "Connect to NNGS", CLPSETUP_BOOL|CLPSETUP_NOSAVE, NULL},
216 {"igs", "f", "Connect to IGS", CLPSETUP_BOOL|CLPSETUP_NOSAVE, NULL},
217 {"iconic", "f", NULL, CLPSETUP_BOOL|CLPSETUP_NOSAVE, NULL},
218@@ -100,7 +101,7 @@
219 {"help.y", "", NULL, 0, NULL},
220 {"help.w", "28.284271", NULL, 0, NULL},
221 {"help.h", "40.0", NULL, 0, NULL},
222- {"game.rules", "0", NULL, 0, checkRules},
223+ {"game.rules", "1", NULL, 0, checkRules},
224 {"game.size", "19", NULL, 0, checkSize},
225 {"game.komi", "5.5", NULL, 0, checkKomi},
226 {"game.handicap", "0", NULL, 0, checkHandicap},
227@@ -109,7 +110,7 @@
228 {"local.x", "", NULL, 0, NULL},
229 {"local.y", "", NULL, 0, NULL},
230 {"local.bProp", "1.0", NULL, 0, checkBProp},
231- {"local.bPropW", "1.0", NULL, 0, checkBProp},
232+ {"local.bPropW", "2.0", NULL, 0, checkBProp},
233 {"local.sgfName", "game.sgf", NULL, 0, NULL},
234 {"edit.x", "", NULL, 0, NULL},
235 {"edit.y", "", NULL, 0, NULL},
236@@ -118,13 +119,13 @@
237 {"edit.toolW", "0.0", NULL, 0, NULL},
238 {"edit.toolH", "0.0", NULL, 0, NULL},
239 {"edit.bProp", "1.0", NULL, 0, checkBProp},
240- {"edit.bPropW", "1.0", NULL, 0, checkBProp},
241+ {"edit.bPropW", "2.0", NULL, 0, checkBProp},
242 {"edit.sgfName", "seigen-minoru.sgf", NULL, 0, NULL},
243 {"edit.infoX", "", NULL, 0, NULL},
244 {"edit.infoY", "", NULL, 0, NULL},
245 {"edit.infoW", "1.0", NULL, 0, NULL},
246 {"edit.infoH", "1.0", NULL, 0, NULL},
247- {"setup.timeType", "2", NULL, 0, checkTimeType},
248+ {"setup.timeType", "3", NULL, 0, checkTimeType},
249 {"setup.mainTime", "30:00", NULL, 0, checkTimeValue},
250 {"setup.igsBYTime", "10:00", NULL, 0, checkTimeValue},
251 {"setup.igsBYStones", "25", NULL, 0, checkBYStones},
252@@ -189,13 +190,13 @@
253 {"client.x", "", NULL, 0, NULL},
254 {"client.y", "", NULL, 0, NULL},
255 {"client.bProp", "1.0", NULL, 0, checkBProp},
256- {"client.bPropW", "1.0", NULL, 0, checkBProp},
257+ {"client.bPropW", "2.0", NULL, 0, checkBProp},
258 {"client.numberKibitz", "f", NULL, CLPSETUP_BOOL, NULL},
259 {"client.noTypo", "f", NULL, CLPSETUP_BOOL, NULL},
260 {"client.look.x", "", NULL, 0, NULL},
261 {"client.look.y", "", NULL, 0, NULL},
262 {"client.look.bProp", "1.0", NULL, 0, checkBProp},
263- {"client.look.bPropW", "1.0", NULL, 0, checkBProp},
264+ {"client.look.bPropW", "2.0", NULL, 0, checkBProp},
265 {"client.saykib", "1", NULL, 0, NULL},
266 {"client.warnLimit", "30", NULL, 0, NULL},
267 {"abut.fsel.x", "", NULL, 0, NULL},
268@@ -287,6 +288,7 @@
269 butEnv_setFont(cg->env, 1, msg_labelFonts,
270 (cg->fontH*5+3)/6);
271 butEnv_setFont(cg->env, 2, msg_bFonts, cg->fontH);
272+ butEnv_setFont(cg->env, 3, msg_fFonts, cg->fontH);
273 cgbuts_init(&cg->cgbuts, cg->env, cg->rnd, color,
274 clp_getBool(cg->clp, "client.noTypo"),
275 clp_getBool(cg->clp, "hiContrast"),
276diff -ru cgoban-1.9.12-orig/src/client/board.c cgoban-1.9.12-et1/src/client/board.c
277--- cgoban-1.9.12-orig/src/client/board.c Tue Jan 25 05:40:25 2000
278+++ cgoban-1.9.12-et1/src/client/board.c Fri Apr 12 10:03:39 2002
279@@ -65,7 +65,7 @@
280 static const ButKey ctrlKeys[] = {{XK_Control_L, 0,0},
281 {XK_Control_R,0,0}, {0,0,0}};
282 CliBoard *cli;
283- Str gameName;
284+ Str gameName, whiteName, blackName;
285
286 cli = wms_malloc(sizeof(CliBoard));
287 MAGIC_SET(cli);
288@@ -99,14 +99,20 @@
289 cli->game->forcePlay = TRUE;
290 cli->sgf->mode = sgfInsert_variant;
291 str_init(&gameName);
292+ str_init(&whiteName);
293+ str_init(&blackName);
294+ str_print(&whiteName, "%s %s", str_chars(wName), str_chars(wRank));
295+ str_print(&blackName, "%s %s", str_chars(bName), str_chars(bRank));
296 str_print(&gameName, msg_cliGameName, gameNum,
297- str_chars(wName), str_chars(wRank),
298- str_chars(bName), str_chars(bRank));
299+ str_chars(&whiteName), str_chars(&blackName));
300 cli->goban = goban_create(cli->cg, &actions, cli, cli->game,
301- "client", str_chars(&gameName));
302+ "client", str_chars(&gameName),
303+ str_chars(&whiteName), str_chars(&blackName));
304 goban_startTimer(cli->goban, goGame_whoseMove(cli->game));
305 goban_setHold(cli->goban, TRUE);
306 but_setFlags(cli->goban->save, BUT_NOPRESS);
307+ str_deinit(&blackName);
308+ str_deinit(&whiteName);
309 str_deinit(&gameName);
310 cli->goban->iDec1 = grid_create(&cli->cg->cgbuts, NULL, NULL,
311 cli->goban->iWin, 2, BUT_DRAWABLE, 0);
312diff -ru cgoban-1.9.12-orig/src/client/conn.c cgoban-1.9.12-et1/src/client/conn.c
313--- cgoban-1.9.12-orig/src/client/conn.c Tue Jan 25 05:40:25 2000
314+++ cgoban-1.9.12-et1/src/client/conn.c Thu May 9 19:45:22 2002
315@@ -142,64 +142,70 @@
316
317 static ButOut newNetData(void *packet, int fd) {
318 CliConn *cc = packet;
319- int amtRead, totalAmtRead, readLen, lineStart, lineEnd;
320+ int len;
321
322 assert(MAGIC(cc));
323- totalAmtRead = 0;
324- do {
325- if (cc->inLen + totalAmtRead + 1 >= cc->inSize)
326- expandBuf(&cc->inBuf, &cc->inSize, cc->inLen);
327- readLen = cc->inSize - (cc->inLen + totalAmtRead + 1);
328- amtRead = read(cc->fd, cc->inBuf + cc->inLen, readLen);
329- if (amtRead < 0) {
330- if (errno == EAGAIN)
331- amtRead = 0;
332- else {
333- cc->newData(cc->packet, NULL, errno);
334- return(0);
335- }
336- } else if (amtRead == 0) {
337+ if (cc->inLen + 1 >= cc->inSize) /* +1 for \0 */
338+ expandBuf(&cc->inBuf, &cc->inSize, len);
339+ /*FIXME: if server sends a sequence of non-LF chars we run OOM...*/
340+
341+ len = read(cc->fd, cc->inBuf + cc->inLen, cc->inSize - cc->inLen - 1);
342+ if (len <= 0)
343+ {
344+ if (len == 0) /* EOF */
345+ cc->newData(cc->packet, NULL, 0);
346+ else if (errno != EAGAIN)
347 cc->newData(cc->packet, NULL, errno);
348- return(0);
349- }
350- totalAmtRead += amtRead;
351- } while (amtRead == readLen);
352- totalAmtRead = telnetMunge(cc, totalAmtRead);
353- if (totalAmtRead < 0) {
354+ return 0;
355+ }
356+
357+ len = telnetMunge(cc, len);
358+ if (len < 0) /* a telnet ^C packet */
359+ {
360 cc->newData(cc->packet, NULL, EPIPE);
361- return(0);
362+ return 0 ;
363 }
364- if (totalAmtRead > 0) {
365- cc->inLen += totalAmtRead;
366- assert(cc->inLen < cc->inSize);
367- lineStart = 0;
368- for (;;) {
369- lineEnd = lineStart;
370- while ((lineEnd < cc->inLen) && (cc->inBuf[lineEnd] != '\n'))
371- ++lineEnd;
372- if ((lineEnd < cc->inLen) ||
373- (cc->loginMode &&
374- (((lineEnd - lineStart == 7) &&
375- !strncmp(cc->inBuf + lineStart, "Login: ", 7)) ||
376- ((lineEnd - lineStart == 10) &&
377- !strncmp(cc->inBuf + lineStart, "Password: ", 10)) ||
378- ((lineEnd - lineStart == 3) &&
379- !strncmp(cc->inBuf + lineStart, "#> ", 3))))) {
380- cc->inBuf[lineEnd] = '\0';
381-#if TRACELOG
382- printf("%s\n", cc->inBuf + lineStart);
383+
384+ if (len > 0)
385+ {
386+ char *s = cc->inBuf;
387+ char *e = s + cc->inLen + len;
388+ char *p;
389+
390+ *e = '\0';
391+ /* pass complete lines */
392+ while (s < e && (p = memchr(s, '\n', e - s)))
393+ {
394+ *p = '\0';
395+#if TRACELOG
396+ printf("`%s'\n", s);
397 #endif
398- cc->newData(cc->packet, cc->inBuf + lineStart, lineEnd - lineStart);
399- lineStart = lineEnd + 1;
400- } else
401- break;
402+ cc->newData(cc->packet, s, p - s);
403+ s = p + 1;
404 }
405- if (lineStart >= cc->inLen) {
406- cc->inLen = 0;
407- } else if (lineStart > 0) {
408- memmove(cc->inBuf, cc->inBuf + lineStart, cc->inLen - lineStart);
409- cc->inLen -= lineStart;
410+ /* in login mode we may pass (some) incomplete lines */
411+ if (s < e && cc->loginMode)
412+ {
413+ /* strip trailing whitespace */
414+ for (p = e; p > s && isspace(p[-1]); *--p = '\0')
415+ ;
416+ if (!strcmp(s, "Login:") || !strcmp(s, "Password:") || !strcmp(s, "#>"))
417+ {
418+#if TRACELOG
419+ printf("`%s'\n", s);
420+#endif
421+ cc->newData(cc->packet, s, p - s);
422+ s = e + 1;
423+ }
424+ }
425+ if (s < e)
426+ {
427+ cc->inLen = e - s;
428+ if (s > cc->inBuf)
429+ memmove(cc->inBuf, s, cc->inLen);
430 }
431+ else
432+ cc->inLen = 0;
433 }
434 return(0);
435 }
436diff -ru cgoban-1.9.12-orig/src/client/game.c cgoban-1.9.12-et1/src/client/game.c
437--- cgoban-1.9.12-orig/src/client/game.c Thu Feb 28 04:29:03 2002
438+++ cgoban-1.9.12-et1/src/client/game.c Wed Apr 24 16:35:22 2002
439@@ -115,7 +115,7 @@
440 cg = gl->data->cg;
441 physH = butEnv_fontH(gl->data->cg->env, 0);
442 bw = butEnv_stdBw(gl->data->cg->env);
443- minWinW = physH * 18 + bw * 8;
444+ minWinW = physH * 19 + bw * 8;
445 winW = minWinW + physH * 2 * clp_getInt(cg->clp, "client.games.w");
446 wHRatio = clp_getDouble(cg->clp, "client.games.h2");
447 winH = ((double)(minWinW + physH * 12) * wHRatio + 0.5);
448@@ -165,6 +165,15 @@
449 }
450
451
452+void cliGameList_gotTitle(CliGameList *gl, const char *buf) {
453+ if (gl->defaultGame >= 0) {
454+ CliBoard *b = gl->games[gl->defaultGame].board;
455+ if (b)
456+ butText_set(b->goban->labelText, buf);
457+ }
458+}
459+
460+
461 void cliGameList_gotMove(CliGameList *gl, const char *buf) {
462 int args;
463 int moveNum, handicap;
464@@ -351,6 +360,7 @@
465 cliPlayerList_playerInGame(gl->playerList, bName, gameNum);
466 g->moveNum = move;
467 if (g->board && g->fromMatch && (move < 2)) {
468+ str_clip(&gl->data->cmdBuild, 0);
469 if (g->komi != komi)
470 str_print(&gl->data->cmdBuild, "komi %g\n", g->komi);
471 if (g->board->moveBlack) {
472@@ -519,7 +529,6 @@
473 int fontH;
474 int physFontH = butEnv_fontH(butWin_env(win), 0);
475 int slideW = (physFontH * 3)/2;
476- int centerAdd;
477
478 assert(MAGIC(gl));
479 fontH = gl->data->cg->fontH;
480@@ -535,28 +544,27 @@
481 slideW, physFontH);
482 butCan_resizeWin(gl->swin->win, 0, butList_len(gl->list) *
483 physFontH + bw * 2, TRUE);
484- centerAdd = (physFontH * 3 + 1) / 4;
485- tabs[0] = (physFontH * 2) / 2;
486- tabs[1] = (physFontH * 3) / 2;
487- tabs[2] = (physFontH * 17) / 2;
488- tabs[3] = (physFontH * 20) / 2;
489- tabs[4] = (physFontH * 37) / 2;
490- tabs[5] = (physFontH * 41) / 2;
491- tabs[6] = (physFontH * 45) / 2;
492- tabs[7] = (physFontH * 49) / 2;
493- tabs[8] = (physFontH * 53) / 2;
494- tabs[9] = (physFontH * 57) / 2;
495- if (w < physFontH * 20 + bw * 8)
496+ tabs[0] = (physFontH * 3) / 2;
497+ tabs[1] = (physFontH * 4) / 2;
498+ tabs[2] = (physFontH * 18) / 2;
499+ tabs[3] = (physFontH * 21) / 2;
500+ tabs[4] = (physFontH * 38) / 2;
501+ tabs[5] = (physFontH * 42) / 2;
502+ tabs[6] = (physFontH * 46) / 2;
503+ tabs[7] = (physFontH * 50) / 2;
504+ tabs[8] = (physFontH * 54) / 2;
505+ tabs[9] = (physFontH * 58) / 2;
506+ if (w < physFontH * 21 + bw * 8)
507 tabs[4] += physFontH * 20;
508- if (w < physFontH * 22 + bw * 8)
509+ if (w < physFontH * 23 + bw * 8)
510 tabs[5] += physFontH * 20;
511- if (w < physFontH * 24 + bw * 8)
512+ if (w < physFontH * 25 + bw * 8)
513 tabs[6] += physFontH * 20;
514- if (w < physFontH * 26 + bw * 8)
515+ if (w < physFontH * 27 + bw * 8)
516 tabs[7] += physFontH * 20;
517- if (w < physFontH * 28 + bw * 8)
518+ if (w < physFontH * 29 + bw * 8)
519 tabs[8] += physFontH * 20;
520- if (w < physFontH * 30 + bw * 8)
521+ if (w < physFontH * 31 + bw * 8)
522 tabs[9] += physFontH * 20;
523 butList_setTabs(gl->title, tabs, tabAligns, 10);
524 butList_setTabs(gl->list, tabs, tabAligns, 10);
525@@ -599,6 +607,19 @@
526 return(0);
527 }
528
529+static const char *
530+opt_num(int num, int ignore)
531+{
532+ static char buf[64];
533+ static char *p = buf;
534+
535+ if (num == ignore)
536