1 /* 2 * Copyright (c) 1983 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 static char sccsid[] = "@(#)cmd.c 3.38 (Berkeley) 06/29/88"; 20 #endif /* not lint */ 21 22 #include "defs.h" 23 #include "char.h" 24 25 docmd() 26 { 27 register char c; 28 register struct ww *w; 29 char out = 0; 30 31 while (!out && !quit) { 32 if ((c = wwgetc()) < 0) { 33 if (terse) 34 wwsetcursor(0, 0); 35 else { 36 wwputs("Command: ", cmdwin); 37 wwcurtowin(cmdwin); 38 } 39 do 40 wwiomux(); 41 while ((c = wwgetc()) < 0); 42 } 43 if (!terse) 44 wwputc('\n', cmdwin); 45 switch (c) { 46 default: 47 if (c != escapec) 48 break; 49 case 'h': case 'j': case 'k': case 'l': 50 case ctrl('y'): 51 case ctrl('e'): 52 case ctrl('u'): 53 case ctrl('d'): 54 case ctrl('b'): 55 case ctrl('f'): 56 case ctrl('s'): 57 case ctrl('q'): 58 case ctrl('['): 59 if (selwin == 0) { 60 error("No window."); 61 continue; 62 } 63 } 64 switch (c) { 65 case '1': case '2': case '3': case '4': case '5': 66 case '6': case '7': case '8': case '9': 67 if ((w = window[c - '1']) == 0) { 68 error("%c: No such window.", c); 69 break; 70 } 71 setselwin(w); 72 if (checkproc(selwin) >= 0) 73 out = 1; 74 break; 75 case '%': 76 if ((w = getwin()) != 0) 77 setselwin(w); 78 break; 79 case ctrl('^'): 80 if (lastselwin != 0) { 81 setselwin(lastselwin); 82 if (checkproc(selwin) >= 0) 83 out = 1; 84 } else 85 error("No previous window."); 86 break; 87 case 'c': 88 if ((w = getwin()) != 0) 89 closewin(w); 90 break; 91 case 'w': 92 c_window(); 93 break; 94 case 'm': 95 if ((w = getwin()) != 0) 96 c_move(w); 97 break; 98 case 'M': 99 if ((w = getwin()) != 0) 100 movewin(w, w->ww_alt.t, w->ww_alt.l); 101 break; 102 case 's': 103 if ((w = getwin()) != 0) 104 c_size(w); 105 break; 106 case 'S': 107 if ((w = getwin()) != 0) 108 sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 109 break; 110 case ':': 111 c_colon(); 112 break; 113 case 'h': 114 (void) wwwrite(selwin, "\b", 1); 115 break; 116 case 'j': 117 (void) wwwrite(selwin, "\n", 1); 118 break; 119 case 'k': 120 (void) wwwrite(selwin, "\033A", 2); 121 break; 122 case 'l': 123 (void) wwwrite(selwin, "\033C", 2); 124 break; 125 case ctrl('e'): 126 wwscroll(selwin, 1); 127 break; 128 case ctrl('y'): 129 wwscroll(selwin, -1); 130 break; 131 case ctrl('d'): 132 wwscroll(selwin, selwin->ww_w.nr / 2); 133 break; 134 case ctrl('u'): 135 wwscroll(selwin, - selwin->ww_w.nr / 2); 136 break; 137 case ctrl('f'): 138 wwscroll(selwin, selwin->ww_w.nr); 139 break; 140 case ctrl('b'): 141 wwscroll(selwin, - selwin->ww_w.nr); 142 break; 143 case ctrl('s'): 144 stopwin(selwin); 145 break; 146 case ctrl('q'): 147 startwin(selwin); 148 break; 149 case ctrl('l'): 150 wwredraw(); 151 break; 152 case '?': 153 c_help(); 154 break; 155 case ctrl('['): 156 if (checkproc(selwin) >= 0) 157 out = 1; 158 break; 159 case ctrl('z'): 160 wwsuspend(); 161 break; 162 case 'q': 163 c_quit(); 164 break; 165 /* debugging stuff */ 166 case '&': 167 if (debug) { 168 c_debug(); 169 break; 170 } 171 default: 172 if (c == escapec) { 173 if (checkproc(selwin) >= 0) { 174 (void) write(selwin->ww_pty, 175 &escapec, 1); 176 out = 1; 177 } 178 } else { 179 if (!terse) 180 wwbell(); 181 error("Type ? for help."); 182 } 183 } 184 } 185 if (!quit) 186 setcmd(0); 187 } 188 189 struct ww * 190 getwin() 191 { 192 register int c; 193 struct ww *w = 0; 194 195 if (!terse) 196 wwputs("Which window? ", cmdwin); 197 wwcurtowin(cmdwin); 198 while ((c = wwgetc()) < 0) 199 wwiomux(); 200 if (debug && c == 'c') 201 w = cmdwin; 202 else if (debug && c == 'f') 203 w = framewin; 204 else if (debug && c == 'b') 205 w = boxwin; 206 else if (c >= '1' && c < NWINDOW + '1') 207 w = window[c - '1']; 208 else if (c == '+') 209 w = selwin; 210 else if (c == '-') 211 w = lastselwin; 212 if (w == 0) 213 wwbell(); 214 if (!terse) 215 wwputc('\n', cmdwin); 216 return w; 217 } 218 219 checkproc(w) 220 struct ww *w; 221 { 222 if (w->ww_state != WWS_HASPROC) { 223 error("No process in window."); 224 return -1; 225 } 226 return 0; 227 } 228 229 setcmd(new) 230 char new; 231 { 232 if (new && !incmd) { 233 if (!terse) 234 wwadd(cmdwin, &wwhead); 235 if (selwin != 0) 236 wwcursor(selwin, 1); 237 wwcurwin = 0; 238 } else if (!new && incmd) { 239 if (!terse) { 240 wwdelete(cmdwin); 241 reframe(); 242 } 243 if (selwin != 0) 244 wwcursor(selwin, 0); 245 wwcurwin = selwin; 246 } 247 incmd = new; 248 } 249 250 setterse(new) 251 char new; 252 { 253 if (incmd) 254 if (new && !terse) { 255 wwdelete(cmdwin); 256 reframe(); 257 } else if (!new && terse) 258 wwadd(cmdwin, &wwhead); 259 terse = new; 260 } 261 262 /* 263 * Set the current window. 264 */ 265 setselwin(w) 266 struct ww *w; 267 { 268 if (selwin == w) 269 return; 270 if (selwin != 0) 271 lastselwin = selwin; 272 if ((selwin = w) != 0) 273 front(selwin, 1); 274 } 275