fix ctrl macro for ANSI C
[unix-history] / usr / src / usr.bin / window / cmd1.c
CommitLineData
827ef1a8 1#ifndef lint
95bc282c 2static char sccsid[] = "@(#)cmd1.c 3.31 %G%";
827ef1a8
EW
3#endif
4
60de5df9
EW
5/*
6 * Copyright (c) 1983 Regents of the University of California,
7 * All rights reserved. Redistribution permitted subject to
8 * the terms of the Berkeley Software License Agreement.
9 */
10
827ef1a8 11#include "defs.h"
0e64e422 12#include "char.h"
827ef1a8 13
bb05dfb5 14c_window()
827ef1a8
EW
15{
16 int col, row, xcol, xrow;
827ef1a8 17 int id;
827ef1a8 18
03e75950 19 if ((id = findid()) < 0)
827ef1a8 20 return;
101acab4 21 if (!terse)
dbf7630d 22 wwputs("New window (upper left corner): ", cmdwin);
827ef1a8
EW
23 col = 0;
24 row = 1;
43c1dd56 25 wwadd(boxwin, framewin->ww_back);
827ef1a8 26 for (;;) {
43c1dd56 27 wwbox(boxwin, row - 1, col - 1, 3, 3);
827ef1a8 28 wwsetcursor(row, col);
8fa6d94c
EW
29 while (wwpeekc() < 0)
30 wwiomux();
a204c1d8
EW
31 switch (getpos(&row, &col, row > 1, 0,
32 wwnrow - 1, wwncol - 1)) {
eb52ebfc
EW
33 case 3:
34 wwunbox(boxwin);
43c1dd56 35 wwdelete(boxwin);
b4be6cd6 36 return;
eb52ebfc
EW
37 case 2:
38 wwunbox(boxwin);
827ef1a8 39 break;
eb52ebfc
EW
40 case 1:
41 wwunbox(boxwin);
827ef1a8
EW
42 case 0:
43 continue;
44 }
45 break;
46 }
101acab4 47 if (!terse)
dbf7630d 48 wwputs("\nNew window (lower right corner): ", cmdwin);
bb05dfb5
EW
49 xcol = col;
50 xrow = row;
827ef1a8 51 for (;;) {
43c1dd56
EW
52 wwbox(boxwin, row - 1, col - 1,
53 xrow - row + 3, xcol - col + 3);
827ef1a8
EW
54 wwsetcursor(xrow, xcol);
55 wwflush();
8fa6d94c
EW
56 while (wwpeekc() < 0)
57 wwiomux();
8baf70f5
EW
58 switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
59 {
eb52ebfc
EW
60 case 3:
61 wwunbox(boxwin);
43c1dd56 62 wwdelete(boxwin);
b4be6cd6 63 return;
eb52ebfc
EW
64 case 2:
65 wwunbox(boxwin);
827ef1a8 66 break;
eb52ebfc
EW
67 case 1:
68 wwunbox(boxwin);
827ef1a8
EW
69 case 0:
70 continue;
71 }
72 break;
73 }
43c1dd56 74 wwdelete(boxwin);
101acab4 75 if (!terse)
bf3b96e9 76 wwputc('\n', cmdwin);
bb05dfb5 77 wwcurtowin(cmdwin);
74bf1c32 78 (void) openwin(id, row, col, xrow-row+1, xcol-col+1, nbufline,
7ecf4dca 79 (char *) 0, 1, 1, shellfile, shell);
8c4fb896
EW
80}
81
8baf70f5
EW
82getpos(row, col, minrow, mincol, maxrow, maxcol)
83register int *row, *col;
84int minrow, mincol;
85int maxrow, maxcol;
827ef1a8 86{
961dd7d0 87 static int scount;
827ef1a8
EW
88 int count;
89 char c;
eb52ebfc 90 int oldrow = *row, oldcol = *col;
827ef1a8 91
8fa6d94c 92 while ((c = wwgetc()) >= 0) {
827ef1a8
EW
93 switch (c) {
94 case '0': case '1': case '2': case '3': case '4':
95 case '5': case '6': case '7': case '8': case '9':
96 scount = scount * 10 + c - '0';
97 continue;
98 }
99 count = scount ? scount : 1;
100 scount = 0;
101 switch (c) {
102 case 'h':
103 if ((*col -= count) < mincol)
104 *col = mincol;
105 break;
106 case 'H':
107 *col = mincol;
108 break;
109 case 'l':
8baf70f5
EW
110 if ((*col += count) > maxcol)
111 *col = maxcol;
827ef1a8
EW
112 break;
113 case 'L':
8baf70f5 114 *col = maxcol;
827ef1a8
EW
115 break;
116 case 'j':
8baf70f5
EW
117 if ((*row += count) > maxrow)
118 *row = maxrow;
827ef1a8
EW
119 break;
120 case 'J':
8baf70f5 121 *row = maxrow;
827ef1a8
EW
122 break;
123 case 'k':
124 if ((*row -= count) < minrow)
125 *row = minrow;
126 break;
127 case 'K':
128 *row = minrow;
129 break;
95bc282c 130 case ctrl('['):
eb52ebfc 131 if (!terse)
cfdab788 132 wwputs("\nCancelled. ", cmdwin);
eb52ebfc 133 return 3;
827ef1a8 134 case '\r':
eb52ebfc 135 return 2;
827ef1a8 136 default:
101acab4 137 if (!terse)
bf3b96e9 138 wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
7ecf4dca 139 wwbell();
827ef1a8
EW
140 }
141 }
eb52ebfc 142 return oldrow != *row || oldcol != *col;
827ef1a8 143}