2 ** Copyright (C) 1991, 1997 Free Software Foundation, Inc.
4 ** This file is part of TACK.
6 ** TACK is free software; you can redistribute it and/or modify
7 ** it under the terms of the GNU General Public License as published by
8 ** the Free Software Foundation; either version 2, or (at your option)
11 ** TACK is distributed in the hope that it will be useful,
12 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ** GNU General Public License for more details.
16 ** You should have received a copy of the GNU General Public License
17 ** along with TACK; see the file COPYING. If not, write to
18 ** the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 ** Boston, MA 02110-1301, USA
21 /* initialization and wrapup code */
25 MODULE_ID("$Id: init.c,v 1.7 2006/11/26 00:16:01 tom Exp $")
27 #if NCURSES_VERSION_MAJOR >= 5 || NCURSES_VERSION_PATCH >= 981219
28 #define _nc_get_curterm(p) _nc_get_tty_mode(p)
33 char tty_basename[64];
36 put_name(const char *cap, const char *name)
37 { /* send the cap name followed by the cap */
45 report_cap(const char *tag, const char *s)
46 { /* expand the cap or print *** missing *** */
50 for (i = char_count; i < 13; i++) {
57 putln("*** missing ***");
64 { /* send the reset and init strings */
67 ptext("Terminal reset");
69 put_name(reset_1string, " (rs1)");
70 put_name(reset_2string, " (rs2)");
71 /* run the reset file */
72 if (reset_file && reset_file[0]) {
76 can_test("rf", FLAG_TESTED);
77 if ((fp = fopen(reset_file, "r"))) { /* send the reset file */
78 sprintf(temp, " (rf) %s", reset_file);
88 sprintf(temp, "\nCannot open reset file (rf) %s", reset_file);
92 put_name(reset_3string, " (rs3)");
93 if (i != char_count) {
97 put_name(init_1string, " (is1)");
98 put_name(init_2string, " (is2)");
99 if (set_tab && clear_all_tabs && init_tabs != 8) {
101 tc_putp(clear_all_tabs);
102 for (char_count = 0; char_count < columns; char_count++) {
104 if ((char_count & 7) == 7) {
110 /* run the initialization file */
111 if (init_file && init_file[0]) {
115 can_test("if", FLAG_TESTED);
116 if ((fp = fopen(init_file, "r"))) { /* send the init file */
117 sprintf(temp, " (if) %s", init_file);
127 sprintf(temp, "\nCannot open init file (if) %s", init_file);
132 can_test("iprog", FLAG_TESTED);
133 (void) system(init_prog);
135 put_name(init_3string, " (is3)");
143 ** display the basic terminal definitions
151 report_cap("\\r ^M (cr)", carriage_return);
152 report_cap("\\n ^J (ind)", scroll_forward);
153 report_cap("\\b ^H (cub1)", cursor_left);
154 report_cap("\\t ^I (ht)", tab);
155 /* report_cap("\\f ^L (ff)", form_feed); */
158 report_cap(" (nel)", newline);
160 report_cap(" (clear)", clear_screen);
161 if (!cursor_home && cursor_address) {
162 report_cap("(cup) (home)", TPARM_2(cursor_address, 0, 0));
164 report_cap(" (home)", cursor_home);
167 report_cap("ENQ (u9)", user9);
170 report_cap("ACK (u8)", user8);
173 sprintf(temp, "\nTerminal size: %d x %d. Baud rate: %u. Frame size: %d.%d",
177 (tty_frame_size & 1) * 5);
182 ** curses_setup(exec_name)
191 static TERMTYPE term;
192 char tty_filename[2048];
197 See if the terminal is in the terminfo data base. This call has
198 two useful benefits, 1) it returns the filename of the terminfo entry,
199 and 2) it searches only terminfo's. This allows us to abort before
200 ncurses starts scanning the termcap file.
202 if ((status = _nc_read_entry(tty_basename, tty_filename, &term)) == 0) {
203 const TERMTYPE *fallback = _nc_fallback(tty_basename);
207 sprintf(tty_filename, "(fallback)%s", tty_basename);
210 fprintf(stderr, "Terminal not found: TERM=%s\n", tty_basename);
211 show_usage(exec_name);
216 fprintf(stderr, "Terminfo database is inaccessible\n");
221 This call will load the terminfo data base and set the cur-term
222 variable. Only terminals that actually exist will get here so its
223 OK to ignore errors. This is a good thing since ncurses does not
224 permit (os) or (gn) to be set.
226 setupterm(tty_basename, 1, &status);
229 Get the current terminal definitions. This must be done before
230 getting the baudrate.
232 _nc_get_curterm(&cur_term->Nttyb);
233 tty_baud_rate = baudrate();
234 tty_cps = (tty_baud_rate << 1) / tty_frame_size;
236 /* set up the defaults */
240 select_delay_type = debug_level = 0;
241 char_mask = (meta_on && meta_on[0] == '\0') ? ALLOW_PARITY : STRIP_PARITY;
242 /* Don't change the XON/XOFF modes yet. */
243 select_xon_xoff = initial_stty_query(TTY_XON_XOFF) ? 1 : needs_xon_xoff;
245 fflush(stdout); /* flush any output */
248 go_home(); /* set can_go_home */
249 put_clear(); /* set can_clear_screen */
251 if (send_reset_init) {
256 I assume that the reset and init strings may not have the correct
257 pads. (Because that part of the test comes much later.) Because
258 of this, I allow the terminal some time to catch up.
260 fflush(stdout); /* waste some time */
261 sleep(1); /* waste more time */
263 can_test("lines cols cr nxon rf if iprog rmp smcup rmcup", FLAG_CAN_TEST);
264 edit_init(); /* initialize the edit data base */
266 if (send_reset_init && enter_ca_mode) {
267 tc_putp(enter_ca_mode);
268 put_clear(); /* just in case we switched pages */
271 ptext("Using terminfo from: ");
272 ptextln(tty_filename);
275 if (tty_can_sync == SYNC_NEEDED) {
283 ** bye_kids(exit-condition)
285 ** Shutdown the terminal, clear the signals, and exit
289 { /* reset the tty and exit */
291 if (send_reset_init) {
293 tc_putp(exit_ca_mode);
295 if (initial_stty_query(TTY_XON_XOFF)) {
296 if (enter_xon_mode) {
297 tc_putp(enter_xon_mode);
299 } else if (exit_xon_mode) {
300 tc_putp(exit_xon_mode);