113977Sedward #ifndef lint 2*31140Sedward static char sccsid[] = "@(#)cmd.c 3.34 05/18/87"; 313977Sedward #endif 413977Sedward 518729Sedward /* 618729Sedward * Copyright (c) 1983 Regents of the University of California, 718729Sedward * All rights reserved. Redistribution permitted subject to 818729Sedward * the terms of the Berkeley Software License Agreement. 918729Sedward */ 1018729Sedward 1113977Sedward #include "defs.h" 1216309Sedward #include "char.h" 1313977Sedward 1413977Sedward docmd() 1513977Sedward { 1613977Sedward register char c; 1713977Sedward register struct ww *w; 1816280Sedward char out = 0; 1913977Sedward 2014893Sedward for (;;) { 2115871Sedward while ((c = wwgetc()) >= 0) { 2214893Sedward if (!terse) 2316312Sedward wwputc('\n', cmdwin); 2414893Sedward switch (c) { 2514893Sedward default: 26*31140Sedward if (c != escapec) 27*31140Sedward break; 2814893Sedward case 'h': case 'j': case 'k': case 'l': 2916309Sedward case ctrl(y): 3016309Sedward case ctrl(e): 3116309Sedward case ctrl(u): 3216309Sedward case ctrl(d): 3316309Sedward case ctrl(b): 3416309Sedward case ctrl(f): 3516309Sedward case ctrl(s): 3616309Sedward case ctrl(q): 3716309Sedward case ctrl([): 3814893Sedward if (selwin == 0) { 3914893Sedward error("No window."); 4014893Sedward continue; 4114893Sedward } 4213977Sedward } 4314893Sedward switch (c) { 4414893Sedward case '1': case '2': case '3': case '4': case '5': 4514893Sedward case '6': case '7': case '8': case '9': 4614893Sedward if ((w = window[c - '1']) == 0) { 4715620Sedward error("%c: No such window.", c); 4814893Sedward break; 4914893Sedward } 5014184Sedward setselwin(w); 5114893Sedward if (checkproc(selwin) >= 0) 5216280Sedward out = 1; 5314893Sedward break; 5414893Sedward case '%': 5514893Sedward if ((w = getwin()) != 0) 5614893Sedward setselwin(w); 5714893Sedward break; 5816309Sedward case ctrl(^): 5915620Sedward if (lastselwin != 0) { 6015620Sedward setselwin(lastselwin); 6115620Sedward if (checkproc(selwin) >= 0) 6216280Sedward out = 1; 6315620Sedward } else 6415620Sedward error("No previous window."); 6515620Sedward break; 6614893Sedward case 'c': 6714893Sedward if ((w = getwin()) != 0) 68*31140Sedward closewin(w); 6914893Sedward break; 7014893Sedward case 'w': 7114893Sedward c_window(); 7214893Sedward break; 7314893Sedward case 'm': 7414893Sedward if ((w = getwin()) != 0) 7514893Sedward c_move(w); 7614893Sedward break; 7714998Sedward case 'M': 7814998Sedward if ((w = getwin()) != 0) 7918204Sedward movewin(w, w->ww_alt.t, w->ww_alt.l); 8014998Sedward break; 8118204Sedward case 's': 8218204Sedward if ((w = getwin()) != 0) 8318204Sedward c_size(w); 8418204Sedward break; 8518204Sedward case 'S': 8618204Sedward if ((w = getwin()) != 0) 8718204Sedward sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 8818204Sedward break; 8914893Sedward case ':': 9014893Sedward c_colon(); 9114893Sedward break; 9214893Sedward case 'h': 9314893Sedward (void) wwwrite(selwin, "\b", 1); 9414893Sedward break; 9514893Sedward case 'j': 9614893Sedward (void) wwwrite(selwin, "\n", 1); 9714893Sedward break; 9814893Sedward case 'k': 9914893Sedward (void) wwwrite(selwin, "\033A", 2); 10014893Sedward break; 10114893Sedward case 'l': 10214893Sedward (void) wwwrite(selwin, "\033C", 2); 10314893Sedward break; 10416309Sedward case ctrl(e): 10514893Sedward wwscroll(selwin, 1); 10614893Sedward break; 10716309Sedward case ctrl(y): 10814893Sedward wwscroll(selwin, -1); 10914893Sedward break; 11016309Sedward case ctrl(d): 11114893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 11214893Sedward break; 11316309Sedward case ctrl(u): 11414893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 11514893Sedward break; 11616309Sedward case ctrl(f): 11714893Sedward wwscroll(selwin, selwin->ww_w.nr); 11814893Sedward break; 11916309Sedward case ctrl(b): 12014893Sedward wwscroll(selwin, - selwin->ww_w.nr); 12114893Sedward break; 12216309Sedward case ctrl(s): 12318335Sedward stopwin(selwin); 12414893Sedward break; 12516309Sedward case ctrl(q): 12618335Sedward startwin(selwin); 12714893Sedward break; 12816309Sedward case ctrl(l): 12914893Sedward wwredraw(); 13014893Sedward break; 13114893Sedward case '?': 13214893Sedward c_help(); 13314893Sedward break; 13416309Sedward case ctrl([): 13514893Sedward if (checkproc(selwin) >= 0) 13616280Sedward out = 1; 13714893Sedward break; 13816309Sedward case ctrl(z): 13914893Sedward wwsuspend(); 14014893Sedward break; 14114893Sedward case 'q': 14214893Sedward c_quit(); 14314893Sedward break; 14414998Sedward /* debugging stuff */ 14514998Sedward case '&': 14614998Sedward if (debug) { 14714998Sedward c_debug(); 14814998Sedward break; 14914998Sedward } 15014893Sedward default: 15114893Sedward if (c == escapec) { 15214893Sedward if (checkproc(selwin) >= 0) { 15314893Sedward (void) write(selwin->ww_pty, 15414893Sedward &escapec, 1); 15516280Sedward out = 1; 15614893Sedward } 15714893Sedward } else { 15814893Sedward if (!terse) 15916313Sedward wwbell(); 16014893Sedward error("Type ? for help."); 16114893Sedward } 16214177Sedward } 16314893Sedward } 16416280Sedward if (out || quit) 16513977Sedward break; 16614893Sedward if (terse) 16714893Sedward wwsetcursor(0, 0); 16814893Sedward else { 16916113Sedward wwputs("Command: ", cmdwin); 17014893Sedward wwcurtowin(cmdwin); 17113977Sedward } 17215871Sedward while (wwpeekc() < 0) 17315871Sedward wwiomux(); 17413977Sedward } 17516280Sedward if (!quit) 17616280Sedward setcmd(0); 17713977Sedward } 17813977Sedward 17913977Sedward struct ww * 18013977Sedward getwin() 18113977Sedward { 18213977Sedward register int c; 18314184Sedward struct ww *w = 0; 18413977Sedward 18514189Sedward if (!terse) 18616113Sedward wwputs("Which window? ", cmdwin); 18714987Sedward wwcurtowin(cmdwin); 18815871Sedward while ((c = wwgetc()) < 0) 18915871Sedward wwiomux(); 19014407Sedward if (debug && c == 'c') 19114407Sedward w = cmdwin; 19214407Sedward else if (debug && c == 'f') 19314407Sedward w = framewin; 19414795Sedward else if (debug && c == 'b') 19514795Sedward w = boxwin; 19614407Sedward else if (c >= '1' && c < NWINDOW + '1') 19714407Sedward w = window[c - '1']; 198*31140Sedward else if (c == '+') 199*31140Sedward w = selwin; 200*31140Sedward else if (c == '-') 201*31140Sedward w = lastselwin; 20214407Sedward if (w == 0) 20316313Sedward wwbell(); 20414189Sedward if (!terse) 20516312Sedward wwputc('\n', cmdwin); 20613977Sedward return w; 20713977Sedward } 20813977Sedward 20914893Sedward checkproc(w) 21014893Sedward struct ww *w; 21114893Sedward { 21214893Sedward if (w->ww_state != WWS_HASPROC) { 21314893Sedward error("No process in window."); 21414893Sedward return -1; 21514893Sedward } 21614893Sedward return 0; 21714893Sedward } 21816280Sedward 21916280Sedward setcmd(new) 22016280Sedward char new; 22116280Sedward { 22216280Sedward if (new && !incmd) { 22316280Sedward if (!terse) 22416280Sedward wwadd(cmdwin, &wwhead); 22516280Sedward if (selwin != 0) 22616280Sedward wwcursor(selwin, 1); 22716280Sedward wwcurwin = 0; 22816280Sedward } else if (!new && incmd) { 22916280Sedward if (!terse) { 23016280Sedward wwdelete(cmdwin); 23116280Sedward reframe(); 23216280Sedward } 23316280Sedward if (selwin != 0) 23416280Sedward wwcursor(selwin, 0); 23516280Sedward wwcurwin = selwin; 23616280Sedward } 23716280Sedward incmd = new; 23816280Sedward } 23916280Sedward 24016280Sedward setterse(new) 24116280Sedward char new; 24216280Sedward { 24316280Sedward if (incmd) 24416280Sedward if (new && !terse) { 24516280Sedward wwdelete(cmdwin); 24616280Sedward reframe(); 24716280Sedward } else if (!new && terse) 24816280Sedward wwadd(cmdwin, &wwhead); 24916280Sedward terse = new; 25016280Sedward } 25116280Sedward 25216280Sedward /* 25316280Sedward * Set the current window. 25416280Sedward */ 25516280Sedward setselwin(w) 25616280Sedward struct ww *w; 25716280Sedward { 25816280Sedward if (selwin == w) 25916280Sedward return; 26016304Sedward if (selwin != 0) 26116304Sedward lastselwin = selwin; 26216304Sedward if ((selwin = w) != 0) 26316304Sedward front(selwin, 1); 26416280Sedward } 265