/* 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,
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));
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. */
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);
XSETFASTINT (w->total_cols, FRAME_TOTAL_COLS (f));
allocate_matrices_for_window_redisplay (w);
}
-#endif /* not USE_X_TOOLKIT */
-#endif /* not HAVE_X_WINDOWS */
+#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
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);
/* 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);
#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
|| 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);
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;
(file)
Lisp_Object file;
{
- if (termscript != 0) fclose (termscript);
+ if (termscript != 0)
+ {
+ BLOCK_INPUT;
+ fclose (termscript);
+ UNBLOCK_INPUT;
+ }
termscript = 0;
if (! NILP (file))
{
/* ??? 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)
termscript);
fflush (termscript);
}
+ UNBLOCK_INPUT;
return Qnil;
}