Home | History | Annotate | Line # | Download | only in ex
      1 /*	$NetBSD: ex_screen.c,v 1.4 2014/01/26 21:43:45 christos Exp $ */
      2 /*-
      3  * Copyright (c) 1993, 1994
      4  *	The Regents of the University of California.  All rights reserved.
      5  * Copyright (c) 1993, 1994, 1995, 1996
      6  *	Keith Bostic.  All rights reserved.
      7  *
      8  * See the LICENSE file for redistribution information.
      9  */
     10 
     11 #include "config.h"
     12 
     13 #include <sys/cdefs.h>
     14 #if 0
     15 #ifndef lint
     16 static const char sccsid[] = "Id: ex_screen.c,v 10.12 2001/06/25 15:19:19 skimo Exp  (Berkeley) Date: 2001/06/25 15:19:19 ";
     17 #endif /* not lint */
     18 #else
     19 __RCSID("$NetBSD: ex_screen.c,v 1.4 2014/01/26 21:43:45 christos Exp $");
     20 #endif
     21 
     22 #include <sys/types.h>
     23 #include <sys/queue.h>
     24 #include <sys/time.h>
     25 
     26 #include <bitstring.h>
     27 #include <limits.h>
     28 #include <stdio.h>
     29 #include <stdlib.h>
     30 #include <string.h>
     31 
     32 #include "../common/common.h"
     33 #include "../vi/vi.h"
     34 
     35 /*
     36  * ex_bg --	:bg
     37  *	Hide the screen.
     38  *
     39  * PUBLIC: int ex_bg __P((SCR *, EXCMD *));
     40  */
     41 int
     42 ex_bg(SCR *sp, EXCMD *cmdp)
     43 {
     44 	return (vs_bg(sp));
     45 }
     46 
     47 /*
     48  * ex_fg --	:fg [file]
     49  *	Show the screen.
     50  *
     51  * PUBLIC: int ex_fg __P((SCR *, EXCMD *));
     52  */
     53 int
     54 ex_fg(SCR *sp, EXCMD *cmdp)
     55 {
     56 	SCR *nsp;
     57 	int newscreen;
     58 
     59 	newscreen = F_ISSET(cmdp, E_NEWSCREEN);
     60 	if (vs_fg(sp, &nsp, cmdp->argc ? cmdp->argv[0]->bp : NULL, newscreen))
     61 		return (1);
     62 
     63 	/* Set up the switch. */
     64 	if (newscreen) {
     65 		sp->nextdisp = nsp;
     66 		F_SET(sp, SC_SSWITCH);
     67 	}
     68 	return (0);
     69 }
     70 
     71 /*
     72  * ex_resize --	:resize [+-]rows
     73  *	Change the screen size.
     74  *
     75  * PUBLIC: int ex_resize __P((SCR *, EXCMD *));
     76  */
     77 int
     78 ex_resize(SCR *sp, 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  */
    106 int
    107 ex_sdisplay(SCR *sp)
    108 {
    109 	GS *gp;
    110 	SCR *tsp;
    111 	int cnt, sep;
    112 	size_t col, len;
    113 
    114 	gp = sp->gp;
    115 	if ((tsp = TAILQ_FIRST(&gp->hq)) == NULL) {
    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 != NULL && !INTERRUPTED(sp);
    122 	    tsp = TAILQ_NEXT(tsp, q)) {
    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