# HG changeset patch # User Miles Bader # Date 1104657199 0 # Node ID 95879cc1ed20c870174c188a2f6aab61f0143f1d # Parent fa0a5c4db2c890dc01e47987b535c81d468646e1# Parent b462b7b828d12bc8fe9639c93e3aa05aa35396eb Revision: miles@gnu.org--gnu-2004/emacs--unicode--0--patch-81 Merge from emacs--cvs-trunk--0 Patches applied: * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-748 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-749 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-750 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-751 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-753 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-754 Merge from gnus--rel--5.10 * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-755 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-757 Update from CVS * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-78 Merge from emacs--cvs-trunk--0 * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-79 - miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-80 Update from CVS * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-81 Merge from emacs--cvs-trunk--0 * miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-82 Update from CVS diff -r fa0a5c4db2c8 -r 95879cc1ed20 admin/FOR-RELEASE --- a/admin/FOR-RELEASE Sat Dec 25 02:31:08 2004 +0000 +++ b/admin/FOR-RELEASE Sun Jan 02 09:13:19 2005 +0000 @@ -4,8 +4,6 @@ ** Face remapping. -** Let mouse-1 follow links. - ** Make Rmail find the best version of movemail. To be done by Sergey Poznyakoff . @@ -36,6 +34,8 @@ * BUGS +** Incomplete overlay mouse-face highlight bug (Ralf Angeli, Oct 18) + ** Ange-ftp should ignore irrelevant IPv6 errors: Message-Id: <4121-Tue23Mar2004165249+0100-piet@cs.uu.nl> diff -r fa0a5c4db2c8 -r 95879cc1ed20 etc/NEWS --- a/etc/NEWS Sat Dec 25 02:31:08 2004 +0000 +++ b/etc/NEWS Sun Jan 02 09:13:19 2005 +0000 @@ -173,6 +173,12 @@ * Changes in Emacs 21.4 +** calculator.el now has radix grouping mode, which is available when +`calculator-output-radix' is non-nil. In this mode a separator +character is used every few digits, making it easier to see byte +boundries etc. For more info, see the documentation of the variable +`calculator-radix-grouping-mode'. + ** You can now follow links by clicking Mouse-1 on the link. Traditionally, Emacs uses a Mouse-1 click to set point and a Mouse-2 @@ -203,6 +209,24 @@ `mouse-1-click-follows-link'. +++ +** require-final-newline now has two new possible values: + +`visit' means add a newline (as an undoable change) if it's needed +when visiting the file. + +`visit-save' means add a newline (as an undoable change) if it's +needed when visiting the file, and also add a newline if it's needed +when saving the file. + ++++ +** The new option mode-require-final-newline controls how certain +major modes enable require-final-newline. Any major mode that's +designed for a kind of file that should normally end in a newline +sets require-final-newline based on mode-require-final-newline. +So you can customize mode-require-final-newline to control what these +modes do. + ++++ ** When the undo information of the current command gets really large (beyond the value of `undo-outer-limit'), Emacs asks you whether to discard it or keep it. @@ -1056,6 +1080,9 @@ ESC, like they do for Gtk+, Mac and W32. --- +** Dialogs and menus pop down when pressing C-g. + +--- ** The menu item "Open File..." has been split into two items, "New File..." and "Open File...". "Open File..." now opens only existing files. This is to support existing GUI file selection dialogs better. @@ -1871,12 +1898,15 @@ bound to keys to get this feature without toggling a mode. Contributed by Kevin Ryde. -*** Better control over require-final-newline. -The variable that controls how to handle a final newline when the -buffer is saved, require-final-newline, is now customizable on a -per-mode basis through c-require-final-newline. The default is to set -it to t only in languages that mandate a final newline in source files -(C, C++ and Objective-C). +*** Better control over require-final-newline. The variable that +controls how to handle a final newline when the buffer is saved, +require-final-newline, is now customizable on a per-mode basis through +c-require-final-newline. That is a list of modes, and only those +modes set require-final-newline. By default that's C, C++ and +Objective-C. + +The specified modes set require-final-newline based on +mode-require-final-newline, as usual. *** Format change for syntactic context elements. The elements in the syntactic context returned by c-guess-basic-syntax @@ -2218,6 +2248,14 @@ "checkout", "update" or "commit". That means using cvs diff options -rBASE -rHEAD. +** New variable `hs-set-up-overlay' allows customization of the overlay +used to effect hiding for hideshow minor mode. Integration with isearch +handles the overlay property `display' specially, preserving it during +temporary overlay showing in the course of an isearch operation. + +** New command `recode-region' decodes the region again by a specified +coding system. + * New modes and packages in Emacs 21.4 @@ -2465,6 +2503,15 @@ * Lisp Changes in Emacs 21.4 ++++ +** If a buffer sets buffer-save-without-query to non-nil, +save-some-buffers will always save that buffer without asking +(if it's modified). + ++++ +** The function symbol-file tells you which file defined +a certain function or variable. + ** Lisp code can now test if a given buffer position is inside a clickable link with the new function `mouse-on-link-p'. This is the function used by the new `mouse-1-click-follows-link' functionality. @@ -3175,6 +3222,10 @@ current file redefined it). +++ +** `load-history' now records (defun . FUNNAME) when a function is +defined. For a variable, it records just the variable name. + ++++ ** New Lisp library testcover.el works with edebug to help you determine whether you've tested all your Lisp code. Function testcover-start instruments all functions in a given file. Then test your code. Function diff -r fa0a5c4db2c8 -r 95879cc1ed20 etc/TODO --- a/etc/TODO Sat Dec 25 02:31:08 2004 +0000 +++ b/etc/TODO Sun Jan 02 09:13:19 2005 +0000 @@ -15,6 +15,8 @@ ought to be possible to omit text which is invisible (due to a text-property, overlay, or selective display) from the kill-ring. +** battery.el display-battery should be replaced with a minor mode. + ** Redefine define-generic-mode as a macro, so the compiler sees the definitions it generates. diff -r fa0a5c4db2c8 -r 95879cc1ed20 lib-src/ChangeLog --- a/lib-src/ChangeLog Sat Dec 25 02:31:08 2004 +0000 +++ b/lib-src/ChangeLog Sun Jan 02 09:13:19 2005 +0000 @@ -1,3 +1,8 @@ +2004-12-26 YAMAMOTO Mitsuharu + + * make-docfile.c: Include stdlib.h even if WINDOWSNT is not + defined. + 2004-12-15 Andreas Schwab * etags.c (main): Fix typo in conversion of LONG_OPTIONS from diff -r fa0a5c4db2c8 -r 95879cc1ed20 lib-src/make-docfile.c --- a/lib-src/make-docfile.c Sat Dec 25 02:31:08 2004 +0000 +++ b/lib-src/make-docfile.c Sun Jan 02 09:13:19 2005 +0000 @@ -43,11 +43,11 @@ #undef chdir #include +#include #ifdef MSDOS #include #endif /* MSDOS */ #ifdef WINDOWSNT -#include #include #include #endif /* WINDOWSNT */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/ChangeLog --- a/lisp/ChangeLog Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/ChangeLog Sun Jan 02 09:13:19 2005 +0000 @@ -1,3 +1,339 @@ +2004-12-31 Jay Belanger + + * calc/calc-store.el (calcVar-digit, calcVar-oper): Remove the need + for "var-" at the beginning of the minibuffer. + +2004-12-31 Richard M. Stallman + + * faces.el (read-face-name): + Don't treat an attribute spec as a list of faces. + + * simple.el (undo): Use undo-equiv-table to detect + unexpected changes since previous undo. + (undo-list-saved): Variable deleted. + (buffer-disable-undo): Don't alter undo-list-saved. + + * files.el (require-final-newline): Allow `visit' and `visit-save'. + (mode-require-final-newline): New option. + (after-find-file): Handle require-final-newline with new values. + (basic-save-buffer): Handle new values of require-final-newline. + + * progmodes/sh-script.el (sh-require-final-newline): + Alist value now controls whether to use mode-require-final-newline. + (sh-set-shell): Implement that new meaning. + + * progmodes/cc-vars.el (c-require-final-newline): Fix custom type, doc. + * progmodes/cc-mode.el (c-common-init): Use mode-require-final-newline. + * progmodes/antlr-mode.el (antlr-mode): Use mode-require-final-newline. + Delete old-Emacs compatibility code. + (antlr-c-common-init): Function deleted. + + * net/snmp-mode.el (snmp-common-mode): Use mode-require-final-newline. + * progmodes/vhdl-mode.el (vhdl-mode): Use mode-require-final-newline. + * progmodes/simula.el (simula-mode): Use mode-require-final-newline. + * progmodes/python.el (python-mode): Use mode-require-final-newline. + * progmodes/perl-mode.el (perl-mode): Use mode-require-final-newline. + * progmodes/modula2.el (modula-2-mode): Use mode-require-final-newline. + * progmodes/mixal-mode.el (mixal-mode): Use mode-require-final-newline. + * progmodes/idlwave.el (idlwave-mode): Use mode-require-final-newline. + * progmodes/icon.el (icon-mode): Use mode-require-final-newline. + * progmodes/fortran.el (fortran-mode): Use mode-require-final-newline. + * progmodes/f90.el (f90-mode): Use mode-require-final-newline. + * progmodes/cperl-mode.el (cperl-mode): Use mode-require-final-newline. + * progmodes/cfengine.el (cfengine-mode): Use mode-require-final-newline. + * progmodes/ada-mode.el (ada-mode): Use mode-require-final-newline. + * textmodes/text-mode.el (text-mode): Use mode-require-final-newline. + * textmodes/texinfo.el (texinfo-mode): Use mode-require-final-newline. + +2004-12-31 Jay Belanger + + * calc/calc-graph.el (calc-graph-show-dumb): Mention C-cC-c as the + way to return to Calc. + + * calc/calc-yank.el (calc-edit-mode): Mention C-cC-c as the way to + finish, C-xk as the way to cancel the edit. Add cancel routine to + kill-buffer-hook. + + * calc/calc.el (calc-same-interface, calc-quit): Remove obsolete + MacEdit code. + + * calc/calc-prog.el: Remove obsolete MacEdit code. + (calc-macro-edit-algebraic, calc-macro-edit-variable) + (calc-macro-edit-variable-2, calc-macro-edit-quick-digit): Remove. + +2004-12-31 Kenichi Handa + + * international/mule.el (buffer-file-coding-system-explicit): + Renamed for explicit-buffer-file-coding-system. + (after-insert-file-set-coding): Adjusted for the above change. + + * files.el (revert-buffer): Change + explicit-buffer-file-coding-system to + buffer-file-coding-system-explicit. + (basic-save-buffer-1): Likewise. + +2004-12-30 Richard M. Stallman + + * textmodes/artist.el (artist-butlast-fn): Var deleted. + (artist-butlast, artist-last): Functions deleted. + (artist-ellipse-mirror-quadrant): Call last and butlast directly. + (artist-compute-key-compl-table): Call remq directly. + (artist-remove-nulls): Function deleted. + (artist-vaporize-lines, artist-flood-fill): Use push and pop directly. + (artist-push, artist-pop): Macro deleted. + +2004-12-30 Andreas Leue + + * textmodes/artist.el (artist-version): 1.2.6 + (artist-prev-next-op-alist): New variable. + (artist-select-next-op-in-list): New function. + (artist-select-prev-op-in-list): New function. + (artist-make-prev-next-op-alist): New function. + (artist-is-in-op-list-p): New function. + (artist-get-first-non-nil-op): New function. + (artist-get-last-non-nil-op): New function. + (artist-mode-init): Call artist-get-last-non-nil-op to initialize + artist-prev-next-op-alist. + (artist-mode-map): Add binding for C-mouse-4 and C-mouse-5 to + change drawing operation. + +2004-12-30 Luc Teirlinck + + * autorevert.el (auto-revert-tail-handler): Put in undo boundaries. + +2004-12-31 Masatake YAMATO + + * server.el (server-process-filter): Suppress `error', too. + +2004-12-30 Jay Belanger + + * calc/calc-store.el (calc-copy-variable): Fix mistyped variable + name. Change the way a variable is displayed in a message. + + * calc/calc-prog.el (calc-user-define-edit, calc-finish-macro-edit) + (calc-user-define-permanent, calc-execute-kbd-macro): + Replace old function MacEdit-parse-keys with edmacro-parse-keys. + +2004-12-30 Kenichi Handa + + * files.el (basic-save-buffer-1): Set + explicit-buffer-file-coding-system to last-coding-system-used. + (revert-buffer): Pay attention to + explicit-buffer-file-coding-system (not buffer-file-coding-system) + on bind coding-system-for-read. + + * international/mule.el (explicit-buffer-file-coding-system): New + buffer local variable. + (after-insert-file-set-coding): Set it to coding-system-for-read. + +2004-12-29 Luc Teirlinck + + * autorevert.el (auto-revert-tail-mode): Doc fix for defvar. + +2004-12-29 Sanghyuk Suh + + * term/mac-win.el (mac-drag-n-drop): Handle drag-n-drop events + that include line numbers. + +2004-12-29 Milan Zamazal + + * files.el (hack-local-variables): If no PREFIX, set it to "^". + Redundant variable PREFIXLEN removed. + +2004-12-28 Matt Hodges + + * eshell/em-hist.el (eshell-previous-matching-input): + Start the deletion from the end of the output. + +2004-12-29 YAMAMOTO Mitsuharu + + * term/mac-win.el: Require x-dnd. + (mac-drag-n-drop): Sync with W32 version. Use x-dnd.el + functions. + +2004-12-29 David Kastrup + + * international/mule.el (decode-coding-inserted-region): Don't + barf if `buffer-undo-list' is already set to `t'. + +2004-12-29 Jay Belanger + + * calc/calc-prog.el (calc-user-define-formula): Put default values + for function names in prompts. + (calc-user-define-permanent, calc-user-define-composition) + (calc-user-define-formula): Remove the need for "calcFunc-" in the + default input for algebraic functions. + +2004-12-29 Thien-Thi Nguyen + + * vc-rcs.el (vc-rcs-annotate-command): + Fix omission bug: Call `vc-setup-buffer'. + +2004-12-29 Kenichi Handa + + * international/mule.el (recode-region): New function. + +2004-12-28 Richard M. Stallman + + * simple.el (undo-extra-outer-limit): New variable. + (undo-outer-limit-truncate): Test and set it. + + * emacs-lisp/lisp.el (mark-sexp, mark-defun): New arg ALLOW-EXTEND + enables the feature to extend the existing region. + + * simple.el (mark-word): New arg ALLOW-EXTEND + enables the feature to extend the existing region. + + * textmodes/paragraphs.el (mark-paragraph): New arg ALLOW-EXTEND + enables the feature to extend the existing region. + + * startup.el (site-run-file): Don't allow setting it with Custom. + + * simple.el (buffer-disable-undo): Fix previous change. + +2004-12-27 Masatake YAMATO + + * hexl.el (hexlify-buffer): Remove fontification here. + Use font lock mechanism instead. + (hexl-font-lock-keywords): New font lock kewords. + (hexl-mode-old-font-lock-keywords): New variable. + (hexl-mode): Store the old font lock keywords. + (hexl-mode-exit): Restore the old font lock keywords. + +2004-12-27 Richard M. Stallman + + * simple.el (undo): Fix previous change. + +2004-12-27 YAMAMOTO Mitsuharu + + * term/mac-win.el: Sync with x-win.el. Rearrange the contents. + Call mac-clear-font-name-table if invoked on Mac OS 8/9. Call + x-open-connection on Mac OS X. + +2004-12-27 Richard M. Stallman + + * files.el (buffer-save-without-query): New var (buffer-local). + (save-some-buffers): Save those buffers first, w/o asking. + + * files.el (insert-directory-ls-version): New variable. + (insert-directory): When ls returns an error, test the version + number to decide what the return code means. + With --dired output format, detect and distinguish lines + that are really error messages. + (insert-directory-adj-pos): New function. + + * bookmark.el (bookmark-jump): Nice error if BOOKMARK is nil. + + * battery.el (battery-mode-line-format): Remove initial spaces. + + * uniquify.el (uniquify-rationalize-file-buffer-names): + Delete interactive spec. + + * type-break.el (type-break-mode): Set buffer-save-without-query. + Remove code that tried to set save-some-buffers-always. + (type-break-file-keystroke-count): Bind deactivate-mark. + + * mouse.el (mouse-drag-region): Bind mouse-autoselect-window. + + * simple.el (next-error-buffer-p): New arg AVOID-CURRENT. + Test that the buffer is live, and maybe reject current buffer too. + Clarify. + (next-error-find-buffer): Rewrite for clarity. + + * loadup.el: Don't use buffer-disable-undo; do it directly. + + * help-fns.el (describe-function-1): Call symbol-file with `defun'. + (describe-variable): Call symbol-file with `defvar'. + + * subr.el (messages-buffer-max-lines): Alias for message-log-max. + (symbol-file): Rewritten to handle new load-history format. + Now takes an arg TYPE to specify looking for a particular + type of definition only. + + * emacs-lisp/debug.el (debugger-make-xrefs): + Call symbol-file with `defun'. + + * emacs-lisp/find-func.el (find-function-noselect): + Call symbol-file with `defun'. + (find-variable-noselect): Call symbol-file with `defvar'. + + * eshell/esh-cmd.el (eshell-find-alias-function): + Call symbol-file with `defun'. + + * eshell/esh-test.el (eshell-test-goto-func): + Call symbol-file with `defun'. + + * mail/rmail.el (rmail-resend): + Let MAIL-ALIAS-FILE arg override mail-personal-alias-file. + + * net/goto-addr.el (goto-address-mail-regexp): Allow = in username. + + * progmodes/compile.el (compilation-find-buffer): Rename arg. + + * textmodes/texinfmt.el (texinfo-format-buffer-1): + Call buffer-disable-undo. + + * simple.el (undo-list-saved): New variable (buffer-local). + (undo): Set and test it. + (buffer-disable-undo): Moved here from buffer.c. + Clear out undo-list-saved. + + * international/mule.el (decode-coding-inserted-region): + Set buffer-undo-list in a correct and optimal way. + + * progmodes/cperl-mode.el (cperl-find-bad-style): Use with-no-warnings. + (cperl-font-lock-unfontify-region-function): No need to save and + restore info, since font-lock.el does it for us. + + * ansi-color.el (save-buffer-state): Definition deleted. + (ansi-color-unfontify-region): Don't use save-buffer-state. + +2004-12-27 Dave Love + + * wid-edit.el (function): Use restricted-sexp as parent. + +2004-12-27 Kevin Ryde + + * simple.el (next-matching-history-element): Use same + `interactive' form as previous-matching-history-element. + + * ffap.el (ffap-string-at-point-mode-alist): Add "*" to url chars, + it can appear unencoded and has been seen from yahoo. + +2004-12-27 Sergey Poznyakoff (tiny change) + + * mail/smtpmail.el (smtpmail-try-auth-methods): Send AUTH CRAM-MD5 + in upper case. Reported by Wojciech Polak . + +2004-12-27 Kenichi Handa + + * international/utf-8.el (utf-translate-cjk-load-tables): Bind + coding-system-for-read to nil while loading subst-*. + +2004-12-26 Jay Belanger + + * calc/calc-store.el (calc-read-var-name): Remove "var-" from + default input. + +2004-12-26 Luc Teirlinck + + * buff-menu.el (Buffer-menu-revert-function): Clear out undo info + before reverting and disable undo recording while reverting. + +2004-12-26 Thien-Thi Nguyen + + * progmodes/hideshow.el (hs-set-up-overlay): New user var. + (hs-make-overlay): New function. + (hs-isearch-show-temporary): Handle `display' overlay prop specially. + (hs-flag-region): Delete function. + (hs-hide-comment-region): No longer use `hs-flag-region'. + Instead, use `hs-discard-overlays' and `hs-make-overlay'. + (hs-hide-block-at-point): Likewise. + (hs-hide-level-recursive): Use `hs-discard-overlays'. + (hs-hide-all, hs-show-all): Likewise. + (hs-show-block): Likewise. + Also, use overlay prop `hs-b-offset', not `hs-ofs'. + 2004-12-24 Thien-Thi Nguyen * progmodes/hideshow.el: Require `cl' when compiling. @@ -45,16 +381,28 @@ (calculator-radix-grouping-digits) (calculator-radix-grouping-separator): New defcustoms for the new radix grouping mode functionality. - (calculator-mode-hook): Now used in electric mode too. + (calculator-mode-hook): Now used in electric mode too, + (calculator): Call it. (calculator-mode-map): Some new keys. (calculator-message): New function. Some new calls. - (calculator-string-to-number): New function, + (calculator-op, calculator-set-register): Use it. + (calculator-string-to-number): New function, mostly moved and + updated code from calculator-curnum-value. (calculator-curnum-value): Use it. - (calculator-rotate-displayer, calculator-rotate-displayer-back) - (calculator-displayer-prev, calculator-displayer-next): - Change digit group size when in radix mode. - (calculator-number-to-string): Renamed from calculator-num-to-string. - Now deals with digit grouping in radix mode. + (calculator-paste): Use it, and update grabbing the + current-kill. + (calculator-rotate-displayer) + (calculator-rotate-displayer-back): Toggle digit grouping when + in radix mode, use calculator-message. + (calculator-displayer-prev, calculator-displayer-next): Change + digit group size when in radix mode. + (calculator-number-to-string): Renamed from + calculator-num-to-string. Now deals with digit grouping in + radix mode. + (calculator-update-display, calculator-put-value): Use the new + name. + (calculator-fact): Return a floating point number. + (calculator-mode): Doc fix. 2004-12-20 Glenn Morris diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/ansi-color.el --- a/lisp/ansi-color.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/ansi-color.el Sun Jan 02 09:13:19 2005 +0000 @@ -220,23 +220,6 @@ ;; Alternative font-lock-unfontify-region-function for Emacs only - -(eval-when-compile - ;; We use this to preserve or protect things when modifying text - ;; properties. Stolen from lazy-lock and font-lock. Ugly!!! - ;; Probably most of this is not needed? - (defmacro save-buffer-state (varlist &rest body) - "Bind variables according to VARLIST and eval BODY restoring buffer state." - `(let* (,@(append varlist - '((modified (buffer-modified-p)) (buffer-undo-list t) - (inhibit-read-only t) (inhibit-point-motion-hooks t) - before-change-functions after-change-functions - deactivate-mark buffer-file-name buffer-file-truename))) - ,@body - (when (and (not modified) (buffer-modified-p)) - (set-buffer-modified-p nil)))) - (put 'save-buffer-state 'lisp-indent-function 1)) - (defun ansi-color-unfontify-region (beg end &rest xemacs-stuff) "Replacement function for `font-lock-default-unfontify-region'. @@ -259,21 +242,20 @@ \(function (lambda () \(setq font-lock-unfontify-region-function 'ansi-color-unfontify-region))))" - ;; save-buffer-state is a macro in font-lock.el! - (save-buffer-state nil - (when (boundp 'font-lock-syntactic-keywords) - (remove-text-properties beg end '(syntax-table nil))) - ;; instead of just using (remove-text-properties beg end '(face - ;; nil)), we find regions with a non-nil face test-property, skip - ;; positions with the ansi-color property set, and remove the - ;; remaining face test-properties. - (while (setq beg (text-property-not-all beg end 'face nil)) - (setq beg (or (text-property-not-all beg end 'ansi-color t) end)) - (when (get-text-property beg 'face) - (let ((end-face (or (text-property-any beg end 'face nil) - end))) - (remove-text-properties beg end-face '(face nil)) - (setq beg end-face)))))) + ;; Simplified now that font-lock-unfontify-region uses save-buffer-state. + (when (boundp 'font-lock-syntactic-keywords) + (remove-text-properties beg end '(syntax-table nil))) + ;; instead of just using (remove-text-properties beg end '(face + ;; nil)), we find regions with a non-nil face test-property, skip + ;; positions with the ansi-color property set, and remove the + ;; remaining face test-properties. + (while (setq beg (text-property-not-all beg end 'face nil)) + (setq beg (or (text-property-not-all beg end 'ansi-color t) end)) + (when (get-text-property beg 'face) + (let ((end-face (or (text-property-any beg end 'face nil) + end))) + (remove-text-properties beg end-face '(face nil)) + (setq beg end-face))))) ;; Working with strings diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/autorevert.el --- a/lisp/autorevert.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/autorevert.el Sun Jan 02 09:13:19 2005 +0000 @@ -123,7 +123,8 @@ (defvar auto-revert-tail-mode nil "*Non-nil when Auto-Revert Tail Mode is active. -Never set this variable directly, use the command `auto-revert-mode' instead.") +Never set this variable directly, use the command +`auto-revert-tail-mode' instead.") (put 'auto-revert-tail-mode 'permanent-local t) (defvar auto-revert-timer nil @@ -443,11 +444,13 @@ (file buffer-file-name) buffer-file-name) ; ignore that file has changed (when (> size auto-revert-tail-pos) + (undo-boundary) (save-restriction (widen) (save-excursion (goto-char (point-max)) (insert-file-contents file nil auto-revert-tail-pos size))) + (undo-boundary) (setq auto-revert-tail-pos size) (set-buffer-modified-p modified))) (set-visited-file-modtime)) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/battery.el --- a/lisp/battery.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/battery.el Sun Jan 02 09:13:19 2005 +0000 @@ -73,12 +73,13 @@ (defvar battery-mode-line-string nil "String to display in the mode line.") +;;;###autoload (put 'battery-mode-line-string 'risky-local-variable t) (defcustom battery-mode-line-format (cond ((eq battery-status-function 'battery-linux-proc-apm) - " [%b%p%%]") + "[%b%p%%]") ((eq battery-status-function 'battery-linux-proc-acpi) - " [%b%p%%,%d°C]")) + "[%b%p%%,%d°C]")) "*Control string formatting the string to display in the mode line. Ordinary characters in the control string are printed as-is, while conversion specifications introduced by a `%' character in the control @@ -128,13 +129,14 @@ (defun battery-update () "Update battery status information in the mode line." - (setq battery-mode-line-string (propertize (if (and battery-mode-line-format - battery-status-function) - (battery-format - battery-mode-line-format - (funcall battery-status-function)) - "") - 'help-echo "Battery status information")) + (setq battery-mode-line-string + (propertize (if (and battery-mode-line-format + battery-status-function) + (battery-format + battery-mode-line-format + (funcall battery-status-function)) + "") + 'help-echo "Battery status information")) (force-mode-line-update)) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/bookmark.el --- a/lisp/bookmark.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/bookmark.el Sun Jan 02 09:13:19 2005 +0000 @@ -1049,6 +1049,8 @@ (interactive (list (bookmark-completing-read "Jump to bookmark" bookmark-current-bookmark))) + (unless bookmark + (error "No bookmark specified")) (bookmark-maybe-historicize-string bookmark) (let ((cell (bookmark-jump-noselect bookmark))) (and cell diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/buff-menu.el --- a/lisp/buff-menu.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/buff-menu.el Sun Jan 02 09:13:19 2005 +0000 @@ -198,11 +198,15 @@ (revert-buffer)) (defun Buffer-menu-revert-function (ignore1 ignore2) + (or (eq buffer-undo-list t) + (setq buffer-undo-list nil)) ;; We can not use save-excursion here. The buffer gets erased. (let ((ocol (current-column)) (oline (progn (move-to-column 4) (get-text-property (point) 'buffer))) - (prop (point-min))) + (prop (point-min)) + ;; do not make undo records for the reversion. + (buffer-undo-list t)) (list-buffers-noselect Buffer-menu-files-only) (while (setq prop (next-single-property-change prop 'buffer)) (when (eq (get-text-property prop 'buffer) oline) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/calc/calc-graph.el --- a/lisp/calc/calc-graph.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/calc/calc-graph.el Sun Jan 02 09:13:19 2005 +0000 @@ -955,9 +955,7 @@ (define-key calc-dumb-map "\C-c\C-c" 'exit-recursive-edit))) (use-local-map calc-dumb-map) (setq truncate-lines t) - (message "Type `q'%s to return to Calc" - (if (eq (lookup-key (current-global-map) "\e#") 'calc-dispatch) - " or `M-# M-#'" "")) + (message "Type `q' or `C-c C-c' to return to Calc") (recursive-edit) (bury-buffer "*Gnuplot Trail*"))) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/calc/calc-prog.el --- a/lisp/calc/calc-prog.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/calc/calc-prog.el Sun Jan 02 09:13:19 2005 +0000 @@ -170,7 +170,8 @@ (arglist nil) (is-lambda (and (eq (car-safe form) 'calcFunc-lambda) (>= (length form) 2))) - odef key keyname cmd cmd-base func calc-user-formula-alist is-symb) + odef key keyname cmd cmd-base cmd-base-default + func calc-user-formula-alist is-symb) (if is-lambda (setq arglist (mapcar (function (lambda (x) (nth 1 x))) (nreverse (cdr (reverse (cdr form))))) @@ -189,18 +190,25 @@ (char-to-string key) (format "%03d" key))) odef (assq key (calc-user-key-map))) + (unless keyname + (setq keyname (format "%05d" (abs (% (random) 10000))))) (while (progn - (setq cmd (completing-read "Define M-x command name: " - obarray 'commandp nil - (if (and odef (symbolp (cdr odef))) - (symbol-name (cdr odef)) - "calc-")) - cmd-base (and (string-match "\\`calc-\\(.+\\)\\'" cmd) - (math-match-substring cmd 1)) - cmd (and (not (or (string-equal cmd "") - (string-equal cmd "calc-"))) - (intern cmd))) + (setq cmd-base-default (concat "User-" keyname)) + (setq cmd (completing-read + (concat "Define M-x command name (default: calc-" + cmd-base-default + "): ") + obarray 'commandp nil + (if (and odef (symbolp (cdr odef))) + (symbol-name (cdr odef)) + "calc-"))) + (if (or (string-equal cmd "") + (string-equal cmd "calc-")) + (setq cmd (concat "calc-User-" keyname))) + (setq cmd-base (and (string-match "\\`calc-\\(.+\\)\\'" cmd) + (math-match-substring cmd 1))) + (setq cmd (intern cmd)) (and cmd (fboundp cmd) odef @@ -210,24 +218,33 @@ (concat "Replace previous definition for " (symbol-name cmd) "? ") "That name conflicts with a built-in Emacs function. Replace this function? ")))))) - (if (and key (not cmd)) - (setq cmd (intern (concat "calc-User-" keyname)))) (while (progn - (setq func (completing-read "Define algebraic function name: " - obarray 'fboundp nil - (concat "calcFunc-" - (if cmd-base - (if (string-match - "\\`User-.+" cmd-base) - (concat - "User" - (substring cmd-base 5)) - cmd-base) - ""))) - func (and (not (or (string-equal func "") - (string-equal func "calcFunc-"))) - (intern func))) + (setq cmd-base-default + (if cmd-base + (if (string-match + "\\`User-.+" cmd-base) + (concat + "User" + (substring cmd-base 5)) + cmd-base) + (concat "User" keyname))) + (setq func + (concat "calcFunc-" + (completing-read + (concat "Define algebraic function name (default: " + cmd-base-default "): ") + (mapcar (lambda (x) (substring x 9)) + (all-completions "calcFunc-" + obarray)) + (lambda (x) + (fboundp + (intern (concat "calcFunc-" x)))) + nil))) + (setq func + (if (string-equal func "calcFunc-") + (intern (concat "calcFunc-" cmd-base-default)) + (intern func))) (and func (fboundp func) (not (fboundp cmd)) @@ -238,11 +255,13 @@ (concat "Replace previous definition for " (symbol-name func) "? ") "That name conflicts with a built-in Emacs function. Replace this function? ")))))) + (if (not func) (setq func (intern (concat "calcFunc-User" (or keyname (and cmd (symbol-name cmd)) (format "%05d" (% (random) 10000))))))) + (if is-lambda (setq calc-user-formula-alist arglist) (while @@ -359,8 +378,15 @@ (if (eq calc-language 'unform) (error "Can't define formats for unformatted mode")) (let* ((comp (calc-top 1)) - (func (intern (completing-read "Define format for which function: " - obarray 'fboundp nil "calcFunc-"))) + (func (intern + (concat "calcFunc-" + (completing-read "Define format for which function: " + (mapcar (lambda (x) (substring x 9)) + (all-completions "calcFunc-" + obarray)) + (lambda (x) + (fboundp + (intern (concat "calcFunc-" x)))))))) (comps (get func 'math-compose-forms)) entry entry2 (arglist nil) @@ -696,7 +722,7 @@ (setcar mac new)))))))) (let ((keys (progn (and (fboundp 'edit-kbd-macro) (edit-kbd-macro nil)) - (fboundp 'MacEdit-parse-keys)))) + (fboundp 'edmacro-parse-keys)))) (calc-wrapper (calc-edit-mode (list 'calc-finish-macro-edit (list 'quote def) @@ -749,7 +775,7 @@ (if (and keys (looking-at "\n")) (forward-line 1)) (let* ((true-str (buffer-substring (point) (point-max))) (str true-str)) - (if keys (setq str (MacEdit-parse-keys str))) + (if keys (setq str (edmacro-parse-keys str))) (if (symbolp (cdr def)) (if (stringp (symbol-function (cdr def))) (fset (cdr def) str) @@ -761,128 +787,6 @@ (setcar mac str)))) (setcdr def str)))) -;;; The following are hooks into the MacEdit package from macedit.el. -(put 'calc-execute-extended-command 'MacEdit-print - (function (lambda () - (setq macro-str (concat "\excalc-" macro-str))))) - -(put 'calcDigit-start 'MacEdit-print - (function (lambda () - (if calc-algebraic-mode - (calc-macro-edit-algebraic) - (MacEdit-unread-chars key-last) - (let ((str "") - (min-bsp 0) - ch last) - (while (and (setq ch (MacEdit-read-char)) - (or (and (>= ch ?0) (<= ch ?9)) - (memq ch '(?\. ?e ?\_ ?n ?\: ?\# ?M - ?o ?h ?\@ ?\")) - (and (memq ch '(?\' ?m ?s)) - (string-match "[@oh]" str)) - (and (or (and (>= ch ?a) (<= ch ?z)) - (and (>= ch ?A) (<= ch ?Z))) - (string-match - "^[-+]?\\(1[1-9]\\|[2-9][0-9]\\)#" - str)) - (and (memq ch '(?\177 ?\C-h)) - (> (length str) 0)) - (and (memq ch '(?+ ?-)) - (> (length str) 0) - (eq (aref str (1- (length str))) - ?e)))) - (if (or (and (>= ch ?0) (<= ch ?9)) - (and (or (not (memq ch '(?\177 ?\C-h))) - (<= (length str) min-bsp)) - (setq min-bsp (1+ (length str))))) - (setq str (concat str (char-to-string ch))) - (setq str (substring str 0 -1)))) - (if (memq ch '(32 10 13)) - (setq str (concat str (char-to-string ch))) - (MacEdit-unread-chars ch)) - (insert "type \"") - (MacEdit-insert-string str) - (insert "\"\n")))))) - -(defun calc-macro-edit-algebraic () - (MacEdit-unread-chars key-last) - (let ((str "") - (min-bsp 0)) - (while (progn - (MacEdit-lookup-key calc-alg-ent-map) - (or (and (memq key-symbol '(self-insert-command - calcAlg-previous)) - (< (length str) 60)) - (memq key-symbol - '(backward-delete-char - delete-backward-char - backward-delete-char-untabify)) - (eq key-last 9))) - (setq macro-str (substring macro-str (length key-str))) - (if (or (eq key-symbol 'self-insert-command) - (and (or (not (memq key-symbol '(backward-delete-char - delete-backward-char - backward-delete-char-untabify))) - (<= (length str) min-bsp)) - (setq min-bsp (+ (length str) (length key-str))))) - (setq str (concat str key-str)) - (setq str (substring str 0 -1)))) - (if (memq key-last '(10 13)) - (setq str (concat str key-str) - macro-str (substring macro-str (length key-str)))) - (if (> (length str) 0) - (progn - (insert "type \"") - (MacEdit-insert-string str) - (insert "\"\n"))))) -(put 'calc-algebraic-entry 'MacEdit-print 'calc-macro-edit-algebraic) -(put 'calc-auto-algebraic-entry 'MacEdit-print 'calc-macro-edit-algebraic) - -(defun calc-macro-edit-variable (&optional no-cmd) - (let ((str "") ch) - (or no-cmd (insert (symbol-name key-symbol) "\n")) - (if (memq (MacEdit-peek-char) '(?\+ ?\- ?\* ?\/ ?^ ?\|)) - (setq str (char-to-string (MacEdit-read-char)))) - (if (and (setq ch (MacEdit-peek-char)) - (>= ch ?0) (<= ch ?9)) - (insert "type \"" str - (char-to-string (MacEdit-read-char)) "\"\n") - (if (> (length str) 0) - (insert "type \"" str "\"\n")) - (MacEdit-read-argument)))) -(put 'calc-store 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-into 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-neg 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-plus 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-minus 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-times 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-div 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-power 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-concat 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-inv 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-decr 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-incr 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-store-exchange 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-unstore 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-recall 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-let 'MacEdit-print 'calc-macro-edit-variable) -(put 'calc-permanent-variable 'MacEdit-print 'calc-macro-edit-variable) - -(defun calc-macro-edit-variable-2 () - (calc-macro-edit-variable) - (calc-macro-edit-variable t)) -(put 'calc-copy-variable 'MacEdit-print 'calc-macro-edit-variable-2) -(put 'calc-declare-variable 'MacEdit-print 'calc-macro-edit-variable-2) - -(defun calc-macro-edit-quick-digit () - (insert "type \"" key-str "\" # " (symbol-name key-symbol) "\n")) -(put 'calc-store-quick 'MacEdit-print 'calc-macro-edit-quick-digit) -(put 'calc-store-into-quick 'MacEdit-print 'calc-macro-edit-quick-digit) -(put 'calc-recall-quick 'MacEdit-print 'calc-macro-edit-quick-digit) -(put 'calc-select-part 'MacEdit-print 'calc-macro-edit-quick-digit) -(put 'calc-clean-num 'MacEdit-print 'calc-macro-edit-quick-digit) - - (defun calc-finish-formula-edit (func) (let ((buf (current-buffer)) (str (buffer-substring (point) (point-max))) @@ -952,10 +856,24 @@ (assq (downcase key) (calc-user-key-map)) (and (eq key ?\') (cons nil + (intern + (concat "calcFunc-" + (completing-read + (format "Record in %s the algebraic function: " + calc-settings-file) + (mapcar (lambda (x) (substring x 9)) + (all-completions "calcFunc-" + obarray)) + (lambda (x) + (fboundp + (intern (concat "calcFunc-" x)))) + t))))) + (and (eq key ?\M-x) + (cons nil (intern (completing-read - (format "Record in %s the function: " + (format "Record in %s the command: " calc-settings-file) - obarray 'fboundp nil "calcFunc-")))) + obarray 'fboundp nil "calc-")))) (error "No command defined for that key")))) (set-buffer (find-file-noselect (substitute-in-file-name calc-settings-file))) @@ -979,7 +897,7 @@ (vectorp (nth 1 (nth 3 fcmd))) (progn (and (fboundp 'edit-kbd-macro) (edit-kbd-macro nil)) - (fboundp 'MacEdit-parse-keys)) + (fboundp 'edmacro-parse-keys)) (setq q-ok t) (aset (nth 1 (nth 3 fcmd)) 1 nil)) (insert (setq str (prin1-to-string @@ -1065,7 +983,7 @@ (setq mac (or (aref mac 1) (aset mac 1 (progn (and (fboundp 'edit-kbd-macro) (edit-kbd-macro nil)) - (MacEdit-parse-keys (aref mac 0))))))) + (edmacro-parse-keys (aref mac 0))))))) (if (< (prefix-numeric-value arg) 0) (execute-kbd-macro mac (- (prefix-numeric-value arg))) (if calc-executing-macro diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/calc/calc-store.el --- a/lisp/calc/calc-store.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/calc/calc-store.el Sun Jan 02 09:13:19 2005 +0000 @@ -174,13 +174,17 @@ (defun calc-read-var-name (prompt &optional calc-store-opers) (setq calc-given-value nil calc-aborted-prefix nil) - (let ((var (let ((minibuffer-completion-table obarray) - (minibuffer-completion-predicate 'boundp) - (minibuffer-completion-confirm t)) - (read-from-minibuffer prompt "var-" calc-var-name-map nil)))) + (let ((var (concat + "var-" + (let ((minibuffer-completion-table + (mapcar (lambda (x) (substring x 4)) + (all-completions "var-" obarray))) + (minibuffer-completion-predicate + (lambda (x) (boundp (intern (concat "var-" x))))) + (minibuffer-completion-confirm t)) + (read-from-minibuffer prompt nil calc-var-name-map nil))))) (setq calc-aborted-prefix "") - (and (not (equal var "")) - (not (equal var "var-")) + (and (not (equal var "var-")) (if (string-match "\\`\\([-a-zA-Z0-9]+\\) *:?=" var) (if (null calc-given-value-flag) (error "Assignment is not allowed in this command") @@ -196,7 +200,7 @@ (defun calcVar-digit () (interactive) - (if (calc-minibuffer-contains "var-\\'") + (if (calc-minibuffer-contains "\\'") (if (eq calc-store-opers 0) (beep) (insert "q") @@ -206,7 +210,7 @@ (defun calcVar-oper () (interactive) (if (and (eq calc-store-opers t) - (calc-minibuffer-contains "var-\\'")) + (calc-minibuffer-contains "\\'")) (progn (erase-buffer) (self-insert-and-exit)) @@ -369,9 +373,10 @@ (if var1 (let ((value (calc-var-value var1))) (or value - (error "No such variable: \"%s\"" (calc-var-name var))) + (error "No such variable: \"%s\"" (calc-var-name var1))) (or var2 (setq var2 (calc-read-var-name - (format "Copy variable: %s, to: " var1)))) + (format "Copy variable: %s, to: " + (calc-var-name var1))))) (if var2 (calc-store-value var2 value "")))))) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/calc/calc-yank.el --- a/lisp/calc/calc-yank.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/calc/calc-yank.el Sun Jan 02 09:13:19 2005 +0000 @@ -460,16 +460,14 @@ (make-local-variable 'calc-allow-ret) (setq calc-allow-ret allow-ret) (erase-buffer) + (add-hook 'kill-buffer-hook (lambda () + (let ((calc-edit-handler nil)) + (calc-edit-finish t)) + (message "(Cancelled)")) t t) (insert (or title title "Calc Edit Mode") - ". Press " - (if (eq (lookup-key (current-global-map) "\e#") 'calc-dispatch) - "M-# M-# or C-c C-c" - (if allow-ret "C-c C-c" "RET")) - " to finish, " - (if (eq (lookup-key (current-global-map) "\e#") 'calc-dispatch) - "M-# x" - "C-x k RET") - " to cancel.\n"))) + ". Press `C-c C-c'" + (if allow-ret "" " or RET") + " to finish, `C-x k RET' to cancel.\n"))) (put 'calc-edit-mode 'mode-class 'special) (defun calc-show-edit-buffer () diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/calc/calc.el --- a/lisp/calc/calc.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/calc/calc.el Sun Jan 02 09:13:19 2005 +0000 @@ -1167,12 +1167,9 @@ (exit-recursive-edit) (if (eq major-mode 'calc-edit-mode) (calc-edit-finish arg) - (if (eq major-mode 'MacEdit-mode) - (MacEdit-finish-edit) - (if calc-was-keypad-mode - (calc-keypad) - (calc arg calc-full-mode t)))))) - + (if calc-was-keypad-mode + (calc-keypad) + (calc arg calc-full-mode t))))) (defun calc-quit (&optional non-fatal interactive) (interactive "i\np") @@ -1183,33 +1180,31 @@ (exit-recursive-edit)) (if (eq major-mode 'calc-edit-mode) (calc-edit-cancel) - (if (eq major-mode 'MacEdit-mode) - (MacEdit-cancel-edit) - (if (and interactive - calc-embedded-info - (eq (current-buffer) (aref calc-embedded-info 0))) - (calc-embedded nil) - (unless (eq major-mode 'calc-mode) - (calc-create-buffer)) - (run-hooks 'calc-end-hook) - (setq calc-undo-list nil calc-redo-list nil) - (mapcar (function (lambda (v) (set-default v (symbol-value v)))) - calc-local-var-list) - (let ((buf (current-buffer)) - (win (get-buffer-window (current-buffer))) - (kbuf (get-buffer "*Calc Keypad*"))) - (delete-windows-on (calc-trail-buffer)) - (if (and win - (< (window-height win) (1- (frame-height))) - (= (window-width win) (frame-width)) ; avoid calc-keypad - (not (get-buffer-window "*Calc Keypad*"))) - (setq calc-window-height (- (window-height win) 2))) - (progn - (delete-windows-on buf) - (delete-windows-on kbuf)) - (bury-buffer buf) - (bury-buffer calc-trail-buffer) - (and kbuf (bury-buffer kbuf))))))) + (if (and interactive + calc-embedded-info + (eq (current-buffer) (aref calc-embedded-info 0))) + (calc-embedded nil) + (unless (eq major-mode 'calc-mode) + (calc-create-buffer)) + (run-hooks 'calc-end-hook) + (setq calc-undo-list nil calc-redo-list nil) + (mapcar (function (lambda (v) (set-default v (symbol-value v)))) + calc-local-var-list) + (let ((buf (current-buffer)) + (win (get-buffer-window (current-buffer))) + (kbuf (get-buffer "*Calc Keypad*"))) + (delete-windows-on (calc-trail-buffer)) + (if (and win + (< (window-height win) (1- (frame-height))) + (= (window-width win) (frame-width)) ; avoid calc-keypad + (not (get-buffer-window "*Calc Keypad*"))) + (setq calc-window-height (- (window-height win) 2))) + (progn + (delete-windows-on buf) + (delete-windows-on kbuf)) + (bury-buffer buf) + (bury-buffer calc-trail-buffer) + (and kbuf (bury-buffer kbuf)))))) ;;;###autoload (defun quick-calc () diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/emacs-lisp/debug.el --- a/lisp/emacs-lisp/debug.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/emacs-lisp/debug.el Sun Jan 02 09:13:19 2005 +0000 @@ -352,7 +352,7 @@ (end (progn (skip-syntax-forward "w_") (point))) (sym (intern-soft (buffer-substring-no-properties beg end))) - (file (and sym (symbol-file sym)))) + (file (and sym (symbol-file sym 'defun)))) (when file (goto-char beg) ;; help-xref-button needs to operate on something matched diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/emacs-lisp/find-func.el --- a/lisp/emacs-lisp/find-func.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/emacs-lisp/find-func.el Sun Jan 02 09:13:19 2005 +0000 @@ -242,7 +242,7 @@ (let ((library (cond ((eq (car-safe def) 'autoload) (nth 1 def)) - ((symbol-file function))))) + ((symbol-file function 'defun))))) (find-function-search-for-symbol function nil library)))) (defalias 'function-at-point 'function-called-at-point) @@ -347,8 +347,7 @@ `find-function-source-path', if non nil, otherwise in `load-path'." (if (not variable) (error "You didn't specify a variable")) - ;; Fixme: I think `symbol-file' should be fixed instead. -- fx - (let ((library (or file (symbol-file (cons 'defvar variable))))) + (let ((library (or file (symbol-file variable 'defvar)))) (find-function-search-for-symbol variable 'variable library))) ;;;###autoload diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/emacs-lisp/lisp.el --- a/lisp/emacs-lisp/lisp.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/emacs-lisp/lisp.el Sun Jan 02 09:13:19 2005 +0000 @@ -69,15 +69,17 @@ (or arg (setq arg 1)) (forward-sexp (- arg))) -(defun mark-sexp (&optional arg) +(defun mark-sexp (&optional arg allow-extend) "Set mark ARG sexps from point. The place mark goes is the same place \\[forward-sexp] would move to with the same argument. -If this command is repeated or mark is active in Transient Mark mode, +Interactively, if this command is repeated +or (in Transient Mark mode) if the mark is active, it marks the next ARG sexps after the ones already marked." - (interactive "P") - (cond ((or (and (eq last-command this-command) (mark t)) - (and transient-mark-mode mark-active)) + (interactive "P\np") + (cond ((and allow-extend + (or (and (eq last-command this-command) (mark t)) + (and transient-mark-mode mark-active))) (setq arg (if arg (prefix-numeric-value arg) (if (< (mark) (point)) -1 1))) (set-mark @@ -289,14 +291,17 @@ (goto-char (point-min))))) (setq arg (1+ arg)))))) -(defun mark-defun () +(defun mark-defun (&optional allow-extend) "Put mark at end of this defun, point at beginning. The defun marked is the one that contains point or follows point. -If this command is repeated or mark is active in Transient Mark mode, -it marks more defuns after the ones already marked." - (interactive) - (cond ((or (and (eq last-command this-command) (mark t)) - (and transient-mark-mode mark-active)) + +Interactively, if this command is repeated +or (in Transient Mark mode) if the mark is active, +it marks the next defun after the ones already marked." + (interactive "p") + (cond ((and allow-extend + (or (and (eq last-command this-command) (mark t)) + (and transient-mark-mode mark-active))) (set-mark (save-excursion (goto-char (mark)) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/eshell/em-hist.el --- a/lisp/eshell/em-hist.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/eshell/em-hist.el Sun Jan 02 09:13:19 2005 +0000 @@ -840,7 +840,7 @@ (unless (minibuffer-window-active-p (selected-window)) (message "History item: %d" (- (ring-length eshell-history-ring) pos))) ;; Can't use kill-region as it sets this-command - (delete-region (save-excursion (eshell-bol) (point)) (point)) + (delete-region eshell-last-output-end (point)) (insert-and-inherit (eshell-get-history pos))))) (defun eshell-next-matching-input (regexp arg) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/eshell/esh-cmd.el --- a/lisp/eshell/esh-cmd.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/eshell/esh-cmd.el Sun Jan 02 09:13:19 2005 +0000 @@ -1285,7 +1285,7 @@ (defun eshell-find-alias-function (name) "Check whether a function called `eshell/NAME' exists." (let* ((sym (intern-soft (concat "eshell/" name))) - (file (symbol-file sym))) + (file (symbol-file sym 'defun))) ;; If the function exists, but is defined in an eshell module ;; that's not currently enabled, don't report it as found (if (and file diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/eshell/esh-test.el --- a/lisp/eshell/esh-test.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/eshell/esh-test.el Sun Jan 02 09:13:19 2005 +0000 @@ -125,7 +125,7 @@ (let ((fsym (get-text-property (point) 'test-func))) (when fsym (let* ((def (symbol-function fsym)) - (library (locate-library (symbol-file fsym))) + (library (locate-library (symbol-file fsym 'defun))) (name (substring (symbol-name fsym) (length "eshell-test--"))) (inhibit-redisplay t)) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/faces.el --- a/lisp/faces.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/faces.el Sun Jan 02 09:13:19 2005 +0000 @@ -854,12 +854,15 @@ (get-char-property (point) 'face))) faces) ;; Make a list of the named faces that the `face' property uses. - (if (listp faceprop) + (if (and (listp faceprop) + ;; Don't treat an attribute spec as a list of faces. + (not (keywordp (car faceprop))) + (not (memq (car faceprop) '(foreground-color background-color)))) (dolist (f faceprop) (if (symbolp f) (push f faces))) (if (symbolp faceprop) - (setq faces (list faceprop)))) + (push faceprop faces))) ;; If there are none, try to get a face name from the buffer. (if (and (null faces) (memq (intern-soft (thing-at-point 'symbol)) (face-list))) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/ffap.el --- a/lisp/ffap.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/ffap.el Sun Jan 02 09:13:19 2005 +0000 @@ -962,7 +962,7 @@ ;; * no commas (good for latex) (file "--:$+<>@-Z_a-z~*?" "<@" "@>;.,!:") ;; An url, or maybe a email/news message-id: - (url "--:=&?$+@-Z_a-z~#,%;" "^A-Za-z0-9" ":;.,!?") + (url "--:=&?$+@-Z_a-z~#,%;*" "^A-Za-z0-9" ":;.,!?") ;; Find a string that does *not* contain a colon: (nocolon "--9$+<>@-Z_a-z~" "<@" "@>;.,!?") ;; A machine: diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/files.el --- a/lisp/files.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/files.el Sun Jan 02 09:13:19 2005 +0000 @@ -273,14 +273,40 @@ :group 'backup) (defcustom require-final-newline nil - "*Value of t says silently ensure a file ends in a newline when it is saved. -Non-nil but not t says ask user whether to add a newline when there isn't one. -nil means don't add newlines." - :type '(choice (const :tag "Off" nil) - (const :tag "Add" t) + "*Whether to add a newline automatically at the end of the file. + +A value of t means do this only when the file is about to be saved. +A value of `visit' means do this right after the file is visited. +A value of `visit-save' means do it at both of those times. +Any other non-nil value means ask user whether to add a newline, when saving. +nil means don't add newlines. + +Certain major modes set this locally to the value obtained +from `mode-require-final-newline'." + :type '(choice (const :tag "When visiting" visit) + (const :tag "When saving" t) + (const :tag "When visiting or saving" visit-save) + (const :tag "Never" nil) (other :tag "Ask" ask)) :group 'editing-basics) +(defcustom mode-require-final-newline t + "*Whether to add a newline at the end of the file, in certain major modes. +Those modes set `require-final-newline' to this value when you enable them. +They do so because they are used for files that are supposed +to end in newlines, and the question is how to arrange that. + +A value of t means do this only when the file is about to be saved. +A value of `visit' means do this right after the file is visited. +A value of `visit-save' means do it at both of those times. +Any other non-nil value means ask user whether to add a newline, when saving." + :type '(choice (const :tag "When visiting" visit) + (const :tag "When saving" t) + (const :tag "When visiting or saving" visit-save) + (other :tag "Ask" ask)) + :group 'editing-basics + :version "21.4") + (defcustom auto-save-default t "*Non-nil says by default do auto-saving of every file-visiting buffer." :type 'boolean @@ -1200,7 +1226,8 @@ "Return the buffer visiting file FILENAME (a string). This is like `get-file-buffer', except that it checks for any buffer visiting the same file, possibly under a different name. -If PREDICATE is non-nil, only a buffer satisfying it can be returned. +If PREDICATE is non-nil, only buffers satisfying it are eligible, +and others are ignored. If there is no such live buffer, return nil." (let ((predicate (or predicate #'identity)) (truename (abbreviate-file-name (file-truename filename)))) @@ -1626,6 +1653,15 @@ (when (and view-read-only view-mode) (view-mode-disable)) (normal-mode t) + ;; If requested, add a newline at the end of the file. + (and (memq require-final-newline '(visit visit-save)) + (> (point-max) (point-min)) + (/= (char-after (1- (point-max))) ?\n) + (not (and (eq selective-display t) + (= (char-after (1- (point-max))) ?\r))) + (save-excursion + (goto-char (point-max)) + (insert "\n"))) (when (and buffer-read-only view-read-only (not (eq (get major-mode 'mode-class) 'special))) @@ -2182,7 +2218,7 @@ buffer-file-name) (concat "buffer " (buffer-name)))))))))) - (let (prefix prefixlen suffix beg + (let (prefix suffix beg (enable-local-eval enable-local-eval)) ;; The prefix is what comes before "local variables:" in its line. ;; The suffix is what comes after "local variables:" in its line. @@ -2196,8 +2232,7 @@ (buffer-substring (point) (progn (beginning-of-line) (point))))) - (if prefix (setq prefixlen (length prefix) - prefix (regexp-quote prefix))) + (setq prefix (if prefix (regexp-quote prefix) "^")) (if suffix (setq suffix (concat (regexp-quote suffix) "$"))) (forward-line 1) (let ((startpos (point)) @@ -3194,6 +3229,7 @@ (not (and (eq selective-display t) (= (char-after (1- (point-max))) ?\r))) (or (eq require-final-newline t) + (eq require-final-newline 'visit-save) (and require-final-newline (y-or-n-p (format "Buffer %s does not end in newline. Add one? " @@ -3238,7 +3274,8 @@ (if save-buffer-coding-system (let ((coding-system-for-write save-buffer-coding-system)) (basic-save-buffer-2)) - (basic-save-buffer-2))) + (basic-save-buffer-2)) + (setq buffer-file-coding-system-explicit last-coding-system-used)) ;; This returns a value (MODES . BACKUPNAME), like backup-buffer. (defun basic-save-buffer-2 () @@ -3363,6 +3400,10 @@ "ACTION-ALIST argument used in call to `map-y-or-n-p'.") (put 'save-some-buffers-action-alist 'risky-local-variable t) +(defvar buffer-save-without-query nil + "Non-nil means `save-some-buffers' should save this buffer without asking.") +(make-variable-buffer-local 'buffer-save-without-query) + (defun save-some-buffers (&optional arg pred) "Save some modified file-visiting buffers. Asks user about each one. You can answer `y' to save, `n' not to save, `C-r' to look at the @@ -3380,8 +3421,18 @@ change the additional actions you can take on files." (interactive "P") (save-window-excursion - (let* ((queried nil) - (files-done + (let* (queried some-automatic + files-done abbrevs-done) + (dolist (buffer (buffer-list)) + ;; First save any buffers that we're supposed to save unconditionally. + ;; That way the following code won't ask about them. + (with-current-buffer buffer + (when (and buffer-save-without-query (buffer-modified-p)) + (setq some-automatic t) + (save-buffer)))) + ;; Ask about those buffers that merit it, + ;; and record the number thus saved. + (setq files-done (map-y-or-n-p (function (lambda (buffer) @@ -3410,19 +3461,22 @@ (buffer-list) '("buffer" "buffers" "save") save-some-buffers-action-alist)) - (abbrevs-done - (and save-abbrevs abbrevs-changed - (progn - (if (or arg - (eq save-abbrevs 'silently) - (y-or-n-p (format "Save abbrevs in %s? " - abbrev-file-name))) - (write-abbrev-file nil)) - ;; Don't keep bothering user if he says no. - (setq abbrevs-changed nil) - t)))) + ;; Maybe to save abbrevs, and record whether + ;; we either saved them or asked to. + (and save-abbrevs abbrevs-changed + (progn + (if (or arg + (eq save-abbrevs 'silently) + (y-or-n-p (format "Save abbrevs in %s? " + abbrev-file-name))) + (write-abbrev-file nil)) + ;; Don't keep bothering user if he says no. + (setq abbrevs-changed nil) + (setq abbrevs-done t))) (or queried (> files-done 0) abbrevs-done - (message "(No files need saving)"))))) + (message (if some-automatic + "(Some special files were saved without asking)" + "(No files need saving)")))))) (defun not-modified (&optional arg) "Mark current buffer as unmodified, not needing to be saved. @@ -3691,11 +3745,11 @@ (unlock-buffer))) (widen) (let ((coding-system-for-read - ;; Auto-saved file shoule be read without - ;; any code conversion. - (if auto-save-p 'utf-8-emacs + ;; Auto-saved file shoule be read by Emacs' + ;; internal coding. + (if auto-save-p 'auto-save-coding (or coding-system-for-read - buffer-file-coding-system)))) + buffer-file-coding-system-explicit)))) ;; This force after-insert-file-set-coding ;; (called from insert-file-contents) to set ;; buffer-file-coding-system to a proper value. @@ -4309,6 +4363,8 @@ (buffer-substring (point) end))))))))) +(defvar insert-directory-ls-version 'unknown) + ;; insert-directory ;; - must insert _exactly_one_line_ describing FILE if WILDCARD and ;; FULL-DIRECTORY-P is nil. @@ -4418,6 +4474,56 @@ (concat (file-name-as-directory file) ".") file)))))))) + ;; If we got "//DIRED//" in the output, it means we got a real + ;; directory listing, even if `ls' returned nonzero. + ;; So ignore any errors. + (when (if (stringp switches) + (string-match "--dired\\>" switches) + (member "--dired" switches)) + (save-excursion + (forward-line -2) + (when (looking-at "//SUBDIRED//") + (forward-line -1)) + (if (looking-at "//DIRED//") + (setq result 0)))) + + (when (and (not (eq 0 result)) + (eq insert-directory-ls-version 'unknown)) + ;; The first time ls returns an error, + ;; find the version numbers of ls, + ;; and set insert-directory-ls-version + ;; to > if it is more than 5.2.1, < if it is less, nil if it + ;; is equal or if the info cannot be obtained. + ;; (That can mean it isn't GNU ls.) + (let ((version-out + (with-temp-buffer + (call-process "ls" nil t nil "--version") + (buffer-string)))) + (if (string-match "ls (.*utils) \\([0-9.]*\\)$" version-out) + (let* ((version (match-string 1 version-out)) + (split (split-string version "[.]")) + (numbers (mapcar 'string-to-int split)) + (min '(5 2 1)) + comparison) + (while (and (not comparison) (or numbers min)) + (cond ((null min) + (setq comparison '>)) + ((null numbers) + (setq comparison '<)) + ((> (car numbers) (car min)) + (setq comparison '>)) + ((< (car numbers) (car min)) + (setq comparison '<)) + (t + (setq numbers (cdr numbers) + min (cdr min))))) + (setq insert-directory-ls-version (or comparison '=))) + (setq insert-directory-ls-version nil)))) + + ;; For GNU ls versions 5.2.2 and up, ignore minor errors. + (when (and (eq 1 result) (eq insert-directory-ls-version '>)) + (setq result 0)) + ;; If `insert-directory-program' failed, signal an error. (unless (eq 0 result) ;; Delete the error message it may have output. @@ -4444,23 +4550,39 @@ (when (looking-at "//SUBDIRED//") (delete-region (point) (progn (forward-line 1) (point))) (forward-line -1)) - (if (looking-at "//DIRED//") - (let ((end (line-end-position))) - (forward-word 1) - (forward-char 3) - (while (< (point) end) - (let ((start (+ beg (read (current-buffer)))) - (end (+ beg (read (current-buffer))))) - (if (memq (char-after end) '(?\n ?\ )) - ;; End is followed by \n or by " -> ". - (put-text-property start end 'dired-filename t) - ;; It seems that we can't trust ls's output as to - ;; byte positions of filenames. - (put-text-property beg (point) 'dired-filename nil) - (end-of-line)))) - (goto-char end) - (beginning-of-line) - (delete-region (point) (progn (forward-line 2) (point)))) + (when (looking-at "//DIRED//") + (let ((end (line-end-position)) + (linebeg (point)) + error-lines) + ;; Find all the lines that are error messages, + ;; and record the bounds of each one. + (goto-char (point-min)) + (while (< (point) linebeg) + (or (eql (following-char) ?\s) + (push (list (point) (line-end-position)) error-lines)) + (forward-line 1)) + (setq error-lines (nreverse error-lines)) + ;; Now read the numeric positions of file names. + (goto-char linebeg) + (forward-word 1) + (forward-char 3) + (while (< (point) end) + (let ((start (insert-directory-adj-pos + (+ beg (read (current-buffer))) + error-lines)) + (end (insert-directory-adj-pos + (+ beg (read (current-buffer))) + error-lines))) + (if (memq (char-after end) '(?\n ?\ )) + ;; End is followed by \n or by " -> ". + (put-text-property start end 'dired-filename t) + ;; It seems that we can't trust ls's output as to + ;; byte positions of filenames. + (put-text-property beg (point) 'dired-filename nil) + (end-of-line)))) + (goto-char end) + (beginning-of-line) + (delete-region (point) (progn (forward-line 2) (point)))) (forward-line 1) (if (looking-at "//DIRED-OPTIONS//") (delete-region (point) (progn (forward-line 1) (point))) @@ -4512,6 +4634,18 @@ (end-of-line) (insert " available " available))))))))))) +(defun insert-directory-adj-pos (pos error-lines) + "Convert `ls --dired' file name position value POS to a buffer position. +File name position values returned in ls --dired output +count only stdout; they don't count the error messages sent to stderr. +So this function converts to them to real buffer positions. +ERROR-LINES is a list of buffer positions of error message lines, +of the form (START END)." + (while (and error-lines (< (caar error-lines) pos)) + (setq pos (+ pos (- (nth 1 (car error-lines)) (nth 0 (car error-lines))))) + (pop error-lines)) + pos) + (defun insert-directory-safely (file switches &optional wildcard full-directory-p) "Insert directory listing for FILE, formatted according to SWITCHES. diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/gnus/ChangeLog --- a/lisp/gnus/ChangeLog Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/gnus/ChangeLog Sun Jan 02 09:13:19 2005 +0000 @@ -1,9 +1,45 @@ +2004-12-27 Simon Josefsson + + * mm-bodies.el (mm-body-encoding): Don't permit 7-bit to be used + when mm-use-ultra-safe-encoding is enabled (e.g., for PGP/MIME) + and we have trailing white space. Reported by Werner Koch + . + 2004-12-17 Kim F. Storm * gnus-group.el (gnus-group-mode-map): Map follow-link to mouse-face. * gnus-sum.el (gnus-summary-mode-map): Likewise. +2004-12-22 Katsumi Yamaoka + + * gnus-spec.el (gnus-spec-tab): Make a Lisp form which works + correctly even if there are wide characters. + +2004-12-21 Katsumi Yamaoka + + * rfc2231.el (rfc2231-parse-string): Decode encoded value after + concatenating segments rather than before concatenating them. + Suggested by ARISAWA Akihiro . + +2004-12-17 Katsumi Yamaoka + + * mm-util.el (mm-xemacs-find-mime-charset): New macro. + +2004-12-17 Aidan Kehoe + + * mm-util.el (mm-xemacs-find-mime-charset-1): New function used to + unify Latin characters in XEmacs. + (mm-find-mime-charset-region): Use it. + +2004-12-17 Katsumi Yamaoka + + * gnus-util.el (gnus-delete-directory): New function. + + * gnus-agent.el (gnus-agent-delete-group): Use it. + + * gnus-cache.el (gnus-cache-delete-group): Use it. + 2004-12-08 Stefan Monnier * gnus-art.el (gnus-narrow-to-page): Don't hardcode point-min. diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/gnus/gnus-agent.el --- a/lisp/gnus/gnus-agent.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/gnus/gnus-agent.el Sun Jan 02 09:13:19 2005 +0000 @@ -891,7 +891,7 @@ (path (directory-file-name (let (gnus-command-method command-method) (gnus-agent-group-pathname group))))) - (gnus-delete-file path) + (gnus-delete-directory path) (let* ((real-group (gnus-group-real-name group))) (gnus-agent-save-group-info command-method real-group nil) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/gnus/gnus-cache.el --- a/lisp/gnus/gnus-cache.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/gnus/gnus-cache.el Sun Jan 02 09:13:19 2005 +0000 @@ -754,7 +754,7 @@ disabled, as the old cache files would corrupt gnus when the cache was next enabled. Depends upon the caller to determine whether group deletion is supported." (let ((dir (gnus-cache-file-name group ""))) - (gnus-delete-file dir)) + (gnus-delete-directory dir)) (let ((no-save gnus-cache-active-hashtb)) (unless gnus-cache-active-hashtb diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/gnus/gnus-spec.el --- a/lisp/gnus/gnus-spec.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/gnus/gnus-spec.el Sun Jan 02 09:13:19 2005 +0000 @@ -275,21 +275,15 @@ (defun gnus-spec-tab (column) (if (> column 0) - `(insert (make-string (max (- ,column (current-column)) 0) ? )) + `(insert-char ? (max (- ,column (current-column)) 0)) (let ((column (abs column))) - (if gnus-use-correct-string-widths - `(progn - (if (> (current-column) ,column) - (while (progn - (delete-backward-char 1) - (> (current-column) ,column)))) - (insert (make-string (max (- ,column (current-column)) 0) ? ))) - `(progn - (if (> (current-column) ,column) - (delete-region (point) - (- (point) (- (current-column) ,column))) - (insert (make-string (max (- ,column (current-column)) 0) - ? )))))))) + `(if (> (current-column) ,column) + (let ((end (point))) + (if (= (move-to-column ,column) ,column) + (delete-region (point) end) + (delete-region (1- (point)) end) + (insert " "))) + (insert-char ? (max (- ,column (current-column)) 0)))))) (defun gnus-correct-length (string) "Return the correct width of STRING." diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/gnus/gnus-util.el --- a/lisp/gnus/gnus-util.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/gnus/gnus-util.el Sun Jan 02 09:13:19 2005 +0000 @@ -708,6 +708,23 @@ (when (file-exists-p file) (delete-file file))) +(defun gnus-delete-directory (directory) + "Delete files in DIRECTORY. Subdirectories remain. +If there's no subdirectory, delete DIRECTORY as well." + (when (file-directory-p directory) + (let ((files (directory-files + directory t "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*")) + file dir) + (while files + (setq file (pop files)) + (if (eq t (car (file-attributes file))) + ;; `file' is a subdirectory. + (setq dir t) + ;; `file' is a file or a symlink. + (delete-file file))) + (unless dir + (delete-directory directory))))) + (defun gnus-strip-whitespace (string) "Return STRING stripped of all whitespace." (while (string-match "[\r\n\t ]+" string) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/gnus/mm-bodies.el --- a/lisp/gnus/mm-bodies.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/gnus/mm-bodies.el Sun Jan 02 09:13:19 2005 +0000 @@ -138,7 +138,8 @@ (cond ((and (not longp) (not (and mm-use-ultra-safe-encoding - (save-excursion (re-search-forward "^From " nil t)))) + (or (save-excursion (re-search-forward " $" nil t)) + (save-excursion (re-search-forward "^From " nil t))))) (eq bits '7bit)) bits) ((and (not mm-use-ultra-safe-encoding) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/gnus/mm-util.el --- a/lisp/gnus/mm-util.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/gnus/mm-util.el Sun Jan 02 09:13:19 2005 +0000 @@ -525,7 +525,84 @@ (length (memq (coding-system-base b) priorities))) t)))) -(defun mm-find-mime-charset-region (b e) +(eval-when-compile + (autoload 'latin-unity-massage-name "latin-unity") + (autoload 'latin-unity-maybe-remap "latin-unity") + (autoload 'latin-unity-representations-feasible-region "latin-unity") + (autoload 'latin-unity-representations-present-region "latin-unity") + (defvar latin-unity-coding-systems) + (defvar latin-unity-ucs-list)) + +(defun mm-xemacs-find-mime-charset-1 (begin end) + "Determine which MIME charset to use to send region as message. +This uses the XEmacs-specific latin-unity package to better handle the +case where identical characters from diverse ISO-8859-? character sets +can be encoded using a single one of the corresponding coding systems. + +It treats `mm-coding-system-priorities' as the list of preferred +coding systems; a useful example setting for this list in Western +Europe would be '(iso-8859-1 iso-8859-15 utf-8), which would default +to the very standard Latin 1 coding system, and only move to coding +systems that are less supported as is necessary to encode the +characters that exist in the buffer. + +Latin Unity doesn't know about those non-ASCII Roman characters that +are available in various East Asian character sets. As such, its +behavior if you have a JIS 0212 LATIN SMALL LETTER A WITH ACUTE in a +buffer and it can otherwise be encoded as Latin 1, won't be ideal. +But this is very much a corner case, so don't worry about it." + (let ((systems mm-coding-system-priorities) csets psets curset) + + ;; Load the Latin Unity library, if available. + (when (and (not (featurep 'latin-unity)) (locate-library "latin-unity")) + (require 'latin-unity)) + + ;; Now, can we use it? + (if (featurep 'latin-unity) + (progn + (setq csets (latin-unity-representations-feasible-region begin end) + psets (latin-unity-representations-present-region begin end)) + + (catch 'done + + ;; Pass back the first coding system in the preferred list + ;; that can encode the whole region. + (dolist (curset systems) + (setq curset (latin-unity-massage-name 'buffer-default curset)) + + ;; If the coding system is a universal coding system, then + ;; it can certainly encode all the characters in the region. + (if (memq curset latin-unity-ucs-list) + (throw 'done (list curset))) + + ;; If a coding system isn't universal, and isn't in + ;; the list that latin unity knows about, we can't + ;; decide whether to use it here. Leave that until later + ;; in `mm-find-mime-charset-region' function, whence we + ;; have been called. + (unless (memq curset latin-unity-coding-systems) + (throw 'done nil)) + + ;; Right, we know about this coding system, and it may + ;; conceivably be able to encode all the characters in + ;; the region. + (if (latin-unity-maybe-remap begin end curset csets psets t) + (throw 'done (list curset)))) + + ;; Can't encode using anything from the + ;; `mm-coding-system-priorities' list. + ;; Leave `mm-find-mime-charset' to do most of the work. + nil)) + + ;; Right, latin unity isn't available; let `mm-find-charset-region' + ;; take its default action, which equally applies to GNU Emacs. + nil))) + +(defmacro mm-xemacs-find-mime-charset (begin end) + (when (featurep 'xemacs) + `(mm-xemacs-find-mime-charset-1 ,begin ,end))) + +(defun mm-find-mime-charset-region (b e &optional hack-charsets) "Return the MIME charsets needed to encode the region between B and E. nil means ASCII, a single-element list represents an appropriate MIME charset, and a longer list means no appropriate charset." @@ -566,10 +643,14 @@ (setq systems nil charsets (list cs)))))) charsets)) + ;; If we're XEmacs, and some coding system is appropriate, + ;; mm-xemacs-find-mime-charset will return an appropriate list. + ;; Otherwise, we'll get nil, and the next setq will get invoked. + (setq charsets (mm-xemacs-find-mime-charset b e)) + ;; Fixme: won't work for unibyte Emacs 22: - ;; Otherwise we're not multibyte, we're XEmacs, or a single - ;; coding system won't cover it. + ;; We're not multibyte, or a single coding system won't cover it. (setq charsets (mm-delete-duplicates (mapcar 'mm-mime-charset diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/gnus/rfc2231.el --- a/lisp/gnus/rfc2231.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/gnus/rfc2231.el Sun Jan 02 09:13:19 2005 +0000 @@ -88,7 +88,6 @@ (point) (progn (forward-sexp 1) (point)))))) (error "Invalid header: %s" string)) (setq c (char-after)) - (setq encoded nil) (when (eq c ?*) (forward-char 1) (setq c (char-after)) @@ -126,16 +125,22 @@ (point) (progn (forward-sexp) (point))))) (t (error "Invalid header: %s" string))) - (when encoded - (setq value (rfc2231-decode-encoded-string value))) (if number (setq prev-attribute attribute prev-value (concat prev-value value)) - (push (cons attribute value) parameters)))) + (push (cons attribute + (if encoded + (rfc2231-decode-encoded-string value) + value)) + parameters)))) ;; Take care of any final continuations. (when prev-attribute - (push (cons prev-attribute prev-value) parameters)) + (push (cons prev-attribute + (if encoded + (rfc2231-decode-encoded-string prev-value) + prev-value)) + parameters)) (when type `(,type ,@(nreverse parameters))))))) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/help-fns.el --- a/lisp/help-fns.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/help-fns.el Sun Jan 02 09:13:19 2005 +0000 @@ -355,7 +355,7 @@ (if (re-search-backward "alias for `\\([^`']+\\)'" nil t) (help-xref-button 1 'help-function def))))) (or file-name - (setq file-name (symbol-file function))) + (setq file-name (symbol-file function 'defun))) (when (equal file-name "loaddefs.el") ;; Find the real def site of the preloaded function. ;; This is necessary only for defaliases. @@ -614,7 +614,7 @@ ;; Make a hyperlink to the library if appropriate. (Don't ;; change the format of the buffer's initial line in case ;; anything expects the current format.) - (let ((file-name (symbol-file (cons 'defvar variable)))) + (let ((file-name (symbol-file variable 'defvar))) (when (equal file-name "loaddefs.el") ;; Find the real def site of the preloaded variable. (let ((location diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/hexl.el --- a/lisp/hexl.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/hexl.el Sun Jan 02 09:13:19 2005 +0000 @@ -111,11 +111,19 @@ (defvar hexl-mode-old-isearch-search-fun-function) (defvar hexl-mode-old-require-final-newline) (defvar hexl-mode-old-syntax-table) +(defvar hexl-mode-old-font-lock-keywords) (defvar hexl-ascii-overlay nil "Overlay used to highlight ASCII element corresponding to current point.") (make-variable-buffer-local 'hexl-ascii-overlay) +(defvar hexl-font-lock-keywords + '(("^\\([0-9a-f]+:\\).\\{40\\} \\(.+$\\)" + ;; "^\\([0-9a-f]+:\\).+ \\(.+$\\)" + (1 'hexl-address-area t t) + (2 'hexl-ascii-area t t))) + "Font lock keywords used in `hexl-mode'.") + ;; routines (put 'hexl-mode 'mode-class 'special) @@ -265,6 +273,11 @@ (make-local-variable 'require-final-newline) (setq require-final-newline nil) + (make-local-variable 'hexl-mode-old-font-lock-keywords) + (setq hexl-mode-old-font-lock-keywords font-lock-defaults) + (make-local-variable 'font-lock-defaults) + (setq font-lock-defaults '(hexl-font-lock-keywords t)) + ;; Add hooks to rehexlify or dehexlify on various events. (add-hook 'after-revert-hook 'hexl-after-revert-hook nil t) @@ -376,6 +389,7 @@ (setq isearch-search-fun-function hexl-mode-old-isearch-search-fun-function) (use-local-map hexl-mode-old-local-map) (set-syntax-table hexl-mode-old-syntax-table) + (setq font-lock-defaults hexl-mode-old-font-lock-keywords) (setq major-mode hexl-mode-old-major-mode) (force-mode-line-update)) @@ -684,15 +698,6 @@ (apply 'call-process-region (point-min) (point-max) (expand-file-name hexl-program exec-directory) t t nil (split-string hexl-options)) - (save-excursion - (goto-char (point-min)) - (while (re-search-forward "^[0-9a-f]+:" nil t) - (put-text-property (match-beginning 0) (match-end 0) - 'font-lock-face 'hexl-address-area)) - (goto-char (point-min)) - (while (re-search-forward " \\(.+$\\)" nil t) - (put-text-property (match-beginning 1) (match-end 1) - 'font-lock-face 'hexl-ascii-area))) (if (> (point) (hexl-address-to-marker hexl-max-address)) (hexl-goto-address hexl-max-address)))) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/international/mule.el Binary file lisp/international/mule.el has changed diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/loadup.el --- a/lisp/loadup.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/loadup.el Sun Jan 02 09:13:19 2005 +0000 @@ -46,7 +46,8 @@ (message "Using load-path %s" load-path) ;; We don't want to have any undo records in the dumped Emacs. -(buffer-disable-undo "*scratch*") +(set-buffer "*scratch*") +(setq buffer-undo-list t) (load "emacs-lisp/byte-run") (load "emacs-lisp/backquote") diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/mail/rmail.el --- a/lisp/mail/rmail.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/mail/rmail.el Sun Jan 02 09:13:19 2005 +0000 @@ -3435,6 +3435,8 @@ (if (not from) (setq from user-mail-address)) (let ((tembuf (generate-new-buffer " sendmail temp")) (case-fold-search nil) + (mail-personal-alias-file + (or mail-alias-file mail-personal-alias-file)) (mailbuf rmail-buffer)) (unwind-protect (with-current-buffer tembuf diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/mail/smtpmail.el --- a/lisp/mail/smtpmail.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/mail/smtpmail.el Sun Jan 02 09:13:19 2005 +0000 @@ -523,7 +523,7 @@ (when (and cred mech) (cond ((eq mech 'cram-md5) - (smtpmail-send-command process (format "AUTH %s" mech)) + (smtpmail-send-command process (upcase (format "AUTH %s" mech))) (if (or (null (car (setq ret (smtpmail-read-response process)))) (not (integerp (car ret))) (>= (car ret) 400)) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/mouse.el --- a/lisp/mouse.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/mouse.el Sun Jan 02 09:13:19 2005 +0000 @@ -754,7 +754,8 @@ If the click is in the echo area, display the `*Messages*' buffer." (interactive "e") - (let ((w (posn-window (event-start start-event)))) + (let ((w (posn-window (event-start start-event))) + (mouse-autoselect-window nil)) (if (not (or (not (window-minibuffer-p w)) (minibuffer-window-active-p w))) (save-excursion diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/net/goto-addr.el --- a/lisp/net/goto-addr.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/net/goto-addr.el Sun Jan 02 09:13:19 2005 +0000 @@ -100,7 +100,7 @@ (defvar goto-address-mail-regexp ;; Actually pretty much any char could appear in the username part. -stef - "[-a-zA-Z0-9._+]+@\\([-a-zA-z0-9_]+\\.\\)+[a-zA-Z0-9]+" + "[-a-zA-Z0-9=._+]+@\\([-a-zA-z0-9_]+\\.\\)+[a-zA-Z0-9]+" "A regular expression probably matching an e-mail address.") (defvar goto-address-url-regexp diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/net/snmp-mode.el --- a/lisp/net/snmp-mode.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/net/snmp-mode.el Sun Jan 02 09:13:19 2005 +0000 @@ -356,7 +356,7 @@ ;; Miscellaneous customization (make-local-variable 'require-final-newline) - (setq require-final-newline t)) + (setq require-final-newline mode-require-final-newline)) ;; SNMPv1 MIB Editing Mode. diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/ada-mode.el --- a/lisp/progmodes/ada-mode.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/ada-mode.el Sun Jan 02 09:13:19 2005 +0000 @@ -1116,7 +1116,7 @@ (interactive) (kill-all-local-variables) - (set (make-local-variable 'require-final-newline) t) + (set (make-local-variable 'require-final-newline) mode-require-final-newline) ;; Set the paragraph delimiters so that one can select a whole block ;; simply with M-h diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/antlr-mode.el --- a/lisp/progmodes/antlr-mode.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/antlr-mode.el Sun Jan 02 09:13:19 2005 +0000 @@ -2529,53 +2529,6 @@ (set (car settings) (eval (cadr settings))))) (setq settings (cddr settings))))) -(defun antlr-c-common-init () - "Like `c-basic-common-init' when using cc-mode before v5.30." - ;; X/Emacs 20 only - (make-local-variable 'paragraph-start) - (make-local-variable 'paragraph-separate) - (make-local-variable 'paragraph-ignore-fill-prefix) - (make-local-variable 'require-final-newline) - (make-local-variable 'parse-sexp-ignore-comments) - (make-local-variable 'comment-start) - (make-local-variable 'comment-multi-line) - (make-local-variable 'outline-regexp) - (make-local-variable 'outline-level) - (make-local-variable 'adaptive-fill-regexp) - (make-local-variable 'adaptive-fill-mode) - (make-local-variable 'imenu-generic-expression) ;set in the mode functions - (and (boundp 'comment-line-break-function) - (make-local-variable 'comment-line-break-function)) - ;; Emacs 19.30 and beyond only, AFAIK - (if (boundp 'fill-paragraph-function) - (progn - (make-local-variable 'fill-paragraph-function) - (setq fill-paragraph-function 'c-fill-paragraph))) - ;; now set their values - (setq paragraph-start (concat page-delimiter "\\|$") - paragraph-separate paragraph-start - paragraph-ignore-fill-prefix t - parse-sexp-ignore-comments t - comment-column 32 - comment-multi-line nil - comment-line-break-function 'c-comment-line-break-function - adaptive-fill-regexp nil - adaptive-fill-mode nil) - (c-set-style (or antlr-indent-style "gnu")) - (and (boundp 'c-current-comment-prefix) (boundp 'c-comment-prefix-regexp) - (setq c-current-comment-prefix - (if (listp c-comment-prefix-regexp) - (cdr-safe (or (assoc major-mode c-comment-prefix-regexp) - (assoc 'other c-comment-prefix-regexp))) - c-comment-prefix-regexp))) - ;; we have to do something special for c-offsets-alist so that the - ;; buffer local value has its own alist structure. - (setq c-offsets-alist (copy-alist c-offsets-alist)) - ;; setup the comment indent variable in a Emacs version portable way - ;; ignore any byte compiler warnings you might get here - (make-local-variable 'comment-indent-function) - (setq comment-indent-function 'c-comment-indent)) - (defun antlr-language-option (search) "Find language in `antlr-language-alist' for language option. If SEARCH is non-nil, find element for language option. Otherwise, find @@ -2643,10 +2596,7 @@ (funcall init-fn))) ; is a function in v5.29 (t ; cc-mode upto 5.28 (antlr-c-init-language-vars))) ; do it myself - (cond ((fboundp 'c-basic-common-init) ; cc-mode 5.30+ - (c-basic-common-init antlr-language (or antlr-indent-style "gnu"))) - (t - (antlr-c-common-init))) + (c-basic-common-init antlr-language (or antlr-indent-style "gnu")) (make-local-variable 'outline-regexp) (make-local-variable 'outline-level) (make-local-variable 'require-final-newline) @@ -2654,7 +2604,7 @@ (make-local-variable 'indent-region-function) (setq outline-regexp "[^#\n\^M]" outline-level 'c-outline-level) ; TODO: define own - (setq require-final-newline t) + (setq require-final-newline mode-require-final-newline) (setq indent-line-function 'antlr-indent-line indent-region-function nil) ; too lazy (setq comment-start "// " diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/cc-mode.el --- a/lisp/progmodes/cc-mode.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/cc-mode.el Sun Jan 02 09:13:19 2005 +0000 @@ -557,7 +557,8 @@ (let ((rfn (assq mode c-require-final-newline))) (when rfn (make-local-variable 'require-final-newline) - (setq require-final-newline (cdr rfn))))) + (and (cdr rfn) + (setq require-final-newline mode-require-final-newline))))) (defun c-postprocess-file-styles () "Function that post processes relevant file local variables in CC Mode. diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/cc-vars.el --- a/lisp/progmodes/cc-vars.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/cc-vars.el Sun Jan 02 09:13:19 2005 +0000 @@ -839,30 +839,28 @@ '((c-mode . t) (c++-mode . t) (objc-mode . t)) - "*Controls whether a final newline is ensured when the file is saved. -The value is an association list that for each language mode specifies -the value to give to `require-final-newline' at mode initialization; -see that variable for details about the value. If a language isn't -present on the association list, CC Mode won't set -`require-final-newline' in buffers for that language." + "*Controls `require-final-newline' in C-related major modes. +The value is an association list specifying, for each specific mode, +whether to override `require-final-newline'. If the cdr of the element +is non-nil, that means to use `mode-require-final-newline' instead." :type `(set (cons :format "%v" (const :format "C " c-mode) - (symbol :format "%v" :value ,require-final-newline)) + (const t)) (cons :format "%v" (const :format "C++ " c++-mode) - (symbol :format "%v" :value ,require-final-newline)) + (const t)) (cons :format "%v" (const :format "ObjC " objc-mode) - (symbol :format "%v" :value ,require-final-newline)) + (const t)) (cons :format "%v" (const :format "Java " java-mode) - (symbol :format "%v" :value ,require-final-newline)) + (const t)) (cons :format "%v" (const :format "IDL " idl-mode) - (symbol :format "%v" :value ,require-final-newline)) + (const t)) (cons :format "%v" (const :format "Pike " pike-mode) - (symbol :format "%v" :value ,require-final-newline))) + (const t))) :group 'c) (defcustom c-electric-pound-behavior nil diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/cfengine.el --- a/lisp/progmodes/cfengine.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/cfengine.el Sun Jan 02 09:13:19 2005 +0000 @@ -222,7 +222,7 @@ ;; movement. (set (make-local-variable 'parens-require-spaces) nil) - (set (make-local-variable 'require-final-newline) t) + (set (make-local-variable 'require-final-newline) mode-require-final-newline) (set (make-local-variable 'comment-start) "# ") (set (make-local-variable 'comment-start-skip) "\\(\\(?:^\\|[^\\\\\n]\\)\\(?:\\\\\\\\\\)*\\)#+[ \t]*") diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/compile.el --- a/lisp/progmodes/compile.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/compile.el Sun Jan 02 09:13:19 2005 +0000 @@ -1463,8 +1463,8 @@ ;; If the current buffer is a compilation buffer, return it. ;; Otherwise, look for a compilation buffer and signal an error ;; if there are none. -(defun compilation-find-buffer (&optional other-buffer) - (next-error-find-buffer other-buffer 'compilation-buffer-internal-p)) +(defun compilation-find-buffer (&optional avoid-current) + (next-error-find-buffer avoid-current 'compilation-buffer-internal-p)) ;;;###autoload (defun compilation-next-error-function (n &optional reset) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/cperl-mode.el --- a/lisp/progmodes/cperl-mode.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/cperl-mode.el Sun Jan 02 09:13:19 2005 +0000 @@ -1462,7 +1462,7 @@ (make-local-variable 'indent-line-function) (setq indent-line-function 'cperl-indent-line) (make-local-variable 'require-final-newline) - (setq require-final-newline t) + (setq require-final-newline mode-require-final-newline) (make-local-variable 'comment-start) (setq comment-start "# ") (make-local-variable 'comment-end) @@ -6026,7 +6026,8 @@ (interactive) (let (found-bad (p (point))) (setq last-nonmenu-event 13) ; To disable popup - (beginning-of-buffer) + (with-no-warnings ; It is useful to push the mark here. + (beginning-of-buffer)) (map-y-or-n-p "Insert space here? " (lambda (arg) (insert " ")) 'cperl-next-bad-style @@ -7183,13 +7184,9 @@ ;;; Plug for wrong font-lock: (defun cperl-font-lock-unfontify-region-function (beg end) - (let* ((modified (buffer-modified-p)) (buffer-undo-list t) - (inhibit-read-only t) (inhibit-point-motion-hooks t) - before-change-functions after-change-functions - deactivate-mark buffer-file-name buffer-file-truename) - (remove-text-properties beg end '(face nil)) - (when (and (not modified) (buffer-modified-p)) - (set-buffer-modified-p nil)))) + ;; Simplified now that font-lock-unfontify-region uses save-buffer-state. + (let (before-change-functions after-change-functions) + (remove-text-properties beg end '(face nil)))) (defvar cperl-d-l nil) (defun cperl-fontify-syntaxically (end) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/f90.el --- a/lisp/progmodes/f90.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/f90.el Sun Jan 02 09:13:19 2005 +0000 @@ -818,7 +818,7 @@ (use-local-map f90-mode-map) (set (make-local-variable 'indent-line-function) 'f90-indent-line) (set (make-local-variable 'indent-region-function) 'f90-indent-region) - (set (make-local-variable 'require-final-newline) t) + (set (make-local-variable 'require-final-newline) mode-require-final-newline) (set (make-local-variable 'comment-start) "!") (set (make-local-variable 'comment-start-skip) "!+ *") (set (make-local-variable 'comment-indent-function) 'f90-comment-indent) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/fortran.el --- a/lisp/progmodes/fortran.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/fortran.el Sun Jan 02 09:13:19 2005 +0000 @@ -674,7 +674,7 @@ (let (fortran-blink-matching-if ; avoid blinking delay indent-region-function) (indent-region start end nil)))) - (set (make-local-variable 'require-final-newline) t) + (set (make-local-variable 'require-final-newline) mode-require-final-newline) ;; The syntax tables don't understand the column-0 comment-markers. (set (make-local-variable 'comment-use-syntax) nil) (set (make-local-variable 'comment-padding) "$$$") diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/hideshow.el --- a/lisp/progmodes/hideshow.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/hideshow.el Sun Jan 02 09:13:19 2005 +0000 @@ -5,7 +5,7 @@ ;; Author: Thien-Thi Nguyen ;; Dan Nicolaescu ;; Keywords: C C++ java lisp tools editing comments blocks hiding outlines -;; Maintainer-Version: 5.39.2.8 +;; Maintainer-Version: 5.58.2.3 ;; Time-of-Day-Author-Most-Likely-to-be-Recalcitrant: early morning ;; This file is part of GNU Emacs. @@ -138,6 +138,19 @@ ;; If you have an entry that works particularly well, consider ;; submitting it for inclusion in hideshow.el. See docstring for ;; `hs-special-modes-alist' for more info on the entry format. +;; +;; See also variable `hs-set-up-overlay' for per-block customization of +;; appearance or other effects associated with overlays. For example: +;; +;; (setq hs-set-up-overlay +;; (defun my-display-code-line-counts (ov) +;; (when (eq 'code (overlay-get ov 'hs)) +;; (overlay-put ov 'display +;; (propertize +;; (format " ... <%d>" +;; (count-lines (overlay-start ov) +;; (overlay-end ov))) +;; 'face 'font-lock-type-face))))) ;; * Bugs ;; @@ -304,6 +317,24 @@ These commands include the toggling commands (when the result is to show a block), `hs-show-all' and `hs-show-block'..") +(defvar hs-set-up-overlay nil + "*Function called with one arg, OV, a newly initialized overlay. +Hideshow puts a unique overlay on each range of text to be hidden +in the buffer. Here is a simple example of how to use this variable: + + (defun display-code-line-counts (ov) + (when (eq 'code (overlay-get ov 'hs)) + (overlay-put ov 'display + (format \"... / %d\" + (count-lines (overlay-start ov) + (overlay-end ov)))))) + + (setq hs-set-up-overlay 'display-code-line-counts) + +This example shows how to get information from the overlay as well +as how to set its `display' property. See `hs-make-overlay' and +info node `(elisp)Overlays'.") + ;;--------------------------------------------------------------------------- ;; internal variables @@ -388,6 +419,35 @@ (when (overlay-get ov 'hs) (delete-overlay ov)))) +(defun hs-make-overlay (b e kind &optional b-offset e-offset) + "Return a new overlay in region defined by B and E with type KIND. +KIND is either `code' or `comment'. Optional fourth arg B-OFFSET +when added to B specifies the actual buffer position where the block +begins. Likewise for optional fifth arg E-OFFSET. If unspecified +they are taken to be 0 (zero). The following properties are set +in the overlay: 'invisible 'hs 'hs-b-offset 'hs-e-offset. Also, +depending on variable `hs-isearch-open', the following properties may +be present: 'isearch-open-invisible 'isearch-open-invisible-temporary. +If variable `hs-set-up-overlay' is non-nil it should specify a function +to call with the newly initialized overlay." + (unless b-offset (setq b-offset 0)) + (unless e-offset (setq e-offset 0)) + (let ((ov (make-overlay b e)) + (io (if (eq 'block hs-isearch-open) + ;; backward compatibility -- `block'<=>`code' + 'code + hs-isearch-open))) + (overlay-put ov 'invisible 'hs) + (overlay-put ov 'hs kind) + (overlay-put ov 'hs-b-offset b-offset) + (overlay-put ov 'hs-e-offset e-offset) + (when (or (eq io t) (eq io kind)) + (overlay-put ov 'isearch-open-invisible 'hs-isearch-show) + (overlay-put ov 'isearch-open-invisible-temporary + 'hs-isearch-show-temporary)) + (when hs-set-up-overlay (funcall hs-set-up-overlay ov)) + ov)) + (defun hs-isearch-show (ov) "Delete overlay OV, and set `hs-headline' to nil. @@ -416,32 +476,17 @@ (point)) start))))) (force-mode-line-update) + ;; handle `display' property specially + (let (value) + (if hide-p + (when (setq value (overlay-get ov 'hs-isearch-display)) + (overlay-put ov 'display value) + (overlay-put ov 'hs-isearch-display nil)) + (when (setq value (overlay-get ov 'display)) + (overlay-put ov 'hs-isearch-display value) + (overlay-put ov 'display nil)))) (overlay-put ov 'invisible (and hide-p 'hs))) -(defun hs-flag-region (from to flag) - "Hide or show lines from FROM to TO, according to FLAG. -If FLAG is nil then text is shown, while if FLAG is non-nil the text is -hidden. FLAG must be one of the symbols `code' or `comment', depending -on what kind of block is to be hidden." - (save-excursion - ;; first clear it all out - (hs-discard-overlays from to) - ;; now create overlays if needed - (when flag - (let ((overlay (make-overlay from to))) - (overlay-put overlay 'invisible 'hs) - (overlay-put overlay 'hs flag) - (when (or (eq hs-isearch-open t) - (eq hs-isearch-open flag) - ;; deprecated backward compatibility -- `block'<=>`code' - (and (eq 'block hs-isearch-open) - (eq 'code flag))) - (overlay-put overlay 'isearch-open-invisible 'hs-isearch-show) - (overlay-put overlay - 'isearch-open-invisible-temporary - 'hs-isearch-show-temporary)) - overlay)))) - (defun hs-forward-sexp (match-data arg) "Adjust point based on MATCH-DATA and call `hs-forward-sexp-func' w/ ARG. Original match data is restored upon return." @@ -453,9 +498,10 @@ (defun hs-hide-comment-region (beg end &optional repos-end) "Hide a region from BEG to END, marking it as a comment. Optional arg REPOS-END means reposition at end." - (hs-flag-region (progn (goto-char beg) (end-of-line) (point)) - (progn (goto-char end) (end-of-line) (point)) - 'comment) + (let ((beg-eol (progn (goto-char beg) (end-of-line) (point))) + (end-eol (progn (goto-char end) (end-of-line) (point)))) + (hs-discard-overlays beg-eol end-eol) + (hs-make-overlay beg-eol end-eol 'comment beg end)) (goto-char (if repos-end end beg))) (defun hs-hide-block-at-point (&optional end comment-reg) @@ -488,9 +534,8 @@ (end-of-line) (point)))) (when (and (< p (point)) (> (count-lines p q) 1)) - (overlay-put (hs-flag-region p q 'code) - 'hs-ofs - (- pure-p p))) + (hs-discard-overlays p q) + (hs-make-overlay p q 'code (- pure-p p))) (goto-char (if end q (min p pure-p))))))) (defun hs-safety-is-job-n () @@ -612,7 +657,7 @@ (setq minp (1+ (point))) (funcall hs-forward-sexp-func 1) (setq maxp (1- (point)))) - (hs-flag-region minp maxp nil) ; eliminate weirdness + (hs-discard-overlays minp maxp) ; eliminate weirdness (goto-char minp) (while (progn (forward-comment (buffer-size)) @@ -678,7 +723,7 @@ (hs-life-goes-on (message "Hiding all blocks ...") (save-excursion - (hs-flag-region (point-min) (point-max) nil) ; eliminate weirdness + (hs-discard-overlays (point-min) (point-max)) ; eliminate weirdness (goto-char (point-min)) (let ((count 0) (re (concat "\\(" @@ -717,7 +762,7 @@ (interactive) (hs-life-goes-on (message "Showing all blocks ...") - (hs-flag-region (point-min) (point-max) nil) + (hs-discard-overlays (point-min) (point-max)) (message "Showing all blocks ... done") (run-hooks 'hs-show-hook))) @@ -755,7 +800,7 @@ (goto-char (cond (end (overlay-end ov)) ((eq 'comment (overlay-get ov 'hs)) here) - (t (+ (overlay-start ov) (overlay-get ov 'hs-ofs))))) + (t (+ (overlay-start ov) (overlay-get ov 'hs-b-offset))))) (delete-overlay ov) (throw 'eol-begins-hidden-region-p t))) nil)) @@ -771,7 +816,7 @@ (setq p (point) q (progn (hs-forward-sexp (hs-match-data t) 1) (point))))) (when (and p q) - (hs-flag-region p q nil) + (hs-discard-overlays p q) (goto-char (if end q (1+ p))))) (hs-safety-is-job-n) (run-hooks 'hs-show-hook)))) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/icon.el --- a/lisp/progmodes/icon.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/icon.el Sun Jan 02 09:13:19 2005 +0000 @@ -177,7 +177,7 @@ (make-local-variable 'indent-line-function) (setq indent-line-function 'icon-indent-line) (make-local-variable 'require-final-newline) - (setq require-final-newline t) + (setq require-final-newline mode-require-final-newline) (make-local-variable 'comment-start) (setq comment-start "# ") (make-local-variable 'comment-end) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/idlwave.el --- a/lisp/progmodes/idlwave.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/idlwave.el Sun Jan 02 09:13:19 2005 +0000 @@ -1892,7 +1892,7 @@ (set (make-local-variable 'comment-start-skip) ";+[ \t]*") (set (make-local-variable 'comment-start) ";") - (set (make-local-variable 'require-final-newline) t) + (set (make-local-variable 'require-final-newline) mode-require-final-newline) (set (make-local-variable 'abbrev-all-caps) t) (set (make-local-variable 'indent-tabs-mode) nil) (set (make-local-variable 'completion-ignore-case) t) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/mixal-mode.el --- a/lisp/progmodes/mixal-mode.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/mixal-mode.el Sun Jan 02 09:13:19 2005 +0000 @@ -1303,8 +1303,9 @@ (set (make-local-variable 'compile-command) (concat "mixasm -g " buffer-file-name)) ;; mixasm will do strange when there is no final newline, - ;; let emacs ensure that it is always there - (set (make-local-variable 'require-final-newline) t)) + ;; so let Emacs ensure that it is always there + (set (make-local-variable 'require-final-newline) + mode-require-final-newline)) ;;;###autoload (add-to-list 'auto-mode-alist '("\\.mixal\\'" . mixal-mode)) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/modula2.el --- a/lisp/progmodes/modula2.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/modula2.el Sun Jan 02 09:13:19 2005 +0000 @@ -151,7 +151,7 @@ ; (make-local-variable 'indent-line-function) ; (setq indent-line-function 'c-indent-line) (make-local-variable 'require-final-newline) - (setq require-final-newline t) + (setq require-final-newline mode-require-final-newline) (make-local-variable 'comment-start) (setq comment-start "(* ") (make-local-variable 'comment-end) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/perl-mode.el --- a/lisp/progmodes/perl-mode.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/perl-mode.el Sun Jan 02 09:13:19 2005 +0000 @@ -476,7 +476,7 @@ (make-local-variable 'indent-line-function) (setq indent-line-function 'perl-indent-line) (make-local-variable 'require-final-newline) - (setq require-final-newline t) + (setq require-final-newline mode-require-final-newline) (make-local-variable 'comment-start) (setq comment-start "# ") (make-local-variable 'comment-end) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/python.el --- a/lisp/progmodes/python.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/python.el Sun Jan 02 09:13:19 2005 +0000 @@ -1712,7 +1712,7 @@ (set (make-local-variable 'indent-line-function) #'python-indent-line) (set (make-local-variable 'paragraph-start) "\\s-*$") (set (make-local-variable 'fill-paragraph-function) 'python-fill-paragraph) - (set (make-local-variable 'require-final-newline) t) + (set (make-local-variable 'require-final-newline) mode-require-final-newline) (set (make-local-variable 'add-log-current-defun-function) #'python-current-defun) ;; Fixme: Generalize to do all blocks? diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/sh-script.el --- a/lisp/progmodes/sh-script.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/sh-script.el Sun Jan 02 09:13:19 2005 +0000 @@ -495,10 +495,9 @@ (defcustom sh-require-final-newline '((csh . t) - (pdksh . t) - (rc . require-final-newline) - (sh . require-final-newline)) + (pdksh . t)) "*Value of `require-final-newline' in Shell-Script mode buffers. +\(SHELL . t) means use the value of `mode-require-final-newline' for SHELL. See `sh-feature'." :type '(repeat (cons (symbol :tag "Shell") (choice (const :tag "require" t) @@ -1485,8 +1484,8 @@ (executable-set-magic shell (sh-feature sh-shell-arg) no-query-flag insert-flag))) (let ((tem (sh-feature sh-require-final-newline))) - (unless (eq tem 'require-final-newline) - (setq require-final-newline tem))) + (if (eq tem t) + (setq require-final-newline mode-require-final-newline))) (setq comment-start-skip "#+[\t ]*" local-abbrev-table sh-mode-abbrev-table diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/simula.el --- a/lisp/progmodes/simula.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/simula.el Sun Jan 02 09:13:19 2005 +0000 @@ -380,7 +380,7 @@ (make-local-variable 'indent-line-function) (setq indent-line-function 'simula-indent-line) (make-local-variable 'require-final-newline) - (setq require-final-newline t) + (setq require-final-newline mode-require-final-newline) (make-local-variable 'comment-start) (setq comment-start "! ") (make-local-variable 'comment-end) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/progmodes/vhdl-mode.el --- a/lisp/progmodes/vhdl-mode.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/progmodes/vhdl-mode.el Sun Jan 02 09:13:19 2005 +0000 @@ -4557,7 +4557,8 @@ "\\s-*\\(--+\\s-*$\\|[^ -]\\|$\\)") (set (make-local-variable 'paragraph-separate) paragraph-start) (set (make-local-variable 'paragraph-ignore-fill-prefix) t) - (set (make-local-variable 'require-final-newline) t) + (set (make-local-variable 'require-final-newline) + mode-require-final-newline) (set (make-local-variable 'parse-sexp-ignore-comments) t) (set (make-local-variable 'indent-line-function) 'vhdl-indent-line) (set (make-local-variable 'comment-start) "--") diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/server.el --- a/lisp/server.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/server.el Sun Jan 02 09:13:19 2005 +0000 @@ -346,7 +346,8 @@ ;; Suppress the error rose when the pipe to PROC is closed. (condition-case err (process-send-region proc (point-min) (point-max)) - (file-error nil)) + (file-error nil) + (error nil)) )))) ;; ARG is a file name. ;; Collapse multiple slashes to single slashes. diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/simple.el --- a/lisp/simple.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/simple.el Sun Jan 02 09:13:19 2005 +0000 @@ -124,70 +124,87 @@ (make-variable-buffer-local 'next-error-function) (defsubst next-error-buffer-p (buffer - &optional + &optional avoid-current extra-test-inclusive extra-test-exclusive) "Test if BUFFER is a next-error capable buffer. -EXTRA-TEST-INCLUSIVE is called to allow extra buffers. -EXTRA-TEST-EXCLUSIVE is called to disallow buffers." - (with-current-buffer buffer - (or (and extra-test-inclusive (funcall extra-test-inclusive)) - (and (if extra-test-exclusive (funcall extra-test-exclusive) t) - next-error-function)))) - -(defun next-error-find-buffer (&optional other-buffer + +If AVOID-CURRENT is non-nil, treat the current buffer +as an absolute last resort only. + +The function EXTRA-TEST-INCLUSIVE, if non-nil, is called in each buffer +that normally would not qualify. If it returns t, the buffer +in question is treated as usable. + +The function EXTRA-TEST-EXCLUSIVE, if non-nil is called in each buffer +that would normally be considered usable. if it returns nil, +that buffer is rejected." + (and (buffer-name buffer) ;First make sure it's live. + (not (and avoid-current (eq buffer (current-buffer)))) + (with-current-buffer buffer + (if next-error-function ; This is the normal test. + ;; Optionally reject some buffers. + (if extra-test-exclusive + (funcall extra-test-exclusive) + t) + ;; Optionally accept some other buffers. + (and extra-test-inclusive + (funcall extra-test-inclusive)))))) + +(defun next-error-find-buffer (&optional avoid-current extra-test-inclusive extra-test-exclusive) "Return a next-error capable buffer. -OTHER-BUFFER will disallow the current buffer. -EXTRA-TEST-INCLUSIVE is called to allow extra buffers. -EXTRA-TEST-EXCLUSIVE is called to disallow buffers." +If AVOID-CURRENT is non-nil, treat the current buffer +as an absolute last resort only. + +The function EXTRA-TEST-INCLUSIVE, if non-nil, is called in each buffers +that normally would not qualify. If it returns t, the buffer +in question is treated as usable. + +The function EXTRA-TEST-EXCLUSIVE, if non-nil is called in each buffer +that would normally be considered usable. If it returns nil, +that buffer is rejected." (or ;; 1. If one window on the selected frame displays such buffer, return it. (let ((window-buffers (delete-dups (delq nil (mapcar (lambda (w) (if (next-error-buffer-p - (window-buffer w) + (window-buffer w) + avoid-current extra-test-inclusive extra-test-exclusive) (window-buffer w))) (window-list)))))) - (if other-buffer - (setq window-buffers (delq (current-buffer) window-buffers))) (if (eq (length window-buffers) 1) (car window-buffers))) - ;; 2. If next-error-last-buffer is set to a live buffer, use that. + ;; 2. If next-error-last-buffer is an acceptable buffer, use that. (if (and next-error-last-buffer - (buffer-name next-error-last-buffer) - (next-error-buffer-p next-error-last-buffer - extra-test-inclusive extra-test-exclusive) - (or (not other-buffer) - (not (eq next-error-last-buffer (current-buffer))))) + (next-error-buffer-p next-error-last-buffer avoid-current + extra-test-inclusive extra-test-exclusive)) next-error-last-buffer) - ;; 3. If the current buffer is a next-error capable buffer, return it. - (if (and (not other-buffer) - (next-error-buffer-p (current-buffer) - extra-test-inclusive extra-test-exclusive)) + ;; 3. If the current buffer is acceptable, choose it. + (if (next-error-buffer-p (current-buffer) avoid-current + extra-test-inclusive extra-test-exclusive) (current-buffer)) - ;; 4. Look for a next-error capable buffer in a buffer list. + ;; 4. Look for any acceptable buffer. (let ((buffers (buffer-list))) (while (and buffers - (or (not (next-error-buffer-p - (car buffers) - extra-test-inclusive extra-test-exclusive)) - (and other-buffer (eq (car buffers) (current-buffer))))) + (not (next-error-buffer-p + (car buffers) avoid-current + extra-test-inclusive extra-test-exclusive))) (setq buffers (cdr buffers))) - (if buffers - (car buffers) - (or (and other-buffer - (next-error-buffer-p (current-buffer) - extra-test-inclusive extra-test-exclusive) - ;; The current buffer is a next-error capable buffer. - (progn - (if other-buffer - (message "This is the only next-error capable buffer")) - (current-buffer))) - (error "No next-error capable buffer found")))))) + (car buffers)) + ;; 5. Use the current buffer as a last resort if it qualifies, + ;; even despite AVOID-CURRENT. + (and avoid-current + (next-error-buffer-p (current-buffer) nil + extra-test-inclusive extra-test-exclusive) + (progn + (message "This is the only next-error capable buffer") + (current-buffer))) + ;; 6. Give up. + (error "No next-error capable buffer found"))) (defun next-error (&optional arg reset) "Visit next next-error message and corresponding source code. @@ -1113,11 +1130,13 @@ nil minibuffer-local-map nil - 'minibuffer-history-search-history))) + 'minibuffer-history-search-history + (car minibuffer-history-search-history)))) ;; Use the last regexp specified, by default, if input is empty. (list (if (string= regexp "") - (setcar minibuffer-history-search-history - (nth 1 minibuffer-history-search-history)) + (if minibuffer-history-search-history + (car minibuffer-history-search-history) + (error "No previous history search regexp")) regexp) (prefix-numeric-value current-prefix-arg)))) (previous-matching-history-element regexp (- n))) @@ -1237,7 +1256,15 @@ ;; So set `this-command' to something other than `undo'. (setq this-command 'undo-start) - (unless (eq last-command 'undo) + (unless (and (eq last-command 'undo) + ;; If something (a timer or filter?) changed the buffer + ;; since the previous command, don't continue the undo seq. + (let ((list buffer-undo-list)) + (while (eq (car list) nil) + (setq list (cdr list))) + ;; If the last undo record made was made by undo + ;; it shows nothing else happened in between. + (gethash list undo-equiv-table))) (setq undo-in-region (if transient-mark-mode mark-active (and arg (not (numberp arg))))) (if undo-in-region @@ -1289,10 +1316,18 @@ (setq tail (cdr tail))) (setq tail nil))) (setq prev tail tail (cdr tail)))) - + ;; Record what the current undo list says, + ;; so the next command can tell if the buffer was modified in between. (and modified (not (buffer-modified-p)) (delete-auto-save-file-if-necessary recent-save)))) +(defun buffer-disable-undo (&optional buffer) + "Make BUFFER stop keeping undo information. +No argument or nil as argument means do this for the current buffer." + (interactive) + (with-current-buffer (if buffer (get-buffer buffer) (current-buffer)) + (setq buffer-undo-list t))) + (defun undo-only (&optional arg) "Undo some previous changes. Repeat this command to undo more changes. @@ -1485,16 +1520,33 @@ '(0 . 0))) '(0 . 0))) +(defvar undo-extra-outer-limit nil + "If non-nil, an extra level of size that's ok in an undo item. +We don't ask the user about truncating the undo list until the +current item gets bigger than this amount.") +(make-variable-buffer-local 'undo-extra-outer-limit) + ;; When the first undo batch in an undo list is longer than undo-outer-limit, ;; this function gets called to ask the user what to do. ;; Garbage collection is inhibited around the call, ;; so it had better not do a lot of consing. (setq undo-outer-limit-function 'undo-outer-limit-truncate) (defun undo-outer-limit-truncate (size) - (if (yes-or-no-p (format "Buffer %s undo info is %d bytes long; discard it? " - (buffer-name) size)) - (progn (setq buffer-undo-list nil) t) - nil)) + (when (or (null undo-extra-outer-limit) + (> size undo-extra-outer-limit)) + ;; Don't ask the question again unless it gets even bigger. + ;; This applies, in particular, if the user quits from the question. + ;; Such a quit quits out of GC, but something else will call GC + ;; again momentarily. It will call this function again, + ;; but we don't want to ask the question again. + (setq undo-extra-outer-limit (+ size 50000)) + (if (let (use-dialog-box) + (yes-or-no-p (format "Buffer %s undo info is %d bytes long; discard it? " + (buffer-name) size))) + (progn (setq buffer-undo-list nil) + (setq undo-extra-outer-limit nil) + t) + nil))) (defvar shell-command-history nil "History list for some commands that read shell commands.") @@ -3533,15 +3585,17 @@ (interactive "p") (forward-word (- (or arg 1)))) -(defun mark-word (&optional arg) +(defun mark-word (&optional arg allow-extend) "Set mark ARG words away from point. The place mark goes is the same place \\[forward-word] would move to with the same argument. -If this command is repeated or mark is active in Transient Mark mode, +Interactively, if this command is repeated +or (in Transient Mark mode) if the mark is active, it marks the next ARG words after the ones already marked." - (interactive "P") - (cond ((or (and (eq last-command this-command) (mark t)) - (and transient-mark-mode mark-active)) + (interactive "P\np") + (cond ((and allow-extend + (or (and (eq last-command this-command) (mark t)) + (and transient-mark-mode mark-active))) (setq arg (if arg (prefix-numeric-value arg) (if (< (mark) (point)) -1 1))) (set-mark diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/startup.el --- a/lisp/startup.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/startup.el Sun Jan 02 09:13:19 2005 +0000 @@ -229,9 +229,17 @@ override them. Users can prevent loading `default.el' with the `-q' option or by setting `inhibit-default-init' in their own init files, but inhibiting `site-start.el' requires `--no-site-file', which -is less convenient." +is less convenient. + +This variable is defined for customization so as to make +it visible in the relevant context. However, actually customizing it +is not allowed, since it would not work anyway. The only way to set +this variable usefully is to set it during while building and dumping Emacs." :type '(choice (const :tag "none" nil) string) - :group 'initialization) + :group 'initialization + :initialize 'custom-initialize-default + :set '(lambda (variable value) + (error "Customizing `site-run-file' does not work"))) (defcustom mail-host-address nil "*Name of this machine, for purposes of naming users." diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/subr.el --- a/lisp/subr.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/subr.el Sun Jan 02 09:13:19 2005 +0000 @@ -823,7 +823,7 @@ (defalias 'unfocus-frame 'ignore "") -;;;; Obsolescence declarations for variables. +;;;; Obsolescence declarations for variables, and aliases. (make-obsolete-variable 'directory-sep-char "do not use it." "21.1") (make-obsolete-variable 'mode-line-inverse-video "use the appropriate faces instead." "21.1") @@ -840,6 +840,8 @@ (make-obsolete-variable 'x-lost-selection-hooks 'x-lost-selection-functions "21.4") (defvaralias 'x-sent-selection-hooks 'x-sent-selection-functions) (make-obsolete-variable 'x-sent-selection-hooks 'x-sent-selection-functions "21.4") + +(defvaralias 'messages-buffer-max-lines 'message-log-max) ;;;; Alternate names for functions - these are not being phased out. @@ -1012,19 +1014,33 @@ ;;; nil nil t) ;;; (setq symbol-file-load-history-loaded t))) -(defun symbol-file (function) - "Return the input source from which FUNCTION was loaded. +(defun symbol-file (symbol &optional type) + "Return the input source in which SYMBOL was defined. The value is normally a string that was passed to `load': either an absolute file name, or a library name \(with no directory name and no `.el' or `.elc' at the end). -It can also be nil, if the definition is not associated with any file." - (if (and (symbolp function) (fboundp function) - (eq 'autoload (car-safe (symbol-function function)))) - (nth 1 (symbol-function function)) +It can also be nil, if the definition is not associated with any file. + +If TYPE is nil, then any kind of definition is acceptable. +If TYPE is `defun' or `defvar', that specifies function +definition only or variable definition only." + (if (and (or (null type) (eq type 'defun)) + (symbolp symbol) (fboundp symbol) + (eq 'autoload (car-safe (symbol-function symbol)))) + (nth 1 (symbol-function symbol)) (let ((files load-history) file) (while files - (if (member function (cdr (car files))) + (if (if type + (if (eq type 'defvar) + ;; Variables are present just as their names. + (member symbol (cdr (car files))) + ;; Other types are represented as (TYPE . NAME). + (member (cons type symbol) (cdr (car files)))) + ;; We accept all types, so look for variable def + ;; and then for any other kind. + (or (member symbol (cdr (car files))) + (rassq symbol (cdr (car files))))) (setq file (car (car files)) files nil)) (setq files (cdr files))) file))) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/term/mac-win.el --- a/lisp/term/mac-win.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/term/mac-win.el Sun Jan 02 09:13:19 2005 +0000 @@ -1,8 +1,9 @@ -;;; mac-win.el --- support for "Macintosh windows" +;;; mac-win.el --- parse switches controlling interface with Mac window system -;; Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc. +;; Copyright (C) 1999, 2000, 2002, 2003, 2004 Free Software Foundation, Inc. ;; Author: Andrew Choi +;; Keywords: terminals ;; This file is part of GNU Emacs. @@ -23,243 +24,212 @@ ;;; Commentary: -;;; Code: - -;; --------------------------------------------------------------------------- -;; We want to delay setting frame parameters until the faces are setup - -;; Mac can't handle ~ prefix in file names -;(setq auto-save-list-file-prefix ".saves-") - -(setq frame-creation-function 'x-create-frame-with-faces) +;; Mac-win.el: this file is loaded from ../lisp/startup.el when it recognizes +;; that Mac windows are to be used. Command line switches are parsed and those +;; pertaining to Mac are processed and removed from the command line. The +;; Mac display is opened and hooks are set for popping up the initial window. -;; for debugging -;; (defun mac-handle-scroll-bar-event (event) (interactive "e") (princ event)) - -;;(global-set-key [vertical-scroll-bar mouse-1] 'mac-handle-scroll-bar-event) +;; startup.el will then examine startup files, and eventually call the hooks +;; which create the first window(s). -(global-set-key - [vertical-scroll-bar down-mouse-1] - 'mac-handle-scroll-bar-event) +;;; Code: + +;; These are the standard X switches from the Xt Initialize.c file of +;; Release 4. -(global-unset-key [vertical-scroll-bar drag-mouse-1]) -(global-unset-key [vertical-scroll-bar mouse-1]) - -(require 'scroll-bar) +;; Command line Resource Manager string -(defun mac-handle-scroll-bar-event (event) - "Handle scroll bar EVENT to emulate Mac Toolbox style scrolling." - (interactive "e") - (let* ((position (event-start event)) - (window (nth 0 position)) - (bar-part (nth 4 position))) - (select-window window) - (cond - ((eq bar-part 'up) - (goto-char (window-start window)) - (mac-scroll-down-line)) - ((eq bar-part 'above-handle) - (mac-scroll-down)) - ((eq bar-part 'handle) - (scroll-bar-drag event)) - ((eq bar-part 'below-handle) - (mac-scroll-up)) - ((eq bar-part 'down) - (goto-char (window-start window)) - (mac-scroll-up-line))))) +;; +rv *reverseVideo +;; +synchronous *synchronous +;; -background *background +;; -bd *borderColor +;; -bg *background +;; -bordercolor *borderColor +;; -borderwidth .borderWidth +;; -bw .borderWidth +;; -display .display +;; -fg *foreground +;; -fn *font +;; -font *font +;; -foreground *foreground +;; -geometry .geometry +;; -i .iconType +;; -itype .iconType +;; -iconic .iconic +;; -name .name +;; -reverse *reverseVideo +;; -rv *reverseVideo +;; -selectionTimeout .selectionTimeout +;; -synchronous *synchronous +;; -xrm -(defun mac-scroll-ignore-events () - ;; Ignore confusing non-mouse events - (while (not (memq (car-safe (read-event)) - '(mouse-1 double-mouse-1 triple-mouse-1))) nil)) +;; An alist of X options and the function which handles them. See +;; ../startup.el. -(defun mac-scroll-down () - (track-mouse - (mac-scroll-ignore-events) - (scroll-down))) +(if (not (eq window-system 'mac)) + (error "%s: Loading mac-win.el but not compiled for Mac" (invocation-name))) -(defun mac-scroll-down-line () - (track-mouse - (mac-scroll-ignore-events) - (scroll-down 1))) - -(defun mac-scroll-up () - (track-mouse - (mac-scroll-ignore-events) - (scroll-up))) - -(defun mac-scroll-up-line () - (track-mouse - (mac-scroll-ignore-events) - (scroll-up 1))) +(require 'frame) +(require 'mouse) +(require 'scroll-bar) +(require 'faces) +;;(require 'select) +(require 'menu-bar) +(require 'fontset) +(require 'x-dnd) -(defun xw-defined-colors (&optional frame) - "Internal function called by `defined-colors', which see." - (or frame (setq frame (selected-frame))) - (let ((all-colors x-colors) - (this-color nil) - (defined-colors nil)) - (while all-colors - (setq this-color (car all-colors) - all-colors (cdr all-colors)) - (and (color-supported-p this-color frame t) - (setq defined-colors (cons this-color defined-colors)))) - defined-colors)) +(defvar x-invocation-args) -;; Don't have this yet. -(fset 'x-get-resource 'ignore) +(defvar x-command-line-resources nil) -(unless (eq system-type 'darwin) - ;; This variable specifies the Unix program to call (as a process) to - ;; deteremine the amount of free space on a file system (defaults to - ;; df). If it is not set to nil, ls-lisp will not work correctly - ;; unless an external application df is implemented on the Mac. - (setq directory-free-space-program nil) - - ;; Set this so that Emacs calls subprocesses with "sh" as shell to - ;; expand filenames Note no subprocess for the shell is actually - ;; started (see run_mac_command in sysdep.c). - (setq shell-file-name "sh")) +;; Handler for switches of the form "-switch value" or "-switch". +(defun x-handle-switch (switch) + (let ((aelt (assoc switch command-line-x-option-alist))) + (if aelt + (let ((param (nth 3 aelt)) + (value (nth 4 aelt))) + (if value + (setq default-frame-alist + (cons (cons param value) + default-frame-alist)) + (setq default-frame-alist + (cons (cons param + (car x-invocation-args)) + default-frame-alist) + x-invocation-args (cdr x-invocation-args))))))) -;; X Window emulation in macterm.c is not complete enough to start a -;; frame without a minibuffer properly. Call this to tell ediff -;; library to use a single frame. -; (ediff-toggle-multiframe) - -;; Setup to use the Mac clipboard. The functions mac-cut-function and -;; mac-paste-function are defined in mac.c. -(set-selection-coding-system 'compound-text-mac) +;; Handler for switches of the form "-switch n" +(defun x-handle-numeric-switch (switch) + (let ((aelt (assoc switch command-line-x-option-alist))) + (if aelt + (let ((param (nth 3 aelt))) + (setq default-frame-alist + (cons (cons param + (string-to-int (car x-invocation-args))) + default-frame-alist) + x-invocation-args + (cdr x-invocation-args)))))) -(setq interprogram-cut-function - '(lambda (str push) - (mac-cut-function - (encode-coding-string str selection-coding-system t) push))) - -(setq interprogram-paste-function - '(lambda () - (let ((clipboard (mac-paste-function))) - (if clipboard - (decode-coding-string clipboard selection-coding-system t))))) +;; Handle options that apply to initial frame only +(defun x-handle-initial-switch (switch) + (let ((aelt (assoc switch command-line-x-option-alist))) + (if aelt + (let ((param (nth 3 aelt)) + (value (nth 4 aelt))) + (if value + (setq initial-frame-alist + (cons (cons param value) + initial-frame-alist)) + (setq initial-frame-alist + (cons (cons param + (car x-invocation-args)) + initial-frame-alist) + x-invocation-args (cdr x-invocation-args))))))) -;; Don't show the frame name; that's redundant. -(setq-default mode-line-frame-identification " ") +;; Make -iconic apply only to the initial frame! +(defun x-handle-iconic (switch) + (setq initial-frame-alist + (cons '(visibility . icon) initial-frame-alist))) -(defun mac-drag-n-drop (event) - "Edit the files listed in the drag-n-drop event.\n\ -Switch to a buffer editing the last file dropped." - (interactive "e") - (save-excursion - ;; Make sure the drop target has positive co-ords - ;; before setting the selected frame - otherwise it - ;; won't work. - (let* ((window (posn-window (event-start event))) - (coords (posn-x-y (event-start event))) - (x (car coords)) - (y (cdr coords))) - (if (and (> x 0) (> y 0)) - (set-frame-selected-window nil window)) - (mapcar - '(lambda (file) - (find-file - (decode-coding-string - file - (or file-name-coding-system - default-file-name-coding-system)))) - (car (cdr (cdr event))))) - (raise-frame) - (recenter))) - -(global-set-key [drag-n-drop] 'mac-drag-n-drop) +;; Handle the -xrm option. +(defun x-handle-xrm-switch (switch) + (unless (consp x-invocation-args) + (error "%s: missing argument to `%s' option" (invocation-name) switch)) + (setq x-command-line-resources + (if (null x-command-line-resources) + (car x-invocation-args) + (concat x-command-line-resources "\n" (car x-invocation-args)))) + (setq x-invocation-args (cdr x-invocation-args))) -;; By checking whether the variable mac-ready-for-drag-n-drop has been -;; defined, the event loop in macterm.c can be informed that it can -;; now receive Finder drag and drop events. Files dropped onto the -;; Emacs application icon can only be processed when the initial frame -;; has been created: this is where the files should be opened. -(add-hook 'after-init-hook - '(lambda () - (defvar mac-ready-for-drag-n-drop t))) - -; Define constant values to be set to mac-keyboard-text-encoding -(defconst kTextEncodingMacRoman 0) -(defconst kTextEncodingISOLatin1 513 "0x201") -(defconst kTextEncodingISOLatin2 514 "0x202") - +;; Handle the geometry option +(defun x-handle-geometry (switch) + (let* ((geo (x-parse-geometry (car x-invocation-args))) + (left (assq 'left geo)) + (top (assq 'top geo)) + (height (assq 'height geo)) + (width (assq 'width geo))) + (if (or height width) + (setq default-frame-alist + (append default-frame-alist + '((user-size . t)) + (if height (list height)) + (if width (list width))) + initial-frame-alist + (append initial-frame-alist + '((user-size . t)) + (if height (list height)) + (if width (list width))))) + (if (or left top) + (setq initial-frame-alist + (append initial-frame-alist + '((user-position . t)) + (if left (list left)) + (if top (list top))))) + (setq x-invocation-args (cdr x-invocation-args)))) -;; Create a fontset that uses mac-roman font. With this fontset, -;; characters decoded from mac-roman encoding (ascii, latin-iso8859-1, -;; and mule-unicode-xxxx-yyyy) are displayed by a mac-roman font. -;; Unnecessary in emacs22 - -;; Carbon uses different fonts than commonly found on X, so -;; we define our own standard fontset here. -(defvar mac-standard-fontset-spec - "-apple-Monaco-normal-r-*-*-12-*-*-*-*-*-fontset-mac" - "String of fontset spec of the standard fontset. -This defines a fontset consisting of the Monaco variations for -European languages which are distributed with Mac OS X. - -See the documentation of `create-fontset-from-fontset-spec for the format.") +;; Handle the -name option. Set the variable x-resource-name +;; to the option's operand; set the name of +;; the initial frame, too. +(defun x-handle-name-switch (switch) + (or (consp x-invocation-args) + (error "%s: missing argument to `%s' option" (invocation-name) switch)) + (setq x-resource-name (car x-invocation-args) + x-invocation-args (cdr x-invocation-args)) + (setq initial-frame-alist (cons (cons 'name x-resource-name) + initial-frame-alist))) - -(if (fboundp 'new-fontset) - (progn - (require 'fontset) - ;; Setup the default fontset. - (setup-default-fontset) - ;; Create the standard fontset. - (create-fontset-from-fontset-spec mac-standard-fontset-spec t) - )) - +(defvar x-display-name nil + "The display name specifying server and frame.") -(if (eq system-type 'darwin) - ;; On Darwin filenames are encoded in UTF-8 - (setq file-name-coding-system 'utf-8) - ;; To display filenames in Chinese or Japanese, replace mac-roman with - ;; big5 or sjis - (setq file-name-coding-system 'mac-roman)) - -;; If Emacs is started from the Finder, change the default directory -;; to the user's home directory. -(if (string= default-directory "/") - (cd "~")) - -;; Tell Emacs to use pipes instead of pty's for processes because the -;; latter sometimes lose characters. Pty support is compiled in since -;; ange-ftp will not work without it. -(setq process-connection-type nil) +(defun x-handle-display (switch) + (setq x-display-name (car x-invocation-args) + x-invocation-args (cdr x-invocation-args))) -;; Assume that fonts are always scalable on the Mac. This sometimes -;; results in characters with jagged edges. However, without it, -;; fonts with both truetype and bitmap representations but no italic -;; or bold bitmap versions will not display these variants correctly. -(setq scalable-fonts-allowed t) - -;; Make suspend-emacs [C-z] collapse the current frame -(substitute-key-definition 'suspend-emacs 'iconify-frame - global-map) - -;; Support mouse-wheel scrolling -(mouse-wheel-mode 1) - -;; (prefer-coding-system 'mac-roman) - -;; Map certain keypad keys into ASCII characters that people usually expect -(define-key function-key-map [return] [?\C-m]) -(define-key function-key-map [M-return] [?\M-\C-m]) -(define-key function-key-map [tab] [?\t]) -(define-key function-key-map [M-tab] [?\M-\t]) -(define-key function-key-map [backspace] [127]) -(define-key function-key-map [M-backspace] [?\M-\d]) -(define-key function-key-map [escape] [?\e]) -(define-key function-key-map [M-escape] [?\M-\e]) - -;; Tell read-char how to convert special chars to ASCII -(put 'return 'ascii-character 13) -(put 'tab 'ascii-character ?\t) -(put 'backspace 'ascii-character 127) -(put 'escape 'ascii-character ?\e) - +(defun x-handle-args (args) + "Process the X-related command line options in ARGS. +This is done before the user's startup file is loaded. They are copied to +`x-invocation-args', from which the X-related things are extracted, first +the switch (e.g., \"-fg\") in the following code, and possible values +\(e.g., \"black\") in the option handler code (e.g., x-handle-switch). +This function returns ARGS minus the arguments that have been processed." + ;; We use ARGS to accumulate the args that we don't handle here, to return. + (setq x-invocation-args args + args nil) + (while (and x-invocation-args + (not (equal (car x-invocation-args) "--"))) + (let* ((this-switch (car x-invocation-args)) + (orig-this-switch this-switch) + completion argval aelt handler) + (setq x-invocation-args (cdr x-invocation-args)) + ;; Check for long options with attached arguments + ;; and separate out the attached option argument into argval. + (if (string-match "^--[^=]*=" this-switch) + (setq argval (substring this-switch (match-end 0)) + this-switch (substring this-switch 0 (1- (match-end 0))))) + ;; Complete names of long options. + (if (string-match "^--" this-switch) + (progn + (setq completion (try-completion this-switch command-line-x-option-alist)) + (if (eq completion t) + ;; Exact match for long option. + nil + (if (stringp completion) + (let ((elt (assoc completion command-line-x-option-alist))) + ;; Check for abbreviated long option. + (or elt + (error "Option `%s' is ambiguous" this-switch)) + (setq this-switch completion)))))) + (setq aelt (assoc this-switch command-line-x-option-alist)) + (if aelt (setq handler (nth 2 aelt))) + (if handler + (if argval + (let ((x-invocation-args + (cons argval x-invocation-args))) + (funcall handler this-switch)) + (funcall handler this-switch)) + (setq args (cons orig-this-switch args))))) + (nconc (nreverse args) x-invocation-args)) + ;; ;; Available colors ;; @@ -1016,8 +986,327 @@ "GhostWhite" "ghost white" "snow") - "The list of X colors from the `rgb.txt' file. + "The list of X colors from the `rgb.txt' file. XConsortium: rgb.txt,v 10.41 94/02/20 18:39:36 rws Exp") +(defun xw-defined-colors (&optional frame) + "Internal function called by `defined-colors', which see." + (or frame (setq frame (selected-frame))) + (let ((all-colors x-colors) + (this-color nil) + (defined-colors nil)) + (while all-colors + (setq this-color (car all-colors) + all-colors (cdr all-colors)) + (and (color-supported-p this-color frame t) + (setq defined-colors (cons this-color defined-colors)))) + defined-colors)) + +;;;; Function keys + +(substitute-key-definition 'suspend-emacs 'iconify-or-deiconify-frame + global-map) + +;; Map certain keypad keys into ASCII characters +;; that people usually expect. +(define-key function-key-map [return] [?\C-m]) +(define-key function-key-map [M-return] [?\M-\C-m]) +(define-key function-key-map [tab] [?\t]) +(define-key function-key-map [M-tab] [?\M-\t]) +(define-key function-key-map [backspace] [127]) +(define-key function-key-map [M-backspace] [?\M-\d]) +(define-key function-key-map [escape] [?\e]) +(define-key function-key-map [M-escape] [?\M-\e]) + +;; These tell read-char how to convert +;; these special chars to ASCII. +(put 'return 'ascii-character 13) +(put 'tab 'ascii-character ?\t) +(put 'backspace 'ascii-character 127) +(put 'escape 'ascii-character ?\e) + + +;;;; Keysyms + +;; Define constant values to be set to mac-keyboard-text-encoding +(defconst kTextEncodingMacRoman 0) +(defconst kTextEncodingISOLatin1 513 "0x201") +(defconst kTextEncodingISOLatin2 514 "0x202") + + +;;;; Selections and cut buffers + +;; Setup to use the Mac clipboard. The functions mac-cut-function and +;; mac-paste-function are defined in mac.c. +(set-selection-coding-system 'compound-text-mac) + +(setq interprogram-cut-function + '(lambda (str push) + (mac-cut-function + (encode-coding-string str selection-coding-system t) push))) + +(setq interprogram-paste-function + '(lambda () + (let ((clipboard (mac-paste-function))) + (if clipboard + (decode-coding-string clipboard selection-coding-system t))))) + + +;;; Do the actual Windows setup here; the above code just defines +;;; functions and variables that we use now. + +(setq command-line-args (x-handle-args command-line-args)) + +;;; Make sure we have a valid resource name. +(or (stringp x-resource-name) + (let (i) + (setq x-resource-name (invocation-name)) + + ;; Change any . or * characters in x-resource-name to hyphens, + ;; so as not to choke when we use it in X resource queries. + (while (setq i (string-match "[.*]" x-resource-name)) + (aset x-resource-name i ?-)))) + +(if (x-display-list) + ;; On Mac OS 8/9, Most coding systems used in code conversion for + ;; font names are not ready at the time when the terminal frame is + ;; created. So we reconstruct font name table for the initial + ;; frame. + (mac-clear-font-name-table) + (x-open-connection "Mac" + x-command-line-resources + ;; Exit Emacs with fatal error if this fails. + t)) + +(setq frame-creation-function 'x-create-frame-with-faces);; Setup the default fontset. +(setup-default-fontset) + +;; Carbon uses different fonts than commonly found on X, so +;; we define our own standard fontset here. +(defvar mac-standard-fontset-spec + "-apple-Monaco-normal-r-*-*-12-*-*-*-*-*-fontset-mac" + "String of fontset spec of the standard fontset. +This defines a fontset consisting of the Monaco variations for +European languages which are distributed with Mac OS X. + +See the documentation of `create-fontset-from-fontset-spec for the format.") + +;; Create a fontset that uses mac-roman font. With this fontset, +;; characters decoded from mac-roman encoding (ascii, latin-iso8859-1, +;; and mule-unicode-xxxx-yyyy) are displayed by a mac-roman font. +(create-fontset-from-fontset-spec mac-standard-fontset-spec t) + +;; Create fontset specified in X resources "Fontset-N" (N is 0, 1, ...). +(create-fontset-from-x-resource) + +;; Try to create a fontset from a font specification which comes +;; from initial-frame-alist, default-frame-alist, or X resource. +;; A font specification in command line argument (i.e. -fn XXXX) +;; should be already in default-frame-alist as a `font' +;; parameter. However, any font specifications in site-start +;; library, user's init file (.emacs), and default.el are not +;; yet handled here. + +(let ((font (or (cdr (assq 'font initial-frame-alist)) + (cdr (assq 'font default-frame-alist)) + (x-get-resource "font" "Font"))) + xlfd-fields resolved-name) + (if (and font + (not (query-fontset font)) + (setq resolved-name (x-resolve-font-name font)) + (setq xlfd-fields (x-decompose-font-name font))) + (if (string= "fontset" (aref xlfd-fields xlfd-regexp-registry-subnum)) + (new-fontset font (x-complement-fontset-spec xlfd-fields nil)) + ;; Create a fontset from FONT. The fontset name is + ;; generated from FONT. + (create-fontset-from-ascii-font font resolved-name "startup")))) + +;; 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. +(let* ((res-geometry (x-get-resource "geometry" "Geometry")) + parsed) + (if res-geometry + (progn + (setq parsed (x-parse-geometry res-geometry)) + ;; If the resource specifies a position, + ;; call the position and size "user-specified". + (if (or (assq 'top parsed) (assq 'left parsed)) + (setq parsed (cons '(user-position . t) + (cons '(user-size . t) parsed)))) + ;; All geometry parms apply to the initial frame. + (setq initial-frame-alist (append initial-frame-alist parsed)) + ;; The size parms apply to all frames. + (if (assq 'height parsed) + (setq default-frame-alist + (cons (cons 'height (cdr (assq 'height parsed))) + default-frame-alist))) + (if (assq 'width parsed) + (setq default-frame-alist + (cons (cons 'width (cdr (assq 'width parsed))) + default-frame-alist)))))) + +;; Check the reverseVideo resource. +(let ((case-fold-search t)) + (let ((rv (x-get-resource "reverseVideo" "ReverseVideo"))) + (if (and rv + (string-match "^\\(true\\|yes\\|on\\)$" rv)) + (setq default-frame-alist + (cons '(reverse . t) default-frame-alist))))) + +(defun x-win-suspend-error () + (error "Suspending an Emacs running under Mac makes no sense")) +(add-hook 'suspend-hook 'x-win-suspend-error) + +;; Don't show the frame name; that's redundant. +(setq-default mode-line-frame-identification " ") + +;; Turn on support for mouse wheels. +(mouse-wheel-mode 1) + +(defun mac-drag-n-drop (event) + "Edit the files listed in the drag-n-drop EVENT. +Switch to a buffer editing the last file dropped." + (interactive "e") + ;; Make sure the drop target has positive co-ords + ;; before setting the selected frame - otherwise it + ;; won't work. + (let* ((window (posn-window (event-start event))) + (coords (posn-x-y (event-start event))) + (x (car coords)) + (y (cdr coords))) + (if (and (> x 0) (> y 0)) + (set-frame-selected-window nil window)) + (mapcar (lambda (file-name) + (if (listp file-name) + (let ((line (car file-name)) + (start (car (cdr file-name))) + (end (car (cdr (cdr file-name))))) + (if (> line 0) + (goto-line line) + (if (and (> start 0) (> end 0)) + (progn (set-mark start) + (goto-char end))))) + (x-dnd-handle-one-url window 'private + (concat "file:" file-name)))) + (car (cdr (cdr event))))) + (raise-frame)) + +(global-set-key [drag-n-drop] 'mac-drag-n-drop) + +;; By checking whether the variable mac-ready-for-drag-n-drop has been +;; defined, the event loop in macterm.c can be informed that it can +;; now receive Finder drag and drop events. Files dropped onto the +;; Emacs application icon can only be processed when the initial frame +;; has been created: this is where the files should be opened. +(add-hook 'after-init-hook + '(lambda () + (defvar mac-ready-for-drag-n-drop t))) + +;;;; Scroll bars + +;; for debugging +;; (defun mac-handle-scroll-bar-event (event) (interactive "e") (princ event)) + +;;(global-set-key [vertical-scroll-bar mouse-1] 'mac-handle-scroll-bar-event) + +(global-set-key + [vertical-scroll-bar down-mouse-1] + 'mac-handle-scroll-bar-event) + +(global-unset-key [vertical-scroll-bar drag-mouse-1]) +(global-unset-key [vertical-scroll-bar mouse-1]) + +(defun mac-handle-scroll-bar-event (event) + "Handle scroll bar EVENT to emulate Mac Toolbox style scrolling." + (interactive "e") + (let* ((position (event-start event)) + (window (nth 0 position)) + (bar-part (nth 4 position))) + (select-window window) + (cond + ((eq bar-part 'up) + (goto-char (window-start window)) + (mac-scroll-down-line)) + ((eq bar-part 'above-handle) + (mac-scroll-down)) + ((eq bar-part 'handle) + (scroll-bar-drag event)) + ((eq bar-part 'below-handle) + (mac-scroll-up)) + ((eq bar-part 'down) + (goto-char (window-start window)) + (mac-scroll-up-line))))) + +(defun mac-scroll-ignore-events () + ;; Ignore confusing non-mouse events + (while (not (memq (car-safe (read-event)) + '(mouse-1 double-mouse-1 triple-mouse-1))) nil)) + +(defun mac-scroll-down () + (track-mouse + (mac-scroll-ignore-events) + (scroll-down))) + +(defun mac-scroll-down-line () + (track-mouse + (mac-scroll-ignore-events) + (scroll-down 1))) + +(defun mac-scroll-up () + (track-mouse + (mac-scroll-ignore-events) + (scroll-up))) + +(defun mac-scroll-up-line () + (track-mouse + (mac-scroll-ignore-events) + (scroll-up 1))) + + +;;;; Others + +(unless (eq system-type 'darwin) + ;; This variable specifies the Unix program to call (as a process) to + ;; deteremine the amount of free space on a file system (defaults to + ;; df). If it is not set to nil, ls-lisp will not work correctly + ;; unless an external application df is implemented on the Mac. + (setq directory-free-space-program nil) + + ;; Set this so that Emacs calls subprocesses with "sh" as shell to + ;; expand filenames Note no subprocess for the shell is actually + ;; started (see run_mac_command in sysdep.c). + (setq shell-file-name "sh")) + +;; X Window emulation in macterm.c is not complete enough to start a +;; frame without a minibuffer properly. Call this to tell ediff +;; library to use a single frame. +; (ediff-toggle-multiframe) + +(if (eq system-type 'darwin) + ;; On Darwin filenames are encoded in UTF-8 + (setq file-name-coding-system 'utf-8) + ;; To display filenames in Chinese or Japanese, replace mac-roman with + ;; big5 or sjis + (setq file-name-coding-system 'mac-roman)) + +;; If Emacs is started from the Finder, change the default directory +;; to the user's home directory. +(if (string= default-directory "/") + (cd "~")) + +;; Tell Emacs to use pipes instead of pty's for processes because the +;; latter sometimes lose characters. Pty support is compiled in since +;; ange-ftp will not work without it. +(setq process-connection-type nil) + +;; Assume that fonts are always scalable on the Mac. This sometimes +;; results in characters with jagged edges. However, without it, +;; fonts with both truetype and bitmap representations but no italic +;; or bold bitmap versions will not display these variants correctly. +(setq scalable-fonts-allowed t) + +;; (prefer-coding-system 'mac-roman) + ;;; arch-tag: 71dfcd14-cde8-4d66-b05c-85ec94fb23a6 ;;; mac-win.el ends here diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/textmodes/artist.el --- a/lisp/textmodes/artist.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/textmodes/artist.el Sun Jan 02 09:13:19 2005 +0000 @@ -5,8 +5,8 @@ ;; Author: Tomas Abrahamsson ;; Maintainer: Tomas Abrahamsson ;; Keywords: mouse -;; Version: 1.2.4 -;; Release-date: 25-Oct-2001 +;; Version: 1.2.6 +;; Release-date: 6-Aug-2004 ;; Location: http://www.lysator.liu.se/~tab/artist/ ;; This file is part of GNU Emacs. @@ -136,6 +136,14 @@ ;;; ChangeLog: +;; 1.2.6 6-Aug-2004 +;; New: Coerced with the artist.el that's in Emacs-21.3. +;; (minor editorial changes) +;; +;; 1.2.5 4-Aug-2004 +;; New: Added tool selection via the mouse-wheel +;; Function provided by Andreas Leue +;; ;; 1.2.4 25-Oct-2001 ;; Bugfix: Some operations (the edit menu) got hidden ;; Bugfix: The first arrow for poly-lines was always pointing @@ -187,7 +195,7 @@ ;; Variables -(defconst artist-version "1.2.4") +(defconst artist-version "1.2.6") (defconst artist-maintainer-address "tab@lysator.liu.se") @@ -471,6 +479,14 @@ The fill char is used instead, if it is set.") (make-variable-buffer-local 'artist-borderless-shapes) +(defvar artist-prev-next-op-alist nil + "Assoc list for looking up next and/or previous draw operation. +The structure is as follows: (OP . (PREV-OP . NEXT-OP)) +where the elements are as follows: +* OP is an atom: the KEY-SYMBOL in the `artist-mt' structure +* PREV-OP and NEXT-OP are strings: the KEYWORD in the `artist-mt' structure + +This variable is initialized by the artist-make-prev-next-op-alist function.") (eval-when-compile ;; Make rect available at compile-time @@ -496,6 +512,8 @@ (define-key map [S-down-mouse-2] 'artist-mouse-choose-operation) (define-key map [down-mouse-3] 'artist-down-mouse-3) (define-key map [S-down-mouse-3] 'artist-down-mouse-3) + (define-key map [C-mouse-4] 'artist-select-prev-op-in-list) + (define-key map [C-mouse-5] 'artist-select-next-op-in-list) (define-key map "\r" 'artist-key-set-point) ; return (define-key map [up] 'artist-previous-line) (define-key map "\C-p" 'artist-previous-line) @@ -1063,6 +1081,73 @@ "Retrieve the items component from a graphics operation INFO-PART." (elt info-part 1)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; mouse wheel cyclic operation selection + +(defun artist-get-last-non-nil-op (op-list &optional last-non-nil) + "Find the last non-nil draw operation in OP-LIST. +Optional LAST-NON-NIL will be returned if OP-LIST is nil." + (if op-list + (artist-get-last-non-nil-op (cdr op-list) + (or (car (car op-list)) last-non-nil)) + last-non-nil)) + +(defun artist-get-first-non-nil-op (op-list) + "Find the first non-nil draw operation in OP-LIST." + (or (car (car op-list)) (artist-get-first-non-nil-op (cdr op-list)))) + +(defun artist-is-in-op-list-p (op op-list) + "Check whether OP is in OP-LIST." + (and op-list + (or (and (car (car op-list)) (string= op (car (car op-list)))) + (artist-is-in-op-list-p op (cdr op-list))))) + +(defun artist-make-prev-next-op-alist (op-list + &optional + last-non-nil-arg first-non-nil-arg + prev-entry prev-op-arg) + "Build an assoc-list of OP-LIST. +The arguments LAST-NON-NIL-ARG, FIRST-NON-NIL-ARG, PREV-ENTRY and +PREV-OP-ARG are used when invoked recursively during the build-up." + (let* ((last-non-nil (or last-non-nil-arg + (artist-get-last-non-nil-op + artist-key-compl-table))) + (first-non-nil (or first-non-nil-arg + (artist-get-first-non-nil-op + artist-key-compl-table))) + (prev-op (or prev-op-arg last-non-nil)) + (op (car (car op-list))) + (opsym (artist-mt-get-symbol-from-keyword op)) + (entry (cons opsym (cons prev-op nil)))) + (if (or (and op-list (not op)) + (artist-is-in-op-list-p op (cdr op-list))) + (artist-make-prev-next-op-alist (cdr op-list) + last-non-nil first-non-nil + prev-entry prev-op) + (if prev-entry (setcdr (cdr prev-entry) op)) + (if op-list + (cons entry (artist-make-prev-next-op-alist + (cdr op-list) + last-non-nil first-non-nil + entry op)) + (progn (setcdr (cdr prev-entry) first-non-nil) nil))))) + +(defun artist-select-next-op-in-list () + "Cyclically select next drawing mode operation." + (interactive) + (let ((next-op (cdr (cdr (assoc artist-curr-go artist-prev-next-op-alist))))) + (artist-select-operation next-op) + (message next-op))) + +(defun artist-select-prev-op-in-list () + "Cyclically select previous drawing mode operation." + (interactive) + (let ((prev-op (car (cdr (assoc artist-curr-go artist-prev-next-op-alist))))) + (artist-select-operation prev-op) + (message prev-op))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;;; --------------------------------- ;;; The artist-mode ;;; --------------------------------- @@ -1317,6 +1402,7 @@ (make-local-variable 'artist-key-draw-how) (make-local-variable 'artist-popup-menu-table) (make-local-variable 'artist-key-compl-table) + (make-local-variable 'artist-prev-next-op-alist) (make-local-variable 'artist-rb-save-data) (make-local-variable 'artist-arrow-point-1) (make-local-variable 'artist-arrow-point-2) @@ -1326,6 +1412,8 @@ (setq artist-key-shape nil) (setq artist-popup-menu-table (artist-compute-popup-menu-table artist-mt)) (setq artist-key-compl-table (artist-compute-key-compl-table artist-mt)) + (setq artist-prev-next-op-alist + (artist-make-prev-next-op-alist artist-key-compl-table)) (setq artist-rb-save-data (make-vector 7 0)) (setq artist-arrow-point-1 nil) (setq artist-arrow-point-2 nil) @@ -1444,7 +1532,7 @@ "Compute completion table from MENU-TABLE, suitable for `completing-read'." (apply 'nconc - (artist-remove-nulls + (remq nil (mapcar (lambda (element) (let ((element-tag (artist-mt-get-tag element))) @@ -1684,29 +1772,6 @@ "Call function FN with ARGS iff FN is not nil." (list 'if fn (cons 'funcall (cons fn args)))) -(defvar artist-butlast-fn 'artist-butlast - "The butlast function.") - -(if (fboundp 'butlast) - (setq artist-butlast-fn 'butlast) - (setq artist-butlast-fn 'artist-butlast)) - -(defun artist-butlast (l) - "Return the list L with all elements but the last." - (cond ((null l) nil) - ((null (cdr l)) nil) - (t (cons (car l) (artist-butlast (cdr l)))))) - - -(defun artist-last (l &optional n) - "Return the last link in the list L. -With optional argument N, returns Nth-to-last link (default 1)." - (nth (- (length l) (or n 1)) l)) - -(defun artist-remove-nulls (l) - "Remove nils in list L." - (remq nil l)) - (defun artist-uniq (l) "Remove consecutive duplicates in list L. Comparison is done with `equal'." (cond ((null l) nil) @@ -1714,16 +1779,6 @@ ((equal (car l) (car (cdr l))) (artist-uniq (cdr l))) ; first 2 equal (t (cons (car l) (artist-uniq (cdr l)))))) ; first 2 are different -(defmacro artist-push (x stack) - "Push element X to a STACK." - (list 'setq stack (list 'cons x stack))) - -(defmacro artist-pop (stack) - "Pop an element from a STACK." - (list 'prog1 - (list 'car stack) - (list 'setq stack (list 'cdr stack)))) - (defun artist-string-split (str r) "Split string STR at occurrences of regexp R, returning a list of strings." (let ((res nil) @@ -3158,14 +3213,14 @@ "Vaporize lines reachable from point X1, Y1." (let ((ep-stack nil)) (mapcar - (lambda (ep) (artist-push ep ep-stack)) + (lambda (ep) (push ep ep-stack)) (artist-vap-find-endpoints x1 y1)) (while (not (null ep-stack)) - (let* ((vaporize-point (artist-pop ep-stack)) + (let* ((vaporize-point (pop ep-stack)) (new-endpoints (artist-vaporize-line (car vaporize-point) (cdr vaporize-point)))) (mapcar - (lambda (endpoint) (artist-push endpoint ep-stack)) + (lambda (endpoint) (push endpoint ep-stack)) new-endpoints))))) @@ -3326,7 +3381,7 @@ ;; that look like: \ / instead we get: ( ) ;; \ / \ / ;; --------- --------- - (let ((last-coord (artist-last point-list))) + (let ((last-coord (last point-list))) (if (= (artist-coord-get-new-char last-coord) ?/) (artist-coord-set-new-char last-coord artist-ellipse-right-char))) @@ -3359,7 +3414,7 @@ (t c))))) ;; The cdr and butlast below is so we don't draw the middle top ;; and middle bottom char twice. - (funcall artist-butlast-fn (cdr (reverse right-half))))) + (butlast (cdr (reverse right-half))))) (append right-half left-half))) @@ -3675,10 +3730,10 @@ ;; area we are about to fill, or, in other words, don't fill if we ;; needn't. (if (not (= c artist-fill-char)) - (artist-push (artist-new-coord x1 y1) stack)) + (push (artist-new-coord x1 y1) stack)) (while (not (null stack)) - (let* ((coord (artist-pop stack)) + (let* ((coord (pop stack)) (x (artist-coord-get-x coord)) (y (artist-coord-get-y coord)) @@ -3710,7 +3765,7 @@ (if lines-above (let ((c-above (artist-get-char-at-xy-conv x (- y 1)))) (if (and (= c-above c) (/= c-above last-c-above)) - (artist-push (artist-new-coord x (- y 1)) stack)) + (push (artist-new-coord x (- y 1)) stack)) (setq last-c-above c-above))) (setq last-x x) (setq x (- x 1))) @@ -3724,7 +3779,7 @@ (if lines-below (let ((c-below (artist-get-char-at-xy-conv x (1+ y)))) (if (and (= c-below c) (/= c-below last-c-below)) - (artist-push (artist-new-coord x (1+ y)) stack)) + (push (artist-new-coord x (1+ y)) stack)) (setq last-c-below c-below))) (setq x (- x 1))) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/textmodes/paragraphs.el --- a/lisp/textmodes/paragraphs.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/textmodes/paragraphs.el Sun Jan 02 09:13:19 2005 +0000 @@ -347,7 +347,7 @@ (or arg (setq arg 1)) (forward-paragraph (- arg))) -(defun mark-paragraph (&optional arg) +(defun mark-paragraph (&optional arg allow-extend) "Put point at beginning of this paragraph, mark at end. The paragraph marked is the one that contains point or follows point. @@ -357,15 +357,16 @@ If ARG is negative, point is put at end of this paragraph, mark is put at beginning of this or a previous paragraph. -If this command is repeated or mark is active in Transient Mark mode, -it marks the next ARG paragraphs after (or before, if arg is negative) -the ones already marked." - (interactive "p") +Interactively, if this command is repeated +or (in Transient Mark mode) if the mark is active, +it marks the next ARG paragraphs after the ones already marked." + (interactive "p\np") (unless arg (setq arg 1)) (when (zerop arg) (error "Cannot mark zero paragraphs")) - (cond ((or (and (eq last-command this-command) (mark t)) - (and transient-mark-mode mark-active)) + (cond ((and allow-extend + (or (and (eq last-command this-command) (mark t)) + (and transient-mark-mode mark-active))) (set-mark (save-excursion (goto-char (mark)) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/textmodes/texinfmt.el --- a/lisp/textmodes/texinfmt.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/textmodes/texinfmt.el Sun Jan 02 09:13:19 2005 +0000 @@ -378,6 +378,7 @@ (find-file outfile) (texinfo-mode) (erase-buffer) + (buffer-disable-undo) (message "Formatting Info file: %s" outfile) (setq texinfo-format-filename diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/textmodes/texinfo.el --- a/lisp/textmodes/texinfo.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/textmodes/texinfo.el Sun Jan 02 09:13:19 2005 +0000 @@ -581,7 +581,7 @@ texinfo-chapter-level-regexp "\\)\\>")) (make-local-variable 'require-final-newline) - (setq require-final-newline t) + (setq require-final-newline mode-require-final-newline) (make-local-variable 'indent-tabs-mode) (setq indent-tabs-mode nil) (make-local-variable 'paragraph-separate) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/textmodes/text-mode.el --- a/lisp/textmodes/text-mode.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/textmodes/text-mode.el Sun Jan 02 09:13:19 2005 +0000 @@ -68,7 +68,8 @@ Turning on Text mode runs the normal hook `text-mode-hook'." (make-local-variable 'text-mode-variant) (setq text-mode-variant t) - (set (make-local-variable 'require-final-newline) t) + (set (make-local-variable 'require-final-newline) + mode-require-final-newline) (set (make-local-variable 'indent-line-function) 'indent-relative)) (define-derived-mode paragraph-indent-text-mode text-mode "Parindent" diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/type-break.el --- a/lisp/type-break.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/type-break.el Sun Jan 02 09:13:19 2005 +0000 @@ -399,10 +399,6 @@ (type-break-keystroke-reset) (type-break-mode-line-countdown-or-break nil) - (if (boundp 'save-some-buffers-always) - (add-to-list 'save-some-buffers-always - (expand-file-name type-break-file-name))) - (setq type-break-time-last-break (type-break-get-previous-time)) ;; schedule according to break time from session file @@ -437,13 +433,10 @@ (do-auto-save) (with-current-buffer (find-file-noselect type-break-file-name 'nowarn) - (set-buffer-modified-p nil) + (setq buffer-save-without-query t) + (set-buffer-modified-p nil) (unlock-buffer) (kill-this-buffer)) - (if (boundp 'save-some-buffers-always) - (setq save-some-buffers-always - (remove (expand-file-name type-break-file-name) - save-some-buffers-always))) (and (interactive-p) (message "Type Break mode is disabled"))))) type-break-mode) @@ -515,16 +508,18 @@ (defun type-break-file-keystroke-count () "File keystroke count in `type-break-file-name', unless the file is locked." (if (not (stringp (file-locked-p type-break-file-name))) - (with-current-buffer (find-file-noselect type-break-file-name - 'nowarn) - (save-excursion - (let ((inhibit-read-only t)) - (goto-char (point-min)) - (forward-line) - (delete-region (point) (save-excursion (end-of-line) (point))) - (insert (format "%s" type-break-keystroke-count)) - ;; file saving is left to auto-save - ))))) + ;; Prevent deactivation of the mark in some other buffer. + (let (deactivate-mark) + (with-current-buffer (find-file-noselect type-break-file-name + 'nowarn) + (save-excursion + (let ((inhibit-read-only t)) + (goto-char (point-min)) + (forward-line) + (delete-region (point) (save-excursion (end-of-line) (point))) + (insert (format "%s" type-break-keystroke-count)) + ;; file saving is left to auto-save + )))))) (defun timep (time) "If TIME is in the format returned by `current-time' then diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/uniquify.el --- a/lisp/uniquify.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/uniquify.el Sun Jan 02 09:13:19 2005 +0000 @@ -188,7 +188,6 @@ file name elements. Arguments BASE, DIRNAME, and NEWBUF specify the new buffer that causes this rationaliztion." - (interactive) (if (null dirname) (with-current-buffer newbuf (setq uniquify-managed nil)) (setq dirname (expand-file-name (directory-file-name dirname))) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/vc-rcs.el --- a/lisp/vc-rcs.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/vc-rcs.el Sun Jan 02 09:13:19 2005 +0000 @@ -500,6 +500,7 @@ (defun vc-rcs-annotate-command (file buffer &optional revision) "Annotate FILE, inserting the results in BUFFER. Optional arg REVISION is a revision to annotate from." + (vc-setup-buffer buffer) ;; Aside from the "head revision on the trunk", the instructions for ;; each revision on the trunk are an ordered list of kill and insert ;; commands necessary to go from the chronologically-following diff -r fa0a5c4db2c8 -r 95879cc1ed20 lisp/wid-edit.el --- a/lisp/wid-edit.el Sat Dec 25 02:31:08 2004 +0000 +++ b/lisp/wid-edit.el Sun Jan 02 09:13:19 2005 +0000 @@ -3096,7 +3096,7 @@ (defvar widget-function-prompt-value-history nil "History of input to `widget-function-prompt-value'.") -(define-widget 'function 'sexp +(define-widget 'function 'restricted-sexp "A Lisp function." :complete-function (lambda () (interactive) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lispref/ChangeLog --- a/lispref/ChangeLog Sat Dec 25 02:31:08 2004 +0000 +++ b/lispref/ChangeLog Sun Jan 02 09:13:19 2005 +0000 @@ -1,3 +1,37 @@ +2004-12-30 Kim F. Storm + + * display.texi (Line Height): Total line-height is now specified + in line-height property of form (HEIGHT TOTAL). Swap (FACE . RATIO) + in cons cells. (nil . RATIO) is relative to actual line height. + Use line-height `t' instead of `0' to get minimum height. + +2004-12-29 Richard M. Stallman + + * os.texi (Timers): Discuss timers vs editing the buffer and undo. + +2004-12-28 Richard M. Stallman + + * commands.texi (Quitting): Clarify value of with-local-quit. + + * elisp.texi (Top): Fix previous change. + + * loading.texi (Loading): Fix previous change. + +2004-12-27 Richard M. Stallman + + * Makefile.in (MAKEINFO): Specify --force. + + * buffers.texi (Killing Buffers): Add buffer-save-without-query. + + * modes.texi (Emulating Mode Line): Document format's BUFFER arg. + + * display.texi (Line Height): Further clarify. + + * elisp.texi (Top): Update Loading submenu. + + * loading.texi (Where Defined): New node. + (Unloading): load-history moved to Where Defined. + 2004-12-21 Richard M. Stallman * commands.texi (Event Input Misc): Add while-no-input. diff -r fa0a5c4db2c8 -r 95879cc1ed20 lispref/Makefile.in --- a/lispref/Makefile.in Sat Dec 25 02:31:08 2004 +0000 +++ b/lispref/Makefile.in Sun Jan 02 09:13:19 2005 +0000 @@ -31,7 +31,7 @@ TEXI2DVI = texi2dvi SHELL = /bin/sh INSTALL_INFO = install-info -MAKEINFO = makeinfo +MAKEINFO = makeinfo --force # The name of the manual: VERSION=2.9 diff -r fa0a5c4db2c8 -r 95879cc1ed20 lispref/buffers.texi --- a/lispref/buffers.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/lispref/buffers.texi Sun Jan 02 09:13:19 2005 +0000 @@ -1041,6 +1041,13 @@ for any reason. @xref{Buffer-Local Variables}. @end defvar +@defvar buffer-save-without-query +This variable, if non-@code{nil} in a particular buffer, tells +@code{save-buffers-kill-emacs} and @code{save-some-buffers} to save +this buffer (if it's modified) without asking the user. The variable +automatically becomes buffer-local when set for any reason. +@end defvar + @defun buffer-live-p object This function returns @code{t} if @var{object} is a buffer which has not been killed, @code{nil} otherwise. diff -r fa0a5c4db2c8 -r 95879cc1ed20 lispref/commands.texi --- a/lispref/commands.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/lispref/commands.texi Sun Jan 02 09:13:19 2005 +0000 @@ -2605,7 +2605,8 @@ This macro executes @var{forms} in sequence, but allows quitting, at least locally, within @var{body} even if @code{inhibit-quit} was non-@code{nil} outside this construct. It returns the value of the -last form in @var{forms}. +last form in @var{forms}, unless exited by quitting, in which case +it returns @code{nil}. If @code{inhibit-quit} is @code{nil} on entry to @code{with-local-quit}, it only executes the @var{forms}, and setting @code{quit-flag} causes diff -r fa0a5c4db2c8 -r 95879cc1ed20 lispref/display.texi --- a/lispref/display.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/lispref/display.texi Sun Jan 02 09:13:19 2005 +0000 @@ -1532,28 +1532,43 @@ @kindex line-height @r{(text property)} A newline can have a @code{line-height} text or overlay property that controls the total height of the display line ending in that -newline. If the property value is zero, the displayed height of the -line is exactly what its contents need; no line-spacing is added. +newline. + + If the property value is a list @code{(@var{height} @var{total})}, +then @var{height} is used as the actual property value for the +@code{line-height}, and @var{total} specifies the total displayed +height of the line, so the line spacing added below the line equals +the @var{total} height minus the actual line height. In this case, +the other ways to specify the line spacing are ignored. + + If the property value is @code{t}, the displayed height of the +line is exactly what its contents demand; no line-spacing is added. This case is useful for tiling small images or image slices without adding blank areas between the images. - If the property value is not zero, it specifies a desired height, -@var{line-height}. There are several ways it can do this: + If the property value is not @code{t}, it is a height spec. A height +spec stands for a numeric height value; this heigh spec specifies the +actual line height, @var{line-height}. There are several ways to +write a height spec; here's how each of them translates into a numeric +height: @table @code @item @var{integer} -If the property is a positive integer, @var{line-height} is that integer. +If the height spec is a positive integer, the height value is that integer. @item @var{float} -If the property is a float, @var{float}, @var{line-height} is @var{float} -times the frame's default line height. -@item (@var{ratio} . @var{face}) -If the property is a cons of the format shown, @var{line-height} is -@var{ratio} times the height of face @var{face}. @var{ratio} can be -any type of number. If @var{face} is @code{t}, it refers to the -current face. +If the height spec is a float, @var{float}, the numeric height value +is @var{float} times the frame's default line height. +@item (@var{face} . @var{ratio}) +If the height spec is a cons of the format shown, the numeric height +is @var{ratio} times the height of face @var{face}. @var{ratio} can +be any type of number, or @code{nil} which means a ratio of 1. +If @var{face} is @code{t}, it refers to the current face. +@item (@code{nil} . @var{ratio}) +If the height spec is a cons of the format shown, the numeric height +is @var{ratio} times the height of the contents of the line. @end table - Thus, any valid nonzero property value specifies a height in pixels, + Thus, any valid non-@code{t} property value specifies a height in pixels, @var{line-height}, one way or another. If the line contents' height is less than @var{line-height}, Emacs adds extra vertical space above the line to achieve the total height @var{line-height}. Otherwise, @@ -1561,6 +1576,8 @@ If you don't specify the @code{line-height} propery, the line's height consists of the contents' height plus the line spacing. +There are several ways to specify the line spacing for different +parts of Emacs text. @vindex default-line-spacing You can specify the line spacing for all lines in a frame with the @@ -1584,24 +1601,11 @@ newline. The property value overrides the default frame line spacing and the buffer local @code{line-spacing} variable. - One way or another, these mechanisms specify a line spacing for each -line. Let's call the value @var{line-spacing}. - - If the @var{line-spacing} value is a positive integer, it specifies -the number of pixels of additional vertical space. This space appears -below the display line contents. - - If the @var{line-spacing} value is a floating point number or cons, -the additional vertical space is @var{line-spacing} times the frame -default line height. - -@ignore @c I think we may want to delete this, so don't document it -- rms. - If the @var{line-spacing} value is a cons @code{(total . @var{spacing})} -where @var{spacing} is any of the forms described above, the value of -@var{spacing} specifies the total displayed height of the line, -regardless of the height of the characters in it. This is equivalent -to using the @code{line-height} property. -@end ignore + One way or another, these mechanisms specify a Lisp value for the +spacing of each line. The value is a height spec, and it translates +into a Lisp value as described above. However, in this case the +numeric height value specifies the line spacing, rather than the line +height. @node Faces @section Faces diff -r fa0a5c4db2c8 -r 95879cc1ed20 lispref/elisp.texi --- a/lispref/elisp.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/lispref/elisp.texi Sun Jan 02 09:13:19 2005 +0000 @@ -420,9 +420,15 @@ Loading * How Programs Do Loading:: The @code{load} function and others. +* Library Search:: Finding a library to load. +* Loading Non-ASCII:: Non-@acronym{ASCII} characters in Emacs Lisp files. * Autoload:: Setting up a function to autoload. +* Repeated Loading:: Precautions about loading a file twice. * Named Features:: Loading a library if it isn't already loaded. -* Repeated Loading:: Precautions about loading a file twice. +* Where Defined:: Finding which file defined a certain symbol. +* Unloading:: How to ``unload'' a library that was loaded. +* Hooks for Loading:: Providing code to be run when + particular libraries are loaded. Byte Compilation diff -r fa0a5c4db2c8 -r 95879cc1ed20 lispref/loading.texi --- a/lispref/loading.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/lispref/loading.texi Sun Jan 02 09:13:19 2005 +0000 @@ -36,15 +36,16 @@ containing Lisp code. @menu -* How Programs Do Loading:: The @code{load} function and others. -* Library Search:: Finding a library to load. -* Loading Non-ASCII:: Non-@acronym{ASCII} characters in Emacs Lisp files. -* Autoload:: Setting up a function to autoload. -* Repeated Loading:: Precautions about loading a file twice. -* Named Features:: Loading a library if it isn't already loaded. -* Unloading:: How to ``unload'' a library that was loaded. -* Hooks for Loading:: Providing code to be run when - particular libraries are loaded. +* How Programs Do Loading:: The @code{load} function and others. +* Library Search:: Finding a library to load. +* Loading Non-ASCII:: Non-@acronym{ASCII} characters in Emacs Lisp files. +* Autoload:: Setting up a function to autoload. +* Repeated Loading:: Precautions about loading a file twice. +* Named Features:: Loading a library if it isn't already loaded. +* Where Defined:: Finding which file defined a certain symbol. +* Unloading:: How to ``unload'' a library that was loaded. +* Hooks for Loading:: Providing code to be run when + particular libraries are loaded. @end menu @node How Programs Do Loading @@ -714,6 +715,60 @@ @code{features} list is not significant. @end defvar +@node Where Defined +@section Which File Defined a Certain Symbol + +@defun symbol-file symbol &optional type +This function returns the name of the file that defined @var{symbol}. +If @var{type} is @code{nil}, then any kind of definition is +acceptable. If @var{type} is @code{defun} or @code{defvar}, that +specifies function definition only or variable definition only. + +The value is the file name as it was specified to @code{load}: +either an absolute file name, or a library name +(with no directory name and no @samp{.el} or @samp{.elc} at the end). +It can also be @code{nil}, if the definition is not associated with any file. +@end defun + + The basis for @code{symbol-file} is the data in the variable +@code{load-history}. + +@defvar load-history +This variable's value is an alist connecting library names with the +names of functions and variables they define, the features they provide, +and the features they require. + +Each element is a list and describes one library. The @sc{car} of the +list is the name of the library, as a string. The rest of the list +elements have these forms: + +@table @code +@item @var{var} +The symbol @var{var} was defined as a variable. +@item (defun . @var{fun}) +The @var{fun} was defined by this library. +@item (t . @var{fun}) +The function @var{fun} was previously an autoload before this library +redefined it as a function. The following element is always the +symbol @var{fun}, which signifies that the library defined @var{fun} +as a function. +@item (autoload . @var{fun}) +The function @var{fun} was defined as an autoload. +@item (require . @var{feature}) +The feature @var{feature} was required. +@item (provide . @var{feature}) +The feature @var{feature} was provided. +@end table + +The value of @code{load-history} may have one element whose @sc{car} is +@code{nil}. This element describes definitions made with +@code{eval-buffer} on a buffer that is not visiting a file. +@end defvar + + The command @code{eval-region} updates @code{load-history}, but does so +by adding the symbols defined to the element for the file being visited, +rather than replacing that element. @xref{Eval}. + @node Unloading @section Unloading @cindex unloading @@ -760,42 +815,6 @@ The @code{unload-feature} function is written in Lisp; its actions are based on the variable @code{load-history}. -@defvar load-history -This variable's value is an alist connecting library names with the -names of functions and variables they define, the features they provide, -and the features they require. - -Each element is a list and describes one library. The @sc{car} of the -list is the name of the library, as a string. The rest of the list -elements have these forms: - -@table @code -@item @var{fun} -The function @var{fun} was defined by this library. -@item (t . @var{fun}) -The function @var{fun} was previously an autoload before this library -redefined it as a function. The following element is always the -symbol @var{fun}, which signifies that the library defined @var{fun} -as a function. -@item (autoload . @var{fun}) -The function @var{fun} was defined as an autoload. -@item (defvar . @var{var}) -The symbol @var{var} was defined as a variable. -@item (require . @var{feature}) -The feature @var{feature} was required. -@item (provide . @var{feature}) -The feature @var{feature} was provided. -@end table - -The value of @code{load-history} may have one element whose @sc{car} is -@code{nil}. This element describes definitions made with -@code{eval-buffer} on a buffer that is not visiting a file. -@end defvar - - The command @code{eval-region} updates @code{load-history}, but does so -by adding the symbols defined to the element for the file being visited, -rather than replacing that element. @xref{Eval}. - @defvar unload-feature-special-hooks This variable holds a list of hooks to be scanned before unloading a library, to remove functions defined in the library. diff -r fa0a5c4db2c8 -r 95879cc1ed20 lispref/modes.texi --- a/lispref/modes.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/lispref/modes.texi Sun Jan 02 09:13:19 2005 +0000 @@ -1736,7 +1736,7 @@ the text that would appear in a mode line or header line based on certain mode-line specification. -@defun format-mode-line &optional format window no-props +@defun format-mode-line &optional format window no-props buffer This function formats a line of text according to @var{format} as if it were generating the mode line for @var{window}, but instead of displaying the text in the mode line or the header line, it returns @@ -1752,6 +1752,8 @@ The value string normally has text properties that correspond to the faces, keymaps, etc., that the mode line would have. If @var{no-props} is non-@code{nil}, the value has no text properties. +If @var{buffer} is non-@code{nil}, all the information used is taken +from @var{buffer}; by default,it comes from @var{window}'s buffer. @end defun @node Imenu diff -r fa0a5c4db2c8 -r 95879cc1ed20 lispref/os.texi --- a/lispref/os.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/lispref/os.texi Sun Jan 02 09:13:19 2005 +0000 @@ -1368,6 +1368,11 @@ timer to call a function that takes substantial time to run is likely to be annoying. + Timer functions should normally not alter the current buffer +contents, but it may be ok to alter some other buffer that exists for +special purposes. A general guideline is that if a buffer has undo +enabled, timers should not write in it. + @deffn Command run-at-time time repeat function &rest args This sets up a timer that calls the function @var{function} with arguments @var{args} at time @var{time}. If @var{repeat} is a number @@ -1481,6 +1486,11 @@ input. Then it becomes idle again, and all the idle timers that are set up to repeat will subsequently run another time, one by one. + It is legitimate for an idle timer to edit the current buffer. If +it does, it should explicitly call @code{undo-boundary} once at the +beginning and once just before exiting, since Emacs won't do that +automatically for an idle timer. + @defun cancel-timer timer Cancel the requested action for @var{timer}, which should be a value previously returned by @code{run-at-time} or @code{run-with-idle-timer}. diff -r fa0a5c4db2c8 -r 95879cc1ed20 lwlib/ChangeLog --- a/lwlib/ChangeLog Sat Dec 25 02:31:08 2004 +0000 +++ b/lwlib/ChangeLog Sun Jan 02 09:13:19 2005 +0000 @@ -1,3 +1,15 @@ +2004-12-27 Jan Dj,Ad(Brv + + * xlwmenu.c (xlwMenuActionsList): Install MenuGadgetEscape as an + action procedure for compatibility with Lesstif/Motif. + + * Makefile.in (mostlyclean): Don't remove *~ on clean. + +2004-12-26 Jan Dj,Ad(Brv + + * lwlib-Xaw.c: Put Escape in dialogOverride so dialogs only + pops down on Escape, not any keypress. + 2004-11-01 Jan Dj,Ad(Brv * xlwmenu.c (find_first_selectable, find_next_selectable) diff -r fa0a5c4db2c8 -r 95879cc1ed20 lwlib/Makefile.in --- a/lwlib/Makefile.in Sat Dec 25 02:31:08 2004 +0000 +++ b/lwlib/Makefile.in Sun Jan 02 09:13:19 2005 +0000 @@ -57,7 +57,7 @@ xlwmenu.o: xlwmenu.c xlwmenu.h lwlib.h xlwmenuP.h mostlyclean: - $(RM) *.o core errs ,* *~ *.a .emacs_* make.log MakeOut \#* + $(RM) *.o core errs ,* *.a .emacs_* make.log MakeOut \#* clean: mostlyclean distclean: clean diff -r fa0a5c4db2c8 -r 95879cc1ed20 lwlib/lwlib-Xaw.c --- a/lwlib/lwlib-Xaw.c Sat Dec 25 02:31:08 2004 +0000 +++ b/lwlib/lwlib-Xaw.c Sun Jan 02 09:13:19 2005 +0000 @@ -279,7 +279,7 @@ "WM_PROTOCOLS: lwlib_delete_dialog()"; /* Dialogs pop down on any key press */ static char dialogOverride[] = - ": lwlib_delete_dialog()"; + "Escape: lwlib_delete_dialog()"; static void wm_delete_window(); static XtActionsRec xaw_actions [] = { {"lwlib_delete_dialog", wm_delete_window} diff -r fa0a5c4db2c8 -r 95879cc1ed20 lwlib/xlwmenu.c --- a/lwlib/xlwmenu.c Sat Dec 25 02:31:08 2004 +0000 +++ b/lwlib/xlwmenu.c Sun Jan 02 09:13:19 2005 +0000 @@ -211,6 +211,7 @@ {"right", Right}, {"select", Select}, {"key", Key}, + {"MenuGadgetEscape", Key}, /* Compatibility with Lesstif/Motif. */ {"nothing", Nothing}, }; diff -r fa0a5c4db2c8 -r 95879cc1ed20 mac/ChangeLog --- a/mac/ChangeLog Sat Dec 25 02:31:08 2004 +0000 +++ b/mac/ChangeLog Sun Jan 02 09:13:19 2005 +0000 @@ -1,3 +1,24 @@ +2004-12-24 YAMAMOTO Mitsuharu + + * makefile.MPW: Add dependencies for fringe.c.x, image.c.x, and + lastfile.c.x. + (PPCCOptions): Add -alloca. + (EmacsObjects): Remove alloca.c.x. Add fringe.c.x, image.c.x, and + lastfile.c.x. + (Emacs MPW): Add QuickTimeLib. + (EmacsSource): Remove alloca.c. Add fringe.c, image.c, and + lastfile.c. + (LispSource): Fix pathnames for byte-run.elc, float-sup.elc, and + map-ynp.elc. + * inc/config.h (USE_LSB_TAG) [__MRC__]: Define. + (UNEXEC_SRC): Close comment. + * inc/epaths.h (PATH_BITMAPS, PATH_GAME): New defines. + * inc/m-mac.h (HAVE_ALLOCA) [__MRC__]: Define. + (C_ALLOCA) [__MRC__]: Don't define. + * inc/s-mac.h (X_OK): New define. + (DECL_ALIGN) [USE_LSB_TAG && __MRC__]: New macro. + (GC_MARK_STACK): Define to GC_MAKE_GCPROS_NOOPS. + 2004-05-29 Steven Tamm * INSTALL: Fixing typos diff -r fa0a5c4db2c8 -r 95879cc1ed20 mac/inc/config.h --- a/mac/inc/config.h Sat Dec 25 02:31:08 2004 +0000 +++ b/mac/inc/config.h Sun Jan 02 09:13:19 2005 +0000 @@ -261,7 +261,7 @@ /* #undef CRAY_STACKSEG_END */ -/* #undef UNEXEC_SRC unexelf.c +/* #undef UNEXEC_SRC */ /* #undef HAVE_LIBXBSD */ /* #undef HAVE_XRMSETDATABASE */ @@ -367,6 +367,13 @@ /* #undef _XOPEN_SOURCE */ #ifdef __MRC__ +/* Use low-bits for tags. If ENABLE_CHECKING is turned on together + with USE_LSB_TAG, optimization flags should be explicitly turned + off. */ +#define USE_LSB_TAG +#endif + +#ifdef __MRC__ #define EMACS_CONFIGURATION "macos-mpw" #else /* Assume CodeWarrior */ #define EMACS_CONFIGURATION "macos-cw" diff -r fa0a5c4db2c8 -r 95879cc1ed20 mac/inc/epaths.h --- a/mac/inc/epaths.h Sat Dec 25 02:31:08 2004 +0000 +++ b/mac/inc/epaths.h Sun Jan 02 09:13:19 2005 +0000 @@ -46,7 +46,7 @@ /* Where Emacs should look for X bitmap files. The lisp variable x-bitmap-file-path is set based on this value. */ -/* #define PATH_BITMAPS "/usr/include/X11/bitmaps" */ +#define PATH_BITMAPS "" /* Where Emacs should look for its docstring file. The lisp variable doc-directory is set to this value. */ @@ -57,6 +57,9 @@ macro, and is then used to set the Info-default-directory-list. */ #define PATH_INFO "~emacs/info" +/* Where Emacs should store game score files. */ +#define PATH_GAME "~emacs/games" + /* Where Emacs should look for the application default file. */ /* #define PATH_X_DEFAULTS "/usr/lib/X11/%L/%T/%N%C%S:/usr/lib/X11/%l/%T/%N%C%S:/usr/lib/X11/%T/%N%C%S:/usr/lib/X11/%L/%T/%N%S:/usr/lib/X11/%l/%T/%N%S:/usr/lib/X11/%T/%N%S" */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 mac/inc/m-mac.h --- a/mac/inc/m-mac.h Sat Dec 25 02:31:08 2004 +0000 +++ b/mac/inc/m-mac.h Sun Jan 02 09:13:19 2005 +0000 @@ -87,8 +87,11 @@ Define neither one if an assembler-language alloca in the file alloca.s should be used. */ +#ifdef __MRC__ +#define HAVE_ALLOCA +#else #define C_ALLOCA -/* #define HAVE_ALLOCA */ +#endif /* Define NO_REMAP if memory segmentation makes it not work well to change the boundary between the text section and data section diff -r fa0a5c4db2c8 -r 95879cc1ed20 mac/inc/s-mac.h --- a/mac/inc/s-mac.h Sat Dec 25 02:31:08 2004 +0000 +++ b/mac/inc/s-mac.h Sun Jan 02 09:13:19 2005 +0000 @@ -255,6 +255,10 @@ #include #endif +#ifndef X_OK +#define X_OK 01 +#endif + #undef unlink #define unlink sys_unlink #undef read @@ -319,5 +323,15 @@ #define SYMS_SYSTEM syms_of_mac() +#ifdef USE_LSB_TAG +#ifdef __MRC__ +#define DECL_ALIGN(type, var) type var +#endif +#endif + +/* Use the GC_MAKE_GCPROS_NOOPS (see lisp.h) method for marking the + stack. */ +#define GC_MARK_STACK GC_MAKE_GCPROS_NOOPS + /* arch-tag: 6a941c4b-a419-4d25-80ac-9335053e58b2 (do not change this comment) */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 mac/makefile.MPW --- a/mac/makefile.MPW Sat Dec 25 02:31:08 2004 +0000 +++ b/mac/makefile.MPW Sun Jan 02 09:13:19 2005 +0000 @@ -44,7 +44,7 @@ # The -noMapCR options and the two -d's must not be removed. -PPCCOptions = {SymOption} {OptOption} -noMapCR -enum int ¶ +PPCCOptions = {SymOption} {OptOption} -noMapCR -enum int -alloca ¶ -typecheck relaxed -w off ¶ -includes unix -i {Includes},{Src} ¶ -d emacs=1 -d HAVE_CONFIG_H -d MAC_OS -d MAC_OS8 @@ -63,7 +63,6 @@ EmacsObjects = ¶ "{Src}abbrev.c.x" ¶ "{Src}alloc.c.x" ¶ - "{Src}alloca.c.x" ¶ "{Src}atimer.c.x" ¶ "{Src}buffer.c.x" ¶ "{Src}bytecode.c.x" ¶ @@ -92,7 +91,9 @@ "{Src}fns.c.x" ¶ "{Src}fontset.c.x" ¶ "{Src}frame.c.x" ¶ + "{Src}fringe.c.x" ¶ "{Src}getloadavg.c.x" ¶ + "{Src}image.c.x" ¶ "{Src}indent.c.x" ¶ "{Src}insdel.c.x" ¶ "{Src}intervals.c.x" ¶ @@ -120,7 +121,8 @@ "{Src}undo.c.x" ¶ "{Src}window.c.x" ¶ "{Src}xdisp.c.x" ¶ - "{Src}xfaces.c.x" + "{Src}xfaces.c.x" ¶ + "{Src}lastfile.c.x" # The list of object files generated from new source files of the Macintosh port. @@ -142,6 +144,7 @@ "{SharedLibraries}AppleScriptLib" ¶ "{SharedLibraries}TextEncodingConverter" ¶ "{SharedLibraries}AppearanceLib" ¶ + "{SharedLibraries}QuickTimeLib" ¶ "{PPCLibraries}StdCRuntime.o" ¶ "{PPCLibraries}PPCCRuntime.o" ¶ "{PPCLibraries}PPCToolLibs.o" ¶ @@ -495,10 +498,33 @@ "{Src}commands.h" ¶ "{Src}keyboard.h" +{Src}fringe.c.x Ä ¶ + {CONFIG_H_GROUP} ¶ + "{Src}lisp.h" ¶ + "{Src}frame.h" ¶ + {WINDOW_H_GROUP} ¶ + "{Src}buffer.h" ¶ + {BLOCKINPUT_H_GROUP} + {Src}getloadavg.c.x Ä ¶ {CONFIG_H_GROUP} ¶ "{Includes}sys:types.h" +{Src}image.c.x Ä ¶ + {CONFIG_H_GROUP} ¶ + "{Src}lisp.h" ¶ + "{Src}frame.h" ¶ + {WINDOW_H_GROUP} ¶ + {DISPEXTERN_H_GROUP} ¶ + {BLOCKINPUT_H_GROUP} ¶ + "{Includes}epaths.h" ¶ + "{Src}macterm.h" ¶ + "{Src}macgui.h" ¶ + "{Src}frame.h" ¶ + "{Includes}sys:stat.h" ¶ + "{Includes}alloca.h" ¶ + "{Includes}sys:param.h" + {Src}indent.c.x Ä ¶ {CONFIG_H_GROUP} ¶ "{Src}lisp.h" ¶ @@ -574,6 +600,9 @@ "{Src}puresize.h" ¶ {INTERVALS_H_GROUP} +{Src}lastfile.c.x Ä ¶ + {CONFIG_H_GROUP} + {Src}lread.c.x Ä ¶ {CONFIG_H_GROUP} ¶ "{Includes}sys:types.h" ¶ @@ -935,7 +964,6 @@ EmacsSource = ¶ "{Src}abbrev.c" ¶ "{Src}alloc.c" ¶ - "{Src}alloca.c" ¶ "{Src}atimer.c" ¶ "{Src}buffer.c" ¶ "{Src}bytecode.c" ¶ @@ -964,12 +992,15 @@ "{Src}fns.c" ¶ "{Src}fontset.c" ¶ "{Src}frame.c" ¶ + "{Src}fringe.c" ¶ "{Src}getloadavg.c" ¶ + "{Src}image.c" ¶ "{Src}indent.c" ¶ "{Src}insdel.c" ¶ "{Src}intervals.c" ¶ "{Src}keyboard.c" ¶ "{Src}keymap.c" ¶ + "{Src}lastfile.c" ¶ "{Src}lread.c" ¶ "{Src}macros.c" ¶ "{Src}marker.c" ¶ @@ -1017,7 +1048,7 @@ {Lisp}international:codepage.elc ¶ {Lisp}abbrev.elc ¶ {Lisp}buff-menu.elc ¶ - {Lisp}byte-run.elc ¶ + {Lisp}emacs-lisp:byte-run.elc ¶ {Lisp}cus-start.el ¶ {Lisp}custom.elc ¶ {Lisp}emacs-lisp:lisp-mode.elc ¶ @@ -1025,7 +1056,7 @@ {Lisp}facemenu.elc ¶ {Lisp}faces.elc ¶ {Lisp}files.elc ¶ - {Lisp}float-sup.elc ¶ + {Lisp}emacs-lisp:float-sup.elc ¶ {Lisp}format.elc ¶ {Lisp}frame.elc ¶ {Lisp}help.elc ¶ @@ -1034,7 +1065,7 @@ {Lisp}loadup.el ¶ {Lisp}loaddefs.el ¶ {Lisp}bindings.elc ¶ - {Lisp}map-ynp.elc ¶ + {Lisp}emacs-lisp:map-ynp.elc ¶ {Lisp}international:mule.elc ¶ {Lisp}international:mule-conf.el ¶ {Lisp}international:mule-cmds.elc ¶ diff -r fa0a5c4db2c8 -r 95879cc1ed20 man/ChangeLog --- a/man/ChangeLog Sat Dec 25 02:31:08 2004 +0000 +++ b/man/ChangeLog Sun Jan 02 09:13:19 2005 +0000 @@ -1,6 +1,39 @@ +2004-12-31 Richard M. Stallman + + * dired.texi (Shell Commands in Dired): Delete the ? example. + + * display.texi (Scrolling): Correct scroll-preserve-screen-position. + + * files.texi (Saving): Describe new require-final-newline features + and mode-require-final-newline. + +2004-12-31 Jay Belanger + + * calc.texi: Mention C-cC-c as the way to finish editing throughout. + +2004-12-29 Richard M. Stallman + + * custom.texi (File Variables): Clarify previous change. + +2004-12-27 Jan Dj,Ad(Brv + + * frames.texi (Dialog Boxes): Mention Gtk+ 2.6 also, as that version is + out now. + +2004-12-27 Richard M. Stallman + + * Makefile.in (MAKEINFO): Specify --force. + + * basic.texi (Moving Point): C-e now runs move-end-of-line. + (Undo): Doc undo-outer-limit. + +2004-12-11 Richard M. Stallman + + * Makefile.in (MAKEINFO): Add --force. + 2004-12-20 Jay Belanger - * calc.texi (Types Tutorial): Emphasized that you can't divide by + * calc.texi (Types Tutorial): Emphasize that you can't divide by zero. 2004-12-17 Luc Teirlinck @@ -23,6 +56,7 @@ the standard "The GNU Emacs Manual" in fifth argument of @xref's. (Dealing with HTTP documents): @inforef->@xref. +>>>>>>> 1.412 2004-12-15 Juri Linkov * mark.texi (Transient Mark, Mark Ring): M-< and other @@ -39,6 +73,7 @@ * calc.texi: Fix some TeX definitions. +>>>>>>> 1.407 2004-12-12 Juri Linkov * misc.texi (FFAP): Add C-x C-r, C-x C-v, C-x C-d, @@ -52,6 +87,7 @@ * mark.texi (Marking Objects): Marking commands also extend the region when mark is active in Transient Mark mode. +>>>>>>> 1.403 2004-12-09 Luc Teirlinck * reftex.texi (Imprint): Remove erroneous @value's. diff -r fa0a5c4db2c8 -r 95879cc1ed20 man/Makefile.in --- a/man/Makefile.in Sat Dec 25 02:31:08 2004 +0000 +++ b/man/Makefile.in Sun Jan 02 09:13:19 2005 +0000 @@ -31,7 +31,8 @@ # The makeinfo program is part of the Texinfo distribution. -MAKEINFO = makeinfo +# Use --force so that it generates output even if there are errors. +MAKEINFO = makeinfo --force INFO_TARGETS = ../info/emacs ../info/emacs-xtra ../info/ccmode ../info/cl \ ../info/dired-x ../info/ediff ../info/forms ../info/gnus \ ../info/message ../info/sieve ../info/pgg ../info/emacs-mime \ diff -r fa0a5c4db2c8 -r 95879cc1ed20 man/basic.texi --- a/man/basic.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/man/basic.texi Sun Jan 02 09:13:19 2005 +0000 @@ -171,7 +171,7 @@ @kindex UP @kindex DOWN @findex beginning-of-line -@findex end-of-line +@findex move-end-of-line @findex forward-char @findex backward-char @findex next-line @@ -185,7 +185,7 @@ @item C-a Move to the beginning of the line (@code{beginning-of-line}). @item C-e -Move to the end of the line (@code{end-of-line}). +Move to the end of the line (@code{move-end-of-line}). @item C-f Move forward one character (@code{forward-char}). The right-arrow key does the same thing. @@ -380,24 +380,32 @@ @vindex undo-limit @vindex undo-strong-limit +@vindex undo-outer-limit @cindex undo limit When the undo information for a buffer becomes too large, Emacs discards the oldest undo information from time to time (during garbage collection). You can specify how much undo information to keep by -setting two variables: @code{undo-limit} and @code{undo-strong-limit}. -Their values are expressed in units of bytes of space. +setting three variables: @code{undo-limit}, @code{undo-strong-limit}, +and @code{undo-outer-limit}. Their values are expressed in units of +bytes of space. The variable @code{undo-limit} sets a soft limit: Emacs keeps undo -data for enough commands to reach this size, and perhaps exceed it, but -does not keep data for any earlier commands beyond that. Its default -value is 20000. The variable @code{undo-strong-limit} sets a stricter -limit: the command which pushes the size past this amount is itself -forgotten. Its default value is 30000. +data for enough commands to reach this size, and perhaps exceed it, +but does not keep data for any earlier commands beyond that. Its +default value is 20000. The variable @code{undo-strong-limit} sets a +stricter limit: a previous command (not the most recent one) which +pushes the size past this amount is itself forgotten. The default +value of @code{undo-strong-limit} is 30000. - Regardless of the values of those variables, the most recent change is -never discarded, so there is no danger that garbage collection occurring -right after an unintentional large change might prevent you from undoing -it. + Regardless of the values of those variables, the most recent change +is never discarded unless it gets bigger than @code{undo-outer-limit} +(normally 300,000). At that point, Emacs asks whether to discard the +undo information even for the current command. (You also have the +option of quitting.) So there is normally no danger that garbage +collection occurring right after an unintentional large change might +prevent you from undoing it. But if you didn't expect the command +to create such large undo data, you can get rid of it and prevent +Emacs from running out of memory. The reason the @code{undo} command has two keys, @kbd{C-x u} and @kbd{C-_}, set up to run it is that it is worthy of a single-character diff -r fa0a5c4db2c8 -r 95879cc1ed20 man/calc.texi --- a/man/calc.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/man/calc.texi Sun Jan 02 09:13:19 2005 +0000 @@ -2666,7 +2666,7 @@ scrolling to see them all. Press @kbd{<} and @kbd{>} to scroll the stack window left and right by half its width. Another way to view something large is to press @kbd{`} (back-quote) to edit the top of -stack in a separate window. (Press @kbd{M-# M-#} when you are done.) +stack in a separate window. (Press @kbd{C-c C-c} when you are done.) You can enter non-decimal numbers using the @kbd{#} symbol, too. Let's see what the hexadecimal number @samp{5FE} looks like in @@ -5588,8 +5588,8 @@ @end smallexample To edit a variable, type @kbd{s e} and the variable name, use regular -Emacs editing commands as necessary, then type @kbd{M-# M-#} or -@kbd{C-c C-c} to store the edited value back into the variable. +Emacs editing commands as necessary, then type @kbd{C-c C-c} to store +the edited value back into the variable. You can also use @w{@kbd{s e}} to create a new variable if you wish. Notice that the first time you use each rule, Calc puts up a ``compiling'' @@ -6381,7 +6381,7 @@ @end smallexample @noindent -Press @kbd{M-# M-#} to finish editing and return to the Calculator. +Press @kbd{C-c C-c} to finish editing and return to the Calculator. @smallexample @group @@ -11712,26 +11712,26 @@ variable is really just an Emacs Lisp variable that contains a Calc number or formula.) A variable's name is normally composed of letters and digits. Calc also allows apostrophes and @code{#} signs in variable names. -The Calc variable @code{foo} corresponds to the Emacs Lisp variable -@code{var-foo}. Commands like @kbd{s s} (@code{calc-store}) that operate -on variables can be made to use any arbitrary Lisp variable simply by -backspacing over the @samp{var-} prefix in the minibuffer. +(The Calc variable @code{foo} corresponds to the Emacs Lisp variable +@code{var-foo}, but unless you access the variable from within Emacs +Lisp, you don't need to worry about it. Variable names in algebraic +formulas implicitly have @samp{var-} prefixed to their names. The +@samp{#} character in variable names used in algebraic formulas +corresponds to a dash @samp{-} in the Lisp variable name. If the name +contains any dashes, the prefix @samp{var-} is @emph{not} automatically +added. Thus the two formulas @samp{foo + 1} and @samp{var#foo + 1} both +refer to the same variable.) In a command that takes a variable name, you can either type the full name of a variable, or type a single digit to use one of the special -convenience variables @code{var-q0} through @code{var-q9}. For example, -@kbd{3 s s 2} stores the number 3 in variable @code{var-q2}, and +convenience variables @code{q0} through @code{q9}. For example, +@kbd{3 s s 2} stores the number 3 in variable @code{q2}, and @w{@kbd{3 s s foo @key{RET}}} stores that number in variable -@code{var-foo}. +@code{foo}. To push a variable itself (as opposed to the variable's value) on the stack, enter its name as an algebraic expression using the apostrophe -(@key{'}) key. Variable names in algebraic formulas implicitly have -@samp{var-} prefixed to their names. The @samp{#} character in variable -names used in algebraic formulas corresponds to a dash @samp{-} in the -Lisp variable name. If the name contains any dashes, the prefix @samp{var-} -is @emph{not} automatically added. Thus the two formulas @samp{foo + 1} -and @samp{var#foo + 1} both refer to the same variable. +(@key{'}) key. @kindex = @pindex calc-evaluate @@ -11884,10 +11884,10 @@ need to write @samp{(5%)-2} to get the former interpretation. @cindex Function call notation -A function call is, e.g., @samp{sin(1+x)}. Function names follow the same -rules as variable names except that the default prefix @samp{calcFunc-} is -used (instead of @samp{var-}) for the internal Lisp form. -Most mathematical Calculator commands like +A function call is, e.g., @samp{sin(1+x)}. (The Calc algebraic function +@code{foo} corresponds to the Emacs Lisp function @code{calcFunc-foo}, +but unless you access the function from within Emacs Lisp, you don't +need to worry about it.) Most mathematical Calculator commands like @code{calc-sin} have function equivalents like @code{sin}. If no Lisp function is defined for a function called by a formula, the call is left as it is during algebraic manipulation: @samp{f(x+y)} is @@ -12059,13 +12059,11 @@ specified number of stack entries at once. (An argument of zero edits the entire stack; a negative argument edits one specific stack entry.) -When you are done editing, press @kbd{M-# M-#} to finish and return +When you are done editing, press @kbd{C-c C-c} to finish and return to Calc. The @key{RET} and @key{LFD} keys also work to finish most sorts of editing, though in some cases Calc leaves @key{RET} with its usual meaning (``insert a newline'') if it's a situation where you -might want to insert new lines into the editing buffer. The traditional -Emacs ``finish'' key sequence, @kbd{C-c C-c}, also works to finish -editing and may be easier to type, depending on your keyboard. +might want to insert new lines into the editing buffer. When you finish editing, the Calculator parses the lines of text in the @samp{*Calc Edit*} buffer as numbers or formulas, replaces the @@ -12073,18 +12071,18 @@ then kills the @samp{*Calc Edit*} buffer. The original Calculator buffer continues to exist during editing, but for best results you should be careful not to change it until you have finished the edit. You can -also cancel the edit by pressing @kbd{M-# x}. +also cancel the edit by killing the buffer with @kbd{C-x k}. The formula is normally reevaluated as it is put onto the stack. For example, editing @samp{a + 2} to @samp{3 + 2} and pressing -@kbd{M-# M-#} will push 5 on the stack. If you use @key{LFD} to +@kbd{C-c C-c} will push 5 on the stack. If you use @key{LFD} to finish, Calc will put the result on the stack without evaluating it. -If you give a prefix argument to @kbd{M-# M-#} (or @kbd{C-c C-c}), +If you give a prefix argument to @kbd{C-c C-c}, Calc will not kill the @samp{*Calc Edit*} buffer. You can switch back to that buffer and continue editing if you wish. However, you should understand that if you initiated the edit with @kbd{`}, the -@kbd{M-# M-#} operation will be programmed to replace the top of the +@kbd{C-c C-c} operation will be programmed to replace the top of the stack with the new edited value, and it will do this even if you have rearranged the stack in the meanwhile. This is not so much of a problem with other editing commands, though, such as @kbd{s e} @@ -14139,7 +14137,7 @@ turn into the @code{assign} function, which Calc normally displays using the @samp{:=} symbol. -The variables @code{var-pi} and @code{var-e} would be displayed @samp{pi} +The variables @code{pi} and @code{e} would be displayed @samp{pi} and @samp{e} in Normal mode, but in C mode they are displayed as @samp{M_PI} and @samp{M_E}, corresponding to the names of constants typically provided in the @file{} header. Functions whose @@ -15264,8 +15262,8 @@ The @kbd{Z S} (@code{calc-edit-user-syntax}) command edits the syntax table for the current language mode. If you want your syntax to work in any language, define it in the Normal language -mode. Type @kbd{M-# M-#} to finish editing the syntax table, or -@kbd{M-# x} to cancel the edit. The @kbd{m m} command saves all +mode. Type @kbd{C-c C-c} to finish editing the syntax table, or +@kbd{C-x k} to cancel the edit. The @kbd{m m} command saves all the syntax tables along with the other mode settings; @pxref{General Mode Commands}. @@ -17220,7 +17218,9 @@ If your system does not have a suitable @samp{date} command, you may wish to put a @samp{(setq var-TimeZone ...)} in your Emacs -initialization file to set the time zone. The easiest way to do +initialization file to set the time zone. (Since you are interacting +with the variable @code{TimeZone} directly from Emacs Lisp, the +@code{var-} prefix needs to be present.) The easiest way to do this is to edit the @code{TimeZone} variable using Calc's @kbd{s T} command, then use the @kbd{s p} (@code{calc-permanent-variable}) command to save the value of @code{TimeZone} permanently. @@ -21807,7 +21807,7 @@ @xref{Selections with Rewrite Rules}. The rules are stored in the Calc variable @code{DistribRules}. A convenient way to view these rules is to use @kbd{s e} (@code{calc-edit-variable}) which -displays and edits the stored value of a variable. Press @kbd{M-# M-#} +displays and edits the stored value of a variable. Press @kbd{C-c C-c} to return from editing mode; be careful not to make any actual changes or else you will affect the behavior of future @kbd{j D} commands! @@ -23583,7 +23583,7 @@ command to substitute actual values for function calls like @samp{as(3)}. The @kbd{s G} (@code{calc-edit-GenCount}) command is a convenient -way to create or edit this variable. Press @kbd{M-# M-#} to finish. +way to create or edit this variable. Press @kbd{C-c C-c} to finish. If you have not stored a value in @code{GenCount}, or if the value in that variable is not a positive integer, the regular @@ -27847,14 +27847,8 @@ The @kbd{s s} (@code{calc-store}) command stores the value at the top of the stack into a specified variable. It prompts you to enter the name of the variable. If you press a single digit, the value is stored -immediately in one of the ``quick'' variables @code{var-q0} through -@code{var-q9}. Or you can enter any variable name. The prefix @samp{var-} -is supplied for you; when a name appears in a formula (as in @samp{a+q2}) -the prefix @samp{var-} is also supplied there, so normally you can simply -forget about @samp{var-} everywhere. Its only purpose is to enable you to -use Calc variables without fear of accidentally clobbering some variable in -another Emacs package. If you really want to store in an arbitrary Lisp -variable, just backspace over the @samp{var-}. +immediately in one of the ``quick'' variables @code{q0} through +@code{q9}. Or you can enter any variable name. @kindex s t @pindex calc-store-into @@ -28038,10 +28032,10 @@ special variables @code{inf}, @code{uinf}, and @code{nan} (which are normally void). -Note that @code{var-pi} doesn't actually have 3.14159265359 stored +Note that @code{pi} doesn't actually have 3.14159265359 stored in it, but rather a special magic value that evaluates to @cpi{} -at the current precision. Likewise @code{var-e}, @code{var-i}, and -@code{var-phi} evaluate according to the current precision or polar mode. +at the current precision. Likewise @code{e}, @code{i}, and +@code{phi} evaluate according to the current precision or polar mode. If you recall a value from @code{pi} and store it back, this magic property will be lost. @@ -28052,9 +28046,9 @@ followed by an @kbd{s t} in two important ways. First, the value never goes on the stack and thus is never rounded, evaluated, or simplified in any way; it is not even rounded down to the current precision. -Second, the ``magic'' contents of a variable like @code{var-e} can +Second, the ``magic'' contents of a variable like @code{e} can be copied into another variable with this command, perhaps because -you need to unstore @code{var-e} right now but you wish to put it +you need to unstore @code{e} right now but you wish to put it back when you're done. The @kbd{s c} command is the only way to manipulate these magic values intact. @@ -28093,7 +28087,7 @@ or simplifying or evaluating the value. It prompts for the name of the variable to edit. If the variable has no stored value, the editing buffer will start out empty. If the editing buffer is -empty when you press @kbd{M-# M-#} to finish, the variable will +empty when you press @kbd{C-c C-c} to finish, the variable will be made void. @xref{Editing Stack Entries}, for a general description of editing. @@ -28216,7 +28210,7 @@ use a different file instead of @file{.emacs}.) If you do not specify the name of a variable to save (i.e., -@kbd{s p @key{RET}}), all @samp{var-} variables with defined values +@kbd{s p @key{RET}}), all Calc variables with defined values are saved except for the special constants @code{pi}, @code{e}, @code{i}, @code{phi}, and @code{gamma}; the variables @code{TimeZone} and @code{PlotRejects}; @@ -28228,8 +28222,9 @@ @kindex s i @pindex calc-insert-variables The @kbd{s i} (@code{calc-insert-variables}) command writes -the values of all @samp{var-} variables into a specified buffer. -The variables are written in the form of Lisp @code{setq} commands +the values of all Calc variables into a specified buffer. +The variables are written with the prefix @code{var-} in the form of +Lisp @code{setq} commands which store the values in string form. You can place these commands in your @file{.emacs} buffer if you wish, though in this case it would be easier to use @kbd{s p @key{RET}}. (Note that @kbd{s i} @@ -28939,7 +28934,7 @@ @texline @math{80\times24} @infoline 80x24 characters. The graph is displayed in -an Emacs ``recursive edit''; type @kbd{q} or @kbd{M-# M-#} to exit +an Emacs ``recursive edit''; type @kbd{q} or @kbd{C-c C-c} to exit the recursive edit and return to Calc. Note that the @code{dumb} device is present only in GNUPLOT 3.0 and later versions. @@ -30119,7 +30114,7 @@ The @kbd{M-# `} (@code{calc-embedded-edit}) command edits the embedded formula at the current point as if by @kbd{`} (@code{calc-edit}). Embedded mode does not have to be enabled for this to work. Press -@kbd{M-# M-#} to finish the edit, or @kbd{M-# x} to cancel. +@kbd{C-c C-c} to finish the edit, or @kbd{C-x k} to cancel. @node Assignments in Embedded Mode, Mode Settings in Embedded Mode, More About Embedded Mode, Embedded Mode @section Assignments in Embedded Mode @@ -30743,15 +30738,14 @@ key could invoke a command, which in turn calls an algebraic function, which might have one or more special display formats. A single @kbd{Z P} command will save all of these definitions. - -To save a command or function without its key binding (or if there is -no key binding for the command or function), type @kbd{'} (the apostrophe) -when prompted for a key. Then, type the function name, or backspace -to change the @samp{calcFunc-} prefix to @samp{calc-} and enter a -command name. (If the command you give implies a function, the function -will be saved, and if the function has any display formats, those will -be saved, but not the other way around: Saving a function will not save -any commands or key bindings associated with the function.) +To save an algebraic function, type @kbd{'} (the apostrophe) +when prompted for a key, and type the function name. To save a command +without its key binding, type @kbd{M-x} and enter a function name. (The +@samp{calc-} prefix will automatically be inserted for you.) +(If the command you give implies a function, the function will be saved, +and if the function has any display formats, those will be saved, but +not the other way around: Saving a function will not save any commands +or key bindings associated with the function.) @kindex Z E @pindex calc-user-define-edit @@ -30837,14 +30831,14 @@ command to edit the macro. This command may be found in the @file{macedit} package, a copy of which comes with Calc. It decomposes the macro definition into full Emacs command names, like @code{calc-pop} -and @code{calc-add}. Type @kbd{M-# M-#} to finish editing and update -the definition stored on the key, or, to cancel the edit, type -@kbd{M-# x}. +and @code{calc-add}. Type @kbd{C-c C-c} to finish editing and update +the definition stored on the key, or, to cancel the edit, kill the +buffer with @kbd{C-x k}. If you give a negative numeric prefix argument to @kbd{Z E}, the keyboard macro is edited in spelled-out keystroke form. For example, the editing buffer might contain the nine characters @w{@samp{1 @key{RET} 2 +}}. When you press -@kbd{M-# M-#}, the @code{read-kbd-macro} feature of the @file{macedit} +@kbd{C-c C-c}, the @code{read-kbd-macro} feature of the @file{macedit} package is used to reinterpret these key names. The notations @code{RET}, @code{LFD}, @code{TAB}, @code{SPC}, @code{DEL}, and @code{NUL} must be written in all uppercase, as must the prefixes @code{C-} @@ -31191,9 +31185,11 @@ @kbd{Z F @key{RET} spam @key{RET}} defines the new command as @kbd{M-x calc-spam}, with no keyboard equivalent. -The third prompt is for a function name. The default is to use the same -name as the command name but with @samp{calcFunc-} in place of -@samp{calc-}. This is the name you will use if you want to enter your +The third prompt is for an algebraic function name. The default is to +use the same name as the command name but without the @samp{calc-} +prefix. (If this is of the form @samp{User-m}, the hyphen is removed so +it won't be taken for a minus sign in algebraic formulas.) +This is the name you will use if you want to enter your new function in an algebraic formula. Suppose we enter @kbd{yow @key{RET}}. Then the new function can be invoked by pushing two numbers on the stack and typing @kbd{z m} or @kbd{x spam}, or by entering the algebraic @@ -31252,8 +31248,9 @@ The @kbd{Z E} (@code{calc-user-define-edit}) command on a key that has been defined by a formula uses a variant of the @code{calc-edit} command -to edit the defining formula. Press @kbd{M-# M-#} to finish editing and -store the new formula back in the definition, or @kbd{M-# x} to +to edit the defining formula. Press @kbd{C-c C-c} to finish editing and +store the new formula back in the definition, or kill the buffer with +@kbd{C-x k} to cancel the edit. (The argument list and other properties of the definition are unchanged; to adjust the argument list, you can use @kbd{Z G} to grab the function onto the stack, edit with @kbd{`}, and @@ -35727,9 +35724,9 @@ @c 30 @item -Editing occurs in a separate buffer. Press @kbd{M-# M-#} (or @kbd{C-c C-c}, -@key{LFD}, or in some cases @key{RET}) to finish the edit, or press -@kbd{M-# x} to cancel the edit. The @key{LFD} key prevents evaluation +Editing occurs in a separate buffer. Press @kbd{C-c C-c} (or +@key{LFD}, or in some cases @key{RET}) to finish the edit, or kill the +buffer with @kbd{C-x k} to cancel the edit. The @key{LFD} key prevents evaluation of the result of the edit. @c 31 diff -r fa0a5c4db2c8 -r 95879cc1ed20 man/custom.texi --- a/man/custom.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/man/custom.texi Sun Jan 02 09:13:19 2005 +0000 @@ -1042,22 +1042,26 @@ @end example Some ``variable names'' have special meanings in a local variables -list: a value for the variable @code{mode} really sets the major mode, -and a value for the variable @code{eval} is simply evaluated as an -expression and the value is ignored. @code{coding}, @code{unibyte}, -@code{mode} and @code{eval} are not real variables; setting variables -named @code{coding}, @code{unibyte}, @code{mode} and @code{eval} in any -other context has no special meaning. @emph{If @code{mode} is used to -set a major mode, it should be the first ``variable'' in the list.} -Otherwise, the entries that precede it in the list of the local -variables are likely to be ignored, since most modes kill all local -variables as part of their initialization. +list. Specifying the ``variable'' @code{mode} really sets the major +mode, while any value specified for the ``variable'' @code{eval} is +simply evaluated as an expression (its value is ignored). A value for +@code{coding} specifies the coding system for character code +conversion of this file, and a value of @code{t} for @code{unibyte} +says to visit the file in a unibyte buffer. These four ``variables'' +are not really variables; setting them in any other context has no +special meaning. - You can use the @code{mode} ``variable'' to set minor modes as well as -major modes; in fact, you can use it more than once, first to set the -major mode and then to set minor modes which are specific to particular -buffers. But most minor modes should not be specified in the file in -any fashion, because they represent user preferences. + @emph{If @code{mode} is used to set a major mode, it should be the +first ``variable'' in the list.} Otherwise, the entries that precede +it will usually be ignored, since most modes kill all local variables +as part of their initialization. + + You can use the @code{mode} ``variable'' to set minor modes as well +as the major modes; in fact, you can use it more than once, first to +set the major mode and then to set minor modes which are specific to +particular buffers. But most minor modes should not be specified in +the file at all, regardless of how, because they represent user +preferences. For example, you may be tempted to try to turn on Auto Fill mode with a local variable list. That is a mistake. The choice of Auto Fill mode diff -r fa0a5c4db2c8 -r 95879cc1ed20 man/dired.texi --- a/man/dired.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/man/dired.texi Sun Jan 02 09:13:19 2005 +0000 @@ -700,26 +700,18 @@ If the command string contains @samp{?} surrounded by whitespace, the current file name is substituted for @samp{?}. You can use @samp{?} this way more than once in the command, and each occurrence is -replaced. For instance, here is how to uuencode each file, making the -output file name by appending @samp{.uu} to the input file name: - -@example -uuencode ? ? > ?.uu -@end example +replaced. @end itemize To iterate over the file names in a more complicated fashion, use an -explicit shell loop. For example, this shell command is another way -to uuencode each file: +explicit shell loop. For example, here is how to uuencode each file, +making the output file name by appending @samp{.uu} to the input file +name: @example for file in * ; do uuencode "$file" "$file" >"$file".uu; done @end example -@noindent -This simple example doesn't require a shell loop (you can do it -with @samp{?}, but it illustrates the technique. - The working directory for the shell command is the top-level directory of the Dired buffer. diff -r fa0a5c4db2c8 -r 95879cc1ed20 man/display.texi --- a/man/display.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/man/display.texi Sun Jan 02 09:13:19 2005 +0000 @@ -495,12 +495,14 @@ @vindex scroll-preserve-screen-position Some users like the full-screen scroll commands to keep point at the same screen line. To enable this behavior, set the variable -@code{scroll-preserve-screen-position} to a non-@code{nil} value. This -mode is convenient for browsing through a file by scrolling by -screenfuls; if you come back to the screen where you started, point goes -back to the line where it started. However, this mode is inconvenient -when you move to the next screen in order to move point to the text -there. +@code{scroll-preserve-screen-position} to a non-@code{nil} value. In +this mode, when scrolling shifts point off the screen, or into the +scrolling margins, Emacs moves point to keep the same vertical +position within the window. This mode is convenient for browsing +through a file by scrolling by screenfuls; if you come back to the +screen where you started, point goes back to the line where it +started. However, this mode is inconvenient when you move to the next +screen in order to move point to the text there. Another way to do scrolling is with @kbd{C-l} with a numeric argument. @kbd{C-l} does not clear the screen when given an argument; it only scrolls diff -r fa0a5c4db2c8 -r 95879cc1ed20 man/files.texi --- a/man/files.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/man/files.texi Sun Jan 02 09:13:19 2005 +0000 @@ -464,12 +464,23 @@ @xref{Interlocking,, Simultaneous Editing}. @vindex require-final-newline - If the value of the variable @code{require-final-newline} is @code{t}, -Emacs silently puts a newline at the end of any file that doesn't -already end in one, every time a file is saved or written. If the value -is @code{nil}, Emacs leaves the end of the file unchanged; if it's -neither @code{nil} nor @code{t}, Emacs asks you whether to add a -newline. The default is @code{nil}. + If the value of the variable @code{require-final-newline} is +@code{t}, Emacs silently puts a newline at the end of any file that +doesn't already end in one, every time a file is saved or written. If +the value is @code{visit}, Emacs adds a newline at the end of any file +that doesn't have one, just after it visits the file. (This marks the +buffer as modified, and you can undo it.) If the value is +@code{visit-save}, that means to add newlines both on visiting and on +saving. If the value is @code{nil}, Emacs leaves the end of the file +unchanged; if it's neither @code{nil} nor @code{t}, Emacs asks you +whether to add a newline. The default is @code{nil}. + +@vindex mode-require-final-newline + Many major modes are designed for specific kinds of files that are +always supposed to end in newlines. These major modes set the +variable @code{require-final-newline} according to +@code{mode-require-final-newline}. By setting the latter variable, +you can control how these modes handle final newlines. @menu * Backup:: How Emacs saves the old version of your file. diff -r fa0a5c4db2c8 -r 95879cc1ed20 man/frames.texi --- a/man/frames.texi Sat Dec 25 02:31:08 2004 +0000 +++ b/man/frames.texi Sun Jan 02 09:13:19 2005 +0000 @@ -913,7 +913,7 @@ boxes with the option @code{use-dialog-box}. @vindex x-use-old-gtk-file-dialog - For Gtk+ version 2.4, you can make Emacs use the old file dialog + For Gtk+ version 2.4 and 2.6, you can make Emacs use the old file dialog by setting the variable @code{x-use-old-gtk-file-dialog} to a non-@code{nil} value. If Emacs is built with a Gtk+ version that has only one file dialog, the setting of this variable has no effect. diff -r fa0a5c4db2c8 -r 95879cc1ed20 oldXMenu/Activate.c --- a/oldXMenu/Activate.c Sat Dec 25 02:31:08 2004 +0000 +++ b/oldXMenu/Activate.c Sun Jan 02 09:13:19 2005 +0000 @@ -81,6 +81,7 @@ #include #include "XMenuInt.h" +#include /* For debug, set this to 0 to not grab the keyboard on menu popup */ int x_menu_grab_keyboard = 1; @@ -131,6 +132,7 @@ Window root, child; int root_x, root_y, win_x, win_y; unsigned int mask; + KeySym keysym; /* * Define and allocate a foreign event queue to hold events @@ -458,6 +460,18 @@ } selection = True; break; + case KeyPress: + case KeyRelease: + keysym = XLookupKeysym (&event.xkey, 0); + + /* Pop down on C-g and Escape. */ + if ((keysym == XK_g && (event.xkey.state & ControlMask) != 0) + || keysym == XK_Escape) /* Any escape, ignore modifiers. */ + { + ret_val = XM_NO_SELECT; + selection = True; + } + break; default: /* * If AEQ mode is enabled then queue the event. diff -r fa0a5c4db2c8 -r 95879cc1ed20 oldXMenu/ChangeLog --- a/oldXMenu/ChangeLog Sat Dec 25 02:31:08 2004 +0000 +++ b/oldXMenu/ChangeLog Sun Jan 02 09:13:19 2005 +0000 @@ -1,3 +1,8 @@ +2004-12-27 Jan Dj,Ad(Brv + + * Activate.c (XMenuActivate): Return XM_NO_SELECT if Escape or C-g + was pressed. + 2004-11-12 Jan Dj,Ad(Brv * XMenu.h (XMenuActivateSetWaitFunction): New function. diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/ChangeLog --- a/src/ChangeLog Sat Dec 25 02:31:08 2004 +0000 +++ b/src/ChangeLog Sun Jan 02 09:13:19 2005 +0000 @@ -1,3 +1,302 @@ +2004-12-31 Jan Dj,Ad(Brv + + * xterm.c (handle_one_xevent): Clear area in expose event for GTK. + +2004-12-31 Richard M. Stallman + + * window.c (window_scroll_pixel_based): Only look at + Vscroll_preserve_screen_position if the old PT can't be kept. + (syms_of_window) : Doc fix. + +2004-12-30 Kim F. Storm + + * xdisp.c (get_line_height_property): New function extracted from + original calc_line_height_property. + (calc_line_height_property): Rework. Handle t and (nil . ratio). + (x_produce_glyphs): Use them to handle line-height and + line-spacing according to new height spec. + (Qtotal): Remove. + (syms_of_xdisp): Remove intern and staticpro for Qtotal. + +2004-12-30 Kenichi Handa + + * fileio.c (Finsert_file_contents): Don't use + current_buffer->buffer_file_coding_system even if REPLACE is + non-nil. Call Qafter_insert_file_set_coding with the second arg + VISIT. + + * fontset.h (struct font_info): New members space_width and + average_width. + + * frame.h (struct frame): New member space_width. + (FRAME_SPACE_WIDTH): New macro. + + * xterm.h (struct x_display_info): New member Xatom_AVERAGE_WIDTH. + + * xterm.c (x_new_font): Set FRAME_COLUMN_WIDTH to + fontp->average_width, not FONT_WIDTH. Set FRAME_SPACE_WIDTH to + fontp-?space_width.. + (x_load_font): Calculate fontp->space_width and + fontp->average_width. + (x_term_init): Initialize dpyinfo->Xatom_AVERAGE_WIDTH. + + * xdisp.c (x_produce_glyphs): Calculate tab width by + FRAME_SPACE_WIDTH, not FRAME_COLUMN_WIDTH. + +2004-12-29 Sanghyuk Suh + + * macterm.c (SelectionRange): Add Xcode position apple event struct. + (do_ae_open_documents): Handle Xcode-style file position open + events. + +2004-12-29 Luc Teirlinck + + * buffer.c (syms_of_buffer) : Correct typo. + +2004-12-29 Richard M. Stallman + + * buffer.c (syms_of_buffer) : Doc fix. + +2004-12-29 YAMAMOTO Mitsuharu + + * macfns.c (install_window_handler): Modify extern to return OSErr + value. + (mac_window): Handle return value of install_window_handler. + + * macterm.c (reflect_byte): Remove function. + (mac_create_bitmap_from_bitmap_data): Don't call reflect_byte. + Lookup table instead. + (mac_do_font_lists): Simplify calculation of the longest + nonspecial string. + (init_mac_drag_n_drop): Remove function and declaration. + (mac_initialize) [TARGET_API_MAC_CARBON]: Don't call + init_mac_drag_n_drop. + (mac_do_track_drag): New function and declaration. + (install_window_handler): Return OSErr value. + (install_window_handler) [TARGET_API_MAC_CARBON]: Register + handlers for tracking/receiving drag-and-drop items. + (do_ae_open_documents): Generate unibyte strings for filenames. + (mac_do_receive_drag) [TARGET_API_MAC_CARBON] : Likewise. Reject + only non-filename items. Set event modifiers. Set return value. + +2004-12-28 Dan Nicolaescu + + * coding.c (decode_coding): Fix previous change. + +2004-12-28 Richard M. Stallman + + * xdisp.c (back_to_previous_visible_line_start): + Don't call handle_display_prop. + +2004-12-28 Dan Nicolaescu + + * coding.c (decode_coding_XXX, decode_composition_emacs_mule) + (decode_coding_emacs_mule, encode_coding_emacs_mule) + (decode_coding_iso2022, encode_designation_at_bol) + (encode_coding_iso2022, decode_coding_sjis_big5, decode_eol) + (decode_coding): Constify arguments and local vars. + +2004-12-27 Jan Dj,Ad(Brv + + * xmenu.c (popup_get_selection): Only pop down dialogs + on C-g and Escape. + (popup_get_selection): Remove parameter down_on_keypress. + (create_and_show_popup_menu, create_and_show_dialog): Remove + parameter down_on_keypress to popup_get_selection. + +2004-12-27 YAMAMOTO Mitsuharu + + * dispextern.h: Change HAVE_CARBON to MAC_OS. + (struct glyph_string): Likewise. + + * emacs.c (main) [MAC_OS8]: Call mac_term_init instead of + mac_initialize. + + * fileio.c (Fnext_read_file_uses_dialog_p, Fread_file_name): + Change TARGET_API_MAC_CARBON to HAVE_CARBON. + + * fns.c (vector): Change MAC_OSX to MAC_OS. + + * frame.c (x_set_frame_parameters, x_report_frame_params) + (x_set_fullscreen): Remove #ifndef HAVE_CARBON. + (x_set_border_width, Vdefault_frame_scroll_bars): Change + HAVE_CARBON to MAC_OS. + + * image.c [MAC_OS]: Include sys/stat.h. + [MAC_OS && !MAC_OSX]: Include sys/param.h, ImageCompression.h, and + QuickTimeComponents.h. + + * mac.c [!MAC_OSX] (mac_wait_next_event): Add extern. + [!MAC_OSX] (select): Use mac_wait_next_event. + [!MAC_OSX] (run_mac_command): Change EXEC_SUFFIXES to + Vexec_suffixes. + [!MAC_OSX] (select, run_mac_command): Change `#ifdef + TARGET_API_MAC_CARBON' to `#if TARGET_API_MAC_CARBON'. + (mac_clear_font_name_table): Add extern. + (Fmac_clear_font_name_table): New defun. + (syms_of_mac): Defsubr it. + [MAC_OSX] (SELECT_POLLING_PERIOD_USEC): New define. + [MAC_OSX] (select_and_poll_event): New function. + [MAC_OSX] (sys_select): Use it. + [MAC_OSX && SELECT_USE_CFSOCKET] (socket_callback): New function. + [MAC_OSX && SELECT_USE_CFSOCKET] + (SELECT_TIMEOUT_THRESHOLD_RUNLOOP, EVENT_CLASS_SOCK): New defines. + [MAC_OSX] (sys_select) [SELECT_USE_CFSOCKET]: Use CFSocket and + RunLoop for simultaneously monitoring two kinds of inputs, window + events and process outputs, without periodically polling. + + * macfns.c (mac_initialized): Remove extern. + (stricmp): Put in #if 0. All callers changed to use xstricmp in + xfaces.c. + (strnicmp): Decrement `n' at the end of each loop, not the + beginning. + (check_mac): Use the term "Mac native windows" instead of "Mac + OS". + (check_x_display_info, x_display_info_for_name): Sync with xfns.c. + (mac_get_rdb_resource): New function (from w32reg.c). + (x_get_string_resource): Use it. + (install_window_handler): Add extern. + (mac_window): New function. + (Fx_create_frame): Use it instead of make_mac_frame. Set + parameter for Qfullscreen. Call x_wm_set_size_hint. + (Fx_open_connection, Fx_close_connection): New defuns. + (syms_of_macfns): Defsubr them. + (x_create_tip_frame) [TARGET_API_MAC_CARBON]: Add + kWindowNoUpdatesAttribute to the window attribute. + (x_create_tip_frame) [!TARGET_API_MAC_CARBON]: Use NewCWindow. + (x_create_tip_frame): Don't call ShowWindow. + (Fx_show_tip): Call ShowWindow. + (Fx_file_dialog): Change `#ifdef TARGET_API_MAC_CARBON' to `#if + TARGET_API_MAC_CARBON'. + (mac_frame_parm_handlers): Set handlers for Qfullscreen. + (syms_of_macfns) [MAC_OSX]: Initialize mac_in_use to 0. + + * macgui.h [!MAC_OSX]: Don't include Controls.h. Include + Windows.h. + (Window): Typedef to WindowPtr and move outside `#if + TARGET_API_MAC_CARBON'. + (XSizeHints): New struct. + + * macterm.c (x_update_begin, x_update_end) + [TARGET_API_MAC_CARBON]: Disable screen updates during update of a + frame. + (x_draw_glyph_string_background, x_draw_glyph_string_foreground) + [MAC_OS8]: Use XDrawImageString/XDrawImageString16. + (construct_mouse_click): Put in #if 0. + (x_check_fullscreen, x_check_fullscreen_move): Remove decls. + (x_scroll_bar_create, x_scroll_bar_handle_click): Change `#ifdef + TARGET_API_MAC_CARBON' to `#if TARGET_API_MAC_CARBON'. + (activate_scroll_bars, deactivate_scroll_bars) + [!TARGET_API_MAC_CARBON]: Use ActivateControl/DeactivateControl. + (x_make_frame_visible) [TARGET_API_MAC_CARBON]: Reposition window + if the position is neither user-specified nor program-specified. + (x_free_frame_resources): Free size_hints. + (x_wm_set_size_hint): Allocate size_hints if needed. Set + size_hints. + (mac_clear_font_name_table): New function. + (mac_do_list_fonts): Initialize font_name_table if needed. + (x_list_fonts): Don't initialize font_name_table. Add BLOCK_INPUT + around mac_do_list_fonts. + (mac_unload_font): New function. + (x_load_font): Add BLOCK_INPUT around XLoadQueryFont. + (init_mac_drag_n_drop, mac_do_receive_drag): Enclose declarations + and definitions with #if TARGET_API_MAC_CARBON. + [USE_CARBON_EVENTS] (mac_handle_window_event): Add decl. + (install_window_handler): Add decl. + (do_window_update): Add BeginUpdate/EndUpdate for the tooltip + window. Use UpdateControls. Get the rectangle that should be + updated and restrict the target of expose_frame to it. + (do_grow_window): Set minimum height/width according to + size_hints. + (do_grow_window) [TARGET_API_MAC_CARBON]: Use ResizeWindow. + (do_zoom_window): Don't use x_set_window_size. + [USE_CARBON_EVENTS] (mac_handle_window_event): New function. + (install_window_handler): New function. + [!USE_CARBON_EVENTS] (mouse_region): New variable. + [!USE_CARBON_EVENTS] (mac_wait_next_event): New function. + (XTread_socket) [USE_CARBON_EVENTS]: Move call to + GetEventDispatcherTarget inside BLOCK_INPUT. + (XTread_socket) [!USE_CARBON_EVENTS]: Use mac_wait_next_event. + Update mouse_region when mouse is moved. + (make_mac_frame): Remove. + (make_mac_terminal_frame): Put in #ifdef MAC_OS8. Initialize + mouse pointer shapes. Change values of f->left_pos and + f->top_pos. Don't use make_mac_frame. Use NewCWindow. Don't + call ShowWindow. + (mac_initialize_display_info) [MAC_OSX]: Create mac_id_name from + Vinvocation_name and Vsystem_name. + (mac_make_rdb): New function (from w32term.c). + (mac_term_init): Use it. Add BLOCK_INPUT. Error if display has + already been opened. Don't pass argument to + mac_initialize_display_info. Don't set dpyinfo->height/width. + Add entries to x_display_list and x_display_name_list. + (x_delete_display): New function. + (mac_initialize): Don't call mac_initialize_display_info. + (syms_of_macterm) [!MAC_OSX]: Don't call Fprovide. + + * macterm.h (check_mac): Add extern. + (struct mac_output): New member size_hints. + (FRAME_SIZE_HINTS): New macro. + (mac_unload_font): Add extern. + + * xdisp.c (expose_window, expose_frame): Remove kludges for Mac. + + * xfaces.c (clear_font_table) [MAC_OS]: call mac_unload_font. + +2004-12-27 Richard M. Stallman + + * buffer.c (Fbuffer_disable_undo): Deleted (moved to simple.el). + (syms_of_buffer): Don't defsubr it. + + * process.c (list_processes_1): Set undo_list instead + of calling Fbuffer_disable_undo. + + * xdisp.c (single_display_spec_string_p): Renamed from + single_display_prop_string_p. + (single_display_spec_intangible_p): Renamed from + single_display_prop_intangible_p. + (handle_single_display_spec): Renamed from handle_single_display_prop. + Rewritten to be easier to understand. + + Change in load-history format. Functions now get (defun . NAME), + and variables get just NAME. + + * data.c (Fdefalias): Use (defun . FN_NAME) in LOADHIST_ATTACH. + + * eval.c (Fdefun, Fdefmacro): Use (defun . FN_NAME) in LOADHIST_ATTACH. + (Fdefvaralias, Fdefvar, Fdefconst): Use just SYM in LOADHIST_ATTACH. + (Qdefvar): Var deleted. + (syms_of_eval): Don't initialze it. + + * lread.c (syms_of_lread) : Doc fix. + +2004-12-27 Jan Dj,Ad(Brv + + * xmenu.c (popup_get_selection): Pop down on C-g. + (set_frame_menubar): Install translations for Lucid/Motif/Lesstif that + pops down menu on C-g. + (xdialog_show): If dialog popped down and no button in the dialog was + pushed, call Fsignal to quit. + (xmenu_show): In no toolkit version, if menu returns NO_SELECT call + Fsignal to quit. + + * xfns.c (Fx_file_dialog): Motif/Lesstif version: Pop down on C-g. + + * gtkutil.c (xg_initialize): Install bindings for C-g so that + dialogs and menus pop down. + +2004-12-25 Jan Dj,Ad(Brv + + * gtkutil.c (update_frame_tool_bar): Make the value of + tool-bar-button-margin control margins of images in tool bar. + + * alloc.c (check_depth): New variable. + (overrun_check_malloc, overrun_check_realloc): Only add + overhead and write check pattern if check_depth is 1 (to handle + recursive calls). Increase/decrease check_depth in entry/exit. + (overrun_check_free): Only check for overhead if check_depth is 1. + Increase/decrease check_depth in entry/exit. + 2004-12-23 Jan Dj,Ad(Brv * keyboard.c (input_available_signal): Call SIGNAL_THREAD_CHECK @@ -98,7 +397,7 @@ * sysdep.c (select_alarm): Call SIGNAL_THREAD_CHECK. - * process.c (send_process_trap, sigchld_handler): Call + * process.c (send_process_trap, sigchld_handler): Call SIGNAL_THREAD_CHECK. * data.c (arith_error): Call SIGNAL_THREAD_CHECK. diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/alloc.c --- a/src/alloc.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/alloc.c Sun Jan 02 09:13:19 2005 +0000 @@ -601,6 +601,27 @@ ((unsigned)(ptr[-4]) << 24)) +/* The call depth in overrun_check functions. For example, this might happen: + xmalloc() + overrun_check_malloc() + -> malloc -> (via hook)_-> emacs_blocked_malloc + -> overrun_check_malloc + call malloc (hooks are NULL, so real malloc is called). + malloc returns 10000. + add overhead, return 10016. + <- (back in overrun_check_malloc) + add overhead again, return 10032 + xmalloc returns 10032. + + (time passes). + + xfree(10032) + overrun_check_free(10032) + decrease overhed + free(10016) <- crash, because 10000 is the original pointer. */ + +static int check_depth; + /* Like malloc, but wraps allocated block with header and trailer. */ POINTER_TYPE * @@ -608,15 +629,17 @@ size_t size; { register unsigned char *val; - - val = (unsigned char *) malloc (size + XMALLOC_OVERRUN_CHECK_SIZE*2); - if (val) + size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0; + + val = (unsigned char *) malloc (size + overhead); + if (val && check_depth == 1) { bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE - 4); val += XMALLOC_OVERRUN_CHECK_SIZE; XMALLOC_PUT_SIZE(val, size); bcopy (xmalloc_overrun_check_trailer, val + size, XMALLOC_OVERRUN_CHECK_SIZE); } + --check_depth; return (POINTER_TYPE *)val; } @@ -630,8 +653,10 @@ size_t size; { register unsigned char *val = (unsigned char *)block; + size_t overhead = ++check_depth == 1 ? XMALLOC_OVERRUN_CHECK_SIZE*2 : 0; if (val + && check_depth == 1 && bcmp (xmalloc_overrun_check_header, val - XMALLOC_OVERRUN_CHECK_SIZE, XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0) @@ -646,15 +671,16 @@ bzero (val, XMALLOC_OVERRUN_CHECK_SIZE); } - val = (unsigned char *) realloc ((POINTER_TYPE *)val, size + XMALLOC_OVERRUN_CHECK_SIZE*2); - - if (val) + val = (unsigned char *) realloc ((POINTER_TYPE *)val, size + overhead); + + if (val && check_depth == 1) { bcopy (xmalloc_overrun_check_header, val, XMALLOC_OVERRUN_CHECK_SIZE - 4); val += XMALLOC_OVERRUN_CHECK_SIZE; XMALLOC_PUT_SIZE(val, size); bcopy (xmalloc_overrun_check_trailer, val + size, XMALLOC_OVERRUN_CHECK_SIZE); } + --check_depth; return (POINTER_TYPE *)val; } @@ -666,7 +692,9 @@ { unsigned char *val = (unsigned char *)block; + ++check_depth; if (val + && check_depth == 1 && bcmp (xmalloc_overrun_check_header, val - XMALLOC_OVERRUN_CHECK_SIZE, XMALLOC_OVERRUN_CHECK_SIZE - 4) == 0) @@ -682,6 +710,7 @@ } free (val); + --check_depth; } #undef malloc diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/buffer.c --- a/src/buffer.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/buffer.c Sun Jan 02 09:13:19 2005 +0000 @@ -1252,29 +1252,6 @@ return buf; } -DEFUN ("buffer-disable-undo", Fbuffer_disable_undo, Sbuffer_disable_undo, - 0, 1, "", - doc: /* Make BUFFER stop keeping undo information. -No argument or nil as argument means do this for the current buffer. */) - (buffer) - register Lisp_Object buffer; -{ - Lisp_Object real_buffer; - - if (NILP (buffer)) - XSETBUFFER (real_buffer, current_buffer); - else - { - real_buffer = Fget_buffer (buffer); - if (NILP (real_buffer)) - nsberror (buffer); - } - - XBUFFER (real_buffer)->undo_list = Qt; - - return Qnil; -} - DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo, 0, 1, "", doc: /* Start keeping undo information for buffer BUFFER. @@ -5687,9 +5664,12 @@ DEFVAR_PER_BUFFER ("vertical-scroll-bar", ¤t_buffer->vertical_scroll_bar_type, Qnil, doc: /* *Position of this buffer's vertical scroll bar. -A value of left or right means to place the vertical scroll bar at that side -of the window; a value of nil means that this window has no vertical scroll bar. -A value of t means to use the vertical scroll bar type from the window's frame. */); +The value takes effect whenever you tell a window to display this buffer; +for instance, with `set-window-buffer' or when `display-buffer' displays it. + +A value of `left' or `right' means put the vertical scroll bar at that side +of the window; a value of nil means don't show any vertical scroll bars. +A value of t (the default) means do whatever the window's frame specifies. */); DEFVAR_PER_BUFFER ("indicate-empty-lines", ¤t_buffer->indicate_empty_lines, Qnil, @@ -5967,7 +5947,6 @@ defsubr (&Sbuffer_modified_tick); defsubr (&Srename_buffer); defsubr (&Sother_buffer); - defsubr (&Sbuffer_disable_undo); defsubr (&Sbuffer_enable_undo); defsubr (&Skill_buffer); defsubr (&Sset_buffer_major_mode); diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/coding.c --- a/src/coding.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/coding.c Sun Jan 02 09:13:19 2005 +0000 @@ -157,8 +157,8 @@ struct coding_system *coding; struct coding_detection_info *detect_info; { - unsigned char *src = coding->source; - unsigned char *src_end = coding->source + coding->src_bytes; + const unsigned char *src = coding->source; + const unsigned char *src_end = coding->source + coding->src_bytes; int multibytep = coding->src_multibyte; int consumed_chars = 0; int found = 0; @@ -205,12 +205,12 @@ decode_coding_XXXX (coding) struct coding_system *coding; { - unsigned char *src = coding->source + coding->consumed; - unsigned char *src_end = coding->source + coding->src_bytes; + const unsigned char *src = coding->source + coding->consumed; + const unsigned char *src_end = coding->source + coding->src_bytes; /* SRC_BASE remembers the start position in source in each loop. The loop will be exited when there's not enough source code, or when there's no room in CHARBUF for a decoded character. */ - unsigned char *src_base; + const unsigned char *src_base; /* A buffer to produce decoded characters. */ int *charbuf = coding->charbuf + coding->charbuf_used; int *charbuf_end = coding->charbuf + coding->charbuf_size; diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/data.c --- a/src/data.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/data.c Sun Jan 02 09:13:19 2005 +0000 @@ -723,7 +723,7 @@ && EQ (XCAR (XSYMBOL (symbol)->function), Qautoload)) LOADHIST_ATTACH (Fcons (Qt, symbol)); definition = Ffset (symbol, definition); - LOADHIST_ATTACH (symbol); + LOADHIST_ATTACH (Fcons (Qdefun, symbol)); if (!NILP (docstring)) Fput (symbol, Qfunction_documentation, docstring); return definition; diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/dispextern.h --- a/src/dispextern.h Sat Dec 25 02:31:08 2004 +0000 +++ b/src/dispextern.h Sun Jan 02 09:13:19 2005 +0000 @@ -62,7 +62,7 @@ typedef HDC XImagePtr_or_DC; #endif -#ifdef HAVE_CARBON +#ifdef MAC_OS #include "macgui.h" typedef struct mac_display_info Display_Info; /* Mac equivalent of XImage. */ @@ -1171,7 +1171,7 @@ unsigned for_overlaps_p : 1; /* The GC to use for drawing this glyph string. */ -#if defined(HAVE_X_WINDOWS) || defined(HAVE_CARBON) +#if defined(HAVE_X_WINDOWS) || defined(MAC_OS) GC gc; #endif #if defined(HAVE_NTGUI) diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/emacs.c --- a/src/emacs.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/emacs.c Sun Jan 02 09:13:19 2005 +0000 @@ -1307,7 +1307,7 @@ creates a full-fledge output_mac type frame. This does not work correctly before syms_of_textprop, syms_of_macfns, syms_of_ccl, syms_of_fontset, syms_of_xterm, syms_of_search, - syms_of_frame, mac_initialize, and init_keyboard have already + syms_of_frame, mac_term_init, and init_keyboard have already been called. */ syms_of_textprop (); syms_of_macfns (); @@ -1319,7 +1319,7 @@ syms_of_search (); syms_of_frame (); - mac_initialize (); + mac_term_init (build_string ("Mac"), NULL, NULL); init_keyboard (); #endif diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/eval.c --- a/src/eval.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/eval.c Sun Jan 02 09:13:19 2005 +0000 @@ -88,7 +88,7 @@ int gcpro_level; #endif -Lisp_Object Qautoload, Qmacro, Qexit, Qinteractive, Qcommandp, Qdefun, Qdefvar; +Lisp_Object Qautoload, Qmacro, Qexit, Qinteractive, Qcommandp, Qdefun; Lisp_Object Qinhibit_quit, Vinhibit_quit, Vquit_flag; Lisp_Object Qand_rest, Qand_optional; Lisp_Object Qdebug_on_error; @@ -647,7 +647,7 @@ && EQ (XCAR (XSYMBOL (fn_name)->function), Qautoload)) LOADHIST_ATTACH (Fcons (Qt, fn_name)); Ffset (fn_name, defn); - LOADHIST_ATTACH (fn_name); + LOADHIST_ATTACH (Fcons (Qdefun, fn_name)); return fn_name; } @@ -716,7 +716,7 @@ && EQ (XCAR (XSYMBOL (fn_name)->function), Qautoload)) LOADHIST_ATTACH (Fcons (Qt, fn_name)); Ffset (fn_name, defn); - LOADHIST_ATTACH (fn_name); + LOADHIST_ATTACH (Fcons (Qdefun, fn_name)); return fn_name; } @@ -742,7 +742,7 @@ sym->indirect_variable = 1; sym->value = aliased; sym->constant = SYMBOL_CONSTANT_P (aliased); - LOADHIST_ATTACH (Fcons (Qdefvar, symbol)); + LOADHIST_ATTACH (symbol); if (!NILP (docstring)) Fput (symbol, Qvariable_documentation, docstring); @@ -810,7 +810,7 @@ tem = Fpurecopy (tem); Fput (sym, Qvariable_documentation, tem); } - LOADHIST_ATTACH (Fcons (Qdefvar, sym)); + LOADHIST_ATTACH (sym); } else /* Simple (defvar ) should not count as a definition at all. @@ -853,7 +853,7 @@ tem = Fpurecopy (tem); Fput (sym, Qvariable_documentation, tem); } - LOADHIST_ATTACH (Fcons (Qdefvar, sym)); + LOADHIST_ATTACH (sym); return sym; } @@ -3376,9 +3376,6 @@ Qdefun = intern ("defun"); staticpro (&Qdefun); - Qdefvar = intern ("defvar"); - staticpro (&Qdefvar); - Qand_rest = intern ("&rest"); staticpro (&Qand_rest); diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/fileio.c --- a/src/fileio.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/fileio.c Sun Jan 02 09:13:19 2005 +0000 @@ -3861,10 +3861,6 @@ `coding:' tag if the current buffer is not empty. */ if (!NILP (Vcoding_system_for_read)) coding_system = Vcoding_system_for_read; - else if (! NILP (replace)) - /* In REPLACE mode, we can use the same coding system - that was used to visit the file. */ - coding_system = current_buffer->buffer_file_coding_system; else { /* Don't try looking inside a file for a coding system @@ -4618,7 +4614,8 @@ if (! NILP (Ffboundp (Qafter_insert_file_set_coding))) { - insval = call1 (Qafter_insert_file_set_coding, make_number (inserted)); + insval = call2 (Qafter_insert_file_set_coding, make_number (inserted), + visit); if (! NILP (insval)) { CHECK_NUMBER (insval); @@ -6104,7 +6101,7 @@ before any other event (mouse or keypress) is handeled. */) () { -#if defined (USE_MOTIF) || defined (HAVE_NTGUI) || defined (USE_GTK) || defined (TARGET_API_MAC_CARBON) +#if defined (USE_MOTIF) || defined (HAVE_NTGUI) || defined (USE_GTK) || defined (HAVE_CARBON) if ((NILP (last_nonmenu_event) || CONSP (last_nonmenu_event)) && use_dialog_box && use_file_dialog @@ -6245,7 +6242,7 @@ GCPRO2 (insdef, default_filename); -#if defined (USE_MOTIF) || defined (HAVE_NTGUI) || defined (USE_GTK) || defined (TARGET_API_MAC_CARBON) +#if defined (USE_MOTIF) || defined (HAVE_NTGUI) || defined (USE_GTK) || defined (HAVE_CARBON) if (! NILP (Fnext_read_file_uses_dialog_p ())) { /* If DIR contains a file name, split it. */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/fns.c --- a/src/fns.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/fns.c Sun Jan 02 09:13:19 2005 +0000 @@ -26,8 +26,8 @@ #endif #include -#ifndef MAC_OSX -/* On Mac OS X, defining this conflicts with precompiled headers. */ +#ifndef MAC_OS +/* On Mac OS, defining this conflicts with precompiled headers. */ /* Note on some machines this defines `vector' as a typedef, so make sure we don't use that name in this file. */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/fontset.h --- a/src/fontset.h Sat Dec 25 02:31:08 2004 +0000 +++ b/src/fontset.h Sun Jan 02 09:13:19 2005 +0000 @@ -60,6 +60,12 @@ (font->ascent + font->descent). */ int height; + /* Width of the space glyph of the font. */ + int space_width; + + /* Average width of glyphs in the font. */ + int average_width; + /* 1 iff `vertical-centering-font-regexp' matches this font name. In this case, we render characters at vartical center positions of lines. */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/frame.c --- a/src/frame.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/frame.c Sun Jan 02 09:13:19 2005 +0000 @@ -2815,8 +2815,6 @@ XSETINT (icon_top, 0); } -#ifndef HAVE_CARBON - /* MAC_TODO: fullscreen */ if (FRAME_VISIBLE_P (f) && fullscreen_is_being_set) { /* If the frame is visible already and the fullscreen parameter is @@ -2832,7 +2830,6 @@ if (new_top != f->top_pos || new_left != f->left_pos) x_set_offset (f, new_left, new_top, 1); } -#endif /* Don't set these parameters unless they've been explicitly specified. The window might be mapped or resized while we're in @@ -2993,14 +2990,11 @@ store_in_alist (alistptr, Qdisplay, XCAR (FRAME_X_DISPLAY_INFO (f)->name_list_element)); -#ifndef HAVE_CARBON -/* A Mac Window is identified by a struct, not an integer. */ if (FRAME_X_OUTPUT (f)->parent_desc == FRAME_X_DISPLAY_INFO (f)->root_window) tem = Qnil; else XSETFASTINT (tem, FRAME_X_OUTPUT (f)->parent_desc); store_in_alist (alistptr, Qparent_id, tem); -#endif } @@ -3012,7 +3006,6 @@ struct frame *f; Lisp_Object new_value, old_value; { -#ifndef HAVE_CARBON if (NILP (new_value)) f->want_fullscreen = FULLSCREEN_NONE; else if (EQ (new_value, Qfullboth)) @@ -3021,7 +3014,6 @@ f->want_fullscreen = FULLSCREEN_WIDTH; else if (EQ (new_value, Qfullheight)) f->want_fullscreen = FULLSCREEN_HEIGHT; -#endif } @@ -3141,7 +3133,7 @@ if (XINT (arg) == f->border_width) return; -#ifndef HAVE_CARBON +#ifndef MAC_OS if (FRAME_X_WINDOW (f) != 0) error ("Cannot change the border width of a window"); #endif /* MAC_TODO */ @@ -4052,7 +4044,7 @@ DEFVAR_LISP ("default-frame-scroll-bars", &Vdefault_frame_scroll_bars, doc: /* Default position of scroll bars on this window-system. */); #ifdef HAVE_WINDOW_SYSTEM -#if defined(HAVE_NTGUI) || defined(HAVE_CARBON) +#if defined(HAVE_NTGUI) || defined(MAC_OS) /* MS-Windows has scroll bars on the right by default. */ Vdefault_frame_scroll_bars = Qright; #else diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/frame.h --- a/src/frame.h Sat Dec 25 02:31:08 2004 +0000 +++ b/src/frame.h Sun Jan 02 09:13:19 2005 +0000 @@ -275,6 +275,9 @@ /* Canonical X unit. Width of default font, in pixels. */ int column_width; + /* Widht of space glyph of default font, in pixels. */ + int space_width; + /* Canonical Y unit. Height of a line, in pixels. */ int line_height; @@ -825,10 +828,14 @@ #define FRAME_LINE_HEIGHT(F) ((F)->line_height) /* Canonical x-unit on frame F. - This value currently equals the width of the default font of F. */ + This value currently equals the average width of the default font of F. */ #define FRAME_COLUMN_WIDTH(F) ((F)->column_width) +/* Space glyph width of the default font of frame F. */ + +#define FRAME_SPACE_WIDTH(F) ((F)->space_width) + /* Pixel width of areas used to display truncation marks, continuation marks, overlay arrows. This is 0 for terminal frames. */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/gtkutil.c --- a/src/gtkutil.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/gtkutil.c Sun Jan 02 09:13:19 2005 +0000 @@ -3356,12 +3356,37 @@ GList *icon_list; GList *iter; struct x_output *x = f->output_data.x; + int hmargin, vmargin; if (! FRAME_GTK_WIDGET (f)) return; BLOCK_INPUT; + if (INTEGERP (Vtool_bar_button_margin) + && XINT (Vtool_bar_button_margin) > 0) + { + hmargin = XFASTINT (Vtool_bar_button_margin); + vmargin = XFASTINT (Vtool_bar_button_margin); + } + else if (CONSP (Vtool_bar_button_margin)) + { + if (INTEGERP (XCAR (Vtool_bar_button_margin)) + && XINT (XCAR (Vtool_bar_button_margin)) > 0) + hmargin = XFASTINT (XCAR (Vtool_bar_button_margin)); + + if (INTEGERP (XCDR (Vtool_bar_button_margin)) + && XINT (XCDR (Vtool_bar_button_margin)) > 0) + vmargin = XFASTINT (XCDR (Vtool_bar_button_margin)); + } + + /* The natural size (i.e. when GTK uses 0 as margin) looks best, + so take DEFAULT_TOOL_BAR_BUTTON_MARGIN to mean "default for GTK", + i.e. zero. This means that margins less than + DEFAULT_TOOL_BAR_BUTTON_MARGIN has no effect. */ + hmargin = max (0, hmargin - DEFAULT_TOOL_BAR_BUTTON_MARGIN); + vmargin = max (0, vmargin - DEFAULT_TOOL_BAR_BUTTON_MARGIN); + if (! x->toolbar_widget) xg_create_tool_bar (f); @@ -3425,6 +3450,8 @@ { GtkWidget *w = xg_get_image_for_pixmap (f, img, x->widget, NULL); + gtk_misc_set_padding (GTK_MISC (w), hmargin, vmargin); + gtk_toolbar_append_item (GTK_TOOLBAR (x->toolbar_widget), 0, 0, 0, w, @@ -3480,6 +3507,8 @@ XG_TOOL_BAR_IMAGE_DATA); g_list_free (chlist); + gtk_misc_set_padding (GTK_MISC (wimage), hmargin, vmargin); + if (old_img != img->pixmap) (void) xg_get_image_for_pixmap (f, img, x->widget, wimage); @@ -3549,6 +3578,8 @@ void xg_initialize () { + GtkBindingSet *binding_set; + xg_ignore_gtk_scrollbar = 0; xg_detached_menus = 0; xg_menu_cb_list.prev = xg_menu_cb_list.next = @@ -3571,6 +3602,17 @@ "gtk-key-theme-name", "Emacs", EMACS_CLASS); + + /* Make dialogs close on C-g. Since file dialog inherits from + dialog, this works for them also. */ + binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_DIALOG)); + gtk_binding_entry_add_signal (binding_set, GDK_g, GDK_CONTROL_MASK, + "close", 0); + + /* Make menus close on C-g. */ + binding_set = gtk_binding_set_by_class (gtk_type_class (GTK_TYPE_MENU_SHELL)); + gtk_binding_entry_add_signal (binding_set, GDK_g, GDK_CONTROL_MASK, + "cancel", 0); } #endif /* USE_GTK */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/image.c --- a/src/image.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/image.c Sun Jan 02 09:13:19 2005 +0000 @@ -83,16 +83,19 @@ #ifdef MAC_OS #include "macterm.h" +#include #ifndef MAC_OSX #include +#include #endif #ifdef MAC_OSX -#include #include #else /* not MAC_OSX */ #include #include #include +#include +#include #endif /* not MAC_OSX */ /* MAC_TODO : Color tables on Mac. */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/lisp.h --- a/src/lisp.h Sat Dec 25 02:31:08 2004 +0000 +++ b/src/lisp.h Sun Jan 02 09:13:19 2005 +0000 @@ -1689,8 +1689,16 @@ #define DEFVAR_LISP_NOPRO(lname, vname, doc) defvar_lisp_nopro (lname, vname) #define DEFVAR_BOOL(lname, vname, doc) defvar_bool (lname, vname) #define DEFVAR_INT(lname, vname, doc) defvar_int (lname, vname) + +/* TYPE is nil for a general Lisp variable. + An integer specifies a type; then only LIsp values + with that type code are allowed (except that nil is allowed too). + LNAME is the LIsp-level variable name. + VNAME is the name of the buffer slot. + DOC is a dummy where you write the doc string as a comment. */ #define DEFVAR_PER_BUFFER(lname, vname, type, doc) \ defvar_per_buffer (lname, vname, type, 0) + #define DEFVAR_KBOARD(lname, vname, doc) \ defvar_kboard (lname, \ (int)((char *)(¤t_kboard->vname) \ diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/lread.c --- a/src/lread.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/lread.c Sun Jan 02 09:13:19 2005 +0000 @@ -3984,10 +3984,10 @@ Each alist element is a list that starts with a file name, except for one element (optional) that starts with nil and describes definitions evaluated from buffers not visiting files. -The remaining elements of each list are symbols defined as functions, +The remaining elements of each list are symbols defined as variables and cons cells of the form `(provide . FEATURE)', `(require . FEATURE)', -`(defvar . VARIABLE), `(autoload . SYMBOL)', and `(t . SYMBOL)'. -An element `(t . SYMBOL)' precedes an entry that is just SYMBOL, +`(defun . FUNCTION)', `(autoload . SYMBOL)', and `(t . SYMBOL)'. +An element `(t . SYMBOL)' precedes an entry `(defun . FUNCTION)', and means that SYMBOL was an autoload before this file redefined it as a function. */); Vload_history = Qnil; diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/mac.c --- a/src/mac.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/mac.c Sun Jan 02 09:13:19 2005 +0000 @@ -845,6 +845,8 @@ } +extern Boolean mac_wait_next_event (EventRecord *, UInt32, Boolean); + int select (n, rfds, wfds, efds, timeout) int n; @@ -853,49 +855,24 @@ SELECT_TYPE *efds; struct timeval *timeout; { -#ifdef TARGET_API_MAC_CARBON +#if TARGET_API_MAC_CARBON return 1; #else /* not TARGET_API_MAC_CARBON */ - EMACS_TIME end_time, now; EventRecord e; + UInt32 sleep_time = EMACS_SECS (*timeout) * 60 + + ((EMACS_USECS (*timeout) * 60) / 1000000); /* Can only handle wait for keyboard input. */ if (n > 1 || wfds || efds) return -1; - EMACS_GET_TIME (end_time); - EMACS_ADD_TIME (end_time, end_time, *timeout); - - do - { - /* Also return true if an event other than a keyDown has - occurred. This causes kbd_buffer_get_event in keyboard.c to - call read_avail_input which in turn calls XTread_socket to - poll for these events. Otherwise these never get processed - except but a very slow poll timer. */ - if (FD_ISSET (0, rfds) && EventAvail (everyEvent, &e)) - return 1; - - /* Also check movement of the mouse. */ - { - Point mouse_pos; - static Point old_mouse_pos = {-1, -1}; - - GetMouse (&mouse_pos); - if (!EqualPt (mouse_pos, old_mouse_pos)) - { - old_mouse_pos = mouse_pos; - return 1; - } - } - - WaitNextEvent (0, &e, 1UL, NULL); /* Accept no event; wait 1 - tic. by T.I. */ - - EMACS_GET_TIME (now); - EMACS_SUB_TIME (now, end_time, now); - } - while (!EMACS_TIME_NEG_P (now)); + /* Also return true if an event other than a keyDown has occurred. + This causes kbd_buffer_get_event in keyboard.c to call + read_avail_input which in turn calls XTread_socket to poll for + these events. Otherwise these never get processed except but a + very slow poll timer. */ + if (FD_ISSET (0, rfds) && mac_wait_next_event (&e, sleep_time, false)) + return 1; return 0; #endif /* not TARGET_API_MAC_CARBON */ @@ -1996,7 +1973,7 @@ const char *workdir; const char *infn, *outfn, *errfn; { -#ifdef TARGET_API_MAC_CARBON +#if TARGET_API_MAC_CARBON return -1; #else /* not TARGET_API_MAC_CARBON */ char macappname[MAXPATHLEN+1], macworkdir[MAXPATHLEN+1]; @@ -2081,7 +2058,7 @@ strcat (t, newargv[0]); #endif /* 0 */ Lisp_Object path; - openp (Vexec_path, build_string (newargv[0]), EXEC_SUFFIXES, &path, + openp (Vexec_path, build_string (newargv[0]), Vexec_suffixes, &path, make_number (X_OK)); if (NILP (path)) @@ -2793,17 +2770,98 @@ return Qnil; } +extern void mac_clear_font_name_table P_ ((void)); + +DEFUN ("mac-clear-font-name-table", Fmac_clear_font_name_table, Smac_clear_font_name_table, 0, 0, 0, + doc: /* Clear the font name table. */) + () +{ + check_mac (); + mac_clear_font_name_table (); + return Qnil; +} + #ifdef MAC_OSX #undef select extern int inhibit_window_system; extern int noninteractive; -/* When Emacs is started from the Finder, SELECT always immediately - returns as if input is present when file descriptor 0 is polled for - input. Strangely, when Emacs is run as a GUI application from the - command line, it blocks in the same situation. This `wrapper' of - the system call SELECT corrects this discrepancy. */ +/* Unlike in X11, window events in Carbon do not come from sockets. + So we cannot simply use `select' to monitor two kinds of inputs: + window events and process outputs. We emulate such functionality + by regarding fd 0 as the window event channel and simultaneously + monitoring both kinds of input channels. It is implemented by + dividing into some cases: + 1. The window event channel is not involved. + -> Use `select'. + 2. Sockets are not involved. + -> Use ReceiveNextEvent. + 3. [If SELECT_USE_CFSOCKET is defined] + Only the window event channel and socket read channels are + involved, and timeout is not too short (greater than + SELECT_TIMEOUT_THRESHHOLD_RUNLOOP seconds). + -> Create CFSocket for each socket and add it into the current + event RunLoop so that an `ready-to-read' event can be posted + to the event queue that is also used for window events. Then + ReceiveNextEvent can wait for both kinds of inputs. + 4. Otherwise. + -> Periodically poll the window input channel while repeatedly + executing `select' with a short timeout + (SELECT_POLLING_PERIOD_USEC microseconds). */ + +#define SELECT_POLLING_PERIOD_USEC 20000 +#ifdef SELECT_USE_CFSOCKET +#define SELECT_TIMEOUT_THRESHOLD_RUNLOOP 0.2 +#define EVENT_CLASS_SOCK 'Sock' + +static void +socket_callback (s, type, address, data, info) + CFSocketRef s; + CFSocketCallBackType type; + CFDataRef address; + const void *data; + void *info; +{ + EventRef event; + + CreateEvent (NULL, EVENT_CLASS_SOCK, 0, 0, kEventAttributeNone, &event); + PostEventToQueue (GetCurrentEventQueue (), event, kEventPriorityStandard); + ReleaseEvent (event); +} +#endif /* SELECT_USE_CFSOCKET */ + +static int +select_and_poll_event (n, rfds, wfds, efds, timeout) + int n; + SELECT_TYPE *rfds; + SELECT_TYPE *wfds; + SELECT_TYPE *efds; + struct timeval *timeout; +{ + int r; + OSErr err; + + r = select (n, rfds, wfds, efds, timeout); + if (r != -1) + { + BLOCK_INPUT; + err = ReceiveNextEvent (0, NULL, kEventDurationNoWait, + kEventLeaveInQueue, NULL); + UNBLOCK_INPUT; + if (err == noErr) + { + FD_SET (0, rfds); + r++; + } + } + return r; +} + +#ifndef MAC_OS_X_VERSION_10_2 +#undef SELECT_INVALIDATE_CFSOCKET +#endif + int sys_select (n, rfds, wfds, efds, timeout) int n; @@ -2813,91 +2871,182 @@ struct timeval *timeout; { OSErr err; - EMACS_TIME end_time, now, remaining_time; - + int i, r; + EMACS_TIME select_timeout; + if (inhibit_window_system || noninteractive || rfds == NULL || !FD_ISSET (0, rfds)) return select (n, rfds, wfds, efds, timeout); - + + FD_CLR (0, rfds); + if (wfds == NULL && efds == NULL) { - int i; + int nsocks = 0; + SELECT_TYPE orfds = *rfds; + + EventTimeout timeout_sec = + (timeout + ? (EMACS_SECS (*timeout) * kEventDurationSecond + + EMACS_USECS (*timeout) * kEventDurationMicrosecond) + : kEventDurationForever); for (i = 1; i < n; i++) if (FD_ISSET (i, rfds)) - break; - if (i == n) - { - EventTimeout timeout_sec = - (timeout - ? (EMACS_SECS (*timeout) * kEventDurationSecond - + EMACS_USECS (*timeout) * kEventDurationMicrosecond) - : kEventDurationForever); - + nsocks++; + + if (nsocks == 0) + { BLOCK_INPUT; err = ReceiveNextEvent (0, NULL, timeout_sec, kEventLeaveInQueue, NULL); UNBLOCK_INPUT; if (err == noErr) { - FD_ZERO (rfds); FD_SET (0, rfds); return 1; } else return 0; } - } - - if (timeout) - { - remaining_time = *timeout; - EMACS_GET_TIME (now); - EMACS_ADD_TIME (end_time, now, remaining_time); + + /* Avoid initial overhead of RunLoop setup for the case that + some input is already available. */ + EMACS_SET_SECS_USECS (select_timeout, 0, 0); + r = select_and_poll_event (n, rfds, wfds, efds, &select_timeout); + if (r != 0 || timeout_sec == 0.0) + return r; + + *rfds = orfds; + +#ifdef SELECT_USE_CFSOCKET + if (timeout_sec > 0 && timeout_sec <= SELECT_TIMEOUT_THRESHOLD_RUNLOOP) + goto poll_periodically; + + { + CFRunLoopRef runloop = + (CFRunLoopRef) GetCFRunLoopFromEventLoop (GetCurrentEventLoop ()); + EventTypeSpec specs[] = {{EVENT_CLASS_SOCK, 0}}; +#ifdef SELECT_INVALIDATE_CFSOCKET + CFSocketRef *shead, *s; +#else + CFRunLoopSourceRef *shead, *s; +#endif + + BLOCK_INPUT; + +#ifdef SELECT_INVALIDATE_CFSOCKET + shead = xmalloc (sizeof (CFSocketRef) * nsocks); +#else + shead = xmalloc (sizeof (CFRunLoopSourceRef) * nsocks); +#endif + s = shead; + for (i = 1; i < n; i++) + if (FD_ISSET (i, rfds)) + { + CFSocketRef socket = + CFSocketCreateWithNative (NULL, i, kCFSocketReadCallBack, + socket_callback, NULL); + CFRunLoopSourceRef source = + CFSocketCreateRunLoopSource (NULL, socket, 0); + +#ifdef SELECT_INVALIDATE_CFSOCKET + CFSocketSetSocketFlags (socket, 0); +#endif + CFRunLoopAddSource (runloop, source, kCFRunLoopDefaultMode); +#ifdef SELECT_INVALIDATE_CFSOCKET + CFRelease (source); + *s = socket; +#else + CFRelease (socket); + *s = source; +#endif + s++; + } + + err = ReceiveNextEvent (0, NULL, timeout_sec, kEventLeaveInQueue, NULL); + + do + { + --s; +#ifdef SELECT_INVALIDATE_CFSOCKET + CFSocketInvalidate (*s); +#else + CFRunLoopRemoveSource (runloop, *s, kCFRunLoopDefaultMode); +#endif + CFRelease (*s); + } + while (s != shead); + + xfree (shead); + + if (err) + { + FD_ZERO (rfds); + r = 0; + } + else + { + FlushEventsMatchingListFromQueue (GetCurrentEventQueue (), + GetEventTypeCount (specs), + specs); + EMACS_SET_SECS_USECS (select_timeout, 0, 0); + r = select_and_poll_event (n, rfds, wfds, efds, &select_timeout); + } + + UNBLOCK_INPUT; + + return r; + } +#endif /* SELECT_USE_CFSOCKET */ } - FD_CLR (0, rfds); - do - { - EMACS_TIME select_timeout; - SELECT_TYPE orfds = *rfds; - int r; - - EMACS_SET_SECS_USECS (select_timeout, 0, 20000); - - if (timeout && EMACS_TIME_LT (remaining_time, select_timeout)) - select_timeout = remaining_time; - - r = select (n, &orfds, wfds, efds, &select_timeout); - BLOCK_INPUT; - err = ReceiveNextEvent (0, NULL, kEventDurationNoWait, - kEventLeaveInQueue, NULL); - UNBLOCK_INPUT; - if (r > 0) - { - *rfds = orfds; - if (err == noErr) - { - FD_SET (0, rfds); - r++; - } + + poll_periodically: + { + EMACS_TIME end_time, now, remaining_time; + SELECT_TYPE orfds = *rfds, owfds, oefds; + + if (wfds) + owfds = *wfds; + if (efds) + oefds = *efds; + if (timeout) + { + remaining_time = *timeout; + EMACS_GET_TIME (now); + EMACS_ADD_TIME (end_time, now, remaining_time); + } + + do + { + EMACS_SET_SECS_USECS (select_timeout, 0, SELECT_POLLING_PERIOD_USEC); + if (timeout && EMACS_TIME_LT (remaining_time, select_timeout)) + select_timeout = remaining_time; + r = select_and_poll_event (n, rfds, wfds, efds, &select_timeout); + if (r != 0) return r; - } - else if (err == noErr) - { - FD_ZERO (rfds); - FD_SET (0, rfds); - return 1; - } - - if (timeout) - { - EMACS_GET_TIME (now); - EMACS_SUB_TIME (remaining_time, end_time, now); - } - } - while (!timeout || EMACS_TIME_LT (now, end_time)); - - return 0; + + *rfds = orfds; + if (wfds) + *wfds = owfds; + if (efds) + *efds = oefds; + + if (timeout) + { + EMACS_GET_TIME (now); + EMACS_SUB_TIME (remaining_time, end_time, now); + } + } + while (!timeout || EMACS_TIME_LT (now, end_time)); + + FD_ZERO (rfds); + if (wfds) + FD_ZERO (wfds); + if (efds) + FD_ZERO (efds); + return 0; + } } /* Set up environment variables so that Emacs can correctly find its @@ -3043,6 +3192,7 @@ defsubr (&Smac_paste_function); defsubr (&Smac_cut_function); defsubr (&Sx_selection_exists_p); + defsubr (&Smac_clear_font_name_table); defsubr (&Sdo_applescript); defsubr (&Smac_file_name_to_posix); diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/macfns.c --- a/src/macfns.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/macfns.c Sun Jan 02 09:13:19 2005 +0000 @@ -158,9 +158,7 @@ extern Lisp_Object Vwindow_system_version; -extern int mac_initialized; - - +#if 0 /* Use xstricmp instead. */ /* compare two strings ignoring case */ static int @@ -171,13 +169,14 @@ return 0; return tolower (*s) - tolower (*t); } +#endif /* compare two strings up to n characters, ignoring case */ static int strnicmp (const char *s, const char *t, unsigned int n) { - for ( ; n-- > 0 && tolower (*s) == tolower (*t); s++, t++) + for ( ; n > 0 && tolower (*s) == tolower (*t); n--, s++, t++) if (*s == '\0') return 0; return n == 0 ? 0 : tolower (*s) - tolower (*t); @@ -190,7 +189,7 @@ check_mac () { if (! mac_in_use) - error ("Mac OS not in use or not initialized"); + error ("Mac native windows not in use or not initialized"); } /* Nonzero if we can use mouse menus. @@ -228,33 +227,28 @@ check_x_display_info (frame) Lisp_Object frame; { - if (!mac_initialized) - { - mac_initialize (); - mac_initialized = 1; - } + struct mac_display_info *dpyinfo = NULL; if (NILP (frame)) { struct frame *sf = XFRAME (selected_frame); if (FRAME_MAC_P (sf) && FRAME_LIVE_P (sf)) - return FRAME_MAC_DISPLAY_INFO (sf); + dpyinfo = FRAME_MAC_DISPLAY_INFO (sf); + else if (x_display_list != 0) + dpyinfo = x_display_list; else - return &one_mac_display_info; + error ("Mac native windows are not in use or not initialized"); } else if (STRINGP (frame)) - return x_display_info_for_name (frame); + dpyinfo = x_display_info_for_name (frame); else { - FRAME_PTR f; - - CHECK_LIVE_FRAME (frame); - f = XFRAME (frame); - if (! FRAME_MAC_P (f)) - error ("non-mac frame used"); - return FRAME_MAC_DISPLAY_INFO (f); + FRAME_PTR f = check_x_frame (frame); + dpyinfo = FRAME_MAC_DISPLAY_INFO (f); } + + return dpyinfo; } /* Return the Emacs frame-object corresponding to a mac window. @@ -1109,7 +1103,7 @@ BLOCK_INPUT; for (i = 0; i < sizeof (mac_color_map) / sizeof (mac_color_map[0]); i++) - if (stricmp (colorname, mac_color_map[i].name) == 0) + if (xstricmp (colorname, mac_color_map[i].name) == 0) { ret = make_number (mac_color_map[i].color); break; @@ -2059,13 +2053,49 @@ /* Subroutines of creating a frame. */ +static char * +mac_get_rdb_resource (rdb, resource) + char *rdb; + char *resource; +{ + char *value = rdb; + int len = strlen (resource); + + while (*value) + { + if ((strncmp (value, resource, len) == 0) && (value[len] == ':')) + return xstrdup (&value[len + 1]); + + value = strchr (value, '\0') + 1; + } + + return NULL; +} + +/* Retrieve the string resource specified by NAME with CLASS from + database RDB. */ + char * x_get_string_resource (rdb, name, class) XrmDatabase rdb; char *name, *class; { - /* MAC_TODO: implement resource strings */ + if (rdb) + { + char *resource; + + if (resource = mac_get_rdb_resource (rdb, name)) + return resource; + if (resource = mac_get_rdb_resource (rdb, class)) + return resource; + } + + /* MAC_TODO: implement resource strings. (Maybe Property Lists?) */ +#if 0 + return mac_get_string_resource (name, class); +#else return (char *)0; +#endif } /* Return the value of parameter PARAM. @@ -2229,36 +2259,42 @@ } -#if 0 /* MAC_TODO */ /* Create and set up the Mac window for frame F. */ +extern OSErr install_window_handler (WindowPtr); + static void -mac_window (f, window_prompting, minibuffer_only) +mac_window (f) struct frame *f; - long window_prompting; - int minibuffer_only; { Rect r; BLOCK_INPUT; - /* Use the resource name as the top-level window name - for looking up resources. Make a non-Lisp copy - for the window manager, so GC relocation won't bother it. - - Elsewhere we specify the window name for the window manager. */ - - { - char *str = (char *) SDATA (Vx_resource_name); - f->namebuf = (char *) xmalloc (strlen (str) + 1); - strcpy (f->namebuf, str); - } - SetRect (&r, f->left_pos, f->top_pos, f->left_pos + FRAME_PIXEL_WIDTH (f), f->top_pos + FRAME_PIXEL_HEIGHT (f)); +#if TARGET_API_MAC_CARBON + CreateNewWindow (kDocumentWindowClass, + kWindowStandardDocumentAttributes + /* | kWindowToolbarButtonAttribute */, + &r, &FRAME_MAC_WINDOW (f)); + if (FRAME_MAC_WINDOW (f)) + { + SetWRefCon (FRAME_MAC_WINDOW (f), (long) f->output_data.mac); + if (install_window_handler (FRAME_MAC_WINDOW (f)) != noErr) + { + DisposeWindow (FRAME_MAC_WINDOW (f)); + FRAME_MAC_WINDOW (f) = NULL; + } + } +#else FRAME_MAC_WINDOW (f) - = NewCWindow (NULL, &r, "\p", 1, zoomDocProc, (WindowPtr) -1, 1, (long) f->output_data.mac); + = NewCWindow (NULL, &r, "\p", false, zoomDocProc, + (WindowPtr) -1, 1, (long) f->output_data.mac); +#endif + /* so that update events can find this mac_output struct */ + f->output_data.mac->mFP = f; /* point back to emacs frame */ validate_x_resource_name (); @@ -2276,17 +2312,11 @@ x_set_name (f, name, explicit); } - ShowWindow (FRAME_MAC_WINDOW (f)); - UNBLOCK_INPUT; - if (!minibuffer_only && FRAME_EXTERNAL_MENU_BAR (f)) - initialize_frame_menubar (f); - if (FRAME_MAC_WINDOW (f) == 0) error ("Unable to create window"); } -#endif /* MAC_TODO */ /* Handle the icon stuff for this window. Perhaps later we might want an x_set_icon_position which can be called interactively as @@ -2703,6 +2733,8 @@ "bufferPredicate", "BufferPredicate", RES_TYPE_SYMBOL); x_default_parameter (f, parms, Qtitle, Qnil, "title", "Title", RES_TYPE_STRING); + x_default_parameter (f, parms, Qfullscreen, Qnil, + "fullscreen", "Fullscreen", RES_TYPE_SYMBOL); f->output_data.mac->parent_desc = FRAME_MAC_DISPLAY_INFO (f)->root_window; @@ -2728,8 +2760,7 @@ tem = mac_get_arg (parms, Qunsplittable, 0, 0, RES_TYPE_BOOLEAN); f->no_split = minibuffer_only || EQ (tem, Qt); - /* mac_window (f, window_prompting, minibuffer_only); */ - make_mac_frame (f); + mac_window (f); x_icon (f, parms); x_make_gc (f); @@ -2763,14 +2794,12 @@ FRAME_LINES (f) = 0; change_frame_size (f, height, width, 1, 0, 0); -#if 0 /* MAC_TODO: when we have window manager hints */ /* Tell the server what size and position, etc, we want, and how badly we want them. This should be done after we have the menu bar so that its size can be taken into account. */ BLOCK_INPUT; x_wm_set_size_hint (f, window_prompting, 0); UNBLOCK_INPUT; -#endif /* Make the window appear on the frame and enable display, unless the caller says not to. However, with explicit parent, Emacs @@ -3144,6 +3173,9 @@ CHECK_STRING (name); + if (! EQ (Vwindow_system, intern ("mac"))) + error ("Not using Mac native windows"); + for (dpyinfo = &one_mac_display_info, names = x_display_name_list; dpyinfo; dpyinfo = dpyinfo->next, names = XCDR (names)) @@ -3171,7 +3203,6 @@ return dpyinfo; } -#if 0 /* MAC_TODO: implement network support */ DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection, 1, 3, 0, doc: /* Open a connection to a server. @@ -3190,7 +3221,7 @@ CHECK_STRING (xrm_string); if (! EQ (Vwindow_system, intern ("mac"))) - error ("Not using Mac OS"); + error ("Not using Mac native windows"); if (! NILP (xrm_string)) xrm_option = (unsigned char *) SDATA (xrm_string); @@ -3238,11 +3269,9 @@ for (i = 0; i < dpyinfo->n_fonts; i++) if (dpyinfo->font_table[i].name) { - if (dpyinfo->font_table[i].name != dpyinfo->font_table[i].full_name) - xfree (dpyinfo->font_table[i].full_name); - xfree (dpyinfo->font_table[i].name); - x_unload_font (dpyinfo, dpyinfo->font_table[i].font); + mac_unload_font (dpyinfo, dpyinfo->font_table[i].font); } + x_destroy_all_bitmaps (dpyinfo); x_delete_display (dpyinfo); @@ -3250,7 +3279,6 @@ return Qnil; } -#endif /* 0 */ DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0, doc: /* Return the list of display names that Emacs has connections to. */) @@ -3813,18 +3841,23 @@ BLOCK_INPUT; SetRect (&r, 0, 0, 1, 1); +#if TARGET_API_MAC_CARBON if (CreateNewWindow (kHelpWindowClass, #ifdef MAC_OS_X_VERSION_10_2 kWindowIgnoreClicksAttribute | #endif + kWindowNoUpdatesAttribute | kWindowNoActivatesAttribute, &r, &tip_window) == noErr) +#else + if (tip_window = NewCWindow (NULL, &r, "\p", false, plainDBox, + NULL, false, 0L)) +#endif { FRAME_MAC_WINDOW (f) = tip_window; SetWRefCon (tip_window, (long) f->output_data.mac); /* so that update events can find this mac_output struct */ f->output_data.mac->mFP = f; - ShowWindow (tip_window); } UNBLOCK_INPUT; } @@ -4140,6 +4173,7 @@ BLOCK_INPUT; MoveWindow (FRAME_MAC_WINDOW (f), root_x, root_y, false); SizeWindow (FRAME_MAC_WINDOW (f), width, height, true); + ShowWindow (FRAME_MAC_WINDOW (f)); BringToFront (FRAME_MAC_WINDOW (f)); UNBLOCK_INPUT; @@ -4198,7 +4232,7 @@ -#ifdef TARGET_API_MAC_CARBON +#if TARGET_API_MAC_CARBON /*********************************************************************** File selection dialog ***********************************************************************/ @@ -4405,14 +4439,19 @@ x_set_fringe_width, x_set_fringe_width, 0, /* x_set_wait_for_wm, */ - 0, /* MAC_TODO: x_set_fullscreen, */ + x_set_fullscreen, }; void syms_of_macfns () { - /* Certainly running on Mac. */ +#ifdef MAC_OSX + /* This is zero if not using Mac native windows. */ + mac_in_use = 0; +#else + /* Certainly running on Mac native windows. */ mac_in_use = 1; +#endif /* The section below is built by the lisp expression at the top of the file, just above where these variables are declared. */ @@ -4536,10 +4575,8 @@ defsubr (&Sx_display_backing_store); defsubr (&Sx_display_save_under); defsubr (&Sx_create_frame); -#if 0 /* MAC_TODO: implement network support */ defsubr (&Sx_open_connection); defsubr (&Sx_close_connection); -#endif defsubr (&Sx_display_list); defsubr (&Sx_synchronize); diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/macgui.h --- a/src/macgui.h Sat Dec 25 02:31:08 2004 +0000 +++ b/src/macgui.h Sun Jan 02 09:13:19 2005 +0000 @@ -62,18 +62,17 @@ #else #include /* for WindowPtr */ #include /* for GWorldPtr */ -#include /* for ControlHandle in xdisp.c */ +#include #include #endif +typedef WindowPtr Window; typedef GWorldPtr Pixmap; #if TARGET_API_MAC_CARBON -typedef struct OpaqueWindowPtr *Window; #define Cursor ThemeCursor #define No_Cursor (-1) #else -typedef WindowPtr Window; #define SetPortWindowPort(w) SetPort(w) #define Cursor CursHandle #define No_Cursor (0) @@ -198,6 +197,29 @@ #define XNegative 0x0010 #define YNegative 0x0020 +typedef struct { + long flags; /* marks which fields in this structure are defined */ +#if 0 + int x, y; /* obsolete for new window mgrs, but clients */ + int width, height; /* should set so old wm's don't mess up */ +#endif + int min_width, min_height; +#if 0 + int max_width, max_height; +#endif + int width_inc, height_inc; +#if 0 + struct { + int x; /* numerator */ + int y; /* denominator */ + } min_aspect, max_aspect; +#endif + int base_width, base_height; /* added by ICCCM version 1 */ +#if 0 + int win_gravity; /* added by ICCCM version 1 */ +#endif +} XSizeHints; + #define USPosition (1L << 0) /* user specified x, y */ #define USSize (1L << 1) /* user specified width, height */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/macterm.c --- a/src/macterm.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/macterm.c Sun Jan 02 09:13:19 2005 +0000 @@ -513,23 +513,6 @@ } -/* XBM bits seem to be backward within bytes compared with how - Mac does things. */ -static unsigned char -reflect_byte (orig) - unsigned char orig; -{ - int i; - unsigned char reflected = 0x00; - for (i = 0; i < 8; i++) - { - if (orig & (0x01 << i)) - reflected |= 0x80 >> i; - } - return reflected; -} - - /* Mac replacement for XCreateBitmapFromBitmapData. */ static void @@ -538,6 +521,11 @@ char *bits; int w, h; { + static unsigned char swap_nibble[16] + = { 0x0, 0x8, 0x4, 0xc, /* 0000 1000 0100 1100 */ + 0x2, 0xa, 0x6, 0xe, /* 0010 1010 0110 1110 */ + 0x1, 0x9, 0x5, 0xd, /* 0001 1001 0101 1101 */ + 0x3, 0xb, 0x7, 0xf }; /* 0011 1011 0111 1111 */ int i, j, w1; char *p; @@ -549,7 +537,12 @@ { p = bitmap->baseAddr + i * bitmap->rowBytes; for (j = 0; j < w1; j++) - *p++ = reflect_byte (*bits++); + { + /* Bitswap XBM bytes to match how Mac does things. */ + unsigned char c = *bits++; + *p++ = (unsigned char)((swap_nibble[c & 0xf] << 4) + | (swap_nibble[(c>>4) & 0xf]));; + } } SetRect (&(bitmap->bounds), 0, 0, w, h); @@ -1180,7 +1173,17 @@ x_update_begin (f) struct frame *f; { - /* Nothing to do. */ +#if TARGET_API_MAC_CARBON + /* During update of a frame, availability of input events is + periodically checked with ReceiveNextEvent if + redisplay-dont-pause is nil. That normally flushes window buffer + changes for every check, and thus screen update looks waving even + if no input is available. So we disable screen updates during + update of a frame. */ + BLOCK_INPUT; + DisableScreenUpdates (); + UNBLOCK_INPUT; +#endif } @@ -1265,7 +1268,7 @@ make sure that the mouse-highlight is properly redrawn. W may be a menu bar pseudo-window in case we don't have X toolkit - support. Such windows don't have a cursor, so don't display it + support. Such windows don't have a cursor, so don't display it here. */ static void @@ -1329,6 +1332,9 @@ mac_set_backcolor (FRAME_BACKGROUND_PIXEL (f)); +#if TARGET_API_MAC_CARBON + EnableScreenUpdates (); +#endif XFlush (FRAME_MAC_DISPLAY (f)); UNBLOCK_INPUT; } @@ -1989,7 +1995,7 @@ } else #endif -#if 0 /* defined(MAC_OS8)*/ +#ifdef MAC_OS8 if (FONT_HEIGHT (s->font) < s->height - 2 * box_line_width || s->font_not_found_p || s->extends_to_end_of_line_p @@ -2047,7 +2053,7 @@ for (i = 0; i < s->nchars; ++i) char1b[i] = s->char2b[i].byte2; -#if 0 /* defined(MAC_OS8) */ +#ifdef MAC_OS8 /* Draw text with XDrawString if background has already been filled. Otherwise, use XDrawImageString. (Note that XDrawImageString is usually faster than XDrawString.) Always @@ -2065,7 +2071,7 @@ XDrawString (s->display, s->window, s->gc, x, s->ybase - boff, char1b, s->nchars); } -#if 0 /* defined(MAC_OS8)*/ +#ifdef MAC_OS8 else { if (s->two_byte_p) @@ -3658,6 +3664,7 @@ +#if 0 /* Mouse clicks and mouse movement. Rah. */ /* Prepare a mouse-event in *RESULT for placement in the input queue. @@ -3691,6 +3698,7 @@ result->arg = Qnil; return Qnil; } +#endif /* Function to report a mouse movement to the mainstream Emacs code. @@ -3760,8 +3768,6 @@ static struct scroll_bar *x_window_to_scroll_bar (); static void x_scroll_bar_report_motion (); -static void x_check_fullscreen P_ ((struct frame *)); -static void x_check_fullscreen_move P_ ((struct frame *)); static int glyph_rect P_ ((struct frame *f, int, int, Rect *)); @@ -4023,7 +4029,7 @@ r.right = left + width; r.bottom = disp_top + disp_height; -#ifdef TARGET_API_MAC_CARBON +#if TARGET_API_MAC_CARBON ch = NewControl (FRAME_MAC_WINDOW (f), &r, "\p", 1, 0, 0, 0, kControlScrollBarProc, 0L); #else @@ -4401,7 +4407,7 @@ while (! NILP (bar)) { ch = SCROLL_BAR_CONTROL_HANDLE (XSCROLL_BAR (bar)); -#ifdef TARGET_API_MAC_CARBON +#if 1 /* TARGET_API_MAC_CARBON */ ActivateControl (ch); #else SetControlMaximum (ch, @@ -4425,10 +4431,10 @@ while (! NILP (bar)) { ch = SCROLL_BAR_CONTROL_HANDLE (XSCROLL_BAR (bar)); -#ifdef TARGET_API_MAC_CARBON +#if 1 /* TARGET_API_MAC_CARBON */ DeactivateControl (ch); #else - SetControlMaximum (ch, XINT (-1)); + SetControlMaximum (ch, -1); #endif bar = XSCROLL_BAR (bar)->next; } @@ -4472,7 +4478,7 @@ case kControlPageDownPart: bufp->part = scroll_bar_below_handle; break; -#ifdef TARGET_API_MAC_CARBON +#if TARGET_API_MAC_CARBON default: #else case kControlIndicatorPart: @@ -4985,13 +4991,16 @@ XSetFont (FRAME_MAC_DISPLAY (f), f->output_data.mac->cursor_gc, FRAME_FONT (f)); + /* Don't change the size of a tip frame; there's no point in + doing it because it's done in Fx_show_tip, and it leads to + problems because the tip frame has no widget. */ if (NILP (tip_frame) || XFRAME (tip_frame) != f) x_set_window_size (f, 0, FRAME_COLS (f), FRAME_LINES (f)); } return build_string (fontp->full_name); } - + /* Give frame F the fontset named FONTSETNAME as its default font, and return the full name of that fontset. FONTSETNAME may be a wildcard pattern; in that case, we choose some fontset that fits the pattern. @@ -5386,6 +5395,25 @@ f->output_data.mac->asked_for_visible = 1; +#if TARGET_API_MAC_CARBON + if (!(FRAME_SIZE_HINTS (f)->flags & (USPosition | PPosition))) + { + struct frame *sf = SELECTED_FRAME (); + if (!FRAME_MAC_P (sf)) + RepositionWindow (FRAME_MAC_WINDOW (f), NULL, + kWindowCenterOnMainScreen); + else + RepositionWindow (FRAME_MAC_WINDOW (f), + FRAME_MAC_WINDOW (sf), +#ifdef MAC_OS_X_VERSION_10_2 + kWindowCascadeStartAtParentWindowScreen +#else + kWindowCascadeOnParentWindowScreen +#endif + ); + x_real_positions (f, &f->left_pos, &f->top_pos); + } +#endif ShowWindow (FRAME_MAC_WINDOW (f)); } @@ -5513,6 +5541,9 @@ x_free_gcs (f); + if (FRAME_SIZE_HINTS (f)) + xfree (FRAME_SIZE_HINTS (f)); + xfree (f->output_data.mac); f->output_data.mac = NULL; @@ -5565,143 +5596,39 @@ long flags; int user_position; { -#if 0 /* MAC_TODO: connect this to the Appearance Manager */ - XSizeHints size_hints; - -#ifdef USE_X_TOOLKIT - Arg al[2]; - int ac = 0; - Dimension widget_width, widget_height; - Window window = XtWindow (f->output_data.x->widget); -#else /* not USE_X_TOOLKIT */ - Window window = FRAME_X_WINDOW (f); -#endif /* not USE_X_TOOLKIT */ - - /* Setting PMaxSize caused various problems. */ - size_hints.flags = PResizeInc | PMinSize /* | PMaxSize */; - - size_hints.x = f->left_pos; - size_hints.y = f->top_pos; - -#ifdef USE_X_TOOLKIT - XtSetArg (al[ac], XtNwidth, &widget_width); ac++; - XtSetArg (al[ac], XtNheight, &widget_height); ac++; - XtGetValues (f->output_data.x->widget, al, ac); - size_hints.height = widget_height; - size_hints.width = widget_width; -#else /* not USE_X_TOOLKIT */ - size_hints.height = FRAME_PIXEL_HEIGHT (f); - size_hints.width = FRAME_PIXEL_WIDTH (f); -#endif /* not USE_X_TOOLKIT */ - - size_hints.width_inc = FRAME_COLUMN_WIDTH (f); - size_hints.height_inc = FRAME_LINE_HEIGHT (f); - size_hints.max_width - = FRAME_X_DISPLAY_INFO (f)->width - FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, 0); - size_hints.max_height - = FRAME_X_DISPLAY_INFO (f)->height - FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, 0); - - /* Calculate the base and minimum sizes. - - (When we use the X toolkit, we don't do it here. - Instead we copy the values that the widgets are using, below.) */ -#ifndef USE_X_TOOLKIT - { - int base_width, base_height; - int min_rows = 0, min_cols = 0; - - base_width = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, 0); - base_height = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, 0); - - check_frame_size (f, &min_rows, &min_cols); - - /* The window manager uses the base width hints to calculate the - current number of rows and columns in the frame while - resizing; min_width and min_height aren't useful for this - purpose, since they might not give the dimensions for a - zero-row, zero-column frame. - - We use the base_width and base_height members if we have - them; otherwise, we set the min_width and min_height members - to the size for a zero x zero frame. */ - -#ifdef HAVE_X11R4 - size_hints.flags |= PBaseSize; - size_hints.base_width = base_width; - size_hints.base_height = base_height; - size_hints.min_width = base_width + min_cols * size_hints.width_inc; - size_hints.min_height = base_height + min_rows * size_hints.height_inc; -#else - size_hints.min_width = base_width; - size_hints.min_height = base_height; -#endif - } - - /* If we don't need the old flags, we don't need the old hint at all. */ + int base_width, base_height, width_inc, height_inc; + int min_rows = 0, min_cols = 0; + XSizeHints *size_hints; + + base_width = FRAME_TEXT_COLS_TO_PIXEL_WIDTH (f, 0); + base_height = FRAME_TEXT_LINES_TO_PIXEL_HEIGHT (f, 0); + width_inc = FRAME_COLUMN_WIDTH (f); + height_inc = FRAME_LINE_HEIGHT (f); + + check_frame_size (f, &min_rows, &min_cols); + + size_hints = FRAME_SIZE_HINTS (f); + if (size_hints == NULL) + { + size_hints = FRAME_SIZE_HINTS (f) = xmalloc (sizeof (XSizeHints)); + bzero (size_hints, sizeof (XSizeHints)); + } + + size_hints->flags |= PResizeInc | PMinSize | PBaseSize ; + size_hints->width_inc = width_inc; + size_hints->height_inc = height_inc; + size_hints->min_width = base_width + min_cols * width_inc; + size_hints->min_height = base_height + min_rows * height_inc; + size_hints->base_width = base_width; + size_hints->base_height = base_height; + if (flags) - { - size_hints.flags |= flags; - goto no_read; - } -#endif /* not USE_X_TOOLKIT */ - - { - XSizeHints hints; /* Sometimes I hate X Windows... */ - long supplied_return; - int value; - -#ifdef HAVE_X11R4 - value = XGetWMNormalHints (FRAME_X_DISPLAY (f), window, &hints, - &supplied_return); -#else - value = XGetNormalHints (FRAME_X_DISPLAY (f), window, &hints); -#endif - -#ifdef USE_X_TOOLKIT - size_hints.base_height = hints.base_height; - size_hints.base_width = hints.base_width; - size_hints.min_height = hints.min_height; - size_hints.min_width = hints.min_width; -#endif - - if (flags) - size_hints.flags |= flags; - else - { - if (value == 0) - hints.flags = 0; - if (hints.flags & PSize) - size_hints.flags |= PSize; - if (hints.flags & PPosition) - size_hints.flags |= PPosition; - if (hints.flags & USPosition) - size_hints.flags |= USPosition; - if (hints.flags & USSize) - size_hints.flags |= USSize; - } - } - -#ifndef USE_X_TOOLKIT - no_read: -#endif - -#ifdef PWinGravity - size_hints.win_gravity = f->win_gravity; - size_hints.flags |= PWinGravity; - - if (user_position) - { - size_hints.flags &= ~ PPosition; - size_hints.flags |= USPosition; - } -#endif /* PWinGravity */ - -#ifdef HAVE_X11R4 - XSetWMNormalHints (FRAME_X_DISPLAY (f), window, &size_hints); -#else - XSetNormalHints (FRAME_X_DISPLAY (f), window, &size_hints); -#endif -#endif /* MAC_TODO */ + size_hints->flags = flags; + else if (user_position) + { + size_hints->flags &= ~ PPosition; + size_hints->flags |= USPosition; + } } #if 0 /* MAC_TODO: hide application instead of iconify? */ @@ -6144,7 +6071,7 @@ break; sc = GetTextEncodingBase (encoding); decode_mac_font_name (name, sizeof (name), sc); - + /* Point the instance iterator at the current font family. */ if (FMResetFontFamilyInstanceIterator (ff, &ffii) != noErr) break; @@ -6283,6 +6210,19 @@ } +void +mac_clear_font_name_table () +{ + int i; + + for (i = 0; i < font_name_count; i++) + xfree (font_name_table[i]); + xfree (font_name_table); + font_name_table = NULL; + font_name_table_size = font_name_count = 0; +} + + enum xlfd_scalable_field_index { XLFD_SCL_PIXEL_SIZE, @@ -6333,7 +6273,10 @@ char *ptr; int scl_val[XLFD_SCL_LAST], *field, *val; char *longest_start, *cur_start, *nonspecial; - int longest_len, cur_len, exact; + int longest_len, exact; + + if (font_name_table == NULL) /* Initialize when first used. */ + init_font_name_table (); for (i = 0; i < XLFD_SCL_LAST; i++) scl_val[i] = -1; @@ -6392,7 +6335,7 @@ *ptr++ = '^'; longest_start = cur_start = ptr; - longest_len = cur_len = 0; + longest_len = 0; exact = 1; /* Turn pattern into a regexp and do a regexp match. Also find the @@ -6401,12 +6344,11 @@ { if (*pattern == '?' || *pattern == '*') { - if (cur_len > longest_len) + if (ptr - cur_start > longest_len) { longest_start = cur_start; - longest_len = cur_len; + longest_len = ptr - cur_start; } - cur_len = 0; exact = 0; if (*pattern == '?') @@ -6416,21 +6358,16 @@ *ptr++ = '.'; *ptr++ = '*'; } + cur_start = ptr; } else - { - if (cur_len == 0) - cur_start = ptr; - cur_len++; - - *ptr++ = tolower (*pattern); - } - } - - if (cur_len > longest_len) + *ptr++ = tolower (*pattern); + } + + if (ptr - cur_start > longest_len) { longest_start = cur_start; - longest_len = cur_len; + longest_len = ptr - cur_start; } *ptr = '$'; @@ -6495,9 +6432,6 @@ Lisp_Object newlist = Qnil, tem, key; struct mac_display_info *dpyinfo = f ? FRAME_MAC_DISPLAY_INFO (f) : NULL; - if (font_name_table == NULL) /* Initialize when first used. */ - init_font_name_table (); - if (dpyinfo) { tem = XCDR (dpyinfo->name_list_element); @@ -6511,7 +6445,9 @@ } } + BLOCK_INPUT; newlist = mac_do_list_fonts (SDATA (pattern), maxnames); + UNBLOCK_INPUT; /* MAC_TODO: add code for matching outline fonts here */ @@ -6815,6 +6751,18 @@ } +void +mac_unload_font (dpyinfo, font) + struct mac_display_info *dpyinfo; + XFontStruct *font; +{ + xfree (font->fontname); + if (font->per_char) + xfree (font->per_char); + xfree (font); +} + + /* Load font named FONTNAME of the size SIZE for frame F, and return a pointer to the structure font_info while allocating it dynamically. If SIZE is 0, load any size of font. @@ -6865,7 +6813,9 @@ if (size > 0 && !NILP (font_names)) fontname = (char *) SDATA (XCAR (font_names)); + BLOCK_INPUT; font = (MacFontStruct *) XLoadQueryFont (FRAME_MAC_DISPLAY (f), fontname); + UNBLOCK_INPUT; if (!font) return NULL; @@ -7147,15 +7097,21 @@ static pascal OSErr do_ae_open_documents (AppleEvent *, AppleEvent *, long); static pascal OSErr do_ae_quit_application (AppleEvent *, AppleEvent *, long); +#if TARGET_API_MAC_CARBON /* Drag and Drop */ -static OSErr init_mac_drag_n_drop (); +static pascal OSErr mac_do_track_drag (DragTrackingMessage, WindowPtr, void*, DragReference); static pascal OSErr mac_do_receive_drag (WindowPtr, void*, DragReference); +#endif #if USE_CARBON_EVENTS /* Preliminary Support for the OSX Services Menu */ static OSStatus mac_handle_service_event (EventHandlerCallRef,EventRef,void*); static void init_service_handler (); -#endif +/* Window Event Handler */ +static pascal OSStatus mac_handle_window_event (EventHandlerCallRef, + EventRef, void *); +#endif +OSErr install_window_handler (WindowPtr); extern void init_emacs_passwd_dir (); extern int emacs_main (int, char **, char **); @@ -7362,12 +7318,11 @@ { struct frame *f = mac_window_to_frame (win); - if (win == tip_window) - /* The tooltip has been drawn already. Avoid the - SET_FRAME_GARBAGED below. */ - return; - - if (f) + BeginUpdate (win); + + /* The tooltip has been drawn already. Avoid the SET_FRAME_GARBAGED + below. */ + if (win != tip_window) { if (f->async_visible == 0) { @@ -7384,17 +7339,30 @@ } else { - BeginUpdate (win); + Rect r; + handling_window_update = 1; - XClearWindow (FRAME_MAC_DISPLAY (f), FRAME_MAC_WINDOW (f)); - - expose_frame (f, 0, 0, 0, 0); +#if TARGET_API_MAC_CARBON + { + RgnHandle region = NewRgn (); + + GetPortVisibleRegion (GetWindowPort (win), region); + UpdateControls (win, region); + GetRegionBounds (region, &r); + DisposeRgn (region); + } +#else + UpdateControls (win, win->visRgn); + r = (*win->visRgn)->rgnBBox; +#endif + expose_frame (f, r.left, r.top, r.right - r.left, r.bottom - r.top); handling_window_update = 0; - EndUpdate (win); } } + + EndUpdate (win); } static int @@ -7556,20 +7524,43 @@ static void do_grow_window (WindowPtr w, EventRecord *e) { - long grow_size; Rect limit_rect; - int rows, columns; + int rows, columns, width, height; struct frame *f = mac_window_to_frame (w); - - SetRect(&limit_rect, MIN_DOC_SIZE, MIN_DOC_SIZE, MAX_DOC_SIZE, MAX_DOC_SIZE); - + XSizeHints *size_hints = FRAME_SIZE_HINTS (f); + int min_width = MIN_DOC_SIZE, min_height = MIN_DOC_SIZE; +#if TARGET_API_MAC_CARBON + Rect new_rect; +#else + long grow_size; +#endif + + if (size_hints->flags & PMinSize) + { + min_width = size_hints->min_width; + min_height = size_hints->min_height; + } + SetRect (&limit_rect, min_width, min_height, MAX_DOC_SIZE, MAX_DOC_SIZE); + +#if TARGET_API_MAC_CARBON + if (!ResizeWindow (w, e->where, &limit_rect, &new_rect)) + return; + height = new_rect.bottom - new_rect.top; + width = new_rect.right - new_rect.left; +#else grow_size = GrowWindow (w, e->where, &limit_rect); - /* see if it really changed size */ - if (grow_size != 0) - { - rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, HiWord (grow_size)); - columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, LoWord (grow_size)); + if (grow_size == 0) + return; + height = HiWord (grow_size); + width = LoWord (grow_size); +#endif + + if (width != FRAME_PIXEL_WIDTH (f) + || height != FRAME_PIXEL_HEIGHT (f)) + { + rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, height); + columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, width); x_set_window_size (f, 0, columns, rows); } @@ -7587,7 +7578,7 @@ GrafPtr save_port; Rect zoom_rect, port_rect; Point top_left; - int w_title_height, columns, rows; + int w_title_height, columns, rows, width, height; struct frame *f = mac_window_to_frame (w); #if TARGET_API_MAC_CARBON @@ -7662,20 +7653,25 @@ #else port_rect = w->portRect; #endif - rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, port_rect.bottom - port_rect.top); - columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, port_rect.right - port_rect.left); - x_set_window_size (f, 0, columns, rows); + height = port_rect.bottom - port_rect.top; + width = port_rect.right - port_rect.left; + + if (width != FRAME_PIXEL_WIDTH (f) + || height != FRAME_PIXEL_HEIGHT (f)) + { + rows = FRAME_PIXEL_HEIGHT_TO_TEXT_LINES (f, height); + columns = FRAME_PIXEL_WIDTH_TO_TEXT_COLS (f, width); + + change_frame_size (f, rows, columns, 0, 1, 0); + SET_FRAME_GARBAGED (f); + cancel_mouse_face (f); + + FRAME_PIXEL_WIDTH (f) = width; + FRAME_PIXEL_HEIGHT (f) = height; + } x_real_positions (f, &f->left_pos, &f->top_pos); } -/* Initialize Drag And Drop to allow files to be dropped onto emacs frames */ -static OSErr -init_mac_drag_n_drop () -{ - OSErr result = InstallReceiveHandler (mac_do_receive_drag, 0L, NULL); - return result; -} - /* Intialize AppleEvent dispatcher table for the required events. */ void init_required_apple_events () @@ -7845,7 +7841,102 @@ } return err; } -#endif + + +static pascal OSStatus +mac_handle_window_event (next_handler, event, data) + EventHandlerCallRef next_handler; + EventRef event; + void *data; +{ + extern Lisp_Object Qcontrol; + + WindowPtr wp; + OSStatus result; + UInt32 attributes; + XSizeHints *size_hints; + + GetEventParameter (event, kEventParamDirectObject, typeWindowRef, + NULL, sizeof (WindowPtr), NULL, &wp); + + switch (GetEventKind (event)) + { + case kEventWindowBoundsChanging: + result = CallNextEventHandler (next_handler, event); + if (result != eventNotHandledErr) + return result; + + GetEventParameter (event, kEventParamAttributes, typeUInt32, + NULL, sizeof (UInt32), NULL, &attributes); + size_hints = FRAME_SIZE_HINTS (mac_window_to_frame (wp)); + if ((attributes & kWindowBoundsChangeUserResize) + && ((size_hints->flags & (PResizeInc | PBaseSize | PMinSize)) + == (PResizeInc | PBaseSize | PMinSize))) + { + Rect bounds; + int width, height; + + GetEventParameter (event, kEventParamCurrentBounds, + typeQDRectangle, + NULL, sizeof (Rect), NULL, &bounds); + width = bounds.right - bounds.left; + height = bounds.bottom - bounds.top; + + if (width < size_hints->min_width) + width = size_hints->min_width; + else + width = size_hints->base_width + + (int) ((width - size_hints->base_width) + / (float) size_hints->width_inc + .5) + * size_hints->width_inc; + + if (height < size_hints->min_height) + height = size_hints->min_height; + else + height = size_hints->base_height + + (int) ((height - size_hints->base_height) + / (float) size_hints->height_inc + .5) + * size_hints->height_inc; + + bounds.right = bounds.left + width; + bounds.bottom = bounds.top + height; + SetEventParameter (event, kEventParamCurrentBounds, + typeQDRectangle, sizeof (Rect), &bounds); + return noErr; + } + break; + } + + return eventNotHandledErr; +} +#endif /* USE_CARBON_EVENTS */ + + +OSErr +install_window_handler (window) + WindowPtr window; +{ + OSErr err = noErr; +#if USE_CARBON_EVENTS + EventTypeSpec specs[] = {{kEventClassWindow, kEventWindowBoundsChanging}}; + static EventHandlerUPP handle_window_event_UPP = NULL; + + if (handle_window_event_UPP == NULL) + handle_window_event_UPP = NewEventHandlerUPP (mac_handle_window_event); + + err = InstallWindowEventHandler (window, handle_window_event_UPP, + GetEventTypeCount (specs), specs, + NULL, NULL); +#endif +#if TARGET_API_MAC_CARBON + if (err == noErr) + err = InstallTrackingHandler (mac_do_track_drag, window, NULL); + if (err == noErr) + err = InstallReceiveHandler (mac_do_receive_drag, window, NULL); +#endif + return err; +} + /* Open Application Apple Event */ static pascal OSErr @@ -7863,6 +7954,17 @@ /* Called when we receive an AppleEvent with an ID of "kAEOpenDocuments". This routine gets the direct parameter, extracts the FSSpecs in it, and puts their names on a list. */ +#pragma options align=mac68k +typedef struct SelectionRange { + short unused1; // 0 (not used) + short lineNum; // line to select (<0 to specify range) + long startRange; // start of selection range (if line < 0) + long endRange; // end of selection range (if line < 0) + long unused2; // 0 (not used) + long theDate; // modification date/time +} SelectionRange; +#pragma options align=reset + static pascal OSErr do_ae_open_documents(AppleEvent *message, AppleEvent *reply, long refcon) { @@ -7871,11 +7973,19 @@ AEKeyword keyword; DescType actual_type; Size actual_size; + SelectionRange position; err = AEGetParamDesc (message, keyDirectObject, typeAEList, &the_desc); if (err != noErr) goto descriptor_error_exit; + err = AEGetParamPtr (message, keyAEPosition, typeChar, &actual_type, &position, sizeof(SelectionRange), &actual_size); + if (err == noErr) + drag_and_drop_file_list = Fcons (list3 (make_number (position.lineNum + 1), + make_number (position.startRange + 1), + make_number (position.endRange + 1)), + drag_and_drop_file_list); + /* Check to see that we got all of the required parameters from the event descriptor. For an 'odoc' event this should just be the file list. */ @@ -7925,8 +8035,11 @@ fs.name) && mac_to_posix_pathname (path_name, unix_path_name, 255)) #endif - drag_and_drop_file_list = Fcons (build_string (unix_path_name), - drag_and_drop_file_list); + /* x-dnd functions expect undecoded filenames. */ + drag_and_drop_file_list = + Fcons (make_unibyte_string (unix_path_name, + strlen (unix_path_name)), + drag_and_drop_file_list); } } } @@ -7941,6 +8054,68 @@ } +#if TARGET_API_MAC_CARBON +static pascal OSErr +mac_do_track_drag (DragTrackingMessage message, WindowPtr window, + void *handlerRefCon, DragReference theDrag) +{ + static int can_accept; + short items; + short index; + ItemReference theItem; + FlavorFlags theFlags; + OSErr result; + + switch (message) + { + case kDragTrackingEnterHandler: + CountDragItems (theDrag, &items); + can_accept = 1; + for (index = 1; index <= items; index++) + { + GetDragItemReferenceNumber (theDrag, index, &theItem); + result = GetFlavorFlags (theDrag, theItem, flavorTypeHFS, &theFlags); + if (result != noErr) + { + can_accept = 0; + break; + } + } + break; + + case kDragTrackingEnterWindow: + if (can_accept) + { + RgnHandle hilite_rgn = NewRgn (); + Rect r; + + GetWindowPortBounds (window, &r); + OffsetRect (&r, -r.left, -r.top); + RectRgn (hilite_rgn, &r); + ShowDragHilite (theDrag, hilite_rgn, true); + DisposeRgn (hilite_rgn); + SetThemeCursor (kThemeCopyArrowCursor); + } + break; + + case kDragTrackingInWindow: + break; + + case kDragTrackingLeaveWindow: + if (can_accept) + { + HideDragHilite (theDrag); + SetThemeCursor (kThemeArrowCursor); + } + break; + + case kDragTrackingLeaveHandler: + break; + } + + return noErr; +} + static pascal OSErr mac_do_receive_drag (WindowPtr window, void *handlerRefCon, DragReference theDrag) @@ -7982,11 +8157,14 @@ data.fileSpec.parID, data.fileSpec.name) && mac_to_posix_pathname (path_name, unix_path_name, 255)) #endif - drag_and_drop_file_list = Fcons (build_string (unix_path_name), - drag_and_drop_file_list); + /* x-dnd functions expect undecoded filenames. */ + drag_and_drop_file_list = + Fcons (make_unibyte_string (unix_path_name, + strlen (unix_path_name)), + drag_and_drop_file_list); } else - return; + continue; } /* If there are items in the list, construct an event and post it to the queue like an interrupt using kbd_buffer_store_event. */ @@ -7995,12 +8173,14 @@ struct input_event event; Lisp_Object frame; struct frame *f = mac_window_to_frame (window); - SetPortWindowPort (window); + SInt16 modifiers; + GlobalToLocal (&mouse); + GetDragModifiers (theDrag, NULL, NULL, &modifiers); event.kind = DRAG_N_DROP_EVENT; event.code = 0; - event.modifiers = 0; + event.modifiers = mac_to_emacs_modifiers (modifiers); event.timestamp = TickCount () * (1000 / 60); XSETINT (event.x, mouse.h); XSETINT (event.y, mouse.v); @@ -8015,8 +8195,13 @@ GetCurrentProcess (&psn); SetFrontProcess (&psn); } - } -} + + return noErr; + } + else + return dragNotAcceptedErr; +} +#endif /* Print Document Apple Event */ @@ -8166,6 +8351,45 @@ return *xKeySym != 0; } +#if !USE_CARBON_EVENTS +static RgnHandle mouse_region = NULL; + +Boolean +mac_wait_next_event (er, sleep_time, dequeue) + EventRecord *er; + UInt32 sleep_time; + Boolean dequeue; +{ + static EventRecord er_buf = {nullEvent}; + UInt32 target_tick, current_tick; + EventMask event_mask; + + if (mouse_region == NULL) + mouse_region = NewRgn (); + + event_mask = everyEvent; + if (NILP (Fboundp (Qmac_ready_for_drag_n_drop))) + event_mask -= highLevelEventMask; + + current_tick = TickCount (); + target_tick = current_tick + sleep_time; + + if (er_buf.what == nullEvent) + while (!WaitNextEvent (event_mask, &er_buf, + target_tick - current_tick, mouse_region)) + { + current_tick = TickCount (); + if (target_tick <= current_tick) + return false; + } + + *er = er_buf; + if (dequeue) + er_buf.what = nullEvent; + return true; +} +#endif /* not USE_CARBON_EVENTS */ + /* Emacs calls this whenever it wants to read an input event from the user. */ int @@ -8177,9 +8401,7 @@ int count = 0; #if USE_CARBON_EVENTS EventRef eventRef; - EventTargetRef toolbox_dispatcher = GetEventDispatcherTarget (); -#else - EventMask event_mask; + EventTargetRef toolbox_dispatcher; #endif EventRecord er; struct mac_display_info *dpyinfo = &one_mac_display_info; @@ -8210,16 +8432,14 @@ if (terminate_flag) Fkill_emacs (make_number (1)); -#if !USE_CARBON_EVENTS - event_mask = everyEvent; - if (NILP (Fboundp (Qmac_ready_for_drag_n_drop))) - event_mask -= highLevelEventMask; - - while (WaitNextEvent (event_mask, &er, 0L, NULL)) -#else /* USE_CARBON_EVENTS */ +#if USE_CARBON_EVENTS + toolbox_dispatcher = GetEventDispatcherTarget (); + while (!ReceiveNextEvent (0, NULL, kEventDurationNoWait, kEventRemoveFromQueue, &eventRef)) -#endif /* USE_CARBON_EVENTS */ +#else /* !USE_CARBON_EVENTS */ + while (mac_wait_next_event (&er, 0, true)) +#endif /* !USE_CARBON_EVENTS */ { int do_help = 0; struct frame *f; @@ -8286,6 +8506,7 @@ SendEventToEventTarget (eventRef, toolbox_dispatcher); break; + default: /* Send the event to the appropriate receiver. */ SendEventToEventTarget (eventRef, toolbox_dispatcher); @@ -8523,6 +8744,10 @@ break; case mouseMovedMessage: +#if !USE_CARBON_EVENTS + SetRectRgn (mouse_region, er.where.h, er.where.v, + er.where.h + 1, er.where.v + 1); +#endif previous_help_echo_string = help_echo_string; help_echo_string = help_echo_object = help_echo_window = Qnil; help_echo_pos = -1; @@ -8723,21 +8948,21 @@ unsigned char ch = inev.code; ByteCount actual_input_length, actual_output_length; unsigned char outbuf[32]; - - convert_status = TECConvertText (converter, &ch, 1, - &actual_input_length, + + convert_status = TECConvertText (converter, &ch, 1, + &actual_input_length, outbuf, 1, - &actual_output_length); - if (convert_status == noErr - && actual_input_length == 1 - && actual_output_length == 1) + &actual_output_length); + if (convert_status == noErr + && actual_input_length == 1 + && actual_output_length == 1) inev.code = *outbuf; - + /* Reset internal states of the converter object. - If it fails, create another one. */ + If it fails, create another one. */ convert_status = TECFlushText (converter, outbuf, sizeof (outbuf), - &actual_output_length); + &actual_output_length); if (convert_status != noErr) { TECDisposeConverter (converter); @@ -8745,7 +8970,7 @@ kTextEncodingMacRoman, mac_keyboard_text_encoding); } - } + } } #if USE_CARBON_EVENTS @@ -8890,59 +9115,12 @@ } #endif - -/* Initialize the struct pointed to by MW to represent a new COLS x - ROWS Macintosh window, using font with name FONTNAME and size - FONTSIZE. */ -void -make_mac_frame (FRAME_PTR fp) -{ - mac_output *mwp; -#if TARGET_API_MAC_CARBON - static int making_terminal_window = 0; -#else - static int making_terminal_window = 1; -#endif - - mwp = fp->output_data.mac; - - BLOCK_INPUT; - if (making_terminal_window) - { - if (!(mwp->mWP = GetNewCWindow (TERM_WINDOW_RESOURCE, NULL, - (WindowPtr) -1))) - abort (); - making_terminal_window = 0; - } - else - { -#if TARGET_API_MAC_CARBON - Rect r; - - SetRect (&r, 0, 0, 1, 1); - if (CreateNewWindow (kDocumentWindowClass, - kWindowStandardDocumentAttributes - /* | kWindowToolbarButtonAttribute */, - &r, &mwp->mWP) != noErr) -#else - if (!(mwp->mWP = GetNewCWindow (WINDOW_RESOURCE, NULL, (WindowPtr) -1))) -#endif - abort (); - } - - SetWRefCon (mwp->mWP, (long) mwp); - /* so that update events can find this mac_output struct */ - mwp->mFP = fp; /* point back to emacs frame */ - - SizeWindow (mwp->mWP, FRAME_PIXEL_WIDTH (fp), FRAME_PIXEL_HEIGHT (fp), false); - UNBLOCK_INPUT; -} - - +#ifdef MAC_OS8 void make_mac_terminal_frame (struct frame *f) { Lisp_Object frame; + Rect r; XSETFRAME (frame, f); @@ -8966,10 +9144,17 @@ f->output_data.mac->mouse_pixel = 0xff00ff; f->output_data.mac->cursor_foreground_pixel = 0x0000ff; + f->output_data.mac->text_cursor = GetCursor (iBeamCursor); + f->output_data.mac->nontext_cursor = &arrow_cursor; + f->output_data.mac->modeline_cursor = &arrow_cursor; + f->output_data.mac->hand_cursor = &arrow_cursor; + f->output_data.mac->hourglass_cursor = GetCursor (watchCursor); + f->output_data.mac->horizontal_drag_cursor = &arrow_cursor; + FRAME_FONTSET (f) = -1; f->output_data.mac->explicit_parent = 0; - f->left_pos = 4; - f->top_pos = 4; + f->left_pos = 8; + f->top_pos = 32; f->border_width = 0; f->internal_border_width = 0; @@ -8980,7 +9165,20 @@ f->new_text_cols = 0; f->new_text_lines = 0; - make_mac_frame (f); + SetRect (&r, f->left_pos, f->top_pos, + f->left_pos + FRAME_PIXEL_WIDTH (f), + f->top_pos + FRAME_PIXEL_HEIGHT (f)); + + BLOCK_INPUT; + + if (!(FRAME_MAC_WINDOW (f) = + NewCWindow (NULL, &r, "\p", true, dBoxProc, + (WindowPtr) -1, 1, (long) f->output_data.mac))) + abort (); + /* so that update events can find this mac_output struct */ + f->output_data.mac->mFP = f; /* point back to emacs frame */ + + UNBLOCK_INPUT; x_make_gc (f); @@ -8996,9 +9194,8 @@ Fmodify_frame_parameters (frame, Fcons (Fcons (Qbackground_color, build_string ("white")), Qnil)); - - ShowWindow (f->output_data.mac->mWP); -} +} +#endif /*********************************************************************** @@ -9015,12 +9212,7 @@ bzero (dpyinfo, sizeof (*dpyinfo)); - /* Put it on x_display_name_list. */ - x_display_name_list = Fcons (Fcons (build_string ("Mac"), Qnil), - x_display_name_list); - dpyinfo->name_list_element = XCAR (x_display_name_list); - -#if 0 +#ifdef MAC_OSX dpyinfo->mac_id_name = (char *) xmalloc (SCHARS (Vinvocation_name) + SCHARS (Vsystem_name) @@ -9075,6 +9267,61 @@ dpyinfo->mouse_face_hidden = 0; } +/* Create an xrdb-style database of resources to supercede registry settings. + The database is just a concatenation of C strings, finished by an additional + \0. The string are submitted to some basic normalization, so + + [ *]option[ *]:[ *]value... + + becomes + + option:value... + + but any whitespace following value is not removed. */ + +static char * +mac_make_rdb (xrm_option) + char *xrm_option; +{ + char *buffer = xmalloc (strlen (xrm_option) + 2); + char *current = buffer; + char ch; + int in_option = 1; + int before_value = 0; + + do { + ch = *xrm_option++; + + if (ch == '\n') + { + *current++ = '\0'; + in_option = 1; + before_value = 0; + } + else if (ch != ' ') + { + *current++ = ch; + if (in_option && (ch == ':')) + { + in_option = 0; + before_value = 1; + } + else if (before_value) + { + before_value = 0; + } + } + else if (!(in_option || before_value)) + { + *current++ = ch; + } + } while (ch); + + *current = '\0'; + + return buffer; +} + struct mac_display_info * mac_term_init (display_name, xrm_option, resource_name) Lisp_Object display_name; @@ -9082,7 +9329,8 @@ char *resource_name; { struct mac_display_info *dpyinfo; - GDHandle main_device_handle; + + BLOCK_INPUT; if (!mac_initialized) { @@ -9090,17 +9338,90 @@ mac_initialized = 1; } - mac_initialize_display_info (display_name); + if (x_display_list) + error ("Sorry, this version can only handle one display"); + + mac_initialize_display_info (); dpyinfo = &one_mac_display_info; - main_device_handle = LMGetMainDevice(); - - dpyinfo->height = (**main_device_handle).gdRect.bottom; - dpyinfo->width = (**main_device_handle).gdRect.right; + dpyinfo->xrdb = xrm_option ? mac_make_rdb (xrm_option) : NULL; + + /* Put this display on the chain. */ + dpyinfo->next = x_display_list; + x_display_list = dpyinfo; + + /* Put it on x_display_name_list. */ + x_display_name_list = Fcons (Fcons (display_name, Qnil), + x_display_name_list); + dpyinfo->name_list_element = XCAR (x_display_name_list); + + UNBLOCK_INPUT; return dpyinfo; } +/* Get rid of display DPYINFO, assuming all frames are already gone. */ + +void +x_delete_display (dpyinfo) + struct mac_display_info *dpyinfo; +{ + int i; + + /* Discard this display from x_display_name_list and x_display_list. + We can't use Fdelq because that can quit. */ + if (! NILP (x_display_name_list) + && EQ (XCAR (x_display_name_list), dpyinfo->name_list_element)) + x_display_name_list = XCDR (x_display_name_list); + else + { + Lisp_Object tail; + + tail = x_display_name_list; + while (CONSP (tail) && CONSP (XCDR (tail))) + { + if (EQ (XCAR (XCDR (tail)), dpyinfo->name_list_element)) + { + XSETCDR (tail, XCDR (XCDR (tail))); + break; + } + tail = XCDR (tail); + } + } + + if (x_display_list == dpyinfo) + x_display_list = dpyinfo->next; + else + { + struct x_display_info *tail; + + for (tail = x_display_list; tail; tail = tail->next) + if (tail->next == dpyinfo) + tail->next = tail->next->next; + } + + /* Free the font names in the font table. */ + for (i = 0; i < dpyinfo->n_fonts; i++) + if (dpyinfo->font_table[i].name) + { + if (dpyinfo->font_table[i].name != dpyinfo->font_table[i].full_name) + xfree (dpyinfo->font_table[i].full_name); + xfree (dpyinfo->font_table[i].name); + } + + if (dpyinfo->font_table->font_encoder) + xfree (dpyinfo->font_table->font_encoder); + + xfree (dpyinfo->font_table); + xfree (dpyinfo->mac_id_name); + + if (x_display_list == 0) + { + mac_clear_font_name_table (); + bzero (dpyinfo, sizeof (*dpyinfo)); + } +} + #ifdef MAC_OSX void @@ -9359,13 +9680,10 @@ #endif BLOCK_INPUT; - mac_initialize_display_info (); #if TARGET_API_MAC_CARBON init_required_apple_events (); - init_mac_drag_n_drop (); - #if USE_CARBON_EVENTS init_service_handler (); @@ -9397,7 +9715,9 @@ Qsuper = intern ("super"); Fput (Qsuper, Qmodifier_value, make_number (super_modifier)); +#ifdef MAC_OSX Fprovide (intern ("mac-carbon"), Qnil); +#endif staticpro (&Qreverse); Qreverse = intern ("reverse"); diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/macterm.h --- a/src/macterm.h Sat Dec 25 02:31:08 2004 +0000 +++ b/src/macterm.h Sun Jan 02 09:13:19 2005 +0000 @@ -218,6 +218,9 @@ struct image_cache *image_cache; }; +/* This checks to make sure we have a display. */ +extern void check_mac P_ ((void)); + #define x_display_info mac_display_info /* This is a chain of structures for all the X displays currently in use. */ @@ -388,6 +391,9 @@ /* The background for which the above relief GCs were set up. They are changed only when a different background is involved. */ unsigned long relief_background; + + /* Hints for the size and the position of a window. */ + XSizeHints *size_hints; }; typedef struct mac_output mac_output; @@ -407,6 +413,8 @@ #define FRAME_BASELINE_OFFSET(f) ((f)->output_data.mac->baseline_offset) +#define FRAME_SIZE_HINTS(f) ((f)->output_data.mac->size_hints) + /* This gives the w32_display_info structure for the display F is on. */ #define FRAME_MAC_DISPLAY_INFO(f) (&one_mac_display_info) #define FRAME_X_DISPLAY_INFO(f) (&one_mac_display_info) @@ -596,6 +604,7 @@ extern void XSetForeground P_ ((Display *, GC, unsigned long)); extern void mac_draw_line_to_pixmap P_ ((Display *, Pixmap, GC, int, int, int, int)); +extern void mac_unload_font P_ ((struct mac_display_info *, XFontStruct *)); #define FONT_TYPE_FOR_UNIBYTE(font, ch) 0 #define FONT_TYPE_FOR_MULTIBYTE(font, ch) 0 diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/process.c --- a/src/process.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/process.c Sun Jan 02 09:13:19 2005 +0000 @@ -1291,7 +1291,7 @@ XSETFASTINT (minspace, 1); set_buffer_internal (XBUFFER (Vstandard_output)); - Fbuffer_disable_undo (Vstandard_output); + current_buffer->undo_list = Qt; current_buffer->truncate_lines = Qt; diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/window.c --- a/src/window.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/window.c Sun Jan 02 09:13:19 2005 +0000 @@ -4671,30 +4671,32 @@ not including the height of the header line if any. */ it.current_y = it.vpos = 0; - /* Preserve the screen position if we should. */ - if (preserve_y >= 0) - { - /* If we have a header line, take account of it. */ - if (WINDOW_WANTS_HEADER_LINE_P (w)) - preserve_y -= CURRENT_HEADER_LINE_HEIGHT (w); - - move_it_to (&it, -1, -1, preserve_y, -1, MOVE_TO_Y); - SET_PT_BOTH (IT_CHARPOS (it), IT_BYTEPOS (it)); - } - else + /* Move PT out of scroll margins. + This code wants current_y to be zero at the window start position + even if there is a header line. */ + this_scroll_margin = max (0, scroll_margin); + this_scroll_margin = min (this_scroll_margin, XFASTINT (w->total_lines) / 4); + this_scroll_margin *= FRAME_LINE_HEIGHT (it.f); + + if (n > 0) { - /* Move PT out of scroll margins. - This code wants current_y to be zero at the window start position - even if there is a header line. */ - this_scroll_margin = max (0, scroll_margin); - this_scroll_margin = min (this_scroll_margin, XFASTINT (w->total_lines) / 4); - this_scroll_margin *= FRAME_LINE_HEIGHT (it.f); - - if (n > 0) + /* We moved the window start towards ZV, so PT may be now + in the scroll margin at the top. */ + move_it_to (&it, PT, -1, -1, -1, MOVE_TO_POS); + if (IT_CHARPOS (it) == PT && it.current_y >= this_scroll_margin) + /* We found PT at a legitimate height. Leave it alone. */ + ; + else if (preserve_y >= 0) { - /* We moved the window start towards ZV, so PT may be now - in the scroll margin at the top. */ - move_it_to (&it, PT, -1, -1, -1, MOVE_TO_POS); + /* If we have a header line, take account of it. */ + if (WINDOW_WANTS_HEADER_LINE_P (w)) + preserve_y -= CURRENT_HEADER_LINE_HEIGHT (w); + + move_it_to (&it, -1, -1, preserve_y, -1, MOVE_TO_Y); + SET_PT_BOTH (IT_CHARPOS (it), IT_BYTEPOS (it)); + } + else + { while (it.current_y < this_scroll_margin) { int prev = it.current_y; @@ -4704,22 +4706,44 @@ } SET_PT_BOTH (IT_CHARPOS (it), IT_BYTEPOS (it)); } - else if (n < 0) + } + else if (n < 0) + { + int charpos, bytepos; + + /* Save our position, for the preserve_y case. */ + charpos = IT_CHARPOS (it); + bytepos = IT_BYTEPOS (it); + + /* We moved the window start towards BEGV, so PT may be now + in the scroll margin at the bottom. */ + move_it_to (&it, PT, -1, + it.last_visible_y - this_scroll_margin - 1, -1, + MOVE_TO_POS | MOVE_TO_Y); + + if (IT_CHARPOS (it) == PT) + /* We found PT before we found the display margin, so PT is ok. */ + ; + else if (preserve_y >= 0) { - int charpos, bytepos; - - /* We moved the window start towards BEGV, so PT may be now - in the scroll margin at the bottom. */ - move_it_to (&it, PT, -1, - it.last_visible_y - this_scroll_margin - 1, -1, - MOVE_TO_POS | MOVE_TO_Y); - + SET_TEXT_POS_FROM_MARKER (start, w->start); + start_display (&it, w, start); + /* If we have a header line, take account of it. */ + if (WINDOW_WANTS_HEADER_LINE_P (w)) + preserve_y -= CURRENT_HEADER_LINE_HEIGHT (w); + + move_it_to (&it, -1, -1, preserve_y, -1, MOVE_TO_Y); + SET_PT_BOTH (IT_CHARPOS (it), IT_BYTEPOS (it)); + } + else + { /* Save our position, in case it's correct. */ charpos = IT_CHARPOS (it); bytepos = IT_BYTEPOS (it); /* See if point is on a partially visible line at the end. */ move_it_by_lines (&it, 1, 1); + if (it.current_y > it.last_visible_y) /* The last line was only partially visible, so back up two lines to make sure we're on a fully visible line. */ @@ -6753,7 +6777,9 @@ DEFVAR_LISP ("scroll-preserve-screen-position", &Vscroll_preserve_screen_position, - doc: /* *Non-nil means scroll commands move point to keep its screen line unchanged. */); + doc: /* *Non-nil means scroll commands move point to keep its screen line unchanged. +This is only when it is impossible to keep point fixed and still +scroll as specified. */); Vscroll_preserve_screen_position = Qnil; DEFVAR_LISP ("window-configuration-change-hook", diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/xdisp.c --- a/src/xdisp.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/xdisp.c Sun Jan 02 09:13:19 2005 +0000 @@ -309,7 +309,7 @@ Lisp_Object Qslice; Lisp_Object Qcenter; Lisp_Object Qmargin, Qpointer; -Lisp_Object Qline_height, Qtotal; +Lisp_Object Qline_height; extern Lisp_Object Qheight; extern Lisp_Object QCwidth, QCheight, QCascent; extern Lisp_Object Qscroll_bar; @@ -817,7 +817,7 @@ static void setup_for_ellipsis P_ ((struct it *, int)); static void mark_window_display_accurate_1 P_ ((struct window *, int)); -static int single_display_prop_string_p P_ ((Lisp_Object, Lisp_Object)); +static int single_display_spec_string_p P_ ((Lisp_Object, Lisp_Object)); static int display_prop_string_p P_ ((Lisp_Object, Lisp_Object)); static int cursor_row_p P_ ((struct window *, struct glyph_row *)); static int redisplay_mode_lines P_ ((Lisp_Object, int)); @@ -839,7 +839,7 @@ static void x_consider_frame_title P_ ((Lisp_Object)); static void handle_stop P_ ((struct it *)); static int tool_bar_lines_needed P_ ((struct frame *)); -static int single_display_prop_intangible_p P_ ((Lisp_Object)); +static int single_display_spec_intangible_p P_ ((Lisp_Object)); static void ensure_echo_area_buffers P_ ((void)); static Lisp_Object unwind_with_echo_area_buffer P_ ((Lisp_Object)); static Lisp_Object with_echo_area_buffer_unwind_data P_ ((struct window *)); @@ -933,7 +933,7 @@ Lisp_Object)); static int face_before_or_after_it_pos P_ ((struct it *, int)); static int next_overlay_change P_ ((int)); -static int handle_single_display_prop P_ ((struct it *, Lisp_Object, +static int handle_single_display_spec P_ ((struct it *, Lisp_Object, Lisp_Object, struct text_pos *, int)); static int underlying_face_id P_ ((struct it *)); @@ -3282,7 +3282,10 @@ ***********************************************************************/ /* Set up iterator IT from `display' property at its current position. - Called from handle_stop. */ + Called from handle_stop. + We return HANDLED_RETURN if some part of the display property + overrides the display of the buffer text itself. + Otherwise we return HANDLED_NORMALLY. */ static enum prop_handled handle_display_prop (it) @@ -3290,6 +3293,7 @@ { Lisp_Object prop, object; struct text_pos *position; + /* Nonzero if some property replaces the display of the text itself. */ int display_replaced_p = 0; if (STRINGP (it->string)) @@ -3337,7 +3341,7 @@ { for (; CONSP (prop); prop = XCDR (prop)) { - if (handle_single_display_prop (it, XCAR (prop), object, + if (handle_single_display_spec (it, XCAR (prop), object, position, display_replaced_p)) display_replaced_p = 1; } @@ -3346,13 +3350,13 @@ { int i; for (i = 0; i < ASIZE (prop); ++i) - if (handle_single_display_prop (it, AREF (prop, i), object, + if (handle_single_display_spec (it, AREF (prop, i), object, position, display_replaced_p)) display_replaced_p = 1; } else { - if (handle_single_display_prop (it, prop, object, position, 0)) + if (handle_single_display_spec (it, prop, object, position, 0)) display_replaced_p = 1; } @@ -3384,42 +3388,44 @@ } -/* Set up IT from a single `display' sub-property value PROP. OBJECT +/* Set up IT from a single `display' specification PROP. OBJECT is the object in which the `display' property was found. *POSITION is the position at which it was found. DISPLAY_REPLACED_P non-zero - means that we previously saw a display sub-property which already + means that we previously saw a display specification which already replaced text display with something else, for example an image; - ignore such properties after the first one has been processed. - - If PROP is a `space' or `image' sub-property, set *POSITION to the - end position of the `display' property. + we ignore such properties after the first one has been processed. + + If PROP is a `space' or `image' specification, and in some other + cases too, set *POSITION to the position where the `display' + property ends. Value is non-zero if something was found which replaces the display of buffer or string text. */ static int -handle_single_display_prop (it, prop, object, position, +handle_single_display_spec (it, spec, object, position, display_replaced_before_p) struct it *it; - Lisp_Object prop; + Lisp_Object spec; Lisp_Object object; struct text_pos *position; int display_replaced_before_p; { - Lisp_Object value; - int replaces_text_display_p = 0; Lisp_Object form; - - /* If PROP is a list of the form `(when FORM . VALUE)', FORM is - evaluated. If the result is nil, VALUE is ignored. */ + Lisp_Object location, value; + struct text_pos start_pos; + int valid_p; + + /* If SPEC is a list of the form `(when FORM . VALUE)', evaluate FORM. + If the result is non-nil, use VALUE instead of SPEC. */ form = Qt; - if (CONSP (prop) && EQ (XCAR (prop), Qwhen)) - { - prop = XCDR (prop); - if (!CONSP (prop)) + if (CONSP (spec) && EQ (XCAR (spec), Qwhen)) + { + spec = XCDR (spec); + if (!CONSP (spec)) return 0; - form = XCAR (prop); - prop = XCDR (prop); + form = XCAR (spec); + spec = XCDR (spec); } if (!NILP (form) && !EQ (form, Qt)) @@ -3445,15 +3451,15 @@ if (NILP (form)) return 0; - if (CONSP (prop) - && EQ (XCAR (prop), Qheight) - && CONSP (XCDR (prop))) + /* Handle `(height HEIGHT)' specifications. */ + if (CONSP (spec) + && EQ (XCAR (spec), Qheight) + && CONSP (XCDR (spec))) { if (FRAME_TERMCAP_P (it->f) || FRAME_MSDOS_P (it->f)) return 0; - /* `(height HEIGHT)'. */ - it->font_height = XCAR (XCDR (prop)); + it->font_height = XCAR (XCDR (spec)); if (!NILP (it->font_height)) { struct face *face = FACE_FROM_ID (it->f, it->face_id); @@ -3494,7 +3500,6 @@ { /* Evaluate IT->font_height with `height' bound to the current specified height to get the new height. */ - Lisp_Object value; int count = SPECPDL_INDEX (); specbind (Qheight, face->lface[LFACE_HEIGHT_INDEX]); @@ -3508,29 +3513,35 @@ if (new_height > 0) it->face_id = face_with_height (it->f, it->face_id, new_height); } - } - else if (CONSP (prop) - && EQ (XCAR (prop), Qspace_width) - && CONSP (XCDR (prop))) - { - /* `(space_width WIDTH)'. */ + + return 0; + } + + /* Handle `(space_width WIDTH)'. */ + if (CONSP (spec) + && EQ (XCAR (spec), Qspace_width) + && CONSP (XCDR (spec))) + { if (FRAME_TERMCAP_P (it->f) || FRAME_MSDOS_P (it->f)) return 0; - value = XCAR (XCDR (prop)); + value = XCAR (XCDR (spec)); if (NUMBERP (value) && XFLOATINT (value) > 0) it->space_width = value; - } - else if (CONSP (prop) - && EQ (XCAR (prop), Qslice)) - { - /* `(slice X Y WIDTH HEIGHT)'. */ + + return 0; + } + + /* Handle `(slice X Y WIDTH HEIGHT)'. */ + if (CONSP (spec) + && EQ (XCAR (spec), Qslice)) + { Lisp_Object tem; if (FRAME_TERMCAP_P (it->f) || FRAME_MSDOS_P (it->f)) return 0; - if (tem = XCDR (prop), CONSP (tem)) + if (tem = XCDR (spec), CONSP (tem)) { it->slice.x = XCAR (tem); if (tem = XCDR (tem), CONSP (tem)) @@ -3544,17 +3555,20 @@ } } } - } - else if (CONSP (prop) - && EQ (XCAR (prop), Qraise) - && CONSP (XCDR (prop))) - { - /* `(raise FACTOR)'. */ + + return 0; + } + + /* Handle `(raise FACTOR)'. */ + if (CONSP (spec) + && EQ (XCAR (spec), Qraise) + && CONSP (XCDR (spec))) + { if (FRAME_TERMCAP_P (it->f) || FRAME_MSDOS_P (it->f)) return 0; #ifdef HAVE_WINDOW_SYSTEM - value = XCAR (XCDR (prop)); + value = XCAR (XCDR (spec)); if (NUMBERP (value)) { struct face *face = FACE_FROM_ID (it->f, it->face_id); @@ -3562,185 +3576,194 @@ * (FONT_HEIGHT (face->font))); } #endif /* HAVE_WINDOW_SYSTEM */ - } - else if (!it->string_from_display_prop_p) - { - /* `((margin left-margin) VALUE)' or `((margin right-margin) - VALUE) or `((margin nil) VALUE)' or VALUE. */ - Lisp_Object location, value; - struct text_pos start_pos; - int valid_p; - - /* Characters having this form of property are not displayed, so - we have to find the end of the property. */ - start_pos = *position; - *position = display_prop_end (it, object, start_pos); - value = Qnil; - - /* Let's stop at the new position and assume that all - text properties change there. */ - it->stop_charpos = position->charpos; - - if (CONSP (prop) - && (EQ (XCAR (prop), Qleft_fringe) - || EQ (XCAR (prop), Qright_fringe)) - && CONSP (XCDR (prop))) - { - int face_id = DEFAULT_FACE_ID; - int fringe_bitmap; - - /* Save current settings of IT so that we can restore them - when we are finished with the glyph property value. */ - - /* `(left-fringe BITMAP FACE)'. */ - if (FRAME_TERMCAP_P (it->f) || FRAME_MSDOS_P (it->f)) - return 0; + + return 0; + } + + /* Don't handle the other kinds of display specifications + inside a string that we got from a `display' property. */ + if (it->string_from_display_prop_p) + return 0; + + /* Characters having this form of property are not displayed, so + we have to find the end of the property. */ + start_pos = *position; + *position = display_prop_end (it, object, start_pos); + value = Qnil; + + /* Stop the scan at that end position--we assume that all + text properties change there. */ + it->stop_charpos = position->charpos; + + /* Handle `(left-fringe BITMAP [FACE])' + and `(right-fringe BITMAP [FACE])'. */ + if (CONSP (spec) + && (EQ (XCAR (spec), Qleft_fringe) + || EQ (XCAR (spec), Qright_fringe)) + && CONSP (XCDR (spec))) + { + int face_id = DEFAULT_FACE_ID; + int fringe_bitmap; + + if (FRAME_TERMCAP_P (it->f) || FRAME_MSDOS_P (it->f)) + /* If we return here, POSITION has been advanced + across the text with this property. */ + return 0; #ifdef HAVE_WINDOW_SYSTEM - value = XCAR (XCDR (prop)); - if (!SYMBOLP (value) - || !(fringe_bitmap = lookup_fringe_bitmap (value))) - return 0; - - if (CONSP (XCDR (XCDR (prop)))) - { - Lisp_Object face_name = XCAR (XCDR (XCDR (prop))); - int face_id2 = lookup_named_face (it->f, face_name, 0); - if (face_id2 >= 0) - face_id = face_id2; - } - - push_it (it); - - it->area = TEXT_AREA; + value = XCAR (XCDR (spec)); + if (!SYMBOLP (value) + || !(fringe_bitmap = lookup_fringe_bitmap (value))) + /* If we return here, POSITION has been advanced + across the text with this property. */ + return 0; + + if (CONSP (XCDR (XCDR (spec)))) + { + Lisp_Object face_name = XCAR (XCDR (XCDR (spec))); + int face_id2 = lookup_named_face (it->f, face_name, 0); + if (face_id2 >= 0) + face_id = face_id2; + } + + /* Save current settings of IT so that we can restore them + when we are finished with the glyph property value. */ + + push_it (it); + + it->area = TEXT_AREA; + it->what = IT_IMAGE; + it->image_id = -1; /* no image */ + it->position = start_pos; + it->object = NILP (object) ? it->w->buffer : object; + it->method = next_element_from_image; + it->face_id = face_id; + + /* Say that we haven't consumed the characters with + `display' property yet. The call to pop_it in + set_iterator_to_next will clean this up. */ + *position = start_pos; + + if (EQ (XCAR (spec), Qleft_fringe)) + { + it->left_user_fringe_bitmap = fringe_bitmap; + it->left_user_fringe_face_id = face_id; + } + else + { + it->right_user_fringe_bitmap = fringe_bitmap; + it->right_user_fringe_face_id = face_id; + } +#endif /* HAVE_WINDOW_SYSTEM */ + return 1; + } + + /* Prepare to handle `((margin left-margin) ...)', + `((margin right-margin) ...)' and `((margin nil) ...)' + prefixes for display specifications. */ + location = Qunbound; + if (CONSP (spec) && CONSP (XCAR (spec))) + { + Lisp_Object tem; + + value = XCDR (spec); + if (CONSP (value)) + value = XCAR (value); + + tem = XCAR (spec); + if (EQ (XCAR (tem), Qmargin) + && (tem = XCDR (tem), + tem = CONSP (tem) ? XCAR (tem) : Qnil, + (NILP (tem) + || EQ (tem, Qleft_margin) + || EQ (tem, Qright_margin)))) + location = tem; + } + + if (EQ (location, Qunbound)) + { + location = Qnil; + value = spec; + } + + /* After this point, VALUE is the property after any + margin prefix has been stripped. It must be a string, + an image specification, or `(space ...)'. + + LOCATION specifies where to display: `left-margin', + `right-margin' or nil. */ + + valid_p = (STRINGP (value) +#ifdef HAVE_WINDOW_SYSTEM + || (!FRAME_TERMCAP_P (it->f) && valid_image_p (value)) +#endif /* not HAVE_WINDOW_SYSTEM */ + || (CONSP (value) && EQ (XCAR (value), Qspace))); + + if (valid_p && !display_replaced_before_p) + { + /* Save current settings of IT so that we can restore them + when we are finished with the glyph property value. */ + push_it (it); + + if (NILP (location)) + it->area = TEXT_AREA; + else if (EQ (location, Qleft_margin)) + it->area = LEFT_MARGIN_AREA; + else + it->area = RIGHT_MARGIN_AREA; + + if (STRINGP (value)) + { + it->string = value; + it->multibyte_p = STRING_MULTIBYTE (it->string); + it->current.overlay_string_index = -1; + IT_STRING_CHARPOS (*it) = IT_STRING_BYTEPOS (*it) = 0; + it->end_charpos = it->string_nchars = SCHARS (it->string); + it->method = next_element_from_string; + it->stop_charpos = 0; + it->string_from_display_prop_p = 1; + /* Say that we haven't consumed the characters with + `display' property yet. The call to pop_it in + set_iterator_to_next will clean this up. */ + *position = start_pos; + } + else if (CONSP (value) && EQ (XCAR (value), Qspace)) + { + it->method = next_element_from_stretch; + it->object = value; + it->current.pos = it->position = start_pos; + } +#ifdef HAVE_WINDOW_SYSTEM + else + { it->what = IT_IMAGE; - it->image_id = -1; /* no image */ + it->image_id = lookup_image (it->f, value); it->position = start_pos; it->object = NILP (object) ? it->w->buffer : object; it->method = next_element_from_image; - it->face_id = face_id; /* Say that we haven't consumed the characters with `display' property yet. The call to pop_it in set_iterator_to_next will clean this up. */ *position = start_pos; - - if (EQ (XCAR (prop), Qleft_fringe)) - { - it->left_user_fringe_bitmap = fringe_bitmap; - it->left_user_fringe_face_id = face_id; - } - else - { - it->right_user_fringe_bitmap = fringe_bitmap; - it->right_user_fringe_face_id = face_id; - } + } #endif /* HAVE_WINDOW_SYSTEM */ - return 1; - } - - location = Qunbound; - if (CONSP (prop) && CONSP (XCAR (prop))) - { - Lisp_Object tem; - - value = XCDR (prop); - if (CONSP (value)) - value = XCAR (value); - - tem = XCAR (prop); - if (EQ (XCAR (tem), Qmargin) - && (tem = XCDR (tem), - tem = CONSP (tem) ? XCAR (tem) : Qnil, - (NILP (tem) - || EQ (tem, Qleft_margin) - || EQ (tem, Qright_margin)))) - location = tem; - } - - if (EQ (location, Qunbound)) - { - location = Qnil; - value = prop; - } - - valid_p = (STRINGP (value) -#ifdef HAVE_WINDOW_SYSTEM - || (!FRAME_TERMCAP_P (it->f) && valid_image_p (value)) -#endif /* not HAVE_WINDOW_SYSTEM */ - || (CONSP (value) && EQ (XCAR (value), Qspace))); - - if ((EQ (location, Qleft_margin) - || EQ (location, Qright_margin) - || NILP (location)) - && valid_p - && !display_replaced_before_p) - { - replaces_text_display_p = 1; - - /* Save current settings of IT so that we can restore them - when we are finished with the glyph property value. */ - push_it (it); - - if (NILP (location)) - it->area = TEXT_AREA; - else if (EQ (location, Qleft_margin)) - it->area = LEFT_MARGIN_AREA; - else - it->area = RIGHT_MARGIN_AREA; - - if (STRINGP (value)) - { - it->string = value; - it->multibyte_p = STRING_MULTIBYTE (it->string); - it->current.overlay_string_index = -1; - IT_STRING_CHARPOS (*it) = IT_STRING_BYTEPOS (*it) = 0; - it->end_charpos = it->string_nchars = SCHARS (it->string); - it->method = next_element_from_string; - it->stop_charpos = 0; - it->string_from_display_prop_p = 1; - /* Say that we haven't consumed the characters with - `display' property yet. The call to pop_it in - set_iterator_to_next will clean this up. */ - *position = start_pos; - } - else if (CONSP (value) && EQ (XCAR (value), Qspace)) - { - it->method = next_element_from_stretch; - it->object = value; - it->current.pos = it->position = start_pos; - } -#ifdef HAVE_WINDOW_SYSTEM - else - { - it->what = IT_IMAGE; - it->image_id = lookup_image (it->f, value); - it->position = start_pos; - it->object = NILP (object) ? it->w->buffer : object; - it->method = next_element_from_image; - - /* Say that we haven't consumed the characters with - `display' property yet. The call to pop_it in - set_iterator_to_next will clean this up. */ - *position = start_pos; - } -#endif /* HAVE_WINDOW_SYSTEM */ - } - else - /* Invalid property or property not supported. Restore - the position to what it was before. */ - *position = start_pos; - } - - return replaces_text_display_p; -} - - -/* Check if PROP is a display sub-property value whose text should be + + return 1; + } + + /* Invalid property or property not supported. Restore + POSITION to what it was before. */ + *position = start_pos; + return 0; +} + + +/* Check if SPEC is a display specification value whose text should be treated as intangible. */ static int -single_display_prop_intangible_p (prop) +single_display_spec_intangible_p (prop) Lisp_Object prop; { /* Skip over `when FORM'. */ @@ -3793,7 +3816,7 @@ /* A list of sub-properties. */ while (CONSP (prop)) { - if (single_display_prop_intangible_p (XCAR (prop))) + if (single_display_spec_intangible_p (XCAR (prop))) return 1; prop = XCDR (prop); } @@ -3803,11 +3826,11 @@ /* A vector of sub-properties. */ int i; for (i = 0; i < ASIZE (prop); ++i) - if (single_display_prop_intangible_p (AREF (prop, i))) + if (single_display_spec_intangible_p (AREF (prop, i))) return 1; } else - return single_display_prop_intangible_p (prop); + return single_display_spec_intangible_p (prop); return 0; } @@ -3816,7 +3839,7 @@ /* Return 1 if PROP is a display sub-property value containing STRING. */ static int -single_display_prop_string_p (prop, string) +single_display_spec_string_p (prop, string) Lisp_Object prop, string; { if (EQ (string, prop)) @@ -3861,7 +3884,7 @@ /* A list of sub-properties. */ while (CONSP (prop)) { - if (single_display_prop_string_p (XCAR (prop), string)) + if (single_display_spec_string_p (XCAR (prop), string)) return 1; prop = XCDR (prop); } @@ -3871,11 +3894,11 @@ /* A vector of sub-properties. */ int i; for (i = 0; i < ASIZE (prop); ++i) - if (single_display_prop_string_p (AREF (prop, i), string)) + if (single_display_spec_string_p (AREF (prop, i), string)) return 1; } else - return single_display_prop_string_p (prop, string); + return single_display_spec_string_p (prop, string); return 0; } @@ -4671,6 +4694,9 @@ visible_p = 0; } +#if 0 + /* Commenting this out fixes the bug described in + http://www.math.ku.dk/~larsh/emacs/emacs-loops-on-large-images/test-case.txt. */ if (visible_p) { struct it it2 = *it; @@ -4678,6 +4704,7 @@ if (handle_display_prop (&it2) == HANDLED_RETURN) visible_p = 0; } +#endif /* Back one more newline if the current one is invisible. */ if (!visible_p) @@ -6737,7 +6764,7 @@ } return 0; } - + /* Display an echo area message M with a specified length of NBYTES bytes. The string may include null characters. If M is 0, clear @@ -18872,24 +18899,16 @@ take_vertical_position_into_account (it); } -/* Calculate line-height and line-spacing properties. - An integer value specifies explicit pixel value. - A float value specifies relative value to current face height. - A cons (float . face-name) specifies relative value to - height of specified face font. - - Returns height in pixels, or nil. */ +/* Get line-height and line-spacing property at point. + If line-height has format (HEIGHT TOTAL), return TOTAL + in TOTAL_HEIGHT. */ static Lisp_Object -calc_line_height_property (it, prop, font, boff, total) +get_line_height_property (it, prop) struct it *it; Lisp_Object prop; - XFontStruct *font; - int boff, *total; { Lisp_Object position, val; - Lisp_Object face_name = Qnil; - int ascent, descent, height, override; if (STRINGP (it->object)) position = make_number (IT_STRING_CHARPOS (*it)); @@ -18898,32 +18917,43 @@ else return Qnil; - val = Fget_char_property (position, prop, it->object); - - if (NILP (val)) - return val; - - if (total && CONSP (val) && EQ (XCAR (val), Qtotal)) - { - *total = 1; - val = XCDR (val); - } - - if (INTEGERP (val)) + return Fget_char_property (position, prop, it->object); +} + +/* Calculate line-height and line-spacing properties. + An integer value specifies explicit pixel value. + A float value specifies relative value to current face height. + A cons (float . face-name) specifies relative value to + height of specified face font. + + Returns height in pixels, or nil. */ + + +static Lisp_Object +calc_line_height_property (it, val, font, boff, override) + struct it *it; + Lisp_Object val; + XFontStruct *font; + int boff, override; +{ + Lisp_Object face_name = Qnil; + int ascent, descent, height; + + if (NILP (val) || INTEGERP (val) || (override && EQ (val, Qt))) return val; if (CONSP (val)) { - face_name = XCDR (val); - val = XCAR (val); - } - else if (SYMBOLP (val)) - { - face_name = val; - val = Qnil; - } - - override = EQ (prop, Qline_height); + face_name = XCAR (val); + val = XCDR (val); + if (!NUMBERP (val)) + val = make_number (1); + if (NILP (face_name)) + { + height = it->ascent + it->descent; + goto scale; + } + } if (NILP (face_name)) { @@ -18966,6 +18996,8 @@ } height = ascent + descent; + + scale: if (FLOATP (val)) height = (int)(XFLOAT_DATA (val) * height); else if (INTEGERP (val)) @@ -19172,12 +19204,22 @@ increase that height */ Lisp_Object height; + Lisp_Object total_height = Qnil; it->override_ascent = -1; it->pixel_width = 0; it->nglyphs = 0; - height = calc_line_height_property(it, Qline_height, font, boff, 0); + height = get_line_height_property(it, Qline_height); + /* Split (line-height total-height) list */ + if (CONSP (height) + && CONSP (XCDR (height)) + && NILP (XCDR (XCDR (height)))) + { + total_height = XCAR (XCDR (height)); + height = XCAR (height); + } + height = calc_line_height_property(it, height, font, boff, 1); if (it->override_ascent >= 0) { @@ -19191,7 +19233,7 @@ it->descent = FONT_DESCENT (font) - boff; } - if (EQ (height, make_number(0))) + if (EQ (height, Qt)) { if (it->descent > it->max_descent) { @@ -19227,25 +19269,31 @@ && XINT (height) > it->ascent + it->descent) it->ascent = XINT (height) - it->descent; - spacing = calc_line_height_property(it, Qline_spacing, font, boff, &total); + if (!NILP (total_height)) + spacing = calc_line_height_property(it, total_height, font, boff, 0); + else + { + spacing = get_line_height_property(it, Qline_spacing); + spacing = calc_line_height_property(it, spacing, font, boff, 0); + } if (INTEGERP (spacing)) { extra_line_spacing = XINT (spacing); - if (total) + if (!NILP (total_height)) extra_line_spacing -= (it->phys_ascent + it->phys_descent); } } } else if (it->char_to_display == '\t') { - int tab_width = it->tab_width * FRAME_COLUMN_WIDTH (it->f); + int tab_width = it->tab_width * FRAME_SPACE_WIDTH (it->f); int x = it->current_x + it->continuation_lines_width; int next_tab_x = ((1 + x + tab_width - 1) / tab_width) * tab_width; /* If the distance from the current position to the next tab - stop is less than a canonical character width, use the + stop is less than a space character width, use the tab stop after that. */ - if (next_tab_x - x < FRAME_COLUMN_WIDTH (it->f)) + if (next_tab_x - x < FRAME_SPACE_WIDTH (it->f)) next_tab_x += tab_width; it->pixel_width = next_tab_x - x; @@ -22033,20 +22081,6 @@ } } -#ifdef HAVE_CARBON - /* Display scroll bar for this window. */ - if (!NILP (w->vertical_scroll_bar)) - { - /* ++KFS: - If this doesn't work here (maybe some header files are missing), - make a function in macterm.c and call it to do the job! */ - ControlHandle ch - = SCROLL_BAR_CONTROL_HANDLE (XSCROLL_BAR (w->vertical_scroll_bar)); - - Draw1Control (ch); - } -#endif - return mouse_face_overwritten_p; } @@ -22105,16 +22139,6 @@ return; } -#ifdef HAVE_CARBON - /* MAC_TODO: this is a kludge, but if scroll bars are not activated - or deactivated here, for unknown reasons, activated scroll bars - are shown in deactivated frames in some instances. */ - if (f == FRAME_MAC_DISPLAY_INFO (f)->x_focus_frame) - activate_scroll_bars (f); - else - deactivate_scroll_bars (f); -#endif - /* If basic faces haven't been realized yet, there is no point in trying to redraw anything. This can happen when we get an expose event while Emacs is starting, e.g. by moving another window. */ @@ -22319,8 +22343,6 @@ staticpro (&Qcenter); Qline_height = intern ("line-height"); staticpro (&Qline_height); - Qtotal = intern ("total"); - staticpro (&Qtotal); QCalign_to = intern (":align-to"); staticpro (&QCalign_to); QCrelative_width = intern (":relative-width"); diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/xfaces.c --- a/src/xfaces.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/xfaces.c Sun Jan 02 09:13:19 2005 +0000 @@ -1072,6 +1072,9 @@ #ifdef WINDOWSNT w32_unload_font (dpyinfo, font_info->font); #endif +#ifdef MAC_OS + mac_unload_font (dpyinfo, font_info->font); +#endif UNBLOCK_INPUT; /* Mark font table slot free. */ diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/xfns.c --- a/src/xfns.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/xfns.c Sun Jan 02 09:13:19 2005 +0000 @@ -5227,6 +5227,16 @@ XEvent event; x_menu_wait_for_event (0); XtAppNextEvent (Xt_app_con, &event); + if (event.type == KeyPress + && FRAME_X_DISPLAY (f) == event.xkey.display) + { + KeySym keysym = XLookupKeysym (&event.xkey, 0); + + /* Pop down on C-g. */ + if (keysym == XK_g && (event.xkey.state & ControlMask) != 0) + XtUnmanageChild (dialog); + } + (void) x_dispatch_event (&event, FRAME_X_DISPLAY (f)); } diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/xmenu.c --- a/src/xmenu.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/xmenu.c Sun Jan 02 09:13:19 2005 +0000 @@ -116,7 +116,7 @@ static Lisp_Object xdialog_show P_ ((FRAME_PTR, int, Lisp_Object, char **)); static void popup_get_selection P_ ((XEvent *, struct x_display_info *, - LWLIB_ID, int, int)); + LWLIB_ID, int)); /* Define HAVE_BOXES if menus can handle radio and toggle buttons. */ @@ -1186,24 +1186,21 @@ popped down (deactivated). This is used for x-popup-menu and x-popup-dialog; it is not used for the menu bar. - If DOWN_ON_KEYPRESS is nonzero, pop down if a key is pressed. - NOTE: All calls to popup_get_selection should be protected with BLOCK_INPUT, UNBLOCK_INPUT wrappers. */ static void -popup_get_selection (initial_event, dpyinfo, id, do_timers, down_on_keypress) +popup_get_selection (initial_event, dpyinfo, id, do_timers) XEvent *initial_event; struct x_display_info *dpyinfo; LWLIB_ID id; int do_timers; - int down_on_keypress; { XEvent event; while (popup_activated_flag) { - if (initial_event) + if (initial_event) { event = *initial_event; initial_event = 0; @@ -1232,20 +1229,15 @@ event.xbutton.state = 0; #endif } - /* If the user presses a key that doesn't go to the menu, - deactivate the menu. - The user is likely to do that if we get wedged. - All toolkits now pop down menus on ESC. - For dialogs however, the focus may not be on the dialog, so - in that case, we pop down. */ + /* Pop down on C-g and Escape. */ else if (event.type == KeyPress - && down_on_keypress && dpyinfo->display == event.xbutton.display) { KeySym keysym = XLookupKeysym (&event.xkey, 0); - if (!IsModifierKey (keysym) - && x_any_window_to_frame (dpyinfo, event.xany.window) != NULL) - popup_activated_flag = 0; + + if ((keysym == XK_g && (event.xkey.state & ControlMask) != 0) + || keysym == XK_Escape) /* Any escape, ignore modifiers. */ + popup_activated_flag = 0; } x_dispatch_event (&event, event.xany.display); @@ -2226,6 +2218,9 @@ } else { + char menuOverride[] = "Ctrlg: MenuGadgetEscape()"; + XtTranslations override = XtParseTranslationTable (menuOverride); + menubar_widget = lw_create_widget ("menubar", "menubar", id, first_wv, f->output_data.x->column_widget, 0, @@ -2234,6 +2229,9 @@ popup_deactivate_callback, menu_highlight_callback); f->output_data.x->menubar_widget = menubar_widget; + + /* Make menu pop down on C-g. */ + XtOverrideTranslations (menubar_widget, override); } { @@ -2597,7 +2595,7 @@ make_number (menu_id & ~(-1 << (fact))))); /* Process events that apply to the menu. */ - popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), menu_id, 1, 0); + popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), menu_id, 1); unbind_to (specpdl_count, Qnil); } @@ -2975,7 +2973,7 @@ make_number (dialog_id & ~(-1 << (fact))))); popup_get_selection ((XEvent *) 0, FRAME_X_DISPLAY_INFO (f), - dialog_id, 1, 1); + dialog_id, 1); unbind_to (count, Qnil); } @@ -3155,6 +3153,9 @@ } } } + else + /* Make "Cancel" equivalent to C-g. */ + Fsignal (Qquit, Qnil); return Qnil; } @@ -3500,7 +3501,13 @@ case XM_FAILURE: *error = "Can't activate menu"; case XM_IA_SELECT: + entry = Qnil; + break; case XM_NO_SELECT: + /* Make "Cancel" equivalent to C-g unless this menu was popped up by + a mouse press. */ + if (! for_click) + Fsignal (Qquit, Qnil); entry = Qnil; break; } diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/xterm.c --- a/src/xterm.c Sat Dec 25 02:31:08 2004 +0000 +++ b/src/xterm.c Sun Jan 02 09:13:19 2005 +0000 @@ -6006,6 +6006,14 @@ { x_check_fullscreen (f); +#ifdef USE_GTK + /* This seems to be needed for GTK 2.6. */ + x_clear_area (event.xexpose.display, + event.xexpose.window, + event.xexpose.x, event.xexpose.y, + event.xexpose.width, event.xexpose.height, + FALSE); +#endif if (f->async_visible == 0) { f->async_visible = 1; @@ -7850,7 +7858,8 @@ FRAME_BASELINE_OFFSET (f) = fontp->baseline_offset; FRAME_FONTSET (f) = -1; - FRAME_COLUMN_WIDTH (f) = FONT_WIDTH (FRAME_FONT (f)); + FRAME_COLUMN_WIDTH (f) = fontp->average_width; + FRAME_SPACE_WIDTH (f) = fontp->space_width; FRAME_LINE_HEIGHT (f) = FONT_HEIGHT (FRAME_FONT (f)); compute_fringe_widths (f, 1); @@ -9807,6 +9816,43 @@ fontp->name = (char *) xmalloc (strlen (fontname) + 1); bcopy (fontname, fontp->name, strlen (fontname) + 1); + if (font->min_bounds.width == font->max_bounds.width) + { + /* Fixed width font. */ + fontp->average_width = fontp->space_width = font->min_bounds.width; + } + else + { + XChar2b char2b; + XCharStruct *pcm; + + char2b.byte1 = 0x00, char2b.byte2 = 0x20; + pcm = x_per_char_metric (font, &char2b, 0); + if (pcm) + fontp->space_width = pcm->width; + else + fontp->space_width = FONT_WIDTH (font); + + fontp->average_width + = (XGetFontProperty (font, dpyinfo->Xatom_AVERAGE_WIDTH, &value) + ? (long) value / 10 : 0); + if (fontp->average_width < 0) + fontp->average_width = - fontp->average_width; + if (fontp->average_width == 0) + { + if (pcm) + { + int width = pcm->width; + for (char2b.byte2 = 33; char2b.byte2 <= 126; char2b.byte2++) + if ((pcm = x_per_char_metric (font, &char2b, 0)) != NULL) + width += pcm->width; + fontp->average_width = width / 95; + } + else + fontp->average_width = FONT_WIDTH (font); + } + } + /* Try to get the full name of FONT. Put it in FULL_NAME. */ full_name = 0; if (XGetFontProperty (font, XA_FONT, &value)) @@ -10588,6 +10634,8 @@ /* For properties of font. */ dpyinfo->Xatom_PIXEL_SIZE = XInternAtom (dpyinfo->display, "PIXEL_SIZE", False); + dpyinfo->Xatom_AVERAGE_WIDTH + = XInternAtom (dpyinfo->display, "AVERAGE_WIDTH", False); dpyinfo->Xatom_MULE_BASELINE_OFFSET = XInternAtom (dpyinfo->display, "_MULE_BASELINE_OFFSET", False); dpyinfo->Xatom_MULE_RELATIVE_COMPOSE diff -r fa0a5c4db2c8 -r 95879cc1ed20 src/xterm.h --- a/src/xterm.h Sat Dec 25 02:31:08 2004 +0000 +++ b/src/xterm.h Sun Jan 02 09:13:19 2005 +0000 @@ -317,7 +317,7 @@ /* More atoms for font properties. The last three are private properties, see the comments in src/fontset.h. */ - Atom Xatom_PIXEL_SIZE, + Atom Xatom_PIXEL_SIZE, Xatom_AVERAGE_WIDTH, Xatom_MULE_BASELINE_OFFSET, Xatom_MULE_RELATIVE_COMPOSE, Xatom_MULE_DEFAULT_ASCENT;