191
pty[w].cur_x = pty[w].save_x = pty[w].min_x;
192
pty[w].cur_y = pty[w].save_y = pty[w].max_y - 1;
194
pty[w].cur.x = pty[w].min_x;
195
pty[w].cur.y = pty[w].max_y - 1;
193
196
pty[w].min_scroll = pty[w].min_y;
194
197
pty[w].max_scroll = pty[w].max_y - 1;
195
198
pty[w].escmode = '\0';
202
205
resettermattr(w);
203
206
resettermcode(w);
208
memcpy((char *)&(pty[w].save), (char *)&(pty[w].cur),
209
sizeof(pty[w].save));
207
pty[w].cur_x += pty[w].min_x - min_x;
208
pty[w].cur_y += pty[w].min_y - min_y;
209
pty[w].save_x += pty[w].save_x - min_x;
210
pty[w].save_y += pty[w].save_y - min_y;
212
pty[w].cur.x += pty[w].min_x - min_x;
213
pty[w].cur.y += pty[w].min_y - min_y;
214
pty[w].save.x += pty[w].min_x - min_x;
215
pty[w].save.y += pty[w].min_y - min_y;
211
216
pty[w].min_scroll += pty[w].min_y - min_y;
212
217
pty[w].max_scroll += pty[w].max_y - max_y;
213
biasxy(w, &(pty[w].cur_x), &(pty[w].cur_y));
214
biasxy(w, &(pty[w].save_x), &(pty[w].save_y));
218
biasxy(w, &(pty[w].cur.x), &(pty[w].cur.y));
219
biasxy(w, &(pty[w].save.x), &(pty[w].save.y));
215
220
biasxy(w, NULL, &(pty[w].min_scroll));
216
221
biasxy(w, NULL, &(pty[w].max_scroll));
234
239
static VOID NEAR settermattr(w)
237
if ((last_fg >= (short)0 && pty[w].fg < (short)0)
238
|| (last_bg >= (short)0 && pty[w].bg < (short)0))
242
if ((last_fg >= (short)0 && pty[w].cur.fg < (short)0)
243
|| (last_bg >= (short)0 && pty[w].cur.bg < (short)0))
239
244
resettermattr(-1);
241
if (last_attr != pty[w].attr) {
246
if (last_attr != pty[w].cur.attr) {
242
247
putterm(T_NORMAL);
243
248
last_fg = last_bg = (short)-1;
244
if (pty[w].attr & A_BOLD) putterm(T_BOLD);
245
if (pty[w].attr & A_REVERSE) putterm(T_REVERSE);
246
if (pty[w].attr & A_DIM) putterm(T_DIM);
247
if (pty[w].attr & A_BLINK) putterm(T_BLINK);
248
if (pty[w].attr & A_STANDOUT) putterm(T_STANDOUT);
249
if (pty[w].attr & A_UNDERLINE) putterm(T_UNDERLINE);
250
last_attr = pty[w].attr;
249
if (pty[w].cur.attr & A_BOLD) putterm(T_BOLD);
250
if (pty[w].cur.attr & A_REVERSE) putterm(T_REVERSE);
251
if (pty[w].cur.attr & A_DIM) putterm(T_DIM);
252
if (pty[w].cur.attr & A_BLINK) putterm(T_BLINK);
253
if (pty[w].cur.attr & A_STANDOUT) putterm(T_STANDOUT);
254
if (pty[w].cur.attr & A_UNDERLINE) putterm(T_UNDERLINE);
255
last_attr = pty[w].cur.attr;
253
if (last_fg != pty[w].fg && pty[w].fg >= (short)0) {
254
if (tputparam(T_FGCOLOR, pty[w].fg, 0, 1) < 0)
255
tprintf("\033[%dm", 1, pty[w].fg + ANSI_NORMAL);
258
if (last_fg != pty[w].cur.fg && pty[w].cur.fg >= (short)0) {
259
if (tputparam(T_FGCOLOR, pty[w].cur.fg, 0, 1) < 0)
260
tprintf("\033[%dm", 1, pty[w].cur.fg + ANSI_NORMAL);
261
last_fg = pty[w].cur.fg;
258
if (last_bg != pty[w].bg && pty[w].bg >= (short)0) {
259
if (tputparam(T_BGCOLOR, pty[w].bg, 0, 1) < 0)
260
tprintf("\033[%dm", 1, pty[w].bg + ANSI_REVERSE);
263
if (last_bg != pty[w].cur.bg && pty[w].cur.bg >= (short)0) {
264
if (tputparam(T_BGCOLOR, pty[w].cur.bg, 0, 1) < 0)
265
tprintf("\033[%dm", 1, pty[w].cur.bg + ANSI_REVERSE);
266
last_bg = pty[w].cur.bg;
285
290
static VOID NEAR surelocate(w, forced)
288
if (!forced && pty[w].cur_x == last_x && pty[w].cur_y == last_y)
293
if (!forced && pty[w].cur.x == last_x && pty[w].cur.y == last_y)
291
296
resettermattr(-1);
292
locate(pty[w].cur_x, pty[w].cur_y);
293
last_x = pty[w].cur_x;
294
last_y = pty[w].cur_y;
297
locate(pty[w].cur.x, pty[w].cur.y);
298
last_x = pty[w].cur.x;
299
last_y = pty[w].cur.y;
297
302
static VOID NEAR reallocate(w, x, y)
299
if (pty[w].attr || pty[w].fg >= (short)0 || pty[w].bg >= (short)0) {
306
|| pty[w].cur.fg >= (short)0 || pty[w].cur.bg >= (short)0) {
300
307
surelocate(w, 1);
306
biasxy(w, &(pty[w].cur_x), &(pty[w].cur_y));
307
locate(pty[w].cur_x, pty[w].cur_y);
313
biasxy(w, &(pty[w].cur.x), &(pty[w].cur.y));
314
locate(pty[w].cur.x, pty[w].cur.y);
309
last_x = pty[w].cur_x;
310
last_y = pty[w].cur_y;
316
last_x = pty[w].cur.x;
317
last_y = pty[w].cur.y;
343
350
if (xmax != pty[i].max_x - pty[i].min_x
344
351
|| ymax != pty[i].max_y - pty[i].min_y) {
345
pty[i].cur_x = pty[i].save_x = pty[i].min_x;
346
pty[i].cur_y = pty[i].save_y = pty[i].max_y - 1;
352
pty[i].cur.x = pty[i].save.x = pty[i].min_x;
353
pty[i].cur.y = pty[i].save.y = pty[i].max_y - 1;
349
356
resetptyterm(i, 0);
574
581
resettermattr(-1);
575
regionscroll(n, c, pty[w].cur_x, pty[w].cur_y,
582
regionscroll(n, c, pty[w].cur.x, pty[w].cur.y,
576
583
pty[w].min_scroll, pty[w].max_scroll);
578
last_x = pty[w].cur_x;
579
last_y = pty[w].cur_y;
585
last_x = pty[w].cur.x;
586
last_y = pty[w].cur.y;
582
589
static VOID NEAR evallf(w)
585
if (pty[w].cur_y < pty[w].max_y
586
&& pty[w].cur_y == pty[w].max_scroll)
592
if (pty[w].cur.y < pty[w].max_y
593
&& pty[w].cur.y == pty[w].max_scroll)
587
594
evalscroll(w, C_SCROLLFORW, 1);
588
else reallocate(w, pty[w].cur_x, pty[w].cur_y + 1);
595
else reallocate(w, pty[w].cur.x, pty[w].cur.y + 1);
591
598
static VOID NEAR outputnormal(w, buf, width)
719
reallocate(w, pty[w].cur_x - 1, pty[w].cur_y);
726
reallocate(w, pty[w].cur.x - 1, pty[w].cur.y);
722
729
for (i = 0; i < pty[w].ntabstop; i++)
723
if (pty[w].cur_x < pty[w].tabstop[i]) break;
730
if (pty[w].cur.x < pty[w].tabstop[i]) break;
724
731
i = (i < pty[w].ntabstop)
725
732
? pty[w].tabstop[i] : pty[w].max_x - 1;
726
reallocate(w, i, pty[w].cur_y);
733
reallocate(w, i, pty[w].cur.y);
729
reallocate(w, pty[w].min_x, pty[w].cur_y);
736
reallocate(w, pty[w].min_x, pty[w].cur.y);
759
766
pty[w].escmode = '\0';
762
pty[w].save_x = pty[w].cur_x;
763
pty[w].save_y = pty[w].cur_y;
769
memcpy((char *)&(pty[w].save), (char *)&(pty[w].cur),
770
sizeof(pty[w].save));
766
pty[w].cur_x = pty[w].save_x;
767
pty[w].cur_y = pty[w].save_y;
768
biasxy(w, &(pty[w].cur_x), &(pty[w].cur_y));
773
memcpy((char *)&(pty[w].cur), (char *)&(pty[w].save),
775
biasxy(w, &(pty[w].cur.x), &(pty[w].cur.y));
769
776
surelocate(w, 1);
782
pty[w].cur_x = pty[w].min_x;
789
pty[w].cur.x = pty[w].min_x;
786
793
if (pty[w].ntabstop >= (u_char)MAXTABSTOP) break;
787
794
for (i = 0; i < pty[w].ntabstop; i++)
788
if (pty[w].cur_x <= pty[w].tabstop[i]) break;
795
if (pty[w].cur.x <= pty[w].tabstop[i]) break;
789
796
if (i >= pty[w].ntabstop)
790
797
pty[w].tabstop[(pty[w].ntabstop)++] =
792
else if (pty[w].cur_x == pty[w].tabstop[i]) break;
799
else if (pty[w].cur.x == pty[w].tabstop[i]) break;
794
801
memmove((char *)&(pty[w].tabstop[i + 1]),
795
802
(char *)&(pty[w].tabstop[i]),
796
803
((pty[w].ntabstop)++ - i)
797
804
* sizeof(u_short));
798
pty[w].tabstop[i] = pty[w].cur_x;
805
pty[w].tabstop[i] = pty[w].cur.x;
802
if (pty[w].cur_y >= pty[w].min_y
803
&& pty[w].cur_y == pty[w].min_scroll)
809
if (pty[w].cur.y >= pty[w].min_y
810
&& pty[w].cur.y == pty[w].min_scroll)
804
811
evalscroll(w, L_INSERT, 1);
805
else reallocate(w, pty[w].cur_x, pty[w].cur_y - 1);
812
else reallocate(w, pty[w].cur.x, pty[w].cur.y - 1);
808
815
pty[w].termflags = (u_short)0;
809
816
resettermattr(w);
810
817
resettermcode(w);
819
memcpy((char *)&(pty[w].save), (char *)&(pty[w].cur),
820
sizeof(pty[w].save));
812
821
surelocate(w, 1);
814
823
pty[w].min_scroll = pty[w].min_y;
865
874
if (pty[w].escmode != ']') break;
866
875
n = pty[w].escparam[0];
867
876
if (n <= 0) n = 1;
868
reallocate(w, pty[w].cur_x, pty[w].cur_y - n);
877
reallocate(w, pty[w].cur.x, pty[w].cur.y - n);
871
880
if (pty[w].escmode != ']') break;
872
881
n = pty[w].escparam[0];
873
882
if (n <= 0) n = 1;
874
reallocate(w, pty[w].cur_x, pty[w].cur_y + n);
883
reallocate(w, pty[w].cur.x, pty[w].cur.y + n);
877
886
if (pty[w].escmode != ']') break;
878
887
n = pty[w].escparam[0];
879
888
if (n <= 0) n = 1;
880
reallocate(w, pty[w].cur_x + n, pty[w].cur_y);
889
reallocate(w, pty[w].cur.x + n, pty[w].cur.y);
883
892
if (pty[w].escmode != ']') break;
884
893
n = pty[w].escparam[0];
885
894
if (n <= 0) n = 1;
886
reallocate(w, pty[w].cur_x - n, pty[w].cur_y);
895
reallocate(w, pty[w].cur.x - n, pty[w].cur.y);
901
908
switch (pty[w].escparam[i]) {
904
pty[w].attr = (u_short)0;
905
pty[w].fg = pty[w].bg = (short)-1;
911
pty[w].cur.attr = (u_short)0;
913
pty[w].cur.bg = (short)-1;
908
pty[w].attr |= A_BOLD;
916
pty[w].cur.attr |= A_BOLD;
911
pty[w].attr |= A_DIM;
919
pty[w].cur.attr |= A_DIM;
914
pty[w].attr |= A_UNDERLINE;
922
pty[w].cur.attr |= A_UNDERLINE;
917
pty[w].attr |= A_BLINK;
925
pty[w].cur.attr |= A_BLINK;
920
pty[w].attr |= A_REVERSE;
928
pty[w].cur.attr |= A_REVERSE;
923
pty[w].attr |= A_INVISIBLE;
931
pty[w].cur.attr |= A_INVISIBLE;
926
pty[w].attr &= ~A_BOLD;
934
pty[w].cur.attr &= ~A_BOLD;
929
pty[w].attr &= ~A_UNDERLINE;
937
pty[w].cur.attr &= ~A_UNDERLINE;
932
pty[w].attr &= ~A_BLINK;
940
pty[w].cur.attr &= ~A_BLINK;
935
pty[w].attr &= ~A_REVERSE;
943
pty[w].cur.attr &= ~A_REVERSE;
938
pty[w].attr &= ~A_INVISIBLE;
946
pty[w].cur.attr &= ~A_INVISIBLE;
941
pty[w].fg = pty[w].bg = (short)-1;
950
pty[w].cur.bg = (short)-1;
944
953
n = pty[w].escparam[i];
945
954
if (n >= 30 && n <= 37)
955
pty[w].cur.fg = n % 10;
947
956
else if (n >= 40 && n <= 47)
957
pty[w].cur.bg = n % 10;
954
963
if (pty[w].escmode != ']') break;
955
pty[w].save_x = pty[w].cur_x;
956
pty[w].save_y = pty[w].cur_y;
964
memcpy((char *)&(pty[w].save), (char *)&(pty[w].cur),
965
sizeof(pty[w].save));
959
968
if (pty[w].escmode != ']') break;
960
pty[w].cur_x = pty[w].save_x;
961
pty[w].cur_y = pty[w].save_y;
962
biasxy(w, &(pty[w].cur_x), &(pty[w].cur_y));
969
memcpy((char *)&(pty[w].cur), (char *)&(pty[w].save),
971
biasxy(w, &(pty[w].cur.x), &(pty[w].cur.y));
963
972
surelocate(w, 1);
1102
1111
if (pty[w].ntabstop <= (u_char)0)
1104
1113
for (i = 0; i < pty[w].ntabstop; i++)
1106
1115
<= pty[w].tabstop[i])
1108
if (pty[w].cur_x != pty[w].tabstop[i])
1117
if (pty[w].cur.x != pty[w].tabstop[i])
1110
1119
memmove((char *)&(pty[w].tabstop[i]),
1259
1268
putterm(L_CLEAR);
1262
pty[MAXWINDOWS].attr = (u_short)0;
1263
pty[MAXWINDOWS].fg = pty[MAXWINDOWS].bg = (short)-1;
1271
pty[MAXWINDOWS].cur.attr = (u_short)0;
1272
pty[MAXWINDOWS].cur.fg =
1273
pty[MAXWINDOWS].cur.bg = (short)-1;
1266
pty[MAXWINDOWS].attr |= A_BOLD;
1276
pty[MAXWINDOWS].cur.attr |= A_BOLD;
1268
1278
case T_REVERSE:
1269
pty[MAXWINDOWS].attr |= A_REVERSE;
1279
pty[MAXWINDOWS].cur.attr |= A_REVERSE;
1272
pty[MAXWINDOWS].attr |= A_DIM;
1282
pty[MAXWINDOWS].cur.attr |= A_DIM;
1275
pty[MAXWINDOWS].attr |= A_BLINK;
1285
pty[MAXWINDOWS].cur.attr |= A_BLINK;
1277
1287
case T_STANDOUT:
1278
pty[MAXWINDOWS].attr |= A_STANDOUT;
1288
pty[MAXWINDOWS].cur.attr |= A_STANDOUT;
1280
1290
case T_UNDERLINE:
1281
pty[MAXWINDOWS].attr |= A_UNDERLINE;
1291
pty[MAXWINDOWS].cur.attr |= A_UNDERLINE;
1283
1293
case END_STANDOUT:
1284
pty[MAXWINDOWS].attr &= ~A_STANDOUT;
1294
pty[MAXWINDOWS].cur.attr &= ~A_STANDOUT;
1286
1296
case END_UNDERLINE:
1287
pty[MAXWINDOWS].attr &= ~A_UNDERLINE;
1297
pty[MAXWINDOWS].cur.attr &= ~A_UNDERLINE;
1302
pty[MAXWINDOWS].cur_x =
1303
pty[MAXWINDOWS].cur_y = (short)0;
1312
pty[MAXWINDOWS].cur.x =
1313
pty[MAXWINDOWS].cur.y = (short)0;
1304
1314
reallocate(MAXWINDOWS, 0, 0);
1307
1317
reallocate(MAXWINDOWS,
1308
pty[MAXWINDOWS].min_x, pty[MAXWINDOWS].cur_y);
1318
pty[MAXWINDOWS].min_x, pty[MAXWINDOWS].cur.y);
1310
1320
case C_NEWLINE:
1311
1321
while (c--) evallf(MAXWINDOWS);
1315
1325
reallocate(MAXWINDOWS,
1316
pty[MAXWINDOWS].cur_x,
1317
pty[MAXWINDOWS].cur_y - c);
1326
pty[MAXWINDOWS].cur.x,
1327
pty[MAXWINDOWS].cur.y - c);
1321
1331
reallocate(MAXWINDOWS,
1322
pty[MAXWINDOWS].cur_x,
1323
pty[MAXWINDOWS].cur_y + c);
1332
pty[MAXWINDOWS].cur.x,
1333
pty[MAXWINDOWS].cur.y + c);
1327
1337
reallocate(MAXWINDOWS,
1328
pty[MAXWINDOWS].cur_x + c,
1329
pty[MAXWINDOWS].cur_y);
1338
pty[MAXWINDOWS].cur.x + c,
1339
pty[MAXWINDOWS].cur.y);
1333
1343
reallocate(MAXWINDOWS,
1334
pty[MAXWINDOWS].cur_x - c,
1335
pty[MAXWINDOWS].cur_y);
1344
pty[MAXWINDOWS].cur.x - c,
1345
pty[MAXWINDOWS].cur.y);
1407
1417
reallocate(MAXWINDOWS, w1, w2);
1408
1418
for (i = 0; i < MAXWINDOWS; i++) {
1409
1419
if (ptylist[i].pid) continue;
1412
biasxy(i, &(pty[i].cur_x), &(pty[i].cur_y));
1422
biasxy(i, &(pty[i].cur.x), &(pty[i].cur.y));
1415
1425
case TE_CPUTNL:
1416
pty[MAXWINDOWS].cur_x = (short)0;
1426
pty[MAXWINDOWS].cur.x = (short)0;
1417
1427
evallf(MAXWINDOWS);
1419
1429
case TE_CHGCOLOR:
1420
1430
if (ptyrecvword(&n) < 0) break;
1423
pty[MAXWINDOWS].fg = (w1 == ANSI_BLACK)
1433
pty[MAXWINDOWS].cur.fg = (w1 == ANSI_BLACK)
1424
1434
? ANSI_WHITE : ANSI_BLACK;
1425
pty[MAXWINDOWS].bg = w1;
1435
pty[MAXWINDOWS].cur.bg = w1;
1428
pty[MAXWINDOWS].fg = w1;
1438
pty[MAXWINDOWS].cur.fg = w1;
1431
1441
case TE_MOVECURSOR:
1445
1455
if (pid < (p_id_t)0) break;
1446
1456
resetptyterm(win, (ptylist[win].pid) ? 0 : 1);
1447
biasxy(win, &(pty[win].cur_x), &(pty[win].cur_y));
1457
biasxy(win, &(pty[win].cur.x), &(pty[win].cur.y));
1448
1458
ptylist[win].pid = pid;
1449
1459
surelocate(win, 1);