113977Sedward #ifndef lint 2*18729Sedward static char sccsid[] = "@(#)cmd.c 3.33 04/24/85"; 313977Sedward #endif 413977Sedward 5*18729Sedward /* 6*18729Sedward * Copyright (c) 1983 Regents of the University of California, 7*18729Sedward * All rights reserved. Redistribution permitted subject to 8*18729Sedward * the terms of the Berkeley Software License Agreement. 9*18729Sedward */ 10*18729Sedward 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: 2614893Sedward if (c == escapec) 2714893Sedward goto foo; 2813977Sedward break; 2914893Sedward case 'h': case 'j': case 'k': case 'l': 3016309Sedward case ctrl(y): 3116309Sedward case ctrl(e): 3216309Sedward case ctrl(u): 3316309Sedward case ctrl(d): 3416309Sedward case ctrl(b): 3516309Sedward case ctrl(f): 3616309Sedward case ctrl(s): 3716309Sedward case ctrl(q): 3816309Sedward case ctrl([): 3914893Sedward foo: 4014893Sedward if (selwin == 0) { 4114893Sedward error("No window."); 4214893Sedward continue; 4314893Sedward } 4413977Sedward } 4514893Sedward switch (c) { 4614893Sedward case '1': case '2': case '3': case '4': case '5': 4714893Sedward case '6': case '7': case '8': case '9': 4814893Sedward if ((w = window[c - '1']) == 0) { 4915620Sedward error("%c: No such window.", c); 5014893Sedward break; 5114893Sedward } 5214184Sedward setselwin(w); 5314893Sedward if (checkproc(selwin) >= 0) 5416280Sedward out = 1; 5514893Sedward break; 5614893Sedward case '%': 5714893Sedward if ((w = getwin()) != 0) 5814893Sedward setselwin(w); 5914893Sedward break; 6016309Sedward case ctrl(^): 6115620Sedward if (lastselwin != 0) { 6215620Sedward setselwin(lastselwin); 6315620Sedward if (checkproc(selwin) >= 0) 6416280Sedward out = 1; 6515620Sedward } else 6615620Sedward error("No previous window."); 6715620Sedward break; 6814893Sedward case 'c': 6914893Sedward if ((w = getwin()) != 0) 7014893Sedward c_close(w); 7114893Sedward break; 7214893Sedward case 'w': 7314893Sedward c_window(); 7414893Sedward break; 7514893Sedward case 'm': 7614893Sedward if ((w = getwin()) != 0) 7714893Sedward c_move(w); 7814893Sedward break; 7914998Sedward case 'M': 8014998Sedward if ((w = getwin()) != 0) 8118204Sedward movewin(w, w->ww_alt.t, w->ww_alt.l); 8214998Sedward break; 8318204Sedward case 's': 8418204Sedward if ((w = getwin()) != 0) 8518204Sedward c_size(w); 8618204Sedward break; 8718204Sedward case 'S': 8818204Sedward if ((w = getwin()) != 0) 8918204Sedward sizewin(w, w->ww_alt.nr, w->ww_alt.nc); 9018204Sedward break; 9114893Sedward case ':': 9214893Sedward c_colon(); 9314893Sedward break; 9414893Sedward case 'h': 9514893Sedward (void) wwwrite(selwin, "\b", 1); 9614893Sedward break; 9714893Sedward case 'j': 9814893Sedward (void) wwwrite(selwin, "\n", 1); 9914893Sedward break; 10014893Sedward case 'k': 10114893Sedward (void) wwwrite(selwin, "\033A", 2); 10214893Sedward break; 10314893Sedward case 'l': 10414893Sedward (void) wwwrite(selwin, "\033C", 2); 10514893Sedward break; 10616309Sedward case ctrl(e): 10714893Sedward wwscroll(selwin, 1); 10814893Sedward break; 10916309Sedward case ctrl(y): 11014893Sedward wwscroll(selwin, -1); 11114893Sedward break; 11216309Sedward case ctrl(d): 11314893Sedward wwscroll(selwin, selwin->ww_w.nr / 2); 11414893Sedward break; 11516309Sedward case ctrl(u): 11614893Sedward wwscroll(selwin, - selwin->ww_w.nr / 2); 11714893Sedward break; 11816309Sedward case ctrl(f): 11914893Sedward wwscroll(selwin, selwin->ww_w.nr); 12014893Sedward break; 12116309Sedward case ctrl(b): 12214893Sedward wwscroll(selwin, - selwin->ww_w.nr); 12314893Sedward break; 12416309Sedward case ctrl(s): 12518335Sedward stopwin(selwin); 12614893Sedward break; 12716309Sedward case ctrl(q): 12818335Sedward startwin(selwin); 12914893Sedward break; 13016309Sedward case ctrl(l): 13114893Sedward wwredraw(); 13214893Sedward break; 13314893Sedward case '?': 13414893Sedward c_help(); 13514893Sedward break; 13616309Sedward case ctrl([): 13714893Sedward if (checkproc(selwin) >= 0) 13816280Sedward out = 1; 13914893Sedward break; 14016309Sedward case ctrl(z): 14114893Sedward wwsuspend(); 14214893Sedward break; 14314893Sedward case 'q': 14414893Sedward c_quit(); 14514893Sedward break; 14614998Sedward /* debugging stuff */ 14714998Sedward case '&': 14814998Sedward if (debug) { 14914998Sedward c_debug(); 15014998Sedward break; 15114998Sedward } 15214893Sedward default: 15314893Sedward if (c == escapec) { 15414893Sedward if (checkproc(selwin) >= 0) { 15514893Sedward (void) write(selwin->ww_pty, 15614893Sedward &escapec, 1); 15716280Sedward out = 1; 15814893Sedward } 15914893Sedward } else { 16014893Sedward if (!terse) 16116313Sedward wwbell(); 16214893Sedward error("Type ? for help."); 16314893Sedward } 16414177Sedward } 16514893Sedward } 16616280Sedward if (out || quit) 16713977Sedward break; 16814893Sedward if (terse) 16914893Sedward wwsetcursor(0, 0); 17014893Sedward else { 17116113Sedward wwputs("Command: ", cmdwin); 17214893Sedward wwcurtowin(cmdwin); 17313977Sedward } 17415871Sedward while (wwpeekc() < 0) 17515871Sedward wwiomux(); 17613977Sedward } 17716280Sedward if (!quit) 17816280Sedward setcmd(0); 17913977Sedward } 18013977Sedward 18113977Sedward struct ww * 18213977Sedward getwin() 18313977Sedward { 18413977Sedward register int c; 18514184Sedward struct ww *w = 0; 18613977Sedward 18714189Sedward if (!terse) 18816113Sedward wwputs("Which window? ", cmdwin); 18914987Sedward wwcurtowin(cmdwin); 19015871Sedward while ((c = wwgetc()) < 0) 19115871Sedward wwiomux(); 19214407Sedward if (debug && c == 'c') 19314407Sedward w = cmdwin; 19414407Sedward else if (debug && c == 'f') 19514407Sedward w = framewin; 19614795Sedward else if (debug && c == 'b') 19714795Sedward w = boxwin; 19814407Sedward else if (c >= '1' && c < NWINDOW + '1') 19914407Sedward w = window[c - '1']; 20014407Sedward if (w == 0) 20116313Sedward wwbell(); 20214189Sedward if (!terse) 20316312Sedward wwputc('\n', cmdwin); 20413977Sedward return w; 20513977Sedward } 20613977Sedward 20714893Sedward checkproc(w) 20814893Sedward struct ww *w; 20914893Sedward { 21014893Sedward if (w->ww_state != WWS_HASPROC) { 21114893Sedward error("No process in window."); 21214893Sedward return -1; 21314893Sedward } 21414893Sedward return 0; 21514893Sedward } 21616280Sedward 21716280Sedward setcmd(new) 21816280Sedward char new; 21916280Sedward { 22016280Sedward if (new && !incmd) { 22116280Sedward if (!terse) 22216280Sedward wwadd(cmdwin, &wwhead); 22316280Sedward if (selwin != 0) 22416280Sedward wwcursor(selwin, 1); 22516280Sedward wwcurwin = 0; 22616280Sedward } else if (!new && incmd) { 22716280Sedward if (!terse) { 22816280Sedward wwdelete(cmdwin); 22916280Sedward reframe(); 23016280Sedward } 23116280Sedward if (selwin != 0) 23216280Sedward wwcursor(selwin, 0); 23316280Sedward wwcurwin = selwin; 23416280Sedward } 23516280Sedward incmd = new; 23616280Sedward } 23716280Sedward 23816280Sedward setterse(new) 23916280Sedward char new; 24016280Sedward { 24116280Sedward if (incmd) 24216280Sedward if (new && !terse) { 24316280Sedward wwdelete(cmdwin); 24416280Sedward reframe(); 24516280Sedward } else if (!new && terse) 24616280Sedward wwadd(cmdwin, &wwhead); 24716280Sedward terse = new; 24816280Sedward } 24916280Sedward 25016280Sedward /* 25116280Sedward * Set the current window. 25216280Sedward */ 25316280Sedward setselwin(w) 25416280Sedward struct ww *w; 25516280Sedward { 25616280Sedward if (selwin == w) 25716280Sedward return; 25816304Sedward if (selwin != 0) 25916304Sedward lastselwin = selwin; 26016304Sedward if ((selwin = w) != 0) 26116304Sedward front(selwin, 1); 26216280Sedward } 263