This commit was generated by cvs2svn to compensate for changes in r5106,
authortomo <tomo>
Mon, 2 Sep 2002 15:56:09 +0000 (15:56 +0000)
committertomo <tomo>
Mon, 2 Sep 2002 15:56:09 +0000 (15:56 +0000)
which included commits to RCS files with non-trunk default branches.

51 files changed:
PROBLEMS
configure.usage
lib-src/ChangeLog
lisp/autoload.el
lisp/buff-menu.el
lisp/cus-edit.el
lisp/cus-face.el
lisp/etags.el
lisp/faces.el
lisp/font-lock.el
lisp/lisp-mnt.el
lisp/menubar-items.el
lisp/mouse.el
lisp/process.el
lisp/toolbar.el
lwlib/ChangeLog
lwlib/lwlib-Xlw.c
lwlib/lwlib-Xm.c
lwlib/lwlib.c
lwlib/lwlib.h
man/ChangeLog
man/xemacs-faq.texi
man/xemacs/packages.texi
man/xemacs/text.texi
nt/ChangeLog
nt/xemacs.rc
src/Makefile.in.in
src/callint.c
src/callproc.c
src/device-msw.c
src/device.c
src/device.h
src/editfns.c
src/event-msw.c
src/fileio.c
src/glyphs-msw.c
src/glyphs-x.c
src/nt.c
src/nt.h
src/ntproc.c
src/process-nt.c
src/process-unix.c
src/profile.c
src/s/sco5.h
src/scrollbar-msw.c
src/signal.c
src/systime.h
src/window.c
src/window.h
tests/ChangeLog
version.sh

index 8525d37..7439a78 100644 (file)
--- a/PROBLEMS
+++ b/PROBLEMS
@@ -212,6 +212,10 @@ normally held in /usr/ccs/bin.  This can be done by one of:
 
 - 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
index 77f52c2..ecf7437 100644 (file)
@@ -77,15 +77,16 @@ Window-system options:
                         *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.
@@ -155,7 +156,7 @@ Mail options:
 
 --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.
index e5f8566..a8f859a 100644 (file)
@@ -1,3 +1,7 @@
+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.
index 195885d..9911d82 100644 (file)
@@ -509,7 +509,7 @@ The directory to which the auto-autoloads.el file must be the first parameter
 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)
index 482dcc7..1729956 100644 (file)
@@ -140,8 +140,8 @@ Letters do not insert themselves; instead, they are commands.
   (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)
index 12ae67f..38b437f 100644 (file)
@@ -562,14 +562,24 @@ groups after non-groups, if nil do not order groups at all."
          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)
@@ -610,11 +620,23 @@ when the action is chosen.")
 (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
@@ -1848,10 +1870,14 @@ If INITIAL-STRING is non-nil, use that rather than \"Parent groups:\"."
   :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.
@@ -2175,8 +2201,8 @@ Optional EVENT is the location for the menu."
     (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)))
@@ -2219,9 +2245,18 @@ Optional EVENT is the location for the menu."
           (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."
@@ -2242,8 +2277,10 @@ Optional EVENT is the location for the menu."
     ;; 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)
@@ -2260,10 +2297,21 @@ Optional EVENT is the location for the menu."
       (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.
 
@@ -2394,10 +2442,14 @@ Match frames with dark backgrounds")
   :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
@@ -2640,8 +2692,8 @@ Optional EVENT is the location for the menu."
     (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))
@@ -2659,12 +2711,21 @@ Optional EVENT is the location for the menu."
     (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))
@@ -2682,12 +2743,12 @@ Optional EVENT is the location for the menu."
     (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)
@@ -2699,14 +2760,30 @@ Optional EVENT is the location for the menu."
       (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.
 
@@ -2879,10 +2956,14 @@ and so forth.  The remaining group tags are shown with
   :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)
@@ -3191,14 +3272,28 @@ Optional EVENT is the location for the menu."
              (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)))
@@ -3215,15 +3310,35 @@ Optional EVENT is the location for the menu."
              (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)
index 403f806..5f79527 100644 (file)
@@ -202,7 +202,8 @@ If FRAME is nil, use the default face."
 
 (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)
@@ -217,7 +218,8 @@ If FRAME is nil, use the default face."
 
 (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)
index 56fc478..0c368cb 100644 (file)
@@ -761,7 +761,8 @@ in the tag table that matches the tagname used in the previous find-tag.
 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:
 
@@ -1170,7 +1171,7 @@ If this is a C-defined elisp function, it does something more clever."
 (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)
 
index 4e34298..deb9148 100644 (file)
@@ -1761,7 +1761,7 @@ in that frame; otherwise change each frame."
                     'global)
 (set-face-background-pixmap 'highlight
                            '(((x default mono) . "gray1")
-;;                           ((gtk default mono) . "gray1")
+                             ((gtk default mono) . "gray1")
                              ((mswindows default mono) . "gray1"))
                            'global)
 
@@ -1773,7 +1773,7 @@ in that frame; otherwise change each frame."
                     'global)
 (set-face-background-pixmap 'zmacs-region
                            '(((x default mono) . "gray3")
-;;                           ((gtk default mono) . "gray3")
+                             ((gtk default mono) . "gray3")
                              ((mswindows default mono) . "gray3"))
                            'global)
 
@@ -1781,9 +1781,9 @@ in that frame; otherwise change each frame."
                     '(((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]))
@@ -1801,7 +1801,7 @@ in that frame; otherwise change each frame."
                     'global)
 (set-face-background-pixmap 'primary-selection
                            '(((x default mono) . "gray3")
-                             ;;((gtk default mono) . "gray3")
+                             ((gtk default mono) . "gray3")
                              ((mswindows default mono) . "gray3"))
                            'global)
 
@@ -1809,24 +1809,24 @@ in that frame; otherwise change each frame."
                     '(((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)
index 693b57c..d927539 100644 (file)
@@ -2,7 +2,7 @@
 
 ;; 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>
@@ -1203,10 +1203,15 @@ buffer modifications are performed or a buffer is reverted.")
 (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)
index 3b1adbb..223f8e0 100644 (file)
@@ -560,8 +560,8 @@ Prompts for bug subject.  Leaves you in a mail buffer."
     (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))
index 75abd1b..ad67f0d 100644 (file)
@@ -1484,8 +1484,8 @@ which will not be used as accelerators."
        ["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 ()
index 9eaa504..7141595 100644 (file)
@@ -532,7 +532,7 @@ button is held down (see also `mouse-track-y-threshold'), then a drag
 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)
@@ -570,7 +570,9 @@ Return true if the function was activated."
               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
@@ -578,33 +580,40 @@ Return true if the function was activated."
   ;; 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,
@@ -615,7 +624,7 @@ Return true if the function was activated."
   ;; 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',
@@ -629,6 +638,10 @@ behavior.  You can explicitly request this default behavior, and override
 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
@@ -669,7 +682,7 @@ at the initial click position."
       (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
@@ -683,14 +696,17 @@ at the initial click position."
                     (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))
@@ -698,12 +714,15 @@ at the initial click position."
                 (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)))
@@ -717,7 +736,14 @@ at the initial click position."
       (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
@@ -1039,29 +1065,33 @@ at the initial click position."
             ;;
             (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))
@@ -1315,12 +1345,14 @@ at the initial click position."
 (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."
@@ -1351,37 +1383,37 @@ custom mouse-track handlers that the user may have installed."
   (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.
index e287189..79a81e6 100644 (file)
@@ -53,6 +53,7 @@
   "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.")
@@ -121,13 +122,17 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
              (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
@@ -446,15 +451,17 @@ lost packets."
       ;; 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."
index f92b044..030099d 100644 (file)
@@ -32,8 +32,8 @@
 
 (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)
@@ -43,8 +43,8 @@ customized through the options menu."
 
 (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)
@@ -54,8 +54,9 @@ customized through the options menu."
 
 (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)
index 771b09b..e1938e7 100644 (file)
@@ -1,3 +1,33 @@
+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.
index 92437d5..150e168 100644 (file)
@@ -49,9 +49,15 @@ Boston, MA 02111-1307, USA.  */
 #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 */
@@ -142,9 +148,8 @@ xlw_create_popup_menu (widget_instance* instance)
   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 */
index 3e25262..097700e 100644 (file)
@@ -336,6 +336,36 @@ xm_update_pushbutton (widget_instance* instance, Widget widget,
   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
@@ -858,6 +888,10 @@ xm_update_one_widget (widget_instance* instance, Widget widget,
       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);
@@ -912,7 +946,7 @@ xm_update_one_value (widget_instance* instance, Widget widget,
       if (radiobox)
        {
          CompositeWidget radio = (CompositeWidget)widget;
-         int i;
+         unsigned int i;
          for (i = 0; i < radio->composite.num_children; i++)
            {
              int set = False;
@@ -1649,20 +1683,18 @@ xm_create_progress (widget_instance *instance)
 {
   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++;
@@ -1671,6 +1703,18 @@ xm_create_progress (widget_instance *instance)
      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);
 
index 44e5ebd..f9c90f5 100644 (file)
@@ -1389,6 +1389,22 @@ void lw_add_value_args_to_args (widget_value* wv, ArgList addto, int* offset)
     }
 }
 
+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;
index d2f0c54..ad0241b 100644 (file)
@@ -214,6 +214,7 @@ void lw_pop_up_all_widgets (LWLIB_ID id);
 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);
 
index 323fcab..f398f33 100644 (file)
@@ -1,3 +1,37 @@
+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.
index 70c82d9..f32038f 100644 (file)
@@ -7,7 +7,7 @@
 @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>
@@ -655,10 +655,9 @@ The most common pronounciation is @samp{Eks eemax}.
 @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)?
@@ -1056,8 +1055,7 @@ modification to @email{ava@@math.jhu.ed, Valery Alexeev's} @file{russian.el}
 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:
 
@@ -1077,7 +1075,7 @@ There is another cyrillic mode for both GNU Emacs and XEmacs by
 
 @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
@@ -3904,7 +3902,7 @@ Note that each string is a regular expression.
 @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.
 
@@ -4371,11 +4369,9 @@ did so.)
 @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
@@ -4543,7 +4539,7 @@ The most recent version is always available by ftp at
 @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}.
@@ -4552,7 +4548,7 @@ WWW users may want to check out the AUC TeX page at
 @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?
@@ -6717,8 +6713,10 @@ Etags changes.  See @file{NEWS} for full details.
 
 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?
index 6776abb..a7b7162 100644 (file)
@@ -32,12 +32,14 @@ local needs with safe removal of unnecessary code.
 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 
@@ -247,7 +249,8 @@ where I mention "Options -> Manage Packages", substitute "Tools ->
 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)
@@ -255,7 +258,8 @@ via keyb: @code{M-x customize-variable RET package-get-remote RET}
 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}
@@ -319,11 +323,13 @@ Moving the mouse over a package will also cause additional information
 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}
 
@@ -334,7 +340,8 @@ those packages also.
 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
index cebcb29..a622742 100644 (file)
@@ -562,10 +562,10 @@ bodies are not affected.
 
 @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
index f953df0..4a98f3c 100644 (file)
@@ -1,3 +1,13 @@
+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.
index d39ed5c..b4cea1d 100644 (file)
@@ -3,5 +3,5 @@
 #endif
 
 XEmacs ICON PRELOAD "xemacs.ico"
-XEmacsFile ICON "File.ico"
-XEmacsLisp ICON "Lisp.ico"
+XEmacsFile ICON "file.ico"
+XEmacsLisp ICON "lisp.ico"
index 43381b7..2a5dc11 100644 (file)
@@ -142,13 +142,17 @@ sheap_objs=sheap.o
 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
@@ -195,7 +199,7 @@ objs=\
  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\
index b3abc7b..faa910d 100644 (file)
@@ -573,7 +573,7 @@ when reading the arguments.
        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 */
index 0ee95f0..ff28a49 100644 (file)
@@ -1,4 +1,4 @@
-/* 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.
@@ -21,6 +21,16 @@ Boston, MA 02111-1307, USA.  */
 /* 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"
 
@@ -893,13 +903,40 @@ init_callproc (void)
   {
     /* 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);
   }
 }
index c1bc745..63ac69d 100644 (file)
@@ -50,6 +50,7 @@ Boston, MA 02111-1307, USA.  */
 /* 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;
@@ -179,17 +180,18 @@ mswindows_init_device (struct device *d, Lisp_Object props)
 #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,
@@ -202,6 +204,27 @@ mswindows_finish_init_device (struct device *d, Lisp_Object props)
   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
 }
 
@@ -340,12 +363,6 @@ mswindows_device_system_metrics (struct device *d,
   return Qunbound;
 }
 
-static unsigned int
-mswindows_device_implementation_flags (void)
-{
-  return XDEVIMPF_PIXEL_GEOMETRY;
-}
-
 \f
 /************************************************************************/
 /*                          printer helpers                             */
@@ -533,14 +550,6 @@ msprinter_mark_device (struct device *d)
   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                        */
@@ -1304,13 +1313,17 @@ console_type_create_device_mswindows (void)
   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));
 }
 
 
index 6c36f9f..399d61d 100644 (file)
@@ -1175,8 +1175,7 @@ window_system_pixelated_geometry (Lisp_Object domain)
   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, /*
index 1ef2b12..a870bbf 100644 (file)
@@ -48,6 +48,7 @@ struct pixel_to_glyph_translation_cache
 
 #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)
 
@@ -273,9 +274,7 @@ error_check_device_type (struct device *d, Lisp_Object sym)
 
 #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 {                                                 \
index 36417c0..bc3d29b 100644 (file)
@@ -637,7 +637,8 @@ On Unix it is obtained from TMPDIR, with /tmp as the default.
        {
          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;
        }
@@ -824,7 +825,7 @@ value of `user-full-name' is returned.
 #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
index 4745a66..a2eb0cf 100644 (file)
@@ -1610,6 +1610,8 @@ mswindows_wm_timer_callback (HWND hwnd, UINT umsg, UINT id_timer, DWORD dwtime)
  * 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,
@@ -1636,6 +1638,9 @@ mswindows_dde_callback (UINT uType, UINT uFmt, HCONV hconv,
       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);
@@ -1643,7 +1648,7 @@ mswindows_dde_callback (UINT uType, UINT uFmt, HCONV hconv,
          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);
@@ -2064,17 +2069,9 @@ mswindows_wnd_proc (HWND hwnd, UINT message_, WPARAM wParam, LPARAM lParam)
   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)
@@ -3781,7 +3778,9 @@ FROB (WM_NCHITTEST)
 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)
@@ -3804,12 +3803,12 @@ FROB (WM_SYSCHAR)
 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)
@@ -3893,6 +3892,7 @@ FROB (WM_EXITSIZEMOVE)
 FROB (WM_DROPFILES)
 FROB (WM_MDIREFRESHMENU)
 
+#ifdef WM_IME_SETCONTEXT /* not in Cygwin? */
 
 #if(WINVER >= 0x0400) && !defined(CYGWIN)
 FROB (WM_IME_SETCONTEXT)
@@ -3910,6 +3910,7 @@ FROB (WM_IME_KEYDOWN)
 FROB (WM_IME_KEYUP)
 #endif /* WINVER >= 0x0400 */
 
+#endif /* WM_IME_SETCONTEXT */
 
 #if(_WIN32_WINNT >= 0x0400)
 FROB (WM_MOUSEHOVER)
index fcd78b0..578da72 100644 (file)
@@ -53,14 +53,43 @@ Boston, MA 02111-1307, USA.  */
 #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);
@@ -427,7 +456,7 @@ Given a Unix syntax file name, returns a string ending in slash.
   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
@@ -482,7 +511,7 @@ or the entire name if it contains no slash.
   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
@@ -586,9 +615,9 @@ directory_file_name (const char *src, char *dst)
   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;
@@ -755,12 +784,13 @@ See also the function `substitute-in-file-name'.
   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
@@ -810,14 +840,13 @@ See also the function `substitute-in-file-name'.
       /* 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]))
@@ -834,10 +863,11 @@ See also the function `substitute-in-file-name'.
     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. */
@@ -845,6 +875,7 @@ See also the function `substitute-in-file-name'.
     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
@@ -865,6 +896,7 @@ See also the function `substitute-in-file-name'.
            if (colon[0] == ':')
              goto look_again;
        }
+      }
   }
 
   /* If we see "c://somedir", we want to strip the first slash after the
@@ -872,7 +904,7 @@ See also the function `substitute-in-file-name'.
      "//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
@@ -910,25 +942,30 @@ See also the function `substitute-in-file-name'.
        }
       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));
@@ -969,7 +1006,7 @@ See also the function `substitute-in-file-name'.
                                Qfile_name);
 
          nm++;
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
          collapse_newdir = 0;
 #endif
        }
@@ -1019,29 +1056,31 @@ See also the function `substitute-in-file-name'.
        }
     }
 
-#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. */
@@ -1050,7 +1089,8 @@ See also the function `substitute-in-file-name'.
 #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)
@@ -1058,7 +1098,7 @@ See also the function `substitute-in-file-name'.
       newdir = XSTRING_DATA (default_directory);
     }
 
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
   if (newdir)
     {
       /* First ensure newdir is an absolute name. */
@@ -1070,6 +1110,10 @@ See also the function `substitute-in-file-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).
@@ -1085,19 +1129,22 @@ See also the function `substitute-in-file-name'.
            }
          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. */
@@ -1109,11 +1156,18 @@ See also the function `substitute-in-file-name'.
 
       /* 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++;
@@ -1121,10 +1175,10 @@ See also the function `substitute-in-file-name'.
              *p = 0;
            }
          else
-           newdir = "";
+           newdir = (Bufbyte *) "";
        }
     }
-#endif /* WIN32_NATIVE */
+#endif /* WIN32_FILENAMES */
 
   if (newdir)
     {
@@ -1132,7 +1186,7 @@ See also the function `substitute-in-file-name'.
         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
          )
@@ -1149,14 +1203,14 @@ See also the function `substitute-in-file-name'.
 
   /* 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)
@@ -1205,7 +1259,7 @@ See also the function `substitute-in-file-name'.
            ++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) */
@@ -1218,7 +1272,7 @@ See also the function `substitute-in-file-name'.
        }
     }
 
-#ifdef WIN32_NATIVE
+#ifdef WIN32_FILENAMES
   /* At last, set drive name, except for network file name.  */
   if (drive)
     {
@@ -1226,12 +1280,14 @@ See also the function `substitute-in-file-name'.
       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));
 }
@@ -1308,7 +1364,7 @@ No component of the resulting pathname will be a symbolic link, as
          {
            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 */
@@ -1428,12 +1484,12 @@ If `/~' appears, all of FILENAME through that `/' is discarded.
   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])))
@@ -1441,7 +1497,7 @@ If `/~' appears, all of FILENAME through that `/' is discarded.
          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]))
@@ -1449,7 +1505,7 @@ If `/~' appears, all of FILENAME through that `/' is discarded.
          nm = p;
          substituted = 1;
        }
-#endif /* WIN32_NATIVE */
+#endif /* WIN32_FILENAMES */
     }
 
   /* See if any variables are substituted into the string
@@ -1559,16 +1615,16 @@ If `/~' appears, all of FILENAME through that `/' is discarded.
 
   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;
@@ -2165,7 +2221,7 @@ On Unix, this is a name starting with a `/' or a `~'.
   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;
@@ -2283,14 +2339,14 @@ See also `file-exists-p' and `file-attributes'.
   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;
@@ -2299,7 +2355,7 @@ See also `file-exists-p' and `file-attributes'.
     close (desc);
     return Qt;
   }
-#endif /* not WIN32_NATIVE */
+#endif /* not WIN32_FILENAMES */
 }
 
 /* Having this before file-symlink-p mysteriously caused it to be forgotten
index 39bb3f4..07a762e 100644 (file)
@@ -2091,6 +2091,12 @@ extern int debug_widget_instances;
 #endif
 
 static void
+finalize_destroy_window (void *win)
+{
+  DestroyWindow ((HWND) win);
+}
+
+static void
 mswindows_finalize_image_instance (Lisp_Image_Instance *p)
 {
   if (!p->data)
@@ -2107,8 +2113,14 @@ mswindows_finalize_image_instance (Lisp_Image_Instance *p)
 #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;
            }
        }
index b45832d..ae7d3be 100644 (file)
@@ -2778,7 +2778,7 @@ x_tab_control_redisplay (Lisp_Object image_instance)
                     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;
@@ -2794,7 +2794,9 @@ x_tab_control_redisplay (Lisp_Object image_instance)
                      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;
                        }
                    }
index 2eac6d0..2615d67 100644 (file)
--- a/src/nt.c
+++ b/src/nt.c
@@ -1,4 +1,4 @@
-/* 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.
@@ -247,12 +247,12 @@ init_user_info (void)
   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
@@ -1824,7 +1824,8 @@ unsigned signal_block_mask = 0;
 /* 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)
@@ -1844,40 +1845,43 @@ mswindows_sighandler mswindows_sigset (int nsig, mswindows_sighandler handler)
   }
 }
   
-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)
@@ -1887,9 +1891,9 @@ int mswindows_raise (int nsig)
     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;
     }
 
@@ -1898,7 +1902,7 @@ int mswindows_raise (int nsig)
 
   if (signal_handlers[nsig] != SIG_DFL)
     {
-      (*signal_handlers[nsig])(nsig);
+      (*signal_handlers[nsig]) (nsig);
       return 0;
     }
 
@@ -1910,122 +1914,6 @@ int mswindows_raise (int nsig)
   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                         */
@@ -2318,9 +2206,9 @@ mswindows_utime (Lisp_Object path, struct utimbuf *times)
 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
index 6432878..60e6efd 100644 (file)
--- a/src/nt.h
+++ b/src/nt.h
@@ -27,6 +27,7 @@ Boston, MA 02111-1307, USA.  */
 #define INCLUDED_nt_h_
 
 #include "syswindows.h"
+#include "systime.h" /* because of struct utimbuf below */
 
 #ifdef DEBUG_XEMACS
 #define DebPrint(stuff) _DebPrint stuff
index 6a39332..d1daca3 100644 (file)
@@ -1,4 +1,4 @@
-/* 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.
@@ -24,6 +24,16 @@ Boston, MA 02111-1307, USA.
 /* 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
@@ -1316,7 +1326,7 @@ When non-nil, they show their window in the method of their choice.
               &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.
index 34da238..2cf4b68 100644 (file)
@@ -1383,7 +1383,7 @@ vars_of_process_nt (void)
               &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.
index df7e824..c0d1989 100644 (file)
@@ -220,6 +220,7 @@ allocate_pty (void)
      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;
@@ -342,6 +343,7 @@ allocate_pty (void)
  lose:
   if (master_fd >= 0)
     close (master_fd);
+#endif /* ndef FORCE_ALLOCATE_PTY_THE_OLD_FASHIONED_WAY */
   return allocate_pty_the_old_fashioned_way ();
 }
 
@@ -1981,7 +1983,7 @@ unix_open_multicast_group (Lisp_Object name, Lisp_Object dest,
   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 ------------------------ */
 
@@ -2001,7 +2003,7 @@ unix_open_multicast_group (Lisp_Object name, Lisp_Object dest,
     }
 
   /* 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)
index 4d097bc..91753e0 100644 (file)
@@ -30,6 +30,10 @@ Boston, MA 02111-1307, USA.  */
 #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
@@ -192,7 +196,7 @@ will be properly accumulated.
   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;
 }
 
@@ -207,7 +211,7 @@ Stop profiling.
   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;
index c6d7c45..b15f1d6 100644 (file)
@@ -44,6 +44,7 @@ Boston, MA 02111-1307, USA.  */
   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
index 403a1dd..2d7e9a9 100644 (file)
@@ -88,9 +88,21 @@ mswindows_free_scrollbar_instance (struct scrollbar_instance *sb)
 }
 
 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;
 }
 
@@ -192,6 +204,20 @@ mswindows_handle_scrollbar_event (HWND hwnd, int code, int pos)
 
   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);
 
index 67abf86..f85d83c 100644 (file)
@@ -102,7 +102,7 @@ set_one_shot_timer (EMACS_TIME interval)
   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);
@@ -327,6 +327,7 @@ handle_alarm_going_off (void)
 }
 
 #ifdef HAVE_SETITIMER
+
 unsigned int
 alarm (unsigned int howlong)
 {
@@ -340,12 +341,27 @@ 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.
index b4497c4..915cf29 100644 (file)
@@ -251,12 +251,46 @@ struct itimerval
   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_ */
index 8d78ae8..c8eb2a8 100644 (file)
@@ -2534,6 +2534,7 @@ enum window_loop
   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 */
@@ -2686,6 +2687,13 @@ window_loop (enum window_loop type,
                  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
@@ -2812,6 +2820,12 @@ buffer_window_mru (struct window *w)
 
 #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.
index 69cd2a7..8a79336 100644 (file)
@@ -361,6 +361,7 @@ int window_left_gutter_width (struct window *w, int modeline);
 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,
index 7b13a29..6db07bb 100644 (file)
@@ -1,3 +1,7 @@
+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.
index 1f9c914..d8e7867 100644 (file)
@@ -2,8 +2,8 @@
 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