X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/70c8ae6ebdad9265f793b91bc056204e0833682b..81f9a6edde971d8ec7d31cab03a766feb6ae074b:/src/term.c diff --git a/src/term.c b/src/term.c index b946480cd0..0c40c2d16b 100644 --- a/src/term.c +++ b/src/term.c @@ -1,5 +1,5 @@ /* Terminal control module for terminals described by TERMCAP - Copyright (C) 1985-1987, 1993-1995, 1998, 2000-2013 Free Software + Copyright (C) 1985-1987, 1993-1995, 1998, 2000-2014 Free Software Foundation, Inc. This file is part of GNU Emacs. @@ -500,8 +500,12 @@ static ptrdiff_t encode_terminal_dst_size; Set CODING->produced to the byte-length of the resulting byte sequence, and return a pointer to that byte sequence. */ +#ifndef WINDOWSNT +static +#endif unsigned char * -encode_terminal_code (struct glyph *src, int src_len, struct coding_system *coding) +encode_terminal_code (struct glyph *src, int src_len, + struct coding_system *coding) { struct glyph *src_end = src + src_len; unsigned char *buf; @@ -1418,18 +1422,6 @@ term_get_fkeys_1 (void) CONDITIONAL_REASSIGN ("kD", "kI", "insert"); /* if there's no key_end keycap, map key_ll to 'end' keysym */ CONDITIONAL_REASSIGN ("@7", "kH", "end"); - - /* IBM has their own non-standard dialect of terminfo. - If the standard name isn't found, try the IBM name. */ - CONDITIONAL_REASSIGN ("kB", "KO", "backtab"); - CONDITIONAL_REASSIGN ("@4", "kJ", "execute"); /* actually "action" */ - CONDITIONAL_REASSIGN ("@4", "kc", "execute"); /* actually "command" */ - CONDITIONAL_REASSIGN ("%7", "ki", "menu"); - CONDITIONAL_REASSIGN ("@7", "kw", "end"); - CONDITIONAL_REASSIGN ("F1", "k<", "f11"); - CONDITIONAL_REASSIGN ("F2", "k>", "f12"); - CONDITIONAL_REASSIGN ("%1", "kq", "help"); - CONDITIONAL_REASSIGN ("*6", "kU", "select"); #undef CONDITIONAL_REASSIGN } @@ -1888,55 +1880,18 @@ static void turn_on_face (struct frame *f, int face_id) { struct face *face = FACE_FROM_ID (f, face_id); - long fg = face->foreground; - long bg = face->background; + unsigned long fg = face->foreground; + unsigned long bg = face->background; struct tty_display_info *tty = FRAME_TTY (f); - /* Do this first because TS_end_standout_mode may be the same + /* Use reverse video if the face specifies that. + Do this first because TS_end_standout_mode may be the same as TS_exit_attribute_mode, which turns all appearances off. */ - if (MAY_USE_WITH_COLORS_P (tty, NC_REVERSE)) - { - if (tty->TN_max_colors > 0) - { - if (fg >= 0 && bg >= 0) - { - /* If the terminal supports colors, we can set them - below without using reverse video. The face's fg - and bg colors are set as they should appear on - the screen, i.e. they take the inverse-video'ness - of the face already into account. */ - } - else if (inverse_video) - { - if (fg == FACE_TTY_DEFAULT_FG_COLOR - || bg == FACE_TTY_DEFAULT_BG_COLOR) - tty_toggle_highlight (tty); - } - else - { - if (fg == FACE_TTY_DEFAULT_BG_COLOR - || bg == FACE_TTY_DEFAULT_FG_COLOR) - tty_toggle_highlight (tty); - } - } - else - { - /* If we can't display colors, use reverse video - if the face specifies that. */ - if (inverse_video) - { - if (fg == FACE_TTY_DEFAULT_FG_COLOR - || bg == FACE_TTY_DEFAULT_BG_COLOR) - tty_toggle_highlight (tty); - } - else - { - if (fg == FACE_TTY_DEFAULT_BG_COLOR - || bg == FACE_TTY_DEFAULT_FG_COLOR) - tty_toggle_highlight (tty); - } - } - } + if (MAY_USE_WITH_COLORS_P (tty, NC_REVERSE) + && (inverse_video + ? fg == FACE_TTY_DEFAULT_FG_COLOR || bg == FACE_TTY_DEFAULT_BG_COLOR + : fg == FACE_TTY_DEFAULT_BG_COLOR || bg == FACE_TTY_DEFAULT_FG_COLOR)) + tty_toggle_highlight (tty); if (face->tty_bold_p && MAY_USE_WITH_COLORS_P (tty, NC_BOLD)) OUTPUT1_IF (tty, tty->TS_enter_bold_mode); @@ -1961,7 +1916,7 @@ turn_on_face (struct frame *f, int face_id) char *p; ts = tty->standout_mode ? tty->TS_set_background : tty->TS_set_foreground; - if (fg >= 0 && ts) + if (face_tty_specified_color (fg) && ts) { p = tparam (ts, NULL, 0, fg, 0, 0, 0); OUTPUT (tty, p); @@ -1969,7 +1924,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) + if (face_tty_specified_color (bg) && ts) { p = tparam (ts, NULL, 0, bg, 0, 0, 0); OUTPUT (tty, p); @@ -2023,12 +1978,10 @@ turn_off_face (struct frame *f, int face_id) /* Return true if the terminal on frame F supports all of the - capabilities in CAPS simultaneously, with foreground and background - colors FG and BG. */ + capabilities in CAPS simultaneously. */ bool -tty_capable_p (struct tty_display_info *tty, unsigned int caps, - unsigned long fg, unsigned long bg) +tty_capable_p (struct tty_display_info *tty, unsigned int caps) { #define TTY_CAPABLE_P_TRY(tty, cap, TS, NC_bit) \ if ((caps & (cap)) && (!(TS) || !MAY_USE_WITH_COLORS_P(tty, NC_bit))) \ @@ -2442,7 +2395,7 @@ frame's terminal). */) was suspended. */ get_tty_size (fileno (t->display_info.tty->input), &width, &height); if (width != old_width || height != old_height) - change_frame_size (f, height, width, 0, 0, 0); + change_frame_size (f, width, height, 0, 0, 0, 0); SET_FRAME_VISIBLE (XFRAME (t->display_info.tty->top_frame), 1); } @@ -2774,17 +2727,17 @@ DEFUN ("gpm-mouse-stop", Fgpm_mouse_stop, Sgpm_mouse_stop, Menus ***********************************************************************/ -#if defined (HAVE_MENUS) && !defined (MSDOS) +#if !defined (MSDOS) /* TTY menu implementation and main ideas are borrowed from msdos.c. However, unlike on MSDOS, where the menu text is drawn directly to the display video memory, on a TTY we use display_string (see display_tty_menu_item in xdisp.c) to put the glyphs produced from - the menu items directly into the frame's 'desired_matrix' glyph - matrix, and then call update_frame_with_menu to deliver the results - to the glass. The previous contents of the screen, in the form of - the current_matrix, is stashed away, and used to restore screen + the menu items into the frame's 'desired_matrix' glyph matrix, and + then call update_frame_with_menu to deliver the results to the + glass. The previous contents of the screen, in the form of the + current_matrix, is stashed away, and used to restore screen contents when the menu selection changes or when the final selection is made and the menu should be popped down. @@ -2863,7 +2816,8 @@ tty_menu_search_pane (tty_menu *menu, int pane) { if (pane == menu->panenumber[i]) return menu->submenu[i]; - if ((try = tty_menu_search_pane (menu->submenu[i], pane))) + try = tty_menu_search_pane (menu->submenu[i], pane); + if (try) return try; } return (tty_menu *) 0; @@ -2911,11 +2865,12 @@ mouse_get_xy (int *x, int *y) } } -/* Display MENU at (X,Y) using FACES. */ +/* Display MENU at (X,Y) using FACES, starting with FIRST_ITEM + (zero-based). */ static void tty_menu_display (tty_menu *menu, int x, int y, int pn, int *faces, - int mx, int my, int disp_help) + int mx, int my, int first_item, bool disp_help) { int i, face, width, enabled, mousehere, row, col; struct frame *sf = SELECTED_FRAME (); @@ -2923,7 +2878,7 @@ tty_menu_display (tty_menu *menu, int x, int y, int pn, int *faces, /* Don't try to display more menu items than the console can display using the available screen lines. Exclude the echo area line, as it will be overwritten by the help-echo anyway. */ - int max_items = min (menu->count, FRAME_LINES (sf) - 1); + int max_items = min (menu->count - first_item, FRAME_LINES (sf) - 1 - y); menu_help_message = NULL; @@ -2933,11 +2888,12 @@ tty_menu_display (tty_menu *menu, int x, int y, int pn, int *faces, for (i = 0; i < max_items; i++) { int max_width = width + 2; /* +2 for padding blanks on each side */ + int j = i + first_item; - if (menu->submenu[i]) + if (menu->submenu[j]) max_width += 2; /* for displaying " >" after the item */ enabled - = (!menu->submenu[i] && menu->panenumber[i]) || (menu->submenu[i]); + = (!menu->submenu[j] && menu->panenumber[j]) || (menu->submenu[j]); mousehere = (y + i == my && x <= mx && mx < x + max_width); face = faces[enabled + mousehere * 2]; /* Display the menu help string for the i-th menu item even if @@ -2945,12 +2901,12 @@ tty_menu_display (tty_menu *menu, int x, int y, int pn, int *faces, code does. */ if (disp_help && enabled + mousehere * 2 >= 2) { - menu_help_message = menu->help_text[i]; + menu_help_message = menu->help_text[j]; menu_help_paneno = pn - 1; - menu_help_itemno = i; + menu_help_itemno = j; } - display_tty_menu_item (menu->text[i], max_width, face, x, y + i, - menu->submenu[i] != NULL); + display_tty_menu_item (menu->text[j], max_width, face, x, y + i, + menu->submenu[j] != NULL); } update_frame_with_menu (sf); cursor_to (sf, row, col); @@ -2991,16 +2947,19 @@ tty_menu_add_pane (tty_menu *menu, const char *txt) /* Create a new item in a menu pane. */ -static int +static bool tty_menu_add_selection (tty_menu *menu, int pane, - char *txt, int enable, char const *help_text) + char *txt, bool enable, char const *help_text) { int len; unsigned char *p; if (pane) - if (!(menu = tty_menu_search_pane (menu, pane))) - return TTYM_FAILURE; + { + menu = tty_menu_search_pane (menu, pane); + if (! menu) + return 0; + } tty_menu_make_room (menu); menu->submenu[menu->count] = (tty_menu *) 0; menu->text[menu->count] = txt; @@ -3021,7 +2980,7 @@ tty_menu_add_selection (tty_menu *menu, int pane, if (len > menu->width) menu->width = len; - return TTYM_SUCCESS; + return 1; } /* Decide where the menu would be placed if requested at (X,Y). */ @@ -3068,7 +3027,7 @@ save_and_enable_current_matrix (struct frame *f) /* Make sure every row is enabled, or else update_frame will not redraw them. (Rows that are identical to what is already on screen will not be redrawn anyway.) */ - to->enabled_p = 1; + to->enabled_p = true; to->hash = from->hash; } @@ -3124,14 +3083,20 @@ screen_update (struct frame *f, struct glyph_matrix *mtx) update_frame_with_menu (f); } -/* Read user input and return X and Y coordinates where that input - puts us. We only consider mouse movement and click events and - keyboard movement commands; the rest are ignored. +typedef enum { + MI_QUIT_MENU = -1, + MI_CONTINUE = 0, + MI_ITEM_SELECTED = 1, + MI_NEXT_ITEM = 2, + MI_PREV_ITEM = 3, + MI_SCROLL_FORWARD = 4, + MI_SCROLL_BACK = 5 +} mi_result; - Value is -1 if C-g was pressed, 1 if an item was selected, 2 or 3 - if we need to move to the next or previous menu-bar menu, zero - otherwise. */ -static int +/* Read user input and return X and Y coordinates where that input + puts us. We only consider mouse movement and click events, and + keyboard movement commands; the rest are ignored. */ +static mi_result read_menu_input (struct frame *sf, int *x, int *y, int min_y, int max_y, bool *first_time) { @@ -3143,8 +3108,8 @@ read_menu_input (struct frame *sf, int *x, int *y, int min_y, int max_y, else { Lisp_Object cmd; - int usable_input = 1; - int st = 0; + bool usable_input = 1; + mi_result st = MI_CONTINUE; struct tty_display_info *tty = FRAME_TTY (sf); Lisp_Object saved_mouse_tracking = do_mouse_tracking; @@ -3159,43 +3124,47 @@ read_menu_input (struct frame *sf, int *x, int *y, int min_y, int max_y, tty->showing_menu = 0; do_mouse_tracking = saved_mouse_tracking; - if (EQ (cmd, Qt) || EQ (cmd, Qtty_menu_exit)) - return -1; + if (EQ (cmd, Qt) || EQ (cmd, Qtty_menu_exit) + /* If some input switched frames under our feet, exit the + menu, since the menu faces are no longer valid, and the + menu is no longer relevant anyway. */ + || sf != SELECTED_FRAME ()) + return MI_QUIT_MENU; if (EQ (cmd, Qtty_menu_mouse_movement)) mouse_get_xy (x, y); else if (EQ (cmd, Qtty_menu_next_menu)) { usable_input = 0; - st = 2; + st = MI_NEXT_ITEM; } else if (EQ (cmd, Qtty_menu_prev_menu)) { usable_input = 0; - st = 3; + st = MI_PREV_ITEM; } else if (EQ (cmd, Qtty_menu_next_item)) { if (*y < max_y) *y += 1; else - *y = min_y; + st = MI_SCROLL_FORWARD; } else if (EQ (cmd, Qtty_menu_prev_item)) { if (*y > min_y) *y -= 1; else - *y = max_y; + st = MI_SCROLL_BACK; } else if (EQ (cmd, Qtty_menu_select)) - st = 1; + st = MI_ITEM_SELECTED; else if (!EQ (cmd, Qtty_menu_ignore)) usable_input = 0; if (usable_input) sf->mouse_moved = 1; return st; } - return 0; + return MI_CONTINUE; } /* Display menu, wait for user's response, and return that response. */ @@ -3203,10 +3172,11 @@ static int tty_menu_activate (tty_menu *menu, int *pane, int *selidx, int x0, int y0, char **txt, void (*help_callback)(char const *, int, int), - int kbd_navigation) + bool kbd_navigation) { struct tty_menu_state *state; - int statecount, x, y, i, leave, onepane; + int statecount, x, y, i; + bool leave, onepane; int result IF_LINT (= 0); int title_faces[4]; /* face to display the menu title */ int faces[4], buffers_num_deleted = 0; @@ -3214,6 +3184,7 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx, struct tty_display_info *tty = FRAME_TTY (sf); bool first_time; Lisp_Object selectface; + int first_item = 0; /* Don't allow non-positive x0 and y0, lest the menu will wrap around the display. */ @@ -3265,14 +3236,15 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx, want to interpret them as zero-based column and row coordinates, and also because we want the first item of the menu, not its title, to appear at x0,y0. */ - tty_menu_display (menu, x0 - 1, y0 - 1, 1, title_faces, x0 - 1, y0 - 1, 0); + tty_menu_display (menu, x0 - 1, y0 - 1, 1, title_faces, x0 - 1, y0 - 1, 0, 0); /* Turn off the cursor. Otherwise it shows through the menu panes, which is ugly. */ tty_hide_cursor (tty); if (buffers_num_deleted) menu->text[0][7] = ' '; - if ((onepane = menu->count == 1 && menu->submenu[0])) + onepane = menu->count == 1 && menu->submenu[0]; + if (onepane) { menu->width = menu->submenu[0]->width; state[0].menu = menu->submenu[0]; @@ -3292,7 +3264,7 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx, leave = 0; while (!leave) { - int input_status; + mi_result input_status; int min_y = state[0].y; int max_y = min (min_y + state[0].menu->count, FRAME_LINES (sf) - 1) - 1; @@ -3300,36 +3272,59 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx, if (input_status) { leave = 1; - if (input_status == -1) + switch (input_status) { + case MI_QUIT_MENU: /* Remove the last help-echo, so that it doesn't re-appear after "Quit". */ show_help_echo (Qnil, Qnil, Qnil, Qnil); result = TTYM_NO_SELECT; - } - else if (input_status == 2) - { + break; + case MI_NEXT_ITEM: if (kbd_navigation) result = TTYM_NEXT; else leave = 0; - } - else if (input_status == 3) - { + break; + case MI_PREV_ITEM: if (kbd_navigation) result = TTYM_PREV; else leave = 0; + break; + case MI_SCROLL_FORWARD: + if (y - min_y == state[0].menu->count - 1 - first_item) + { + y = min_y; + first_item = 0; + } + else + first_item++; + leave = 0; + break; + case MI_SCROLL_BACK: + if (first_item == 0) + { + y = max_y; + first_item = state[0].menu->count - 1 - (y - min_y); + } + else + first_item--; + leave = 0; + break; + default: + /* MI_ITEM_SELECTED is handled below, so nothing to do. */ + break; } } - if (sf->mouse_moved && input_status != -1) + if (sf->mouse_moved && input_status != MI_QUIT_MENU) { sf->mouse_moved = 0; result = TTYM_IA_SELECT; for (i = 0; i < statecount; i++) if (state[i].x <= x && x < state[i].x + state[i].menu->width + 2) { - int dy = y - state[i].y; + int dy = y - state[i].y + first_item; if (0 <= dy && dy < state[i].menu->count) { if (!state[i].menu->submenu[dy]) @@ -3358,7 +3353,7 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx, state[i].x, state[i].y, state[i].pane, - faces, x, y, 1); + faces, x, y, first_item, 1); state[statecount].menu = state[i].menu->submenu[dy]; state[statecount].pane = state[i].menu->panenumber[dy]; state[statecount].screen_behind @@ -3374,7 +3369,7 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx, state[statecount - 1].x, state[statecount - 1].y, state[statecount - 1].pane, - faces, x, y, 1); + faces, x, y, first_item, 1); tty_hide_cursor (tty); fflush (tty->output); } @@ -3442,7 +3437,7 @@ tty_menu_help_callback (char const *help_string, int pane, int item) Lisp_Object pane_name; Lisp_Object menu_object; - first_item = XVECTOR (menu_items)->u.contents; + first_item = XVECTOR (menu_items)->contents; if (EQ (first_item[0], Qt)) pane_name = first_item[MENU_ITEMS_PANE_NAME]; else if (EQ (first_item[0], Qquote)) @@ -3549,8 +3544,8 @@ tty_menu_new_item_coords (struct frame *f, int which, int *x, int *y) } Lisp_Object -tty_menu_show (struct frame *f, int x, int y, int for_click, int keymaps, - Lisp_Object title, int kbd_navigation, const char **error_name) +tty_menu_show (struct frame *f, int x, int y, bool for_click, bool keymaps, + Lisp_Object title, bool kbd_navigation, const char **error_name) { tty_menu *menu; int pane, selidx, lpane, status; @@ -3673,9 +3668,8 @@ tty_menu_show (struct frame *f, int x, int y, int for_click, int keymaps, item_data = SSDATA (item_name); if (lpane == TTYM_FAILURE - || (tty_menu_add_selection (menu, lpane, item_data, - !NILP (enable), help_string) - == TTYM_FAILURE)) + || (! tty_menu_add_selection (menu, lpane, item_data, + !NILP (enable), help_string))) { tty_menu_destroy (menu); *error_name = "Can't add selection to menu"; @@ -3801,6 +3795,11 @@ tty_menu_show (struct frame *f, int x, int y, int for_click, int keymaps, case TTYM_IA_SELECT: break; case TTYM_NO_SELECT: + /* If the selected frame was changed while we displayed a menu, + throw to top level in order to undo any temporary settings + made by TTY menu code. */ + if (f != SELECTED_FRAME ()) + Ftop_level (); /* Make "Cancel" equivalent to C-g unless FOR_CLICK (which means the menu was invoked with a mouse event as POSITION). */ if (! for_click) @@ -3814,7 +3813,7 @@ tty_menu_show (struct frame *f, int x, int y, int for_click, int keymaps, return entry; } -#endif /* HAVE_MENUS && !MSDOS */ +#endif /* !MSDOS */ #ifndef MSDOS @@ -3823,7 +3822,7 @@ tty_menu_show (struct frame *f, int x, int y, int for_click, int keymaps, ***********************************************************************/ /* Initialize the tty-dependent part of frame F. The frame must - already have its device initialized. */ + already have its device initialized. */ void create_tty_output (struct frame *f) @@ -3837,30 +3836,25 @@ create_tty_output (struct frame *f) f->output_data.tty = t; } -/* Delete frame F's face cache, and its tty-dependent part. */ +/* Delete frame F's face cache, and its tty-dependent part. */ static void tty_free_frame_resources (struct frame *f) { eassert (FRAME_TERMCAP_P (f)); - - if (FRAME_FACE_CACHE (f)) - free_frame_faces (f); - + free_frame_faces (f); xfree (f->output_data.tty); } #else /* MSDOS */ -/* Delete frame F's face cache. */ +/* Delete frame F's face cache. */ static void tty_free_frame_resources (struct frame *f) { eassert (FRAME_TERMCAP_P (f) || FRAME_MSDOS_P (f)); - - if (FRAME_FACE_CACHE (f)) - free_frame_faces (f); + free_frame_faces (f); } #endif /* MSDOS */ @@ -4203,9 +4197,9 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ /* Since we make MagicWrap terminals look like AutoWrap, we need to have the former flag imply the latter. */ AutoWrap (tty) = MagicWrap (tty) || tgetflag ("am"); - terminal->memory_below_frame = tgetflag ("db"); + tty->memory_below_frame = tgetflag ("db"); tty->TF_hazeltine = tgetflag ("hz"); - terminal->must_write_spaces = tgetflag ("in"); + tty->must_write_spaces = tgetflag ("in"); tty->meta_key = tgetflag ("km") || tgetflag ("MT"); tty->TF_insmode_motion = tgetflag ("mi"); tty->TF_standout_motion = tgetflag ("ms"); @@ -4225,7 +4219,7 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ tty->specified_window = height; FRAME_VERTICAL_SCROLL_BAR_TYPE (f) = vertical_scroll_bar_none; - terminal->char_ins_del_ok = 1; + tty->char_ins_del_ok = 1; baud_rate = 19200; } #else /* MSDOS */ @@ -4238,7 +4232,7 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ get_tty_size (fileno (tty->input), &width, &height); FrameCols (tty) = width; FrameRows (tty) = height; - terminal->char_ins_del_ok = 0; + tty->char_ins_del_ok = 0; init_baud_rate (fileno (tty->input)); } #endif /* MSDOS */ @@ -4257,12 +4251,12 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ tty->delete_in_insert_mode = 1; UseTabs (tty) = 0; - terminal->scroll_region_ok = 0; + tty->scroll_region_ok = 0; /* Seems to insert lines when it's not supposed to, messing up the display. In doing a trace, it didn't seem to be called much, so I don't think we're losing anything by turning it off. */ - terminal->line_ins_del_ok = 0; + tty->line_ins_del_ok = 0; tty->TN_max_colors = 16; /* Must be non-zero for tty-display-color-p. */ #endif /* DOS_NT */ @@ -4393,23 +4387,21 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ UseTabs (tty) = tabs_safe_p (fileno (tty->input)) && TabWidth (tty) == 8; - terminal->scroll_region_ok + tty->scroll_region_ok = (tty->Wcm->cm_abs && (tty->TS_set_window || tty->TS_set_scroll_region || tty->TS_set_scroll_region_1)); - terminal->line_ins_del_ok + tty->line_ins_del_ok = (((tty->TS_ins_line || tty->TS_ins_multi_lines) && (tty->TS_del_line || tty->TS_del_multi_lines)) - || (terminal->scroll_region_ok + || (tty->scroll_region_ok && tty->TS_fwd_scroll && tty->TS_rev_scroll)); - terminal->char_ins_del_ok + tty->char_ins_del_ok = ((tty->TS_ins_char || tty->TS_insert_mode || tty->TS_pad_inserted_char || tty->TS_ins_multi_chars) && (tty->TS_del_char || tty->TS_del_multi_chars)); - terminal->fast_clear_end_of_line = tty->TS_clr_line != 0; - init_baud_rate (fileno (tty->input)); #endif /* not DOS_NT */