X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/bfab7c6ec74dc55d640ef36f8cb1790a1420f991..bdeb0411a2fd52eb75cac953987b690a9f6d3011:/src/dispnew.c diff --git a/src/dispnew.c b/src/dispnew.c index ccfac54575..307515f7bf 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -5,10 +5,10 @@ This file is part of GNU Emacs. -GNU Emacs is free software; you can redistribute it and/or modify +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, 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 @@ -16,9 +16,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +along with GNU Emacs. If not, see . */ #include #include @@ -61,9 +59,9 @@ Boston, MA 02110-1301, USA. */ #include "w32term.h" #endif /* HAVE_NTGUI */ -#ifdef MAC_OS -#include "macterm.h" -#endif /* MAC_OS */ +#ifdef HAVE_NS +#include "nsterm.h" +#endif /* Include systime.h after xterm.h to avoid double inclusion of time.h. */ @@ -324,7 +322,9 @@ static struct frame *frame_matrix_frame; matrix adjustments. Redisplay must stop, and glyph matrices must be adjusted when this flag becomes non-zero during display. The reason fonts can be loaded so late is that fonts of fontsets are - loaded on demand. */ + loaded on demand. Another reason is that a line contains many + characters displayed by zero width or very narrow glyphs of + variable-width fonts. */ int fonts_changed_p; @@ -3390,7 +3390,7 @@ DEFUN ("redraw-frame", Fredraw_frame, Sredraw_frame, 1, 1, 0, update_begin (f); #ifdef MSDOS if (FRAME_MSDOS_P (f)) - set_terminal_modes (FRAME_TERMINAL (f)); + FRAME_TERMINAL (f)->set_terminal_modes_hook (FRAME_TERMINAL (f)); #endif clear_frame (f); clear_current_matrices (f); @@ -3514,6 +3514,7 @@ direct_output_for_insert (g) || g == '\t' || g == '\n' || g == '\r' + || (g == ' ' && !NILP (current_buffer->word_wrap)) /* Give up if unable to display the cursor in the window. */ || w->cursor.vpos < 0 /* Give up if we are showing a message or just cleared the message @@ -5302,22 +5303,26 @@ update_frame_1 (f, force_p, inhibit_id_p) Also flush out if likely to have more than 1k buffered otherwise. I'm told that some telnet connections get really screwed by more than 1k output at once. */ - int outq = PENDING_OUTPUT_COUNT (FRAME_TTY (f)->output); - if (outq > 900 - || (outq > 20 && ((i - 1) % preempt_count == 0))) + FILE *display_output = FRAME_TTY (f)->output; + if (display_output) { - fflush (FRAME_TTY (f)->output); - if (preempt_count == 1) + int outq = PENDING_OUTPUT_COUNT (display_output); + if (outq > 900 + || (outq > 20 && ((i - 1) % preempt_count == 0))) { + fflush (display_output); + if (preempt_count == 1) + { #ifdef EMACS_OUTQSIZE - if (EMACS_OUTQSIZE (0, &outq) < 0) - /* Probably not a tty. Ignore the error and reset - the outq count. */ - outq = PENDING_OUTPUT_COUNT (FRAME_TTY (f->output)); + if (EMACS_OUTQSIZE (0, &outq) < 0) + /* Probably not a tty. Ignore the error and reset + the outq count. */ + outq = PENDING_OUTPUT_COUNT (FRAME_TTY (f->output)); #endif - outq *= 10; - if (baud_rate <= outq && baud_rate > 0) - sleep (outq / baud_rate); + outq *= 10; + if (baud_rate <= outq && baud_rate > 0) + sleep (outq / baud_rate); + } } } } @@ -6819,6 +6824,10 @@ init_display () signal (SIGWINCH, window_change_signal); #endif /* SIGWINCH */ + /* If running as a daemon, no need to initialize any frames/terminal. */ + if (is_daemon) + return; + /* If the user wants to use a window system, we shouldn't bother initializing the terminal. This is especially important when the terminal is so dumb that emacs gives up before and doesn't bother @@ -6831,12 +6840,7 @@ init_display () if (! inhibit_window_system && ! display_arg) { char *display; -#ifdef VMS - display = getenv ("DECW$DISPLAY"); -#else display = getenv ("DISPLAY"); -#endif - display_arg = (display != 0 && *display != 0); if (display_arg && !x_display_ok (display)) @@ -6856,8 +6860,6 @@ init_display () Vinitial_window_system = intern ("x"); #ifdef HAVE_X11 Vwindow_system_version = make_number (11); -#else - Vwindow_system_version = make_number (10); #endif #if defined (GNU_LINUX) && defined (HAVE_LIBNCURSES) /* In some versions of ncurses, @@ -6880,15 +6882,19 @@ init_display () } #endif /* HAVE_NTGUI */ -#ifdef MAC_OS - if (!inhibit_window_system) +#ifdef HAVE_NS + if (!inhibit_window_system +#ifndef CANNOT_DUMP + && initialized +#endif + ) { - Vinitial_window_system = intern ("mac"); - Vwindow_system_version = make_number (1); + Vinitial_window_system = intern("ns"); + Vwindow_system_version = make_number(10); adjust_frame_glyphs_initially (); return; } -#endif /* MAC_OS */ +#endif /* If no window system has been specified, try to use the terminal. */ if (! isatty (0)) @@ -6905,40 +6911,15 @@ init_display () #endif if (!terminal_type) { -#ifdef VMS - fprintf (stderr, "Please specify your terminal type.\n\ -For types defined in VMS, use set term /device=TYPE.\n\ -For types not defined in VMS, use define emacs_term \"TYPE\".\n\ -\(The quotation marks are necessary since terminal types are lower case.)\n"); -#else /* not VMS */ - #ifdef HAVE_WINDOW_SYSTEM if (! inhibit_window_system) fprintf (stderr, "Please set the environment variable DISPLAY or TERM (see `tset').\n"); else #endif /* HAVE_WINDOW_SYSTEM */ fprintf (stderr, "Please set the environment variable TERM; see `tset'.\n"); -#endif /* not VMS */ exit (1); } -#ifdef VMS - /* VMS DCL tends to up-case things, so down-case term type. - Hardly any uppercase letters in terminal types; should be none. */ - { - char *new = (char *) xmalloc (strlen (terminal_type) + 1); - char *p; - - strcpy (new, terminal_type); - - for (p = new; *p; p++) - if (isupper (*p)) - *p = tolower (*p); - - terminal_type = new; - } -#endif /* VMS */ - { struct terminal *t; struct frame *f = XFRAME (selected_frame); @@ -6967,7 +6948,13 @@ For types not defined in VMS, use define emacs_term \"TYPE\".\n\ Fmodify_frame_parameters (selected_frame, Fcons (Fcons (Qtty_type, Ftty_type (selected_frame)), Qnil)); - Fmodify_frame_parameters (selected_frame, Fcons (Fcons (Qtty, Qnil), Qnil)); + if (t->display_info.tty->name) + Fmodify_frame_parameters (selected_frame, + Fcons (Fcons (Qtty, build_string (t->display_info.tty->name)), + Qnil)); + else + Fmodify_frame_parameters (selected_frame, Fcons (Fcons (Qtty, Qnil), + Qnil)); } { @@ -6989,13 +6976,6 @@ For types not defined in VMS, use define emacs_term \"TYPE\".\n\ /* Set up faces of the initial terminal frame of a dumped Emacs. */ if (initialized && !noninteractive -#ifdef MSDOS - /* The MSDOS terminal turns on its ``window system'' relatively - late into the startup, so we cannot do the frame faces' - initialization just yet. It will be done later by pc-win.el - and internal_terminal_init. */ - && (strcmp (terminal_type, "internal") != 0 || inhibit_window_system) -#endif && NILP (Vinitial_window_system)) { /* For the initial frame, we don't have any way of knowing what @@ -7057,6 +7037,18 @@ WINDOW nil or omitted means report on the selected window. */) return w->cursor_off_p ? Qnil : Qt; } +DEFUN ("last-nonminibuffer-frame", Flast_nonminibuf_frame, + Slast_nonminibuf_frame, 0, 0, 0, + doc: /* Value is last nonminibuffer frame. */) + () +{ + Lisp_Object frame = Qnil; + + if (last_nonminibuf_frame) + XSETFRAME (frame, last_nonminibuf_frame); + + return frame; +} /*********************************************************************** Initialization @@ -7075,6 +7067,7 @@ syms_of_display () defsubr (&Ssend_string_to_terminal); defsubr (&Sinternal_show_cursor); defsubr (&Sinternal_show_cursor_p); + defsubr (&Slast_nonminibuf_frame); #if GLYPH_DEBUG defsubr (&Sdump_redisplay_history);