X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/025875980c7fbde1d555bff245053241951e6909..77394d40d90fe4ba150444c0160654c608ef227d:/src/term.c diff --git a/src/term.c b/src/term.c index a31fd51084..0270c1eefa 100644 --- a/src/term.c +++ b/src/term.c @@ -71,13 +71,13 @@ static void tty_turn_off_highlight (struct tty_display_info *); static void tty_show_cursor (struct tty_display_info *); static void tty_hide_cursor (struct tty_display_info *); static void tty_background_highlight (struct tty_display_info *tty); -static struct terminal *get_tty_terminal (Lisp_Object, int); +static struct terminal *get_tty_terminal (Lisp_Object, bool); static void clear_tty_hooks (struct terminal *terminal); static void set_tty_hooks (struct terminal *terminal); static void dissociate_if_controlling_tty (int fd); static void delete_tty (struct terminal *); -static _Noreturn void maybe_fatal (int must_succeed, struct terminal *terminal, - const char *str1, const char *str2, ...) +static _Noreturn void maybe_fatal (bool, struct terminal *, + const char *, const char *, ...) ATTRIBUTE_FORMAT_PRINTF (3, 5) ATTRIBUTE_FORMAT_PRINTF (4, 5); static _Noreturn void vfatal (const char *str, va_list ap) ATTRIBUTE_FORMAT_PRINTF (1, 0); @@ -85,8 +85,7 @@ static _Noreturn void vfatal (const char *str, va_list ap) #define OUTPUT(tty, a) \ emacs_tputs ((tty), a, \ - (int) (FRAME_LINES (XFRAME (selected_frame)) \ - - curY (tty)), \ + FRAME_LINES (XFRAME (selected_frame)) - curY (tty), \ cmputc) #define OUTPUT1(tty, a) emacs_tputs ((tty), a, 1, cmputc) @@ -695,7 +694,7 @@ tty_write_glyphs (struct frame *f, struct glyph *string, int len) { unsigned char *conversion_buffer; struct coding_system *coding; - size_t n, stringlen; + int n, stringlen; struct tty_display_info *tty = FRAME_TTY (f); @@ -1321,7 +1320,7 @@ term_get_fkeys_1 (void) if (!KEYMAPP (KVAR (kboard, Vinput_decode_map))) kset_input_decode_map (kboard, Fmake_sparse_keymap (Qnil)); - for (i = 0; i < (sizeof (keys)/sizeof (keys[0])); i++) + for (i = 0; i < (sizeof (keys) / sizeof (keys[0])); i++) { char *sequence = tgetstr (keys[i].cap, address); if (sequence) @@ -1431,7 +1430,7 @@ static void append_glyph (struct it *); static void append_composite_glyph (struct it *); static void produce_composite_glyph (struct it *); static void append_glyphless_glyph (struct it *, int, const char *); -static void produce_glyphless_glyph (struct it *, int, Lisp_Object); +static void produce_glyphless_glyph (struct it *, Lisp_Object); /* Append glyphs to IT's glyph_row. Called from produce_glyphs for terminal frames if IT->glyph_row != NULL. IT->char_to_display is @@ -1551,7 +1550,7 @@ produce_glyphs (struct it *it) if (it->what == IT_GLYPHLESS) { - produce_glyphless_glyph (it, 0, Qnil); + produce_glyphless_glyph (it, Qnil); goto done; } @@ -1620,7 +1619,7 @@ produce_glyphs (struct it *it) Lisp_Object acronym = lookup_glyphless_char_display (-1, it); eassert (it->what == IT_GLYPHLESS); - produce_glyphless_glyph (it, 1, acronym); + produce_glyphless_glyph (it, acronym); } } @@ -1794,36 +1793,17 @@ append_glyphless_glyph (struct it *it, int face_id, const char *str) the character. See the description of enum glyphless_display_method in dispextern.h for the details. - FOR_NO_FONT is nonzero if and only if this is for a character that - is not supported by the coding system of the terminal. ACRONYM, if - non-nil, is an acronym string for the character. + ACRONYM, if non-nil, is an acronym string for the character. The glyphs actually produced are of type CHAR_GLYPH. */ static void -produce_glyphless_glyph (struct it *it, int for_no_font, Lisp_Object acronym) +produce_glyphless_glyph (struct it *it, Lisp_Object acronym) { - int face_id; - int len; + int len, face_id = merge_glyphless_glyph_face (it); char buf[sizeof "\\x" + max (6, (sizeof it->c * CHAR_BIT + 3) / 4)]; char const *str = " "; - /* Get a face ID for the glyph by utilizing a cache (the same way as - done for `escape-glyph' in get_next_display_element). */ - if (it->f == last_glyphless_glyph_frame - && it->face_id == last_glyphless_glyph_face_id) - { - face_id = last_glyphless_glyph_merged_face_id; - } - else - { - /* Merge the `glyphless-char' face into the current face. */ - face_id = merge_faces (it->f, Qglyphless_char, 0, it->face_id); - last_glyphless_glyph_frame = it->f; - last_glyphless_glyph_face_id = it->face_id; - last_glyphless_glyph_merged_face_id = face_id; - } - if (it->glyphless_method == GLYPHLESS_DISPLAY_THIN_SPACE) { /* As there's no way to produce a thin space, we produce a space @@ -1968,7 +1948,7 @@ turn_on_face (struct frame *f, int face_id) ts = tty->standout_mode ? tty->TS_set_background : tty->TS_set_foreground; if (fg >= 0 && ts) { - p = tparam (ts, NULL, 0, (int) fg, 0, 0, 0); + p = tparam (ts, NULL, 0, fg, 0, 0, 0); OUTPUT (tty, p); xfree (p); } @@ -1976,7 +1956,7 @@ turn_on_face (struct frame *f, int face_id) ts = tty->standout_mode ? tty->TS_set_foreground : tty->TS_set_background; if (bg >= 0 && ts) { - p = tparam (ts, NULL, 0, (int) bg, 0, 0, 0); + p = tparam (ts, NULL, 0, bg, 0, 0, 0); OUTPUT (tty, p); xfree (p); } @@ -2027,11 +2007,11 @@ turn_off_face (struct frame *f, int face_id) } -/* Return non-zero if the terminal on frame F supports all of the +/* Return true if the terminal on frame F supports all of the capabilities in CAPS simultaneously, with foreground and background colors FG and BG. */ -int +bool tty_capable_p (struct tty_display_info *tty, unsigned int caps, unsigned long fg, unsigned long bg) { @@ -2099,7 +2079,7 @@ static char *default_set_background; /* Save or restore the default color-related capabilities of this terminal. */ static void -tty_default_color_capabilities (struct tty_display_info *tty, int save) +tty_default_color_capabilities (struct tty_display_info *tty, bool save) { if (save) @@ -2209,7 +2189,7 @@ set_tty_color_mode (struct tty_display_info *tty, struct frame *f) /* Return the tty display object specified by TERMINAL. */ static struct terminal * -get_tty_terminal (Lisp_Object terminal, int throw) +get_tty_terminal (Lisp_Object terminal, bool throw) { struct terminal *t = get_terminal (terminal, throw); @@ -2236,8 +2216,7 @@ get_named_tty (const char *name) { struct terminal *t; - if (!name) - emacs_abort (); + eassert (name); for (t = terminal_list; t; t = t->next_terminal) { @@ -2419,15 +2398,20 @@ frame's terminal). */) t->display_info.tty->input = stdin; #else /* !MSDOS */ fd = emacs_open (t->display_info.tty->name, O_RDWR | O_NOCTTY, 0); + t->display_info.tty->input = t->display_info.tty->output + = fd < 0 ? 0 : fdopen (fd, "w+"); - if (fd == -1) - error ("Can not reopen tty device %s: %s", t->display_info.tty->name, strerror (errno)); + if (! t->display_info.tty->input) + { + int open_errno = errno; + emacs_close (fd); + report_file_errno ("Cannot reopen tty device", + build_string (t->display_info.tty->name), + open_errno); + } if (!O_IGNORE_CTTY && strcmp (t->display_info.tty->name, DEV_TTY) != 0) dissociate_if_controlling_tty (fd); - - t->display_info.tty->output = fdopen (fd, "w+"); - t->display_info.tty->input = t->display_info.tty->output; #endif add_keyboard_wait_descriptor (fd); @@ -2479,9 +2463,9 @@ term_mouse_moveto (int x, int y) const char *name; int fd; name = (const char *) ttyname (0); - fd = open (name, O_WRONLY); + fd = emacs_open (name, O_WRONLY, 0); SOME_FUNCTION (x, y, fd); - close (fd); + emacs_close (fd); last_mouse_x = x; last_mouse_y = y; */ } @@ -2519,8 +2503,8 @@ tty_draw_row_with_mouse_face (struct window *w, struct glyph_row *row, cursor_to (f, save_y, save_x); } -static int -term_mouse_movement (FRAME_PTR frame, Gpm_Event *event) +static bool +term_mouse_movement (struct frame *frame, Gpm_Event *event) { /* Has the mouse moved off the glyph it was on at the last sighting? */ if (event->x != last_mouse_x || event->y != last_mouse_y) @@ -2561,7 +2545,7 @@ timeval_to_Time (struct timeval const *t) This clears mouse_moved until the next motion event arrives. */ static void -term_mouse_position (FRAME_PTR *fp, int insist, Lisp_Object *bar_window, +term_mouse_position (struct frame **fp, int insist, Lisp_Object *bar_window, enum scroll_bar_part *part, Lisp_Object *x, Lisp_Object *y, Time *timeptr) { @@ -2649,7 +2633,7 @@ handle_one_term_event (struct tty_display_info *tty, Gpm_Event *event, struct in { struct frame *f = XFRAME (tty->top_frame); struct input_event ie; - int do_help = 0; + bool do_help = 0; int count = 0; EVENT_INIT (ie); @@ -2784,8 +2768,7 @@ create_tty_output (struct frame *f) { struct tty_output *t = xzalloc (sizeof *t); - if (! FRAME_TERMCAP_P (f)) - emacs_abort (); + eassert (FRAME_TERMCAP_P (f)); t->display_info = FRAME_TERMINAL (f)->display_info.tty; @@ -2797,8 +2780,7 @@ create_tty_output (struct frame *f) static void tty_free_frame_resources (struct frame *f) { - if (! FRAME_TERMCAP_P (f)) - emacs_abort (); + eassert (FRAME_TERMCAP_P (f)); if (FRAME_FACE_CACHE (f)) free_frame_faces (f); @@ -2813,8 +2795,7 @@ tty_free_frame_resources (struct frame *f) static void tty_free_frame_resources (struct frame *f) { - if (! FRAME_TERMCAP_P (f) && ! FRAME_MSDOS_P (f)) - emacs_abort (); + eassert (FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f)); if (FRAME_FACE_CACHE (f)) free_frame_faces (f); @@ -2909,7 +2890,7 @@ dissociate_if_controlling_tty (int fd) { /* If tcgetpgrp succeeds, fd is the controlling terminal, so dissociate it by invoking setsid. */ - if (0 <= tcgetpgrp (fd) && setsid () < 0) + if (tcgetpgrp (fd) >= 0 && setsid () < 0) { #ifdef TIOCNOTTY /* setsid failed, presumably because Emacs is already a process @@ -2931,18 +2912,21 @@ dissociate_if_controlling_tty (int fd) TERMINAL_TYPE is the termcap type of the device, e.g. "vt100". - If MUST_SUCCEED is true, then all errors are fatal. */ + If MUST_SUCCEED is true, then all errors are fatal. */ struct terminal * -init_tty (const char *name, const char *terminal_type, int must_succeed) +init_tty (const char *name, const char *terminal_type, bool must_succeed) { - char *area = NULL; +#ifdef TERMINFO + char **address = 0; +#else + char *area; char **address = &area; - int buffer_size = 4096; +#endif int status; struct tty_display_info *tty = NULL; struct terminal *terminal = NULL; - int ctty = 0; /* 1 if asked to open controlling tty. */ + bool ctty = false; /* True if asked to open controlling tty. */ if (!terminal_type) maybe_fatal (must_succeed, 0, @@ -2993,7 +2977,6 @@ init_tty (const char *name, const char *terminal_type, int must_succeed) { /* Open the terminal device. */ - FILE *file; /* If !ctty, don't recognize it as our controlling terminal, and don't make it the controlling tty if we don't have one now. @@ -3004,30 +2987,21 @@ init_tty (const char *name, const char *terminal_type, int must_succeed) open a frame on the same terminal. */ int flags = O_RDWR | O_NOCTTY | (ctty ? 0 : O_IGNORE_CTTY); int fd = emacs_open (name, flags, 0); + tty->input = tty->output = fd < 0 || ! isatty (fd) ? 0 : fdopen (fd, "w+"); - tty->name = xstrdup (name); - terminal->name = xstrdup (name); - - if (fd < 0) - maybe_fatal (must_succeed, terminal, - "Could not open file: %s", - "Could not open file: %s", - name); - if (!isatty (fd)) + if (! tty->input) { - close (fd); - maybe_fatal (must_succeed, terminal, - "Not a tty device: %s", - "Not a tty device: %s", - name); + char const *diagnostic + = tty->input ? "Not a tty device: %s" : "Could not open file: %s"; + emacs_close (fd); + maybe_fatal (must_succeed, terminal, diagnostic, diagnostic, name); } + tty->name = xstrdup (name); + terminal->name = xstrdup (name); + if (!O_IGNORE_CTTY && !ctty) dissociate_if_controlling_tty (fd); - - file = fdopen (fd, "w+"); - tty->input = file; - tty->output = file; } tty->type = xstrdup (terminal_type); @@ -3036,12 +3010,16 @@ init_tty (const char *name, const char *terminal_type, int must_succeed) Wcm_clear (tty); - tty->termcap_term_buffer = xmalloc (buffer_size); - /* On some systems, tgetent tries to access the controlling - terminal. */ + terminal. */ block_tty_out_signal (); +#ifdef TERMINFO + status = tgetent (0, terminal_type); +#else status = tgetent (tty->termcap_term_buffer, terminal_type); + if (tty->termcap_term_buffer[TERMCAP_BUFFER_SIZE - 1]) + emacs_abort (); +#endif unblock_tty_out_signal (); if (status < 0) @@ -3073,11 +3051,8 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ } #ifndef TERMINFO - if (strlen (tty->termcap_term_buffer) >= buffer_size) - emacs_abort (); - buffer_size = strlen (tty->termcap_term_buffer); + area = tty->termcap_strings_buffer; #endif - tty->termcap_strings_buffer = area = xmalloc (buffer_size); tty->TS_ins_line = tgetstr ("al", address); tty->TS_ins_multi_lines = tgetstr ("AL", address); tty->TS_bell = tgetstr ("bl", address); @@ -3109,13 +3084,13 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ Right (tty) = tgetstr ("nd", address); Down (tty) = tgetstr ("do", address); if (!Down (tty)) - Down (tty) = tgetstr ("nl", address); /* Obsolete name for "do" */ + Down (tty) = tgetstr ("nl", address); /* Obsolete name for "do". */ if (tgetflag ("bs")) - Left (tty) = "\b"; /* can't possibly be longer! */ - else /* (Actually, "bs" is obsolete...) */ + Left (tty) = "\b"; /* Can't possibly be longer! */ + else /* (Actually, "bs" is obsolete...) */ Left (tty) = tgetstr ("le", address); if (!Left (tty)) - Left (tty) = tgetstr ("bc", address); /* Obsolete name for "le" */ + Left (tty) = tgetstr ("bc", address); /* Obsolete name for "le". */ tty->TS_pad_char = tgetstr ("pc", address); tty->TS_repeat = tgetstr ("rp", address); tty->TS_end_standout_mode = tgetstr ("se", address); @@ -3189,12 +3164,13 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ #ifdef WINDOWSNT { struct frame *f = XFRAME (selected_frame); + int height, width; - initialize_w32_display (terminal); + initialize_w32_display (terminal, &width, &height); - FrameRows (tty) = FRAME_LINES (f); - FrameCols (tty) = FRAME_COLS (f); - tty->specified_window = FRAME_LINES (f); + FrameRows (tty) = height; + FrameCols (tty) = width; + tty->specified_window = height; FRAME_VERTICAL_SCROLL_BAR_TYPE (f) = vertical_scroll_bar_none; terminal->char_ins_del_ok = 1; @@ -3236,7 +3212,7 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ don't think we're losing anything by turning it off. */ terminal->line_ins_del_ok = 0; - tty->TN_max_colors = 16; /* Required to be non-zero for tty-display-color-p */ + tty->TN_max_colors = 16; /* Must be non-zero for tty-display-color-p. */ #endif /* DOS_NT */ #ifdef HAVE_GPM @@ -3332,16 +3308,16 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ tty->Wcm->cm_tab = 0; /* We can't support standout mode, because it uses magic cookies. */ tty->TS_standout_mode = 0; - /* But that means we cannot rely on ^M to go to column zero! */ + /* But that means we cannot rely on ^M to go to column zero! */ CR (tty) = 0; - /* LF can't be trusted either -- can alter hpos */ - /* if move at column 0 thru a line with TS_standout_mode */ + /* LF can't be trusted either -- can alter hpos. */ + /* If move at column 0 thru a line with TS_standout_mode. */ Down (tty) = 0; } tty->specified_window = FrameRows (tty); - if (Wcm_init (tty) == -1) /* can't do cursor motion */ + if (Wcm_init (tty) == -1) /* Can't do cursor motion. */ { maybe_fatal (must_succeed, terminal, "Terminal type \"%s\" is not powerful enough to run Emacs", @@ -3411,10 +3387,10 @@ vfatal (const char *str, va_list ap) /* Auxiliary error-handling function for init_tty. Delete TERMINAL, then call error or fatal with str1 or str2, - respectively, according to whether MUST_SUCCEED is zero or not. */ + respectively, according to whether MUST_SUCCEED is true. */ static void -maybe_fatal (int must_succeed, struct terminal *terminal, +maybe_fatal (bool must_succeed, struct terminal *terminal, const char *str1, const char *str2, ...) { va_list ap; @@ -3426,9 +3402,6 @@ maybe_fatal (int must_succeed, struct terminal *terminal, vfatal (str2, ap); else verror (str1, ap); - - va_end (ap); - emacs_abort (); } void @@ -3437,7 +3410,6 @@ fatal (const char *str, ...) va_list ap; va_start (ap, str); vfatal (str, ap); - va_end (ap); } @@ -3454,8 +3426,7 @@ delete_tty (struct terminal *terminal) if (!terminal->name) return; - if (terminal->type != output_termcap) - emacs_abort (); + eassert (terminal->type == output_termcap); tty = terminal->display_info.tty; @@ -3497,9 +3468,6 @@ delete_tty (struct terminal *terminal) xfree (tty->old_tty); xfree (tty->Wcm); - xfree (tty->termcap_strings_buffer); - xfree (tty->termcap_term_buffer); - xfree (tty); }