diff options
Diffstat (limited to 'contrib/nvi/tk/tk_term.c')
-rw-r--r-- | contrib/nvi/tk/tk_term.c | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/contrib/nvi/tk/tk_term.c b/contrib/nvi/tk/tk_term.c new file mode 100644 index 0000000..18299a2 --- /dev/null +++ b/contrib/nvi/tk/tk_term.c @@ -0,0 +1,169 @@ +/*- + * Copyright (c) 1993, 1994 + * The Regents of the University of California. All rights reserved. + * Copyright (c) 1993, 1994, 1995, 1996 + * Keith Bostic. All rights reserved. + * + * See the LICENSE file for redistribution information. + */ + +#include "config.h" + +#ifndef lint +static const char sccsid[] = "@(#)tk_term.c 8.12 (Berkeley) 10/13/96"; +#endif /* not lint */ + +#include <sys/types.h> +#include <sys/queue.h> + +#include <bitstring.h> +#include <errno.h> +#include <limits.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <termios.h> +#include <unistd.h> + +#include "../common/common.h" +#include "tki.h" + +/* + * tk_term_init -- + * Initialize the terminal special keys. + * + * PUBLIC: int tk_term_init __P((SCR *)); + */ +int +tk_term_init(sp) + SCR *sp; +{ + SEQ *qp; + + /* + * Rework any function key mappings that were set before the + * screen was initialized. + */ + for (qp = sp->gp->seqq.lh_first; qp != NULL; qp = qp->q.le_next) + if (F_ISSET(qp, SEQ_FUNCMAP)) + (void)tk_fmap(sp, qp->stype, + qp->input, qp->ilen, qp->output, qp->olen); + return (0); +} + +/* + * tk_term_end -- + * End the special keys defined by the termcap/terminfo entry. + * + * PUBLIC: int tk_term_end __P((GS *)); + */ +int +tk_term_end(gp) + GS *gp; +{ + SEQ *qp, *nqp; + + /* Delete screen specific mappings. */ + for (qp = gp->seqq.lh_first; qp != NULL; qp = nqp) { + nqp = qp->q.le_next; + if (F_ISSET(qp, SEQ_SCREEN)) + (void)seq_mdel(qp); + } + return (0); +} + +/* + * tk_fmap -- + * Map a function key. + * + * PUBLIC: int tk_fmap __P((SCR *, seq_t, CHAR_T *, size_t, CHAR_T *, size_t)); + */ +int +tk_fmap(sp, stype, from, flen, to, tlen) + SCR *sp; + seq_t stype; + CHAR_T *from, *to; + size_t flen, tlen; +{ + VI_INIT_IGNORE(sp); + + /* Bind a Tk/Tcl function key to a string sequence. */ + return (0); +} + +/* + * tk_optchange -- + * Curses screen specific "option changed" routine. + * + * PUBLIC: int tk_optchange __P((SCR *, int, char *, u_long *)); + */ +int +tk_optchange(sp, opt, str, valp) + SCR *sp; + int opt; + char *str; + u_long *valp; +{ + switch (opt) { + case O_COLUMNS: + case O_LINES: + /* + * Changing the columns or lines require that we restart + * the screen. + */ + F_SET(sp->gp, G_SRESTART); + F_CLR(sp, SC_SCR_EX | SC_SCR_VI); + break; + case O_TERM: + msgq(sp, M_ERR, "The screen type may not be changed"); + return (1); + } + return (0); +} + +/* + * tk_ssize -- + * Return the window size. + * + * PUBLIC: int tk_ssize __P((SCR *, int, size_t *, size_t *, int *)); + */ +int +tk_ssize(sp, sigwinch, rowp, colp, changedp) + SCR *sp; + int sigwinch; + size_t *rowp, *colp; + int *changedp; +{ + TK_PRIVATE *tkp; + + tkp = GTKP(__global_list); + (void)Tcl_Eval(tkp->interp, "tk_ssize"); + + /* + * SunOS systems deliver SIGWINCH when windows are uncovered + * as well as when they change size. In addition, we call + * here when continuing after being suspended since the window + * may have changed size. Since we don't want to background + * all of the screens just because the window was uncovered, + * ignore the signal if there's no change. + * + * !!! + * sp may be NULL. + */ + if (sigwinch && sp != NULL && + tkp->tk_ssize_row == O_VAL(sp, O_LINES) && + tkp->tk_ssize_col == O_VAL(sp, O_COLUMNS)) { + if (changedp != NULL) + *changedp = 0; + return (0); + } + + if (rowp != NULL) + *rowp = tkp->tk_ssize_row; + if (colp != NULL) + *colp = tkp->tk_ssize_col; + if (changedp != NULL) + *changedp = 1; + return (0); +} |