Merge from emacs--devo--0
[bpt/emacs.git] / src / dispnew.c
index 5ace8ac..fcf5465 100644 (file)
@@ -1,13 +1,13 @@
 /* Updating of data structures for redisplay.
    Copyright (C) 1985, 1986, 1987, 1988, 1993, 1994, 1995,
                  1997, 1998, 1999, 2000, 2001, 2002, 2003,
-                 2004, 2005, 2006 Free Software Foundation, Inc.
+                 2004, 2005, 2006, 2007 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 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -36,7 +36,7 @@ Boston, MA 02110-1301, USA.  */
 #include "dispextern.h"
 #include "cm.h"
 #include "buffer.h"
-#include "charset.h"
+#include "character.h"
 #include "keyboard.h"
 #include "frame.h"
 #include "termhooks.h"
@@ -120,6 +120,7 @@ struct dim
 
 static struct glyph_matrix *save_current_matrix P_ ((struct frame *));
 static void restore_current_matrix P_ ((struct frame *, struct glyph_matrix *));
+static int showing_window_margins_p P_ ((struct window *));
 static void fake_current_matrices P_ ((Lisp_Object));
 static void redraw_overlapping_rows P_ ((struct window *, int));
 static void redraw_overlapped_rows P_ ((struct window *, int));
@@ -1992,7 +1993,7 @@ required_matrix_height (w)
   if (FRAME_WINDOW_P (f))
     {
       int ch_height = FRAME_SMALLEST_FONT_HEIGHT (f);
-      int window_pixel_height = window_box_height (w) + abs (w->vscroll);
+      int window_pixel_height = window_box_height (w) + eabs (w->vscroll);
       return (((window_pixel_height + ch_height - 1)
               / ch_height) * w->nrows_scale_factor
              /* One partially visible line at the top and
@@ -2153,6 +2154,33 @@ adjust_frame_glyphs (f)
   f->glyphs_initialized_p = 1;
 }
 
+/* Return 1 if any window in the tree has nonzero window margins.  See
+   the hack at the end of adjust_frame_glyphs_for_frame_redisplay.  */
+static int
+showing_window_margins_p (w)
+     struct window *w;
+{
+  while (w)
+    {
+      if (!NILP (w->hchild))
+       {
+         if (showing_window_margins_p (XWINDOW (w->hchild)))
+           return 1;
+       }
+      else if (!NILP (w->vchild))
+       {
+         if (showing_window_margins_p (XWINDOW (w->vchild)))
+           return 1;
+       }
+      else if (!NILP (w->left_margin_cols)
+              || !NILP (w->right_margin_cols))
+       return 1;
+      w = NILP (w->next) ? 0 : XWINDOW (w->next);
+    }
+  return 0;
+}
+
 
 /* In the window tree with root W, build current matrices of leaf
    windows from the frame's current matrix.  */
@@ -2340,7 +2368,12 @@ adjust_frame_glyphs_for_frame_redisplay (f)
       if (display_completed
          && !FRAME_GARBAGED_P (f)
          && matrix_dim.width == f->current_matrix->matrix_w
-         && matrix_dim.height == f->current_matrix->matrix_h)
+         && matrix_dim.height == f->current_matrix->matrix_h
+         /* For some reason, the frame glyph matrix gets corrupted if
+            any of the windows contain margins.  I haven't been able
+            to hunt down the reason, but for the moment this prevents
+            the problem from manifesting. -- cyd  */
+         && !showing_window_margins_p (XWINDOW (FRAME_ROOT_WINDOW (f))))
        {
          struct glyph_matrix *copy = save_current_matrix (f);
          adjust_glyph_matrix (NULL, f->desired_matrix, 0, 0, matrix_dim);
@@ -3821,8 +3854,12 @@ update_frame (f, force_p, inhibit_hairy_id_p)
   int paused_p;
   struct window *root_window = XWINDOW (f->root_window);
 
+  if (redisplay_dont_pause)
+    force_p = 1;
 #if PERIODIC_PREEMPTION_CHECKING
-  if (!force_p && NUMBERP (Vredisplay_preemption_period))
+  else if (NILP (Vredisplay_preemption_period))
+    force_p = 1;
+  else if (!force_p && NUMBERP (Vredisplay_preemption_period))
     {
       EMACS_TIME tm;
       double p = XFLOATINT (Vredisplay_preemption_period);
@@ -3979,8 +4016,12 @@ update_single_window (w, force_p)
       /* Record that this is not a frame-based redisplay.  */
       set_frame_matrix_frame (NULL);
 
+      if (redisplay_dont_pause)
+       force_p = 1;
 #if PERIODIC_PREEMPTION_CHECKING
-      if (!force_p && NUMBERP (Vredisplay_preemption_period))
+      else if (NILP (Vredisplay_preemption_period))
+       force_p = 1;
+      else if (!force_p && NUMBERP (Vredisplay_preemption_period))
        {
          EMACS_TIME tm;
          double p = XFLOATINT (Vredisplay_preemption_period);
@@ -4166,13 +4207,8 @@ update_window (w, force_p)
 #endif
 
   /* Check pending input the first time so that we can quickly return.  */
-  if (redisplay_dont_pause)
-    force_p = 1;
-#if PERIODIC_PREEMPTION_CHECKING
-  else if (NILP (Vredisplay_preemption_period))
-    force_p = 1;
-#else
-  else if (!force_p)
+#if !PERIODIC_PREEMPTION_CHECKING
+  if (!force_p)
     detect_input_pending_ignore_squeezables ();
 #endif
 
@@ -4394,12 +4430,14 @@ update_text_area (w, vpos)
       || desired_row->phys_height != current_row->phys_height
       || desired_row->visible_height != current_row->visible_height
       || current_row->overlapped_p
-#if 0
-      /* This causes excessive flickering when mouse is moved across
-        the mode line.  Luckily everything seems to work just fine
-        without doing this.  KFS 2006-09-17.  */
-      || current_row->mouse_face_p
-#endif
+      /* This next line is necessary for correctly redrawing
+        mouse-face areas after scrolling and other operations.
+        However, it causes excessive flickering when mouse is moved
+        across the mode line.  Luckily, turning it off for the mode
+        line doesn't seem to hurt anything. -- cyd.
+         But it is still needed for the header line. -- kfs.  */
+      || (current_row->mouse_face_p
+         && !(current_row->mode_line_p && vpos > 0))
       || current_row->x != desired_row->x)
     {
       rif->cursor_to (vpos, 0, desired_row->y, desired_row->x);
@@ -5221,13 +5259,8 @@ update_frame_1 (f, force_p, inhibit_id_p)
   if (preempt_count <= 0)
     preempt_count = 1;
 
-  if (redisplay_dont_pause)
-    force_p = 1;
-#if PERIODIC_PREEMPTION_CHECKING
-  else if (NILP (Vredisplay_preemption_period))
-    force_p = 1;
-#else
-  else if (!force_p && detect_input_pending_ignore_squeezables ())
+#if !PERIODIC_PREEMPTION_CHECKING
+  if (!force_p && detect_input_pending_ignore_squeezables ())
     {
       pause = 1;
       goto do_pause;
@@ -6381,7 +6414,11 @@ FILE = nil means just close any termscript file currently open.  */)
   tty = CURTTY ();
 
   if (tty->termscript != 0)
+  {
+    BLOCK_INPUT;
     fclose (tty->termscript);
+    UNBLOCK_INPUT;
+  }
   tty->termscript = 0;
 
   if (! NILP (file))
@@ -6412,6 +6449,7 @@ currently selected frame.  */)
 
   /* ??? Perhaps we should do something special for multibyte strings here.  */
   CHECK_STRING (string);
+  BLOCK_INPUT;
 
   if (!t)
     error ("Unknown terminal device");
@@ -6425,6 +6463,7 @@ currently selected frame.  */)
     }
   fwrite (SDATA (string), 1, SBYTES (string), tty->output);
   fflush (tty->output);
+  UNBLOCK_INPUT;
   return Qnil;
 }
 
@@ -6917,7 +6956,6 @@ For types not defined in VMS, use  define emacs_term \"TYPE\".\n\
       (*initial_terminal->delete_terminal_hook) (initial_terminal);
 
     /* Update frame parameters to reflect the new type. */
-    Fmodify_frame_parameters (selected_frame, Fcons (Fcons (Qwindow_system, Qnil), Qnil));
     Fmodify_frame_parameters
       (selected_frame, Fcons (Fcons (Qtty_type,
                                      Ftty_type (selected_frame)), Qnil));
@@ -7067,6 +7105,11 @@ It is up to you to set this variable if your terminal can do that.  */);
 The value is a symbol--for instance, `x' for X windows.
 The value is nil if Emacs is using a text-only terminal.  */);
 
+  DEFVAR_KBOARD ("window-system", Vwindow_system,
+                doc: /* Name of window system through which the selected frame is displayed.
+The value is a symbol--for instance, `x' for X windows.
+The value is nil if the selected frame is on a text-only-terminal.  */);
+
   DEFVAR_LISP ("window-system-version", &Vwindow_system_version,
               doc: /* The version number of the window system in use.
 For X windows, this is 10 or 11.  */);