/* terminal control module for terminals described by TERMCAP
- Copyright (C) 1985, 1986, 1987, 1993 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1987, 1993, 1994 Free Software Foundation, Inc.
This file is part of GNU Emacs.
#include <stdio.h>
#include <ctype.h>
-#include "config.h"
+#include <config.h>
#include "termchar.h"
#include "termopts.h"
#include "cm.h"
{
if (! FRAME_TERMCAP_P (updating_frame))
{
- (*update_end_hook) (f);
updating_frame = 0;
+ (*update_end_hook) (f);
return;
}
turn_off_insert ();
"k9", "f9",
};
+static char **term_get_fkeys_arg;
+static Lisp_Object term_get_fkeys_1 ();
+
/* Find the escape codes sent by the function keys for Vfunction_key_map.
This function scans the termcap function key sequence entries, and
adds entries to Vfunction_key_map for each function key it finds. */
void
term_get_fkeys (address)
char **address;
+{
+ /* We run the body of the function (term_get_fkeys_1) and ignore all Lisp
+ errors during the call. The only errors should be from Fdefine_key
+ when given a key sequence containing an invalid prefix key. If the
+ termcap defines function keys which use a prefix that is already bound
+ to a command by the default bindings, we should silently ignore that
+ function key specification, rather than giving the user an error and
+ refusing to run at all on such a terminal. */
+
+ extern Lisp_Object Fidentity ();
+ static Lisp_Object term_get_fkeys_1 ();
+ term_get_fkeys_arg = address;
+ internal_condition_case (term_get_fkeys_1, Qerror, Fidentity);
+}
+
+static Lisp_Object
+term_get_fkeys_1 ()
{
extern char *tgetstr ();
int i;
+ char **address = term_get_fkeys_arg;
+
/* This can happen if CANNOT_DUMP or with strange options. */
if (!initialized)
Vfunction_key_map = Fmake_sparse_keymap (Qnil);
{
char *sequence = tgetstr (keys[i].cap, address);
if (sequence)
- Fdefine_key (Vfunction_key_map,
- build_string (sequence),
- Fmake_vector (make_number (1), intern (keys[i].name)));
+ Fdefine_key (Vfunction_key_map, build_string (sequence),
+ Fmake_vector (make_number (1),
+ intern (keys[i].name)));
}
/* The uses of the "k0" capability are inconsistent; sometimes it
if (k_semi)
{
- Fdefine_key (Vfunction_key_map,
- build_string (k_semi),
+ Fdefine_key (Vfunction_key_map, build_string (k_semi),
Fmake_vector (make_number (1), intern ("f10")));
k0_name = "f0";
}
if (k0)
- Fdefine_key (Vfunction_key_map,
- build_string (k0),
+ Fdefine_key (Vfunction_key_map, build_string (k0),
Fmake_vector (make_number (1), intern (k0_name)));
}
char *sequence = tgetstr (fcap, address);
if (sequence)
{
- (void) sprintf (fkey, "f%d", i);
- Fdefine_key (Vfunction_key_map,
- build_string (sequence),
- Fmake_vector (make_number (1), intern (fkey)));
+ sprintf (fkey, "f%d", i);
+ Fdefine_key (Vfunction_key_map, build_string (sequence),
+ Fmake_vector (make_number (1),
+ intern (fkey)));
}
}
}
{ \
char *sequence = tgetstr (cap2, address); \
if (sequence) \
- Fdefine_key (Vfunction_key_map, \
- build_string (sequence), \
- Fmake_vector (make_number (1), intern (sym))); \
+ Fdefine_key (Vfunction_key_map, build_string (sequence), \
+ Fmake_vector (make_number (1), \
+ intern (sym))); \
}
/* if there's no key_next keycap, map key_npage to `next' keysym */
CONDITIONAL_REASSIGN ("%5", "kN", "next");
/* if there's no key_prev keycap, map key_ppage to `previous' keysym */
- CONDITIONAL_REASSIGN ("%8", "kP", "previous");
+ CONDITIONAL_REASSIGN ("%8", "kP", "prior");
/* if there's no key_dc keycap, map key_ic to `insert' keysym */
CONDITIONAL_REASSIGN ("kD", "kI", "insert");
#undef CONDITIONAL_REASSIGN
if (status < 0)
fatal ("Cannot open termcap database file.\n");
if (status == 0)
- fatal ("Terminal type %s is not defined.\n", terminal_type);
+ fatal ("Terminal type %s is not defined.\n\
+If that is not the actual type of terminal you have,\n\
+use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
+`setenv TERM ...') to specify the correct type. It may be necessary\n\
+to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.\n",
+ terminal_type);
#ifdef TERMINFO
area = (char *) malloc (2044);
TS_standout_mode = tgetstr ("us", address);
}
+ /* If no `se' string, try using a `me' string instead.
+ If that fails, we can't use standout mode at all. */
+ if (TS_end_standout_mode == 0)
+ {
+ char *s = tgetstr ("me");
+ if (s != 0)
+ TS_end_standout_mode = s;
+ else
+ TS_standout_mode = 0;
+ }
+
if (TF_teleray)
{
Wcm.cm_tab = 0;
fatal ("Terminal type \"%s\" is not powerful enough to run Emacs.\n\
It lacks the ability to position the cursor.\n\
If that is not the actual type of terminal you have,\n\
-use the C-shell command `setenv TERM ...' to specify the correct type.\n\
-It may be necessary to do `unsetenv TERMCAP' as well.\n",
+use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
+`setenv TERM ...') to specify the correct type. It may be necessary\n\
+to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.\n",
terminal_type);
#endif
if (FRAME_HEIGHT (selected_frame) <= 0