118729Sedward /*
2*62457Sbostic * Copyright (c) 1983, 1993
3*62457Sbostic * The Regents of the University of California. All rights reserved.
433514Sbostic *
542954Sbostic * This code is derived from software contributed to Berkeley by
642954Sbostic * Edward Wang at The University of California, Berkeley.
742954Sbostic *
842835Sbostic * %sccs.include.redist.c%
918729Sedward */
1018729Sedward
1133514Sbostic #ifndef lint
12*62457Sbostic static char sccsid[] = "@(#)cmd.c 8.1 (Berkeley) 06/06/93";
1333514Sbostic #endif /* not lint */
1433514Sbostic
1513977Sedward #include "defs.h"
1616309Sedward #include "char.h"
1713977Sedward
docmd()1813977Sedward docmd()
1913977Sedward {
2013977Sedward register char c;
2113977Sedward register struct ww *w;
2216280Sedward char out = 0;
2313977Sedward
2434107Sedward while (!out && !quit) {
2534107Sedward if ((c = wwgetc()) < 0) {
2634107Sedward if (terse)
2734107Sedward wwsetcursor(0, 0);
2834107Sedward else {
2934107Sedward wwputs("Command: ", cmdwin);
3034107Sedward wwcurtowin(cmdwin);
3113977Sedward }
3234107Sedward do
3334107Sedward wwiomux();
3434107Sedward while ((c = wwgetc()) < 0);
3534107Sedward }
3634107Sedward if (!terse)
3734107Sedward wwputc('\n', cmdwin);
3834107Sedward switch (c) {
3934107Sedward default:
4034107Sedward if (c != escapec)
4114893Sedward break;
4234107Sedward case 'h': case 'j': case 'k': case 'l':
4355911Sedward case 'y': case 'p':
4434107Sedward case ctrl('y'):
4534107Sedward case ctrl('e'):
4634107Sedward case ctrl('u'):
4734107Sedward case ctrl('d'):
4834107Sedward case ctrl('b'):
4934107Sedward case ctrl('f'):
5034107Sedward case ctrl('s'):
5134107Sedward case ctrl('q'):
5234107Sedward case ctrl('['):
5334107Sedward if (selwin == 0) {
5434107Sedward error("No window.");
5534107Sedward continue;
5634107Sedward }
5734107Sedward }
5834107Sedward switch (c) {
5934107Sedward case '1': case '2': case '3': case '4': case '5':
6034107Sedward case '6': case '7': case '8': case '9':
6134107Sedward if ((w = window[c - '1']) == 0) {
6234107Sedward error("%c: No such window.", c);
6314893Sedward break;
6434107Sedward }
6534107Sedward setselwin(w);
6634107Sedward if (checkproc(selwin) >= 0)
6734107Sedward out = 1;
6834107Sedward break;
6934107Sedward case '%':
7034107Sedward if ((w = getwin()) != 0)
7134107Sedward setselwin(w);
7234107Sedward break;
7334107Sedward case ctrl('^'):
7434107Sedward if (lastselwin != 0) {
7534107Sedward setselwin(lastselwin);
7614893Sedward if (checkproc(selwin) >= 0)
7716280Sedward out = 1;
7834107Sedward } else
7934107Sedward error("No previous window.");
8034107Sedward break;
8134107Sedward case 'c':
8234107Sedward if ((w = getwin()) != 0)
8334107Sedward closewin(w);
8434107Sedward break;
8534107Sedward case 'w':
8634107Sedward c_window();
8734107Sedward break;
8834107Sedward case 'm':
8934107Sedward if ((w = getwin()) != 0)
9034107Sedward c_move(w);
9134107Sedward break;
9234107Sedward case 'M':
9334107Sedward if ((w = getwin()) != 0)
9434107Sedward movewin(w, w->ww_alt.t, w->ww_alt.l);
9534107Sedward break;
9634107Sedward case 's':
9734107Sedward if ((w = getwin()) != 0)
9834107Sedward c_size(w);
9934107Sedward break;
10034107Sedward case 'S':
10134107Sedward if ((w = getwin()) != 0)
10234107Sedward sizewin(w, w->ww_alt.nr, w->ww_alt.nc);
10334107Sedward break;
10455911Sedward case 'y':
10555911Sedward c_yank();
10655911Sedward break;
10755911Sedward case 'p':
10855911Sedward c_put();
10955911Sedward break;
11034107Sedward case ':':
11134107Sedward c_colon();
11234107Sedward break;
11334107Sedward case 'h':
11434107Sedward (void) wwwrite(selwin, "\b", 1);
11534107Sedward break;
11634107Sedward case 'j':
11734107Sedward (void) wwwrite(selwin, "\n", 1);
11834107Sedward break;
11934107Sedward case 'k':
12034107Sedward (void) wwwrite(selwin, "\033A", 2);
12134107Sedward break;
12234107Sedward case 'l':
12334107Sedward (void) wwwrite(selwin, "\033C", 2);
12434107Sedward break;
12534107Sedward case ctrl('e'):
12634107Sedward wwscroll(selwin, 1);
12734107Sedward break;
12834107Sedward case ctrl('y'):
12934107Sedward wwscroll(selwin, -1);
13034107Sedward break;
13134107Sedward case ctrl('d'):
13234107Sedward wwscroll(selwin, selwin->ww_w.nr / 2);
13334107Sedward break;
13434107Sedward case ctrl('u'):
13534107Sedward wwscroll(selwin, - selwin->ww_w.nr / 2);
13634107Sedward break;
13734107Sedward case ctrl('f'):
13834107Sedward wwscroll(selwin, selwin->ww_w.nr);
13934107Sedward break;
14034107Sedward case ctrl('b'):
14134107Sedward wwscroll(selwin, - selwin->ww_w.nr);
14234107Sedward break;
14334107Sedward case ctrl('s'):
14434107Sedward stopwin(selwin);
14534107Sedward break;
14634107Sedward case ctrl('q'):
14734107Sedward startwin(selwin);
14834107Sedward break;
14934107Sedward case ctrl('l'):
15034107Sedward wwredraw();
15134107Sedward break;
15234107Sedward case '?':
15334107Sedward c_help();
15434107Sedward break;
15534107Sedward case ctrl('['):
15634107Sedward if (checkproc(selwin) >= 0)
15734107Sedward out = 1;
15834107Sedward break;
15934107Sedward case ctrl('z'):
16034107Sedward wwsuspend();
16134107Sedward break;
16234107Sedward case 'q':
16334107Sedward c_quit();
16434107Sedward break;
16534107Sedward /* debugging stuff */
16634107Sedward case '&':
16734107Sedward if (debug) {
16834107Sedward c_debug();
16914893Sedward break;
17034107Sedward }
17134107Sedward default:
17234107Sedward if (c == escapec) {
17334107Sedward if (checkproc(selwin) >= 0) {
17434107Sedward (void) write(selwin->ww_pty,
17534107Sedward &escapec, 1);
17634107Sedward out = 1;
17714998Sedward }
17834107Sedward } else {
17934107Sedward if (!terse)
18034107Sedward wwbell();
18134107Sedward error("Type ? for help.");
18214177Sedward }
18314893Sedward }
18413977Sedward }
18516280Sedward if (!quit)
18616280Sedward setcmd(0);
18713977Sedward }
18813977Sedward
18913977Sedward struct ww *
getwin()19013977Sedward getwin()
19113977Sedward {
19213977Sedward register int c;
19314184Sedward struct ww *w = 0;
19413977Sedward
19514189Sedward if (!terse)
19616113Sedward wwputs("Which window? ", cmdwin);
19714987Sedward wwcurtowin(cmdwin);
19815871Sedward while ((c = wwgetc()) < 0)
19915871Sedward wwiomux();
20014407Sedward if (debug && c == 'c')
20114407Sedward w = cmdwin;
20214407Sedward else if (debug && c == 'f')
20314407Sedward w = framewin;
20414795Sedward else if (debug && c == 'b')
20514795Sedward w = boxwin;
20614407Sedward else if (c >= '1' && c < NWINDOW + '1')
20714407Sedward w = window[c - '1'];
20831140Sedward else if (c == '+')
20931140Sedward w = selwin;
21031140Sedward else if (c == '-')
21131140Sedward w = lastselwin;
21214407Sedward if (w == 0)
21316313Sedward wwbell();
21414189Sedward if (!terse)
21516312Sedward wwputc('\n', cmdwin);
21613977Sedward return w;
21713977Sedward }
21813977Sedward
21914893Sedward checkproc(w)
22014893Sedward struct ww *w;
22114893Sedward {
22214893Sedward if (w->ww_state != WWS_HASPROC) {
22314893Sedward error("No process in window.");
22414893Sedward return -1;
22514893Sedward }
22614893Sedward return 0;
22714893Sedward }
22816280Sedward
setcmd(new)22916280Sedward setcmd(new)
23016280Sedward char new;
23116280Sedward {
23216280Sedward if (new && !incmd) {
23316280Sedward if (!terse)
23416280Sedward wwadd(cmdwin, &wwhead);
23516280Sedward if (selwin != 0)
23616280Sedward wwcursor(selwin, 1);
23716280Sedward wwcurwin = 0;
23816280Sedward } else if (!new && incmd) {
23916280Sedward if (!terse) {
24016280Sedward wwdelete(cmdwin);
24116280Sedward reframe();
24216280Sedward }
24316280Sedward if (selwin != 0)
24416280Sedward wwcursor(selwin, 0);
24516280Sedward wwcurwin = selwin;
24616280Sedward }
24716280Sedward incmd = new;
24816280Sedward }
24916280Sedward
setterse(new)25016280Sedward setterse(new)
25116280Sedward char new;
25216280Sedward {
25316280Sedward if (incmd)
25416280Sedward if (new && !terse) {
25516280Sedward wwdelete(cmdwin);
25616280Sedward reframe();
25716280Sedward } else if (!new && terse)
25816280Sedward wwadd(cmdwin, &wwhead);
25916280Sedward terse = new;
26016280Sedward }
26116280Sedward
26216280Sedward /*
26316280Sedward * Set the current window.
26416280Sedward */
26516280Sedward setselwin(w)
26616280Sedward struct ww *w;
26716280Sedward {
26816280Sedward if (selwin == w)
26916280Sedward return;
27016304Sedward if (selwin != 0)
27116304Sedward lastselwin = selwin;
27216304Sedward if ((selwin = w) != 0)
27316304Sedward front(selwin, 1);
27416280Sedward }
275