which included commits to RCS files with non-trunk default branches.
- uninstalling GNU ld.
+- configuring XEmacs with these environment settings (suggested by
+ Goran Koruga <goran.koruga@hermes.si>):
+ LD=/usr/ccs/bin/ld AS=/usr/ccs/bin/as configure
+
The Solaris2 FAQ claims:
When you install gcc, don't make the mistake of installing
*WARNING* The Motif menubar is currently broken.
--with-scrollbars=TYPE Use TYPE scrollbars
(lucid, motif, athena, or no).
---with-dialogs=TYPE Use TYPE dialog boxes (motif, athena, or no).
+--with-dialogs=TYPE Use TYPE dialog boxes (lucid, motif, athena, or no).
Lucid menubars and scrollbars are the default.
Motif dialog boxes will be used if Motif can be found.
---with-widgets=TYPE Use TYPE widgets (motif, athena, or no).
+--with-widgets=TYPE Use TYPE widgets (lucid, motif, athena, or no).
Motif widgets will be used if Motif can be found.
Other widget types are currently unsupported.
--with-dragndrop Compile in the generic drag and drop API. This is
automatically added if one of the drag and drop
- protocols is found (currently CDE, OffiX, MSWindows).
+ protocols is found (currently CDE, OffiX, MSWindows,
+ and GTK).
*WARNING* The Drag'n'drop support is under development
and is considered experimental.
--with-cde Compile in support for CDE drag and drop.
--mail-locking=TYPE (*) Specify the locking to be used by movemail to prevent
concurrent updates of mail spool files. Valid types
- are `lockf', `flock', and `dot'.
+ are `lockf', `flock', `dot', `locking' or `mmdf'.
--with-pop Support POP for mail retrieval.
--with-kerberos Support Kerberos-authenticated POP.
--with-hesiod Support Hesiod to get the POP server host.
+2001-10-23 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.5 "Civil Service" is released.
+
2001-07-28 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.4 "Artificial Intelligence" is released.
on the command line."
(unless noninteractive
(error "batch-update-autoloads is to be used only with -batch"))
- (let ((defdir default-directory)
+ (let ((defdir (directory-file-name default-directory))
(enable-local-eval nil)) ; Don't query in batch mode.
;; (message "Updating autoloads in %s..." generated-autoload-file)
(dolist (arg command-line-args-left)
(setq revert-buffer-function 'Buffer-menu-revert-function)
(setq truncate-lines t)
(setq buffer-read-only t)
- (make-local-variable 'mouse-track-click-hook) ; XEmacs
- (add-hook 'mouse-track-click-hook 'Buffer-menu-maybe-mouse-select) ; XEmacs
+ (make-local-hook 'mouse-track-click-hook) ; XEmacs
+ (add-hook 'mouse-track-click-hook 'Buffer-menu-maybe-mouse-select t t) ; XEmacs
(run-hooks 'buffer-menu-mode-hook))
(defun Buffer-menu-revert-function (ignore1 ignore2)
children)))
(defun Custom-save ()
- "Set all modified group members and save them."
+ "Set all modified options and save them."
(interactive)
- (let ((children custom-options))
+ (let ((all-children custom-options)
+ children)
(mapc (lambda (child)
(when (memq (widget-get child :custom-state) '(modified set))
- (widget-apply child :custom-save)))
- children))
- (custom-save-all))
+ (push child children)))
+ all-children)
+ (let ((the-children children)
+ child)
+ (while (setq child (pop the-children))
+ (widget-apply child :custom-pre-save)))
+ (custom-save-all)
+ (let ((the-children children)
+ child)
+ (while (setq child (pop the-children))
+ (widget-apply child :custom-post-save)))
+ ))
(defvar custom-reset-menu
'(("Current" . Custom-reset-current)
(defun Custom-reset-standard (&rest ignore)
"Reset all modified, set, or saved group members to their standard settings."
(interactive)
- (let ((children custom-options))
+ (let ((all-children custom-options)
+ children must-save)
(mapc (lambda (child)
(when (memq (widget-get child :custom-state) '(modified set saved))
- (widget-apply child :custom-reset-standard)))
- children)))
+ (push child children)))
+ all-children)
+ (let ((the-children children)
+ child)
+ (while (setq child (pop the-children))
+ (and (widget-apply child :custom-pre-reset-standard)
+ (setq must-save t))))
+ (and must-save (custom-save-all))
+ (let ((the-children children)
+ child)
+ (while (setq child (pop the-children))
+ (widget-apply child :custom-post-reset-standard)))
+ ))
\f
;;; The Customize Commands
:value-create 'custom-variable-value-create
:action 'custom-variable-action
:custom-set 'custom-variable-set
+ :custom-pre-save 'custom-variable-pre-save
:custom-save 'custom-variable-save
+ :custom-post-save 'custom-variable-post-save
:custom-reset-current 'custom-redraw
:custom-reset-saved 'custom-variable-reset-saved
- :custom-reset-standard 'custom-variable-reset-standard)
+ :custom-pre-reset-standard 'custom-variable-pre-reset-standard
+ :custom-reset-standard 'custom-variable-reset-standard
+ :custom-post-reset-standard 'custom-variable-post-reset-standard)
(defun custom-variable-type (symbol)
"Return a widget suitable for editing the value of SYMBOL.
(custom-variable-state-set widget)
(custom-redraw-magic widget)))
-(defun custom-variable-save (widget)
- "Set and save the value for the variable being edited by WIDGET."
+(defun custom-variable-pre-save (widget)
+ "Prepare for saving the value for the variable being edited by WIDGET."
(let* ((form (widget-get widget :custom-form))
(state (widget-get widget :custom-state))
(child (car (widget-get widget :children)))
(put symbol 'saved-variable-comment comment)))
(put symbol 'customized-value nil)
(put symbol 'customized-variable-comment nil)
- (custom-save-all)
- (custom-variable-state-set widget)
- (custom-redraw-magic widget)))
+ ))
+
+(defun custom-variable-post-save (widget)
+ "Finish saving the variable being edited by WIDGET."
+ (custom-variable-state-set widget)
+ (custom-redraw-magic widget))
+
+(defun custom-variable-save (widget)
+ "Set and save the value for the variable being edited by WIDGET."
+ (custom-variable-pre-save widget)
+ (custom-save-all)
+ (custom-variable-post-save widget))
(defun custom-variable-reset-saved (widget)
"Restore the saved value for the variable being edited by WIDGET."
;; This call will possibly make the comment invisible
(custom-redraw widget)))
-(defun custom-variable-reset-standard (widget)
- "Restore the standard setting for the variable being edited by WIDGET."
+;; This function returns non nil if we need to re-save the options --dv.
+(defun custom-variable-pre-reset-standard (widget)
+ "Prepare for restoring the variable being edited by WIDGET to its
+standard setting."
(let* ((symbol (widget-value widget))
(set (or (get symbol 'custom-set) 'set-default)))
(if (get symbol 'standard-value)
(if (null (cdr (get symbol 'theme-value)))
(put symbol 'theme-value nil))
(put symbol 'saved-variable-comment nil)
- (custom-save-all))
- (widget-put widget :custom-state 'unknown)
- ;; This call will possibly make the comment invisible
- (custom-redraw widget)))
+ widget)
+ ))
+
+(defun custom-variable-post-reset-standard (widget)
+ "Finish resetting the variable being edited by WIDGET to its standard
+value."
+ (widget-put widget :custom-state 'unknown)
+ ;; This call will possibly make the comment invisible
+ (custom-redraw widget))
+
+(defun custom-variable-reset-standard (widget)
+ "Restore the standard setting for the variable being edited by WIDGET."
+ (when (custom-variable-pre-reset-standard widget)
+ (custom-save-all))
+ (custom-variable-post-reset-standard widget))
;;; The `custom-face-edit' Widget.
:custom-category 'face
:custom-form nil ; defaults to value of `custom-face-default-form'
:custom-set 'custom-face-set
+ :custom-pre-save 'custom-face-pre-save
:custom-save 'custom-face-save
+ :custom-post-save 'custom-face-post-save
:custom-reset-current 'custom-redraw
:custom-reset-saved 'custom-face-reset-saved
+ :custom-pre-reset-standard 'custom-face-pre-reset-standard
:custom-reset-standard 'custom-face-reset-standard
+ :custom-post-reset-standard 'custom-face-post-reset-standard
:custom-menu 'custom-face-menu-create)
(define-widget 'custom-face-all 'editable-list
(custom-face-state-set widget)
(custom-redraw-magic widget)))
-(defun custom-face-save (widget)
- "Make the face attributes in WIDGET default."
+(defun custom-face-pre-save (widget)
+ "Prepare for saving the face being edited by WIDGET."
(let* ((symbol (widget-value widget))
(child (car (widget-get widget :children)))
(value (widget-value child))
(put symbol 'face-comment comment)
(put symbol 'customized-face-comment nil)
(put symbol 'saved-face-comment comment)
- (custom-save-all)
- (custom-face-state-set widget)
- (custom-redraw-magic widget)))
+ ))
+
+(defun custom-face-post-save (widget)
+ "Finish saving the face being edited by WIDGET."
+ (custom-face-state-set widget)
+ (custom-redraw-magic widget))
+
+(defun custom-face-save (widget)
+ "Save the face being edited by WIDGET."
+ (custom-face-pre-save widget)
+ (custom-save-all)
+ (custom-face-post-save widget))
(defun custom-face-reset-saved (widget)
- "Restore WIDGET to the face's default attributes."
+ "Reset the face being edited by WIDGET to its saved value."
(let* ((symbol (widget-value widget))
(child (car (widget-get widget :children)))
(value (get symbol 'saved-face))
(custom-face-state-set widget)
(custom-redraw-magic widget)))
-(defun custom-face-reset-standard (widget)
- "Restore WIDGET to the face's standard settings."
+;; This function returns non nil if we need to re-save the options --dv.
+(defun custom-face-pre-reset-standard (widget)
+ "Prepare for restoring the face edited by WIDGET to its standard
+settings."
(let* ((symbol (widget-value widget))
- (child (car (widget-get widget :children)))
- (value (get symbol 'face-defface-spec))
- (comment-widget (widget-get widget :comment-widget)))
+ (value (get symbol 'face-defface-spec)))
(unless value
(signal 'error (list "No standard setting for this face" symbol)))
(put symbol 'customized-face nil)
(if (null (cdr (get symbol 'theme-face)))
(put symbol 'theme-face nil))
(put symbol 'saved-face-comment nil)
- (custom-save-all))
+ widget)
+ ))
+
+(defun custom-face-post-reset-standard (widget)
+ "Finish restoring the face edited by WIDGET to its standard settings."
+ (let* ((symbol (widget-value widget))
+ (child (car (widget-get widget :children)))
+ (value (get symbol 'face-defface-spec))
+ (comment-widget (widget-get widget :comment-widget)))
(face-spec-set symbol value nil '(custom))
(put symbol 'face-comment nil)
(widget-value-set child value)
;; This call manages the comment visibility
(widget-value-set comment-widget "")
(custom-face-state-set widget)
- (custom-redraw-magic widget)))
+ (custom-redraw-magic widget)
+ ))
+
+(defun custom-face-reset-standard (widget)
+ "Restore the face edited by WIDGET to its standard settings."
+ (when (custom-face-pre-reset-standard widget)
+ (custom-save-all))
+ (custom-face-post-reset-standard widget))
+
;;; The `face' Widget.
:action 'custom-group-action
:custom-category 'group
:custom-set 'custom-group-set
+ :custom-pre-save 'custom-group-pre-save
:custom-save 'custom-group-save
+ :custom-post-save 'custom-group-post-save
:custom-reset-current 'custom-group-reset-current
:custom-reset-saved 'custom-group-reset-saved
+ :custom-pre-reset-standard 'custom-group-pre-reset-standard
:custom-reset-standard 'custom-group-reset-standard
+ :custom-post-reset-standard 'custom-group-post-reset-standard
:custom-menu 'custom-group-menu-create)
(defun custom-group-sample-face-get (widget)
(widget-apply child :custom-set)))
children)))
-(defun custom-group-save (widget)
+(defun custom-group-pre-save (widget)
+ "Prepare for saving all modified group members."
+ (let ((children (widget-get widget :children)))
+ (mapc (lambda (child)
+ (when (memq (widget-get child :custom-state) '(modified set))
+ (widget-apply child :custom-pre-save)))
+ children)))
+
+(defun custom-group-post-save (widget)
"Save all modified group members."
(let ((children (widget-get widget :children)))
(mapc (lambda (child)
(when (memq (widget-get child :custom-state) '(modified set))
- (widget-apply child :custom-save)))
+ (widget-apply child :custom-post-save)))
children)))
+(defun custom-group-save (widget)
+ "Save all modified group members."
+ (custom-group-pre-save widget)
+ (custom-save-all)
+ (custom-group-post-save widget))
+
(defun custom-group-reset-current (widget)
"Reset all modified group members."
(let ((children (widget-get widget :children)))
(widget-apply child :custom-reset-saved)))
children)))
-(defun custom-group-reset-standard (widget)
- "Reset all modified, set, or saved group members."
+;; This function returns non nil when we need to re-save the options --dv.
+(defun custom-group-pre-reset-standard (widget)
+ "Prepare for resetting all modified, set, or saved group members."
+ (let ((children (widget-get widget :children))
+ must-save)
+ (mapc (lambda (child)
+ (when (memq (widget-get child :custom-state)
+ '(modified set saved))
+ (and (widget-apply child :custom-pre-reset-standard)
+ (setq must-save t))))
+ children)
+ must-save
+ ))
+
+(defun custom-group-post-reset-standard (widget)
+ "Finish resetting all modified, set, or saved group members."
(let ((children (widget-get widget :children)))
(mapc (lambda (child)
(when (memq (widget-get child :custom-state)
'(modified set saved))
- (widget-apply child :custom-reset-standard)))
+ (widget-apply child :custom-post-reset-standard)))
children)))
+(defun custom-group-reset-standard (widget)
+ "Reset all modified, set, or saved group members."
+ (when (custom-group-pre-reset-standard widget)
+ (custom-save-all))
+ (custom-group-post-reset-standard widget))
+
(defun custom-group-state-update (widget)
"Update magic."
(unless (eq (widget-get widget :custom-state) 'hidden)
(defun custom-set-face-font-size (face size &optional locale tags)
"Set the font of FACE to SIZE."
- (let* ((font (apply 'face-font-name face locale))
+ ;; #### should this call have tags in it?
+ (let* ((font (apply 'face-font-name face (list locale)))
;; Gag
(fontobj (font-create-object font)))
(set-font-size fontobj size)
(defun custom-set-face-font-family (face family &optional locale tags)
"Set the font of FACE to FAMILY."
- (let* ((font (apply 'face-font-name face locale))
+ ;; #### should this call have tags in it?
+ (let* ((font (apply 'face-font-name face (list locale)))
;; Gag
(fontobj (font-create-object font)))
(set-font-family fontobj family)
the tag.
This version of this function supports multiple active tags tables,
-and completion.
+and completion. See also the commands `\\[push-tag-mark]' and
+`\\[pop-tag-mark]'.
Variables of note:
(defcustom tag-mark-stack-max 16
"*The maximum number of elements kept on the mark-stack used
by tags-search. See also the commands `\\[push-tag-mark]' and
-and `\\[pop-tag-mark]'."
+`\\[pop-tag-mark]'."
:type 'integer
:group 'etags)
'global)
(set-face-background-pixmap 'highlight
'(((x default mono) . "gray1")
-;; ((gtk default mono) . "gray1")
+ ((gtk default mono) . "gray1")
((mswindows default mono) . "gray1"))
'global)
'global)
(set-face-background-pixmap 'zmacs-region
'(((x default mono) . "gray3")
-;; ((gtk default mono) . "gray3")
+ ((gtk default mono) . "gray3")
((mswindows default mono) . "gray3"))
'global)
'(((x default color) . "gray68")
((x default grayscale) . "gray68")
((x default mono) . [default foreground])
-;; ((gtk default color) . "gray68")
-;; ((gtk default grayscale) . "gray68")
-;; ((gtk default mono) . [default foreground])
+ ((gtk default color) . "gray68")
+ ((gtk default grayscale) . "gray68")
+ ((gtk default mono) . [default foreground])
((mswindows default color) . "gray68")
((mswindows default grayscale) . "gray68")
((mswindows default mono) . [default foreground]))
'global)
(set-face-background-pixmap 'primary-selection
'(((x default mono) . "gray3")
- ;;((gtk default mono) . "gray3")
+ ((gtk default mono) . "gray3")
((mswindows default mono) . "gray3"))
'global)
'(((x default color) . "paleturquoise")
((x default color) . "green")
((x default grayscale) . "gray53")
- ;;((gtk default color) . "paleturquoise")
- ;;((gtk default color) . "green")
- ;;((gtk default grayscale) . "gray53")
+ ((gtk default color) . "paleturquoise")
+ ((gtk default color) . "green")
+ ((gtk default grayscale) . "gray53")
((mswindows default color) . "paleturquoise")
((mswindows default color) . "green")
((mswindows default grayscale) . "gray53"))
'global)
(set-face-background-pixmap 'secondary-selection
'(((x default mono) . "gray1")
- ;;((gtk default mono) . "gray1")
+ ((gtk default mono) . "gray1")
((mswindows default mono) . "gray1"))
'global)
(set-face-background 'isearch
'(((x default color) . "paleturquoise")
((x default color) . "green")
- ;;((gtk default color) . "paleturquoise")
- ;;((gtk default color) . "green")
+ ((gtk default color) . "paleturquoise")
+ ((gtk default color) . "green")
((mswindows default color) . "paleturquoise")
((mswindows default color) . "green"))
'global)
;; Copyright (C) 1992-1995, 1997 Free Software Foundation, Inc.
;; Copyright (C) 1995 Amdahl Corporation.
-;; Copyright (C) 1996, 2000 Ben Wing.
+;; Copyright (C) 1996, 2000, 2001 Ben Wing.
;; Author: Jamie Zawinski <jwz@jwz.org>, for the LISPM Preservation Society.
;; Minimally merged with FSF 19.34 by Barry Warsaw <bwarsaw@python.org>
(defun font-lock-after-change-function (beg end old-len)
(when font-lock-mode
;; treat deletions as if the following character (or previous, if
- ;; there is no following) were inserted. this is a bit of a hack
+ ;; there is no following) were inserted. (also use the previous
+ ;; character at end of line. this avoids a problem when you
+ ;; insert a comment on the line before a line of code: if we use
+ ;; the following char, then when you hit backspace, the following
+ ;; line of code turns the comment color.) this is a bit of a hack
;; but allows us to use text properties for everything.
(if (= beg end)
- (cond ((/= end (point-max)) (setq end (1+ end)))
+ (cond ((not (save-excursion (goto-char end) (eolp)))
+ (setq end (1+ end)))
((/= beg (point-min)) (setq beg (1- beg)))
(t nil)))
(put-text-property beg end 'font-lock-pending t)
(mail nil
(if addr
(concat (car addr) " <" (cdr addr) ">")
- (or (and (boundp 'report-emacs-bug-beta-address)
- report-emacs-bug-beta-address)
+ (or (and (boundp 'report-xemacs-bug-beta-address)
+ report-xemacs-bug-beta-address)
"<xemacs-beta@xemacs.org>"))
topic)
(goto-char (point-max))
["Find %_Packages" finder-by-keyword]
["View %_Splash Screen" xemacs-splash-buffer]
["%_Unix Manual..." manual-entry])
- ["Send %_Bug Report..." report-emacs-bug
- :active (fboundp 'report-emacs-bug)])))
+ ["Send %_Bug Report..." report-xemacs-bug
+ :active (fboundp 'report-xemacs-bug)])))
\f
(defun maybe-add-init-button ()
is initiated; otherwise the gesture is considered to be a click.
See `mouse-track'.
-The value should be either a number of a form to be evaluated to
+The value should be either a number or a form to be evaluated to
produce a number.")
(defvar mouse-track-y-threshold '(face-height 'default)
event ex)
t)))
-(defun mouse-track-run-hook (hook event &rest args)
+(defvar Mouse-track-gensym (gensym))
+
+(defun mouse-track-run-hook (hook override event &rest args)
;; ugh, can't use run-hook-with-args-until-success because we have
;; to get the value using symbol-value-in-buffer. Doing a
;; save-excursion/set-buffer is wrong because the hook might want to
;; the hook might not want to change the buffer.
;; #### What we need here is a Lisp interface to
;; run_hook_with_args_in_buffer. Here is a poor man's version.
- (let ((buffer (event-buffer event)))
- (and mouse-grabbed-buffer (setq buffer mouse-grabbed-buffer))
- (when buffer
- (let ((value (symbol-value-in-buffer hook buffer nil)))
- (if (and (listp value) (not (eq (car value) 'lambda)))
- ;; List of functions.
- (let (retval)
- (while (and value (null retval))
- ;; Found `t': should process default value. We could
- ;; splice it into the buffer-local value, but that
- ;; would cons, which is not a good thing for
- ;; mouse-track hooks.
- (if (eq (car value) t)
- (let ((global (default-value hook)))
- (if (and (listp global) (not (eq (car global) 'lambda)))
- ;; List of functions.
- (while (and global
- (null (setq retval
- (apply (car global) event args))))
- (pop global))
- ;; lambda
- (setq retval (apply (car global) event args))))
- (setq retval (apply (car value) event args)))
- (pop value))
- retval)
- ;; lambda
- (apply value event args))))))
+ (let ((overridden (plist-get override hook Mouse-track-gensym)))
+ (if (not (eq overridden Mouse-track-gensym))
+ (if (and (listp overridden) (not (eq (car overridden) 'lambda)))
+ (some #'(lambda (val) (apply val event args)) overridden)
+ (apply overridden event args))
+ (let ((buffer (event-buffer event)))
+ (and mouse-grabbed-buffer (setq buffer mouse-grabbed-buffer))
+ (when buffer
+ (let ((value (symbol-value-in-buffer hook buffer nil)))
+ (if (and (listp value) (not (eq (car value) 'lambda)))
+ ;; List of functions.
+ (let (retval)
+ (while (and value (null retval))
+ ;; Found `t': should process default value. We could
+ ;; splice it into the buffer-local value, but that
+ ;; would cons, which is not a good thing for
+ ;; mouse-track hooks.
+ (if (eq (car value) t)
+ (let ((global (default-value hook)))
+ (if (and (listp global) (not (eq (car global)
+ 'lambda)))
+ ;; List of functions.
+ (while (and global
+ (null (setq retval
+ (apply (car global)
+ event args))))
+ (pop global))
+ ;; lambda
+ (setq retval (apply (car global) event args))))
+ (setq retval (apply (car value) event args)))
+ (pop value))
+ retval)
+ ;; lambda
+ (apply value event args))))))))
(defun mouse-track-scroll-undefined (random)
;; the old implementation didn't actually define this function,
;; difficult to do), this function may get called.
)
-(defun mouse-track (event)
+(defun mouse-track (event &optional overriding-hooks)
"Generalized mouse-button handler. This should be bound to a mouse button.
The behavior of this function is customizable using various hooks and
variables: see `mouse-track-click-hook', `mouse-track-drag-hook',
any custom-supplied handlers, by using the function `mouse-track-default'
instead of `mouse-track'.
+\(In general, you can override specific hooks by using the argument
+OVERRIDING-HOOKS, which should be a plist of alternating hook names
+and values.)
+
Default behavior is as follows:
If you click-and-drag, the selection will be set to the region between the
(setq mouse-track-click-count (1+ mouse-track-click-count)))
(if (not (event-window event))
(error "Not over a window."))
- (mouse-track-run-hook 'mouse-track-down-hook
+ (mouse-track-run-hook 'mouse-track-down-hook overriding-hooks
event mouse-track-click-count)
(unwind-protect
(while mouse-down
(setq mouse-moved t))
(if mouse-moved
(mouse-track-run-hook 'mouse-track-drag-hook
- event mouse-track-click-count nil))
+ overriding-hooks
+ event mouse-track-click-count nil))
(mouse-track-set-timeout event))
((and (timeout-event-p event)
(eq (event-function event)
'mouse-track-scroll-undefined))
(if mouse-moved
(mouse-track-run-hook 'mouse-track-drag-hook
- (event-object event) mouse-track-click-count t))
+ overriding-hooks
+ (event-object event)
+ mouse-track-click-count t))
(mouse-track-set-timeout (event-object event)))
((button-release-event-p event)
(setq mouse-track-up-time (event-timestamp event))
(setq mouse-track-up-y (event-y-pixel event))
(setq mouse-down nil)
(mouse-track-run-hook 'mouse-track-up-hook
- event mouse-track-click-count)
+ overriding-hooks
+ event mouse-track-click-count)
(if mouse-moved
(mouse-track-run-hook 'mouse-track-drag-up-hook
- event mouse-track-click-count)
+ overriding-hooks
+ event mouse-track-click-count)
(mouse-track-run-hook 'mouse-track-click-hook
- event mouse-track-click-count)))
+ overriding-hooks
+ event mouse-track-click-count)))
((or (key-press-event-p event)
(and (misc-user-event-p event)
(eq (event-function event) 'cancel-mode-internal)))
(and (buffer-live-p buffer)
(save-excursion
(set-buffer buffer)
- (run-hooks 'mouse-track-cleanup-hook))))))
+ (let ((override (plist-get overriding-hooks
+ 'mouse-track-cleanup-hook
+ Mouse-track-gensym)))
+ (if (not (eq override Mouse-track-gensym))
+ (if (and (listp override) (not (eq (car override) 'lambda)))
+ (mapc #'funcall override)
+ (funcall override))
+ (run-hooks 'mouse-track-cleanup-hook))))))))
\f
;;;;;;;;;;;; default handlers: new version of mouse-track
;;
(and (eq (console-type) 'x)
(sit-for 0.15 t))
+ ;; zmacs-activate-region -> zmacs-activate-region-hook ->
+ ;; activate-region-as-selection -> either own-selection or
+ ;; mouse-track-activate-rectangular-selection
(zmacs-activate-region)))
((console-on-window-system-p)
+ ;; #### do we need this? we don't do it when zmacs-regions = t
(if (= start end)
(disown-selection type)
- (if (consp default-mouse-track-extent)
- ;; own the rectangular region
- ;; this is a hack
- (let ((r default-mouse-track-extent))
- (save-excursion
- (set-buffer (get-buffer-create " *rect yank temp buf*"))
- (while r
- (insert (extent-string (car r)) "\n")
- (setq r (cdr r)))
- (own-selection (buffer-substring (point-min) (point-max)))
- (kill-buffer (current-buffer))))
- (own-selection (cons (set-marker (make-marker) start)
- (set-marker (make-marker) end))
- type)))))
+ (activate-region-as-selection))))
(if (and (eq 'x (console-type))
(not (= start end)))
;; I guess cutbuffers should do something with rectangles too.
;; does anybody use them?
- (x-store-cutbuffer (buffer-substring start end)))))
+ (x-store-cutbuffer (buffer-substring start end)))))
+
+(defun mouse-track-activate-rectangular-selection ()
+ (if (consp default-mouse-track-extent)
+ ;; own the rectangular region
+ ;; this is a hack
+ (let ((r default-mouse-track-extent))
+ (save-excursion
+ (set-buffer (get-buffer-create " *rect yank temp buf*"))
+ (erase-buffer)
+ (while r
+ (insert (extent-string (car r)) "\n")
+ (setq r (cdr r)))
+ (own-selection (buffer-substring (point-min) (point-max)))))))
(defun default-mouse-track-deal-with-down-event (click-count)
(let ((event default-mouse-track-down-event))
(defun mouse-track-default (event)
"Invoke `mouse-track' with only the default handlers active."
(interactive "e")
- (let ((mouse-track-down-hook 'default-mouse-track-down-hook)
- (mouse-track-drag-hook 'default-mouse-track-drag-hook)
- (mouse-track-drag-up-hook 'default-mouse-track-drag-up-hook)
- (mouse-track-click-hook 'default-mouse-track-click-hook)
- (mouse-track-cleanup-hook 'default-mouse-track-cleanup-hook))
- (mouse-track event)))
+ (mouse-track event
+ '(mouse-track-down-hook
+ default-mouse-track-down-hook
+ mouse-track-up-hook nil
+ mouse-track-drag-hook default-mouse-track-drag-hook
+ mouse-track-drag-up-hook default-mouse-track-drag-up-hook
+ mouse-track-click-hook default-mouse-track-click-hook
+ mouse-track-cleanup-hook default-mouse-track-cleanup-hook)))
(defun mouse-track-do-rectangle (event)
"Like `mouse-track' but selects rectangles instead of regions."
(let ((default-mouse-track-adjust t))
(mouse-track-default event)))
-(defvar mouse-track-insert-selected-region nil)
-
-(defun mouse-track-insert-drag-up-hook (event click-count)
- (setq mouse-track-insert-selected-region
- (default-mouse-track-return-dragged-selection event)))
-
(defun mouse-track-insert (event &optional delete)
"Make a selection with the mouse and insert it at point.
This is exactly the same as the `mouse-track' command on \\[mouse-track],
except that point is not moved; the selected text is immediately inserted
after being selected\; and the selection is immediately disowned afterwards."
(interactive "*e")
- (setq mouse-track-insert-selected-region nil)
- (let ((mouse-track-drag-up-hook 'mouse-track-insert-drag-up-hook)
- (mouse-track-click-hook 'mouse-track-insert-click-hook)
- s)
- (save-excursion
- (save-window-excursion
- (mouse-track event)
- (if (consp mouse-track-insert-selected-region)
- (let ((pair mouse-track-insert-selected-region))
- (setq s (prog1
- (buffer-substring (car pair) (cdr pair))
- (if delete
- (kill-region (car pair) (cdr pair)))))))))
- (or (null s) (equal s "") (insert s))))
-
-(defun mouse-track-insert-click-hook (event click-count)
- (default-mouse-track-drag-hook event click-count nil)
- (mouse-track-insert-drag-up-hook event click-count)
- t)
+ (let (s selreg)
+ (flet ((Mouse-track-insert-drag-up-hook (event count)
+ (setq selreg
+ (default-mouse-track-return-dragged-selection event))
+ t)
+ (Mouse-track-insert-click-hook (event count)
+ (default-mouse-track-drag-hook event count nil)
+ (setq selreg
+ (default-mouse-track-return-dragged-selection event))
+ t))
+ (save-excursion
+ (save-window-excursion
+ (mouse-track
+ event
+ '(mouse-track-drag-up-hook
+ Mouse-track-insert-drag-up-hook
+ mouse-track-click-hook
+ Mouse-track-insert-click-hook))
+ (if (consp selreg)
+ (let ((pair selreg))
+ (setq s (prog1
+ (buffer-substring (car pair) (cdr pair))
+ (if delete
+ (kill-region (car pair) (cdr pair))))))))))
+ (or (null s) (equal s "") (insert s))))
(defun mouse-track-delete-and-insert (event)
"Make a selection with the mouse and insert it at point.
"Executing external commands."
:group 'processes)
+;; This may be changed to "/c" in win32-native.el.
(defvar shell-command-switch "-c"
"Switch used to have the shell execute its command line argument.")
(when (and stderr (not (eq t stderr)))
(setq stderr (expand-file-name stderr))
(setq errbuf (generate-new-buffer "*call-process*")))
- (setq proc
- (apply 'start-process-internal "*call-process*"
- buffer
- ;#### not implemented until my new process
- ;changes go in.
- ;(if (eq t stderr) buffer (list buffer errbuf))
- program args))
+ ;; We read INFILE using the binary coding-system.
+ ;; We must feed the process using the same coding-system, so
+ ;; that it really receives the contents of INFILE.
+ (let ((coding-system-for-write 'binary))
+ (setq proc
+ (apply 'start-process-internal "*call-process*"
+ buffer
+ ;#### not implemented until my new process
+ ;changes go in.
+ ;(if (eq t stderr) buffer (list buffer errbuf))
+ program args)))
(if buffer
(set-marker (process-mark proc) (point buffer) buffer))
(unwind-protect
;; around shell metachars gets through the last two, and applying
;; the normal VC runtime quoting works with practically all apps.
(mswindows-quote-one-vc-runtime-arg argument t)
- ;; Quote everything except POSIX filename characters.
- ;; This should be safe enough even for really weird shells.
- (let ((result "") (start 0) end)
- (while (string-match "[^-0-9a-zA-Z_./]" argument start)
- (setq end (match-beginning 0)
- result (concat result (substring argument start end)
- "\\" (substring argument end (1+ end)))
- start (1+ end)))
- (concat result (substring argument start)))))
+ (if (equal argument "")
+ "\"\""
+ ;; Quote everything except POSIX filename characters.
+ ;; This should be safe enough even for really weird shells.
+ (let ((result "") (start 0) end)
+ (while (string-match "[^-0-9a-zA-Z_./]" argument start)
+ (setq end (match-beginning 0)
+ result (concat result (substring argument start end)
+ "\\" (substring argument end (1+ end)))
+ start (1+ end)))
+ (concat result (substring argument start))))))
(defun shell-command-to-string (command)
"Execute shell command COMMAND and return its output as a string."
(defcustom toolbar-visible-p ;; added for the options menu - dverna apr. 98
(specifier-instance default-toolbar-visible-p)
- "Whether the default toolbar is globally visible. This option can be
-customized through the options menu."
+ "Whether the default toolbar is globally visible.
+This option can be customized through the options menu."
:group 'display
:type 'boolean
:set #'(lambda (var val)
(defcustom toolbar-captioned-p ;; added for the options menu - dverna apr. 98
(specifier-instance toolbar-buttons-captioned-p)
- "Whether the toolbars buttons are globally captioned. This option can be
-customized through the options menu."
+ "Whether the toolbars buttons are globally captioned.
+This option can be customized through the options menu."
:group 'display
:type 'boolean
:set #'(lambda (var val)
(defcustom default-toolbar-position ;; added for the options menu - dverna
(default-toolbar-position)
- "The location of the default toolbar. It can be 'top, 'bottom, 'left or
-'right. This option can be customized through the options menu."
+ "The location of the default toolbar.
+It can be 'top, 'bottom, 'left or 'right. This option can be
+customized through the options menu."
:group 'display
:type '(choice (const :tag "top" top)
(const :tag "bottom" bottom)
+2001-10-23 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.5 "Civil Service" is released.
+
+2001-10-02 Darryl Okahata <darrylo@sonic.net>
+
+ * If HAVE_XMU was not defined (xmu was not being used), xlwgcs.c
+ was still referencing xmu functions.
+
+2001-04-08 Danny Colascione <qtmstr@optonline.net>
+
+ * lwlib-Xlw.c:
+ xlwtabs.c:
+ xlwtabs.h:
+ Force buffer-tab highlight update when moving the buffer, avoiding
+ an ugly black border, used for keyboard focus indication, on a
+ widget that can never have keyboard focus, the buffer tab.
+
+2001-07-26 Andy Piper <andy@xemacs.org>
+
+ Fix progress gauge flashing under OpenMotif:
+
+ * lwlib-Xm.c (xm_update_progress): new function. Set Scale height
+ and width from normal height and width.
+ * lwlib-Xm.c (xm_create_progress): ditto.
+ * lwlib-Xm.c (xm_update_one_widget): call xm_update_progress.
+ * lwlib.c (lw_get_value_arg): new function. Return an argument
+ based on its name.
+ * lwlib.h: declare it.
+
2001-07-28 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.4 "Artificial Intelligence" is released.
#include "../src/xmu.h"
#include "xlwtabs.h"
#endif
-
\f
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xaw/Form.h>
+#include <X11/Xaw/Command.h>
+
+
#ifdef LWLIB_MENUBARS_LUCID
/* Menu callbacks */
XtSetArg (al [0], XtNmenu, instance->info->val);
XtSetArg (al [1], XtNhorizontal, False);
widget = XtCreateManagedWidget ("popup", xlwMenuWidgetClass,
- popup_shell, al, 2);
- XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
-
+ popup_shell, al, 2);
+ XtAddCallback (widget, XtNselect, pick_hook, (XtPointer)instance);
return popup_shell;
}
#endif /* LWLIB_MENUBARS_LUCID */
XtAddCallback (widget, XmNactivateCallback, xm_generic_callback, instance);
}
+static void
+xm_update_progress (widget_instance* instance, Widget scale,
+ widget_value* val)
+{
+ Arg al[20];
+ int ac = 0;
+ Dimension height = 0;
+ Dimension width = 0;
+ if (!val->call_data)
+ {
+ XtSetArg (al [ac], XmNeditable, False); ac++;
+ }
+ else
+ {
+ XtSetArg (al [ac], XmNeditable, val->enabled); ac++;
+ }
+ height = (Dimension)lw_get_value_arg (val, XtNheight);
+ width = (Dimension)lw_get_value_arg (val, XtNwidth);
+ if (height > 0)
+ {
+ XtSetArg (al [ac], XmNscaleHeight, height); ac++;
+ }
+ if (width > 0)
+ {
+ XtSetArg (al [ac], XmNscaleWidth, width); ac++;
+ }
+
+ XtSetValues (scale, al, 1);
+}
+
#ifdef LWLIB_MENUBARS_MOTIF
static void
xm_update_scrollbar (instance, widget, val);
}
#endif
+ else if (class == xmScaleWidgetClass)
+ {
+ xm_update_progress (instance, widget, val);
+ }
/* Lastly update our global arg values. */
if (val->args && val->args->nargs)
XtSetValues (widget, val->args->args, val->args->nargs);
if (radiobox)
{
CompositeWidget radio = (CompositeWidget)widget;
- int i;
+ unsigned int i;
for (i = 0; i < radio->composite.num_children; i++)
{
int set = False;
{
Arg al[20];
int ac = 0;
+ Dimension height = 0;
+ Dimension width = 0;
Widget scale = 0;
widget_value* val = instance->info->val;
-#if 0 /* This looks too awful, although more correct. */
if (!val->call_data)
{
- XtSetArg (al [ac], XmNsensitive, False); ac++;
+ XtSetArg (al [ac], XmNeditable, False); ac++;
}
else
{
- XtSetArg (al [ac], XmNsensitive, val->enabled); ac++;
+ XtSetArg (al [ac], XmNeditable, val->enabled); ac++;
}
-#else
- XtSetArg (al [ac], XmNsensitive, True); ac++;
-#endif
XtSetArg (al [ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
XtSetArg (al [ac], XmNuserData, val->call_data); ac++;
XtSetArg (al [ac], XmNmappedWhenManaged, FALSE); ac++;
look ugly. I think this may be a LessTif bug but for now we just
get rid of it. */
XtSetArg (al [ac], XmNhighlightThickness, (Dimension)0);ac++;
+
+ height = (Dimension)lw_get_value_arg (val, XtNheight);
+ width = (Dimension)lw_get_value_arg (val, XtNwidth);
+ if (height > 0)
+ {
+ XtSetArg (al [ac], XmNscaleHeight, height); ac++;
+ }
+ if (width > 0)
+ {
+ XtSetArg (al [ac], XmNscaleWidth, width); ac++;
+ }
+
/* add any args the user supplied for creation time */
lw_add_value_args_to_args (val, al, &ac);
}
}
+XtArgVal lw_get_value_arg (widget_value* wv, String name)
+{
+ int i;
+ if (wv->args)
+ {
+ for (i = 0; i < wv->args->nargs; i++)
+ {
+ if (!strcmp (wv->args->args[i].name, name))
+ {
+ return wv->args->args[i].value;
+ }
+ }
+ }
+ return (XtArgVal)0;
+}
+
void lw_add_widget_value_arg (widget_value* wv, String name, XtArgVal value)
{
int i = 0;
void lw_pop_down_all_widgets (LWLIB_ID id);
void lw_add_value_args_to_args (widget_value* wv, ArgList addto, int* offset);
void lw_add_widget_value_arg (widget_value* wv, String name, XtArgVal value);
+XtArgVal lw_get_value_arg (widget_value* wv, String name);
void lw_copy_widget_value_args (widget_value* copy, widget_value* val);
widget_value * copy_widget_value_tree (widget_value *val, change_type change);
+2001-10-23 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.5 "Civil Service" is released.
+
+2001-10-17 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * xemacs/text.texi (Outline Visibility): hide-subtree is bound to
+ C-c C-d, not C-c C-h. Thanks: Keith Browne <kbrowne@legato.com>.
+
+2001-07-25 Jim Horning <jim.horning@lmco.com>
+
+ * xemacs/packages.texi (Package Terminology):
+ * xemacs/packages.texi (Automatically):
+ In itemize and enumerate lists @item should be on its own line.
+
+2001-09-16 Adrian Aichner <adrian@xemacs.org>
+
+ * xemacs-faq.texi (Q4.0.7): Fix link to VM FAQ thanks to word I
+ got from Gregory Neil Shapiro.
+ * xemacs-faq.texi (Q1.3.7): Update moved link.
+ * xemacs-faq.texi (Q7.0.2): Comment out empty list of bullets to
+ avoid HTML error in texi2html translation.
+
+2001-09-15 Adrian Aichner <adrian@xemacs.org>
+
+ * xemacs-faq.texi (Q4.6.1): Infodock is now hosted on SourceForge,
+ infodock.com is no more.
+ * xemacs-faq.texi (Q4.7.1): Take auc out of http://sunsite.auc.dk.
+
+2001-09-09 Adrian Aichner <adrian@xemacs.org>
+
+ * xemacs-faq.texi (Q1.0.9): Correct link to snapshots as suggested
+ by Robin S. Socha.
+
2001-07-28 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.4 "Artificial Intelligence" is released.
@finalout
@titlepage
@title XEmacs FAQ
-@subtitle Frequently asked questions about XEmacs @* Last Modified: $Date: 2001/07/25 07:46:06 $
+@subtitle Frequently asked questions about XEmacs @* Last Modified: $Date: 2001/10/23 08:35:23 $
@sp 1
@author Tony Rossini <rossini@@biostat.washington.edu>
@author Ben Wing <ben@@xemacs.org>
@node Q1.0.9, Q1.0.10, Q1.0.8, Introduction
@unnumberedsubsec Q1.0.9: What does XEmacs look like?
-Screen snapshots are available in the WWW version of the FAQ.
-@example
-@uref{http://www.xemacs.org/faq/xemacs-faq.html}
-@end example
+Screen snapshots are available at
+@uref{http://www.xemacs.org/About/Screenshots/index.html}
+as part of the XEmacs website.
@node Q1.0.10, Q1.0.11, Q1.0.9, Introduction
@unnumberedsubsec Q1.0.10: Is there a port of XEmacs to Microsoft ('95 or NT)?
which can be obtained from
@end quotation
-@uref{http://ftpsearch.ntnu.no/?query=russian.el.Z}.
-@c dead link above
+@uref{http://ftpsearch.lycos.com/?query=russian.el.Z&form=medium}.
@email{d.barsky@@ee.surrey.ac.uk, Dima Barsky} writes:
@quotation
The fullest resource I found on Russian language use (in and out of
-XEmacs) is @uref{http://sunsite.oit.unc.edu/sergei/Software/Software.html}
+XEmacs) is @uref{http://www.ibiblio.org/sergei/Software/Software.html}
@end quotation
@node Q1.4.1, Q1.4.2, Q1.3.7, Introduction
@node Q4.0.7, Q4.0.8, Q4.0.6, Subsystems
@unnumberedsubsec Q4.0.7: Is there a mailing list or FAQ for VM?
-A FAQ for VM exists at @uref{http://www.cyberpass.net/~gorkab/vmfaq.htm}.
+A FAQ for VM exists at @uref{http://www.wonderworks.com/vm/FAQ.html}.
VM has its own newsgroups gnu.emacs.vm.info and gnu.emacs.vm.bug.
@unnumberedsec 4.6: Infodock
@unnumberedsubsec Q4.6.1: What is Infodock?
-InfoDock is an integrated productivity toolset, mainly aimed at
-technical people. It is developed and supported by InfoDock
-Associates, a firm that offers custom support and development
-for InfoDock, XEmacs and GNU Emacs. ( @uref{http://www.infodock.com},
-@email{info@@infodock.com}, +1 408 243 3300).
+@uref{http://sourceforge.net/projects/infodock/, InfoDock} is an
+integrated productivity toolset, mainly aimed at technical people,
+hosted at SourceForge.
InfoDock is built atop the XEmacs variant of GNU Emacs and so has all of
the power of Emacs, but with an easier to use and more comprehensive
@iftex
@*
@end iftex
-@uref{ftp://sunsite.auc.dk/packages/auctex/auctex.tar.gz}.
+@uref{ftp://sunsite.dk/packages/auctex/auctex.tar.gz}.
In case you don't have access to anonymous ftp, you can get it by an
email request to @email{ftpmail@@decwrl.dec.com}.
@iftex
@*
@end iftex
-@uref{http://sunsite.auc.dk/auctex/}.
+@uref{http://sunsite.dk/auctex/}.
@node Q4.7.2, Q4.7.3, Q4.7.1, Subsystems
@unnumberedsubsec Q4.7.2: Are there any Emacs Lisp Spreadsheets?
Not yet written.
-@itemize @bullet
-@end itemize
+@c APA: Texi2html produces invalid HTML from an empty list of bullets!
+@c Please uncomment following list when it does contain bullets.
+@c @itemize @bullet
+@c @end itemize
@node Q7.0.3, Q7.0.4, Q7.0.2, Current Events
@unnumberedsubsec Q7.0.3: What's new in XEmacs 21.1?
There are two main flavors of packages.
@itemize @bullet
-@item Regular Packages
+@item
+Regular Packages
@cindex regular packages
A regular package is one in which multiple files are involved and one
may not in general safely remove any of them.
-@item Single-File Packages
+@item
+Single-File Packages
@cindex single-file packages
A single-file package is an aggregate collection of thematically
related but otherwise independent lisp files. These files are bundled
Packages".
@enumerate 1
-@item Choose a download site.
+@item
+Choose a download site.
via menu: Options -> Manages Packages -> Add Download Site
via keyb: @code{M-x customize-variable RET package-get-remote RET}
(put in the details of remote host and directory)
If the package tarballs _AND_ the package-index file are in a
local directory, you can: @code{M-x pui-add-install-directory RET}
-@item Obtain a list of packages and display the list in a buffer named
+@item
+Obtain a list of packages and display the list in a buffer named
@file{*Packages*}.
menu: Options -> Manage Packages -> List & Install
keyb: @code{M-x pui-list-packages RET}
about the package to be displayed in the minibuffer.
-@item Choose the packages you wish to install.
+@item
+Choose the packages you wish to install.
mouse: Click button 2 on the package name.
keyb: @kbd{RET} on the package name
-@item Make sure you have everything you need.
+@item
+Make sure you have everything you need.
menu: Packages -> Add Required
keyb: @kbd{r}
For novices and gurus alike, this step can save your bacon.
It's easy to forget to install a critical package.
-@item Download and install the packages.
+@item
+Download and install the packages.
menu: Packages -> Install/Remove Selected
keyb: @kbd{x}
@end enumerate
@findex hide-subtree
@findex show-subtree
-@kindex C-c C-s (Outline mode)
+@kindex C-c C-d (Outline mode)
@kindex C-c C-h (Outline mode)
@cindex subtree (Outline mode)
- Two more powerful opposites are @kbd{C-c C-h} (@code{hide-subtree}) and
+ Two more powerful opposites are @kbd{C-c C-d} (@code{hide-subtree}) and
@kbd{C-c C-s} (@code{show-subtree}). Both should be used when point is
on a heading line, and both apply to all the lines of that heading's
@dfn{subtree}: its body, all its subheadings, both direct and indirect, and
+2001-10-23 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.5 "Civil Service" is released.
+
+2001-08-02 Dr. Volker Zell <Dr.Volker.Zell@oracle.com>
+
+ * xemacs.rc:
+ Under cygwin, when environment variable CYGWIN is set
+ to check_case:strict, filenames are considered case sensitive.
+
2001-07-28 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.4 "Artificial Intelligence" is released.
#endif
XEmacs ICON PRELOAD "xemacs.ico"
-XEmacsFile ICON "File.ico"
-XEmacsLisp ICON "Lisp.ico"
+XEmacsFile ICON "file.ico"
+XEmacsLisp ICON "lisp.ico"
win32_objs=win32.o xemacs_res.o
#endif
+#ifdef HAVE_SETITIMER
+profile_objs=profile.o
+#endif
+
## -Demacs is needed to make some files produce the correct version
## for use in Emacs.
cppflags = $(CPPFLAGS) -Demacs -I. $(c_switch_all)
cflags = $(CFLAGS) $(cppflags)
#if defined (WIN32_NATIVE) || defined (CYGWIN)
-ldflags = $(LDFLAGS) -mwindows $(ld_switch_all) $(ld_dynamic_link_flags)
+ldflags = $(LDFLAGS) -mwindows -e _mainCRTStartup $(ld_switch_all) $(ld_dynamic_link_flags)
#else
ldflags = $(LDFLAGS) $(ld_switch_all) $(ld_dynamic_link_flags)
#endif
gui.o gutter.o $(gui_objs) hash.o imgproc.o indent.o insdel.o intl.o\
keymap.o $(RTC_patch_objs) line-number.o lread.o lstream.o\
macros.o marker.o md5.o minibuf.o objects.o opaque.o\
- print.o process.o profile.o\
+ print.o process.o $(profile_objs)\
rangetab.o redisplay.o redisplay-output.o regex.o\
search.o select.o $(sheap_objs) signal.o sound.o\
specifier.o strftime.o symbols.o syntax.o sysdep.o\
int prompt_length;
prompt_length = ((prompt_limit)
? (prompt_limit - prompt_start)
- : strlen (prompt_start));
+ : (int) strlen (prompt_start));
if (prompt_limit && prompt_limit[1] == 0)
{
prompt_limit = 0; /* "sfoo:\n" -- strip tailing return */
-/* Synchronous subprocess invocation for XEmacs.
+/* Old synchronous subprocess invocation for XEmacs.
Copyright (C) 1985, 86, 87, 88, 93, 94, 95 Free Software Foundation, Inc.
This file is part of XEmacs.
/* Synched up with: Mule 2.0, FSF 19.30. */
/* Partly sync'ed with 19.36.4 */
+
+/* #### This ENTIRE file is only used in batch mode.
+
+ We only need two things to get rid of both this and ntproc.c:
+
+ -- my `stderr-proc' ws, which adds support for a separate stderr
+ in asynch. subprocesses. (it's a feature in `old-call-process-internal'.)
+ -- a noninteractive event loop that supports processes.
+*/
+
#include <config.h>
#include "lisp.h"
{
/* Initialize shell-file-name from environment variables or best guess. */
#ifdef WIN32_NATIVE
- const char *shell = egetenv ("COMSPEC");
- if (!shell) shell = "\\WINNT\\system32\\cmd.exe";
+ const char *shell = egetenv ("SHELL");
+ if (!shell) shell = egetenv ("COMSPEC");
+ /* Should never happen! */
+ if (!shell) shell = (GetVersion () & 0x80000000 ? "command" : "cmd");
#else /* not WIN32_NATIVE */
const char *shell = egetenv ("SHELL");
if (!shell) shell = "/bin/sh";
#endif
+#if 0 /* defined (WIN32_NATIVE) */
+ /* BAD BAD BAD. We do not wanting to be passing an XEmacs-created
+ SHELL var down to some inferior Cygwin process, which might get
+ screwed up.
+
+ There are a few broken apps (eterm/term.el, eterm/tshell.el,
+ os-utils/terminal.el, texinfo/tex-mode.el) where this will
+ cause problems. Those broken apps don't look at
+ shell-file-name, instead just at explicit-shell-file-name,
+ ESHELL and SHELL. They are apparently attempting to borrow
+ what `M-x shell' uses, but that latter also looks at
+ shell-file-name. What we want is for all of these apps to look
+ at shell-file-name, so that the user can change the value of
+ shell-file-name and everything will work out hunky-dorey.
+ */
+
+ if (!egetenv ("SHELL"))
+ {
+ CBufbyte *faux_var = alloca_array (CBufbyte, 7 + strlen (shell));
+ sprintf (faux_var, "SHELL=%s", shell);
+ Vprocess_environment = Fcons (build_string (faux_var),
+ Vprocess_environment);
+ }
+#endif /* 0 */
+
Vshell_file_name = build_string (shell);
}
}
/* win32 DDE management library globals */
#ifdef HAVE_DRAGNDROP
DWORD mswindows_dde_mlid;
+int mswindows_dde_enable;
HSZ mswindows_dde_service;
HSZ mswindows_dde_topic_system;
HSZ mswindows_dde_item_open;
#endif
}
+#ifdef HAVE_DRAGNDROP
static void
-mswindows_finish_init_device (struct device *d, Lisp_Object props)
+mswindows_init_dde ()
{
/* Initialize DDE management library and our related globals. We execute a
* dde Open("file") by simulating a drop, so this depends on dnd support. */
-#ifdef HAVE_DRAGNDROP
# if !(defined(CYGWIN) || defined(MINGW))
CoInitialize (NULL);
# endif
mswindows_dde_mlid = 0;
+ mswindows_dde_enable = 0;
DdeInitialize (&mswindows_dde_mlid, (PFNCALLBACK)mswindows_dde_callback,
APPCMD_FILTERINITS|CBF_FAIL_SELFCONNECTIONS|CBF_FAIL_ADVISES|
CBF_FAIL_POKES|CBF_FAIL_REQUESTS|CBF_SKIP_ALLNOTIFICATIONS,
mswindows_dde_item_open = DdeCreateStringHandle (mswindows_dde_mlid,
TEXT(MSWINDOWS_DDE_ITEM_OPEN), 0);
DdeNameService (mswindows_dde_mlid, mswindows_dde_service, 0L, DNS_REGISTER);
+}
+#endif
+
+void
+init_mswindows_very_early()
+{
+#ifdef HAVE_DRAGNDROP
+ /* Initializing dde when the device is created is too late - the
+ client will give up waiting. Instead we initialize here and tell
+ the client we're too busy until the rest of initialization has
+ happened. */
+ mswindows_init_dde();
+#endif
+}
+
+static void
+mswindows_finish_init_device (struct device *d, Lisp_Object props)
+{
+#ifdef HAVE_DRAGNDROP
+ /* Tell pending clients we are ready. */
+ mswindows_dde_enable = 1;
#endif
}
return Qunbound;
}
-static unsigned int
-mswindows_device_implementation_flags (void)
-{
- return XDEVIMPF_PIXEL_GEOMETRY;
-}
-
\f
/************************************************************************/
/* printer helpers */
mark_object (DEVICE_MSPRINTER_DEVMODE (d));
}
-static unsigned int
-msprinter_device_implementation_flags (void)
-{
- return ( XDEVIMPF_PIXEL_GEOMETRY
- | XDEVIMPF_IS_A_PRINTER
- | XDEVIMPF_NO_AUTO_REDISPLAY
- | XDEVIMPF_FRAMELESS_OK );
-}
\f
/************************************************************************/
/* printer Lisp subroutines */
CONSOLE_HAS_METHOD (mswindows, mark_device);
CONSOLE_HAS_METHOD (mswindows, delete_device);
CONSOLE_HAS_METHOD (mswindows, device_system_metrics);
- CONSOLE_HAS_METHOD (mswindows, device_implementation_flags);
+ CONSOLE_IMPLEMENTATION_FLAGS (mswindows, XDEVIMPF_PIXEL_GEOMETRY);
CONSOLE_HAS_METHOD (msprinter, init_device);
CONSOLE_HAS_METHOD (msprinter, mark_device);
CONSOLE_HAS_METHOD (msprinter, delete_device);
CONSOLE_HAS_METHOD (msprinter, device_system_metrics);
- CONSOLE_HAS_METHOD (msprinter, device_implementation_flags);
+ CONSOLE_IMPLEMENTATION_FLAGS (msprinter, (XDEVIMPF_PIXEL_GEOMETRY
+ | XDEVIMPF_IS_A_PRINTER
+ | XDEVIMPF_NO_AUTO_REDISPLAY
+ | XDEVIMPF_DONT_PREEMPT_REDISPLAY
+ | XDEVIMPF_FRAMELESS_OK));
}
Lisp_Object winsy = domain_device_type (domain);
struct console_methods *meth = decode_console_type (winsy, ERROR_ME_NOT);
assert (meth);
- return (MAYBE_INT_CONTYPE_METH (meth, device_implementation_flags, ())
- & XDEVIMPF_PIXEL_GEOMETRY);
+ return CONMETH_IMPL_FLAG (meth, XDEVIMPF_PIXEL_GEOMETRY);
}
DEFUN ("domain-device-type", Fdomain_device_type, 0, 1, 0, /*
#define DEVICE_TYPE_NAME(d) ((d)->devmeths->name)
#define DEVICE_TYPE(d) ((d)->devmeths->symbol)
+#define DEVICE_IMPL_FLAG(d, f) CONMETH_IMPL_FLAG ((d)->devmeths, (f))
#define DEVICE_SPECIFIC_FRAME_PROPS(d) \
((d)->devmeths->device_specific_frame_props)
#define DEVICE_DISPLAY_P(dev) \
(DEVICE_LIVE_P (dev) && \
- (MAYBE_INT_DEVMETH (dev, \
- device_implementation_flags, ()) \
- & XDEVIMPF_IS_A_PRINTER) ? 0 : 1)
+ !DEVICE_IMPL_FLAG (dev, XDEVIMPF_IS_A_PRINTER))
#define CHECK_DISPLAY_DEVICE(dev) \
do { \
{
mkdir(path, 0700); /* ignore retval -- checked next anyway. */
}
- if (lstat(path, &st) == 0 && st.st_uid == myuid && S_ISDIR(st.st_mode))
+ if (lstat(path, &st) == 0 && st.st_uid == (uid_t) myuid &&
+ S_ISDIR(st.st_mode))
{
tmpdir = path;
}
#endif
tem = ((!NILP (user) && !pw)
? Qnil
- : make_ext_string ((Extbyte *) p, (q ? q - p : strlen (p)),
+ : make_ext_string ((Extbyte *) p, (q ? q - p : (int) strlen (p)),
Qnative));
#ifdef AMPERSAND_FULL_NAME
* depends on dnd support.
*/
#ifdef HAVE_DRAGNDROP
+extern int mswindows_dde_enable;
+
HDDEDATA CALLBACK
mswindows_dde_callback (UINT uType, UINT uFmt, HCONV hconv,
HSZ hszTopic, HSZ hszItem, HDDEDATA hdata,
return (HDDEDATA)NULL;
case XTYP_EXECUTE:
+ if (!mswindows_dde_enable)
+ return (HDDEDATA) DDE_FBUSY;
+
if (!DdeCmpStringHandles (hszTopic, mswindows_dde_topic_system))
{
DWORD len = DdeGetData (hdata, NULL, 0, 0);
char *end;
char *filename;
struct gcpro gcpro1, gcpro2;
- Lisp_Object l_dndlist = Qnil;
+ Lisp_Object l_dndlist = Qnil;
Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
Lisp_Object frmcons, devcons, concons;
Lisp_Event *event = XEVENT (emacs_event);
struct frame *frame;
struct mswindows_frame* msframe;
- /* Not perfect but avoids crashes. There is potential for wierd
- behavior here. */
- if (gc_in_progress)
- {
- mswindows_output_console_string ("Window procedure called during GC???????\n", 41);
- /* Yes, this assert always triggers in a --debug XEmacs. But
- --debug=no is default in the stable branches.
- #### How about patch in <200106081225.IAA31075@gwyn.tux.org>? */
- assert (!gc_in_progress);
- goto defproc;
- }
+ /* If you hit this, rewrite the offending API call to occur after GC,
+ using register_post_gc_action(). */
+ assert (!gc_in_progress);
#ifdef DEBUG_XEMACS
if (debug_mswindows_events)
FROB (WM_NCPAINT)
FROB (WM_NCACTIVATE)
FROB (WM_GETDLGCODE)
+#ifdef WM_SYNCPAINT /* not in VC 5 */
FROB (WM_SYNCPAINT)
+#endif /* WM_SYNCPAINT */
FROB (WM_NCMOUSEMOVE)
FROB (WM_NCLBUTTONDOWN)
FROB (WM_NCLBUTTONUP)
FROB (WM_SYSDEADCHAR)
FROB (WM_KEYLAST)
-#if(WINVER >= 0x0400) && !defined(CYGWIN)
+#if(WINVER >= 0x0400) && defined (WM_IME_STARTCOMPOSITION)
FROB (WM_IME_STARTCOMPOSITION)
FROB (WM_IME_ENDCOMPOSITION)
FROB (WM_IME_COMPOSITION)
FROB (WM_IME_KEYLAST)
-#endif /* WINVER >= 0x0400 */
+#endif /* WINVER >= 0x0400 && defined (WM_IME_STARTCOMPOSITION) */
FROB (WM_INITDIALOG)
FROB (WM_COMMAND)
FROB (WM_DROPFILES)
FROB (WM_MDIREFRESHMENU)
+#ifdef WM_IME_SETCONTEXT /* not in Cygwin? */
#if(WINVER >= 0x0400) && !defined(CYGWIN)
FROB (WM_IME_SETCONTEXT)
FROB (WM_IME_KEYUP)
#endif /* WINVER >= 0x0400 */
+#endif /* WM_IME_SETCONTEXT */
#if(_WIN32_WINNT >= 0x0400)
FROB (WM_MOUSEHOVER)
#endif /* HPUX_PRE_8_0 */
#endif /* HPUX */
+#if defined(WIN32_NATIVE) || defined(CYGWIN)
+#define WIN32_FILENAMES
#ifdef WIN32_NATIVE
#include "nt.h"
+#endif /* WIN32_NATIVE */
#define IS_DRIVE(x) isalpha (x)
/* Need to lower-case the drive letter, or else expanded
filenames will sometimes compare inequal, because
`expand-file-name' doesn't always down-case the drive letter. */
#define DRIVE_LETTER(x) tolower (x)
-#endif /* WIN32_NATIVE */
+#ifndef CORRECT_DIR_SEPS
+#define CORRECT_DIR_SEPS(s) \
+ normalize_filename(s, DIRECTORY_SEP)
+/* Default implementation that coerces a file to use path_sep. */
+static void
+normalize_filename (Bufbyte *fp, Bufbyte path_sep)
+{
+ /* Always lower-case drive letters a-z, even if the filesystem
+ preserves case in filenames.
+ This is so filenames can be compared by string comparison
+ functions that are case-sensitive. Even case-preserving filesystems
+ do not distinguish case in drive letters. */
+ if (fp[1] == ':' && *fp >= 'A' && *fp <= 'Z')
+ {
+ *fp += 'a' - 'A';
+ fp += 2;
+ }
+
+ while (*fp)
+ {
+ if (*fp == '/' || *fp == '\\')
+ *fp = path_sep;
+ fp++;
+ }
+}
+#endif /* CORRECT_DIR_SEPS */
+#endif /* WIN32_NATIVE || CYGWIN */
int lisp_to_time (Lisp_Object, time_t *);
Lisp_Object time_to_lisp (time_t);
p = beg + XSTRING_LENGTH (filename);
while (p != beg && !IS_ANY_SEP (p[-1])
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
/* only recognize drive specifier at beginning */
&& !(p[-1] == ':' && p == beg + 2)
#endif
end = p = beg + XSTRING_LENGTH (filename);
while (p != beg && !IS_ANY_SEP (p[-1])
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
/* only recognize drive specifier at beginning */
&& !(p[-1] == ':' && p == beg + 2)
#endif
strcpy (dst, src);
if (slen > 1
&& IS_DIRECTORY_SEP (dst[slen - 1])
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
&& !IS_ANY_SEP (dst[slen - 2])
-#endif /* WIN32_NATIVE */
+#endif /* WIN32_FILENAMES */
)
dst[slen - 1] = 0;
return 1;
Bufbyte *newdir, *p, *o;
int tlen;
Bufbyte *target;
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
int drive = 0;
int collapse_newdir = 1;
-#else
+#endif
+#ifndef WIN32_NATIVE
struct passwd *pw;
-#endif /* WIN32_NATIVE */
+#endif /* WIN32_FILENAMES */
int length;
Lisp_Object handler = Qnil;
#ifdef CYGWIN
/* Save time in some common cases - as long as default_directory
is not relative, it can be canonicalized with name below (if it
is needed at all) without requiring it to be expanded now. */
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
/* Detect Windows file names with drive specifiers. */
&& ! (IS_DRIVE (o[0]) && (IS_DEVICE_SEP (o[1]) && IS_DIRECTORY_SEP (o[2])))
/* Detect Windows file names in UNC format. */
&& ! (IS_DIRECTORY_SEP (o[0]) && IS_DIRECTORY_SEP (o[1]))
-
-#else /* not WIN32_NATIVE */
-
+#endif /* not WIN32_FILENAMES */
+#ifndef WIN32_NATIVE
/* Detect Unix absolute file names (/... alone is not absolute on
Windows). */
&& ! (IS_DIRECTORY_SEP (o[0]))
into name should be safe during all of this, though. */
nm = XSTRING_DATA (name);
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
/* We will force directory separators to be either all \ or /, so make
a local copy to modify, even if there ends up being no change. */
- nm = strcpy ((char *)alloca (strlen ((char *)nm) + 1), (char *)nm);
+ nm = (Bufbyte *) strcpy ((char *) alloca (strlen ((char *) nm) + 1),
+ (char *) nm);
/* Find and remove drive specifier if present; this makes nm absolute
even if the rest of the name appears to be relative. */
Bufbyte *colon = (Bufbyte *) strrchr ((char *)nm, ':');
if (colon)
+ {
/* Only recognize colon as part of drive specifier if there is a
single alphabetic character preceding the colon (and if the
character before the drive letter, if present, is a directory
if (colon[0] == ':')
goto look_again;
}
+ }
}
/* If we see "c://somedir", we want to strip the first slash after the
"//somedir". */
if (drive && IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
nm++;
-#endif /* WIN32_NATIVE */
+#endif /* WIN32_FILENAMES */
/* If nm is absolute, look for /./ or /../ sequences; if none are
found, we can probably return right away. We will avoid allocating
}
if (!lose)
{
-#ifdef WIN32_NATIVE
- /* Make sure directories are all separated with / or \ as
- desired, but avoid allocation of a new string when not
- required. */
- CORRECT_DIR_SEPS (nm);
- if (IS_DIRECTORY_SEP (nm[1]))
- {
- if (strcmp (nm, XSTRING_DATA (name)) != 0)
- name = build_string (nm);
- }
- /* drive must be set, so this is okay */
- else if (strcmp (nm - 2, XSTRING_DATA (name)) != 0)
+#ifdef WIN32_FILENAMES
+ if (drive || IS_DIRECTORY_SEP (nm[1]))
{
- name = make_string (nm - 2, p - nm + 2);
- XSTRING_DATA (name)[0] = DRIVE_LETTER (drive);
- XSTRING_DATA (name)[1] = ':';
+ /* Make sure directories are all separated with / or \ as
+ desired, but avoid allocation of a new string when not
+ required. */
+ CORRECT_DIR_SEPS (nm);
+ if (IS_DIRECTORY_SEP (nm[1]))
+ {
+ if (strcmp ((char *) nm, (char *) XSTRING_DATA (name)) != 0)
+ name = build_string ((CBufbyte *) nm);
+ }
+ /* drive must be set, so this is okay */
+ else if (strcmp ((char *) nm - 2,
+ (char *) XSTRING_DATA (name)) != 0)
+ {
+ name = make_string (nm - 2, p - nm + 2);
+ XSTRING_DATA (name)[0] = DRIVE_LETTER (drive);
+ XSTRING_DATA (name)[1] = ':';
+ }
+ RETURN_UNGCPRO (name);
}
- RETURN_UNGCPRO (name);
-#else /* not WIN32_NATIVE */
+#endif /* not WIN32_FILENAMES */
+#ifndef WIN32_NATIVE
if (nm == XSTRING_DATA (name))
RETURN_UNGCPRO (name);
RETURN_UNGCPRO (build_string ((char *) nm));
Qfile_name);
nm++;
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
collapse_newdir = 0;
#endif
}
}
}
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
/* On DOS and Windows, nm is absolute if a drive name was specified;
use the drive's current directory as the prefix if needed. */
if (!newdir && drive)
{
+#ifdef WIN32_NATIVE
/* Get default directory if needed to make nm absolute. */
if (!IS_DIRECTORY_SEP (nm[0]))
{
- newdir = alloca (MAXPATHLEN + 1);
+ newdir = (Bufbyte *) alloca (MAXPATHLEN + 1);
if (!_getdcwd (toupper (drive) - 'A' + 1, newdir, MAXPATHLEN))
newdir = NULL;
}
+#endif /* WIN32_NATIVE */
if (!newdir)
{
/* Either nm starts with /, or drive isn't mounted. */
- newdir = alloca (4);
+ newdir = (Bufbyte *) alloca (4);
newdir[0] = DRIVE_LETTER (drive);
newdir[1] = ':';
newdir[2] = '/';
newdir[3] = 0;
}
}
-#endif /* WIN32_NATIVE */
+#endif /* WIN32_FILENAMES */
/* Finally, if no prefix has been specified and nm is not absolute,
then it must be expanded relative to default_directory. */
#ifndef WIN32_NATIVE
/* /... alone is not absolute on DOS and Windows. */
&& !IS_DIRECTORY_SEP (nm[0])
-#else
+#endif
+#ifdef WIN32_FILENAMES
&& !(IS_DIRECTORY_SEP (nm[0]) && IS_DIRECTORY_SEP (nm[1]))
#endif
&& !newdir)
newdir = XSTRING_DATA (default_directory);
}
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
if (newdir)
{
/* First ensure newdir is an absolute name. */
&& ! (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
/* Detect drive spec by itself */
&& ! (IS_DEVICE_SEP (newdir[1]) && newdir[2] == 0)
+ /* Detect unix format. */
+#ifndef WIN32_NATIVE
+ && ! (IS_DIRECTORY_SEP (newdir[0]))
+#endif
)
{
/* Effectively, let newdir be (expand-file-name newdir cwd).
}
if (!IS_DIRECTORY_SEP (nm[0]))
{
- char * tmp = alloca (strlen (newdir) + strlen (nm) + 2);
- file_name_as_directory (tmp, newdir);
- strcat (tmp, nm);
+ Bufbyte *tmp = (Bufbyte *) alloca (strlen ((char *) newdir) +
+ strlen ((char *) nm) + 2);
+ file_name_as_directory ((char *) tmp, (char *) newdir);
+ strcat ((char *) tmp, (char *) nm);
nm = tmp;
}
- newdir = alloca (MAXPATHLEN + 1);
+ newdir = (Bufbyte *) alloca (MAXPATHLEN + 1);
if (drive)
{
+#ifdef WIN32_NATIVE
if (!_getdcwd (toupper (drive) - 'A' + 1, newdir, MAXPATHLEN))
- newdir = "/";
+#endif
+ newdir = (Bufbyte *) "/";
}
else
- getwd (newdir);
+ getcwd ((char *) newdir, MAXPATHLEN);
}
/* Strip off drive name from prefix, if present. */
/* Keep only a prefix from newdir if nm starts with slash
(/ /server/share for UNC, nothing otherwise). */
- if (IS_DIRECTORY_SEP (nm[0]) && collapse_newdir)
+ if (IS_DIRECTORY_SEP (nm[0])
+#ifndef WIN32_NATIVE
+ && IS_DIRECTORY_SEP (nm[1])
+#endif
+ && collapse_newdir)
{
if (IS_DIRECTORY_SEP (newdir[0]) && IS_DIRECTORY_SEP (newdir[1]))
{
- newdir = strcpy (alloca (strlen (newdir) + 1), newdir);
+ newdir =
+ (Bufbyte *)
+ strcpy ((char *) alloca (strlen ((char *) newdir) + 1),
+ (char *) newdir);
p = newdir + 2;
while (*p && !IS_DIRECTORY_SEP (*p)) p++;
p++;
*p = 0;
}
else
- newdir = "";
+ newdir = (Bufbyte *) "";
}
}
-#endif /* WIN32_NATIVE */
+#endif /* WIN32_FILENAMES */
if (newdir)
{
just // (an incomplete UNC name). */
length = strlen ((char *) newdir);
if (length > 1 && IS_DIRECTORY_SEP (newdir[length - 1])
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
&& !(length == 2 && IS_DIRECTORY_SEP (newdir[0]))
#endif
)
/* Now concatenate the directory and name to new space in the stack frame */
tlen += strlen ((char *) nm) + 1;
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
/* Add reserved space for drive name. (The Microsoft x86 compiler
produces incorrect code if the following two lines are combined.) */
target = (Bufbyte *) alloca (tlen + 2);
target += 2;
-#else /* not WIN32_NATIVE */
+#else /* not WIN32_FILENAMES */
target = (Bufbyte *) alloca (tlen);
-#endif /* not WIN32_NATIVE */
+#endif /* not WIN32_FILENAMES */
*target = 0;
if (newdir)
++o;
p += 3;
}
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
/* if drive is set, we're not dealing with an UNC, so
multiple dir-seps are redundant (and reportedly cause trouble
under win95) */
}
}
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
/* At last, set drive name, except for network file name. */
if (drive)
{
target[0] = DRIVE_LETTER (drive);
target[1] = ':';
}
+#ifdef WIN32_NATIVE
else
{
assert (IS_DIRECTORY_SEP (target[0]) && IS_DIRECTORY_SEP (target[1]));
}
+#endif
CORRECT_DIR_SEPS (target);
-#endif /* WIN32_NATIVE */
+#endif /* WIN32_FILENAMES */
RETURN_UNGCPRO (make_string (target, o - target));
}
{
Extbyte *pos;
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
if (IS_DRIVE (p[0]) && IS_DEVICE_SEP (p[1])
&& IS_DIRECTORY_SEP (p[2]))
/* don't test c: on windows */
for (p = nm; p != endp; p++)
{
if ((p[0] == '~'
-#if defined (WIN32_NATIVE) || defined (CYGWIN)
+#if defined (WIN32_FILENAMES)
/* // at start of file name is meaningful in WindowsNT systems */
|| (IS_DIRECTORY_SEP (p[0]) && p - 1 != nm)
-#else /* not (WIN32_NATIVE || CYGWIN) */
+#else /* not (WIN32_FILENAMES) */
|| IS_DIRECTORY_SEP (p[0])
-#endif /* not (WIN32_NATIVE || CYGWIN) */
+#endif /* not (WIN32_FILENAMES) */
)
&& p != nm
&& (IS_DIRECTORY_SEP (p[-1])))
nm = p;
substituted = 1;
}
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
/* see comment in expand-file-name about drive specifiers */
else if (IS_DRIVE (p[0]) && p[1] == ':'
&& p > nm && IS_DIRECTORY_SEP (p[-1]))
nm = p;
substituted = 1;
}
-#endif /* WIN32_NATIVE */
+#endif /* WIN32_FILENAMES */
}
/* See if any variables are substituted into the string
for (p = xnm; p != x; p++)
if ((p[0] == '~'
-#if defined (WIN32_NATIVE)
+#if defined (WIN32_FILENAMES)
|| (IS_DIRECTORY_SEP (p[0]) && p - 1 != xnm)
-#else /* not WIN32_NATIVE */
+#else /* not WIN32_FILENAMES */
|| IS_DIRECTORY_SEP (p[0])
-#endif /* not WIN32_NATIVE */
+#endif /* not WIN32_FILENAMES */
)
/* don't do p[-1] if that would go off the beginning --jwz */
&& p != nm && p > xnm && IS_DIRECTORY_SEP (p[-1]))
xnm = p;
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
else if (IS_DRIVE (p[0]) && p[1] == ':'
&& p > nm && IS_DIRECTORY_SEP (p[-1]))
xnm = p;
CHECK_STRING (filename);
ptr = XSTRING_DATA (filename);
return (IS_DIRECTORY_SEP (*ptr) || *ptr == '~'
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
|| (IS_DRIVE (*ptr) && ptr[1] == ':' && IS_DIRECTORY_SEP (ptr[2]))
#endif
) ? Qt : Qnil;
if (!NILP (handler))
RETURN_UNGCPRO (call2 (handler, Qfile_readable_p, abspath));
-#if defined(WIN32_NATIVE) || defined(CYGWIN)
+#if defined(WIN32_FILENAMES)
/* Under MS-DOS and Windows, open does not work for directories. */
UNGCPRO;
if (access (XSTRING_DATA (abspath), 0) == 0)
return Qt;
else
return Qnil;
-#else /* not WIN32_NATIVE */
+#else /* not WIN32_FILENAMES */
{
int desc = interruptible_open ((char *) XSTRING_DATA (abspath), O_RDONLY | OPEN_BINARY, 0);
UNGCPRO;
close (desc);
return Qt;
}
-#endif /* not WIN32_NATIVE */
+#endif /* not WIN32_FILENAMES */
}
/* Having this before file-symlink-p mysteriously caused it to be forgotten
#endif
static void
+finalize_destroy_window (void *win)
+{
+ DestroyWindow ((HWND) win);
+}
+
+static void
mswindows_finalize_image_instance (Lisp_Image_Instance *p)
{
if (!p->data)
#endif
if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
{
- DestroyWindow (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p));
- DestroyWindow (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p));
+ /* DestroyWindow is not safe here, as it will send messages
+ to our window proc. */
+ register_post_gc_action
+ (finalize_destroy_window,
+ (void *) (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p)));
+ register_post_gc_action
+ (finalize_destroy_window,
+ (void *) (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p)));
IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0;
}
}
but I couldn't find it. */
Lisp_Object old_selected =gui_item_list_find_selected
(XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)));
- Arg al [1];
+ Arg al [2];
char* name;
unsigned int num_children, i;
Widget* children;
if (!strcmp (XtName (children [i]), name))
{
XtSetArg (al [0], XtNtopWidget, children [i]);
- XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, 1);
+ XtSetArg (al [1], XtNhighlightWidget,
+ children [i]);
+ XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, 2);
break;
}
}
-/* Utility and Unix shadow routines for XEmacs on Windows NT.
+/* Utility and Unix shadow routines for XEmacs on MS Windows.
Copyright (C) 1994, 1995 Free Software Foundation, Inc.
This file is part of XEmacs.
if (getenv ("HOME") == NULL)
putenv ("HOME=c:/");
#endif
- if (getenv ("SHELL") == NULL)
- putenv ((GetVersion () & 0x80000000) ? "SHELL=command" : "SHELL=cmd");
- /* Set dir and shell from environment variables. */
+ /* Set dir from environment variables. */
strcpy (the_passwd.pw_dir, (char *)get_home_directory());
- strcpy (the_passwd.pw_shell, getenv ("SHELL"));
+ /* We used to set pw_shell here, but the order is wrong (SHELL gets
+ init in callproc.c, called later in the init process) and pw_shell
+ is not used anywhere. */
}
/* Normalize filename by converting all path separators to
/* Signal pending mask: bit set to 1 means sig is pending */
unsigned signal_pending_mask = 0;
-mswindows_sighandler mswindows_sigset (int nsig, mswindows_sighandler handler)
+mswindows_sighandler
+mswindows_sigset (int nsig, mswindows_sighandler handler)
{
/* We delegate some signals to the system function */
if (nsig == SIGFPE || nsig == SIGABRT || nsig == SIGINT)
}
}
-int mswindows_sighold (int nsig)
+int
+mswindows_sighold (int nsig)
{
if (nsig < 0 || nsig > SIG_MAX)
return errno = EINVAL;
- signal_block_mask |= sigmask(nsig);
+ signal_block_mask |= sigmask (nsig);
return 0;
}
-int mswindows_sigrelse (int nsig)
+int
+mswindows_sigrelse (int nsig)
{
if (nsig < 0 || nsig > SIG_MAX)
return errno = EINVAL;
- signal_block_mask &= ~sigmask(nsig);
+ signal_block_mask &= ~sigmask (nsig);
- if (signal_pending_mask & sigmask(nsig))
+ if (signal_pending_mask & sigmask (nsig))
mswindows_raise (nsig);
return 0;
}
-int mswindows_sigpause (int nsig)
+int
+mswindows_sigpause (int nsig)
{
- /* This is currently not called, because the only
- call to sigpause inside XEmacs is with SIGCHLD
- parameter. Just in case, we put an assert here,
- so anyone who will add a call to sigpause will
- be surprised (or surprise someone else...) */
+ /* This is currently not called, because the only call to sigpause
+ inside XEmacs is with SIGCHLD parameter. Just in case, we put an
+ assert here, so anyone adds a call to sigpause will be surprised
+ (or surprise someone else...) */
assert (0);
return 0;
}
-int mswindows_raise (int nsig)
+int
+mswindows_raise (int nsig)
{
/* We delegate some raises to the system routine */
if (nsig == SIGFPE || nsig == SIGABRT || nsig == SIGINT)
return errno = EINVAL;
/* If the signal is blocked, remember to issue later */
- if (signal_block_mask & sigmask(nsig))
+ if (signal_block_mask & sigmask (nsig))
{
- signal_pending_mask |= sigmask(nsig);
+ signal_pending_mask |= sigmask (nsig);
return 0;
}
if (signal_handlers[nsig] != SIG_DFL)
{
- (*signal_handlers[nsig])(nsig);
+ (*signal_handlers[nsig]) (nsig);
return 0;
}
return 0;
}
-/*--------------------------------------------------------------------*/
-/* Async timers */
-/*--------------------------------------------------------------------*/
-
-/* We emulate two timers, one for SIGALRM, another for SIGPROF.
-
- itimerproc() function has an implementation limitation: it does
- not allow to set *both* interval and period. If an attempt is
- made to set both, and then they are unequal, the function
- asserts.
-
- Minimum timer resolution on Win32 systems varies, and is greater
- than or equal than 1 ms. The resolution is always wrapped not to
- attempt to get below the system defined limit.
- */
-
-/* Timer precision, denominator of one fraction: for 100 ms
- interval, request 10 ms precision
- */
-const int timer_prec = 10;
-
-/* Last itimervals, as set by calls to setitimer */
-static struct itimerval it_alarm;
-static struct itimerval it_prof;
-
-/* Timer IDs as returned by MM */
-MMRESULT tid_alarm = 0;
-MMRESULT tid_prof = 0;
-
-static void CALLBACK timer_proc (UINT uID, UINT uMsg, DWORD dwUser,
- DWORD dw1, DWORD dw2)
-{
- /* Just raise a signal indicated by dwUser parameter */
- mswindows_raise (dwUser);
-}
-
-/* Divide time in ms specified by IT by DENOM. Return 1 ms
- if division results in zero */
-static UINT period (const struct itimerval* it, UINT denom)
-{
- static TIMECAPS time_caps;
-
- UINT res;
- const struct timeval* tv =
- (it->it_value.tv_sec == 0 && it->it_value.tv_usec == 0)
- ? &it->it_interval : &it->it_value;
-
- /* Zero means stop timer */
- if (tv->tv_sec == 0 && tv->tv_usec == 0)
- return 0;
-
- /* Convert to ms and divide by denom */
- res = (tv->tv_sec * 1000 + (tv->tv_usec + 500) / 1000) / denom;
-
- /* Converge to minimum timer resolution */
- if (time_caps.wPeriodMin == 0)
- timeGetDevCaps (&time_caps, sizeof(time_caps));
-
- if (res < time_caps.wPeriodMin)
- res = time_caps.wPeriodMin;
-
- return res;
-}
-
-static int setitimer_helper (const struct itimerval* itnew,
- struct itimerval* itold, struct itimerval* itcurrent,
- MMRESULT* tid, DWORD sigkind)
-{
- UINT delay, resolution, event_type;
-
- /* First stop the old timer */
- if (*tid)
- {
- timeKillEvent (*tid);
- timeEndPeriod (period (itcurrent, timer_prec));
- *tid = 0;
- }
-
- /* Return old itimerval if requested */
- if (itold)
- *itold = *itcurrent;
-
- *itcurrent = *itnew;
-
- /* Determine if to start new timer */
- delay = period (itnew, 1);
- if (delay)
- {
- resolution = period (itnew, timer_prec);
- event_type = (itnew->it_value.tv_sec == 0 && itnew->it_value.tv_usec == 0)
- ? TIME_ONESHOT : TIME_PERIODIC;
- timeBeginPeriod (resolution);
- *tid = timeSetEvent (delay, resolution, timer_proc, sigkind, event_type);
- }
-
- return !delay || *tid;
-}
-
-int setitimer (int kind, const struct itimerval* itnew,
- struct itimerval* itold)
-{
- /* In this version, both interval and value are allowed
- only if they are equal. */
- assert ((itnew->it_value.tv_sec == 0 && itnew->it_value.tv_usec == 0)
- || (itnew->it_interval.tv_sec == 0 && itnew->it_interval.tv_usec == 0)
- || (itnew->it_value.tv_sec == itnew->it_interval.tv_sec &&
- itnew->it_value.tv_usec == itnew->it_interval.tv_usec));
-
- if (kind == ITIMER_REAL)
- return setitimer_helper (itnew, itold, &it_alarm, &tid_alarm, SIGALRM);
- else if (kind == ITIMER_PROF)
- return setitimer_helper (itnew, itold, &it_prof, &tid_prof, SIGPROF);
- else
- return errno = EINVAL;
-}
-
\f
/*--------------------------------------------------------------------*/
/* Memory-mapped files */
void
close_file_data (file_data *p_file)
{
- UnmapViewOfFile (p_file->file_base);
- CloseHandle (p_file->file_mapping);
- CloseHandle (p_file->file);
+ UnmapViewOfFile (p_file->file_base);
+ CloseHandle (p_file->file_mapping);
+ CloseHandle (p_file->file);
}
void
#define INCLUDED_nt_h_
#include "syswindows.h"
+#include "systime.h" /* because of struct utimbuf below */
#ifdef DEBUG_XEMACS
#define DebPrint(stuff) _DebPrint stuff
-/* Process support for Windows NT port of XEMACS.
+/* Old process support under MS Windows, soon to die.
Copyright (C) 1992, 1995 Free Software Foundation, Inc.
This file is part of XEmacs.
/* Adapted for XEmacs by David Hobley <david@spook-le0.cia.com.au> */
/* Synced with FSF Emacs 19.34.6 by Marc Paquette <marcpa@cam.org> */
+/* #### This ENTIRE file is only around because of callproc.c, which
+ in turn is only used in batch mode.
+
+ We only need two things to get rid of both this and callproc.c:
+
+ -- my `stderr-proc' ws, which adds support for a separate stderr
+ in asynch. subprocesses. (it's a feature in `old-call-process-internal'.)
+ -- a noninteractive event loop that supports processes.
+*/
+
#include <config.h>
#undef signal
#undef wait
&Vwin32_start_process_share_console /*
When nil, processes started via start-process are given a new console.
When non-nil, they share the Emacs console; this has the limitation of
-allowing only only DOS subprocess to run at a time (whether started directly
+allowing only one DOS subprocess to run at a time (whether started directly
or indirectly by Emacs), and preventing Emacs from cleanly terminating the
subprocess group, but may allow Emacs to interrupt a subprocess that doesn't
otherwise respond to interrupts from Emacs.
&Vmswindows_start_process_share_console /*
When nil, new child processes are given a new console.
When non-nil, they share the Emacs console; this has the limitation of
-allowing only only DOS subprocess to run at a time (whether started directly
+allowing only one DOS subprocess to run at a time (whether started directly
or indirectly by Emacs), and preventing Emacs from cleanly terminating the
subprocess group, but may allow Emacs to interrupt a subprocess that doesn't
otherwise respond to interrupts from Emacs.
allocate_pty() tries all the different known easy ways of opening
a pty. In case of failure, we resort to the old BSD-style pty
grovelling code in allocate_pty_the_old_fashioned_way(). */
+#ifndef FORCE_ALLOCATE_PTY_THE_OLD_FASHIONED_WAY
int master_fd = -1;
const char *slave_name = NULL;
const char *clone = NULL;
lose:
if (master_fd >= 0)
close (master_fd);
+#endif /* ndef FORCE_ALLOCATE_PTY_THE_OLD_FASHIONED_WAY */
return allocate_pty_the_old_fashioned_way ();
}
memset (&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = theport;
- sa.sin_addr.s_addr = htonl (inet_addr ((char *) XSTRING_DATA (dest)));
+ sa.sin_addr.s_addr = inet_addr ((char *) XSTRING_DATA (dest));
/* Socket configuration for reading ------------------------ */
}
/* join multicast group */
- imr.imr_multiaddr.s_addr = htonl (inet_addr ((char *) XSTRING_DATA (dest)));
+ imr.imr_multiaddr.s_addr = inet_addr ((char *) XSTRING_DATA (dest));
imr.imr_interface.s_addr = htonl (INADDR_ANY);
if (setsockopt (rs, IPPROTO_IP, IP_ADD_MEMBERSHIP,
&imr, sizeof (struct ip_mreq)) < 0)
#include "syssignal.h"
#include "systime.h"
+#ifndef HAVE_SETITIMER
+#error Sorry charlie. We need a scalpel and all we have is a lawnmower.
+#endif
+
/* We implement our own profiling scheme so that we can determine
things like which Lisp functions are occupying the most time. Any
standard OS-provided profiling works on C functions, which is
foo.it_interval = foo.it_value;
profiling_active = 1;
inside_profiling = 0;
- setitimer (ITIMER_PROF, &foo, 0);
+ qxe_setitimer (ITIMER_PROF, &foo, 0);
return Qnil;
}
foo.it_value.tv_sec = 0;
foo.it_value.tv_usec = 0;
foo.it_interval = foo.it_value;
- setitimer (ITIMER_PROF, &foo, 0);
+ qxe_setitimer (ITIMER_PROF, &foo, 0);
profiling_active = 0;
signal (SIGPROF, fatal_error_signal);
return Qnil;
sprintf (pty_name, "/dev/ptyp%d", i);
#define PTY_TTY_NAME_SPRINTF \
sprintf (pty_name, "/dev/ttyp%d", i);
+#define FORCE_ALLOCATE_PTY_THE_OLD_FASHIONED_WAY
/* We have sockets. Always. */
#ifndef HAVE_SOCKETS
}
static void
+unshow_that_mofo (void *handle)
+{
+ ShowScrollBar ((HWND) handle, SB_CTL, 0);
+}
+
+static void
mswindows_release_scrollbar_instance (struct scrollbar_instance *sb)
{
- ShowScrollBar (SCROLLBAR_MSW_HANDLE (sb), SB_CTL, 0);
+ if (gc_in_progress)
+ /* #### way bogus! need to remove the offending call.
+ see mark_redisplay(). */
+ register_post_gc_action (unshow_that_mofo,
+ (void *) SCROLLBAR_MSW_HANDLE (sb));
+ else
+ ShowScrollBar (SCROLLBAR_MSW_HANDLE (sb), SB_CTL, 0);
SCROLLBAR_MSW_SIZE (sb) = 0;
}
sb = (struct scrollbar_instance *)GetWindowLong (hwnd, GWL_USERDATA);
win = real_window ((sb==NULL) ? GetFocus() : sb->mirror, 1);
+ /* "0 as the second parameter" refers to the call to real_window above.
+ This comment was taken from Ben's 21.5 code that differs somewhat
+ from this, I don't think the 21.4 code ever had a 0 there.
+ #### we're still hitting an abort here with 0 as the second
+ parameter, although only occasionally. It seems that sometimes we
+ receive events for scrollbars that don't exist anymore. I assume
+ it must happen like this: The user does something that causes a
+ scrollbar to disappear (e.g. Alt-TAB, causing recomputation of
+ everything in the new frame) and then immediately uses the mouse
+ wheel, generating scrollbar events. Both events get posted before
+ we have a chance to process them, and in processing the first, the
+ scrollbar mentioned in the second disappears. */
+ if (NILP (win))
+ return;
frame = XWINDOW (win)->frame;
f = XFRAME (frame);
struct itimerval it;
it.it_value = interval;
EMACS_SET_SECS_USECS (it.it_interval, 0, 0);
- setitimer (ITIMER_REAL, &it, 0);
+ qxe_setitimer (ITIMER_REAL, &it, 0);
#else
int secs;
EMACS_TIME_TO_INT (interval, secs);
}
#ifdef HAVE_SETITIMER
+
unsigned int
alarm (unsigned int howlong)
{
new_it.it_value.tv_usec = 0;
new_it.it_interval.tv_sec = 0;
new_it.it_interval.tv_usec = 0;
- setitimer (ITIMER_REAL, &new_it, &old_it);
+ qxe_setitimer (ITIMER_REAL, &new_it, &old_it);
/* Never return zero if there was a timer outstanding. */
return old_it.it_value.tv_sec + (old_it.it_value.tv_usec > 0 ? 1 : 0);
}
+
+int
+qxe_setitimer (int kind, const struct itimerval *itnew,
+ struct itimerval *itold)
+{
+#if defined (WIN32_NATIVE) || defined (CYGWIN)
+ /* setitimer() does not exist on native MS Windows, and appears broken
+ on Cygwin. See win32.c. */
+ return mswindows_setitimer (kind, itnew, itold);
+#else
+ return setitimer (kind, itnew, itold);
#endif
+}
+
+#endif /* HAVE_SETITIMER */
+
DEFUN ("waiting-for-user-input-p", Fwaiting_for_user_input_p, 0, 0, 0, /*
Return non-nil if XEmacs is waiting for input from the user.
struct timeval it_interval;
};
-int setitimer (int kind, const struct itimerval* itnew,
- struct itimerval* itold);
-
#define ITIMER_REAL 1
#define ITIMER_PROF 2
-#endif /* WIN32_NATIVE */
+#endif /* WIN32_NATIVE || BROKEN_CYGWIN */
+
+#if defined (WIN32_NATIVE) || defined (CYGWIN)
+
+int mswindows_setitimer (int kind, const struct itimerval *itnew,
+ struct itimerval *itold);
+
+#endif /* defined (WIN32_NATIVE) || defined (CYGWIN) */
+
+/* #### Move this comment elsewhere when we figure out the place.
+
+ "qxe" is a unique prefix used to identify encapsulations of standard
+ library functions. We used to play pre-processing games but in
+ general this leads to nothing but trouble because someone first
+ encountering the code will have no idea that what appears to be a
+ call to a library function has actually been redefined to be a call
+ somewhere else. This is doubly true when the redefinition occurs
+ in out-of-the way s+m files and only on certainly systems.
+
+ By making the encapsulation explicit we might be making the code
+ that uses is slightly less pretty, but this is more than compensated
+ for by the huge increase in clarity.
+
+ "Standard library function" can refer to any function in any
+ standard library. If we are explicitly changing the semantics
+ (e.g. Mule-encapsulating), we should use an extended version of
+ the prefix, e.g. perhaps "qxe_xlat_" for functions that Mule-
+ encapsulate, or "qxe_retry_" for functions that automatically
+ retry a system call interrupted by EINTR. In general, if there
+ is no prefix extension, it means the function is trying to
+ provide (more or less) the same semantics as the standard library
+ function; but be aware that the reimplementation may be incomplete
+ or differ in important respects. This is especially the case
+ when attempts are made to implement Unix functions on MS Windows.
+*/
+
+int qxe_setitimer (int kind, const struct itimerval *itnew,
+ struct itimerval *itold);
#endif /* INCLUDED_systime_h_ */
GET_LRU_WINDOW, /* Arg is t for full-width windows only */
DELETE_OTHER_WINDOWS, /* Arg is window not to delete */
DELETE_BUFFER_WINDOWS, /* Arg is buffer */
+ UNDEDICATE_BUFFER, /* Arg is buffer */
GET_LARGEST_WINDOW,
GET_BUFFER_WINDOW_COUNT, /* Arg is buffer */
GET_BUFFER_MRU_WINDOW /* Arg is buffer */
break;
}
+ case UNDEDICATE_BUFFER:
+ {
+ if ((XBUFFER (p->buffer) == XBUFFER (obj)) && (p->dedicated))
+ p->dedicated = Qnil;
+ break;
+ }
+
case DELETE_OTHER_WINDOWS:
{
/* Don't delete the last window on a frame; this can
#endif
+void
+undedicate_windows (Lisp_Object buffer, Lisp_Object frame)
+{
+ window_loop (UNDEDICATE_BUFFER, buffer, 0, frame, 1, Qnil);
+}
+
\f
DEFUN ("get-lru-window", Fget_lru_window, 0, 2, 0, /*
Return the window least recently selected or used for display.
int window_right_gutter_width (struct window *w, int modeline);
void delete_all_subwindows (struct window *w);
+void undedicate_windows (Lisp_Object buffer, Lisp_Object frame);
void set_window_pixheight (Lisp_Object window, int pixheight,
int nodelete);
void set_window_pixwidth (Lisp_Object window, int pixwidth,
+2001-10-23 Stephen J. Turnbull <stephen@xemacs.org>
+
+ * XEmacs 21.4.5 "Civil Service" is released.
+
2001-07-28 Stephen J. Turnbull <stephen@xemacs.org>
* XEmacs 21.4.4 "Artificial Intelligence" is released.
emacs_is_beta=
emacs_major_version=21
emacs_minor_version=4
-emacs_beta_version=4
-xemacs_codename="Artificial Intelligence"
+emacs_beta_version=5
+xemacs_codename="Civil Service"
infodock_major_version=4
infodock_minor_version=0
infodock_build_version=8