/* 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
#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;
#endif
#include "cm.h"
-#ifdef HAVE_X_WINDOWS
-#include "xterm.h"
-#endif
-
#include "menu.h"
/* The name of the default console device. */
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);
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)
struct face *face = FACE_FROM_ID (f, face_id);
struct tty_display_info *tty = FRAME_TTY (f);
- eassert (face != NULL);
-
if (tty->TS_exit_attribute_mode)
{
/* Capability "me" will turn off appearance modes double-bright,
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 ();
}
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));
struct terminal *
init_tty (const char *name, const char *terminal_type, bool must_succeed)
{
+ struct tty_display_info *tty = NULL;
+ struct terminal *terminal = NULL;
+#ifndef DOS_NT
char *area;
char **address = &area;
int status;
- struct tty_display_info *tty = NULL;
- struct terminal *terminal = NULL;
sigset_t oldset;
bool ctty = false; /* True if asked to open controlling tty. */
+#endif
if (!terminal_type)
maybe_fatal (must_succeed, 0,
if (name == NULL)
name = DEV_TTY;
+#ifndef DOS_NT
if (!strcmp (name, DEV_TTY))
ctty = 1;
+#endif
/* If we already have a terminal on the given device, use that. If
all such terminals are suspended, create a new one instead. */