118729Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 533514Sbostic * Redistribution and use in source and binary forms are permitted 633514Sbostic * provided that this notice is preserved and that due credit is given 733514Sbostic * to the University of California at Berkeley. The name of the University 833514Sbostic * may not be used to endorse or promote products derived from this 933514Sbostic * software without specific prior written permission. This software 1033514Sbostic * is provided ``as is'' without express or implied warranty. 1118729Sedward */ 1218729Sedward 1333514Sbostic #ifndef lint 14*34107Sedward static char sccsid[] = "@(#)cmd.c 3.37 (Berkeley) 04/25/88"; 1533514Sbostic #endif /* not lint */ 1633514Sbostic 1713977Sedward #include "defs.h" 1816309Sedward #include "char.h" 1913977Sedward 2013977Sedward docmd() 2113977Sedward { 2213977Sedward register char c; 2313977Sedward register struct ww *w; 2416280Sedward char out = 0; 2513977Sedward 26*34107Sedward while (!out && !quit) { 27*34107Sedward if ((c = wwgetc()) < 0) { 28*34107Sedward if (terse) 29*34107Sedward wwsetcursor(0, 0); 30*34107Sedward else { 31*34107Sedward wwputs("Command: ", cmdwin); 32*34107Sedward wwcurtowin(cmdwin); 3313977Sedward } 34*34107Sedward do 35*34107Sedward wwiomux(); 36*34107Sedward while ((c = wwgetc()) < 0); 37*34107Sedward } 38*34107Sedward if (!terse) 39*34107Sedward wwputc('\n', cmdwin); 40*34107Sedward switch (c) { 41*34107Sedward default: 42*34107Sedward if (c != escapec) 4314893Sedward break; 44*34107Sedward case 'h': case 'j': case 'k': case 'l': 45*34107Sedward case ctrl('y'): 46*34107Sedward case ctrl('e'): 47*34107Sedward case ctrl('u'): 48*34107Sedward case ctrl('d'): 49*34107Sedward case ctrl('b'): 50*34107Sedward case ctrl('f'): 51*34107Sedward case ctrl('s'): 52*34107Sedward case ctrl('q'): 53*34107Sedward case ctrl('['): 54*34107Sedward if (selwin == 0) { 55*34107Sedward error("No window."); 56*34107Sedward continue; 57*34107Sedward } 58*34107Sedward } 59*34107Sedward switch (c) { 60*34107Sedward case '1': case '2': case '3': case '4': case '5': 61*34107Sedward case '6': case '7': case '8': case '9': 62*34107Sedward if ((w = window[c - '1']) == 0) { 63*34107Sedward error("%c: No such window.", c); 6414893Sedward break; 65*34107Sedward } 66*34107Sedward setselwin(w); 67*34107Sedward if (checkproc(selwin) >= 0) 68*34107Sedward out = 1; 69*34107Sedward break; 70*34107Sedward case '%': 71*34107Sedward if ((w = getwin()) != 0) 72*34107Sedward setselwin(w); 73*34107Sedward break; 74*34107Sedward case ctrl('^'): 75*34107Sedward if (lastselwin != 0) { 76*34107Sedward setselwin(lastselwin); 7714893Sedward if (checkproc(selwin) >= 0) 7816280Sedward out = 1; 79*34107Sedward } else 80*34107Sedward error("No previous window."); 81*34107Sedward break; 82*34107Sedward case 'c': 83*34107Sedward if ((w = getwin()) != 0) 84*34107Sedward closewin(w); 85*34107Sedward break; 86*34107Sedward case 'w': 87*34107Sedward c_window(); 88*34107Sedward break; 89*34107Sedward case 'm': 90*34107Sedward if ((w = getwin()) != 0) 91*34107Sedward c_move(w); 92*34107Sedward break; 93*34107Sedward case 'M': 94*34107Sedward if ((w = getwin()) != 0) 95*34107Sedward movewin(w, w->ww_alt.t, w->ww_alt.l); 96*34107Sedward break; 97*34107Sedward case 's': 98*34107Sedward if ((w = getwin()) != 0) 99*34107Sedward c_size(w); 100*34107Sedward break; 101*34107Sedward case 'S': 102*34107Sedward if ((w = getwin()) != 0) 103*34107Sedward sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 104*34107Sedward break; 105*34107Sedward case ':': 106*34107Sedward c_colon(); 107*34107Sedward break; 108*34107Sedward case 'h': 109*34107Sedward (void) wwwrite(selwin, "\b", 1); 110*34107Sedward break; 111*34107Sedward case 'j': 112*34107Sedward (void) wwwrite(selwin, "\n", 1); 113*34107Sedward break; 114*34107Sedward case 'k': 115*34107Sedward (void) wwwrite(selwin, "\033A", 2); 116*34107Sedward break; 117*34107Sedward case 'l': 118*34107Sedward (void) wwwrite(selwin, "\033C", 2); 119*34107Sedward break; 120*34107Sedward case ctrl('e'): 121*34107Sedward wwscroll(selwin, 1); 122*34107Sedward break; 123*34107Sedward case ctrl('y'): 124*34107Sedward wwscroll(selwin, -1); 125*34107Sedward break; 126*34107Sedward case ctrl('d'): 127*34107Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 128*34107Sedward break; 129*34107Sedward case ctrl('u'): 130*34107Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 131*34107Sedward break; 132*34107Sedward case ctrl('f'): 133*34107Sedward wwscroll(selwin, selwin->ww_w.nr); 134*34107Sedward break; 135*34107Sedward case ctrl('b'): 136*34107Sedward wwscroll(selwin, - selwin->ww_w.nr); 137*34107Sedward break; 138*34107Sedward case ctrl('s'): 139*34107Sedward stopwin(selwin); 140*34107Sedward break; 141*34107Sedward case ctrl('q'): 142*34107Sedward startwin(selwin); 143*34107Sedward break; 144*34107Sedward case ctrl('l'): 145*34107Sedward wwredraw(); 146*34107Sedward break; 147*34107Sedward case '?': 148*34107Sedward c_help(); 149*34107Sedward break; 150*34107Sedward case ctrl('['): 151*34107Sedward if (checkproc(selwin) >= 0) 152*34107Sedward out = 1; 153*34107Sedward break; 154*34107Sedward case ctrl('z'): 155*34107Sedward wwsuspend(); 156*34107Sedward break; 157*34107Sedward case 'q': 158*34107Sedward c_quit(); 159*34107Sedward break; 160*34107Sedward /* debugging stuff */ 161*34107Sedward case '&': 162*34107Sedward if (debug) { 163*34107Sedward c_debug(); 16414893Sedward break; 165*34107Sedward } 166*34107Sedward default: 167*34107Sedward if (c == escapec) { 168*34107Sedward if (checkproc(selwin) >= 0) { 169*34107Sedward (void) write(selwin->ww_pty, 170*34107Sedward &escapec, 1); 171*34107Sedward out = 1; 17214998Sedward } 173*34107Sedward } else { 174*34107Sedward if (!terse) 175*34107Sedward wwbell(); 176*34107Sedward error("Type ? for help."); 17714177Sedward } 17814893Sedward } 17913977Sedward } 18016280Sedward if (!quit) 18116280Sedward setcmd(0); 18213977Sedward } 18313977Sedward 18413977Sedward struct ww * 18513977Sedward getwin() 18613977Sedward { 18713977Sedward register int c; 18814184Sedward struct ww *w = 0; 18913977Sedward 19014189Sedward if (!terse) 19116113Sedward wwputs("Which window? ", cmdwin); 19214987Sedward wwcurtowin(cmdwin); 19315871Sedward while ((c = wwgetc()) < 0) 19415871Sedward wwiomux(); 19514407Sedward if (debug && c == 'c') 19614407Sedward w = cmdwin; 19714407Sedward else if (debug && c == 'f') 19814407Sedward w = framewin; 19914795Sedward else if (debug && c == 'b') 20014795Sedward w = boxwin; 20114407Sedward else if (c >= '1' && c < NWINDOW + '1') 20214407Sedward w = window[c - '1']; 20331140Sedward else if (c == '+') 20431140Sedward w = selwin; 20531140Sedward else if (c == '-') 20631140Sedward w = lastselwin; 20714407Sedward if (w == 0) 20816313Sedward wwbell(); 20914189Sedward if (!terse) 21016312Sedward wwputc('\n', cmdwin); 21113977Sedward return w; 21213977Sedward } 21313977Sedward 21414893Sedward checkproc(w) 21514893Sedward struct ww *w; 21614893Sedward { 21714893Sedward if (w->ww_state != WWS_HASPROC) { 21814893Sedward error("No process in window."); 21914893Sedward return -1; 22014893Sedward } 22114893Sedward return 0; 22214893Sedward } 22316280Sedward 22416280Sedward setcmd(new) 22516280Sedward char new; 22616280Sedward { 22716280Sedward if (new && !incmd) { 22816280Sedward if (!terse) 22916280Sedward wwadd(cmdwin, &wwhead); 23016280Sedward if (selwin != 0) 23116280Sedward wwcursor(selwin, 1); 23216280Sedward wwcurwin = 0; 23316280Sedward } else if (!new && incmd) { 23416280Sedward if (!terse) { 23516280Sedward wwdelete(cmdwin); 23616280Sedward reframe(); 23716280Sedward } 23816280Sedward if (selwin != 0) 23916280Sedward wwcursor(selwin, 0); 24016280Sedward wwcurwin = selwin; 24116280Sedward } 24216280Sedward incmd = new; 24316280Sedward } 24416280Sedward 24516280Sedward setterse(new) 24616280Sedward char new; 24716280Sedward { 24816280Sedward if (incmd) 24916280Sedward if (new && !terse) { 25016280Sedward wwdelete(cmdwin); 25116280Sedward reframe(); 25216280Sedward } else if (!new && terse) 25316280Sedward wwadd(cmdwin, &wwhead); 25416280Sedward terse = new; 25516280Sedward } 25616280Sedward 25716280Sedward /* 25816280Sedward * Set the current window. 25916280Sedward */ 26016280Sedward setselwin(w) 26116280Sedward struct ww *w; 26216280Sedward { 26316280Sedward if (selwin == w) 26416280Sedward return; 26516304Sedward if (selwin != 0) 26616304Sedward lastselwin = selwin; 26716304Sedward if ((selwin = w) != 0) 26816304Sedward front(selwin, 1); 26916280Sedward } 270