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