1 /* @(#)cmd1.c 8.1 (Berkeley) 6/6/93 */ 2 /* $NetBSD: cmd1.c,v 1.7 2003/08/07 11:17:22 agc Exp $ */ 3 4 /* 5 * Copyright (c) 1983, 1993 6 * The Regents of the University of California. All rights reserved. 7 * 8 * This code is derived from software contributed to Berkeley by 9 * Edward Wang at The University of California, Berkeley. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 3. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include "defs.h" 37 #include "char.h" 38 39 void 40 c_window(void) 41 { 42 int col, row, xcol, xrow; 43 int id; 44 45 if ((id = findid()) < 0) 46 return; 47 if (!terse) 48 wwputs("New window (upper left corner): ", cmdwin); 49 col = 0; 50 row = 1; 51 wwadd(boxwin, framewin->ww_back); 52 for (;;) { 53 wwbox(boxwin, row - 1, col - 1, 3, 3); 54 wwsetcursor(row, col); 55 while (wwpeekc() < 0) 56 wwiomux(); 57 switch (getpos(&row, &col, row > 1, 0, 58 wwnrow - 1, wwncol - 1)) { 59 case 3: 60 wwunbox(boxwin); 61 wwdelete(boxwin); 62 return; 63 case 2: 64 wwunbox(boxwin); 65 break; 66 case 1: 67 wwunbox(boxwin); 68 case 0: 69 continue; 70 } 71 break; 72 } 73 if (!terse) 74 wwputs("\nNew window (lower right corner): ", cmdwin); 75 xcol = col; 76 xrow = row; 77 for (;;) { 78 wwbox(boxwin, row - 1, col - 1, 79 xrow - row + 3, xcol - col + 3); 80 wwsetcursor(xrow, xcol); 81 while (wwpeekc() < 0) 82 wwiomux(); 83 switch (getpos(&xrow, &xcol, row, col, wwnrow - 1, wwncol - 1)) 84 { 85 case 3: 86 wwunbox(boxwin); 87 wwdelete(boxwin); 88 return; 89 case 2: 90 wwunbox(boxwin); 91 break; 92 case 1: 93 wwunbox(boxwin); 94 case 0: 95 continue; 96 } 97 break; 98 } 99 wwdelete(boxwin); 100 if (!terse) 101 wwputc('\n', cmdwin); 102 wwcurtowin(cmdwin); 103 (void) openwin(id, row, col, xrow-row+1, xcol-col+1, default_nline, 104 (char *) 0, WWT_PTY, WWU_HASFRAME, default_shellfile, 105 default_shell); 106 } 107 108 int 109 getpos(int *row, int *col, int minrow, int mincol, int maxrow, int maxcol) 110 { 111 static int scount; 112 int count; 113 int c; 114 int oldrow = *row, oldcol = *col; 115 116 while ((c = wwgetc()) >= 0) { 117 switch (c) { 118 case '0': case '1': case '2': case '3': case '4': 119 case '5': case '6': case '7': case '8': case '9': 120 scount = scount * 10 + c - '0'; 121 continue; 122 } 123 count = scount ? scount : 1; 124 scount = 0; 125 switch (c) { 126 case 'h': 127 if ((*col -= count) < mincol) 128 *col = mincol; 129 break; 130 case 'H': 131 *col = mincol; 132 break; 133 case 'l': 134 if ((*col += count) > maxcol) 135 *col = maxcol; 136 break; 137 case 'L': 138 *col = maxcol; 139 break; 140 case 'j': 141 if ((*row += count) > maxrow) 142 *row = maxrow; 143 break; 144 case 'J': 145 *row = maxrow; 146 break; 147 case 'k': 148 if ((*row -= count) < minrow) 149 *row = minrow; 150 break; 151 case 'K': 152 *row = minrow; 153 break; 154 case ctrl('['): 155 if (!terse) 156 wwputs("\nCancelled. ", cmdwin); 157 return 3; 158 case '\r': 159 return 2; 160 default: 161 if (!terse) 162 wwputs("\nType [hjklHJKL] to move, return to enter position, escape to cancel.", cmdwin); 163 wwbell(); 164 } 165 } 166 return oldrow != *row || oldcol != *col; 167 } 168