(wakeup_from_rne_enabled_p) [MAC_OSX]: Remove variable.
[bpt/emacs.git] / src / dispnew.c
index 018717e..1502ffd 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,
@@ -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));
@@ -1797,11 +1798,9 @@ check_matrix_invariants (w)
 
    X and Y are column/row within the frame glyph matrix where
    sub-matrices for the window tree rooted at WINDOW must be
-   allocated.  CH_DIM contains the dimensions of the smallest
-   character that could be used during display.  DIM_ONLY_P non-zero
-   means that the caller of this function is only interested in the
-   result matrix dimension, and matrix adjustments should not be
-   performed.
+   allocated.  DIM_ONLY_P non-zero means that the caller of this
+   function is only interested in the result matrix dimension, and
+   matrix adjustments should not be performed.
 
    The function returns the total width/height of the sub-matrices of
    the window tree.  If called on a frame root window, the computation
@@ -2049,8 +2048,7 @@ required_matrix_width (w)
 
 
 /* Allocate window matrices for window-based redisplay.  W is the
-   window whose matrices must be allocated/reallocated.  CH_DIM is the
-   size of the smallest character that could potentially be used on W.  */
+   window whose matrices must be allocated/reallocated.  */
 
 static void
 allocate_matrices_for_window_redisplay (w)
@@ -2167,6 +2165,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.  */
@@ -2283,7 +2308,6 @@ static void
 adjust_frame_glyphs_for_frame_redisplay (f)
      struct frame *f;
 {
-  struct dim ch_dim;
   struct dim matrix_dim;
   int pool_changed_p;
   int window_change_flags;
@@ -2292,10 +2316,6 @@ adjust_frame_glyphs_for_frame_redisplay (f)
   if (!FRAME_LIVE_P (f))
     return;
 
-  /* Determine the smallest character in any font for F.  On
-     console windows, all characters have dimension (1, 1).  */
-  ch_dim.width = ch_dim.height = 1;
-
   top_window_y = FRAME_TOP_MARGIN (f);
 
   /* Allocate glyph pool structures if not already done.  */
@@ -2359,7 +2379,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);
@@ -2384,22 +2409,14 @@ static void
 adjust_frame_glyphs_for_window_redisplay (f)
      struct frame *f;
 {
-  struct dim ch_dim;
   struct window *w;
 
   xassert (FRAME_WINDOW_P (f) && FRAME_LIVE_P (f));
 
-  /* Get minimum sizes.  */
-#ifdef HAVE_WINDOW_SYSTEM
-  ch_dim.width = FRAME_SMALLEST_CHAR_WIDTH (f);
-  ch_dim.height = FRAME_SMALLEST_FONT_HEIGHT (f);
-#else
-  ch_dim.width = ch_dim.height = 1;
-#endif
-
   /* Allocate/reallocate window matrices.  */
   allocate_matrices_for_window_redisplay (XWINDOW (FRAME_ROOT_WINDOW (f)));
 
+#ifdef HAVE_X_WINDOWS
   /* Allocate/ reallocate matrices of the dummy window used to display
      the menu bar under X when no X toolkit support is available.  */
 #if ! defined (USE_X_TOOLKIT) && ! defined (USE_GTK)
@@ -2423,7 +2440,8 @@ adjust_frame_glyphs_for_window_redisplay (f)
     XSETFASTINT (w->total_cols, FRAME_TOTAL_COLS (f));
     allocate_matrices_for_window_redisplay (w);
   }
-#endif /* not USE_X_TOOLKIT */
+#endif /* not USE_X_TOOLKIT && not USE_GTK */
+#endif /* HAVE_X_WINDOWS */
 
 #ifndef USE_GTK
   /* Allocate/ reallocate matrices of the tool bar window.  If we
@@ -3842,8 +3860,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);
@@ -3997,8 +4019,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);
@@ -4180,13 +4206,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
 
@@ -4406,7 +4427,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
-      || current_row->mouse_face_p
+      /* 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);
@@ -5225,13 +5253,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;
@@ -6370,7 +6393,12 @@ FILE = nil means just close any termscript file currently open.  */)
      (file)
      Lisp_Object file;
 {
-  if (termscript != 0) fclose (termscript);
+  if (termscript != 0)
+    {
+      BLOCK_INPUT;
+      fclose (termscript);
+      UNBLOCK_INPUT;
+    }
   termscript = 0;
 
   if (! NILP (file))
@@ -6393,6 +6421,7 @@ Control characters in STRING will have terminal-dependent effects.  */)
 {
   /* ??? Perhaps we should do something special for multibyte strings here.  */
   CHECK_STRING (string);
+  BLOCK_INPUT;
   fwrite (SDATA (string), 1, SBYTES (string), stdout);
   fflush (stdout);
   if (termscript)
@@ -6401,6 +6430,7 @@ Control characters in STRING will have terminal-dependent effects.  */)
              termscript);
       fflush (termscript);
     }
+  UNBLOCK_INPUT;
   return Qnil;
 }
 
@@ -6497,7 +6527,8 @@ Emacs was built without floating point support.
 /* This is just like wait_reading_process_output, except that
    it does redisplay.
 
-   TIMEOUT is number of seconds to wait (float or integer).
+   TIMEOUT is number of seconds to wait (float or integer),
+   or t to wait forever.
    READING is 1 if reading input.
    If DO_DISPLAY is >0 display process output while waiting.
    If DO_DISPLAY is >1 perform an initial redisplay before waiting.
@@ -6521,21 +6552,24 @@ sit_for (timeout, reading, do_display)
 
   if (INTEGERP (timeout))
     {
-      sec = XFASTINT (timeout);
+      sec = XINT (timeout);
       usec = 0;
     }
   else if (FLOATP (timeout))
     {
-      double seconds;
-
-      seconds = XFLOAT_DATA (timeout);
+      double seconds = XFLOAT_DATA (timeout);
       sec = (int) seconds;
       usec = (int) ((seconds - sec) * 1000000);
     }
+  else if (EQ (timeout, Qt))
+    {
+      sec = 0;
+      usec = 0;
+    }
   else
     wrong_type_argument (Qnumberp, timeout);
 
-  if (sec == 0 && usec == 0)
+  if (sec == 0 && usec == 0 && !EQ (timeout, Qt))
     return Qt;
 
 #ifdef SIGIO
@@ -6552,7 +6586,8 @@ sit_for (timeout, reading, do_display)
 DEFUN ("redisplay", Fredisplay, Sredisplay, 0, 1, 0,
        doc: /* Perform redisplay if no input is available.
 If optional arg FORCE is non-nil or `redisplay-dont-pause' is non-nil,
-perform a full redisplay even if input is available.  */)
+perform a full redisplay even if input is available.
+Return t if redisplay was performed, nil otherwise.  */)
      (force)
   Lisp_Object force;
 {
@@ -6827,9 +6862,15 @@ init_display ()
 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
-      fprintf (stderr, "Please set the environment variable TERM; see tset(1).\n");
-#endif
+#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);
     }