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 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 */ 36 37 #ifndef lint 38 static char sccsid[] = "@(#)cmd.c 8.1 (Berkeley) 6/6/93"; 39 static char rcsid[] = 40 "$FreeBSD: src/usr.bin/window/cmd.c,v 1.2.14.1 2001/05/17 09:45:00 obrien Exp $"; 41 #endif /* not lint */ 42 43 #include "defs.h" 44 #include "char.h" 45 46 docmd() 47 { 48 register c; 49 register struct ww *w; 50 char out = 0; 51 52 while (!out && !quit) { 53 if ((c = wwgetc()) < 0) { 54 if (terse) 55 wwsetcursor(0, 0); 56 else { 57 wwputs("Command: ", cmdwin); 58 wwcurtowin(cmdwin); 59 } 60 do 61 wwiomux(); 62 while ((c = wwgetc()) < 0); 63 } 64 if (!terse) 65 wwputc('\n', cmdwin); 66 switch (c) { 67 default: 68 if (c != escapec) 69 break; 70 case 'h': case 'j': case 'k': case 'l': 71 case 'y': case 'p': 72 case ctrl('y'): 73 case ctrl('e'): 74 case ctrl('u'): 75 case ctrl('d'): 76 case ctrl('b'): 77 case ctrl('f'): 78 case ctrl('s'): 79 case ctrl('q'): 80 case ctrl('['): 81 if (selwin == 0) { 82 error("No window."); 83 continue; 84 } 85 } 86 switch (c) { 87 case '1': case '2': case '3': case '4': case '5': 88 case '6': case '7': case '8': case '9': 89 if ((w = window[c - '1']) == 0) { 90 error("%c: No such window.", c); 91 break; 92 } 93 setselwin(w); 94 if (checkproc(selwin) >= 0) 95 out = 1; 96 break; 97 case '%': 98 if ((w = getwin()) != 0) 99 setselwin(w); 100 break; 101 case ctrl('^'): 102 if (lastselwin != 0) { 103 setselwin(lastselwin); 104 if (checkproc(selwin) >= 0) 105 out = 1; 106 } else 107 error("No previous window."); 108 break; 109 case 'c': 110 if ((w = getwin()) != 0) 111 closewin(w); 112 break; 113 case 'w': 114 c_window(); 115 break; 116 case 'm': 117 if ((w = getwin()) != 0) 118 c_move(w); 119 break; 120 case 'M': 121 if ((w = getwin()) != 0) 122 movewin(w, w->ww_alt.t, w->ww_alt.l); 123 break; 124 case 's': 125 if ((w = getwin()) != 0) 126 c_size(w); 127 break; 128 case 'S': 129 if ((w = getwin()) != 0) 130 sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 131 break; 132 case 'y': 133 c_yank(); 134 break; 135 case 'p': 136 c_put(); 137 break; 138 case ':': 139 c_colon(); 140 break; 141 case 'h': 142 (void) wwwrite(selwin, "\b", 1); 143 break; 144 case 'j': 145 (void) wwwrite(selwin, "\n", 1); 146 break; 147 case 'k': 148 (void) wwwrite(selwin, "\033A", 2); 149 break; 150 case 'l': 151 (void) wwwrite(selwin, "\033C", 2); 152 break; 153 case ctrl('e'): 154 wwscroll(selwin, 1); 155 break; 156 case ctrl('y'): 157 wwscroll(selwin, -1); 158 break; 159 case ctrl('d'): 160 wwscroll(selwin, selwin->ww_w.nr / 2); 161 break; 162 case ctrl('u'): 163 wwscroll(selwin, - selwin->ww_w.nr / 2); 164 break; 165 case ctrl('f'): 166 wwscroll(selwin, selwin->ww_w.nr); 167 break; 168 case ctrl('b'): 169 wwscroll(selwin, - selwin->ww_w.nr); 170 break; 171 case ctrl('s'): 172 stopwin(selwin); 173 break; 174 case ctrl('q'): 175 startwin(selwin); 176 break; 177 case ctrl('l'): 178 wwredraw(); 179 break; 180 case '?': 181 c_help(); 182 break; 183 case ctrl('['): 184 if (checkproc(selwin) >= 0) 185 out = 1; 186 break; 187 case ctrl('z'): 188 wwsuspend(); 189 break; 190 case 'q': 191 c_quit(); 192 break; 193 /* debugging stuff */ 194 case '&': 195 if (debug) { 196 c_debug(); 197 break; 198 } 199 default: 200 if (c == escapec) { 201 if (checkproc(selwin) >= 0) { 202 (void) write(selwin->ww_pty, 203 &escapec, 1); 204 out = 1; 205 } 206 } else { 207 if (!terse) 208 wwbell(); 209 error("Type ? for help."); 210 } 211 } 212 } 213 if (!quit) 214 setcmd(0); 215 } 216 217 struct ww * 218 getwin() 219 { 220 register int c; 221 struct ww *w = 0; 222 223 if (!terse) 224 wwputs("Which window? ", cmdwin); 225 wwcurtowin(cmdwin); 226 while ((c = wwgetc()) < 0) 227 wwiomux(); 228 if (debug && c == 'c') 229 w = cmdwin; 230 else if (debug && c == 'f') 231 w = framewin; 232 else if (debug && c == 'b') 233 w = boxwin; 234 else if (c >= '1' && c < NWINDOW + '1') 235 w = window[c - '1']; 236 else if (c == '+') 237 w = selwin; 238 else if (c == '-') 239 w = lastselwin; 240 if (w == 0) 241 wwbell(); 242 if (!terse) 243 wwputc('\n', cmdwin); 244 return w; 245 } 246 247 checkproc(w) 248 struct ww *w; 249 { 250 if (w->ww_state != WWS_HASPROC) { 251 error("No process in window."); 252 return -1; 253 } 254 return 0; 255 } 256 257 setcmd(new) 258 char new; 259 { 260 if (new && !incmd) { 261 if (!terse) 262 wwadd(cmdwin, &wwhead); 263 if (selwin != 0) 264 wwcursor(selwin, 1); 265 wwcurwin = 0; 266 } else if (!new && incmd) { 267 if (!terse) { 268 wwdelete(cmdwin); 269 reframe(); 270 } 271 if (selwin != 0) 272 wwcursor(selwin, 0); 273 wwcurwin = selwin; 274 } 275 incmd = new; 276 } 277 278 setterse(new) 279 char new; 280 { 281 if (incmd) 282 if (new && !terse) { 283 wwdelete(cmdwin); 284 reframe(); 285 } else if (!new && terse) 286 wwadd(cmdwin, &wwhead); 287 terse = new; 288 } 289 290 /* 291 * Set the current window. 292 */ 293 setselwin(w) 294 struct ww *w; 295 { 296 if (selwin == w) 297 return; 298 if (selwin != 0) 299 lastselwin = selwin; 300 if ((selwin = w) != 0) 301 front(selwin, 1); 302 } 303