xref: /dflybsd-src/contrib/nvi2/ex/ex_screen.c (revision 07bc39c2f4bbca56f12568e06d89da17f2eeb965)
1*e0b8e63eSJohn Marino /*-
2*e0b8e63eSJohn Marino  * Copyright (c) 1993, 1994
3*e0b8e63eSJohn Marino  *	The Regents of the University of California.  All rights reserved.
4*e0b8e63eSJohn Marino  * Copyright (c) 1993, 1994, 1995, 1996
5*e0b8e63eSJohn Marino  *	Keith Bostic.  All rights reserved.
6*e0b8e63eSJohn Marino  *
7*e0b8e63eSJohn Marino  * See the LICENSE file for redistribution information.
8*e0b8e63eSJohn Marino  */
9*e0b8e63eSJohn Marino 
10*e0b8e63eSJohn Marino #include "config.h"
11*e0b8e63eSJohn Marino 
12*e0b8e63eSJohn Marino #include <sys/types.h>
13*e0b8e63eSJohn Marino #include <sys/queue.h>
14*e0b8e63eSJohn Marino #include <sys/time.h>
15*e0b8e63eSJohn Marino 
16*e0b8e63eSJohn Marino #include <bitstring.h>
17*e0b8e63eSJohn Marino #include <limits.h>
18*e0b8e63eSJohn Marino #include <stdio.h>
19*e0b8e63eSJohn Marino #include <stdlib.h>
20*e0b8e63eSJohn Marino #include <string.h>
21*e0b8e63eSJohn Marino 
22*e0b8e63eSJohn Marino #include "../common/common.h"
23*e0b8e63eSJohn Marino #include "../vi/vi.h"
24*e0b8e63eSJohn Marino 
25*e0b8e63eSJohn Marino /*
26*e0b8e63eSJohn Marino  * ex_bg --	:bg
27*e0b8e63eSJohn Marino  *	Hide the screen.
28*e0b8e63eSJohn Marino  *
29*e0b8e63eSJohn Marino  * PUBLIC: int ex_bg(SCR *, EXCMD *);
30*e0b8e63eSJohn Marino  */
31*e0b8e63eSJohn Marino int
ex_bg(SCR * sp,EXCMD * cmdp)32*e0b8e63eSJohn Marino ex_bg(SCR *sp, EXCMD *cmdp)
33*e0b8e63eSJohn Marino {
34*e0b8e63eSJohn Marino 	return (vs_bg(sp));
35*e0b8e63eSJohn Marino }
36*e0b8e63eSJohn Marino 
37*e0b8e63eSJohn Marino /*
38*e0b8e63eSJohn Marino  * ex_fg --	:fg [file]
39*e0b8e63eSJohn Marino  *	Show the screen.
40*e0b8e63eSJohn Marino  *
41*e0b8e63eSJohn Marino  * PUBLIC: int ex_fg(SCR *, EXCMD *);
42*e0b8e63eSJohn Marino  */
43*e0b8e63eSJohn Marino int
ex_fg(SCR * sp,EXCMD * cmdp)44*e0b8e63eSJohn Marino ex_fg(SCR *sp, EXCMD *cmdp)
45*e0b8e63eSJohn Marino {
46*e0b8e63eSJohn Marino 	SCR *nsp;
47*e0b8e63eSJohn Marino 	int newscreen;
48*e0b8e63eSJohn Marino 
49*e0b8e63eSJohn Marino 	newscreen = F_ISSET(cmdp, E_NEWSCREEN);
50*e0b8e63eSJohn Marino 	if (vs_fg(sp, &nsp, cmdp->argc ? cmdp->argv[0]->bp : NULL, newscreen))
51*e0b8e63eSJohn Marino 		return (1);
52*e0b8e63eSJohn Marino 
53*e0b8e63eSJohn Marino 	/* Set up the switch. */
54*e0b8e63eSJohn Marino 	if (newscreen) {
55*e0b8e63eSJohn Marino 		sp->nextdisp = nsp;
56*e0b8e63eSJohn Marino 		F_SET(sp, SC_SSWITCH);
57*e0b8e63eSJohn Marino 	}
58*e0b8e63eSJohn Marino 	return (0);
59*e0b8e63eSJohn Marino }
60*e0b8e63eSJohn Marino 
61*e0b8e63eSJohn Marino /*
62*e0b8e63eSJohn Marino  * ex_resize --	:resize [+-]rows
63*e0b8e63eSJohn Marino  *	Change the screen size.
64*e0b8e63eSJohn Marino  *
65*e0b8e63eSJohn Marino  * PUBLIC: int ex_resize(SCR *, EXCMD *);
66*e0b8e63eSJohn Marino  */
67*e0b8e63eSJohn Marino int
ex_resize(SCR * sp,EXCMD * cmdp)68*e0b8e63eSJohn Marino ex_resize(SCR *sp, EXCMD *cmdp)
69*e0b8e63eSJohn Marino {
70*e0b8e63eSJohn Marino 	adj_t adj;
71*e0b8e63eSJohn Marino 
72*e0b8e63eSJohn Marino 	switch (FL_ISSET(cmdp->iflags,
73*e0b8e63eSJohn Marino 	    E_C_COUNT | E_C_COUNT_NEG | E_C_COUNT_POS)) {
74*e0b8e63eSJohn Marino 	case E_C_COUNT:
75*e0b8e63eSJohn Marino 		adj = A_SET;
76*e0b8e63eSJohn Marino 		break;
77*e0b8e63eSJohn Marino 	case E_C_COUNT | E_C_COUNT_NEG:
78*e0b8e63eSJohn Marino 		adj = A_DECREASE;
79*e0b8e63eSJohn Marino 		break;
80*e0b8e63eSJohn Marino 	case E_C_COUNT | E_C_COUNT_POS:
81*e0b8e63eSJohn Marino 		adj = A_INCREASE;
82*e0b8e63eSJohn Marino 		break;
83*e0b8e63eSJohn Marino 	default:
84*e0b8e63eSJohn Marino 		ex_emsg(sp, cmdp->cmd->usage, EXM_USAGE);
85*e0b8e63eSJohn Marino 		return (1);
86*e0b8e63eSJohn Marino 	}
87*e0b8e63eSJohn Marino 	return (vs_resize(sp, cmdp->count, adj));
88*e0b8e63eSJohn Marino }
89*e0b8e63eSJohn Marino 
90*e0b8e63eSJohn Marino /*
91*e0b8e63eSJohn Marino  * ex_sdisplay --
92*e0b8e63eSJohn Marino  *	Display the list of screens.
93*e0b8e63eSJohn Marino  *
94*e0b8e63eSJohn Marino  * PUBLIC: int ex_sdisplay(SCR *);
95*e0b8e63eSJohn Marino  */
96*e0b8e63eSJohn Marino int
ex_sdisplay(SCR * sp)97*e0b8e63eSJohn Marino ex_sdisplay(SCR *sp)
98*e0b8e63eSJohn Marino {
99*e0b8e63eSJohn Marino 	GS *gp;
100*e0b8e63eSJohn Marino 	SCR *tsp;
101*e0b8e63eSJohn Marino 	int cnt, col, len, sep;
102*e0b8e63eSJohn Marino 
103*e0b8e63eSJohn Marino 	gp = sp->gp;
104*e0b8e63eSJohn Marino 	if ((tsp = TAILQ_FIRST(gp->hq)) == NULL) {
105*e0b8e63eSJohn Marino 		msgq(sp, M_INFO, "149|No background screens to display");
106*e0b8e63eSJohn Marino 		return (0);
107*e0b8e63eSJohn Marino 	}
108*e0b8e63eSJohn Marino 
109*e0b8e63eSJohn Marino 	col = len = sep = 0;
110*e0b8e63eSJohn Marino 	for (cnt = 1; tsp != NULL && !INTERRUPTED(sp);
111*e0b8e63eSJohn Marino 	    tsp = TAILQ_NEXT(tsp, q)) {
112*e0b8e63eSJohn Marino 		col += len = strlen(tsp->frp->name) + sep;
113*e0b8e63eSJohn Marino 		if (col >= sp->cols - 1) {
114*e0b8e63eSJohn Marino 			col = len;
115*e0b8e63eSJohn Marino 			sep = 0;
116*e0b8e63eSJohn Marino 			(void)ex_puts(sp, "\n");
117*e0b8e63eSJohn Marino 		} else if (cnt != 1) {
118*e0b8e63eSJohn Marino 			sep = 1;
119*e0b8e63eSJohn Marino 			(void)ex_puts(sp, " ");
120*e0b8e63eSJohn Marino 		}
121*e0b8e63eSJohn Marino 		(void)ex_puts(sp, tsp->frp->name);
122*e0b8e63eSJohn Marino 		++cnt;
123*e0b8e63eSJohn Marino 	}
124*e0b8e63eSJohn Marino 	if (!INTERRUPTED(sp))
125*e0b8e63eSJohn Marino 		(void)ex_puts(sp, "\n");
126*e0b8e63eSJohn Marino 	return (0);
127*e0b8e63eSJohn Marino }
128