X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/bfed046df118533fc599449d48e59a3100e6439d..829733104db073f8abd67765eae162e7360281fa:/src/term.c diff --git a/src/term.c b/src/term.c index 15d33b4e3e..4397210965 100644 --- a/src/term.c +++ b/src/term.c @@ -1,13 +1,13 @@ /* Terminal control module for terminals described by TERMCAP - Copyright (C) 1985-1987, 1993-1995, 1998, 2000-2015 Free Software + Copyright (C) 1985-1987, 1993-1995, 1998, 2000-2016 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs 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 3 of the License, or -(at your option) any later version. +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -44,8 +44,6 @@ along with GNU Emacs. If not, see . */ #include "keymap.h" #include "blockinput.h" #include "syssignal.h" -#include "systty.h" -#include "intervals.h" #ifdef MSDOS #include "msdos.h" static int been_here = -1; @@ -56,10 +54,6 @@ static int been_here = -1; #endif #include "cm.h" -#ifdef HAVE_X_WINDOWS -#include "xterm.h" -#endif - #include "menu.h" /* The name of the default console device. */ @@ -538,15 +532,13 @@ encode_terminal_code (struct glyph *src, int src_len, multibyte-form. But, it may be enlarged on demand if Vglyph_table contains a string or a composite glyph is encountered. */ - if (min (PTRDIFF_MAX, SIZE_MAX) / MAX_MULTIBYTE_LENGTH < src_len) + if (INT_MULTIPLY_WRAPV (src_len, MAX_MULTIBYTE_LENGTH, &required)) memory_full (SIZE_MAX); - required = src_len; - required *= MAX_MULTIBYTE_LENGTH; if (encode_terminal_src_size < required) - { - encode_terminal_src = xrealloc (encode_terminal_src, required); - encode_terminal_src_size = required; - } + encode_terminal_src = xpalloc (encode_terminal_src, + &encode_terminal_src_size, + required - encode_terminal_src_size, + -1, sizeof *encode_terminal_src); charset_list = coding_charset_list (coding); @@ -1684,6 +1676,7 @@ append_composite_glyph (struct it *it) glyph = it->glyph_row->glyphs[it->area]; } glyph->type = COMPOSITE_GLYPH; + eassert (it->pixel_width <= SHRT_MAX); glyph->pixel_width = it->pixel_width; glyph->u.cmp.id = it->cmp_it.id; if (it->cmp_it.ch < 0) @@ -1862,9 +1855,11 @@ produce_glyphless_glyph (struct it *it, Lisp_Object acronym) else { eassert (it->glyphless_method == GLYPHLESS_DISPLAY_HEX_CODE); - len = (it->c < 0x10000 ? sprintf (buf, "\\u%04X", it->c) - : it->c <= MAX_UNICODE_CHAR ? sprintf (buf, "\\U%06X", it->c) - : sprintf (buf, "\\x%06X", it->c)); + len = sprintf (buf, + (it->c < 0x10000 ? "\\u%04X" + : it->c <= MAX_UNICODE_CHAR ? "\\U%06X" + : "\\x%06X"), + it->c + 0u); } str = buf; } @@ -3115,6 +3110,7 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx, Lisp_Object selectface; int first_item = 0; int col, row; + Lisp_Object prev_inhibit_redisplay = Vinhibit_redisplay; USE_SAFE_ALLOCA; /* Don't allow non-positive x0 and y0, lest the menu will wrap @@ -3157,6 +3153,11 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx, buffers_num_deleted = 1; } + /* Inhibit redisplay for as long as the menu is active, to avoid + messing the screen if some timer calls sit-for or a similar + function. */ + Vinhibit_redisplay = Qt; + /* Force update of the current frame, so that the desired and the current matrices are identical. */ update_frame_with_menu (sf, -1, -1); @@ -3347,6 +3348,7 @@ tty_menu_activate (tty_menu *menu, int *pane, int *selidx, if (!kbd_buffer_events_waiting ()) clear_input_pending (); SAFE_FREE (); + Vinhibit_redisplay = prev_inhibit_redisplay; return result; } @@ -3401,9 +3403,11 @@ static void tty_pop_down_menu (Lisp_Object arg) { tty_menu *menu = XSAVE_POINTER (arg, 0); + struct buffer *orig_buffer = XSAVE_POINTER (arg, 1); block_input (); tty_menu_destroy (menu); + set_buffer_internal (orig_buffer); unblock_input (); } @@ -3682,7 +3686,10 @@ tty_menu_show (struct frame *f, int x, int y, int menuflags, pane = selidx = 0; - record_unwind_protect (tty_pop_down_menu, make_save_ptr (menu)); + /* We save and restore the current buffer because tty_menu_activate + triggers redisplay, which switches buffers at will. */ + record_unwind_protect (tty_pop_down_menu, + make_save_ptr_ptr (menu, current_buffer)); specbind (Qoverriding_terminal_local_map, Fsymbol_value (Qtty_menu_navigation_map)); @@ -4026,12 +4033,12 @@ init_tty (const char *name, const char *terminal_type, bool must_succeed) "Terminal type %s is not defined", "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" +use the Bourne shell command 'TERM=...; export TERM' (C-shell:\n\ +'setenv TERM ...') to specify the correct type. It may be necessary\n" #ifdef TERMINFO -"to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.", +"to do 'unset TERMINFO' (C-shell: 'unsetenv TERMINFO') as well.", #else -"to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.", +"to do 'unset TERMCAP' (C-shell: 'unsetenv TERMCAP') as well.", #endif terminal_type); } @@ -4305,12 +4312,12 @@ use the Bourne shell command `TERM=... export TERM' (C-shell:\n\ "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 Bourne shell command `TERM=... export TERM' (C-shell:\n\ -`setenv TERM ...') to specify the correct type. It may be necessary\n" +use the Bourne shell command 'TERM=...; export TERM' (C-shell:\n\ +'setenv TERM ...') to specify the correct type. It may be necessary\n" # ifdef TERMINFO -"to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.", +"to do 'unset TERMINFO' (C-shell: 'unsetenv TERMINFO') as well.", # else /* TERMCAP */ -"to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.", +"to do 'unset TERMCAP' (C-shell: 'unsetenv TERMCAP') as well.", # endif /* TERMINFO */ terminal_type); }