1 /*
2 * Copyright (c) 1983, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Edward Wang at The University of California, Berkeley.
7 *
8 * %sccs.include.redist.c%
9 */
10
11 #ifndef lint
12 static char sccsid[] = "@(#)cmd1.c 8.1 (Berkeley) 06/06/93";
13 #endif /* not lint */
14
15 #include "defs.h"
16 #include "char.h"
17
c_window()18 c_window()
19 {
20 int col, row, xcol, xrow;
21 int id;
22
23 if ((id = findid()) < 0)
24 return;
25 if (!terse)
26 wwputs("New window (upper left corner): ", cmdwin);
27 col = 0;
28 row = 1;
29 wwadd(boxwin, framewin->ww_back);
30 for (;;) {
31 wwbox(boxwin, row - 1, col - 1, 3, 3);
32 wwsetcursor(row, col);
33 while (wwpeekc() < 0)
34 wwiomux();
35 switch (getpos(&row, &col, row > 1, 0,
36 wwnrow - 1, wwncol - 1)) {
37 case 3:
38 wwunbox(boxwin);
39 wwdelete(boxwin);
40 return;
41 case 2:
42 wwunbox(boxwin);
43 break;
44 case 1:
45 wwunbox(boxwin);
46 case 0:
47 continue;
48 }
49 break;
50 }
51 if (!terse)
52 wwputs("\nNew window (lower right corner): ", cmdwin);
53 xcol = col;
54 xrow = row;
55 for (;;) {
56 wwbox(boxwin, row - 1, col - 1,
57 xrow - row + 3, xcol - col + 3);
58 wwsetcursor(xrow, xcol);
59 while (wwpeekc() < 0)
60 wwiomux();
61 switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1))
62 {
63 case 3:
64 wwunbox(boxwin);
65 wwdelete(boxwin);
66 return;
67 case 2:
68 wwunbox(boxwin);
69 break;
70 case 1:
71 wwunbox(boxwin);
72 case 0:
73 continue;
74 }
75 break;
76 }
77 wwdelete(boxwin);
78 if (!terse)
79 wwputc('\n', cmdwin);
80 wwcurtowin(cmdwin);
81 (void) openwin(id, row, col, xrow-row+1, xcol-col+1, default_nline,
82 (char *) 0, 1, 1, default_shellfile, default_shell);
83 }
84
getpos(row,col,minrow,mincol,maxrow,maxcol)85 getpos(row, col, minrow, mincol, maxrow, maxcol)
86 register int *row, *col;
87 int minrow, mincol;
88 int maxrow, maxcol;
89 {
90 static int scount;
91 int count;
92 char c;
93 int oldrow = *row, oldcol = *col;
94
95 while ((c = wwgetc()) >= 0) {
96 switch (c) {
97 case '0': case '1': case '2': case '3': case '4':
98 case '5': case '6': case '7': case '8': case '9':
99 scount = scount * 10 + c - '0';
100 continue;
101 }
102 count = scount ? scount : 1;
103 scount = 0;
104 switch (c) {
105 case 'h':
106 if ((*col -= count) < mincol)
107 *col = mincol;
108 break;
109 case 'H':
110 *col = mincol;
111 break;
112 case 'l':
113 if ((*col += count) > maxcol)
114 *col = maxcol;
115 break;
116 case 'L':
117 *col = maxcol;
118 break;
119 case 'j':
120 if ((*row += count) > maxrow)
121 *row = maxrow;
122 break;
123 case 'J':
124 *row = maxrow;
125 break;
126 case 'k':
127 if ((*row -= count) < minrow)
128 *row = minrow;
129 break;
130 case 'K':
131 *row = minrow;
132 break;
133 case ctrl('['):
134 if (!terse)
135 wwputs("\nCancelled. ", cmdwin);
136 return 3;
137 case '\r':
138 return 2;
139 default:
140 if (!terse)
141 wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin);
142 wwbell();
143 }
144 }
145 return oldrow != *row || oldcol != *col;
146 }
147