summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Morris <rgm@gnu.org>2014-06-14 17:06:30 -0700
committerGlenn Morris <rgm@gnu.org>2014-06-14 17:06:30 -0700
commit90de50e27049ae19492dd9843e50618ea4ed5d14 (patch)
tree1efdf48fb6243e3f8448465c59dda3eb9db67a0c
parent799d2f3d87185a51835d0594a89485932d0f4c23 (diff)
parent27433ff85f21f108e84a6e8966c9461cf66c2015 (diff)
Merge from emacs-24; up to 2014-06-03T06:51:18Z!eliz@gnu.org
-rw-r--r--ChangeLog8
-rw-r--r--configure.ac14
-rw-r--r--doc/lispref/ChangeLog5
-rw-r--r--doc/lispref/commands.texi21
-rw-r--r--etc/NEWS46
-rw-r--r--etc/PROBLEMS1
-rw-r--r--lisp/ChangeLog29
-rw-r--r--lisp/bindings.el12
-rw-r--r--lisp/emacs-lisp/smie.el5
-rw-r--r--lisp/progmodes/cc-langs.el36
-rw-r--r--lisp/subr.el2
-rw-r--r--lisp/term/xterm.el4
-rw-r--r--src/ChangeLog10
-rw-r--r--src/alloc.c13
-rw-r--r--src/xdisp.c68
15 files changed, 203 insertions, 71 deletions
diff --git a/ChangeLog b/ChangeLog
index 90a1ce7c0c..2c3e6c722a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2014-06-15 Paul Eggert <eggert@cs.ucla.edu>
+
+ Port part of the AIX fix to Solaris (Bug#17598).
+ * configure.ac (_REENTRANT): Define on Solaris if HAVE_PTHREAD.
+ This ports part of the recent AIX fixes to Solaris. It is needed
+ for the same reason that _THREAD_SAFE is needed on AIX, e.g., to
+ make sure that each thread has its own 'errno'.
+
2014-06-13 Glenn Morris <rgm@gnu.org>
* Makefile.in (CC, CFLAGS, LDFLAGS, CPPFLAGS, abs_top_srcdir):
diff --git a/configure.ac b/configure.ac
index 0f7d858bd6..c24469a0bb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2091,11 +2091,15 @@ if test "$ac_cv_header_pthread_h"; then
# Some systems optimize for single-threaded programs by default, and
# need special flags to disable these optimizations. For example, the
# definition of 'errno' in <errno.h>.
- if test "$opsys" = aix4-2; then
- AC_DEFINE([_THREAD_SAFE], [1],
- [Define to 1 if your system requires this in multithreaded code.])
- fi])
- if test "X$LIBS" != "X$OLD_LIBS"; then
+ case $opsys in
+ sol*)
+ AC_DEFINE([_REENTRANT], 1,
+ [Define to 1 if your system requires this in multithreaded code.]);;
+ aix4-2)
+ AC_DEFINE([_THREAD_SAFE], 1,
+ [Define to 1 if your system requires this in multithreaded code.]);;
+ esac])
+ if test "X$LIBS" != "X$OLD_LIBS"; then
eval LIB_PTHREAD=\$ac_cv_search_$emacs_pthread_function
fi
LIBS=$OLD_LIBS
diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog
index fd50c2aebd..f7c0d14abb 100644
--- a/doc/lispref/ChangeLog
+++ b/doc/lispref/ChangeLog
@@ -1,3 +1,8 @@
+2014-06-15 Eli Zaretskii <eliz@gnu.org>
+
+ * commands.texi (Accessing Mouse): Improve the wording of the
+ posn-col-row documentation. (Bug#17768)
+
2014-06-10 Glenn Morris <rgm@gnu.org>
* Makefile.in (INFO_EXT): Remove and replace by ".info" throughout.
diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi
index ad1bf80a85..58e903918b 100644
--- a/doc/lispref/commands.texi
+++ b/doc/lispref/commands.texi
@@ -2053,23 +2053,24 @@ POSITION is assumed to lie in a window text area."
@defun posn-col-row position
This function returns a cons cell @code{(@var{col} . @var{row})},
containing the estimated column and row corresponding to buffer
-position @var{position}. The return value is given in units of the
-frame's default character width and height, as computed from the
-@var{x} and @var{y} values corresponding to @var{position}. (So, if
-the actual characters have non-default sizes, the actual row and
-column may differ from these computed values.)
+position in @var{position}. The return value is given in units of the
+frame's default character width and default line height (including
+spacing), as computed from the @var{x} and @var{y} values
+corresponding to @var{position}. (So, if the actual characters have
+non-default sizes, the actual row and column may differ from these
+computed values.)
Note that @var{row} is counted from the top of the text area. If the
-window possesses a header line (@pxref{Header Lines}), it is
-@emph{not} counted as the first line.
+window given by @var{position} possesses a header line (@pxref{Header
+Lines}), it is @emph{not} included in the @var{row} count.
@end defun
@defun posn-actual-col-row position
Return the actual row and column in @var{position}, as a cons cell
@code{(@var{col} . @var{row})}. The values are the actual row and
-column numbers in the window. @xref{Click Events}, for details. It
-returns @code{nil} if @var{position} does not include actual positions
-values.
+column numbers in the window given by @var{position}. @xref{Click
+Events}, for details. The function returns @code{nil} if
+@var{position} does not include actual position values.
@end defun
@defun posn-string position
diff --git a/etc/NEWS b/etc/NEWS
index 63e3707486..5df0897856 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -309,16 +309,7 @@ removed.
*** The function `quail-help' is no longer an interactive command.
Use `C-h C-\' (`describe-input-method') instead.
-** ImageMagick
-
-*** ImageMagick images now support the :max-width and :max-height keywords.
-
-*** When using `create-image' with image data, you can pass a :format
-attribute (via the property-list argument) in order to help
-ImageMagick detect the image type. The value should be a MIME
-content-type that is found in the new variable `image-format-suffixes'.
-
-** Frame and window changes
+** Frame and window handling
*** New commands `toggle-frame-fullscreen' and `toggle-frame-maximized',
bound to <f11> and M-<f10>, respectively.
@@ -416,7 +407,7 @@ bottom of the selected frame.
caller of `display-buffer' is ready to handle the case of not displaying
the buffer in a window.
-** Lisp evaluation changes
+** Lisp evaluation
*** `eval-defun' on an already defined defcustom calls the :set function,
if there is one.
@@ -450,7 +441,7 @@ simply disabling Transient Mark mode does the same thing.
* Editing Changes in Emacs 24.4
-** Indentation changes
+** Indentation
*** `electric-indent-mode' is now enabled by default.
Typing RET reindents the current line and indents the new line.
@@ -708,8 +699,7 @@ the symbol near point.
*** New option `hi-lock-auto-select-face'. When non-nil, hi-lock commands
will cycle through faces in `hi-lock-face-defaults' without prompting.
-** Icomplete
-Icomplete is now more similar to Ido.
+** Icomplete is now more similar to Ido.
*** Icomplete by default now applies to all forms of minibuffer completion.
The variable `icomplete-with-completion-tables' (now a user option)
@@ -1066,8 +1056,8 @@ Also the following files used by the now obsolete otodo-mode.el:
* New Modes and Packages in Emacs 24.4
-** New package `eww' is a built-in web browser.
-(It is only available if Emacs is compiled with libxml2 support.)
+** New package eww.el provides a built-in web browser.
+This requires Emacs to have been compiled with libxml2 support.
** New package nadvice.el offers lighter-weight advice facilities.
It is layered as:
@@ -1078,11 +1068,10 @@ any function-carrying place, such as process filters or `<foo>-function' hooks.
*** `advice-add'/`advice-remove' to add/remove a piece of advice on a named
function, much like `defadvice' does.
-** New package frameset.el.
-It provides a set of operations to save a frameset (the state of all
-or a subset of the existing frames and windows, somewhat similar to a
-frame configuration), both in-session and persistently, and restore it
-at some point in the future.
+** New package frameset.el provides a set of operations to save a frameset
+(the state of all or a subset of the existing frames and windows, somewhat
+similar to a frame configuration), both in-session and persistently, and
+restore it at some point in the future.
** New package filenotify.el provides an interface for file system
notifications. It requires that Emacs be compiled with one of the
@@ -1092,9 +1081,9 @@ low-level libraries gfilenotify.c, inotify.c or w32notify.c.
display specified symbols as composed characters. E.g., in Emacs Lisp mode,
this replaces the string "lambda" with the Greek lambda character.
-** New minor mode `superword-mode'.
-This overrides the default word motion commands to treat "symbol_words"
-as a single word, similar to what `subword-mode' does.
+** New minor mode `superword-mode', which overrides the default word motion
+commands to treat "symbol_words" as a single word, similar to what
+`subword-mode' does.
* Incompatible Lisp Changes in Emacs 24.4
@@ -1332,6 +1321,15 @@ animated images which do not specify a frame delay.
*** New functions `image-current-frame' and `image-show-frame' for getting
and setting the current frame of a multi-frame image.
+** ImageMagick
+
+*** ImageMagick images now support the :max-width and :max-height keywords.
+
+*** When using `create-image' with image data, you can pass a :format
+attribute (via the property-list argument) in order to help
+ImageMagick detect the image type. The value should be a MIME
+content-type that is found in the new variable `image-format-suffixes'.
+
** Revert and Autorevert
*** If Emacs is compiled with file notification support, it uses notifications
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index 1fffe0638c..98e19d3e76 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -159,7 +159,6 @@ This is due to a bug introduced in ImageMagick 6.8.2-3. The bug should
be fixed in ImageMagick 6.8.3-10. See <URL:http://debbugs.gnu.org/13867>.
** Crashes when displaying GIF images in Emacs built with version
-
libungif-4.1.0 are resolved by using version libungif-4.1.0b1.
Configure checks for the correct version, but this problem could occur
if a binary built against a shared libungif is run on a system with an
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index bd8bd6ac1e..d722c521b5 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,6 +1,31 @@
-2014-06-14 Ron Schnell <ronnie@driver-aces.com>
+2014-06-15 Glenn Morris <rgm@gnu.org>
+
+ * progmodes/cc-langs.el: Require cl-lib. (Bug#17463)
+ Replace delete-duplicates and mapcan by cl- versions throughout.
+ And cl-macroexpand-all by macroexpand-all.
+ (delete-duplicates, mapcan, cl-macroexpand-all): No need to declare.
+
+2014-06-15 Eli Zaretskii <eliz@gnu.org>
+
+ * subr.el (posn-col-row): Doc fix. (Bug#17768)
+
+2014-06-15 Juri Linkov <juri@jurta.org>
+
+ * bindings.el: Put `ascii-character' property on keypad keys
+ mapped to characters. (Bug#17759)
+
+2014-06-15 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * emacs-lisp/smie.el (smie-next-sexp): Fix up "other-end" info when
+ bumping forward into a closing paren (bug#17761).
+
+ * term/xterm.el (xterm--version-handler): Work around for OSX
+ Terminal.app (bug#17607).
+
+2014-06-14 Ron Schnell <ronnie@driver-aces.com>
+
* play/dunnet.el If a lamp is in the room, you won't be eaten by a grue.
-
+
2014-06-13 Glenn Morris <rgm@gnu.org>
* Makefile.in ($(lisp)/cus-load.el, $(lisp)/finder-inf.el)
diff --git a/lisp/bindings.el b/lisp/bindings.el
index 7093b8e662..59aa3dfb3d 100644
--- a/lisp/bindings.el
+++ b/lisp/bindings.el
@@ -1075,10 +1075,14 @@ if `inhibit-field-text-motion' is non-nil."
(kp-5 ?5) (kp-6 ?6) (kp-7 ?7) (kp-8 ?8) (kp-9 ?9)
(kp-add ?+) (kp-subtract ?-) (kp-multiply ?*) (kp-divide ?/))))
(dolist (pair keys)
- (dolist (mod modifiers)
- (define-key function-key-map
- (vector (append mod (list (nth 0 pair))))
- (vector (append mod (list (nth 1 pair))))))))
+ (let ((keypad (nth 0 pair))
+ (normal (nth 1 pair)))
+ (when (characterp normal)
+ (put keypad 'ascii-character normal))
+ (dolist (mod modifiers)
+ (define-key function-key-map
+ (vector (append mod (list keypad)))
+ (vector (append mod (list normal))))))))
(define-key function-key-map [backspace] [?\C-?])
(define-key function-key-map [delete] [?\C-?])
diff --git a/lisp/emacs-lisp/smie.el b/lisp/emacs-lisp/smie.el
index e65f873b87..3e40d37aac 100644
--- a/lisp/emacs-lisp/smie.el
+++ b/lisp/emacs-lisp/smie.el
@@ -709,7 +709,8 @@ Possible return values:
(condition-case err
(progn (funcall next-sexp 1) nil)
(scan-error
- (let ((epos (nth 2 err)))
+ (let* ((epos1 (nth 2 err))
+ (epos (if (<= (point) epos1) (nth 3 err) epos1)))
(goto-char pos)
(throw 'return
(list t epos
@@ -1832,6 +1833,8 @@ KEYWORDS are additional arguments, which can use the following keywords:
(append smie-blink-matching-triggers
(delete-dups triggers)))))))
+(declare-function edebug-instrument-function "edebug" (func))
+
(defun smie-edebug ()
"Instrument the `smie-rules-function' for Edebug."
(interactive)
diff --git a/lisp/progmodes/cc-langs.el b/lisp/progmodes/cc-langs.el
index 29dff4a639..d2d2de8801 100644
--- a/lisp/progmodes/cc-langs.el
+++ b/lisp/progmodes/cc-langs.el
@@ -130,7 +130,9 @@
;; This file is not always loaded. See note above.
-(cc-external-require 'cl)
+;; Except it is always loaded - see bug#17463.
+;;;(cc-external-require 'cl)
+(require 'cl-lib)
;;; Setup for the `c-lang-defvar' system.
@@ -209,9 +211,9 @@ the evaluated constant value at compile time."
;; Suppress "might not be defined at runtime" warning.
;; This file is only used when compiling other cc files.
;; These are defined in cl as aliases to the cl- versions.
-(declare-function delete-duplicates "cl-seq" (cl-seq &rest cl-keys) t)
-(declare-function mapcan "cl-extra" (cl-func cl-seq &rest cl-rest) t)
-(declare-function cl-macroexpand-all "cl" (form &optional env))
+;(declare-function delete-duplicates "cl-seq" (cl-seq &rest cl-keys) t)
+;(declare-function mapcan "cl-extra" (cl-func cl-seq &rest cl-rest) t)
+;(declare-function cl-macroexpand-all "cl" (form &optional env))
(eval-and-compile
;; Some helper functions used when building the language constants.
@@ -252,14 +254,14 @@ the evaluated constant value at compile time."
(unless xlate
(setq xlate 'identity))
(c-with-syntax-table (c-lang-const c-mode-syntax-table)
- (delete-duplicates
- (mapcan (lambda (opgroup)
+ (cl-delete-duplicates
+ (cl-mapcan (lambda (opgroup)
(when (if (symbolp (car opgroup))
(when (funcall opgroup-filter (car opgroup))
(setq opgroup (cdr opgroup))
t)
t)
- (mapcan (lambda (op)
+ (cl-mapcan (lambda (op)
(when (funcall op-filter op)
(let ((res (funcall xlate op)))
(if (listp res) res (list res)))))
@@ -1147,7 +1149,7 @@ operators."
(c-lang-defconst c-all-op-syntax-tokens
;; List of all tokens in the punctuation and parenthesis syntax
;; classes.
- t (delete-duplicates (append (c-lang-const c-other-op-syntax-tokens)
+ t (cl-delete-duplicates (append (c-lang-const c-other-op-syntax-tokens)
(c-lang-const c-operator-list))
:test 'string-equal))
@@ -1700,7 +1702,7 @@ not the type face."
(c-lang-defconst c-type-start-kwds
;; All keywords that can start a type (i.e. are either a type prefix
;; or a complete type).
- t (delete-duplicates (append (c-lang-const c-primitive-type-kwds)
+ t (cl-delete-duplicates (append (c-lang-const c-primitive-type-kwds)
(c-lang-const c-type-prefix-kwds)
(c-lang-const c-type-modifier-kwds))
:test 'string-equal))
@@ -1943,7 +1945,7 @@ one of `c-type-list-kwds', `c-ref-list-kwds',
;; something is a type or just some sort of macro in front of the
;; declaration. They might be ambiguous with types or type
;; prefixes.
- t (delete-duplicates (append (c-lang-const c-class-decl-kwds)
+ t (cl-delete-duplicates (append (c-lang-const c-class-decl-kwds)
(c-lang-const c-brace-list-decl-kwds)
(c-lang-const c-other-block-decl-kwds)
(c-lang-const c-typedef-decl-kwds)
@@ -2136,7 +2138,7 @@ type identifiers separated by arbitrary tokens."
pike '("array" "function" "int" "mapping" "multiset" "object" "program"))
(c-lang-defconst c-paren-any-kwds
- t (delete-duplicates (append (c-lang-const c-paren-nontype-kwds)
+ t (cl-delete-duplicates (append (c-lang-const c-paren-nontype-kwds)
(c-lang-const c-paren-type-kwds))
:test 'string-equal))
@@ -2162,7 +2164,7 @@ assumed to be set if this isn't nil."
(c-lang-defconst c-<>-sexp-kwds
;; All keywords that can be followed by an angle bracket sexp.
- t (delete-duplicates (append (c-lang-const c-<>-type-kwds)
+ t (cl-delete-duplicates (append (c-lang-const c-<>-type-kwds)
(c-lang-const c-<>-arglist-kwds))
:test 'string-equal))
@@ -2222,7 +2224,7 @@ Keywords here should also be in `c-block-stmt-1-kwds'."
(c-lang-defconst c-block-stmt-kwds
;; Union of `c-block-stmt-1-kwds' and `c-block-stmt-2-kwds'.
- t (delete-duplicates (append (c-lang-const c-block-stmt-1-kwds)
+ t (cl-delete-duplicates (append (c-lang-const c-block-stmt-1-kwds)
(c-lang-const c-block-stmt-2-kwds))
:test 'string-equal))
@@ -2326,7 +2328,7 @@ This construct is \"<keyword> <expression> :\"."
(c-lang-defconst c-expr-kwds
;; Keywords that can occur anywhere in expressions. Built from
;; `c-primary-expr-kwds' and all keyword operators in `c-operators'.
- t (delete-duplicates
+ t (cl-delete-duplicates
(append (c-lang-const c-primary-expr-kwds)
(c-filter-ops (c-lang-const c-operator-list)
t
@@ -2430,7 +2432,7 @@ Note that Java specific rules are currently applied to tell this from
(c-lang-defconst c-keywords
;; All keywords as a list.
- t (delete-duplicates
+ t (cl-delete-duplicates
(c-lang-defconst-eval-immediately
`(append ,@(mapcar (lambda (kwds-lang-const)
`(c-lang-const ,kwds-lang-const))
@@ -3193,10 +3195,10 @@ accomplish that conveniently."
;; `c-lang-const' will expand to the evaluated
;; constant immediately in `cl-macroexpand-all'
;; below.
- (mapcan
+ (cl-mapcan
(lambda (init)
`(current-var ',(car init)
- ,(car init) ,(cl-macroexpand-all
+ ,(car init) ,(macroexpand-all
(elt init 1))))
;; Note: The following `append' copies the
;; first argument. That list is small, so
diff --git a/lisp/subr.el b/lisp/subr.el
index 95d066ee6c..524b7954b7 100644
--- a/lisp/subr.el
+++ b/lisp/subr.el
@@ -1127,7 +1127,7 @@ pixels. POSITION should be a list of the form returned by
"Return the nominal column and row in POSITION, measured in characters.
The column and row values are approximations calculated from the x
and y coordinates in POSITION and the frame's default character width
-and height.
+and default line height, including spacing.
For a scroll-bar event, the result column is 0, and the row
corresponds to the vertical position of the click in the scroll bar.
POSITION should be a list of the form returned by the `event-start'
diff --git a/lisp/term/xterm.el b/lisp/term/xterm.el
index c1e455893c..20d4d41525 100644
--- a/lisp/term/xterm.el
+++ b/lisp/term/xterm.el
@@ -605,6 +605,10 @@ The relevant features are:
;; Gnome terminal 3.6.1 reports 1;3406;0
;; Gnome terminal 2.32.1 reports 1;2802;0
(setq version 200))
+ (when (equal (match-string 1 str) "83")
+ ;; OSX's Terminal.app (version 2.3 (309), which returns 83;40003;0)
+ ;; seems to also lack support for some of these (bug#17607).
+ (setq version 240))
;; If version is 242 or higher, assume the xterm supports
;; reporting the background color (TODO: maybe earlier
;; versions do too...)
diff --git a/src/ChangeLog b/src/ChangeLog
index 5fc04c10f5..1bb96989b6 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,13 @@
+2014-06-15 Eli Zaretskii <eliz@gnu.org>
+
+ * xdisp.c (Fmove_point_visually): Don't use the glyph matrix
+ information if we are in the middle of executing a keyboard macro,
+ since redisplay doesn't update the screen until the macro is
+ finished. (Bug#17777)
+
+ * alloc.c (cleanup_vector): Don't dereference a font driver
+ pointer if it is NULL. (Bug#17771)
+
2014-06-13 Glenn Morris <rgm@gnu.org>
* Makefile.in ($(leimdir)/leim-list.el, $(srcdir)/macuvs.h)
diff --git a/src/alloc.c b/src/alloc.c
index e5116acaef..e2213db853 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -2974,9 +2974,16 @@ cleanup_vector (struct Lisp_Vector *vector)
&& ((vector->header.size & PSEUDOVECTOR_SIZE_MASK)
== FONT_OBJECT_MAX))
{
- /* Attempt to catch subtle bugs like Bug#16140. */
- eassert (valid_font_driver (((struct font *) vector)->driver));
- ((struct font *) vector)->driver->close ((struct font *) vector);
+ struct font_driver *drv = ((struct font *) vector)->driver;
+
+ /* The font driver might sometimes be NULL, e.g. if Emacs was
+ interrupted before it had time to set it up. */
+ if (drv)
+ {
+ /* Attempt to catch subtle bugs like Bug#16140. */
+ eassert (valid_font_driver (drv));
+ drv->close ((struct font *) vector);
+ }
}
}
diff --git a/src/xdisp.c b/src/xdisp.c
index 54a8c8beb8..d7368c7c0c 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -98,7 +98,9 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
This function attempts to redisplay a window by reusing parts of
its existing display. It finds and reuses the part that was not
- changed, and redraws the rest.
+ changed, and redraws the rest. (The "id" part in the function's
+ name stands for "insert/delete", not for "identification" or
+ somesuch.)
. try_window
@@ -113,6 +115,19 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
optimizations were successful, redisplay calls redisplay_windows,
which performs a full redisplay of all windows.
+ Note that there's one more important optimization up Emacs's
+ sleeve, but it is related to actually redrawing the potentially
+ changed portions of the window/frame, not to reproducing the
+ desired matrices of those potentially changed portions. Namely,
+ the function update_frame and its subroutines, which you will find
+ in dispnew.c, compare the desired matrices with the current
+ matrices, and only redraw the portions that changed. So it could
+ happen that the functions in this file for some reason decide that
+ the entire desired matrix needs to be regenerated from scratch, and
+ still only parts of the Emacs display, or even nothing at all, will
+ be actually delivered to the glass, because update_frame has found
+ that the new and the old screen contents are similar or identical.
+
Desired matrices.
Desired matrices are always built per Emacs window. The function
@@ -15746,7 +15761,51 @@ set_vertical_scroll_bar (struct window *w)
selected_window is redisplayed.
We can return without actually redisplaying the window if fonts has been
- changed on window's frame. In that case, redisplay_internal will retry. */
+ changed on window's frame. In that case, redisplay_internal will retry.
+
+ As one of the important parts of redisplaying a window, we need to
+ decide whether the previous window-start position (stored in the
+ window's w->start marker position) is still valid, and if it isn't,
+ recompute it. Some details about that:
+
+ . The previous window-start could be in a continuation line, in
+ which case we need to recompute it when the window width
+ changes. See compute_window_start_on_continuation_line and its
+ call below.
+
+ . The text that changed since last redisplay could include the
+ previous window-start position. In that case, we try to salvage
+ what we can from the current glyph matrix by calling
+ try_scrolling, which see.
+
+ . Some Emacs command could force us to use a specific window-start
+ position by setting the window's force_start flag, or gently
+ propose doing that by setting the window's optional_new_start
+ flag. In these cases, we try using the specified start point if
+ that succeeds (i.e. the window desired matrix is successfully
+ recomputed, and point location is within the window). In case
+ of optional_new_start, we first check if the specified start
+ position is feasible, i.e. if it will allow point to be
+ displayed in the window. If using the specified start point
+ fails, e.g., if new fonts are needed to be loaded, we abort the
+ redisplay cycle and leave it up to the next cycle to figure out
+ things.
+
+ . Note that the window's force_start flag is sometimes set by
+ redisplay itself, when it decides that the previous window start
+ point is fine and should be kept. Search for "goto force_start"
+ below to see the details. Like the values of window-start
+ specified outside of redisply, these internally deduced values
+ are tested for feasibility, and ignored if found to be
+ unfeasible.
+
+ . Note that the function try_window, used to completely redisplay
+ a window, accepts the window's start point as its argument.
+ This is used several times in the redisplay code to control
+ where the window start will be, according to user options such
+ as scroll-conservatively, and also to ensure the screen line
+ showing point will be fully (as opposed to partially) visible on
+ display. */
static void
redisplay_window (Lisp_Object window, bool just_this_one_p)
@@ -15792,6 +15851,8 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
eassert (XMARKER (w->start)->buffer == buffer);
eassert (XMARKER (w->pointm)->buffer == buffer);
+ /* We come here again if we need to run window-text-change-functions
+ below. */
restart:
reconsider_clip_changes (w);
frame_line_height = default_line_pixel_height (w);
@@ -15856,7 +15917,7 @@ redisplay_window (Lisp_Object window, bool just_this_one_p)
&& !current_buffer->prevent_redisplay_optimizations_p
&& !window_outdated (w));
- /* Run the window-bottom-change-functions
+ /* Run the window-text-change-functions
if it is possible that the text on the screen has changed
(either due to modification of the text, or any other reason). */
if (!current_matrix_up_to_date_p
@@ -20685,6 +20746,7 @@ Value is the new character position of point. */)
recorded in the glyphs, at least as long as the goal is on the
screen. */
if (w->window_end_valid
+ && NILP (Vexecuting_kbd_macro)
&& !windows_or_buffers_changed
&& b
&& !b->clip_changed