1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-27 07:37:33 +00:00

Merged in changes from CVS HEAD

Patches applied:

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-33
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-34
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-35
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-36
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-37
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-38
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-39
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-40
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-41
   Make fringe-drawing stuff compile without a window-system

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-42
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-43
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-44
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-45
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-46
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-47
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-48
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-49
   Update from CVS

 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-50
   Update from CVS


git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-59
This commit is contained in:
Karoly Lorentey 2004-01-22 15:37:19 +00:00
commit 2a36494c42
57 changed files with 2037 additions and 583 deletions

View File

@ -14,6 +14,9 @@ so we will look at it and add it to the manual.
* Installation Changes in Emacs 21.4
---
** A Bulgarian translation of the Emacs Tutorial is available.
** You can build Emacs with Gtk+ widgets by specifying `--with-x-toolkit=gtk'
when you run configure. This requires Gtk+ 2.0 or newer. This port
provides a way to display multilingual text in menus (with some caveats).
@ -79,10 +82,32 @@ See the files mac/README and mac/INSTALL for build instructions.
---
** A French translation of the Emacs Tutorial is available.
** Building with -DENABLE_CHECKING does not automatically build with union
types any more. Add -DUSE_LISP_UNION_TYPE if you want union types.
* Changes in Emacs 21.4
** On window systems, lines which are exactly as wide as the window
(not counting the final newline character) are no longer broken into
two lines on the display (with just the newline on the second line).
Instead, the newline now "overflows" into the right fringe, and the
cursor will be displayed in the fringe when positioned on that newline.
The new user option 'overflow-newline-into-fringe' may be set to nil to
revert to the old behaviour of continuing such lines.
** The buffer boundaries (i.e. first and last line in the buffer) may now
be marked with bitmaps in the fringes. In addition, up and down
arrow bitmaps may be shown at the top and bottom of the right fringe
if the window can be scrolled in either direction.
This behavior is activated by setting the buffer-local variable
`indicate-buffer-boundaries' to a non-nil value. If value is t, both
boundaries and scrolling arrows are shown; any other non-nil value
shows only the buffer boundaries. The default value of this variable
is found in `default-indicate-buffer-boundaries'.
** New command `display-local-help' displays any local help at point
in the echo area. It is bound to `C-h .'. It normally displays the
same string that would be displayed on mouse-over using the
@ -1526,6 +1551,21 @@ use for the modifiers. For example, the following two lines swap
Meta and Alt:
(setq x-alt-keysym 'meta)
(setq x-meta-keysym 'alt)
+++
** vc-annotate-mode enhancements
In vc-annotate mode, you can now use the following key bindings for
enhanced functionality to browse the annotations of past revisions, or
to view diffs or log entries directly from vc-annotate-mode:
P: annotates the previous revision
N: annotates the next revision
J: annotates the revision at line
A: annotates the revision previous to line
D: shows the diff of the revision at line with its previous revision
L: shows the log of the revision at line
W: annotates the workfile (most up to date) version
* New modes and packages in 21.4
@ -1750,6 +1790,15 @@ configuration files.
* Lisp Changes in Emacs 21.4
+++
** New function `delete-dups' destructively removes `equal' duplicates
from a list. Of several `equal' occurrences of an element in the list,
the last one is kept.
+++
** `declare' is now a macro. This change was made mostly for
documentation purposes and should have no real effect on Lisp code.
** The new hook `before-save-hook' is invoked by `basic-save-buffer'
before saving buffers. This allows packages to perform various final
tasks, for example; it can be used by the copyright package to make

View File

@ -1,3 +1,9 @@
2004-01-22 Ognyan Kulev <ogi@fmi.uni-sofia.bg> (tiny change)
* quail/cyrillic.el ("bulgarian-phonetic"): Docstring fixed.
Duplicated entry removed.
("bulgarian-bds"): Docstring fixed.
2003-10-06 Dave Love <fx@gnu.org>
* quail/latin-ltx.el: Several additions.

View File

@ -1169,12 +1169,15 @@ Unicode based."
The layout is similar to `cyrillic-translit', but all Bulgarian
characters are typed with a single key.
Use /& for ,A'(B (Cyrillic paragraph) and /# for $,1uV(B."
Use /& for ,A'(B (Cyrillic paragraph) and /# for $,1uV(B.
The letters $,1(G(B, $,1(H(B, $,1(I(B and $,1(N(B are not affected by Caps Lock."
nil t t t t nil nil nil nil nil t)
;; $,1(O(B $,1(2(B $,1(5(B $,1(@(B $,1(B(B $,1(J(B $,1(C(B $,1(8(B $,1(>(B $,1(?(B $,1(H(B $,1(I(B
;; $,1(0(B $,1(A(B $,1(4(B $,1(D(B $,1(3(B $,1(E(B $,1(9(B $,1(:(B $,1(;(B $,1(G(B
;; $,1(N(B $,1(7(B $,1(L(B $,1(F(B $,1(6(B $,1(1(B $,1(=(B $,1(<(B
;; $,1(G(B
;; $,1(O(B $,1(2(B $,1(5(B $,1(@(B $,1(B(B $,1(J(B $,1(C(B $,1(8(B $,1(>(B $,1(?(B $,1(H(B $,1(I(B
;; $,1(0(B $,1(A(B $,1(4(B $,1(D(B $,1(3(B $,1(E(B $,1(9(B $,1(:(B $,1(;(B $,1(N(B
;; $,1(7(B $,1(L(B $,1(F(B $,1(6(B $,1(1(B $,1(=(B $,1(<(B
(quail-define-rules
("/&" ?,A'(B)
@ -1238,7 +1241,6 @@ Use /& for ,A'(B (Cyrillic paragraph) and /# for $,1uV(B."
("y" ?$,1(j(B)
("x" ?$,1(l(B)
("\\" ?$,1(n(B)
("|" ?$,1(N(B)
("q" ?$,1(o(B))
;; Based on an implementation by Ognyan Kulev <ogi@fmi.uni-sofia.bg>.
@ -1248,13 +1250,18 @@ Use /& for ,A'(B (Cyrillic paragraph) and /# for $,1uV(B."
"bulgarian-bds" "Bulgarian" "$,1(1(4(A(B" nil
"Bulgarian standard keyboard layout (BDS)
This keyboard layout is standard for Bulgarian typewriters."
This keyboard layout is standard for Bulgarian typewriters.
The letters $,1(F(B, $,1(<(B, $,1(G(B, $,1(@(B, $,1(;(B, $,1(1(B and $,1(K(B are not affected by Caps Lock.
In addition to original bulgarian typewriter layout, keys \ and |
are transformed into ' and $,1(K(B respectively."
nil t t t t nil nil nil nil nil t)
;; 1! 2? 3+ 4" 5% 6= 7: 8/ 9_ 0$,1uV(B -I .V
;; ,$,1(k(B $,1(C(B $,1(5(B $,1(8(B $,1(H(B $,1(I(B $,1(:(B $,1(A(B $,1(4(B $,1(7(B $,1(F(B ;,A'(B
;; $,1(l(B $,1(O(B $,1(0(B $,1(>(B $,1(6(B $,1(3(B $,1(B(B $,1(=(B $,1(2(B $,1(<(B $,1(G(B ()
;; $,1(N(B $,1(9(B $,1(J(B $,1(M(B $,1(D(B $,1(E(B $,1(?(B $,1(@(B $,1(;(B $,1(1(B
;; () 1! 2? 3+ 4" 5% 6= 7: 8/ 9_ 0$,1uV(B -I .V
;; ,$,1(k(B $,1(C(B $,1(5(B $,1(8(B $,1(H(B $,1(I(B $,1(:(B $,1(A(B $,1(4(B $,1(7(B $,1(F(B ;,A'(B
;; $,1(l(B $,1(O(B $,1(0(B $,1(>(B $,1(6(B $,1(3(B $,1(B(B $,1(=(B $,1(2(B $,1(<(B $,1(G(B '$,1(K(B
;; $,1(N(B $,1(9(B $,1(J(B $,1(M(B $,1(D(B $,1(E(B $,1(?(B $,1(@(B $,1(;(B $,1(1(B
(quail-define-rules

View File

@ -1,5 +1,5 @@
/* Client process that communicates with GNU Emacs acting as server.
Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2003
Copyright (C) 1986, 1987, 1994, 1999, 2000, 2001, 2003, 2004
Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -438,9 +438,10 @@ main (argc, argv)
{
int sock_status = 0;
int default_sock = !socket_name;
int saved_errno = 0;
if (! socket_name)
if (default_sock)
{
socket_name = alloca (system_name_length + 100);
sprintf (socket_name, "/tmp/emacs%d-%s/server",
@ -459,7 +460,7 @@ main (argc, argv)
/* See if the socket exists, and if it's owned by us. */
sock_status = socket_status (server.sun_path);
saved_errno = errno;
if (sock_status)
if (sock_status && default_sock)
{
/* Failing that, see if LOGNAME or USER exist and differ from
our euid. If so, look for a socket based on the UID
@ -476,8 +477,18 @@ main (argc, argv)
if (pw && (pw->pw_uid != geteuid ()))
{
/* We're running under su, apparently. */
sprintf (server.sun_path, "/tmp/emacs%d-%s/server",
sprintf (socket_name, "/tmp/emacs%d-%s/server",
(int) pw->pw_uid, system_name);
if (strlen (socket_name) < sizeof (server.sun_path))
strcpy (server.sun_path, socket_name);
else
{
fprintf (stderr, "%s: socket-name %s too long",
argv[0], socket_name);
exit (1);
}
sock_status = socket_status (server.sun_path);
saved_errno = errno;
}

View File

@ -1,22 +1,161 @@
2004-01-22 Kenichi Handa <handa@m17n.org>
* language/cyrillic.el (ccl-encode-windows-1251-font): Rearrange
code point (register r1) only for charset mule-unicode-0100-24ff.
2004-01-21 Markus Rost <rost@mathematik.uni-bielefeld.de>
* mail/rmail.el (rmail-convert-to-babyl-format): Avoid deleting
trailing white space and ensure a final newline.
* mail/rmail-spam-filter.el (rmail-use-spam-filter): Add autoload
cookie.
2004-01-21 Benjamin Rutt <brutt@bloomington.in.us>
* vc.el (vc-annotate-mode): Inherit from fundamental-mode and
activate view-mode explicitly.
2004-01-21 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* term/x-win.el: Call menu-bar-enable-clipboard and make Paste
use clipboard first.
2004-01-20 Stefan Monnier <monnier@iro.umontreal.ca>
* vc-mcvs.el (vc-mcvs-mode-line-string): Remove. Does not work.
(vc-mcvs-workfile-version): Manually macro expand vc-mcvs-cvs.
(vc-mcvs-cvs): Remove.
(vc-mcvs-command): Remove use of assert.
* outline.el (outline-insert-heading): Tighten up match.
(outline-demote, outline-move-subtree-down): Don't assume anything
about outline-regexp.
* textmodes/texinfo.el (texinfo-mode): Remove ^ from outline-regexp.
(texinfo-show-structure): Explicitly add ^, and simplify.
2004-01-20 Glenn Morris <gmorris@ast.cam.ac.uk>
* calendar/appt.el (appt-check): Restore usage of
appt-issue-message deleted in previous change.
(top-level): Activate package when loaded (needed for backwards
compatibility).
2004-01-20 Jesper Harder <harder@ifa.au.dk>
* mail/smtpmail.el (smtpmail-via-smtp): No need to add two bytes
following previous change to smtpmail-send-data.
2004-01-20 Benjamin Rutt <brutt@bloomington.in.us>
* vc.el (vc-default-previous-version): Doc enhancement.
(vc-default-next-version): New function.
(vc-print-log): New arg FOCUS-REV.
(vc-annotate-mode): Derive from view-mode.
(vc-annotate): New args REVISION, DISPLAY-MODE.
(vc-annotate-workfile-version, vc-annotate-extract-revision-at-line)
(vc-annotate-revision-at-line, vc-annotate-revision-previous-to-line)
(vc-annotate-show-log-revision-at-line, vc-annotate-warp-version)
(vc-annotate-show-diff-revision-at-line, vc-current-line)
(vc-annotate-prev-version, vc-annotate-next-version): New functions.
* vc-cvs.el (vc-cvs-annotate-extract-revision-at-line): New function.
2004-01-19 Karl Berry <karl@gnu.org>
* textmodes/texinfo.el: Use "Texinfo" consistently, no "TeXinfo"
or "TexInfo".
2004-01-19 Luc Teirlinck <teirllm@auburn.edu>
* subr.el (delete-dups): New function.
2004-01-19 Karl Berry <karl@gnu.org>
* textmodes/texinfo.el (texinfo-mode): Define outline-regexp to start
with ^, since that's what texinfo-show-structure
documentation says (plus it works much better in texinfo.txi).
2004-01-18 Jesper Harder <harder@ifa.au.dk>
* mail/smtpmail.el (smtpmail-send-data): Don't append spurious newline.
2004-01-18 David Ponce <david@dponce.com> (tiny change)
* progmodes/which-func.el (which-function-mode): Don't cancel
which-func-update-timer if not set.
2004-01-17 Thien-Thi Nguyen <ttn@gnu.org>
* calendar/diary-lib.el (diary-entry-time): Fix typo/bug:
Remove spurious left square bracket in XX:XXam regexp.
2004-01-16 Luc Teirlinck <teirllm@auburn.edu>
* progmodes/cc-defs.el: Do not require cl at run time.
2004-01-16 Richard M. Stallman <rms@gnu.org>
* emacs-lisp/cl.el (cl-cannot-unload): New function.
(cl-unload-hook): Defvar this to run cl-cannot-unload.
* mail/rmail.el (rmail-get-new-mail): New local rsf-number-of-spam.
Call rmail-spam-filter. Delete and expunge spam.
Print number of spam messages deleted.
Save and restore the deletion status of old messages when reading
new mail with spam filter, so that expunging spam does not expunge
msgs deleted by the user.
(rmail-only-expunge): Add an optional argument dont-show to
prevent showing message after expunge.
2004-01-15 Luc Teirlinck <teirllm@auburn.edu>
* emacs-lisp/cl.el (declare): Add `fmakunbound' for `declare'.
* subr.el (declare): New macro.
2004-01-15 Thien-Thi Nguyen <ttn@gnu.org>
* progmodes/scheme.el (scheme-font-lock-keywords-2): Add "force".
2004-01-14 Stefan Monnier <monnier@iro.umontreal.ca>
* mwheel.el (mouse-wheel-down-event, mouse-wheel-up-event):
Test window-system rather than system-type (for X11/Mac).
2004-01-12 Luc Teirlinck <teirllm@auburn.edu>
* emacs-lisp/bytecomp.el (compile-defun): Doc fix.
2004-01-12 Richard M. Stallman <rms@gnu.org>
* mail/rmail.el (rmail-convert-to-babyl-format):
Use mail-unquote-printable-region.
(rmail-hex-string-to-integer, rmail-decode-quoted-printable):
(rmail-hex-char-to-integer): Functions deleted.
* mail/mail-utils.el (mail-unquote-printable-hexdigit): Upcase CHAR.
(mail-unquote-printable-region): New arg NOERROR.
For invalid encoding, either signal an error to just return nil.
2004-01-11 Glenn Morris <gmorris@ast.cam.ac.uk>
* calendar/appt.el: Update copyright and commentary.
(appt-issue-message): Delete (see appt-activate).
(appt-issue-message): Make obsolete.
(appt-visible, appt-msg-window): Make obsolete, in favour of
appt-display-format.
(appt-display-mode-line, appt-display-duration)
(appt-display-diary, appt-time-msg-list, appt-mode-string)
(appt-prev-comp-time, appt-display-count, appt-timer)
(appt-convert-time): Doc change.
(appt-disp-window-function, appt-delete-window-function): Use
defcustom rather than defvar.
(appt-disp-window-function, appt-delete-window-function):
Use defcustom rather than defvar.
(appt-display-format): New variable.
(appt-display-message): New function with display code from
appt-check.
(appt-check): Add optional FORCE argument. Doc change. Add
appt-make-list to diary-hook if displaying diary. Remove
checking of view-diary-entries-initially. Message
display section removed to new function appt-display-message.
(appt-display-message): New function with display code from appt-check.
(appt-check): Add optional FORCE argument. Doc change.
Add appt-make-list to diary-hook if displaying diary.
Remove checking of view-diary-entries-initially.
Message display section removed to new function appt-display-message.
(appt-display-window): Doc change. Remove unused internal var
this-buffer. Do not beep, since appt-display-message does that.
(appt-make-list): Doc change. Use caar.
@ -27,12 +166,10 @@
functionality.
* calendar/cal-x.el: (calendar-one-frame-setup)
(calendar-only-one-frame-setup, calendar-two-frame-setup): Doc
change.
(calendar-only-one-frame-setup, calendar-two-frame-setup): Doc change.
* calendar/calendar.el: Update copyright.
(view-diary-entries-initially, european-calendar-style): Doc
change.
(view-diary-entries-initially, european-calendar-style): Doc change.
(calendar-setup): Make defcustom rather than defvar.
(mark-visible-calendar-date): Initialize temp-face and faceinfo
in let binding so local to function.
@ -71,8 +208,7 @@
2004-01-07 Nick Roberts <nick@nick.uklinux.net>
* progmodes/gud.el (gdb-first-prompt): Renamed from
gdb-first-pre-prompt
* progmodes/gud.el (gdb-first-prompt): Rename from gdb-first-pre-prompt
* gdb-ui.el (gdba): Avoid duplication, use gdb-ann3.
(gdb-ann3): Use GDB command "set width 0" to prevent word wrapping
@ -140,7 +276,7 @@
* textmodes/tex-mode.el (latex-find-indent): Avoid error at end of buf.
* emacs-lisp/lisp-mnt.el (lm-section-end): require outline.
* emacs-lisp/lisp-mnt.el (lm-section-end): Require outline.
* progmodes/grep.el (grep-mode-map):
Don't remap next-line, previous-line.
@ -219,9 +355,9 @@
gud-n.*, gud-ni.*, gud-s.*, and gud-si.*, respectively, to avoid
file-name clashes on 8+3 filesystems.
* emacs-lisp/tcover-unsafep.el, emacs-lisp/tcover-ses.el: Renamed
from testcover-unsafep.el and testcover-ses.el to avoid file-name
clashes on 8+3 DOS filesystems.
* emacs-lisp/tcover-unsafep.el, emacs-lisp/tcover-ses.el:
Renamed from testcover-unsafep.el and testcover-ses.el to avoid
file-name clashes on 8+3 DOS filesystems.
2003-12-29 Richard M. Stallman <rms@gnu.org>
@ -334,7 +470,7 @@
* xml.el (xml-get-attribute-or-nil): New function, like
xml-get-attribute, but returns nil if the attribute was not found.
(xml-get-attribute): Converted to defsubst, uses
(xml-get-attribute): Convert to defsubst, uses
xml-get-attribute-or-nil.
2003-12-29 Eli Zaretskii <eliz@elta.co.il>
@ -370,8 +506,8 @@
2003-12-29 Kenichi Handa <handa@m17n.org>
* international/mule-cmds.el (reset-language-environment): Call
set-overriding-fontspec-internal with nil.
* international/mule-cmds.el (reset-language-environment):
Call set-overriding-fontspec-internal with nil.
(set-language-environment): Call set-overriding-fontspec-internal
if the language environment specify `overriding-fontspec'.
(language-info-alist): Doc added.
@ -461,12 +597,12 @@
2003-12-24 Kenichi Handa <handa@m17n.org>
* international/mule-cmds.el (set-default-coding-systems): Call
ucs-set-table-for-input for all buffers that don't have local
* international/mule-cmds.el (set-default-coding-systems):
Call ucs-set-table-for-input for all buffers that don't have local
value of buffer-file-coding-system.
* international/ucs-tables.el (ucs-set-table-for-input): If
translation-table-for-encode is a symbol, get its
* international/ucs-tables.el (ucs-set-table-for-input):
If translation-table-for-encode is a symbol, get its
translation-table property.
2003-12-23 Luc Teirlinck <teirllm@auburn.edu>
@ -475,11 +611,11 @@
to `completing-read' on a recently fixed bug.
* fringe.el (fringe-query-style): Suggest `?' in minibuffer prompt,
instead of SPACE, to get the list of possible fringe modes. SPACE
only works if both `partial-completion-mode' and
instead of SPACE, to get the list of possible fringe modes.
SPACE only works if both `partial-completion-mode' and
`completion-auto-help' are nil.
* complete.el (PC-is-complete-p): delete.
* complete.el (PC-is-complete-p): Delete.
(PC-do-completion): Replace all calls to `PC-is-complete-p' with
calls to `test-completion'.
@ -490,17 +626,15 @@
* gdb-ui.el (gdba, gdb-assembler-mode): Call the mode "Machine" as
a mode called "Assembler" already exists.
(gdb-use-colon-colon-notation, gdb-show-changed-values): New
options.
(gud-watch): Use format option. Remove font properties from
string.
(gdb-var-create-handler, gdb-var-list-children-handler): Don't
bother about properties as there are none.
(gdb-use-colon-colon-notation, gdb-show-changed-values): New options.
(gud-watch): Use format option. Remove font properties from string.
(gdb-var-create-handler, gdb-var-list-children-handler):
Don't bother about properties as there are none.
(gdb-var-create-handler, gdb-var-list-children-handler)
(gdb-var-update-handler): Call gdb-var-evaluate-expression-handler
with two arguments.
(gdb-var-evaluate-expression-handler, gdb-post-prompt): Let
speedbar show value changes with a different font.
(gdb-var-evaluate-expression-handler, gdb-post-prompt):
Let speedbar show value changes with a different font.
(gdb-edit-value): New defun.
(gdb-clear-partial-output, gdb-clear-inferior-io)
(def-gdb-auto-update-handler): Use erase-buffer.
@ -523,11 +657,10 @@
(widget-type-default-get, widget-type-match): New functions.
(lazy): New widget.
(menu-choice, checklist, radio-button-choice, editable-list)
(group, documentation-string): Removed redundant (per 2003-10-25
(group, documentation-string): Remove redundant (per 2003-10-25
change) calls to `widget-children-value-delete'.
(widget-choice-value-get, widget-choice-value-inline): Removed
functions.
(menu-choice): Updated widget.
(widget-choice-value-get, widget-choice-value-inline): Remove.
(menu-choice): Update widget.
2003-12-03 Kenichi Handa <handa@m17n.org>
@ -581,19 +714,18 @@
parameter for backward compatibility reasons.
(tramp-perl-file-attributes): Add a new parameter to Perl script
in order to handle uid/gid as strings, if desired.
(tramp-handle-file-truename, tramp-handle-file-symlink-p): Apply
`file-attributes' instead of `tramp-handle-file-attributes' in
(tramp-handle-file-truename, tramp-handle-file-symlink-p):
Apply `file-attributes' instead of `tramp-handle-file-attributes' in
order to make the function more general.
(tramp-handle-file-attributes): Replace proprietary optional
parameter NONNUMERIC by the recently (Emacs 21.4) introduced
ID-FORMAT.
parameter NONNUMERIC by the recently (Emacs 21.4) introduced ID-FORMAT.
(tramp-handle-file-attributes-with-perl): Handle parameter
NONNUMERIC if set. This wasn't done in the past.
(tramp-post-connection): Apply second parameter "$2" if
`tramp-remote-perl' is called.
* net/tramp-smb.el (tramp-smb-handle-delete-file): Correct
cut'n'waste error (`filename' instead of `directory').
* net/tramp-smb.el (tramp-smb-handle-delete-file):
Correct cut'n'waste error (`filename' instead of `directory').
(tramp-smb-handle-directory-files-and-attributes)
(tramp-smb-handle-file-attributes): Add recently (Emacs 21.4)
introduced parameter ID-FORMAT.
@ -616,8 +748,8 @@
2003-11-30 Jonathan Yavner <jyavner@member.fsf.org>
* subr.el (noreturn, 1value): New macros for test coverage. See
`testcover.el'.
* subr.el (noreturn, 1value): New macros for test coverage.
See `testcover.el'.
* emacs-lisp/edebug.el: Add def-edebug-spec for `noreturn' and `1value'.
@ -637,10 +769,20 @@
* cus-start.el (all): Add use-file-dialog.
2003-11-27 Stefan Monnier <monnier@iro.umontreal.ca>
* textmodes/tex-mode.el (latex-mode): `tex-trailer' is not a regexp.
2003-11-27 Kim F. Storm <storm@cua.dk>
* subr.el (posn-object-x-y): New defun.
2003-11-26 Stefan Monnier <monnier@iro.umontreal.ca>
* progmodes/make-mode.el (makefile-font-lock-syntactic-keywords):
Don't use `space' for \\\n.
Be more selective as to which # are comment-starters.
2003-11-26 Luc Teirlinck <teirllm@auburn.edu>
* subr.el (number-sequence): Improve handling of floating point
@ -747,14 +889,19 @@
(breakpoint-enabled-icon, breakpoint-disabled-icon): Set :ascent
to 100 for icons to avoid increasing line height when shown.
2003-11-17 Jesper Harder <harder@ifa.au.dk> (tiny change)
* newcomment.el (comment-normalize-vars): Initialize properly if
comment-start was nil.
2003-11-19 Andreas Schwab <schwab@suse.de>
* simple.el (set-variable): Fix indentation.
2003-11-17 Kenichi Handa <handa@m17n.org>
* international/latin1-disp.el (latin1-display-ucs-per-lynx): Fix
docstring.
* international/latin1-disp.el (latin1-display-ucs-per-lynx):
Fix docstring.
2003-11-17 Jesper Harder <harder@ifa.au.dk> (tiny change)
@ -771,13 +918,13 @@
2003-11-16 Martin Stjernholm <bug-cc-mode@gnu.org>
* cc-engine.el (c-guess-continued-construct,
c-guess-basic-syntax): Check a little more carefully if it's a
* cc-engine.el (c-guess-continued-construct)
(c-guess-basic-syntax): Check a little more carefully if it's a
function declaration when an unknown construct followed by a block
is found inside a statement context. This avoids macros followed
by blocks to be taken as function declarations.
(c-guess-continued-construct): Changed the analysis of a statement
(c-guess-continued-construct): Change the analysis of a statement
continuation with a brace open to `substatement-block', for
consistency with recognized statements.
@ -785,9 +932,9 @@
start is in a position so that `c-beginning-of-statement-1' jumped
to the beginning of the same statement.
* cc-fonts.el, cc-engine.el (c-forward-<>-arglist-recur): Don't
accept binary operators in the arglist if we're in a function call
context, i.e. if `c-restricted-<>-arglists' is set. That avoids
* cc-fonts.el, cc-engine.el (c-forward-<>-arglist-recur):
Don't accept binary operators in the arglist if we're in a function
call context, i.e. if `c-restricted-<>-arglists' is set. That avoids
template recognition in cases like "if (a < b || c > d)".
(c-restricted-<>-arglists): New more appropriate name for
@ -805,7 +952,7 @@
instead of duplicating parts of it. This fixes bogus label
recognition.
* cc-align.el (c-gnu-impose-minimum): Reverted to the old method
* cc-align.el (c-gnu-impose-minimum): Revert to the old method
of checking the context in which to apply the minimum indentation,
so that it isn't enforced in e.g. namespace blocks.
@ -813,19 +960,18 @@
`c-gnu-impose-minimum'. It's defined close to `c-offsets-alist'
to somewhat reduce the risk of becoming stale.
* cc-cmds.el, cc-engine.el (c-shift-line-indentation): Moved from
* cc-cmds.el, cc-engine.el (c-shift-line-indentation): Move from
cc-cmds to cc-engine to allow use from cc-align.
* cc-engine.el (c-beginning-of-inheritance-list): Cope with fully
qualified identifiers containing "::".
* cc-defs.el (c-make-keywords-re): Added kludge for bug in
* cc-defs.el (c-make-keywords-re): Add kludge for bug in
`regexp-opt' in Emacs 20 and XEmacs when strings contain newlines.
* cc-vars.el (c-emacs-features): Use a space in front of the name
of the temporary buffer. That also avoids dumping problems in
XEmacs due to undo info being left around after the buffer is
killed.
XEmacs due to undo info being left around after the buffer is killed.
* cc-engine.el (c-in-knr-argdecl): Look closer at the function
arglist to see if it's a K&R style declaration.
@ -845,22 +991,21 @@
2003-11-14 Thien-Thi Nguyen <ttn@gnu.org>
* diff-mode.el (diff-hunk-prev, diff-hunk-next): Support
operation while narrowed, with `diff-restrict-view'.
* diff-mode.el (diff-hunk-prev, diff-hunk-next):
Support operation while narrowed, with `diff-restrict-view'.
2003-11-14 Thien-Thi Nguyen <ttn@gnu.org>
* emacs-lisp/easy-mmode.el (easy-mmode-define-navigation): Take
additional optional arg NARROWFUN. For the generated functions: Add
local var `was-narrowed-p'. Also, if NARROWFUN is specified, include
frags that arrange to check for and save narrowing state before the
move and then conditionally call NARROWFUN after the move.
* emacs-lisp/easy-mmode.el (easy-mmode-define-navigation):
Take additional optional arg NARROWFUN. For the generated functions:
Add local var `was-narrowed-p'. Also, if NARROWFUN is specified,
include frags that arrange to check for and save narrowing state before
the move and then conditionally call NARROWFUN after the move.
2003-11-14 John Wiegley <johnw@newartisans.com>
* eshell/esh-var.el (eshell-parse-variable-ref): Added a backslash
that was optional, but obviously missing based on surrounding
code.
* eshell/esh-var.el (eshell-parse-variable-ref): Add a backslash
that was optional, but obviously missing based on surrounding code.
* eshell/esh-cmd.el (eshell-lisp-command): Do not late-convert
string arguments to numbers unless the whole argument was seen as
@ -868,16 +1013,16 @@
2003-11-14 Kenichi Handa <handa@m17n.org>
* international/mule.el (ctext-non-standard-encodings-alist): Fix
coding systems.
* international/mule.el (ctext-non-standard-encodings-alist):
Fix coding systems.
2003-11-10 Kenichi Handa <handa@m17n.org>
* language/kannada.el ("Kannada"): Add sample-text.
* language/knd-util.el (kannada-compose-region)
(kannada-compose-string, kannada-post-read-conversion): Add
autoload cookie.
(kannada-compose-string, kannada-post-read-conversion):
Add autoload cookie.
* international/quail.el (quail-completion): Change the message
"corresponding translations" to "corresponding characters".
@ -906,8 +1051,8 @@
2003-11-07 Andreas Schwab <schwab@suse.de>
* progmodes/autoconf.el (autoconf-font-lock-keywords): Also
highlight AH_*.
* progmodes/autoconf.el (autoconf-font-lock-keywords):
Also highlight AH_*.
* xml.el (xml-parse-dtd): Fix misplaced paren.
@ -926,10 +1071,14 @@
* files.el (risky-local-variable-p): Make second argument optional.
2003-11-03 Stefan Monnier <monnier@iro.umontreal.ca>
* subr.el (add-hook): Fix last change.
2003-11-03 Eli Zaretskii <eliz@elta.co.il>
* mail/rmail.el (rmail-convert-to-babyl-format): If
base64-decode-region signals an error, catch it and silently
* mail/rmail.el (rmail-convert-to-babyl-format):
If base64-decode-region signals an error, catch it and silently
ignore it.
2003-11-01 Mark A. Hershberger <mah@everybody.org>
@ -938,8 +1087,7 @@
topmost element has closed.
(xml-ns-parse-ns-attrs, xml-ns-expand-el)
(xml-ns-expand-attr): New functions to do namespace handling.
(xml-intern-attrlist): Back-compatible handling of attribute
names.
(xml-intern-attrlist): Back-compatible handling of attribute names.
(xml-parse-tag): Move namespace handling to seperate functions.
Now produces elements in the form ((:ns . "element") (attr-list)
children) instead of ('ns:element (attr-list) children).
@ -979,10 +1127,8 @@
(isearch-lazy-highlight-new-loop): Pay attention to the window's
end (thru isearch-lazy-highlight-window-end), not only its start.
* simple.el (overriding-map-is-bound, saved-overriding-map): New
variables.
(ensure-overriding-map-is-bound, restore-overriding-map): New
functions.
* simple.el (overriding-map-is-bound, saved-overriding-map): New vars.
(ensure-overriding-map-is-bound, restore-overriding-map): New funs.
(universal-argument, universal-argument-more, negative-argument)
(digit-argument, universal-argument-other-key): Minor changes.

View File

@ -341,7 +341,7 @@ displayed in a window:
;; get the first time off of the list
;; and calculate the number of minutes until the appointment.
(if appt-time-msg-list
(if (and appt-issue-message appt-time-msg-list)
(let ((appt-comp-time (car (car (car appt-time-msg-list)))))
(setq min-to-app (- appt-comp-time cur-comp-time))
@ -659,6 +659,10 @@ ARG is positive, otherwise off."
(appt-check t))))
;; This is needed for backwards compatibility. Feh.
(appt-activate 1)
(provide 'appt)
;;; arch-tag: bf5791c4-8921-499e-a26f-772b1788d347

View File

@ -1118,7 +1118,7 @@ be used instead of a colon (:) to separate the hour and minute parts."
(if (equal ?a (downcase (aref s (match-beginning 2))))
0 1200)))
((string-match ; Hour and minute XX:XXam or XX:XXpm
"\\`[ \t\n\\^M]*\\([0-9]?[0-9]\\)[:.][\\([0-9][0-9]\\)\\([ap]\\)m\\>" s)
"\\`[ \t\n\\^M]*\\([0-9]?[0-9]\\)[:.]\\([0-9][0-9]\\)\\([ap]\\)m\\>" s)
(+ (* 100 (% (string-to-int
(substring s (match-beginning 1) (match-end 1)))
12))

View File

@ -10,7 +10,7 @@
;;; This version incorporates changes up to version 2.10 of the
;;; Zawinski-Furuseth compiler.
(defconst byte-compile-version "$Revision: 2.139 $")
(defconst byte-compile-version "$Revision: 2.141 $")
;; This file is part of GNU Emacs.
@ -75,7 +75,7 @@
;; User customization variables:
;;
;; byte-compile-verbose Whether to report the function currently being
;; compiled in the minibuffer;
;; compiled in the echo area;
;; byte-optimize Whether to do optimizations; this may be
;; t, nil, 'source, or 'byte;
;; byte-optimize-log Whether to report (in excruciating detail)
@ -130,7 +130,7 @@
;; (baz 0))
;;
;; o It is possible to open-code a function in the same file it is defined
;; in without having to load that file before compiling it. the
;; in without having to load that file before compiling it. The
;; byte-compiler has been modified to remember function definitions in
;; the compilation environment in the same way that it remembers macro
;; definitions.
@ -1658,7 +1658,7 @@ The value is non-nil if there were no errors, nil if errors."
;;;###autoload
(defun compile-defun (&optional arg)
"Compile and evaluate the current top-level form.
Print the result in the minibuffer.
Print the result in the echo area.
With argument, insert value in current buffer after the form."
(interactive "P")
(save-excursion

View File

@ -108,6 +108,10 @@ printer proceeds to the next function on the list.
This variable is not used at present, but it is defined in hopes that
a future Emacs interpreter will be able to use it.")
(defvar cl-unload-hook '(cl-cannot-unload)
"Prevent unloading the feature `cl', since it does not work.")
(defun cl-cannot-unload ()
(error "Cannot unload the feature `cl'"))
;;; Predicates.
@ -579,9 +583,10 @@ Keywords supported: :test :test-not :key"
"Non-nil means don't make CL functions autoload.")
;;; Autoload the other portions of the package.
;; We want to replace the basic versions of dolist, dotimes below.
;; We want to replace the basic versions of dolist, dotimes, declare below.
(fmakunbound 'dolist)
(fmakunbound 'dotimes)
(fmakunbound 'declare)
(mapcar (function
(lambda (set)
(let ((file (if cl-fake-autoloads "<none>" (car set))))

View File

@ -2429,7 +2429,7 @@ This makes the buffer visit that file, and marks it as not modified.
If you specify just a directory name as FILENAME, that means to use
the default file name but in that directory. You can also yank
the default file name into the minibuffer to edit it, using M-n.
the default file name into the minibuffer to edit it, using \\<minibuffer-local-map>\\[next-history-element].
If the buffer is not already visiting a file, the default file name
for the output file is the buffer name.

View File

@ -454,7 +454,7 @@ If the charset is `composition', return the actual one."
(mm-mule-charset-to-mime-charset charset)))
(defun mm-delete-duplicates (list)
"Simple substitute for CL `delete-duplicates', testing with `equal'."
"Simple substitute for CL `delete-duplicates', testing with `equal'."
(let (result head)
(while list
(setq head (car list))

View File

@ -476,11 +476,11 @@ Support for Russian using koi8-r and the russian-computer input method.")
(push elt ctext-non-standard-encodings-alist)))
(define-ccl-program ccl-encode-windows-1251-font
'(0
((r1 <<= 7)
(r1 += r2)
(translate-character encode-windows-1251 r0 r1)
)))
`(0
((if (r0 == ,(charset-id 'mule-unicode-0100-24ff))
((r1 <<= 7)
(r1 += r2)))
(translate-character encode-windows-1251 r0 r1))))
(add-to-list 'font-ccl-encoder-alist
'("microsoft-cp1251" . ccl-encode-windows-1251-font))

View File

@ -137,8 +137,8 @@ is nil, raise an error."
;; Try to avoid losing badly when hooks installed in critical
;; places go away. (Some packages install things on
;; `kill-buffer-hook', `activate-menubar-hook' and the like.)
;; First off, provide a clean way for package `foo' to arrange
;; this by defining `foo-unload-hook'.
;; First off, provide a clean way for package FOO to arrange
;; this by adding hooks on the variable `FOO-unload-hook'.
(if unload-hook
(run-hooks unload-hook)
;; Otherwise, do our best. Look through the obarray for symbols

View File

@ -79,6 +79,7 @@ we add the wrapper characters =?ISO-8859-1?Q?....?=."
(concat result (substring string i))))))
(defun mail-unquote-printable-hexdigit (char)
(setq char (upcase char))
(if (>= char ?A)
(+ (- char ?A) 10)
(- char ?0)))
@ -107,31 +108,41 @@ we expect to find and remove the wrapper characters =?ISO-8859-1?Q?....?=."
(apply 'concat (nreverse (cons (substring string i) strings))))))
;;;###autoload
(defun mail-unquote-printable-region (beg end &optional wrapper)
(defun mail-unquote-printable-region (beg end &optional wrapper noerror)
"Undo the \"quoted printable\" encoding in buffer from BEG to END.
If the optional argument WRAPPER is non-nil,
we expect to find and remove the wrapper characters =?ISO-8859-1?Q?....?=."
we expect to find and remove the wrapper characters =?ISO-8859-1?Q?....?=.
If NOERROR is non-nil, return t if successful."
(interactive "r\nP")
(save-match-data
(save-excursion
(save-restriction
(narrow-to-region beg end)
(goto-char (point-min))
(when (and wrapper
(looking-at "\\`=\\?ISO-8859-1\\?Q\\?\\([^?]*\\)\\?"))
(delete-region (match-end 1) end)
(delete-region (point) (match-beginning 1)))
(while (re-search-forward "=\\(..\\|\n\\)" nil t)
(goto-char (match-end 0))
(replace-match
(if (= (char-after (match-beginning 1)) ?\n)
""
(make-string 1
(+ (* 16 (mail-unquote-printable-hexdigit
(char-after (match-beginning 1))))
(mail-unquote-printable-hexdigit
(char-after (1+ (match-beginning 1)))))))
t t))))))
(let (failed)
(save-match-data
(save-excursion
(save-restriction
(narrow-to-region beg end)
(goto-char (point-min))
(when (and wrapper
(looking-at "\\`=\\?ISO-8859-1\\?Q\\?\\([^?]*\\)\\?"))
(delete-region (match-end 1) end)
(delete-region (point) (match-beginning 1)))
(while (re-search-forward "=\\(\\([0-9A-F][0-9A-F]\\)\\|[=\n]\\|..\\)" nil t)
(goto-char (match-end 0))
(cond ((= (char-after (match-beginning 1)) ?\n)
(replace-match ""))
((= (char-after (match-beginning 1)) ?=)
(replace-match "="))
((match-beginning 2)
(replace-match
(make-string 1
(+ (* 16 (mail-unquote-printable-hexdigit
(char-after (match-beginning 2))))
(mail-unquote-printable-hexdigit
(char-after (1+ (match-beginning 2))))))
t t))
(noerror
(setq failed t))
(t
(error "Malformed MIME quoted-printable message"))))
(not failed))))))
(eval-when-compile (require 'rfc822))

View File

@ -84,6 +84,7 @@
"Spam filter for RMAIL, the mail reader for Emacs."
:group 'rmail)
;;;###autoload
(defcustom rmail-use-spam-filter nil
"*Non-nil to activate the rmail spam filter.
Specify `rmail-spam-definitions-alist' to define what you consider spam

View File

@ -1364,6 +1364,7 @@ It returns t if it got any new messages."
(while all-files
(let ((opoint (point))
(new-messages 0)
(rsf-number-of-spam 0)
(delete-files ())
;; If buffer has not changed yet, and has not been saved yet,
;; don't replace the old backup file now.
@ -1446,11 +1447,59 @@ It returns t if it got any new messages."
(progn (goto-char opoint)
(if (or file-name rmail-inbox-list)
(message "(No new mail has arrived)")))
(if (rmail-summary-exists)
;; check new messages to see if any of them is spam:
(if rmail-use-spam-filter
(let*
((old-messages (- rmail-total-messages new-messages))
(rsf-scanned-message-number (1+ old-messages))
;; save deletion flags of old messages: vector starts
;; at zero (is one longer that no of messages),
;; therefore take 1+ old-messages
(save-deleted
(substring rmail-deleted-vector 0 (1+
old-messages))))
;; set all messages to undeleted
(setq rmail-deleted-vector
(make-string (1+ rmail-total-messages) ?\ ))
(while (<= rsf-scanned-message-number
rmail-total-messages)
(progn
(if (not (rmail-spam-filter rsf-scanned-message-number))
(progn (setq rsf-number-of-spam (1+ rsf-number-of-spam)))
)
(setq rsf-scanned-message-number (1+ rsf-scanned-message-number))
))
(if (> rsf-number-of-spam 0)
(progn
(when (rmail-expunge-confirmed)
(rmail-only-expunge t))
))
(setq rmail-deleted-vector
(concat
save-deleted
(make-string (- rmail-total-messages old-messages)
?\ )))
))
(if (rmail-summary-exists)
(rmail-select-summary
(rmail-update-summary)))
(message "%d new message%s read"
new-messages (if (= 1 new-messages) "" "s"))
(message "%d new message%s read%s"
new-messages (if (= 1 new-messages) "" "s")
;; print out a message on number of spam messages found:
(if (and rmail-use-spam-filter (> rsf-number-of-spam 0))
(if (= 1 new-messages)
(format ", and found to be a spam message"
rsf-number-of-spam)
(if (> rsf-number-of-spam 1)
(format ", %d of which found to be spam messages"
rsf-number-of-spam)
(format ", one of which found to be a spam message"
rsf-number-of-spam)))
""))
(if (and rmail-use-spam-filter (> rsf-number-of-spam 0))
(progn (if rmail-spam-filter-beep (beep t))
(sleep-for rmail-spam-sleep-after-message)))
;; Move to the first new message
;; unless we have other unseen messages before it.
(rmail-show-message (rmail-first-unseen-message))
@ -1680,7 +1729,9 @@ It returns t if it got any new messages."
header-end t))))
(if quoted-printable-header-field-end
(save-excursion
(rmail-decode-quoted-printable header-end (point))
(unless
(mail-unquote-printable-region header-end (point) nil t)
(message "Malformed MIME quoted-printable message"))
;; Change "quoted-printable" to "8bit",
;; to reflect the decoding we just did.
(goto-char quoted-printable-header-field-end)
@ -1825,7 +1876,10 @@ It returns t if it got any new messages."
(setq count (1+ count))
(if quoted-printable-header-field-end
(save-excursion
(rmail-decode-quoted-printable header-end (point))
(unless
(mail-unquote-printable-region header-end (point) nil t)
(message "Malformed MIME quoted-printable message"))
;; Change "quoted-printable" to "8bit",
;; to reflect the decoding we just did.
(goto-char quoted-printable-header-field-end)
@ -1836,7 +1890,13 @@ It returns t if it got any new messages."
(when
(condition-case nil
(progn
(base64-decode-region (1+ header-end) (point))
(base64-decode-region
(1+ header-end)
(save-excursion
;; Prevent base64-decode-region
;; from removing newline characters.
(skip-chars-backward "\n\t ")
(point)))
t)
(error nil))
(goto-char header-end)
@ -1854,6 +1914,7 @@ It returns t if it got any new messages."
(goto-char (point-min))
(while (search-forward "\n\^_" nil t); single char
(replace-match "\n^_")))); 2 chars: "^" and "_"
(or (bolp) (newline)) ; in case we lost the final newline.
(insert ?\^_)
(setq last-coding-system-used nil)
(or rmail-enable-mime
@ -1887,45 +1948,6 @@ It returns t if it got any new messages."
(t (error "Cannot convert to babyl format")))))
count))
(defun rmail-hex-char-to-integer (character)
"Return CHARACTER's value interpreted as a hex digit."
(if (and (>= character ?0) (<= character ?9))
(- character ?0)
(let ((ch (logior character 32)))
(if (and (>= ch ?a) (<= ch ?f))
(- ch (- ?a 10))
(error "Invalid hex digit `%c'" ch)))))
(defun rmail-hex-string-to-integer (hex-string)
"Return decimal integer for HEX-STRING."
(let ((hex-num 0)
(index 0))
(while (< index (length hex-string))
(setq hex-num (+ (* hex-num 16)
(rmail-hex-char-to-integer (aref hex-string index))))
(setq index (1+ index)))
hex-num))
(defun rmail-decode-quoted-printable (from to)
"Decode Quoted-Printable in the region between FROM and TO."
(interactive "r")
(goto-char from)
(or (markerp to)
(setq to (copy-marker to)))
(while (search-forward "=" to t)
(cond ((eq (following-char) ?\n)
(delete-char -1)
(delete-char 1))
((looking-at "[0-9A-F][0-9A-F]")
(let ((byte (rmail-hex-string-to-integer
(buffer-substring (point) (+ 2 (point))))))
(delete-region (1- (point)) (+ 2 (point)))
(insert byte)))
((looking-at "=")
(delete-char 1))
(t
(message "Malformed MIME quoted-printable message")))))
;; Delete the "From ..." line, creating various other headers with
;; information from it if they don't already exist. Now puts the
;; original line into a mail-from: header line for debugging and for
@ -3033,7 +3055,7 @@ See also user-option `rmail-confirm-expunge'."
(funcall rmail-confirm-expunge
"Erase deleted messages from Rmail file? ")))
(defun rmail-only-expunge ()
(defun rmail-only-expunge (&optional dont-show)
"Actually erase all deleted messages in the file."
(interactive)
(set-buffer rmail-buffer)
@ -3112,11 +3134,12 @@ See also user-option `rmail-confirm-expunge'."
(message "Expunging deleted messages...done")
(if (not win)
(narrow-to-region (- (buffer-size) omin) (- (buffer-size) omax)))
(rmail-show-message
(if (zerop rmail-current-message) 1 nil))
(if rmail-enable-mime
(goto-char (+ (point-min) opoint))
(goto-char (+ (point) opoint))))))
(if (not dont-show)
(rmail-show-message
(if (zerop rmail-current-message) 1 nil)
(if rmail-enable-mime
(goto-char (+ (point-min) opoint))
(goto-char (+ (point) opoint))))))))
(defun rmail-expunge ()
"Erase deleted messages from Rmail file and summary buffer."

View File

@ -680,13 +680,8 @@ This is relative to `smtpmail-queue-dir'.")
;; size estimate:
(+ (- (point-max) (point-min))
;; Add one byte for each change-of-line
;; because or CR-LF representation:
(count-lines (point-min) (point-max))
;; For some reason, an empty line is
;; added to the message. Maybe this
;; is a bug, but it can't hurt to add
;; those two bytes anyway:
2)))
;; because of CR-LF representation:
(count-lines (point-min) (point-max)))))
""))
(body-part
(if (member '8bitmime supported-extensions)
@ -858,31 +853,15 @@ This is relative to `smtpmail-queue-dir'.")
)
(defun smtpmail-send-data (process buffer)
(let
((data-continue t)
(sending-data nil)
this-line
this-line-end)
(let ((data-continue t) sending-data)
(with-current-buffer buffer
(goto-char (point-min)))
(while data-continue
(with-current-buffer buffer
(beginning-of-line)
(setq this-line (point))
(end-of-line)
(setq this-line-end (point))
(setq sending-data nil)
(setq sending-data (buffer-substring this-line this-line-end))
(if (/= (forward-line 1) 0)
(setq data-continue nil)))
(smtpmail-send-data-1 process sending-data)
)
)
)
(setq sending-data (buffer-substring (point-at-bol) (point-at-eol)))
(end-of-line 2)
(setq data-continue (not (eobp))))
(smtpmail-send-data-1 process sending-data))))
(defun smtpmail-deduce-address-list (smtpmail-text-buffer header-start header-end)
"Get address list suitable for smtp RCPT TO: <address>."

View File

@ -58,7 +58,7 @@
'mouse-wheel-down-event)
(defcustom mouse-wheel-down-event
;; In the latest versions of XEmacs, we could just use mouse-%s as well.
(if (memq system-type '(windows-nt macos darwin))
(if (memq window-system '(w32 mac))
'wheel-up
(intern (format (if (featurep 'xemacs) "button%s" "mouse-%s")
mouse-wheel-down-button)))
@ -72,7 +72,7 @@
'mouse-wheel-up-event)
(defcustom mouse-wheel-up-event
;; In the latest versions of XEmacs, we could just use mouse-%s as well.
(if (memq system-type '(windows-nt macos darwin))
(if (memq window-system '(w32 mac))
'wheel-down
(intern (format (if (featurep 'xemacs) "button%s" "mouse-%s")
mouse-wheel-up-button)))

View File

@ -1,6 +1,6 @@
;;; outline.el --- outline mode commands for Emacs
;; Copyright (C) 1986, 93, 94, 95, 97, 2000, 2001
;; Copyright (C) 1986, 93, 94, 95, 97, 2000, 01, 2004
;; Free Software Foundation, Inc.
;; Maintainer: FSF
@ -410,7 +410,8 @@ If INVISIBLE-OK is non-nil, an invisible heading line is ok too."
(or (caar outline-heading-alist) "")
(match-string 0)))))
(unless (or (string-match "[ \t]\\'" head)
(not (string-match outline-regexp (concat head " "))))
(not (string-match (concat "\\`\\(?:" outline-regexp "\\)")
(concat head " "))))
(setq head (concat head " ")))
(unless (bolp) (end-of-line) (newline))
(insert head)
@ -486,7 +487,8 @@ in the region."
;; Bummer!! There is no lower heading in the buffer.
;; Let's try to invent one by repeating the first char.
(let ((new-head (concat (substring head 0 1) head)))
(if (string-match (concat "\\`" outline-regexp) new-head)
(if (string-match (concat "\\`\\(?:" outline-regexp "\\)")
new-head)
;; Why bother checking that it is indeed lower level ?
new-head
;; Didn't work: keep it as is so it's still a heading.
@ -557,7 +559,7 @@ the match data is set appropriately."
(defun outline-move-subtree-down (&optional arg)
"Move the currrent subtree down past ARG headlines of the same level."
(interactive "p")
(let ((re (concat "^" outline-regexp))
(let ((re (concat "^\\(?:" outline-regexp "\\)"))
(movfunc (if (> arg 0) 'outline-get-next-sibling
'outline-get-last-sibling))
(ins-point (make-marker))

View File

@ -100,7 +100,7 @@
font-lock-keywords)))
(cc-load "cc-fix")))
(cc-external-require 'cl)
(eval-when-compile (require 'cl))
;;; Variables also used at compile time.

View File

@ -328,7 +328,7 @@ See `run-hooks'."
"do" "else" "for-each" "if" "lambda"
"let" "let*" "let-syntax" "letrec" "letrec-syntax"
;; Hannes Haug <hannes.haug@student.uni-tuebingen.de> wants:
"and" "or" "delay"
"and" "or" "delay" "force"
;; Stefan Monnier <stefan.monnier@epfl.ch> says don't bother:
;;"quasiquote" "quote" "unquote" "unquote-splicing"
"map" "syntax" "syntax-rules") t)

View File

@ -198,7 +198,8 @@ and off otherwise."
(or (eq which-func-modes t)
(member major-mode which-func-modes))))))
;; Turn it off
(cancel-timer which-func-update-timer)
(when (timerp which-func-update-timer)
(cancel-timer which-func-update-timer))
(setq which-func-update-timer nil)
(dolist (buf (buffer-list))
(with-current-buffer buf (setq which-func-mode nil)))))

View File

@ -65,7 +65,7 @@ The return value of this function is not used."
(defmacro noreturn (form)
"Evaluates FORM, with the expectation that the evaluation will signal an error
instead of returning to its caller. If FORM does return, an error is
signalled."
signalled."
`(prog1 ,form
(error "Form marked with `noreturn' did return")))
@ -158,6 +158,12 @@ the return value (nil if RESULT is omitted).
(setq ,(car spec) (1+ ,(car spec))))
,@(cdr (cdr spec)))))
(defmacro declare (&rest specs)
"Do not evaluate any arguments and return nil.
Treated as a declaration when used at the right place in a
`defmacro' form. \(See Info anchor `(elisp)Definition of declare'."
nil)
(defsubst caar (x)
"Return the car of the car of X."
(car (car x)))
@ -203,6 +209,21 @@ If N is bigger than the length of X, return X."
(if (> n 0) (setcdr (nthcdr (- (1- m) n) x) nil))
x))))
(defun delete-dups (list)
"Destructively return LIST, with `equal' duplicates removed.
LIST must be a proper list. The value of LIST after a call to
this function is undefined. Use \(setq LIST (delete-dups LIST))
if you want to store the return value in LIST. Of several
`equal' occurrences of an element in LIST, the last one is kept."
(while (member (car list) (cdr list))
(pop list))
(let ((tail list))
(while tail
(while (member (cadr tail) (cddr tail))
(setcdr tail (cddr tail)))
(pop tail)))
list)
(defun number-sequence (from &optional to inc)
"Return a sequence of numbers from FROM to TO (both inclusive) as a list.
INC is the increment used between numbers in the sequence and defaults to 1.
@ -689,13 +710,13 @@ The return value is a positive integer."
(defsubst posn-window (position)
"Return the window in POSITION.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(nth 0 position))
(defsubst posn-area (position)
"Return the window area recorded in POSITION, or nil for the text area.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(let ((area (if (consp (nth 1 position))
(car (nth 1 position))
(nth 1 position))))
@ -704,7 +725,7 @@ and `event-end' functions."
(defsubst posn-point (position)
"Return the buffer location in POSITION.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(or (nth 5 position)
(if (consp (nth 1 position))
(car (nth 1 position))
@ -713,18 +734,18 @@ and `event-end' functions."
(defsubst posn-x-y (position)
"Return the x and y coordinates in POSITION.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(nth 2 position))
(defun posn-col-row (position)
"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 height.
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'
and `event-end' functions."
and `event-end' functions."
(let* ((pair (posn-x-y position))
(window (posn-window position))
(area (posn-area position)))
@ -750,43 +771,43 @@ These are the actual row number in the window and character number in that row.
Return nil if POSITION does not contain the actual position; in that case
`posn-col-row' can be used to get approximate values.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(nth 6 position))
(defsubst posn-timestamp (position)
"Return the timestamp of POSITION.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(nth 3 position))
(defsubst posn-string (position)
"Return the string object of POSITION, or nil if a buffer position.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(nth 4 position))
(defsubst posn-image (position)
"Return the image object of POSITION, or nil if a not an image.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(nth 7 position))
(defsubst posn-object (position)
"Return the object (image or string) of POSITION.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(or (posn-image position) (posn-string position)))
(defsubst posn-object-x-y (position)
"Return the x and y coordinates relative to the object of POSITION.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(nth 8 position))
(defsubst posn-object-width-height (position)
"Return the pixel width and height of the object of POSITION.
POSITION should be a list of the form returned by the `event-start'
and `event-end' functions."
and `event-end' functions."
(nth 9 position))

View File

@ -2330,6 +2330,15 @@ order until succeed.")
(or clip-text primary-text cut-text)
))
(defun x-clipboard-yank ()
"Insert the clipboard contents, or the last stretch of killed text."
(interactive)
(let ((clipboard-text (x-get-selection 'CLIPBOARD))
(x-select-enable-clipboard t))
(if (and clipboard-text (> (length clipboard-text) 0))
(kill-new clipboard-text))
(yank)))
;;; Window system initialization.
@ -2392,12 +2401,6 @@ order until succeed.")
;; generated from FONT.
(create-fontset-from-ascii-font font resolved-name "startup"))))
;; Sun expects the menu bar cut and paste commands to use the clipboard.
;; This has ,? to match both on Sunos and on Solaris.
(if (string-match "Sun Microsystems,? Inc\\."
(x-server-vendor))
(menu-bar-enable-clipboard))
;; Apply a geometry resource to the initial frame. Put it at the end
;; of the alist, so that anything specified on the command line takes
;; precedence.
@ -2463,6 +2466,14 @@ order until succeed.")
;; Turn on support for mouse wheels.
(mouse-wheel-mode 1)
;; Enable CLIPBOARD copy/paste through menu bar commands.
(menu-bar-enable-clipboard)
;; Override Paste so it looks at CLIPBOARD first.
(define-key menu-bar-edit-menu [paste]
(cons "Paste" (cons "Paste text from clipboard or kill ring"
'x-clipboard-yank)))
(setq x-initialized t))
(add-to-list 'handle-args-function-alist '(x . x-handle-args))

View File

@ -1,6 +1,6 @@
;;; texinfo.el --- major mode for editing Texinfo files
;; Copyright (C) 1985,88,89,90,91,92,93,96,97,2000,01,03
;; Copyright (C) 1985,88,89,90,91,92,93,96,97,2000,01,03,04
;; Free Software Foundation, Inc.
;; Author: Robert J. Chassell
@ -316,7 +316,7 @@ chapter."
(defvar texinfo-imenu-generic-expression
'((nil "^@\\(node\\|anchor\\)[ \t]+\\([^,\n]*\\)" 2)
("Chapters" "^@chapter[ \t]+\\(.*\\)$" 1))
"Imenu generic expression for TexInfo mode. See `imenu-generic-expression'.")
"Imenu generic expression for Texinfo mode. See `imenu-generic-expression'.")
(defvar texinfo-font-lock-syntactic-keywords
'(("\\(@\\)c\\(omment\\)?\\>" (1 "<"))
@ -336,11 +336,11 @@ chapter."
"macro" "menu" "multitable" "quotation" "smalldisplay"
"smallexample" "smallformat" "smalllisp" "table" "tex"
"titlepage" "verbatim" "vtable")
"List of TeXinfo environments.")
"List of Texinfo environments.")
(defconst texinfo-environment-regexp
(concat "^@" (regexp-opt (cons "end" texinfo-environments) t) "\\>")
"Regexp for environment-like TexInfo list commands.
"Regexp for environment-like Texinfo list commands.
Subexpression 1 is what goes into the corresponding `@end' statement.")
(defface texinfo-heading-face
@ -373,7 +373,7 @@ Subexpression 1 is what goes into the corresponding `@end' statement.")
;; 1 (texinfo-clone-environment (match-beginning 1) (match-end 1)) keep)
(,(concat "^@" (regexp-opt (mapcar 'car texinfo-section-list) t)
".*\n") 0 texinfo-heading-face t))
"Additional expressions to highlight in TeXinfo mode.")
"Additional expressions to highlight in Texinfo mode.")
(defun texinfo-clone-environment (start end)
(let ((endp nil))
@ -676,7 +676,7 @@ Puts point on a blank line between them."
(defvar texinfo-enable-quote-macros "@\\(code\\|samp\\|kbd\\)\\>")
(defvar texinfo-enable-quote-envs '("example\\>" "lisp\\>"))
(defun texinfo-insert-quote (&optional arg)
"Insert the appropriate quote mark for TeXinfo.
"Insert the appropriate quote mark for Texinfo.
Usually inserts the value of `texinfo-open-quote' (normally ``) or
`texinfo-close-quote' (normally ''), depending on the context.
With prefix argument or inside @code or @example, inserts a plain \"."
@ -904,9 +904,8 @@ to jump to the corresponding spot in the Texinfo source file."
;; Second, create and format an *Occur* buffer
(save-excursion
(goto-char (point-min))
(if nodes-too
(occur (concat "^@node\\>\\|" outline-regexp))
(occur outline-regexp)))
(occur (concat "^\\(?:" (if nodes-too "@node\\>\\|")
outline-regexp "\\)")))
(pop-to-buffer "*Occur*")
(goto-char (point-min))
(let ((inhibit-read-only t))

View File

@ -5,7 +5,7 @@
;; Author: FSF (see vc.el for full credits)
;; Maintainer: Andre Spiegel <spiegel@gnu.org>
;; $Id: vc-cvs.el,v 1.66 2003/10/01 13:22:53 fx Exp $
;; $Id: vc-cvs.el,v 1.67 2004/01/20 17:41:18 uid65624 Exp $
;; This file is part of GNU Emacs.
@ -625,6 +625,14 @@ systime, or nil if there is none."
(beginning-of-line nil)
(vc-cvs-annotate-time))))))
(defun vc-cvs-annotate-extract-revision-at-line ()
(save-excursion
(beginning-of-line)
(if (re-search-forward "^\\([0-9]+\\.[0-9]+\\(\\.[0-9]+\\)*\\) +("
(line-end-position) t)
(match-string-no-properties 1)
nil)))
;;;
;;; Snapshot system
;;;

View File

@ -1,6 +1,6 @@
;;; vc-mcvs.el --- VC backend for the Meta-CVS version-control system
;; Copyright (C) 1995,98,99,2000,01,02,2003 Free Software Foundation, Inc.
;; Copyright (C) 1995,98,99,2000,01,02,03,2004 Free Software Foundation, Inc.
;; Author: FSF (see vc.el for full credits)
;; Maintainer: Stefan Monnier <monnier@gnu.org>
@ -170,13 +170,6 @@ This is only meaningful if you don't use the implicit checkout model
0))
t)))
(defmacro vc-mcvs-cvs (op file &rest args)
(declare (debug t))
`(,(intern (concat "vc-cvs-" (symbol-name op)))
(expand-file-name (vc-file-getprop ,file 'mcvs-inode)
(vc-file-getprop ,file 'mcvs-root))
,@args))
(defun vc-mcvs-state (file)
;; This would assume the Meta-CVS sandbox is synchronized.
;; (vc-mcvs-cvs state file))
@ -215,19 +208,13 @@ This is only meaningful if you don't use the implicit checkout model
(goto-char (point-max))
(widen)))))))
(defun vc-mcvs-workfile-version (file) (vc-mcvs-cvs workfile-version file))
(defun vc-mcvs-workfile-version (file)
(vc-cvs-workfile-version
(expand-file-name (vc-file-getprop file 'mcvs-inode)
(vc-file-getprop file 'mcvs-root))))
(defalias 'vc-mcvs-checkout-model 'vc-cvs-checkout-model)
(defun vc-mcvs-mode-line-string (file)
(let ((s (vc-mcvs-cvs mode-line-string file)))
(when s
(if (and (not (memq (vc-state file) '(up-to-date needs-patch)))
(string-match "\\`CVS-" s))
;; The CVS file is not in sync, so we need to adjust the state.
(concat "MCVS:" (substring s 4))
(concat "M" s)))))
;;;
;;; State-changing functions
;;;
@ -589,7 +576,7 @@ and that it passes `vc-mcvs-global-switches' to it before FLAGS."
;; We need to filter the output.
;; The output of the filter uses filenames relative to the root,
;; so we need to change the default-directory.
(assert (equal default-directory (vc-mcvs-root file)))
;; (assert (equal default-directory (vc-mcvs-root file)))
(vc-do-command
buffer okstatus "sh" nil "-c"
(concat "mcvs "

View File

@ -7,7 +7,7 @@
;; Maintainer: Andre Spiegel <spiegel@gnu.org>
;; Keywords: tools
;; $Id: vc.el,v 1.361 2003/12/24 23:18:10 uid66361 Exp $
;; $Id: vc.el,v 1.363 2004/01/21 11:05:51 uid65624 Exp $
;; This file is part of GNU Emacs.
@ -347,6 +347,13 @@
;; time with hours, minutes, and seconds included. Probably safe to
;; ignore. Return the current-time, in units of fractional days.
;;
;; - annotate-extract-revision-at-line ()
;;
;; Only required if `annotate-command' is defined for the backend.
;; Invoked from a buffer in vc-annotate-mode, return the revision
;; corresponding to the current line, or nil if there is no revision
;; corresponding to the current line.
;;
;; SNAPSHOT SYSTEM
;;
;; - create-snapshot (dir name branchp)
@ -392,7 +399,13 @@
;;
;; - previous-version (file rev)
;;
;; Return the version number that precedes REV for FILE.
;; Return the version number that precedes REV for FILE, or nil if no such
;; version exists.
;;
;; - next-version (file rev)
;;
;; Return the version number that follows REV for FILE, or nil if no such
;; version exists.
;;
;; - check-headers ()
;;
@ -631,6 +644,14 @@ List of factors, used to expand/compress the time scale. See `vc-annotate'."
m)
"Local keymap used for VC-Annotate mode.")
(define-key vc-annotate-mode-map "A" 'vc-annotate-revision-previous-to-line)
(define-key vc-annotate-mode-map "D" 'vc-annotate-show-diff-revision-at-line)
(define-key vc-annotate-mode-map "J" 'vc-annotate-revision-at-line)
(define-key vc-annotate-mode-map "L" 'vc-annotate-show-log-revision-at-line)
(define-key vc-annotate-mode-map "N" 'vc-annotate-next-version)
(define-key vc-annotate-mode-map "P" 'vc-annotate-prev-version)
(define-key vc-annotate-mode-map "W" 'vc-annotate-workfile-version)
(defvar vc-annotate-mode-menu nil
"Local keymap used for VC-Annotate mode's menu bar menu.")
@ -714,9 +735,10 @@ The keys are \(BUFFER . BACKEND\). See also `vc-annotate-get-backend'.")
(substring rev (match-beginning 0) (match-end 0)))
(defun vc-default-previous-version (backend file rev)
"Guess the version number immediately preceding REV for FILE.
This default implementation works for <major>.<minor>-style version numbers
as used by RCS and CVS."
"Return the version number immediately preceding REV for FILE,
or nil if there is no previous version. This default
implementation works for <major>.<minor>-style version numbers as
used by RCS and CVS."
(let ((branch (vc-branch-part rev))
(minor-num (string-to-number (vc-minor-part rev))))
(when branch
@ -731,6 +753,16 @@ as used by RCS and CVS."
;; return version of starting point
(vc-branch-part branch))))))
(defun vc-default-next-version (backend file rev)
"Return the version number immediately following REV for FILE,
or nil if there is no next version. This default implementation
works for <major>.<minor>-style version numbers as used by RCS
and CVS."
(when (not (string= rev (vc-workfile-version file)))
(let ((branch (vc-branch-part rev))
(minor-num (string-to-number (vc-minor-part rev))))
(concat branch "." (number-to-string (1+ minor-num))))))
;; File property caching
(defun vc-clear-context ()
@ -2285,11 +2317,13 @@ allowed and simply skipped)."
;; Miscellaneous other entry points
;;;###autoload
(defun vc-print-log ()
"List the change log of the current buffer in a window."
(defun vc-print-log (&optional focus-rev)
"List the change log of the current buffer in a window. If
FOCUS-REV is non-nil, leave the point at that revision."
(interactive)
(vc-ensure-vc-buffer)
(let ((file buffer-file-name))
(or focus-rev (setq focus-rev (vc-workfile-version file)))
(vc-call print-log file)
(set-buffer "*vc*")
(pop-to-buffer (current-buffer))
@ -2307,7 +2341,7 @@ allowed and simply skipped)."
;; move point to the log entry for the current version
(vc-call-backend ',(vc-backend file)
'show-log-entry
',(vc-workfile-version file))
',focus-rev)
(set-buffer-modified-p nil)))))
(defun vc-default-show-log-entry (backend rev)
@ -2778,6 +2812,14 @@ Uses `rcs2log' which only works for RCS and CVS."
(defvar vc-annotate-ratio nil "Global variable.")
(defvar vc-annotate-backend nil "Global variable.")
;; internal buffer-local variables
(defvar vc-annotate-parent-file nil)
(defvar vc-annotate-parent-rev nil)
(defvar vc-annotate-parent-display-mode nil)
(make-local-variable 'vc-annotate-parent-file)
(make-local-variable 'vc-annotate-parent-rev)
(make-local-variable 'vc-annotate-parent-display-mode)
(defconst vc-annotate-font-lock-keywords
;; The fontification is done by vc-annotate-lines instead of font-lock.
'((vc-annotate-lines)))
@ -2797,6 +2839,7 @@ menu items."
(set (make-local-variable 'truncate-lines) t)
(set (make-local-variable 'font-lock-defaults)
'(vc-annotate-font-lock-keywords t))
(view-mode 1)
(vc-annotate-add-menu))
(defun vc-annotate-display-default (&optional ratio)
@ -2885,7 +2928,23 @@ cover the range from the oldest annotation to the newest."
(unless (eq vc-annotate-display-mode 'fullscale)
(vc-annotate-display-select nil 'fullscale))
:style toggle :selected
(eq vc-annotate-display-mode 'fullscale)])))
(eq vc-annotate-display-mode 'fullscale)])
(list "--")
(list ["Annotate previous revision"
(call-interactively 'vc-annotate-prev-version)])
(list ["Annotate next revision"
(call-interactively 'vc-annotate-next-version)])
(list ["Annotate revision at line"
(vc-annotate-revision-at-line)])
(list ["Annotate revision previous to line"
(vc-annotate-revision-previous-to-line)])
(list ["Annotate latest revision"
(vc-annotate-workfile-version)])
(list ["Show log of revision at line"
(vc-annotate-show-log-revision-at-line)])
(list ["Show diff of revision at line"
(vc-annotate-show-diff-revision-at-line)])))
;; Define the menu
(if (or (featurep 'easymenu) (load "easymenu" t))
(easy-menu-define vc-annotate-mode-menu vc-annotate-mode-map
@ -2922,7 +2981,7 @@ use; you may override this using the second optional arg MODE."
;;;; the contents in BUFFER.
;;;###autoload
(defun vc-annotate (prefix)
(defun vc-annotate (prefix &optional revision display-mode)
"Display the edit history of the current file using colours.
This command creates a buffer that shows, for each line of the current
@ -2949,19 +3008,24 @@ mode-specific menu. `vc-annotate-color-map' and
colors. `vc-annotate-background' specifies the background color."
(interactive "P")
(vc-ensure-vc-buffer)
(let* ((temp-buffer-name (concat "*Annotate " (buffer-name) "*"))
(let* ((temp-buffer-name nil)
(temp-buffer-show-function 'vc-annotate-display-select)
(rev (vc-workfile-version buffer-file-name))
(rev (or revision (vc-workfile-version buffer-file-name)))
(bfn buffer-file-name)
(vc-annotate-version
(if prefix (read-string
(format "Annotate from version: (default %s) " rev)
nil nil rev)
rev)))
(if prefix
(setq vc-annotate-display-mode
(float (string-to-number
(read-string "Annotate span days: (default 20) "
nil nil "20")))))
(if prefix (read-string
(format "Annotate from version: (default %s) " rev)
nil nil rev)
rev)))
(if display-mode
(setq vc-annotate-display-mode display-mode)
(if prefix
(setq vc-annotate-display-mode
(float (string-to-number
(read-string "Annotate span days: (default 20) "
nil nil "20"))))))
(setq temp-buffer-name (format "*Annotate %s (rev %s)*"
(buffer-name) vc-annotate-version))
(setq vc-annotate-backend (vc-backend buffer-file-name))
(message "Annotating...")
(if (not (vc-find-backend-function vc-annotate-backend 'annotate-command))
@ -2972,6 +3036,12 @@ colors. `vc-annotate-background' specifies the background color."
buffer-file-name
(get-buffer temp-buffer-name)
vc-annotate-version))
(save-excursion
(set-buffer temp-buffer-name)
(setq vc-annotate-parent-file bfn)
(setq vc-annotate-parent-rev vc-annotate-version)
(setq vc-annotate-parent-display-mode vc-annotate-display-mode))
;; Don't use the temp-buffer-name until the buffer is created
;; (only after `with-output-to-temp-buffer'.)
(setq vc-annotate-buffers
@ -2979,6 +3049,150 @@ colors. `vc-annotate-background' specifies the background color."
(list (cons (get-buffer temp-buffer-name) vc-annotate-backend))))
(message "Annotating... done")))
(defun vc-annotate-prev-version (prefix)
"Visit the annotation of the version previous to this one.
With a numeric prefix argument, annotate the version that many
versions previous."
(interactive "p")
(vc-annotate-warp-version (- 0 prefix)))
(defun vc-annotate-next-version (prefix)
"Visit the annotation of the version after this one.
With a numeric prefix argument, annotate the version that many
versions after."
(interactive "p")
(vc-annotate-warp-version prefix))
(defun vc-annotate-workfile-version ()
"Visit the annotation of the workfile version of this file."
(interactive)
(if (not (equal major-mode 'vc-annotate-mode))
(message "Cannot be invoked outside of a vc annotate buffer")
(let ((warp-rev (vc-workfile-version vc-annotate-parent-file)))
(if (equal warp-rev vc-annotate-parent-rev)
(message "Already at version %s" warp-rev)
(vc-annotate-warp-version warp-rev)))))
(defun vc-annotate-extract-revision-at-line ()
"Extract the revision number of the current line."
;; This function must be invoked from a buffer in vc-annotate-mode
(save-window-excursion
(vc-ensure-vc-buffer)
(setq vc-annotate-backend (vc-backend buffer-file-name)))
(vc-call-backend vc-annotate-backend 'annotate-extract-revision-at-line))
(defun vc-annotate-revision-at-line ()
"Visit the annotation of the version identified in the current line."
(interactive)
(if (not (equal major-mode 'vc-annotate-mode))
(message "Cannot be invoked outside of a vc annotate buffer")
(let ((rev-at-line (vc-annotate-extract-revision-at-line)))
(if (not rev-at-line)
(message "Cannot extract revision number from the current line")
(if (equal rev-at-line vc-annotate-parent-rev)
(message "Already at version %s" rev-at-line)
(vc-annotate-warp-version rev-at-line))))))
(defun vc-annotate-revision-previous-to-line ()
"Visit the annotation of the version before the version at line."
(interactive)
(if (not (equal major-mode 'vc-annotate-mode))
(message "Cannot be invoked outside of a vc annotate buffer")
(let ((rev-at-line (vc-annotate-extract-revision-at-line))
(prev-rev nil))
(if (not rev-at-line)
(message "Cannot extract revision number from the current line")
(setq prev-rev
(vc-call previous-version vc-annotate-parent-file rev-at-line))
(vc-annotate-warp-version prev-rev)))))
(defun vc-annotate-show-log-revision-at-line ()
"Visit the log of the version at line."
(interactive)
(if (not (equal major-mode 'vc-annotate-mode))
(message "Cannot be invoked outside of a vc annotate buffer")
(let ((rev-at-line (vc-annotate-extract-revision-at-line)))
(if (not rev-at-line)
(message "Cannot extract revision number from the current line")
(vc-print-log rev-at-line)))))
(defun vc-annotate-show-diff-revision-at-line ()
"Visit the diff of the version at line from its previous version."
(interactive)
(if (not (equal major-mode 'vc-annotate-mode))
(message "Cannot be invoked outside of a vc annotate buffer")
(let ((rev-at-line (vc-annotate-extract-revision-at-line))
(prev-rev nil))
(if (not rev-at-line)
(message "Cannot extract revision number from the current line")
(setq prev-rev
(vc-call previous-version vc-annotate-parent-file rev-at-line))
(if (not prev-rev)
(message "Cannot diff from any version prior to %s" rev-at-line)
(save-window-excursion
(vc-version-diff vc-annotate-parent-file prev-rev rev-at-line))
(switch-to-buffer "*vc-diff*"))))))
(defun vc-current-line ()
"Return the current buffer's line number."
(let ((oldpoint (point)) start)
(save-excursion
(save-restriction
(goto-char (point-min))
(widen)
(forward-line 0)
(setq start (point))
(goto-char oldpoint)
(forward-line 0)
(1+ (count-lines (point-min) (point)))))))
(defun vc-annotate-warp-version (revspec)
"Annotate the version described by REVSPEC.
If REVSPEC is a positive integer, warp that many versions
forward, if possible, otherwise echo a warning message. If
REVSPEC is a negative integer, warp that many versions backward,
if possible, otherwise echo a warning message. If REVSPEC is a
string, then it describes a revision number, so warp to that
revision."
(if (not (equal major-mode 'vc-annotate-mode))
(message "Cannot be invoked outside of a vc annotate buffer")
(let* ((oldline (vc-current-line))
(revspeccopy revspec)
(newrev nil))
(cond
((and (integerp revspec) (> revspec 0))
(setq newrev vc-annotate-parent-rev)
(while (and (> revspec 0) newrev)
(setq newrev (vc-call next-version
vc-annotate-parent-file newrev))
(setq revspec (1- revspec)))
(if (not newrev)
(message "Cannot increment %d versions from version %s"
revspeccopy vc-annotate-parent-rev)))
((and (integerp revspec) (< revspec 0))
(setq newrev vc-annotate-parent-rev)
(while (and (< revspec 0) newrev)
(setq newrev (vc-call previous-version
vc-annotate-parent-file newrev))
(setq revspec (1+ revspec)))
(if (not newrev)
(message "Cannot decrement %d versions from version %s"
(- 0 revspeccopy) vc-annotate-parent-rev)))
((stringp revspec) (setq newrev revspec))
(t (error "Invalid argument to vc-annotate-warp-version")))
(when newrev
(save-window-excursion
(find-file vc-annotate-parent-file)
(vc-annotate nil newrev vc-annotate-parent-display-mode))
(kill-buffer (current-buffer)) ;; kill the buffer we started from
(switch-to-buffer (car (car (last vc-annotate-buffers))))
(goto-line (min oldline (progn (goto-char (point-max))
(previous-line)
(vc-current-line))))))))
(defun vc-annotate-car-last-cons (a-list)
"Return car of last cons in association list A-LIST."
(if (not (eq nil (cdr a-list)))

View File

@ -1,3 +1,23 @@
2004-01-20 Luc Teirlinck <teirllm@auburn.edu>
* lists.texi (Sets And Lists): Add delete-dups.
2004-01-15 Luc Teirlinck <teirllm@auburn.edu>
* edebug.texi (Instrumenting Macro Calls): `declare' is not a
special form.
* macros.texi (Defining Macros): Update description of `declare',
which now is a macro.
(Wrong Time): Fix typos.
2004-01-14 Luc Teirlinck <teirllm@auburn.edu>
* compile.texi (Compilation Functions): Expand descriptions of
`compile-defun', `byte-compile-file', `byte-recompile-directory'
and `batch-byte-compile'. In particular, mention and describe
all optional arguments.
(Disassembly): Correct and clarify the description of `disassemble'.
2004-01-11 Luc Teirlinck <teirllm@auburn.edu>
* searching.texi: Various small changes in addition to the

View File

@ -173,14 +173,18 @@ variable names and function names used by the function, except for
certain primitives that are coded as special instructions.
@end defun
@deffn Command compile-defun
@deffn Command compile-defun &optional arg
This command reads the defun containing point, compiles it, and
evaluates the result. If you use this on a defun that is actually a
function definition, the effect is to install a compiled version of that
function.
@code{compile-defun} normally displays the result of evaluation in the
echo area, but if @var{arg} is non-@code{nil}, it inserts the result
in the current buffer after the form it compiled.
@end deffn
@deffn Command byte-compile-file filename
@deffn Command byte-compile-file filename &optional load
This function compiles a file of Lisp code named @var{filename} into a
file of byte-code. The output file's name is made by changing the
@samp{.el} suffix into @samp{.elc}; if @var{filename} does not end in
@ -193,8 +197,11 @@ batch is compiled, and written so that its compiled code will be
executed when the file is read. All comments are discarded when the
input file is read.
This command returns @code{t}. When called interactively, it prompts
for the file name.
This command returns @code{t} if there were no errors and @code{nil}
otherwise. When called interactively, it prompts for the file name.
If @var{load} is non-@code{nil}, this command loads the compiled file
after compiling it. Interactively, @var{load} is the prefix argument.
@example
@group
@ -215,20 +222,28 @@ for the file name.
@end example
@end deffn
@deffn Command byte-recompile-directory directory flag
@deffn Command byte-recompile-directory directory &optional flag force
@cindex library compilation
This function recompiles every @samp{.el} file in @var{directory} that
needs recompilation. A file needs recompilation if a @samp{.elc} file
exists but is older than the @samp{.el} file.
This command recompiles every @samp{.el} file in @var{directory} (or
its subdirectories) that needs recompilation. A file needs
recompilation if a @samp{.elc} file exists but is older than the
@samp{.el} file.
When a @samp{.el} file has no corresponding @samp{.elc} file, @var{flag}
says what to do. If it is @code{nil}, these files are ignored. If it
is non-@code{nil}, the user is asked whether to compile each such file.
When a @samp{.el} file has no corresponding @samp{.elc} file,
@var{flag} says what to do. If it is @code{nil}, this command ignores
these files. If @var{flag} is 0, it compiles them. If it is neither
@code{nil} nor 0, it asks the user whether to compile each such file.
The returned value of this command is unpredictable.
Interactively, @code{byte-recompile-directory} prompts for
@var{directory} and @var{flag} is the prefix argument.
If @var{force} is non-@code{nil}, this command recompiles every
@samp{.el} file that has a @samp{.elc} file.
The returned value is unpredictable.
@end deffn
@defun batch-byte-compile
@defun batch-byte-compile &optional noforce
This function runs @code{byte-compile-file} on files specified on the
command line. This function must be used only in a batch execution of
Emacs, as it kills Emacs on completion. An error in one file does not
@ -236,6 +251,9 @@ prevent processing of subsequent files, but no output file will be
generated for it, and the Emacs process will terminate with a nonzero
status code.
If @var{noforce} is non-@code{nil}, this function does not recompile
files that have an up-to-date @samp{.elc} file.
@example
% emacs -batch -f batch-byte-compile *.el
@end example
@ -420,7 +438,7 @@ these messages.
defined are always ``located'' at the end of the file, so these
commands won't find the places they are really used. To do that,
you must search for the function names.
You can suppress the compiler warning for calling an undefined
function @var{func} by conditionalizing the function call on a
@code{fboundp} test, like this:
@ -549,14 +567,16 @@ returns it as the value of the function.
ordinary Lisp variables, by transferring values between variables and
the stack.
@deffn Command disassemble object &optional stream
This function prints the disassembled code for @var{object}. If
@var{stream} is supplied, then output goes there. Otherwise, the
disassembled code is printed to the stream @code{standard-output}. The
argument @var{object} can be a function name or a lambda expression.
@deffn Command disassemble object &optional buffer-or-name
This command displays the disassembled code for @var{object}. In
interactive use, or if @var{buffer-or-name} is @code{nil} or omitted,
the output goes in a buffer named @samp{*Disassemble*}. If
@var{buffer-or-name} is non-@code{nil}, it must be a buffer or the
name of an existing buffer. Then the output goes there, at point, and
point is left before the output.
As a special exception, if this function is used interactively,
it outputs to a buffer named @samp{*Disassemble*}.
The argument @var{object} can be a function name, a lambda expression
or a byte-code object.
@end deffn
Here are two examples of using the @code{disassemble} function. We

View File

@ -1091,7 +1091,7 @@ forms to be evaluated. For simple macros, the @var{specification}
often looks very similar to the formal argument list of the macro
definition, but specifications are much more general than macro
arguments. @xref{Defining Macros}, for more explanation of
the @code{declare} special form.
the @code{declare} form.
You can also define an edebug specification for a macro separately
from the macro definition with @code{def-edebug-spec}. Adding
@ -1381,7 +1381,7 @@ all begin with the same symbol, you can usually work around this
constraint by factoring the symbol out of the alternatives, e.g.,
@code{["foo" &or [first case] [second case] ...]}.
Most needs are satisfied by these two ways that bactracking is
Most needs are satisfied by these two ways that backtracking is
automatically disabled, but occasionally it is useful to explicitly
disable backtracking by using the @code{gate} specification. This is
useful when you know that no higher alternatives could apply. See the

View File

@ -416,9 +416,9 @@ calling @code{set-visited-file-name} does not.
@defopt before-save-hook
This normal hook runs before a buffer is saved in its visited file,
regardless of whether that is done normally or by one of the hooks
described above. One use of this hook is for the Copyright package;
it uses this hook to make sure the file has the current year in the
copyright header.
described above. For instance, the @file{copyright.el} program uses
this hook to make sure the file you are saving has the current year in
its copyright notice.
@end defopt
@c Emacs 19 feature

View File

@ -1223,7 +1223,8 @@ useful example of @code{sort}.
A list can represent an unordered mathematical set---simply consider a
value an element of a set if it appears in the list, and ignore the
order of the list. To form the union of two sets, use @code{append} (as
long as you don't mind having duplicate elements). Other useful
long as you don't mind having duplicate elements). You can remove
@code{equal} duplicates using @code{delete-dups}. Other useful
functions for sets include @code{memq} and @code{delq}, and their
@code{equal} versions, @code{member} and @code{delete}.
@ -1431,6 +1432,20 @@ be a string and that it ignores differences in letter-case and text
representation: upper-case and lower-case letters are treated as
equal, and unibyte strings are converted to multibyte prior to
comparison.
@end defun
@defun delete-dups list
This function destructively removes all @code{equal} duplicates from
@var{list} and returns the result. Of several @code{equal}
occurrences of an element in @var{list}, @code{delete-dups} keeps the
last one.
The value of @var{list} after a call to this function is undefined.
Usually, we store the return value back in @var{list}:
@example
(setq list (delete-dups list))
@end example
@end defun
See also the function @code{add-to-list}, in @ref{Setting Variables},

View File

@ -210,10 +210,11 @@ called interactively.
which can specify how @key{TAB} should indent macro calls, and how to
step through them for Edebug.
@defspec declare @var{specs}...
This special form is used at top level in a macro definition to
specify various additional information about it. Two kinds of
specification are currently supported:
@anchor{Definition of declare}
@defmac declare @var{specs}@dots{}
A @code{declare} form is used in a macro definition to specify various
additional information about it. Two kinds of specification are
currently supported:
@table @code
@item (edebug @var{edebug-form-spec})
@ -224,7 +225,17 @@ Specify how to step through macro calls for Edebug.
Specify how to indent calls to this macro. @xref{Indenting Macros},
for more details.
@end table
@end defspec
A @code{declare} form only has its special effect in the body of a
@code{defmacro} form if it immediately follows the documentation
string, if present, or the argument list otherwise. (Strictly
speaking, @emph{several} @code{declare} forms can follow the
documentation string or argument list, but since a @code{declare} form
can have several @var{specs}, they can always be combined into a
single form.) When used at other places in a @code{defmacro} form, or
outside a @code{defmacro} form, @code{declare} just returns @code{nil}
without evaluating any @var{specs}.
@end defmac
No macro absolutely needs a @code{declare} form, because that form
has no effect on how the macro expands, on what the macro means in the
@ -356,9 +367,9 @@ trouble, and rules to follow to avoid trouble.
@node Wrong Time
@subsection Wrong Time
The most common problem in writing macros is doing too some of the
The most common problem in writing macros is doing some of the
real work prematurely---while expanding the macro, rather than in the
expansion itself. For instance, one real package had this nmacro
expansion itself. For instance, one real package had this macro
definition:
@example

View File

@ -1,13 +1,16 @@
2004-01-14 Stefan Monnier <monnier@iro.umontreal.ca>
* src/Emacs.r: Update TOO_MUCH_RAM error message.
2003-11-22 Lars Hansen <larsh@math.ku.dk>
* inc/grp.h: Added.
2003-11-02 Andrew Choi <akochoi@shaw.ca>
* src/Emacs.r [!TARGET_API_MAC_CARBON]: Don't define hfdr
resource.
* src/Emacs.r [!TARGET_API_MAC_CARBON]: Don't define hfdr resource.
* Emacs.app/Contents/Resources/Emacs.rsrc: Remove.
2003-10-31 Andrew Choi <akochoi@shaw.ca>
* INSTALL: Add Nozomu Ando's changes to instructions for

View File

@ -1,6 +1,6 @@
* BUILDING EMACS ON MAC OS 8/9 AND MAC OS X -*- outline -*-
Copyright (c) 2001, 2002 Free Software Foundation, Inc.
Copyright (c) 2001, 2002, 2004 Free Software Foundation, Inc.
Permission is granted to anyone to make or distribute verbatim
copies of this document as received, in any medium, provided that
@ -205,7 +205,7 @@ Emacs should build and run on a PowerMac running Mac OS 8.6 - 10.2.
You will need around 100 MB of disk space for the source files and
intermediate files.
It will not run on machines running Mac OS 8/9 with more than 256 MB
It will not run on machines running Mac OS 8/9 with more than 512 MB
of physical or virtual memory. It does not have this restriction when
it is run under Mac OS X. But the usual 128MB buffer limit of a
32-bit Emacs still exists.

View File

@ -1,5 +1,5 @@
/* Resource definitions for GNU Emacs on the Macintosh.
Copyright (C) 1999, 2000 Free Software Foundation, Inc.
Copyright (C) 1999, 2000, 2004 Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -174,7 +174,7 @@ resource 'DITL' (129, purgeable) {
{10, 60, 72, 278},
StaticText {
disabled,
"Emacs does not run on a Macintosh with more than 256 MB of physical or virtual memory"
"Emacs does not run on a Macintosh with more than 512 MB of physical or virtual memory"
}
}
};

View File

@ -1536,6 +1536,46 @@ range from red to blue spans the past 36 days instead of 360 days. A
stretch factor greater than 1 means the color range spans more than a
year.
From the annotate buffer, you can use the following keys to browse the
annotations of past revisions, view diffs, or view log entries:
@itemize @bullet
@item
Pressing @kbd{P} annotates the previous revision. It also takes a
numeric prefix argument, so for example @kbd{C-u 10 P} would take you
back 10 revisions.
@item
Pressing @kbd{N} annotates the next revision. It also takes a numeric
prefix argument, so for example @kbd{C-u 10 N} would take you forward
10 revisions.
@item
Pressing @kbd{J} annotates the revision at line (as denoted by the
version number on the same line).
@item
Pressing @kbd{A} annotates the revision previous to line (as denoted
by the version number on the same line). This is useful to see the
state the file was in before the change on the current line was made.
@item
Pressing @kbd{D} shows the diff of the revision at line with its
previous revision. This is useful to see what actually changed when
the revision denoted on the current line was committed.
@item
Pressing @kbd{L} shows the log of the revision at line. This is
useful to see the author's description of the changes that occured
when the revision denoted on the current line was committed.
@item
Pressing @kbd{W} annotates the workfile (most up to date) version. If
you used @kbd{P} and @kbd{N} to browse to other revisions, use this
key to return to the latest version.
@end itemize
@node Secondary VC Commands
@subsection The Secondary Commands of VC

9
src/.gitignore vendored
View File

@ -1,18 +1,19 @@
*-spd
*.core
*.pdb
.gdb_history
Makefile
Makefile.c
TAGS-LISP
_gdbinit
bootstrap-emacs
config.h
config.stamp
emacs
emacs-*
epaths.h
gdb.ini
obj
prefix-args
stamp-oldxmenu
temacs
_gdbinit
gdb.ini
*-spd
*.pdb

View File

@ -1,3 +1,164 @@
2004-01-21 Stefan Monnier <monnier@iro.umontreal.ca>
* lisp.h [USE_LSB_TAG && !DECL_ALIGN]: Signal an error.
2004-01-21 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* lisp.h: Add undef DECL_ALIGN.
2004-01-21 Stefan Monnier <monnier@iro.umontreal.ca>
* process.c (wait_reading_process_input) [SYNC_INPUT]:
Check interrupt_input_pending explicitly.
* lisp.h (QUIT) [SYNC_INPUT]: Check interrupt_input_pending as well.
* keyboard.c (handle_async_input): New fun,
extracted from input_available_signal.
(input_available_signal, reinvoke_input_signal): Use it.
2004-01-20 Stefan Monnier <monnier@iro.umontreal.ca>
* buffer.c (buffer_defaults, buffer_local_symbols): Use DECL_ALIGN.
* lisp.h [USE_LSB_TAG]: Add definitions for Lisp_Object value
manipulation macros for when tags are in the lower bits.
(struct Lisp_Free) [USE_LSB_TAG]: Add padding.
(DECL_ALIGN): New macro.
(DEFUN): Use it.
* lisp.h [ENABLE_CHECKING]: Don't force union type.
* s/darwin.h (__attribute__): Remove outdated workaround.
* macterm.c (main) [USE_LSB_TAG]: Don't range check the ram.
* alloc.c (lisp_malloc, lisp_align_malloc) [USE_LSB_TAG]:
Don't check range of malloc address.
(pure_alloc) [USE_LSB_TAG]: Enforce alignment.
* process.c (wait_reading_process_input): Lisp_Object/int mixup.
* dired.c (Ffile_attributes): Lisp_Object/int mixup.
2004-01-19 Kenichi Handa <handa@m17n.org>
* fontset.c (fontset_font_pattern): Fix previous change.
2004-01-16 Miles Bader <miles@gnu.ai.mit.edu>
* xdisp.c (Voverflow_newline_into_fringe)
(move_it_in_display_line_to, redisplay_internal)
(update_window_fringes, redisplay_window, display_line, window):
Add `#ifdef HAVE_WINDOW_SYSTEM' around fringe-drawing stuff, so
that it compiles without a window-system.
* dispnew.c (direct_output_for_insert, update_window): Likewise.
2004-01-16 Kim F. Storm <storm@cua.dk>
* buffer.h (struct buffer): New member indicate_buffer_boundaries.
* buffer.c (init_buffer_once): Set buffer_defaults and
buffer_local_flags for indicate_buffer_boundaries.
(syms_of_buffer): Defvar_per_buffer it, and defvar_lisp_nopro
default- variable for it.
* dispextern.h (struct glyph_row): New members left_fringe_bitmap,
right_fringe_bitmap, redraw_fringe_bitmaps_p for new fringe handling.
New members exact_window_width_line_p and cursor_in_fringe_p for
overflowing newlines into right fringe.
New members indicate_bob_p, indicate_top_line_p, indicate_eob_p,
and indicate_bottom_line_p for buffer boundaries and scrolling.
(enum fringe_bitmap_type): Add UP_ARROW_BITMAP, DOWN_ARROW_BITMAP,
FIRST_LINE_BITMAP, LAST_LINE_BITMAP, FILLED_BOX_CURSOR_BITMAP,
HOLLOW_BOX_CURSOR_BITMAP, BAR_CURSOR_BITMAP, HBAR_CURSOR_BITMAP,
and HOLLOW_SQUARE_BITMAP.
(draw_fringe_bitmap, draw_window_fringes, update_window_fringes):
Add prototypes.
* dispnew.c (row_equal_p, update_window_line): Compare fringe bitmaps
instead of related indicator fields.
Compare exact_window_width_line_p and cursor_in_mouse_face_p indicators.
(direct_output_for_insert): Handle exact width lines like
contined lines. Call update_window_fringes.
(update_window): Call update_window_fringes.
(scrolling_window): Don't skip desired rows with changed bitmaps.
Check if fringe bitmaps changes when assigning scrolled rows.
* xdisp.c (Voverflow_newline_into_fringe): New variable.
(IT_OVERFLOW_NEWLINE_INTO_FRINGE): New macro.
(move_it_in_display_line_to): Overflow newline into fringe for
rows that are exactly as wide as the window.
(up_arrow_bits, down_arrow_bits, first_line_bits, last_line_bits)
(filled_box_cursor_bits, hollow_box_cursor_bits, bar_cursor_bits)
(hbar_cursor_bits, hollow_square_bits): New fringe bitmaps.
(fringe_bitmaps): Add new bitmaps.
(draw_fringe_bitmap): Make extern. Remove WHICH arg.
Select proper bitmap for cursor in fringe when appropriate.
Handle alignment of bitmap to top or bottom of row.
(draw_row_fringe_bitmaps): Don't select bitmaps here; that is now
done by update_window_fringes.
(update_window_fringes, draw_window_fringes): New functions.
(redisplay_internal): Call update_window_fringes in case only
cursor row is updated.
(redisplay_window): Call update_window_fringes.
Explicitly call draw_window_fringes if redisplay was done using
the current matrix or the overlay arrow is in the window.
(try_window_reusing_current_matrix): Mark scrolled rows for
fringe update (to update buffer-boundaries / scrolling icons).
(find_last_unchanged_at_beg_row): Handle exact width lines line
continued lines.
(display_line): Overflow newline into fringe for rows that are
exactly as wide as the window. Don't append space for newline
in this case.
(notice_overwritten_cursor): Explicitly clear cursor bitmap
in fringe as if it had been overwritten.
(erase_phys_cursor): Erase cursor bitmap in fringe.
(syms_of_xdisp): Mark show-trailing-whitespace and
void-text-area-pointer as user options.
DEFVAR_LISP Voverflow_newline_into_fringe. Enable by default.
* xterm.c (x_update_window_end): Call draw_window_fringes.
(x_after_update_window_line): Just set redraw_fringe_bitmaps_p
in row instead of actually drawing fringe bitmaps.
(x_draw_fringe_bitmap): Handle bottom aligned bitmaps.
(x_draw_window_cursor): Draw cursor in fringe.
* w32term.c (x_update_window_end): Call draw_window_fringes.
(x_after_update_window_line): Just set redraw_fringe_bitmaps_p
in row instead of actually drawing fringe bitmaps.
(w32_draw_fringe_bitmap): Handle bottom aligned bitmaps.
(w32_draw_window_cursor): Draw cursor in fringe.
* macterm.c (x_update_window_end): Call draw_window_fringes.
(x_after_update_window_line): Just set redraw_fringe_bitmaps_p
in row instead of actually drawing fringe bitmaps.
(x_draw_fringe_bitmap): Handle bottom aligned bitmaps.
(mac_draw_window_cursor): Draw cursor in fringe.
2004-01-16 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* xterm.c (handle_one_xevent): Don't handle characters that are part
of an old style (XLookupString) compose sequence.
2004-01-15 Kenichi Handa <handa@m17n.org>
* search.c (Freplace_match): Use make_multibyte_string or
make_unibyte_string according to the buffer multibyteness.
2004-01-14 Stefan Monnier <monnier@iro.umontreal.ca>
* alloc.c (struct interval_block, struct string_block)
(struct symbol_block, struct marker_block, live_string_p)
(live_cons_p, live_symbol_p, live_float_p, live_misc_p):
Better preserve alignment for objects in blocks.
(FLOAT_BLOCK_SIZE): Adjust for possible alignment padding.
* lread.c (defvar_per_buffer): Remove dead declaration.
* macterm.c (do_check_ram_size): Don't hardcode the lisp address
space size.
2004-01-12 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
* xmenu.c (popup_get_selection): Check new parameter down_on_keypress
@ -61,7 +222,7 @@
* xdisp.c (note_mode_line_or_margin_highlight): Use modified
mode_line_string and marginal_area_string functions to handle
both string object and image object properties.
2004-01-06 Andreas Schwab <schwab@suse.de>
* syntax.c (skip_chars): Treat '-' at end of string as ordinary
@ -69,8 +230,8 @@
2004-01-02 Andreas Schwab <schwab@suse.de>
* macterm.c (emacs_options, x_initialized, same_x_server): Remove
unused (and duplicated) definitions.
* macterm.c (emacs_options, x_initialized, same_x_server):
Remove unused (and duplicated) definitions.
2004-01-02 Kim F. Storm <storm@cua.dk>
@ -100,8 +261,7 @@
2004-01-01 Jason Rumney <jasonr@gnu.org>
* w32term.c (w32_text_out): Use s->font, for consistency with
callers.
* w32term.c (w32_text_out): Use s->font, for consistency with callers.
2003-12-30 Luc Teirlinck <teirllm@auburn.edu>
@ -132,15 +292,13 @@
* fontset.c (Voverriding_fontspec_alist): New variable.
(lookup_overriding_fontspec): New function.
(fontset_ref_via_base): Call lookup_overriding_fontspec if
necessary.
(fontset_ref_via_base): Call lookup_overriding_fontspec if necessary.
(fontset_font_pattern): Likewise.
(regulalize_fontname): New function.
(Fset_fontset_font): Call regulalize_fontname.
(Fset_overriding_fontspec_internal): New function.
(syms_of_fontset): Initialize and staticprop
Voverriding_fontspec_alist. Defsubr
Sset_overriding_fontspec_internal.
(syms_of_fontset): Initialize and staticpro Voverriding_fontspec_alist.
Defsubr Sset_overriding_fontspec_internal.
* xfaces.c (face_font_available_p): New function.
@ -197,7 +355,7 @@
(Vvoid_text_area_pointer): Replace Vshow_text_cursor_in_void.
(QCmap, QCpointer, Qrect, Qcircle, Qpoly): New variables for
image maps.
(x_y_to_hpos_vpos): Return glyph relative coordinates through
(x_y_to_hpos_vpos): Return glyph relative coordinates through
new dx and dy args.
Remove buffer_only_p arg (always 0). Simplify code accordingly.
(get_glyph_string_clip_rect): Draw cursor using glyph's rather
@ -207,9 +365,9 @@
(produce_image_glyph): Adjust it.ascent to minimum row ascent if
image glyph is alone on the last line.
(append_glyph, append_composite_glyph, produce_image_glyph)
(append_stretch_glyph): Set glyph's ascent and descent.
(append_stretch_glyph): Set glyph's ascent and descent.
(on_hot_spot_p): New function to check if position is inside an
rectangular, circular, or polygon-shaped image hot-spot,
rectangular, circular, or polygon-shaped image hot-spot,
(find_hot_spot): New function to search for image hot-spot.
(Flookup_image_map): New defun to search for image hot-spot.
(define_frame_cursor1): New aux function to determine frame pointer.
@ -277,8 +435,7 @@
(Fread_minibuffer, Fread_no_blanks_input): Adapt to changes in
read_minibuf.
(Fcompleting_read): Delete code moved into read_minibuf.
(Ftest_completion): Make it handle obarrays and hash tables
correctly.
(Ftest_completion): Make it handle obarrays and hash tables correctly.
2003-12-03 Kenichi Handa <handa@m17n.org>
@ -429,10 +586,8 @@
2003-11-22 Lars Hansen <larsh@math.ku.dk>
* w32.c (struct the_group): Added.
(getgrgid): Added.
* mac.c (struct my_group): Added.
(getgrgid): Added.
* w32.c (struct the_group, getgrgid): Add.
* mac.c (struct my_group, getgrgid): Add.
2003-11-21 Luc Teirlinck <teirllm@auburn.edu>
@ -440,18 +595,19 @@
2003-11-21 Lars Hansen <larsh@math.ku.dk>
* dired.c (Ffile_attributes): Parameter ID-FORMAT added and
included in call to file name handler. Numeric UID and GID
optionally translated to strings. Docstring updated.
(directory_files_internal): Parameter ID-FORMAT added.
(Fdirectory_files_and_attributes): Parameter ID-FORMAT added and
included in call to file name handler and call to
directory_files_internal. Docstring updated. (Fdirectory_files):
Dummy parameter added in call to directory_files_internal.
* lisp.h (Qinteger): Added. (Qinteger_or_floatp,
Qinteger_or_float_or_marker_p): Removed. (Ffile_attributes):
Parameter added.
* data.c (Qinteger): Exported.
* dired.c (Ffile_attributes): Add parameter ID-FORMAT and
include in call to file name handler. Optionally translate numeric
UID and GID to strings. Update docstring.
(directory_files_internal): Add parameter ID-FORMAT.
(Fdirectory_files_and_attributes): Add parameter ID-FORMAT and
include in call to file name handler and call to
directory_files_internal. Update Docstring.
(Fdirectory_files): Add dummy parameter in call to
directory_files_internal.
* lisp.h (Qinteger): Add.
(Qinteger_or_floatp, Qinteger_or_float_or_marker_p): Remove.
(Ffile_attributes): Add parameter.
* data.c (Qinteger): Export.
2003-11-21 Luc Teirlinck <teirllm@auburn.edu>
@ -1788,7 +1944,7 @@
* gtkutil.c: Include keyboard.h, charset.h, coding.h.
(xg_create_frame_widgets): Use ENCODE_UTF_8.
* xterm.c (Qutf_8): Moved to coding.c
* xterm.c (Qutf_8): Move to coding.c
* xmenu.c (ENCODE_MENU_STRING): New.
(list_of_panes, list_of_items, digest_single_submenu, xmenu_show):

View File

@ -1,5 +1,5 @@
/* Storage allocation and gc for GNU Emacs Lisp interpreter.
Copyright (C) 1985, 86, 88, 93, 94, 95, 97, 98, 1999, 2000, 2001, 2002, 2003
Copyright (C) 1985,86,88,93,94,95,97,98,1999,2000,01,02,03,2004
Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -599,6 +599,7 @@ lisp_malloc (nbytes, type)
val = (void *) malloc (nbytes);
#ifndef USE_LSB_TAG
/* If the memory just allocated cannot be addressed thru a Lisp
object's pointer, and it needs to be,
that's equivalent to running out of memory. */
@ -613,6 +614,7 @@ lisp_malloc (nbytes, type)
val = 0;
}
}
#endif
#if GC_MARK_STACK && !defined GC_MALLOC_CHECK
if (val && type != MEM_TYPE_NON_LISP)
@ -773,6 +775,7 @@ lisp_align_malloc (nbytes, type)
mallopt (M_MMAP_MAX, MMAP_MAX_AREAS);
#endif
#ifndef USE_LSB_TAG
/* If the memory just allocated cannot be addressed thru a Lisp
object's pointer, and it needs to be, that's equivalent to
running out of memory. */
@ -789,6 +792,7 @@ lisp_align_malloc (nbytes, type)
memory_full ();
}
}
#endif
/* Initialize the blocks and put them on the free list.
Is `base' was not properly aligned, we can't use the last block. */
@ -1105,8 +1109,9 @@ uninterrupt_malloc ()
struct interval_block
{
struct interval_block *next;
/* Place `intervals' first, to preserve alignment. */
struct interval intervals[INTERVAL_BLOCK_SIZE];
struct interval_block *next;
};
/* Current interval block. Its `next' pointer points to older
@ -1344,8 +1349,9 @@ struct sblock
struct string_block
{
struct string_block *next;
/* Place `strings' first, to preserve alignment. */
struct Lisp_String strings[STRING_BLOCK_SIZE];
struct string_block *next;
};
/* Head and tail of the list of sblock structures holding Lisp string
@ -2126,8 +2132,10 @@ make_uninit_multibyte_string (nchars, nbytes)
by GC are put on a free list to be reallocated before allocating
any new float cells from the latest float_block. */
#define FLOAT_BLOCK_SIZE \
(((BLOCK_BYTES - sizeof (struct float_block *)) * CHAR_BIT) \
#define FLOAT_BLOCK_SIZE \
(((BLOCK_BYTES - sizeof (struct float_block *) \
/* The compiler might add padding at the end. */ \
- (sizeof (struct Lisp_Float) - sizeof (int))) * CHAR_BIT) \
/ (sizeof (struct Lisp_Float) * CHAR_BIT + 1))
#define GETMARKBIT(block,n) \
@ -2754,8 +2762,9 @@ usage: (make-byte-code ARGLIST BYTE-CODE CONSTANTS DEPTH &optional DOCSTRING INT
struct symbol_block
{
struct symbol_block *next;
/* Place `symbols' first, to preserve alignment. */
struct Lisp_Symbol symbols[SYMBOL_BLOCK_SIZE];
struct symbol_block *next;
};
/* Current symbol block and index of first unused Lisp_Symbol
@ -2846,8 +2855,9 @@ Its value and function definition are void, and its property list is nil. */)
struct marker_block
{
struct marker_block *next;
/* Place `markers' first, to preserve alignment. */
union Lisp_Misc markers[MARKER_BLOCK_SIZE];
struct marker_block *next;
};
struct marker_block *marker_block;
@ -3428,6 +3438,7 @@ live_string_p (m, p)
must not be on the free-list. */
return (offset >= 0
&& offset % sizeof b->strings[0] == 0
&& offset < (STRING_BLOCK_SIZE * sizeof b->strings[0])
&& ((struct Lisp_String *) p)->data != NULL);
}
else
@ -3452,8 +3463,8 @@ live_cons_p (m, p)
one of the unused cells in the current cons block,
and not be on the free-list. */
return (offset >= 0
&& offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
&& offset % sizeof b->conses[0] == 0
&& offset < (CONS_BLOCK_SIZE * sizeof b->conses[0])
&& (b != cons_block
|| offset / sizeof b->conses[0] < cons_block_index)
&& !EQ (((struct Lisp_Cons *) p)->car, Vdead));
@ -3481,6 +3492,7 @@ live_symbol_p (m, p)
and not be on the free-list. */
return (offset >= 0
&& offset % sizeof b->symbols[0] == 0
&& offset < (SYMBOL_BLOCK_SIZE * sizeof b->symbols[0])
&& (b != symbol_block
|| offset / sizeof b->symbols[0] < symbol_block_index)
&& !EQ (((struct Lisp_Symbol *) p)->function, Vdead));
@ -3506,8 +3518,8 @@ live_float_p (m, p)
/* P must point to the start of a Lisp_Float and not be
one of the unused cells in the current float block. */
return (offset >= 0
&& offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
&& offset % sizeof b->floats[0] == 0
&& offset < (FLOAT_BLOCK_SIZE * sizeof b->floats[0])
&& (b != float_block
|| offset / sizeof b->floats[0] < float_block_index));
}
@ -3534,6 +3546,7 @@ live_misc_p (m, p)
and not be on the free-list. */
return (offset >= 0
&& offset % sizeof b->markers[0] == 0
&& offset < (MARKER_BLOCK_SIZE * sizeof b->markers[0])
&& (b != marker_block
|| offset / sizeof b->markers[0] < marker_block_index)
&& ((union Lisp_Misc *) p)->u_marker.type != Lisp_Misc_Free);
@ -4068,6 +4081,9 @@ pure_alloc (size, type)
int type;
{
POINTER_TYPE *result;
#ifdef USE_LSB_TAG
size_t alignment = (1 << GCTYPEBITS);
#else
size_t alignment = sizeof (EMACS_INT);
/* Give Lisp_Floats an extra alignment. */
@ -4079,6 +4095,7 @@ pure_alloc (size, type)
alignment = sizeof (struct Lisp_Float);
#endif
}
#endif
again:
result = ALIGN (purebeg + pure_bytes_used, alignment);

View File

@ -1,5 +1,5 @@
/* Buffer manipulation primitives for GNU Emacs.
Copyright (C) 1985,86,87,88,89,93,94,95,97,98, 1999, 2000, 2001, 02, 2003
Copyright (C) 1985,86,87,88,89,93,94,95,97,98, 1999, 2000, 2001, 02, 03, 2004
Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -67,7 +67,7 @@ struct buffer *all_buffers;
Setting the default value also goes through the alist of buffers
and stores into each buffer that does not say it has a local value. */
struct buffer buffer_defaults;
DECL_ALIGN (struct buffer, buffer_defaults);
/* A Lisp_Object pointer to the above, used for staticpro */
@ -97,7 +97,8 @@ struct buffer buffer_local_flags;
/* This structure holds the names of symbols whose values may be
buffer-local. It is indexed and accessed in the same way as the above. */
struct buffer buffer_local_symbols;
DECL_ALIGN (struct buffer, buffer_local_symbols);
/* A Lisp_Object pointer to the above, used for staticpro */
static Lisp_Object Vbuffer_local_symbols;
@ -4959,6 +4960,7 @@ init_buffer_once ()
buffer_defaults.scroll_bar_width = Qnil;
buffer_defaults.vertical_scroll_bar_type = Qt;
buffer_defaults.indicate_empty_lines = Qnil;
buffer_defaults.indicate_buffer_boundaries = Qnil;
buffer_defaults.scroll_up_aggressively = Qnil;
buffer_defaults.scroll_down_aggressively = Qnil;
buffer_defaults.display_time = Qnil;
@ -5028,6 +5030,7 @@ init_buffer_once ()
XSETFASTINT (buffer_local_flags.scroll_bar_width, idx); ++idx;
XSETFASTINT (buffer_local_flags.vertical_scroll_bar_type, idx); ++idx;
XSETFASTINT (buffer_local_flags.indicate_empty_lines, idx); ++idx;
XSETFASTINT (buffer_local_flags.indicate_buffer_boundaries, idx); ++idx;
XSETFASTINT (buffer_local_flags.scroll_up_aggressively, idx); ++idx;
XSETFASTINT (buffer_local_flags.scroll_down_aggressively, idx); ++idx;
XSETFASTINT (buffer_local_flags.header_line_format, idx); ++idx;
@ -5316,6 +5319,11 @@ This is the same as (default-value 'vertical-scroll-bar). */);
doc: /* Default value of `indicate-empty-lines' for buffers that don't override it.
This is the same as (default-value 'indicate-empty-lines). */);
DEFVAR_LISP_NOPRO ("default-indicate-buffer-boundaries",
&buffer_defaults.indicate_buffer_boundaries,
doc: /* Default value of `indicate-buffer-boundaries' for buffers that don't override it.
This is the same as (default-value 'indicate-buffer-boundaries). */);
DEFVAR_LISP_NOPRO ("default-scroll-up-aggressively",
&buffer_defaults.scroll_up_aggressively,
doc: /* Default value of `scroll-up-aggressively'.
@ -5626,6 +5634,14 @@ A value of t means to use the vertical scroll bar type from the window's frame.
If non-nil, a bitmap is displayed in the left fringe of a window on
window-systems. */);
DEFVAR_PER_BUFFER ("indicate-buffer-boundaries",
&current_buffer->indicate_buffer_boundaries, Qnil,
doc: /* *Visually indicate buffer boundaries and scrolling.
If non-nil, the first and last line of the buffer are marked in the left and
right fringe of a window on window-systems.
In addition, if value is t, the top and bottom line of the window are marked
with up and down arrow bitmaps in the right fringe if window can be scrolled. */);
DEFVAR_PER_BUFFER ("scroll-up-aggressively",
&current_buffer->scroll_up_aggressively, Qnil,
doc: /* How far to scroll windows upward.

View File

@ -733,6 +733,9 @@ struct buffer
like vi). */
Lisp_Object indicate_empty_lines;
/* Non-nil means indicate buffer boundaries and scrolling. */
Lisp_Object indicate_buffer_boundaries;
/* Time stamp updated each time this buffer is displayed in a window. */
Lisp_Object display_time;

View File

@ -1,5 +1,5 @@
/* Lisp functions for making directory listings.
Copyright (C) 1985, 1986, 1993, 1994, 1999, 2000, 2001
Copyright (C) 1985, 1986, 1993, 1994, 1999, 2000, 2001, 2004
Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -941,9 +941,9 @@ Elements of the attribute list are:
else
{
pw = (struct passwd *) getpwuid (s.st_uid);
values[2] = (pw ? build_string (pw->pw_name) : s.st_uid);
values[2] = (pw ? build_string (pw->pw_name) : make_number (s.st_uid));
gr = (struct group *) getgrgid (s.st_gid);
values[3] = (gr ? build_string (gr->gr_name) : s.st_gid);
values[3] = (gr ? build_string (gr->gr_name) : make_number (s.st_gid));
}
values[4] = make_time (s.st_atime);
values[5] = make_time (s.st_mtime);

View File

@ -709,6 +709,15 @@ struct glyph_row
position of the next row. */
struct display_pos end;
/* Left fringe bitmap number (enum fringe_bitmap_type). */
unsigned left_fringe_bitmap : 4;
/* Right fringe bitmap number (enum fringe_bitmap_type). */
unsigned right_fringe_bitmap : 4;
/* 1 means that we must draw the bitmaps of this row. */
unsigned redraw_fringe_bitmaps_p : 1;
/* In a desired matrix, 1 means that this row must be updated. In a
current matrix, 0 means that the row has been invalidated, i.e.
the row's contents do not agree with what is visible on the
@ -777,6 +786,29 @@ struct glyph_row
/* 1 means this row was ended by a newline from a string. */
unsigned ends_in_newline_from_string_p : 1;
/* 1 means this row width is exactly the width of the window, and the
final newline character is hidden in the right fringe. */
unsigned exact_window_width_line_p : 1;
/* 1 means this row currently shows the cursor in the right fringe. */
unsigned cursor_in_fringe_p : 1;
/* Non-zero means display a bitmap on X frames indicating that this
the first line of the buffer. */
unsigned indicate_bob_p : 1;
/* Non-zero means display a bitmap on X frames indicating that this
the top line of the window, but not start of the buffer. */
unsigned indicate_top_line_p : 1;
/* Non-zero means display a bitmap on X frames indicating that this
the last line of the buffer. */
unsigned indicate_eob_p : 1;
/* Non-zero means display a bitmap on X frames indicating that this
the bottom line of the window, but not end of the buffer. */
unsigned indicate_bottom_line_p : 1;
/* Continuation lines width at the start of the row. */
int continuation_lines_width;
};
@ -1582,10 +1614,19 @@ enum fringe_bitmap_type
NO_FRINGE_BITMAP = 0,
LEFT_TRUNCATION_BITMAP,
RIGHT_TRUNCATION_BITMAP,
UP_ARROW_BITMAP,
DOWN_ARROW_BITMAP,
CONTINUED_LINE_BITMAP,
CONTINUATION_LINE_BITMAP,
OVERLAY_ARROW_BITMAP,
FIRST_LINE_BITMAP,
LAST_LINE_BITMAP,
FILLED_BOX_CURSOR_BITMAP,
HOLLOW_BOX_CURSOR_BITMAP,
BAR_CURSOR_BITMAP,
HBAR_CURSOR_BITMAP,
ZV_LINE_BITMAP,
HOLLOW_SQUARE_BITMAP,
MAX_FRINGE_BITMAPS
};
@ -2485,7 +2526,10 @@ void move_it_past_eol P_ ((struct it *));
int in_display_vector_p P_ ((struct it *));
int frame_mode_line_height P_ ((struct frame *));
void highlight_trailing_whitespace P_ ((struct frame *, struct glyph_row *));
void draw_fringe_bitmap P_ ((struct window *, struct glyph_row *, int));
void draw_row_fringe_bitmaps P_ ((struct window *, struct glyph_row *));
void draw_window_fringes P_ ((struct window *));
int update_window_fringes P_ ((struct window *, int));
void compute_fringe_widths P_ ((struct frame *, int));
extern Lisp_Object Qtool_bar;
extern Lisp_Object Vshow_trailing_whitespace;

View File

@ -1,5 +1,5 @@
/* Updating of data structures for redisplay.
Copyright (C) 1985,86,87,88,93,94,95,97,98,1999,2000,01,02,2003
Copyright (C) 1985,86,87,88,93,94,95,97,98,1999,2000,01,02,03,04
Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -1500,12 +1500,11 @@ row_equal_p (w, a, b, mouse_face_p)
return 0;
}
if (a->truncated_on_left_p != b->truncated_on_left_p
|| a->fill_line_p != b->fill_line_p
|| a->truncated_on_right_p != b->truncated_on_right_p
|| a->overlay_arrow_p != b->overlay_arrow_p
|| a->continued_p != b->continued_p
|| a->indicate_empty_line_p != b->indicate_empty_line_p
if (a->fill_line_p != b->fill_line_p
|| a->cursor_in_fringe_p != b->cursor_in_fringe_p
|| a->left_fringe_bitmap != b->left_fringe_bitmap
|| a->right_fringe_bitmap != b->right_fringe_bitmap
|| a->exact_window_width_line_p != b->exact_window_width_line_p
|| a->overlapped_p != b->overlapped_p
|| (MATRIX_ROW_CONTINUATION_LINE_P (a)
!= MATRIX_ROW_CONTINUATION_LINE_P (b))
@ -3442,6 +3441,7 @@ direct_output_for_insert (g)
/* Can't do it in a continued line because continuation
lines would change. */
(glyph_row->continued_p
|| glyph_row->exact_window_width_line_p
/* Can't use this method if the line overlaps others or is
overlapped by others because these other lines would
have to be redisplayed. */
@ -3647,6 +3647,10 @@ direct_output_for_insert (g)
cursor_to (y, x);
}
#ifdef HAVE_WINDOW_SYSTEM
update_window_fringes (w, 0);
#endif
if (FRAME_RIF (f))
FRAME_RIF (f)->update_window_end_hook (w, 1, 0);
update_end (f);
@ -4194,6 +4198,10 @@ update_window (w, force_p)
strcpy (w->current_matrix->method, w->desired_matrix->method);
#endif
#ifdef HAVE_WINDOW_SYSTEM
update_window_fringes (w, 0);
#endif
/* End the update of window W. Don't set the cursor if we
paused updating the display because in this case,
set_window_cursor_after_update hasn't been called, and
@ -4515,13 +4523,10 @@ update_window_line (w, vpos, mouse_face_overwritten_p)
if (!current_row->enabled_p
|| desired_row->y != current_row->y
|| desired_row->visible_height != current_row->visible_height
|| desired_row->overlay_arrow_p != current_row->overlay_arrow_p
|| desired_row->truncated_on_left_p != current_row->truncated_on_left_p
|| desired_row->truncated_on_right_p != current_row->truncated_on_right_p
|| desired_row->continued_p != current_row->continued_p
|| desired_row->cursor_in_fringe_p != current_row->cursor_in_fringe_p
|| current_row->redraw_fringe_bitmaps_p
|| desired_row->mode_line_p != current_row->mode_line_p
|| (desired_row->indicate_empty_line_p
!= current_row->indicate_empty_line_p)
|| desired_row->exact_window_width_line_p != current_row->exact_window_width_line_p
|| (MATRIX_ROW_CONTINUATION_LINE_P (desired_row)
!= MATRIX_ROW_CONTINUATION_LINE_P (current_row)))
rif->after_update_window_line_hook (desired_row);
@ -4776,6 +4781,7 @@ scrolling_window (w, header_line_p)
if (c->enabled_p
&& d->enabled_p
&& !d->redraw_fringe_bitmaps_p
&& c->y == d->y
&& MATRIX_ROW_BOTTOM_Y (c) <= yb
&& MATRIX_ROW_BOTTOM_Y (d) <= yb
@ -4831,6 +4837,7 @@ scrolling_window (w, header_line_p)
&& MATRIX_ROW (current_matrix, i - 1)->enabled_p
&& (MATRIX_ROW (current_matrix, i - 1)->y
== MATRIX_ROW (desired_matrix, j - 1)->y)
&& !MATRIX_ROW (desired_matrix, j - 1)->redraw_fringe_bitmaps_p
&& row_equal_p (w,
MATRIX_ROW (desired_matrix, i - 1),
MATRIX_ROW (current_matrix, j - 1), 1))
@ -5023,6 +5030,10 @@ scrolling_window (w, header_line_p)
to = MATRIX_ROW (current_matrix, r->desired_vpos + j);
from = MATRIX_ROW (desired_matrix, r->desired_vpos + j);
to_overlapped_p = to->overlapped_p;
if (!from->mode_line_p && !w->pseudo_window_p
&& (to->left_fringe_bitmap != from->left_fringe_bitmap
|| to->right_fringe_bitmap != from->right_fringe_bitmap))
from->redraw_fringe_bitmaps_p = 1;
assign_row (to, from);
to->enabled_p = 1, from->enabled_p = 0;
to->overlapped_p = to_overlapped_p;

View File

@ -599,7 +599,8 @@ fontset_font_pattern (f, id, c)
fontset = FONTSET_FROM_ID (id);
xassert (!BASE_FONTSET_P (fontset));
fontset = FONTSET_BASE (fontset);
elt = FONTSET_REF (fontset, c);
if (! EQ (fontset, Vdefault_fontset))
elt = FONTSET_REF (fontset, c);
}
if (NILP (elt))
{

View File

@ -1,5 +1,5 @@
/* Keyboard and mouse input; editor command loop.
Copyright (C) 1985,86,87,88,89,93,94,95,96,97,99,2000,01,02,03
Copyright (C) 1985,86,87,88,89,93,94,95,96,97,99,2000,01,02,03,04
Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -470,36 +470,6 @@ extern char *pending_malloc_warning;
static struct input_event kbd_buffer[KBD_BUFFER_SIZE];
/* Vector to GCPRO the Lisp objects referenced from kbd_buffer.
The interrupt-level event handlers will never enqueue an event on a
frame which is not in Vframe_list, and once an event is dequeued,
internal_last_event_frame or the event itself points to the frame.
So that's all fine.
But while the event is sitting in the queue, it's completely
unprotected. Suppose the user types one command which will run for
a while and then delete a frame, and then types another event at
the frame that will be deleted, before the command gets around to
it. Suppose there are no references to this frame elsewhere in
Emacs, and a GC occurs before the second event is dequeued. Now we
have an event referring to a freed frame, which will crash Emacs
when it is dequeued.
Similar things happen when an event on a scroll bar is enqueued; the
window may be deleted while the event is in the queue.
So, we use this vector to protect the Lisp_Objects in the event
queue. That way, they'll be dequeued as dead frames or windows,
but still valid Lisp objects.
If kbd_buffer[i].kind != NO_EVENT, then
AREF (kbd_buffer_gcpro, 2 * i) == kbd_buffer[i].frame_or_window.
AREF (kbd_buffer_gcpro, 2 * i + 1) == kbd_buffer[i].arg. */
static Lisp_Object kbd_buffer_gcpro;
/* Pointer to next available character in kbd_buffer.
If kbd_fetch_ptr == kbd_store_ptr, the buffer is empty.
This may be kbd_buffer + KBD_BUFFER_SIZE, meaning that the
@ -3630,7 +3600,6 @@ kbd_buffer_store_event (event)
Discard the event if it would fill the last slot. */
if (kbd_fetch_ptr - 1 != kbd_store_ptr)
{
int idx;
#if 0 /* The SELECTION_REQUEST_EVENT case looks bogus, and it's error
prone to assign individual members for other events, in case
@ -3660,9 +3629,6 @@ kbd_buffer_store_event (event)
*kbd_store_ptr = *event;
#endif
idx = 2 * (kbd_store_ptr - kbd_buffer);
ASET (kbd_buffer_gcpro, idx, event->frame_or_window);
ASET (kbd_buffer_gcpro, idx + 1, event->arg);
++kbd_store_ptr;
}
}
@ -3778,9 +3744,6 @@ static INLINE void
clear_event (event)
struct input_event *event;
{
int idx = 2 * (event - kbd_buffer);
ASET (kbd_buffer_gcpro, idx, Qnil);
ASET (kbd_buffer_gcpro, idx + 1, Qnil);
event->kind = NO_EVENT;
}
@ -6805,31 +6768,13 @@ tty_read_avail_input (struct display *display,
#endif /* not VMS */
#ifdef SIGIO /* for entire page */
/* Note SIGIO has been undef'd if FIONREAD is missing. */
static SIGTYPE
input_available_signal (signo)
int signo;
void
handle_async_input ()
{
/* Must preserve main program's value of errno. */
int old_errno = errno;
#ifdef BSD4_1
extern int select_alarmed;
#endif
#if defined (USG) && !defined (POSIX_SIGNALS)
/* USG systems forget handlers when they are used;
must reestablish each time */
signal (signo, input_available_signal);
#endif /* USG */
#ifdef BSD4_1
sigisheld (SIGIO);
#endif
if (input_available_clear_time)
EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
interrupt_input_pending = 0;
while (1)
{
@ -6845,6 +6790,36 @@ input_available_signal (signo)
select_alarmed = 1; /* Force the select emulator back to life */
#endif
}
}
#ifdef SIGIO /* for entire page */
/* Note SIGIO has been undef'd if FIONREAD is missing. */
static SIGTYPE
input_available_signal (signo)
int signo;
{
/* Must preserve main program's value of errno. */
int old_errno = errno;
#if defined (USG) && !defined (POSIX_SIGNALS)
/* USG systems forget handlers when they are used;
must reestablish each time */
signal (signo, input_available_signal);
#endif /* USG */
#ifdef BSD4_1
sigisheld (SIGIO);
#endif
if (input_available_clear_time)
EMACS_SET_SECS_USECS (*input_available_clear_time, 0, 0);
#ifdef SYNC_INPUT
interrupt_input_pending = 1;
#else
handle_async_input ();
#endif
#ifdef BSD4_1
sigfree ();
@ -6863,7 +6838,7 @@ void
reinvoke_input_signal ()
{
#ifdef SIGIO
kill (getpid (), SIGIO);
handle_async_input ();
#endif
}
@ -10123,7 +10098,6 @@ Also end any kbd macro being defined. */)
discard_tty_input ();
kbd_fetch_ptr = kbd_store_ptr;
Ffillarray (kbd_buffer_gcpro, Qnil);
input_pending = 0;
return Qnil;
@ -10217,17 +10191,13 @@ stuff_buffered_input (stuffstring)
Should we ignore anything that was typed in at the "wrong" kboard? */
for (; kbd_fetch_ptr != kbd_store_ptr; kbd_fetch_ptr++)
{
int idx;
if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
kbd_fetch_ptr = kbd_buffer;
if (kbd_fetch_ptr->kind == ASCII_KEYSTROKE_EVENT)
stuff_char (kbd_fetch_ptr->code);
kbd_fetch_ptr->kind = NO_EVENT;
idx = 2 * (kbd_fetch_ptr - kbd_buffer);
ASET (kbd_buffer_gcpro, idx, Qnil);
ASET (kbd_buffer_gcpro, idx + 1, Qnil);
clear_event (kbd_fetch_ptr);
}
input_pending = 0;
@ -10679,7 +10649,6 @@ init_keyboard ()
recent_keys_index = 0;
kbd_fetch_ptr = kbd_buffer;
kbd_store_ptr = kbd_buffer;
kbd_buffer_gcpro = Fmake_vector (make_number (2 * KBD_BUFFER_SIZE), Qnil);
#ifdef HAVE_MOUSE
do_mouse_tracking = Qnil;
#endif
@ -10976,9 +10945,6 @@ syms_of_keyboard ()
Fset (Qextended_command_history, Qnil);
staticpro (&Qextended_command_history);
kbd_buffer_gcpro = Fmake_vector (make_number (2 * KBD_BUFFER_SIZE), Qnil);
staticpro (&kbd_buffer_gcpro);
accent_key_syms = Qnil;
staticpro (&accent_key_syms);

View File

@ -1,5 +1,5 @@
/* Fundamental definitions for GNU Emacs Lisp interpreter.
Copyright (C) 1985,86,87,93,94,95,97,98,1999,2000, 2001, 2002, 2003
Copyright (C) 1985,86,87,93,94,95,97,98,1999,2000,01,02,03,2004
Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -67,10 +67,6 @@ extern void die P_((const char *, const char *, int));
? (void) 0 \
: die ((msg), __FILE__, __LINE__)), \
0)
/* Let's get some compile-time checking too. */
#undef NO_UNION_TYPE
#else
/* Produce same side effects and result, but don't complain. */
@ -292,6 +288,28 @@ enum pvec_type
/* For convenience, we also store the number of elements in these bits. */
#define PSEUDOVECTOR_SIZE_MASK 0x1ff
/***** Select the tagging scheme. *****/
/* First, try and define DECL_ALIGN(type,var) which declares a static
variable VAR of type TYPE with the added requirement that it be
TYPEBITS-aligned. */
#if defined USE_LSB_TAG && !defined DECL_ALIGN
/* What compiler directive should we use for non-gcc compilers? -stef */
# if defined (__GNUC__)
# define DECL_ALIGN(type, var) \
type __attribute__ ((__aligned__ (1 << GCTYPEBITS))) var
# else
# error "USE_LSB_TAG used without defining DECL_ALIGN"
# endif
#endif
#ifndef USE_LSB_TAG
/* Just remove the alignment annotation if we don't use it. */
#undef DECL_ALIGN
#define DECL_ALIGN(type, var) type var
#endif
/* These macros extract various sorts of values from a Lisp_Object.
For example, if tem is a Lisp_Object whose type is Lisp_Cons,
@ -299,6 +317,27 @@ enum pvec_type
#ifdef NO_UNION_TYPE
#ifdef USE_LSB_TAG
#define TYPEMASK ((((EMACS_INT) 1) << GCTYPEBITS) - 1)
#define XTYPE(a) ((enum Lisp_Type) (((EMACS_UINT) (a)) & TYPEMASK))
#define XINT(a) (((EMACS_INT) (a)) >> GCTYPEBITS)
#define XUINT(a) (((EMACS_UINT) (a)) >> GCTYPEBITS)
#define XSET(var, type, ptr) \
(eassert (XTYPE (ptr) == 0), /* Check alignment. */ \
(var) = ((EMACS_INT) (type)) | ((EMACS_INT) (ptr)))
#define make_number(N) (((EMACS_INT) (N)) << GCTYPEBITS)
/* XFASTINT and XSETFASTINT are for use when the integer is known to be
positive, in which case the implementation can sometimes be faster
depending on the tagging scheme. With USE_LSB_TAG, there's no benefit. */
#define XFASTINT(a) XINT (a)
#define XSETFASTINT(a, b) ((a) = make_number (b))
#define XPNTR(a) ((EMACS_INT) ((a) & ~TYPEMASK))
#else /* not USE_LSB_TAG */
#define VALMASK ((((EMACS_INT) 1) << VALBITS) - 1)
/* One need to override this if there must be high bits set in data space
@ -337,6 +376,8 @@ enum pvec_type
#define make_number(N) \
((((EMACS_INT) (N)) & VALMASK) | ((EMACS_INT) Lisp_Int) << VALBITS)
#endif /* not USE_LSB_TAG */
#define EQ(x, y) ((x) == (y))
#else /* not NO_UNION_TYPE */
@ -1150,6 +1191,13 @@ struct Lisp_Free
unsigned gcmarkbit : 1;
int spacer : 15;
union Lisp_Misc *chain;
#ifdef USE_LSB_TAG
/* Try to make sure that sizeof(Lisp_Misc) preserves TYPEBITS-alignment.
This assumes that Lisp_Marker is the largest of the alternatives and
that Lisp_Intfwd has the same size as "Lisp_Free w/o padding". */
char padding[((((sizeof (struct Lisp_Marker) - 1) >> GCTYPEBITS) + 1)
<< GCTYPEBITS) - sizeof (struct Lisp_Intfwd)];
#endif
};
/* To get the type field of a union Lisp_Misc, use XMISCTYPE.
@ -1517,7 +1565,7 @@ typedef unsigned char UCHAR;
#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \
Lisp_Object fnname (); \
struct Lisp_Subr sname = \
DECL_ALIGN (struct Lisp_Subr, sname) = \
{ PVEC_SUBR | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)), \
fnname, minargs, maxargs, lname, prompt, 0}; \
Lisp_Object fnname
@ -1528,7 +1576,7 @@ typedef unsigned char UCHAR;
arguments, so we can catch errors with maxargs at compile-time. */
#define DEFUN(lname, fnname, sname, minargs, maxargs, prompt, doc) \
Lisp_Object fnname DEFUN_ARGS_ ## maxargs ; \
struct Lisp_Subr sname = \
DECL_ALIGN (struct Lisp_Subr, sname) = \
{ PVEC_SUBR | (sizeof (struct Lisp_Subr) / sizeof (EMACS_INT)), \
fnname, minargs, maxargs, lname, prompt, 0}; \
Lisp_Object fnname
@ -1675,6 +1723,22 @@ extern char *stack_bottom;
This is a good thing to do around a loop that has no side effects
and (in particular) cannot call arbitrary Lisp code. */
#ifdef SYNC_INPUT
extern void handle_async_input P_ ((void));
extern int interrupt_input_pending;
#define QUIT \
do { \
if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
{ \
Vquit_flag = Qnil; \
Fsignal (Qquit, Qnil); \
} \
else if (interrupt_input_pending) \
handle_async_input (); \
} while (0)
#else /* not SYNC_INPUT */
#define QUIT \
do { \
if (!NILP (Vquit_flag) && NILP (Vinhibit_quit)) \
@ -1684,6 +1748,9 @@ extern char *stack_bottom;
} \
} while (0)
#endif /* not SYNC_INPUT */
/* Nonzero if ought to quit now. */
#define QUITP (!NILP (Vquit_flag) && NILP (Vinhibit_quit))

View File

@ -1,5 +1,5 @@
/* Lisp parsing and input streams.
Copyright (C) 1985, 86, 87, 88, 89, 93, 94, 95, 97, 98, 99, 2000, 01, 2003
Copyright (C) 1985,86,87,88,89,93,94,95,97,98,99,2000,01,03,2004
Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -3496,7 +3496,6 @@ defvar_per_buffer (namestring, address, type, doc)
{
Lisp_Object sym, val;
int offset;
extern struct buffer buffer_local_symbols;
sym = intern (namestring);
val = allocate_misc ();

View File

@ -1143,6 +1143,9 @@ x_update_window_end (w, cursor_on_p, mouse_face_overwritten_p)
output_cursor.x, output_cursor.y);
x_draw_vertical_border (w);
draw_window_fringes (w);
UNBLOCK_INPUT;
}
@ -1239,11 +1242,7 @@ x_after_update_window_line (desired_row)
xassert (w);
if (!desired_row->mode_line_p && !w->pseudo_window_p)
{
BLOCK_INPUT;
draw_row_fringe_bitmaps (w, desired_row);
UNBLOCK_INPUT;
}
desired_row->redraw_fringe_bitmaps_p = 1;
/* When a window has disappeared, make sure that no rest of
full-width rows stays visible in the internal border. Could
@ -1295,9 +1294,24 @@ x_draw_fringe_bitmap (w, row, p)
XGCValues gcv;
GC gc = f->output_data.mac->normal_gc;
struct face *face = p->face;
int rowY;
/* Must clip because of partially visible lines. */
x_clip_to_row (w, row, gc);
rowY = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
if (p->y < rowY)
{
/* Adjust position of "bottom aligned" bitmap on partially
visible last row. */
int oldY = row->y;
int oldVH = row->visible_height;
row->visible_height = p->h;
row->y -= rowY - p->y;
x_clip_to_row (w, row, gc);
row->y = oldY;
row->visible_height = oldVH;
}
else
x_clip_to_row (w, row, gc);
if (p->bx >= 0)
{
@ -4546,6 +4560,14 @@ mac_draw_window_cursor (w, glyph_row, x, y, cursor_type, cursor_width, on_p, act
w->phys_cursor_width = cursor_width;
w->phys_cursor_on_p = 1;
if (glyph_row->exact_window_width_line_p
&& w->phys_cursor.hpos >= glyph_row->used[TEXT_AREA])
{
glyph_row->cursor_in_fringe_p = 1;
draw_fringe_bitmap (w, glyph_row, 0);
return;
}
switch (cursor_type)
{
case HOLLOW_BOX_CURSOR:
@ -6643,8 +6665,8 @@ do_check_ram_size (void)
if (Gestalt (gestaltPhysicalRAMSize, &physical_ram_size) != noErr
|| Gestalt (gestaltLogicalRAMSize, &logical_ram_size) != noErr
|| physical_ram_size > 256 * 1024 * 1024
|| logical_ram_size > 256 * 1024 * 1024)
|| physical_ram_size > (1 << VALBITS)
|| logical_ram_size > (1 << VALBITS))
{
StopAlert (RAM_TOO_LARGE_ALERT_ID, NULL);
exit (1);
@ -7443,7 +7465,9 @@ main (void)
do_get_menus ();
#ifndef USE_LSB_TAG
do_check_ram_size ();
#endif
init_emacs_passwd_dir ();

View File

@ -1,6 +1,6 @@
/* Asynchronous subprocess control for GNU Emacs.
Copyright (C) 1985, 86, 87, 88, 93, 94, 95, 96, 98, 1999,
2001, 2002, 2003 Free Software Foundation, Inc.
2001, 2002, 2003, 2004 Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -4080,6 +4080,10 @@ wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
Otherwise, do pending quit if requested. */
if (XINT (read_kbd) >= 0)
QUIT;
#ifdef SYNC_INPUT
else if (interrupt_input_pending)
handle_async_input ();
#endif
/* Exit now if the cell we're waiting for became non-nil. */
if (! NILP (wait_for_cell) && ! NILP (XCAR (wait_for_cell)))
@ -4296,7 +4300,7 @@ wait_reading_process_input (time_limit, microsecs, read_kbd, do_display)
proc = chan_process[channel];
if (NILP (proc))
continue;
if (XPROCESS (proc)->read_output_delay > 0)
if (XINT (XPROCESS (proc)->read_output_delay) > 0)
{
check_delay--;
if (NILP (XPROCESS (proc)->read_output_skip))

View File

@ -1,5 +1,5 @@
/* System description header file for Darwin (Mac OS X).
Copyright (C) 2001, 2002 Free Software Foundation, Inc.
Copyright (C) 2001, 02, 2004 Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -203,9 +203,6 @@ Boston, MA 02111-1307, USA. */
/* Fix compilation problem for regex.c. */
#define __restrict
/* Fix compilation problem for md5.c. */
#define __attribute__(x)
/* Used in dispnew.c. Copied from freebsd.h. */
#define PENDING_OUTPUT_COUNT(FILE) ((FILE)->_p - (FILE)->_bf._base)

View File

@ -2553,8 +2553,16 @@ since only regular expressions have distinguished subexpressions. */)
}
if (really_changed)
newtext = make_string (substed, substed_len);
{
if (buf_multibyte)
{
int nchars = multibyte_chars_in_text (substed, substed_len);
newtext = make_multibyte_string (substed, nchars, substed_len);
}
else
newtext = make_unibyte_string (substed, substed_len);
}
xfree (substed);
}

View File

@ -540,6 +540,9 @@ x_update_window_end (w, cursor_on_p, mouse_face_overwritten_p)
output_cursor.x, output_cursor.y);
x_draw_vertical_border (w);
draw_window_fringes (w);
UNBLOCK_INPUT;
}
@ -624,11 +627,7 @@ x_after_update_window_line (desired_row)
xassert (w);
if (!desired_row->mode_line_p && !w->pseudo_window_p)
{
BLOCK_INPUT;
draw_row_fringe_bitmaps (w, desired_row);
UNBLOCK_INPUT;
}
desired_row->redraw_fringe_bitmaps_p = 1;
/* When a window has disappeared, make sure that no rest of
full-width rows stays visible in the internal border. Could
@ -678,11 +677,26 @@ w32_draw_fringe_bitmap (w, row, p)
struct frame *f = XFRAME (WINDOW_FRAME (w));
HDC hdc;
struct face *face = p->face;
int rowY;
hdc = get_frame_dc (f);
/* Must clip because of partially visible lines. */
w32_clip_to_row (w, row, hdc);
rowY = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
if (p->y < rowY)
{
/* Adjust position of "bottom aligned" bitmap on partially
visible last row. */
int oldY = row->y;
int oldVH = row->visible_height;
row->visible_height = p->h;
row->y -= rowY - p->y;
w32_clip_to_row (w, row, hdc);
row->y = oldY;
row->visible_height = oldVH;
}
else
w32_clip_to_row (w, row, hdc);
if (p->bx >= 0)
{
@ -5120,6 +5134,14 @@ w32_draw_window_cursor (w, glyph_row, x, y, cursor_type, cursor_width, on_p, act
PostMessage (hwnd, WM_EMACS_TRACK_CARET, 0, 0);
}
if (glyph_row->exact_window_width_line_p
&& w->phys_cursor.hpos >= glyph_row->used[TEXT_AREA])
{
glyph_row->cursor_in_fringe_p = 1;
draw_fringe_bitmap (w, glyph_row, 0);
return;
}
switch (cursor_type)
{
case HOLLOW_BOX_CURSOR:

View File

@ -1,5 +1,5 @@
/* Display generation from window structure and buffer text.
Copyright (C) 1985,86,87,88,93,94,95,97,98,99,2000,01,02,03
Copyright (C) 1985,86,87,88,93,94,95,97,98,99,2000,01,02,03,04
Free Software Foundation, Inc.
This file is part of GNU Emacs.
@ -310,6 +310,21 @@ extern Lisp_Object Qscroll_bar;
Lisp_Object Vshow_trailing_whitespace;
#ifdef HAVE_WINDOW_SYSTEM
/* Non-nil means that newline may flow into the right fringe. */
Lisp_Object Voverflow_newline_into_fringe;
#endif /* HAVE_WINDOW_SYSTEM */
/* Test if overflow newline into fringe. Called with iterator IT
at or past right window margin, and with IT->current_x set. */
#define IT_OVERFLOW_NEWLINE_INTO_FRINGE(it) \
(!NILP (Voverflow_newline_into_fringe) \
&& FRAME_WINDOW_P (it->f) \
&& WINDOW_RIGHT_FRINGE_WIDTH (it->w) > 0 \
&& it->current_x == it->last_visible_x)
/* Non-nil means show the text cursor in void text areas
i.e. in blank areas after eol and eob. This used to be
the default in 21.3. */
@ -5590,7 +5605,20 @@ move_it_in_display_line_to (it, to_charpos, to_x, op)
++it->hpos;
it->current_x = new_x;
if (i == it->nglyphs - 1)
set_iterator_to_next (it, 1);
{
set_iterator_to_next (it, 1);
#ifdef HAVE_WINDOW_SYSTEM
if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
{
get_next_display_element (it);
if (ITERATOR_AT_END_OF_LINE_P (it))
{
result = MOVE_NEWLINE_OR_CR;
break;
}
}
#endif /* HAVE_WINDOW_SYSTEM */
}
}
else
{
@ -5647,6 +5675,17 @@ move_it_in_display_line_to (it, to_charpos, to_x, op)
if (it->truncate_lines_p
&& it->current_x >= it->last_visible_x)
{
#ifdef HAVE_WINDOW_SYSTEM
if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
{
get_next_display_element (it);
if (ITERATOR_AT_END_OF_LINE_P (it))
{
result = MOVE_NEWLINE_OR_CR;
break;
}
}
#endif /* HAVE_WINDOW_SYSTEM */
result = MOVE_LINE_TRUNCATED;
break;
}
@ -8895,26 +8934,205 @@ note_tool_bar_highlight (f, x, y)
#ifdef HAVE_WINDOW_SYSTEM
/* Notice that all bitmaps bits are "mirrored". */
/* An arrow like this: `<-'. */
/*
...xx...
....xx..
.....xx.
..xxxxxx
..xxxxxx
.....xx.
....xx..
...xx...
*/
static unsigned char left_bits[] = {
0x18, 0x0c, 0x06, 0x3f, 0x3f, 0x06, 0x0c, 0x18};
/* Right truncation arrow bitmap `->'. */
/*
...xx...
..xx....
.xx.....
xxxxxx..
xxxxxx..
.xx.....
..xx....
...xx...
*/
static unsigned char right_bits[] = {
0x18, 0x30, 0x60, 0xfc, 0xfc, 0x60, 0x30, 0x18};
/* Up arrow bitmap. */
/*
...xx...
..xxxx..
.xxxxxx.
xxxxxxxx
...xx...
...xx...
...xx...
...xx...
*/
static unsigned char up_arrow_bits[] = {
0x18, 0x3c, 0x7e, 0xff, 0x18, 0x18, 0x18, 0x18};
/* Down arrow bitmap. */
/*
...xx...
...xx...
...xx...
...xx...
xxxxxxxx
.xxxxxx.
..xxxx..
...xx...
*/
static unsigned char down_arrow_bits[] = {
0x18, 0x18, 0x18, 0x18, 0xff, 0x7e, 0x3c, 0x18};
/* Marker for continued lines. */
/*
..xxxx..
.xxxxx..
xx......
xxx..x..
xxxxxx..
.xxxxx..
..xxxx..
.xxxxx..
*/
static unsigned char continued_bits[] = {
0x3c, 0x7c, 0xc0, 0xe4, 0xfc, 0x7c, 0x3c, 0x7c};
/* Marker for continuation lines. */
/*
..xxxx..
..xxxxx.
......xx
..x..xxx
..xxxxxx
..xxxxx.
..xxxx..
..xxxxx.
*/
static unsigned char continuation_bits[] = {
0x3c, 0x3e, 0x03, 0x27, 0x3f, 0x3e, 0x3c, 0x3e};
/* Overlay arrow bitmap. A triangular arrow. */
/*
......xx
....xxxx
...xxxxx
..xxxxxx
..xxxxxx
...xxxxx
....xxxx
......xx
*/
static unsigned char ov_bits[] = {
0x03, 0x0f, 0x1f, 0x3f, 0x3f, 0x1f, 0x0f, 0x03};
/* First line bitmap. An left-up angle. */
/*
..xxxxxx
..xxxxxx
......xx
......xx
......xx
......xx
......xx
........
*/
static unsigned char first_line_bits[] = {
0x3f, 0x3f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00};
/* Last line bitmap. An left-down angle. */
/*
........
xx......
xx......
xx......
xx......
xx......
xxxxxx..
xxxxxx..
*/
static unsigned char last_line_bits[] = {
0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xfc};
/* Filled box cursor bitmap. A filled box; max 13 pixels high. */
/*
.xxxxxxx
.xxxxxxx
.xxxxxxx
.xxxxxxx
.xxxxxxx
.xxxxxxx
.xxxxxxx
.xxxxxxx
.xxxxxxx
.xxxxxxx
.xxxxxxx
.xxxxxxx
.xxxxxxx
*/
static unsigned char filled_box_cursor_bits[] = {
0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f};
/* Hollow box cursor bitmap. A hollow box; max 13 pixels high. */
/*
.xxxxxxx
.x.....x
.x.....x
.x.....x
.x.....x
.x.....x
.x.....x
.x.....x
.x.....x
.x.....x
.x.....x
.x.....x
.xxxxxxx
*/
static unsigned char hollow_box_cursor_bits[] = {
0x7f, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x7f};
/* Bar cursor bitmap. A vertical bar; max 13 pixels high. */
/*
......xx
......xx
......xx
......xx
......xx
......xx
......xx
......xx
......xx
......xx
......xx
......xx
......xx
*/
static unsigned char bar_cursor_bits[] = {
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03};
/* HBar cursor bitmap. A horisontal bar; 2 pixels high. */
/*
.xxxxxxx
.xxxxxxx
*/
static unsigned char hbar_cursor_bits[] = {
0x7f, 0x7f};
/* Bitmap drawn to indicate lines not displaying text if
`indicate-empty-lines' is non-nil. */
static unsigned char zv_bits[] = {
@ -8927,32 +9145,89 @@ static unsigned char zv_bits[] = {
0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00,
0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x3c, 0x00};
/* Hollow square bitmap. */
/*
.xxxxxx.
.x....x.
.x....x.
.x....x.
.x....x.
.xxxxxx.
*/
static unsigned char hollow_square_bits[] = {
0x7e, 0x42, 0x42, 0x42, 0x42, 0x7e};
struct fringe_bitmap fringe_bitmaps[MAX_FRINGE_BITMAPS] =
{
{ 0, 0, 0, NULL /* NO_FRINGE_BITMAP */ },
{ 8, sizeof (left_bits), 0, left_bits },
{ 8, sizeof (right_bits), 0, right_bits },
{ 8, sizeof (up_arrow_bits), -1, up_arrow_bits },
{ 8, sizeof (down_arrow_bits), -2, down_arrow_bits },
{ 8, sizeof (continued_bits), 0, continued_bits },
{ 8, sizeof (continuation_bits), 0, continuation_bits },
{ 8, sizeof (ov_bits), 0, ov_bits },
{ 8, sizeof (zv_bits), 3, zv_bits }
{ 8, sizeof (first_line_bits), -1, first_line_bits },
{ 8, sizeof (last_line_bits), -2, last_line_bits },
{ 8, sizeof (filled_box_cursor_bits), 0, filled_box_cursor_bits },
{ 8, sizeof (hollow_box_cursor_bits), 0, hollow_box_cursor_bits },
{ 8, sizeof (bar_cursor_bits), 0, bar_cursor_bits },
{ 8, sizeof (hbar_cursor_bits), -2, hbar_cursor_bits },
{ 8, sizeof (zv_bits), 3, zv_bits },
{ 8, sizeof (hollow_square_bits), 0, hollow_square_bits },
};
/* Draw the bitmap WHICH in one of the left or right fringes of
window W. ROW is the glyph row for which to display the bitmap; it
determines the vertical position at which the bitmap has to be
drawn. */
drawn.
LEFT_P is 1 for left fringe, 0 for right fringe.
*/
static void
draw_fringe_bitmap (w, row, which, left_p)
void
draw_fringe_bitmap (w, row, left_p)
struct window *w;
struct glyph_row *row;
enum fringe_bitmap_type which;
int left_p;
{
struct frame *f = XFRAME (WINDOW_FRAME (w));
struct draw_fringe_bitmap_params p;
enum fringe_bitmap_type which;
int period;
if (left_p)
which = row->left_fringe_bitmap;
else if (!row->cursor_in_fringe_p)
which = row->right_fringe_bitmap;
else
switch (w->phys_cursor_type)
{
case HOLLOW_BOX_CURSOR:
if (row->visible_height >= sizeof(hollow_box_cursor_bits))
which = HOLLOW_BOX_CURSOR_BITMAP;
else
which = HOLLOW_SQUARE_BITMAP;
break;
case FILLED_BOX_CURSOR:
which = FILLED_BOX_CURSOR_BITMAP;
break;
case BAR_CURSOR:
which = BAR_CURSOR_BITMAP;
break;
case HBAR_CURSOR:
which = HBAR_CURSOR_BITMAP;
break;
case NO_CURSOR:
default:
w->phys_cursor_on_p = 0;
row->cursor_in_fringe_p = 0;
which = row->right_fringe_bitmap;
break;
}
period = fringe_bitmaps[which].period;
/* Convert row to frame coordinates. */
p.y = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
@ -8961,9 +9236,7 @@ draw_fringe_bitmap (w, row, which, left_p)
p.wd = fringe_bitmaps[which].width;
p.h = fringe_bitmaps[which].height;
p.dh = (fringe_bitmaps[which].period
? (p.y % fringe_bitmaps[which].period)
: 0);
p.dh = (period > 0 ? (p.y % period) : 0);
p.h -= p.dh;
/* Clip bitmap if too high. */
if (p.h > row->height)
@ -9023,7 +9296,13 @@ draw_fringe_bitmap (w, row, which, left_p)
}
/* Adjust y to the offset in the row to start drawing the bitmap. */
p.y += (row->height - p.h) / 2;
if (period == 0)
p.y += (row->height - p.h) / 2;
else if (period == -2)
{
p.h = fringe_bitmaps[which].height;
p.y += (row->visible_height - p.h);
}
FRAME_RIF (f)->draw_fringe_bitmap (w, row, &p);
}
@ -9036,8 +9315,6 @@ draw_row_fringe_bitmaps (w, row)
struct window *w;
struct glyph_row *row;
{
enum fringe_bitmap_type bitmap;
xassert (interrupt_input_blocked);
/* If row is completely invisible, because of vscrolling, we
@ -9046,35 +9323,35 @@ draw_row_fringe_bitmaps (w, row)
return;
if (WINDOW_LEFT_FRINGE_WIDTH (w) != 0)
{
/* Decide which bitmap to draw in the left fringe. */
if (row->overlay_arrow_p)
bitmap = OVERLAY_ARROW_BITMAP;
else if (row->truncated_on_left_p)
bitmap = LEFT_TRUNCATION_BITMAP;
else if (MATRIX_ROW_CONTINUATION_LINE_P (row))
bitmap = CONTINUATION_LINE_BITMAP;
else if (row->indicate_empty_line_p)
bitmap = ZV_LINE_BITMAP;
else
bitmap = NO_FRINGE_BITMAP;
draw_fringe_bitmap (w, row, bitmap, 1);
}
draw_fringe_bitmap (w, row, 1);
if (WINDOW_RIGHT_FRINGE_WIDTH (w) != 0)
{
/* Decide which bitmap to draw in the right fringe. */
if (row->truncated_on_right_p)
bitmap = RIGHT_TRUNCATION_BITMAP;
else if (row->continued_p)
bitmap = CONTINUED_LINE_BITMAP;
else if (row->indicate_empty_line_p && WINDOW_LEFT_FRINGE_WIDTH (w) == 0)
bitmap = ZV_LINE_BITMAP;
else
bitmap = NO_FRINGE_BITMAP;
draw_fringe_bitmap (w, row, 0);
}
draw_fringe_bitmap (w, row, bitmap, 0);
/* Draw the fringes of window W. Only fringes for rows marked for
update in redraw_fringe_bitmaps_p are drawn. */
void
draw_window_fringes (w)
struct window *w;
{
struct glyph_row *row;
int yb = window_text_bottom_y (w);
int nrows = w->current_matrix->nrows;
int y = 0, rn;
if (w->pseudo_window_p)
return;
for (y = 0, rn = 0, row = w->current_matrix->rows;
y < yb && rn < nrows;
y += row->height, ++row, ++rn)
{
if (!row->redraw_fringe_bitmaps_p)
continue;
draw_row_fringe_bitmaps (w, row);
row->redraw_fringe_bitmaps_p = 0;
}
}
@ -9981,6 +10258,9 @@ redisplay_internal (preserve_echo_area)
#if GLYPH_DEBUG
*w->desired_matrix->method = 0;
debug_method_add (w, "optimization 1");
#endif
#ifdef HAVE_WINDOW_SYSTEM
update_window_fringes (w, 0);
#endif
goto update;
}
@ -11394,6 +11674,137 @@ set_vertical_scroll_bar (w)
(w, end - start, whole, start);
}
#ifdef HAVE_WINDOW_SYSTEM
/* Recalculate the bitmaps to show in the fringes of window W.
If FORCE_P is 0, only mark rows with modified bitmaps for update in
redraw_fringe_bitmaps_p; else mark all rows for update. */
int
update_window_fringes (w, force_p)
struct window *w;
int force_p;
{
struct glyph_row *row, *cur = 0;
int yb = window_text_bottom_y (w);
int rn, nrows = w->current_matrix->nrows;
int y;
int redraw_p = 0;
Lisp_Object ind;
if (w->pseudo_window_p)
return 0;
if (!MINI_WINDOW_P (w)
&& (ind = XBUFFER (w->buffer)->indicate_buffer_boundaries, !NILP (ind)))
{
int do_eob = 1, do_bob = 1;
for (y = 0, rn = 0;
y < yb && rn < nrows;
y += row->height, ++rn)
{
unsigned indicate_bob_p, indicate_top_line_p;
unsigned indicate_eob_p, indicate_bottom_line_p;
row = w->desired_matrix->rows + rn;
if (!row->enabled_p)
row = w->current_matrix->rows + rn;
indicate_bob_p = row->indicate_bob_p;
indicate_top_line_p = row->indicate_top_line_p;
indicate_eob_p = row->indicate_eob_p;
indicate_bottom_line_p = row->indicate_bottom_line_p;
row->indicate_bob_p = row->indicate_top_line_p = 0;
row->indicate_eob_p = row->indicate_bottom_line_p = 0;
if (MATRIX_ROW_START_CHARPOS (row) <= BUF_BEGV (XBUFFER (w->buffer)))
row->indicate_bob_p = do_bob, do_bob = 0;
else if (EQ (ind, Qt)
&& (WINDOW_WANTS_HEADER_LINE_P (w) ? 1 : 0) == rn)
row->indicate_top_line_p = 1;
if (MATRIX_ROW_END_CHARPOS (row) >= BUF_ZV (XBUFFER (w->buffer)))
row->indicate_eob_p = do_eob, do_eob = 0;
else if (EQ (ind, Qt)
&& y + row->height >= yb)
row->indicate_bottom_line_p = 1;
if (indicate_bob_p != row->indicate_bob_p
|| indicate_top_line_p != row->indicate_top_line_p
|| indicate_eob_p != row->indicate_eob_p
|| indicate_bottom_line_p != row->indicate_bottom_line_p)
row->redraw_fringe_bitmaps_p = 1;
}
}
for (y = 0, rn = 0;
y < yb && rn < nrows;
y += row->height, rn++)
{
enum fringe_bitmap_type left, right;
row = w->desired_matrix->rows + rn;
cur = w->current_matrix->rows + rn;
if (!row->enabled_p)
row = cur;
/* Decide which bitmap to draw in the left fringe. */
if (WINDOW_LEFT_FRINGE_WIDTH (w) == 0)
left = NO_FRINGE_BITMAP;
else if (row->overlay_arrow_p)
left = OVERLAY_ARROW_BITMAP;
else if (row->truncated_on_left_p)
left = LEFT_TRUNCATION_BITMAP;
else if (MATRIX_ROW_CONTINUATION_LINE_P (row))
left = CONTINUATION_LINE_BITMAP;
else if (row->indicate_empty_line_p)
left = ZV_LINE_BITMAP;
else if (row->indicate_bob_p)
left = FIRST_LINE_BITMAP;
else
left = NO_FRINGE_BITMAP;
/* Decide which bitmap to draw in the right fringe. */
if (WINDOW_RIGHT_FRINGE_WIDTH (w) == 0)
right = NO_FRINGE_BITMAP;
else if (row->truncated_on_right_p)
right = RIGHT_TRUNCATION_BITMAP;
else if (row->continued_p)
right = CONTINUED_LINE_BITMAP;
else if (row->indicate_eob_p)
right = LAST_LINE_BITMAP;
else if (row->indicate_top_line_p)
right = UP_ARROW_BITMAP;
else if (row->indicate_bottom_line_p)
right = DOWN_ARROW_BITMAP;
else if (row->indicate_empty_line_p && WINDOW_LEFT_FRINGE_WIDTH (w) == 0)
right = ZV_LINE_BITMAP;
else
right = NO_FRINGE_BITMAP;
if (force_p
|| row->y != cur->y
|| row->visible_height != cur->visible_height
|| left != cur->left_fringe_bitmap
|| right != cur->right_fringe_bitmap
|| cur->redraw_fringe_bitmaps_p)
{
redraw_p = row->redraw_fringe_bitmaps_p = cur->redraw_fringe_bitmaps_p = 1;
cur->left_fringe_bitmap = left;
cur->right_fringe_bitmap = right;
}
row->left_fringe_bitmap = left;
row->right_fringe_bitmap = right;
}
return redraw_p;
}
#endif /* HAVE_WINDOW_SYSTEM */
/* Redisplay leaf window WINDOW. JUST_THIS_ONE_P non-zero means only
selected_window is redisplayed.
@ -11416,6 +11827,7 @@ redisplay_window (window, just_this_one_p)
struct it it;
/* Record it now because it's overwritten. */
int current_matrix_up_to_date_p = 0;
int used_current_matrix_p = 0;
/* This is less strict than current_matrix_up_to_date_p.
It indictes that the buffer contents and narrowing are unchanged. */
int buffer_unchanged_p = 0;
@ -11722,6 +12134,7 @@ redisplay_window (window, just_this_one_p)
switch (rc)
{
case CURSOR_MOVEMENT_SUCCESS:
used_current_matrix_p = 1;
goto done;
#if 0 /* try_cursor_movement never returns this value. */
@ -11786,7 +12199,8 @@ redisplay_window (window, just_this_one_p)
buffer. */
|| !NILP (Vwindow_scroll_functions)
|| MINI_WINDOW_P (w)
|| !try_window_reusing_current_matrix (w))
|| !(used_current_matrix_p =
try_window_reusing_current_matrix (w)))
{
IF_DEBUG (debug_method_add (w, "1"));
try_window (window, startp);
@ -11915,7 +12329,8 @@ redisplay_window (window, just_this_one_p)
|| !NILP (Vwindow_scroll_functions)
|| !just_this_one_p
|| MINI_WINDOW_P (w)
|| !try_window_reusing_current_matrix (w))
|| !(used_current_matrix_p =
try_window_reusing_current_matrix (w)))
try_window (window, startp);
/* If new fonts have been loaded (due to fontsets), give up. We
@ -12077,6 +12492,19 @@ redisplay_window (window, just_this_one_p)
#endif
}
#ifdef HAVE_WINDOW_SYSTEM
if (update_window_fringes (w, 0)
&& (used_current_matrix_p || overlay_arrow_seen)
&& !w->pseudo_window_p)
{
update_begin (f);
BLOCK_INPUT;
draw_window_fringes (w);
UNBLOCK_INPUT;
update_end (f);
}
#endif /* HAVE_WINDOW_SYSTEM */
/* We go to this label, with fonts_changed_p nonzero,
if it is necessary to try again using larger glyph matrices.
We have to redeem the scroll bar even in this case,
@ -12334,6 +12762,7 @@ try_window_reusing_current_matrix (w)
row->visible_height -= min_y - row->y;
if (row->y + row->height > max_y)
row->visible_height -= row->y + row->height - max_y;
row->redraw_fringe_bitmaps_p = 1;
it.current_y += row->height;
@ -12473,7 +12902,6 @@ try_window_reusing_current_matrix (w)
if (run.height)
{
struct frame *f = XFRAME (WINDOW_FRAME (w));
update_begin (f);
FRAME_RIF (f)->update_window_begin_hook (w);
FRAME_RIF (f)->clear_window_mouse_face (w);
@ -12494,6 +12922,7 @@ try_window_reusing_current_matrix (w)
row->visible_height -= min_y - row->y;
if (row->y + row->height > max_y)
row->visible_height -= row->y + row->height - max_y;
row->redraw_fringe_bitmaps_p = 1;
}
/* Scroll the current matrix. */
@ -12616,7 +13045,8 @@ find_last_unchanged_at_beg_row (w)
row is not unchanged because it may be no longer
continued. */
&& !(MATRIX_ROW_END_CHARPOS (row) == first_changed_pos
&& row->continued_p))
&& (row->continued_p
|| row->exact_window_width_line_p)))
row_found = row;
/* Stop if last visible row. */
@ -14512,7 +14942,20 @@ display_line (it)
it->continuation_lines_width += new_x;
++it->hpos;
if (i == nglyphs - 1)
set_iterator_to_next (it, 1);
{
set_iterator_to_next (it, 1);
#ifdef HAVE_WINDOW_SYSTEM
if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
{
get_next_display_element (it);
if (ITERATOR_AT_END_OF_LINE_P (it))
{
row->continued_p = 0;
row->exact_window_width_line_p = 1;
}
}
#endif /* HAVE_WINDOW_SYSTEM */
}
}
else if (CHAR_GLYPH_PADDING_P (*glyph)
&& !FRAME_WINDOW_P (it->f))
@ -14614,6 +15057,7 @@ display_line (it)
break;
}
at_end_of_line:
/* Is this a line end? If yes, we're also done, after making
sure that a non-default face is extended up to the right
margin of the window. */
@ -14623,9 +15067,12 @@ display_line (it)
row->ends_in_newline_from_string_p = STRINGP (it->object);
#ifdef HAVE_WINDOW_SYSTEM
/* Add a space at the end of the line that is used to
display the cursor there. */
append_space (it, 0);
if (!IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
append_space (it, 0);
#endif /* HAVE_WINDOW_SYSTEM */
/* Extend the face to the end of the line. */
extend_face_to_end_of_line (it);
@ -14666,6 +15113,21 @@ display_line (it)
produce_special_glyphs (it, IT_TRUNCATION);
}
}
#ifdef HAVE_WINDOW_SYSTEM
else
{
/* Don't truncate if we can overflow newline into fringe. */
if (IT_OVERFLOW_NEWLINE_INTO_FRINGE (it))
{
get_next_display_element (it);
if (ITERATOR_AT_END_OF_LINE_P (it))
{
row->exact_window_width_line_p = 1;
goto at_end_of_line;
}
}
}
#endif /* HAVE_WINDOW_SYSTEM */
row->truncated_on_right_p = 1;
it->continuation_lines_width = 0;
@ -19213,36 +19675,53 @@ notice_overwritten_cursor (w, area, x0, x1, y0, y1)
enum glyph_row_area area;
int x0, y0, x1, y1;
{
if (area == TEXT_AREA && w->phys_cursor_on_p)
int cx0, cx1, cy0, cy1;
struct glyph_row *row;
if (!w->phys_cursor_on_p)
return;
if (area != TEXT_AREA)
return;
row = w->current_matrix->rows + w->phys_cursor.vpos;
if (!row->displays_text_p)
return;
if (row->cursor_in_fringe_p)
{
int cx0 = w->phys_cursor.x;
int cx1 = cx0 + w->phys_cursor_width;
int cy0 = w->phys_cursor.y;
int cy1 = cy0 + w->phys_cursor_height;
if (x0 <= cx0 && (x1 < 0 || x1 >= cx1))
{
/* The cursor image will be completely removed from the
screen if the output area intersects the cursor area in
y-direction. When we draw in [y0 y1[, and some part of
the cursor is at y < y0, that part must have been drawn
before. When scrolling, the cursor is erased before
actually scrolling, so we don't come here. When not
scrolling, the rows above the old cursor row must have
changed, and in this case these rows must have written
over the cursor image.
Likewise if part of the cursor is below y1, with the
exception of the cursor being in the first blank row at
the buffer and window end because update_text_area
doesn't draw that row. (Except when it does, but
that's handled in update_text_area.) */
if (((y0 >= cy0 && y0 < cy1) || (y1 > cy0 && y1 < cy1))
&& w->current_matrix->rows[w->phys_cursor.vpos].displays_text_p)
w->phys_cursor_on_p = 0;
}
row->cursor_in_fringe_p = 0;
draw_fringe_bitmap (w, row, 0);
w->phys_cursor_on_p = 0;
return;
}
cx0 = w->phys_cursor.x;
cx1 = cx0 + w->phys_cursor_width;
if (x0 > cx0 || (x1 >= 0 && x1 < cx1))
return;
/* The cursor image will be completely removed from the
screen if the output area intersects the cursor area in
y-direction. When we draw in [y0 y1[, and some part of
the cursor is at y < y0, that part must have been drawn
before. When scrolling, the cursor is erased before
actually scrolling, so we don't come here. When not
scrolling, the rows above the old cursor row must have
changed, and in this case these rows must have written
over the cursor image.
Likewise if part of the cursor is below y1, with the
exception of the cursor being in the first blank row at
the buffer and window end because update_text_area
doesn't draw that row. (Except when it does, but
that's handled in update_text_area.) */
cy0 = w->phys_cursor.y;
cy1 = cy0 + w->phys_cursor_height;
if ((y0 < cy0 || y0 >= cy1) && (y1 <= cy0 || y1 >= cy1))
return;
w->phys_cursor_on_p = 0;
}
#endif /* HAVE_WINDOW_SYSTEM */
@ -19377,6 +19856,14 @@ erase_phys_cursor (w)
if (cursor_row->visible_height <= 0)
goto mark_cursor_off;
/* If cursor is in the fringe, erase by drawing actual bitmap there. */
if (cursor_row->cursor_in_fringe_p)
{
cursor_row->cursor_in_fringe_p = 0;
draw_fringe_bitmap (w, cursor_row, 0);
goto mark_cursor_off;
}
/* This can happen when the new row is shorter than the old one.
In this case, either draw_glyphs or clear_end_of_line
should have cleared the cursor. Note that we wouldn't be
@ -21533,12 +22020,23 @@ wide as that tab on the display. */);
#endif
DEFVAR_LISP ("show-trailing-whitespace", &Vshow_trailing_whitespace,
doc: /* Non-nil means highlight trailing whitespace.
doc: /* *Non-nil means highlight trailing whitespace.
The face used for trailing whitespace is `trailing-whitespace'. */);
Vshow_trailing_whitespace = Qnil;
#ifdef HAVE_WINDOW_SYSTEM
DEFVAR_LISP ("overflow-newline-into-fringe", &Voverflow_newline_into_fringe,
doc: /* *Non-nil means that newline may flow into the right fringe.
This means that display lines which are exactly as wide as the window
(not counting the final newline) will only occupy one screen line, by
showing (or hiding) the final newline in the right fringe; when point
is at the final newline, the cursor is shown in the right fringe.
If nil, also continue lines which are exactly as wide as the window. */);
Voverflow_newline_into_fringe = Qt;
#endif
DEFVAR_LISP ("void-text-area-pointer", &Vvoid_text_area_pointer,
doc: /* The pointer shape to show in void text areas.
doc: /* *The pointer shape to show in void text areas.
Nil means to show the text pointer. Other options are `arrow', `text',
`hand', `vdrag', `hdrag', `modeline', and `hourglass'. */);
Vvoid_text_area_pointer = Qarrow;

View File

@ -571,6 +571,9 @@ x_update_window_end (w, cursor_on_p, mouse_face_overwritten_p)
output_cursor.x, output_cursor.y);
x_draw_vertical_border (w);
draw_window_fringes (w);
UNBLOCK_INPUT;
}
@ -650,11 +653,7 @@ x_after_update_window_line (desired_row)
xassert (w);
if (!desired_row->mode_line_p && !w->pseudo_window_p)
{
BLOCK_INPUT;
draw_row_fringe_bitmaps (w, desired_row);
UNBLOCK_INPUT;
}
desired_row->redraw_fringe_bitmaps_p = 1;
/* When a window has disappeared, make sure that no rest of
full-width rows stays visible in the internal border. Could
@ -698,9 +697,24 @@ x_draw_fringe_bitmap (w, row, p)
Window window = FRAME_X_WINDOW (f);
GC gc = f->output_data.x->normal_gc;
struct face *face = p->face;
int rowY;
/* Must clip because of partially visible lines. */
x_clip_to_row (w, row, gc);
rowY = WINDOW_TO_FRAME_PIXEL_Y (w, row->y);
if (p->y < rowY)
{
/* Adjust position of "bottom aligned" bitmap on partially
visible last row. */
int oldY = row->y;
int oldVH = row->visible_height;
row->visible_height = p->h;
row->y -= rowY - p->y;
x_clip_to_row (w, row, gc);
row->y = oldY;
row->visible_height = oldVH;
}
else
x_clip_to_row (w, row, gc);
if (p->bx >= 0)
{
@ -6314,6 +6328,11 @@ handle_one_xevent (dpyinfo, eventp, bufp_r, numcharsp, finish)
&compose_status);
#endif
/* If not using XIM/XIC, and a compose sequence is in progress,
we break here. Otherwise, chars_matched is always 0. */
if (compose_status.chars_matched > 0 && nbytes == 0)
break;
orig_keysym = keysym;
if (numchars > 1)
@ -7452,6 +7471,13 @@ x_draw_window_cursor (w, glyph_row, x, y, cursor_type, cursor_width, on_p, activ
w->phys_cursor_type = cursor_type;
w->phys_cursor_on_p = 1;
if (glyph_row->exact_window_width_line_p
&& w->phys_cursor.hpos >= glyph_row->used[TEXT_AREA])
{
glyph_row->cursor_in_fringe_p = 1;
draw_fringe_bitmap (w, glyph_row, 0);
}
else
switch (cursor_type)
{
case HOLLOW_BOX_CURSOR: