diff options
author | peter <peter@FreeBSD.org> | 1999-08-24 01:06:48 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1999-08-24 01:06:48 +0000 |
commit | bacd15cb1fff2dee94d390e0f84c147cd82ea148 (patch) | |
tree | ad214c5b2c8142ad6dc6d2ce3a9c83e6317d7f77 /contrib/ncurses/tack/init.c | |
download | FreeBSD-src-bacd15cb1fff2dee94d390e0f84c147cd82ea148.zip FreeBSD-src-bacd15cb1fff2dee94d390e0f84c147cd82ea148.tar.gz |
Import unmodified (but trimmed) ncurses 5.0 prerelease 990821.
This contains the full eti (panel, form, menu) extensions.
bmake glue to follow.
Obtained from: ftp://ftp.clark.net/pub/dickey/ncurses
Diffstat (limited to 'contrib/ncurses/tack/init.c')
-rw-r--r-- | contrib/ncurses/tack/init.c | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/contrib/ncurses/tack/init.c b/contrib/ncurses/tack/init.c new file mode 100644 index 0000000..e19493d --- /dev/null +++ b/contrib/ncurses/tack/init.c @@ -0,0 +1,300 @@ +/* +** Copyright (C) 1991, 1997 Free Software Foundation, Inc. +** +** This file is part of TACK. +** +** TACK is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2, or (at your option) +** any later version. +** +** TACK is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with TACK; see the file COPYING. If not, write to +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +** Boston, MA 02111-1307, USA. +*/ +/* initialization and wrapup code */ + +#include <tack.h> + +MODULE_ID("$Id: init.c,v 1.1 1999/04/18 01:05:23 tom Exp $") + +#if NCURSES_VERSION_MAJOR >= 5 || NCURSES_VERSION_PATCH >= 981219 +#define _nc_get_curterm(p) _nc_get_tty_mode(p) +#endif + +FILE *debug_fp; +char temp[1024]; +char tty_basename[64]; + +void +put_name(const char *cap, const char *name) +{ /* send the cap name followed by the cap */ + if (cap) { + ptext(name); + tc_putp(cap); + } +} + +static void +report_cap(const char *tag, const char *s) +{ /* expand the cap or print *** missing *** */ + int i; + + ptext(tag); + for (i = char_count; i < 13; i++) { + putchp(' '); + } + put_str(" = "); + if (s) { + putln(expand(s)); + } else { + putln("*** missing ***"); + } +} + + +void +reset_init(void) +{ /* send the reset and init strings */ + int i; + + ptext("Terminal reset"); + i = char_count; + put_name(reset_1string, " (rs1)"); + put_name(reset_2string, " (rs2)"); + /* run the reset file */ + if (reset_file && reset_file[0]) { + FILE *fp; + int ch; + + can_test("rf", FLAG_TESTED); + if ((fp = fopen(reset_file, "r"))) { /* send the reset file */ + sprintf(temp, " (rf) %s", reset_file); + ptextln(temp); + while (1) { + ch = getc(fp); + if (ch == EOF) + break; + put_this(ch); + } + fclose(fp); + } else { + sprintf(temp, "\nCannot open reset file (rf) %s", reset_file); + ptextln(temp); + } + } + put_name(reset_3string, " (rs3)"); + if (i != char_count) { + put_crlf(); + } + ptext(" init"); + put_name(init_1string, " (is1)"); + put_name(init_2string, " (is2)"); + if (set_tab && clear_all_tabs && init_tabs != 8) { + put_crlf(); + tc_putp(clear_all_tabs); + for (char_count = 0; char_count < columns; char_count++) { + put_this(' '); + if ((char_count & 7) == 7) { + tc_putp(set_tab); + } + } + put_cr(); + } + /* run the initialization file */ + if (init_file && init_file[0]) { + FILE *fp; + int ch; + + can_test("if", FLAG_TESTED); + if ((fp = fopen(init_file, "r"))) { /* send the init file */ + sprintf(temp, " (if) %s", init_file); + ptextln(temp); + while (1) { + ch = getc(fp); + if (ch == EOF) + break; + put_this(ch); + } + fclose(fp); + } else { + sprintf(temp, "\nCannot open init file (if) %s", init_file); + ptextln(temp); + } + } + if (init_prog) { + can_test("iprog", FLAG_TESTED); + (void) system(init_prog); + } + put_name(init_3string, " (is3)"); + + fflush(stdout); +} + +/* +** display_basic() +** +** display the basic terminal definitions +*/ +void +display_basic(void) +{ + put_str("Name: "); + putln(ttytype); + + report_cap("\\r ^M (cr)", carriage_return); + report_cap("\\n ^J (ind)", scroll_forward); + report_cap("\\b ^H (cub1)", cursor_left); + report_cap("\\t ^I (ht)", tab); +/* report_cap("\\f ^L (ff)", form_feed); */ + if (newline) { + /* OK if missing */ + report_cap(" (nel)", newline); + } + report_cap(" (clear)", clear_screen); + if (!cursor_home && cursor_address) { + report_cap("(cup) (home)", tparm(cursor_address, 0, 0)); + } else { + report_cap(" (home)", cursor_home); + } + report_cap("ENQ (u9)", user9); + report_cap("ACK (u8)", user8); + + sprintf(temp, "\nTerminal size: %d x %d. Baud rate: %ld. Frame size: %d.%d", columns, lines, tty_baud_rate, tty_frame_size >> 1, (tty_frame_size & 1) * 5); + putln(temp); +} + +/* +** curses_setup(exec_name) +** +** Startup ncurses +*/ +void +curses_setup( + char *exec_name) +{ + int status; + static TERMTYPE term; + char tty_filename[2048]; + + tty_init(); + + /** + See if the terminal is in the terminfo data base. This call has + two useful benefits, 1) it returns the filename of the terminfo entry, + and 2) it searches only terminfo's. This allows us to abort before + ncurses starts scanning the termcap file. + **/ + if ((status = _nc_read_entry(tty_basename, tty_filename, &term)) == 0) { + fprintf(stderr, "Terminal not found: TERM=%s\n", tty_basename); + show_usage(exec_name); + exit(1); + } + if (status == -1) { + fprintf(stderr, "Terminfo database is inaccessible\n"); + exit(1); + } + + /** + This call will load the terminfo data base and set the cur-term + variable. Only terminals that actually exist will get here so its + OK to ignore errors. This is a good thing since ncurses does not + permit (os) or (gn) to be set. + **/ + setupterm(tty_basename, 1, &status); + + /** + Get the current terminal definitions. This must be done before + getting the baudrate. + **/ + _nc_get_curterm(&cur_term->Nttyb); + tty_baud_rate = baudrate(); + tty_cps = (tty_baud_rate << 1) / tty_frame_size; + + /* set up the defaults */ + replace_mode = TRUE; + scan_mode = 0; + char_count = 0; + select_delay_type = debug_level = 0; + char_mask = (meta_on && meta_on[0] == '\0') ? ALLOW_PARITY : STRIP_PARITY; + /* Don't change the XON/XOFF modes yet. */ + select_xon_xoff = initial_stty_query(TTY_XON_XOFF) ? 1 : needs_xon_xoff; + + fflush(stdout); /* flush any output */ + tty_set(); + + go_home(); /* set can_go_home */ + put_clear(); /* set can_clear_screen */ + + if (send_reset_init) { + reset_init(); + } + + /* + I assume that the reset and init strings may not have the correct + pads. (Because that part of the test comes much later.) Because + of this, I allow the terminal some time to catch up. + */ + fflush(stdout); /* waste some time */ + sleep(1); /* waste more time */ + charset_can_test(); + can_test("lines cols cr nxon rf if iprog rmp", FLAG_CAN_TEST); + edit_init(); /* initialize the edit data base */ + + if (send_reset_init && enter_ca_mode) { + tc_putp(enter_ca_mode); + put_clear(); /* just in case we switched pages */ + } + put_crlf(); + ptext("Using terminfo from: "); + ptextln(tty_filename); + put_crlf(); + + if (tty_can_sync == SYNC_NEEDED) { + verify_time(); + } + + display_basic(); +} + +/* +** bye_kids(exit-condition) +** +** Shutdown the terminal, clear the signals, and exit +*/ +void +bye_kids(int n) +{ /* reset the tty and exit */ + ignoresig(); + if (send_reset_init) { + if (exit_ca_mode) { + tc_putp(exit_ca_mode); + } + if (initial_stty_query(TTY_XON_XOFF)) { + if (enter_xon_mode) { + tc_putp(enter_xon_mode); + } + } else if (exit_xon_mode) { + tc_putp(exit_xon_mode); + } + } + if (debug_fp) { + fclose(debug_fp); + } + if (log_fp) { + fclose(log_fp); + } + tty_reset(); + fclose(stdin); + fclose(stdout); + fclose(stderr); + if (not_a_tty) + sleep(1); + exit(n); +} |