XEmacs 21.2.34 "Molpe".
authortomo <tomo>
Tue, 6 Jun 2000 04:18:26 +0000 (04:18 +0000)
committertomo <tomo>
Tue, 6 Jun 2000 04:18:26 +0000 (04:18 +0000)
123 files changed:
CHANGES-beta
ChangeLog
configure
configure.in
etc/Emacs.ad
info/internals.info
info/lispref.info
info/xemacs.info
info/xemacs.info-2
info/xemacs.info-3
info/xemacs.info-4
lib-src/ChangeLog
lib-src/config.values.in
lib-src/i.c
lib-src/make-docfile.c
lisp/ChangeLog
lisp/custom-load.el
lisp/faces.el
lisp/files.el
lisp/font-lock.el
lisp/glyphs.el
lisp/gutter-items.el
lisp/gutter.el
lisp/keydefs.el
lisp/loadhist.el
lisp/menubar-items.el
lisp/minibuf.el
lisp/objects.el
lisp/packages.el
lisp/process.el
lisp/setup-paths.el
lisp/simple.el
lisp/specifier.el
lisp/startup.el
lisp/toolbar.el
lisp/update-elc.el
lwlib/ChangeLog
man/ChangeLog
man/internals/internals.texi
man/lispref/compile.texi
man/lispref/databases.texi
man/lispref/display.texi
man/lispref/extents.texi
man/lispref/faces.texi
man/lispref/glyphs.texi
man/lispref/gutter.texi
man/lispref/modes.texi
man/lispref/specifiers.texi
man/lispref/toolbar.texi
man/xemacs/basic.texi
man/xemacs/entering.texi
man/xemacs/mini.texi
man/xemacs/startup.texi
nt/ChangeLog
src/ChangeLog
src/buffer.c
src/buffer.h
src/callproc.c
src/cmdloop.c
src/config.h.in
src/console-msw.c
src/console-msw.h
src/console-stream.c
src/console.h
src/device-msw.c
src/device.h
src/emacs.c
src/eval.c
src/event-Xt.c
src/event-msw.c
src/event-stream.c
src/fns.c
src/frame-msw.c
src/frame.c
src/frame.h
src/frameslots.h
src/general.c
src/glyphs-eimage.c
src/glyphs-msw.c
src/glyphs-msw.h
src/glyphs-widget.c
src/glyphs-x.c
src/glyphs-x.h
src/glyphs.c
src/glyphs.h
src/gui-msw.c
src/gui-x.c
src/gui.c
src/gutter.c
src/lisp.h
src/nt.c
src/nt.h
src/ntheap.c
src/ntheap.h
src/ntplay.c
src/ntproc.c
src/objects-msw.c
src/objects.c
src/paths.h.in
src/postgresql.c
src/print.c
src/process-nt.c
src/process.c
src/rangetab.c
src/redisplay-msw.c
src/redisplay-output.c
src/redisplay-tty.c
src/redisplay-x.c
src/redisplay.c
src/s/cygwin32.h
src/s/mingw32.h
src/scrollbar.c
src/specifier.c
src/specifier.h
src/toolbar-msw.c
src/toolbar.c
src/unexelf.c
src/unexnt.c
src/window.c
src/window.h
tests/ChangeLog
tests/glyph-test.el
version.sh

index b7c269e..5d382f6 100644 (file)
@@ -1,3 +1,11 @@
+to 21.2.34 "Molpe"
+-- Lots of changes to GUI, Windows, font-lock code, Ben Wing
+-- Lots of changes to GUI, Windows code, Andy Piper
+-- Various fixes, Karl Hegbloom
+-- User manual documentation updates, Yoshiki Hayashi
+-- Dumping fixes, Yoshiki Hayashi
+-- Define C-x BS to backward-kill-sentence, Yoshiki Hayashi
+
 to 21.2.33 "Melpomene"
 -- Yet more progress gauge and gutter redisplay fixes from Andy Piper
 -- glyph error checking from Andy Piper
index 980b5a2..7fb99d7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2000-05-28  Martin Buchholz <martin@xemacs.org>
+
+       * XEmacs 21.2.34 is released.
+
+2000-05-15  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * configure.in:
+       Do not define DOUG_LEA_MALLOC when using other malloc scheme.
+       Remove unused variable use_minimal_tagbits.
+
+2000-05-02  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * configure.in: Remove lockdir.
+
+2000-04-15  Andy Piper  <andy@xemacs.org>
+
+       * etc/Emacs.ad: add select-start() back into text translations.
+
 2000-05-01  Martin Buchholz <martin@xemacs.org>
 
        * XEmacs 21.2.33 is released.
index e174b50..abe0359 100755 (executable)
--- a/configure
+++ b/configure
@@ -240,7 +240,6 @@ sitemoduledir='${datadir}/${inststaticdir}/site-modules'
 pkgdir='${datadir}/${instvardir}/lisp'
 package_path=''
 etcdir='${datadir}/${instvardir}/etc'
-lockdir='${statedir}/${inststaticdir}/lock'
 archlibdir='${datadir}/${instvardir}/${configuration}'
 docdir='${archlibdir}'
 with_prefix='yes'
@@ -584,7 +583,7 @@ echo "  Use \`$progname --help' to show usage.") >&2 && exit 1
 
                                
                prefix | exec_prefix | bindir | datadir | statedir | libdir | \
-       mandir | infodir | infopath | lispdir | etcdir | lockdir | pkgdir | \
+       mandir | infodir | infopath | lispdir | etcdir | pkgdir | \
        archlibdir | docdir | package_path )
                   if test "$valomitted" = "yes"; then
             if test "$#" = 0; then
@@ -694,14 +693,6 @@ cat >> confdefs.h <<\EOF
 EOF
 }
  ;;
-             statedir | lockdir ) { test "$extra_verbose" = "yes" && cat << \EOF
-    Defining LOCKDIR_USER_DEFINED
-EOF
-cat >> confdefs.h <<\EOF
-#define LOCKDIR_USER_DEFINED 1
-EOF
-}
- ;;
             docdir ) { test "$extra_verbose" = "yes" && cat << \EOF
     Defining DOCDIR_USER_DEFINED
 EOF
@@ -838,7 +829,7 @@ echo "  Use \`$progname --help' to show usage.") >&2 && exit 1
 fi
 
 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:842: checking whether ln -s works" >&5
+echo "configure:833: checking whether ln -s works" >&5
 
 rm -f conftestdata
 if ln -s X conftestdata 2>/dev/null
@@ -1103,7 +1094,7 @@ EOF
 
 
 echo $ac_n "checking "host system type"""... $ac_c" 1>&6
-echo "configure:1107: checking "host system type"" >&5
+echo "configure:1098: checking "host system type"" >&5
 internal_configuration=`echo $configuration | sed 's/-\(workshop\)//'`
 canonical=`${CONFIG_SHELL-/bin/sh} $srcdir/config.sub "$internal_configuration"`
 configuration=`echo "$configuration" | sed 's/^\([^-][^-]*-[^-][^-]*-[^-][^-]*\)-.*$/\1/'`
@@ -1598,7 +1589,7 @@ xe_save_CFLAGS="$CFLAGS"
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1602: checking for $ac_word" >&5
+echo "configure:1593: checking for $ac_word" >&5
 
 if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -1625,7 +1616,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1629: checking for $ac_word" >&5
+echo "configure:1620: checking for $ac_word" >&5
 
 if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -1673,7 +1664,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1677: checking for $ac_word" >&5
+echo "configure:1668: checking for $ac_word" >&5
 
 if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -1702,7 +1693,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1706: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1697: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 xe_cppflags='$CPPFLAGS $c_switch_site $c_switch_machine $c_switch_system $c_switch_x_site $X_CFLAGS'
@@ -1715,12 +1706,12 @@ cross_compiling=no
 
 cat > conftest.$ac_ext << EOF
 
-#line 1719 "configure"
+#line 1710 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:1724: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1715: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -1748,19 +1739,19 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1752: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1743: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1757: checking whether we are using GNU C" >&5
+echo "configure:1748: checking whether we are using GNU C" >&5
 
 cat > conftest.c <<EOF
 #ifdef __GNUC__
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1764: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1755: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -1778,7 +1769,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1782: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1773: checking whether ${CC-cc} accepts -g" >&5
 
 echo 'void f(){}' > conftest.c
 if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
@@ -1811,7 +1802,7 @@ if   test "$with_gcc" = "no"  -a "$GCC" = "yes"; then
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1815: checking for $ac_word" >&5
+echo "configure:1806: checking for $ac_word" >&5
 
 if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -1838,7 +1829,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1842: checking for $ac_word" >&5
+echo "configure:1833: checking for $ac_word" >&5
 
 if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -1886,7 +1877,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1890: checking for $ac_word" >&5
+echo "configure:1881: checking for $ac_word" >&5
 
 if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -1915,7 +1906,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:1919: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:1910: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 xe_cppflags='$CPPFLAGS $c_switch_site $c_switch_machine $c_switch_system $c_switch_x_site $X_CFLAGS'
@@ -1928,12 +1919,12 @@ cross_compiling=no
 
 cat > conftest.$ac_ext << EOF
 
-#line 1932 "configure"
+#line 1923 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:1937: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:1928: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -1961,19 +1952,19 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:1965: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:1956: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:1970: checking whether we are using GNU C" >&5
+echo "configure:1961: checking whether we are using GNU C" >&5
 
 cat > conftest.c <<EOF
 #ifdef __GNUC__
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1977: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1968: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -1991,7 +1982,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:1995: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:1986: checking whether ${CC-cc} accepts -g" >&5
 
 echo 'void f(){}' > conftest.c
 if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
@@ -2024,7 +2015,7 @@ elif test "$with_gcc" = "yes" -a "$GCC" != "yes" ; then
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2028: checking for $ac_word" >&5
+echo "configure:2019: checking for $ac_word" >&5
 
 if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -2051,7 +2042,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2055: checking for $ac_word" >&5
+echo "configure:2046: checking for $ac_word" >&5
 
 if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -2099,7 +2090,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:2103: checking for $ac_word" >&5
+echo "configure:2094: checking for $ac_word" >&5
 
 if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -2128,7 +2119,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:2132: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:2123: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 xe_cppflags='$CPPFLAGS $c_switch_site $c_switch_machine $c_switch_system $c_switch_x_site $X_CFLAGS'
@@ -2141,12 +2132,12 @@ cross_compiling=no
 
 cat > conftest.$ac_ext << EOF
 
-#line 2145 "configure"
+#line 2136 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:2150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2141: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -2174,19 +2165,19 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:2178: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:2169: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:2183: checking whether we are using GNU C" >&5
+echo "configure:2174: checking whether we are using GNU C" >&5
 
 cat > conftest.c <<EOF
 #ifdef __GNUC__
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2190: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2181: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -2204,7 +2195,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:2208: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:2199: checking whether ${CC-cc} accepts -g" >&5
 
 echo 'void f(){}' > conftest.c
 if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
@@ -2241,7 +2232,7 @@ test -n "$CPP" -a -d "$CPP" && CPP=
 test -n "$NON_GNU_CPP" -a "$GCC" != "yes" -a -z "$CPP" && CPP="$NON_GNU_CPP"
 
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:2245: checking how to run the C preprocessor" >&5
+echo "configure:2236: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -2254,13 +2245,13 @@ if test -z "$CPP"; then
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 2258 "configure"
+#line 2249 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2264: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2255: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -2271,13 +2262,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 2275 "configure"
+#line 2266 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2281: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2272: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -2288,13 +2279,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 2292 "configure"
+#line 2283 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:2298: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:2289: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -2320,9 +2311,9 @@ echo "$ac_t""$CPP" 1>&6
 
 
 echo $ac_n "checking for AIX""... $ac_c" 1>&6
-echo "configure:2324: checking for AIX" >&5
+echo "configure:2315: checking for AIX" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2326 "configure"
+#line 2317 "configure"
 #include "confdefs.h"
 #ifdef _AIX
   yes
@@ -2351,9 +2342,9 @@ cat > $srcdir/conffoo.h <<EOF
 #define CONFFOO 1
 EOF
 echo $ac_n "checking for a working inclusion macro""... $ac_c" 1>&6
-echo "configure:2355: checking for a working inclusion macro" >&5
+echo "configure:2346: checking for a working inclusion macro" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2357 "configure"
+#line 2348 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -2365,7 +2356,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2369: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2360: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
    echo "$ac_t""direct" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF
     Defining SMART_INCLUDE_INDIRECTIONS = 0
@@ -2380,7 +2371,7 @@ else
   cat conftest.$ac_ext >&5
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 2384 "configure"
+#line 2375 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -2393,7 +2384,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2397: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2388: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
    echo "$ac_t""simple" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF
     Defining SMART_INCLUDE_INDIRECTIONS = 1
@@ -2408,7 +2399,7 @@ else
   cat conftest.$ac_ext >&5
   rm -rf conftest*
   cat > conftest.$ac_ext <<EOF
-#line 2412 "configure"
+#line 2403 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -2422,7 +2413,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2426: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2417: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
    echo "$ac_t""double" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF
     Defining SMART_INCLUDE_INDIRECTIONS = 2
@@ -2448,9 +2439,9 @@ rm -f $srcdir/conffoo.h
 
 
 echo $ac_n "checking for GNU libc""... $ac_c" 1>&6
-echo "configure:2452: checking for GNU libc" >&5
+echo "configure:2443: checking for GNU libc" >&5
 cat > conftest.$ac_ext <<EOF
-#line 2454 "configure"
+#line 2445 "configure"
 #include "confdefs.h"
 #include <features.h>
 int main() {
@@ -2462,7 +2453,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2466: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2457: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   have_glibc=yes
 else
@@ -2539,7 +2530,7 @@ EOF
 esac
 
 cat > conftest.$ac_ext <<EOF
-#line 2543 "configure"
+#line 2534 "configure"
 #include "confdefs.h"
 int main () {
 #if defined __SUNPRO_C
@@ -2551,7 +2542,7 @@ return 0;
 #endif
 }
 EOF
-if { (eval echo configure:2555: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:2546: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   :
 else
@@ -2787,7 +2778,7 @@ fi
 
 if test "$GCC" = "yes"; then
 echo $ac_n "checking for buggy gcc versions""... $ac_c" 1>&6
-echo "configure:2791: checking for buggy gcc versions" >&5
+echo "configure:2782: checking for buggy gcc versions" >&5
 GCC_VERSION=`$CC --version`
 case `uname -s`:`uname -m`:$GCC_VERSION in
                    *:sun4*:2.8.1|*:sun4*:egcs-2.90.*)
@@ -2910,7 +2901,7 @@ test "$pdump" = "yes" && extra_objs="$extra_objs dumper.o" &&  if test "$extra_v
  fi
 
 echo $ac_n "checking for dynodump""... $ac_c" 1>&6
-echo "configure:2914: checking for dynodump" >&5
+echo "configure:2905: checking for dynodump" >&5
 if test "$unexec" != "unexsol2.o"; then
   echo "$ac_t""no" 1>&6
 else
@@ -2948,12 +2939,12 @@ if test "$unexec" = "unexaix.o"; then
   done
   
 echo $ac_n "checking for terminateAndUnload in -lC""... $ac_c" 1>&6
-echo "configure:2952: checking for terminateAndUnload in -lC" >&5
+echo "configure:2943: checking for terminateAndUnload in -lC" >&5
 ac_lib_var=`echo C'_'terminateAndUnload | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lC "
 cat > conftest.$ac_ext <<EOF
-#line 2957 "configure"
+#line 2948 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -2964,7 +2955,7 @@ int main() {
 terminateAndUnload()
 ; return 0; }
 EOF
-if { (eval echo configure:2968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3072,7 +3063,7 @@ fi
 
 if test "$add_runtime_path" = "yes"; then
       echo $ac_n "checking "for runtime libraries flag"""... $ac_c" 1>&6
-echo "configure:3076: checking "for runtime libraries flag"" >&5
+echo "configure:3067: checking "for runtime libraries flag"" >&5
   case "$opsys" in
     sol2 ) dash_r="-R" ;;
     decosf* | linux* | irix*) dash_r="-rpath " ;;
@@ -3094,14 +3085,14 @@ if test "$GCC" = "yes"; then
   done
 fi
         cat > conftest.$ac_ext <<EOF
-#line 3098 "configure"
+#line 3089 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3105: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3096: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   dash_r="$try_dash_r"
 else
@@ -3202,57 +3193,11 @@ else
        doug_lea_malloc=no
 fi
 after_morecore_hook_exists=yes
-echo $ac_n "checking for malloc_get_state""... $ac_c" 1>&6
-echo "configure:3207: checking for malloc_get_state" >&5
-
-cat > conftest.$ac_ext <<EOF
-#line 3210 "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char malloc_get_state(); below.  */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error.  */
-/* We use char because int might match the return type of a gcc2
-    builtin and then its argument prototype would still apply.  */
-char malloc_get_state();
-
-int main() {
-
-/* The GNU C library defines this for functions which it implements
-    to always fail with ENOSYS.  Some functions are actually named
-    something starting with __ and the normal name is an alias.  */
-#if defined (__stub_malloc_get_state) || defined (__stub___malloc_get_state)
-choke me
-#else
-malloc_get_state();
-#endif
-
-; return 0; }
-EOF
-if { (eval echo configure:3233: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
-  rm -rf conftest*
-  eval "ac_cv_func_malloc_get_state=yes"
-else
-  echo "configure: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  rm -rf conftest*
-  eval "ac_cv_func_malloc_get_state=no"
-fi
-rm -f conftest*
-
-if eval "test \"`echo '$ac_cv_func_'malloc_get_state`\" = yes"; then
-  echo "$ac_t""yes" 1>&6
-  :
-else
-  echo "$ac_t""no" 1>&6
-doug_lea_malloc=no
-fi
-
 echo $ac_n "checking for malloc_set_state""... $ac_c" 1>&6
-echo "configure:3253: checking for malloc_set_state" >&5
+echo "configure:3198: checking for malloc_set_state" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3256 "configure"
+#line 3201 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char malloc_set_state(); below.  */
@@ -3275,7 +3220,7 @@ malloc_set_state();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3279: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3224: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_malloc_set_state=yes"
 else
@@ -3295,16 +3240,16 @@ doug_lea_malloc=no
 fi
 
 echo $ac_n "checking whether __after_morecore_hook exists""... $ac_c" 1>&6
-echo "configure:3299: checking whether __after_morecore_hook exists" >&5
+echo "configure:3244: checking whether __after_morecore_hook exists" >&5
 cat > conftest.$ac_ext <<EOF
-#line 3301 "configure"
+#line 3246 "configure"
 #include "confdefs.h"
 extern void (* __after_morecore_hook)();
 int main() {
 __after_morecore_hook = 0
 ; return 0; }
 EOF
-if { (eval echo configure:3308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3253: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
 else
@@ -3329,11 +3274,9 @@ elif test "$with_debug_malloc" = "yes" ; then
     - User chose to use Debugging Malloc."
 fi
 
-if test "$doug_lea_malloc" = "yes" ; then
-  if test "$GNU_MALLOC" = yes ; then
-    GNU_MALLOC_reason="
+if test "$doug_lea_malloc" = "yes" -a "$GNU_MALLOC" = "yes" ; then
+  GNU_MALLOC_reason="
     - Using Doug Lea's new malloc from the GNU C Library."
-  fi
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining DOUG_LEA_MALLOC
 EOF
@@ -3354,7 +3297,6 @@ EOF
 }
 
   fi
-  use_minimal_tagbits=yes
 fi
 
 
@@ -3363,7 +3305,7 @@ fi
 # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3367: checking for $ac_word" >&5
+echo "configure:3309: checking for $ac_word" >&5
 
 if test -n "$RANLIB"; then
   ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
@@ -3418,7 +3360,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:3422: checking for a BSD compatible install" >&5
+echo "configure:3364: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 
   IFS="${IFS=  }"; ac_save_IFS="$IFS"; IFS=":"
@@ -3472,7 +3414,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3476: checking for $ac_word" >&5
+echo "configure:3418: checking for $ac_word" >&5
 
 if test -n "$YACC"; then
   ac_cv_prog_YACC="$YACC" # Let the user override the test.
@@ -3504,15 +3446,15 @@ for ac_hdr in   a.out.h   cygwin/version.h   fcntl.h   inttypes.h   libgen.h   l
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:3508: checking for $ac_hdr" >&5
+echo "configure:3450: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3511 "configure"
+#line 3453 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3516: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3458: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3542,10 +3484,10 @@ fi
 done
 
 echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
-echo "configure:3546: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo "configure:3488: checking for sys/wait.h that is POSIX.1 compatible" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3549 "configure"
+#line 3491 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -3561,7 +3503,7 @@ wait (&s);
 s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
 ; return 0; }
 EOF
-if { (eval echo configure:3565: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3507: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_sys_wait_h=yes
 else
@@ -3585,10 +3527,10 @@ EOF
 fi
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:3589: checking for ANSI C header files" >&5
+echo "configure:3531: checking for ANSI C header files" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3592 "configure"
+#line 3534 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -3596,7 +3538,7 @@ cat > conftest.$ac_ext <<EOF
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3600: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3542: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3613,7 +3555,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 3617 "configure"
+#line 3559 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -3631,7 +3573,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 3635 "configure"
+#line 3577 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -3649,7 +3591,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
 cat > conftest.$ac_ext <<EOF
-#line 3653 "configure"
+#line 3595 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -3660,7 +3602,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:3664: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:3606: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   :
 else
@@ -3686,10 +3628,10 @@ EOF
 fi
 
 echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
-echo "configure:3690: checking whether time.h and sys/time.h may both be included" >&5
+echo "configure:3632: checking whether time.h and sys/time.h may both be included" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3693 "configure"
+#line 3635 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/time.h>
@@ -3698,7 +3640,7 @@ int main() {
 struct tm *tp;
 ; return 0; }
 EOF
-if { (eval echo configure:3702: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3644: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_header_time=yes
 else
@@ -3722,10 +3664,10 @@ EOF
 fi
 
 echo $ac_n "checking for sys_siglist declaration in signal.h or unistd.h""... $ac_c" 1>&6
-echo "configure:3726: checking for sys_siglist declaration in signal.h or unistd.h" >&5
+echo "configure:3668: checking for sys_siglist declaration in signal.h or unistd.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3729 "configure"
+#line 3671 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -3737,7 +3679,7 @@ int main() {
 char *msg = *(sys_siglist + 1);
 ; return 0; }
 EOF
-if { (eval echo configure:3741: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3683: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_decl_sys_siglist=yes
 else
@@ -3762,9 +3704,9 @@ fi
 
 
 echo $ac_n "checking for struct utimbuf""... $ac_c" 1>&6
-echo "configure:3766: checking for struct utimbuf" >&5
+echo "configure:3708: checking for struct utimbuf" >&5
 cat > conftest.$ac_ext <<EOF
-#line 3768 "configure"
+#line 3710 "configure"
 #include "confdefs.h"
 #ifdef TIME_WITH_SYS_TIME
 #include <sys/time.h>
@@ -3783,7 +3725,7 @@ int main() {
 static struct utimbuf x; x.actime = x.modtime;
 ; return 0; }
 EOF
-if { (eval echo configure:3787: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3729: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
    { test "$extra_verbose" = "yes" && cat << \EOF
@@ -3803,10 +3745,10 @@ fi
 rm -f conftest*
 
 echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
-echo "configure:3807: checking return type of signal handlers" >&5
+echo "configure:3749: checking return type of signal handlers" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3810 "configure"
+#line 3752 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <signal.h>
@@ -3823,7 +3765,7 @@ int main() {
 int i;
 ; return 0; }
 EOF
-if { (eval echo configure:3827: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3769: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_type_signal=void
 else
@@ -3845,10 +3787,10 @@ EOF
 
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:3849: checking for size_t" >&5
+echo "configure:3791: checking for size_t" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3852 "configure"
+#line 3794 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3879,10 +3821,10 @@ EOF
 fi
 
 echo $ac_n "checking for pid_t""... $ac_c" 1>&6
-echo "configure:3883: checking for pid_t" >&5
+echo "configure:3825: checking for pid_t" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3886 "configure"
+#line 3828 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3913,10 +3855,10 @@ EOF
 fi
 
 echo $ac_n "checking for uid_t in sys/types.h""... $ac_c" 1>&6
-echo "configure:3917: checking for uid_t in sys/types.h" >&5
+echo "configure:3859: checking for uid_t in sys/types.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3920 "configure"
+#line 3862 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 EOF
@@ -3952,10 +3894,10 @@ EOF
 fi
 
 echo $ac_n "checking for mode_t""... $ac_c" 1>&6
-echo "configure:3956: checking for mode_t" >&5
+echo "configure:3898: checking for mode_t" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3959 "configure"
+#line 3901 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3986,10 +3928,10 @@ EOF
 fi
 
 echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:3990: checking for off_t" >&5
+echo "configure:3932: checking for off_t" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 3993 "configure"
+#line 3935 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -4020,10 +3962,10 @@ EOF
 fi
 
 echo $ac_n "checking for ssize_t""... $ac_c" 1>&6
-echo "configure:4024: checking for ssize_t" >&5
+echo "configure:3966: checking for ssize_t" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4027 "configure"
+#line 3969 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -4055,9 +3997,9 @@ fi
 
 
 echo $ac_n "checking for struct timeval""... $ac_c" 1>&6
-echo "configure:4059: checking for struct timeval" >&5
+echo "configure:4001: checking for struct timeval" >&5
 cat > conftest.$ac_ext <<EOF
-#line 4061 "configure"
+#line 4003 "configure"
 #include "confdefs.h"
 #ifdef TIME_WITH_SYS_TIME
 #include <sys/time.h>
@@ -4073,7 +4015,7 @@ int main() {
 static struct timeval x; x.tv_sec = x.tv_usec;
 ; return 0; }
 EOF
-if { (eval echo configure:4077: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4019: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
   HAVE_TIMEVAL=yes
@@ -4095,10 +4037,10 @@ fi
 rm -f conftest*
 
 echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
-echo "configure:4099: checking whether struct tm is in sys/time.h or time.h" >&5
+echo "configure:4041: checking whether struct tm is in sys/time.h or time.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4102 "configure"
+#line 4044 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <time.h>
@@ -4106,7 +4048,7 @@ int main() {
 struct tm *tp; tp->tm_sec;
 ; return 0; }
 EOF
-if { (eval echo configure:4110: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4052: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_struct_tm=time.h
 else
@@ -4130,10 +4072,10 @@ EOF
 fi
 
 echo $ac_n "checking for tm_zone in struct tm""... $ac_c" 1>&6
-echo "configure:4134: checking for tm_zone in struct tm" >&5
+echo "configure:4076: checking for tm_zone in struct tm" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4137 "configure"
+#line 4079 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <$ac_cv_struct_tm>
@@ -4141,7 +4083,7 @@ int main() {
 struct tm tm; tm.tm_zone;
 ; return 0; }
 EOF
-if { (eval echo configure:4145: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4087: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_struct_tm_zone=yes
 else
@@ -4164,10 +4106,10 @@ EOF
 
 else
   echo $ac_n "checking for tzname""... $ac_c" 1>&6
-echo "configure:4168: checking for tzname" >&5
+echo "configure:4110: checking for tzname" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4171 "configure"
+#line 4113 "configure"
 #include "confdefs.h"
 #include <time.h>
 #ifndef tzname /* For SGI.  */
@@ -4177,7 +4119,7 @@ int main() {
 atoi(*tzname);
 ; return 0; }
 EOF
-if { (eval echo configure:4181: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4123: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_var_tzname=yes
 else
@@ -4203,10 +4145,10 @@ fi
 
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:4207: checking for working const" >&5
+echo "configure:4149: checking for working const" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4210 "configure"
+#line 4152 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -4255,7 +4197,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:4259: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4201: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -4280,7 +4222,7 @@ fi
 
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:4284: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:4226: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 
 cat > conftestmake <<\EOF
@@ -4305,12 +4247,12 @@ fi
 
 
 echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
-echo "configure:4309: checking whether byte ordering is bigendian" >&5
+echo "configure:4251: checking whether byte ordering is bigendian" >&5
 
 ac_cv_c_bigendian=unknown
 # See if sys/param.h defines the BYTE_ORDER macro.
 cat > conftest.$ac_ext <<EOF
-#line 4314 "configure"
+#line 4256 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -4321,11 +4263,11 @@ int main() {
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:4325: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4267: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   # It does; now see whether it defined to BIG_ENDIAN or not.
 cat > conftest.$ac_ext <<EOF
-#line 4329 "configure"
+#line 4271 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #include <sys/param.h>
@@ -4336,7 +4278,7 @@ int main() {
 #endif
 ; return 0; }
 EOF
-if { (eval echo configure:4340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4282: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_bigendian=yes
 else
@@ -4353,7 +4295,7 @@ fi
 rm -f conftest*
 if test $ac_cv_c_bigendian = unknown; then
 cat > conftest.$ac_ext <<EOF
-#line 4357 "configure"
+#line 4299 "configure"
 #include "confdefs.h"
 main () {
   /* Are we little or big endian?  From Harbison&Steele.  */
@@ -4366,7 +4308,7 @@ main () {
   exit (u.c[sizeof (long) - 1] == 1);
 }
 EOF
-if { (eval echo configure:4370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:4312: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_c_bigendian=no
 else
@@ -4393,10 +4335,10 @@ fi
 
 
 echo $ac_n "checking size of short""... $ac_c" 1>&6
-echo "configure:4397: checking size of short" >&5
+echo "configure:4339: checking size of short" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4400 "configure"
+#line 4342 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -4407,7 +4349,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:4411: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:4353: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_sizeof_short=`cat conftestval`
 else
@@ -4435,10 +4377,10 @@ if test "$ac_cv_sizeof_short" = 0; then
   exit 1
 fi
 echo $ac_n "checking size of int""... $ac_c" 1>&6
-echo "configure:4439: checking size of int" >&5
+echo "configure:4381: checking size of int" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4442 "configure"
+#line 4384 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -4449,7 +4391,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:4453: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:4395: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_sizeof_int=`cat conftestval`
 else
@@ -4471,10 +4413,10 @@ EOF
 
 
 echo $ac_n "checking size of long""... $ac_c" 1>&6
-echo "configure:4475: checking size of long" >&5
+echo "configure:4417: checking size of long" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4478 "configure"
+#line 4420 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -4485,7 +4427,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:4489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:4431: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_sizeof_long=`cat conftestval`
 else
@@ -4507,10 +4449,10 @@ EOF
 
 
 echo $ac_n "checking size of long long""... $ac_c" 1>&6
-echo "configure:4511: checking size of long long" >&5
+echo "configure:4453: checking size of long long" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4514 "configure"
+#line 4456 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -4521,7 +4463,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:4525: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:4467: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_sizeof_long_long=`cat conftestval`
 else
@@ -4543,10 +4485,10 @@ EOF
 
 
 echo $ac_n "checking size of void *""... $ac_c" 1>&6
-echo "configure:4547: checking size of void *" >&5
+echo "configure:4489: checking size of void *" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4550 "configure"
+#line 4492 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 main()
@@ -4557,7 +4499,7 @@ main()
   exit(0);
 }
 EOF
-if { (eval echo configure:4561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:4503: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_sizeof_void_p=`cat conftestval`
 else
@@ -4580,7 +4522,7 @@ EOF
 
 
 echo $ac_n "checking for long file names""... $ac_c" 1>&6
-echo "configure:4584: checking for long file names" >&5
+echo "configure:4526: checking for long file names" >&5
 
 ac_cv_sys_long_file_names=yes
 # Test for long file names in all the places we know might matter:
@@ -4626,10 +4568,10 @@ fi
 
 
 echo $ac_n "checking for sin""... $ac_c" 1>&6
-echo "configure:4630: checking for sin" >&5
+echo "configure:4572: checking for sin" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4633 "configure"
+#line 4575 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char sin(); below.  */
@@ -4652,7 +4594,7 @@ sin();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4656: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4598: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_sin=yes"
 else
@@ -4670,12 +4612,12 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for sin in -lm""... $ac_c" 1>&6
-echo "configure:4674: checking for sin in -lm" >&5
+echo "configure:4616: checking for sin in -lm" >&5
 ac_lib_var=`echo m'_'sin | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lm "
 cat > conftest.$ac_ext <<EOF
-#line 4679 "configure"
+#line 4621 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4686,7 +4628,7 @@ int main() {
 sin()
 ; return 0; }
 EOF
-if { (eval echo configure:4690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4730,14 +4672,14 @@ EOF
 
 
 cat > conftest.$ac_ext <<EOF
-#line 4734 "configure"
+#line 4676 "configure"
 #include "confdefs.h"
 #include <math.h>
 int main() {
 return atanh(1.0) + asinh(1.0) + acosh(1.0); 
 ; return 0; }
 EOF
-if { (eval echo configure:4741: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4683: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_INVERSE_HYPERBOLIC
@@ -4754,14 +4696,14 @@ fi
 rm -f conftest*
 
 echo "checking type of mail spool file locking" 1>&6
-echo "configure:4758: checking type of mail spool file locking" >&5
+echo "configure:4700: checking type of mail spool file locking" >&5
 for ac_func in lockf flock
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4762: checking for $ac_func" >&5
+echo "configure:4704: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 4765 "configure"
+#line 4707 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4784,7 +4726,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4788: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4730: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4857,12 +4799,12 @@ test "$mail_locking" = "locking" -a "$ac_cv_func_locking" != "yes" && \
 case "$opsys" in decosf*)
   
 echo $ac_n "checking for cma_open in -lpthreads""... $ac_c" 1>&6
-echo "configure:4861: checking for cma_open in -lpthreads" >&5
+echo "configure:4803: checking for cma_open in -lpthreads" >&5
 ac_lib_var=`echo pthreads'_'cma_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lpthreads "
 cat > conftest.$ac_ext <<EOF
-#line 4866 "configure"
+#line 4808 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4873,7 +4815,7 @@ int main() {
 cma_open()
 ; return 0; }
 EOF
-if { (eval echo configure:4877: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4909,7 +4851,7 @@ fi
 esac
 
 echo $ac_n "checking whether the -xildoff compiler flag is required""... $ac_c" 1>&6
-echo "configure:4913: checking whether the -xildoff compiler flag is required" >&5
+echo "configure:4855: checking whether the -xildoff compiler flag is required" >&5
 if   ${CC-cc} '-###' -xildon  no_such_file.c 2>&1 | grep '^[^ ]*/ild ' > /dev/null ; then
   if ${CC-cc} '-###' -xildoff no_such_file.c 2>&1 | grep '^[^ ]*/ild ' > /dev/null ;
     then echo "$ac_t""no" 1>&6;
@@ -4921,7 +4863,7 @@ fi
 if test "$opsys" = "sol2"; then
   if test "$os_release" -ge 56; then
     echo $ac_n "checking for \"-z ignore\" linker flag""... $ac_c" 1>&6
-echo "configure:4925: checking for \"-z ignore\" linker flag" >&5
+echo "configure:4867: checking for \"-z ignore\" linker flag" >&5
     case "`ld -h 2>&1`" in
       *-z\ ignore\|record* ) echo "$ac_t""yes" 1>&6
         ld_switch_site="-z ignore $ld_switch_site" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-z ignore\" to \$ld_switch_site"; fi ;;
@@ -4932,7 +4874,7 @@ fi
 
 
 echo "checking "for specified window system"" 1>&6
-echo "configure:4936: checking "for specified window system"" >&5
+echo "configure:4878: checking "for specified window system"" >&5
 
 if test "$with_x11" != "no"; then
     test "$x_includes $x_libraries" != "NONE NONE" && \
@@ -4965,7 +4907,7 @@ if test "$with_x11" != "no"; then
 # Uses ac_ vars as temps to allow command line to override cache and checks.
 # --without-x overrides everything else, but does not touch the cache.
 echo $ac_n "checking for X""... $ac_c" 1>&6
-echo "configure:4969: checking for X" >&5
+echo "configure:4911: checking for X" >&5
 
 # Check whether --with-x or --without-x was given.
 if test "${with_x+set}" = set; then
@@ -5025,12 +4967,12 @@ if test "$ac_x_includes" = NO; then
 
   # First, try using that file with no special directory specified.
 cat > conftest.$ac_ext <<EOF
-#line 5029 "configure"
+#line 4971 "configure"
 #include "confdefs.h"
 #include <$x_direct_test_include>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5034: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4976: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5099,14 +5041,14 @@ if test "$ac_x_libraries" = NO; then
   ac_save_LIBS="$LIBS"
   LIBS="-l$x_direct_test_library $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5103 "configure"
+#line 5045 "configure"
 #include "confdefs.h"
 
 int main() {
 ${x_direct_test_function}()
 ; return 0; }
 EOF
-if { (eval echo configure:5110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5052: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   LIBS="$ac_save_LIBS"
 # We can link X programs with no special library path.
@@ -5215,17 +5157,17 @@ else
     case "`(uname -sr) 2>/dev/null`" in
     "SunOS 5"*)
       echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
-echo "configure:5219: checking whether -R must be followed by a space" >&5
+echo "configure:5161: checking whether -R must be followed by a space" >&5
       ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
       cat > conftest.$ac_ext <<EOF
-#line 5222 "configure"
+#line 5164 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:5229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5171: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_R_nospace=yes
 else
@@ -5241,14 +5183,14 @@ rm -f conftest*
       else
        LIBS="$ac_xsave_LIBS -R $x_libraries"
        cat > conftest.$ac_ext <<EOF
-#line 5245 "configure"
+#line 5187 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:5252: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5194: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_R_space=yes
 else
@@ -5284,12 +5226,12 @@ ac_cv_lib_dnet_dnet_ntoa=no
 else
 
 echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
-echo "configure:5288: checking for dnet_ntoa in -ldnet" >&5
+echo "configure:5230: checking for dnet_ntoa in -ldnet" >&5
 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldnet "
 cat > conftest.$ac_ext <<EOF
-#line 5293 "configure"
+#line 5235 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5300,7 +5242,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:5304: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5246: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5324,12 +5266,12 @@ fi
     if test $ac_cv_lib_dnet_dnet_ntoa = no; then
       
 echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
-echo "configure:5328: checking for dnet_ntoa in -ldnet_stub" >&5
+echo "configure:5270: checking for dnet_ntoa in -ldnet_stub" >&5
 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldnet_stub "
 cat > conftest.$ac_ext <<EOF
-#line 5333 "configure"
+#line 5275 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5340,7 +5282,7 @@ int main() {
 dnet_ntoa()
 ; return 0; }
 EOF
-if { (eval echo configure:5344: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5286: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5369,10 +5311,10 @@ fi
     # The nsl library prevents programs from opening the X display
     # on Irix 5.2, according to dickey@clark.net.
     echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:5373: checking for gethostbyname" >&5
+echo "configure:5315: checking for gethostbyname" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 5376 "configure"
+#line 5318 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char gethostbyname(); below.  */
@@ -5395,7 +5337,7 @@ gethostbyname();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5399: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_gethostbyname=yes"
 else
@@ -5416,12 +5358,12 @@ fi
     if test $ac_cv_func_gethostbyname = no; then
       
 echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
-echo "configure:5420: checking for gethostbyname in -lnsl" >&5
+echo "configure:5362: checking for gethostbyname in -lnsl" >&5
 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lnsl "
 cat > conftest.$ac_ext <<EOF
-#line 5425 "configure"
+#line 5367 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5432,7 +5374,7 @@ int main() {
 gethostbyname()
 ; return 0; }
 EOF
-if { (eval echo configure:5436: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5462,10 +5404,10 @@ fi
     # -lsocket must be given before -lnsl if both are needed.
     # We assume that if connect needs -lnsl, so does gethostbyname.
     echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:5466: checking for connect" >&5
+echo "configure:5408: checking for connect" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 5469 "configure"
+#line 5411 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char connect(); below.  */
@@ -5488,7 +5430,7 @@ connect();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5434: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_connect=yes"
 else
@@ -5511,12 +5453,12 @@ fi
 xe_msg_checking="for connect in -lsocket"
 test -n "$X_EXTRA_LIBS" && xe_msg_checking="$xe_msg_checking using extra libs $X_EXTRA_LIBS"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:5515: checking "$xe_msg_checking"" >&5
+echo "configure:5457: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lsocket $X_EXTRA_LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5520 "configure"
+#line 5462 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5527,7 +5469,7 @@ int main() {
 connect()
 ; return 0; }
 EOF
-if { (eval echo configure:5531: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5473: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5551,10 +5493,10 @@ fi
 
     # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
     echo $ac_n "checking for remove""... $ac_c" 1>&6
-echo "configure:5555: checking for remove" >&5
+echo "configure:5497: checking for remove" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 5558 "configure"
+#line 5500 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char remove(); below.  */
@@ -5577,7 +5519,7 @@ remove();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5581: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5523: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_remove=yes"
 else
@@ -5598,12 +5540,12 @@ fi
     if test $ac_cv_func_remove = no; then
       
 echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
-echo "configure:5602: checking for remove in -lposix" >&5
+echo "configure:5544: checking for remove in -lposix" >&5
 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lposix "
 cat > conftest.$ac_ext <<EOF
-#line 5607 "configure"
+#line 5549 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5614,7 +5556,7 @@ int main() {
 remove()
 ; return 0; }
 EOF
-if { (eval echo configure:5618: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5560: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5638,10 +5580,10 @@ fi
 
     # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
     echo $ac_n "checking for shmat""... $ac_c" 1>&6
-echo "configure:5642: checking for shmat" >&5
+echo "configure:5584: checking for shmat" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 5645 "configure"
+#line 5587 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char shmat(); below.  */
@@ -5664,7 +5606,7 @@ shmat();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5668: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5610: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_shmat=yes"
 else
@@ -5685,12 +5627,12 @@ fi
     if test $ac_cv_func_shmat = no; then
       
 echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
-echo "configure:5689: checking for shmat in -lipc" >&5
+echo "configure:5631: checking for shmat in -lipc" >&5
 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lipc "
 cat > conftest.$ac_ext <<EOF
-#line 5694 "configure"
+#line 5636 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5701,7 +5643,7 @@ int main() {
 shmat()
 ; return 0; }
 EOF
-if { (eval echo configure:5705: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5737,12 +5679,12 @@ fi
 xe_msg_checking="for IceConnectionNumber in -lICE"
 test -n "$X_EXTRA_LIBS" && xe_msg_checking="$xe_msg_checking using extra libs $X_EXTRA_LIBS"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:5741: checking "$xe_msg_checking"" >&5
+echo "configure:5683: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lICE $X_EXTRA_LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5746 "configure"
+#line 5688 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5753,7 +5695,7 @@ int main() {
 IceConnectionNumber()
 ; return 0; }
 EOF
-if { (eval echo configure:5757: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5922,7 +5864,7 @@ EOF
 
 
     echo "checking for X defines extracted by xmkmf" 1>&6
-echo "configure:5926: checking for X defines extracted by xmkmf" >&5
+echo "configure:5868: checking for X defines extracted by xmkmf" >&5
   rm -fr conftestdir
   if mkdir conftestdir; then
     cd conftestdir
@@ -5954,15 +5896,15 @@ EOF
 
     ac_safe=`echo "X11/Intrinsic.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Intrinsic.h""... $ac_c" 1>&6
-echo "configure:5958: checking for X11/Intrinsic.h" >&5
+echo "configure:5900: checking for X11/Intrinsic.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 5961 "configure"
+#line 5903 "configure"
 #include "confdefs.h"
 #include <X11/Intrinsic.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5966: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5908: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5986,12 +5928,12 @@ fi
 
       
 echo $ac_n "checking for XOpenDisplay in -lX11""... $ac_c" 1>&6
-echo "configure:5990: checking for XOpenDisplay in -lX11" >&5
+echo "configure:5932: checking for XOpenDisplay in -lX11" >&5
 ac_lib_var=`echo X11'_'XOpenDisplay | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lX11 "
 cat > conftest.$ac_ext <<EOF
-#line 5995 "configure"
+#line 5937 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6002,7 +5944,7 @@ int main() {
 XOpenDisplay()
 ; return 0; }
 EOF
-if { (eval echo configure:6006: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5948: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6027,12 +5969,12 @@ fi
 xe_msg_checking="for XGetFontProperty in -lX11"
 test -n "-b i486-linuxaout" && xe_msg_checking="$xe_msg_checking using extra libs -b i486-linuxaout"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:6031: checking "$xe_msg_checking"" >&5
+echo "configure:5973: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo X11'_'XGetFontProperty | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lX11 -b i486-linuxaout"
 cat > conftest.$ac_ext <<EOF
-#line 6036 "configure"
+#line 5978 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6043,7 +5985,7 @@ int main() {
 XGetFontProperty()
 ; return 0; }
 EOF
-if { (eval echo configure:6047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5989: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6070,12 +6012,12 @@ fi
 
     
 echo $ac_n "checking for XShapeSelectInput in -lXext""... $ac_c" 1>&6
-echo "configure:6074: checking for XShapeSelectInput in -lXext" >&5
+echo "configure:6016: checking for XShapeSelectInput in -lXext" >&5
 ac_lib_var=`echo Xext'_'XShapeSelectInput | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXext "
 cat > conftest.$ac_ext <<EOF
-#line 6079 "configure"
+#line 6021 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6086,7 +6028,7 @@ int main() {
 XShapeSelectInput()
 ; return 0; }
 EOF
-if { (eval echo configure:6090: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6032: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6109,12 +6051,12 @@ fi
 
     
 echo $ac_n "checking for XtOpenDisplay in -lXt""... $ac_c" 1>&6
-echo "configure:6113: checking for XtOpenDisplay in -lXt" >&5
+echo "configure:6055: checking for XtOpenDisplay in -lXt" >&5
 ac_lib_var=`echo Xt'_'XtOpenDisplay | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXt "
 cat > conftest.$ac_ext <<EOF
-#line 6118 "configure"
+#line 6060 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6125,7 +6067,7 @@ int main() {
 XtOpenDisplay()
 ; return 0; }
 EOF
-if { (eval echo configure:6129: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6071: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6148,14 +6090,14 @@ fi
 
 
   echo $ac_n "checking the version of X11 being used""... $ac_c" 1>&6
-echo "configure:6152: checking the version of X11 being used" >&5
+echo "configure:6094: checking the version of X11 being used" >&5
   cat > conftest.$ac_ext <<EOF
-#line 6154 "configure"
+#line 6096 "configure"
 #include "confdefs.h"
 #include <X11/Intrinsic.h>
     int main(int c, char *v[]) { return c>1 ? XlibSpecificationRelease : 0; }
 EOF
-if { (eval echo configure:6159: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:6101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ./conftest foobar; x11_release=$?
 else
@@ -6179,10 +6121,10 @@ EOF
   for ac_func in XConvertCase
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:6183: checking for $ac_func" >&5
+echo "configure:6125: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6186 "configure"
+#line 6128 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -6205,7 +6147,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:6209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -6237,15 +6179,15 @@ done
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:6241: checking for $ac_hdr" >&5
+echo "configure:6183: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6244 "configure"
+#line 6186 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6249: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6191: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6276,7 +6218,7 @@ done
 
 
     echo $ac_n "checking for XFree86""... $ac_c" 1>&6
-echo "configure:6280: checking for XFree86" >&5
+echo "configure:6222: checking for XFree86" >&5
   if test -d "/usr/X386/include" -o \
           -f "/etc/XF86Config"    -o \
          -f "/etc/X11/XF86Config" -o \
@@ -6296,12 +6238,12 @@ EOF
 
     test -z "$with_xmu" && { 
 echo $ac_n "checking for XmuReadBitmapDataFromFile in -lXmu""... $ac_c" 1>&6
-echo "configure:6300: checking for XmuReadBitmapDataFromFile in -lXmu" >&5
+echo "configure:6242: checking for XmuReadBitmapDataFromFile in -lXmu" >&5
 ac_lib_var=`echo Xmu'_'XmuReadBitmapDataFromFile | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXmu "
 cat > conftest.$ac_ext <<EOF
-#line 6305 "configure"
+#line 6247 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6312,7 +6254,7 @@ int main() {
 XmuReadBitmapDataFromFile()
 ; return 0; }
 EOF
-if { (eval echo configure:6316: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6258: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6351,19 +6293,19 @@ EOF
 
       
 echo $ac_n "checking for main in -lXbsd""... $ac_c" 1>&6
-echo "configure:6355: checking for main in -lXbsd" >&5
+echo "configure:6297: checking for main in -lXbsd" >&5
 ac_lib_var=`echo Xbsd'_'main | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXbsd "
 cat > conftest.$ac_ext <<EOF
-#line 6360 "configure"
+#line 6302 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:6367: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6400,22 +6342,22 @@ fi
 fi 
 if test "$with_msw" != "no"; then
   echo "checking for MS-Windows" 1>&6
-echo "configure:6404: checking for MS-Windows" >&5
+echo "configure:6346: checking for MS-Windows" >&5
   
 echo $ac_n "checking for main in -lgdi32""... $ac_c" 1>&6
-echo "configure:6407: checking for main in -lgdi32" >&5
+echo "configure:6349: checking for main in -lgdi32" >&5
 ac_lib_var=`echo gdi32'_'main | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lgdi32 "
 cat > conftest.$ac_ext <<EOF
-#line 6412 "configure"
+#line 6354 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:6419: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6361: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6481,12 +6423,12 @@ EOF
  fi
     fi
         cat > conftest.$ac_ext <<EOF
-#line 6485 "configure"
+#line 6427 "configure"
 #include "confdefs.h"
 #include <fcntl.h>
     int main() { return (open("/dev/windows", O_RDONLY, 0) > 0)? 0 : 1; }
 EOF
-if { (eval echo configure:6490: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:6432: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_MSG_SELECT
@@ -6561,7 +6503,7 @@ case "$x_libraries" in *X11R4* )
 esac
 
 echo "checking for WM_COMMAND option" 1>&6
-echo "configure:6565: checking for WM_COMMAND option" >&5;
+echo "configure:6507: checking for WM_COMMAND option" >&5;
 if test "$with_wmcommand" != "no"; then
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_WMCOMMAND
@@ -6576,15 +6518,15 @@ fi
 test -z "$with_xauth" && test "$window_system" = "none" && with_xauth=no
 test -z "$with_xauth" && { ac_safe=`echo "X11/Xauth.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Xauth.h""... $ac_c" 1>&6
-echo "configure:6580: checking for X11/Xauth.h" >&5
+echo "configure:6522: checking for X11/Xauth.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6583 "configure"
+#line 6525 "configure"
 #include "confdefs.h"
 #include <X11/Xauth.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6588: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6530: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6607,12 +6549,12 @@ fi
  }
 test -z "$with_xauth" && { 
 echo $ac_n "checking for XauGetAuthByAddr in -lXau""... $ac_c" 1>&6
-echo "configure:6611: checking for XauGetAuthByAddr in -lXau" >&5
+echo "configure:6553: checking for XauGetAuthByAddr in -lXau" >&5
 ac_lib_var=`echo Xau'_'XauGetAuthByAddr | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXau "
 cat > conftest.$ac_ext <<EOF
-#line 6616 "configure"
+#line 6558 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6623,7 +6565,7 @@ int main() {
 XauGetAuthByAddr()
 ; return 0; }
 EOF
-if { (eval echo configure:6627: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6569: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6668,15 +6610,15 @@ if test "$with_tooltalk" != "no" ; then
       for dir in "" "Tt/" "desktop/" ; do
     ac_safe=`echo "${dir}tt_c.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ${dir}tt_c.h""... $ac_c" 1>&6
-echo "configure:6672: checking for ${dir}tt_c.h" >&5
+echo "configure:6614: checking for ${dir}tt_c.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6675 "configure"
+#line 6617 "configure"
 #include "confdefs.h"
 #include <${dir}tt_c.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6622: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6712,12 +6654,12 @@ if test "$with_tooltalk" != "no" ; then
 xe_msg_checking="for tt_message_create in -ltt"
 test -n "$extra_libs" && xe_msg_checking="$xe_msg_checking using extra libs $extra_libs"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:6716: checking "$xe_msg_checking"" >&5
+echo "configure:6658: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo tt'_'tt_message_create | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ltt $extra_libs"
 cat > conftest.$ac_ext <<EOF
-#line 6721 "configure"
+#line 6663 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6728,7 +6670,7 @@ int main() {
 tt_message_create()
 ; return 0; }
 EOF
-if { (eval echo configure:6732: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6674: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6785,15 +6727,15 @@ fi
 
 test -z "$with_cde" && { ac_safe=`echo "Dt/Dt.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for Dt/Dt.h""... $ac_c" 1>&6
-echo "configure:6789: checking for Dt/Dt.h" >&5
+echo "configure:6731: checking for Dt/Dt.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6792 "configure"
+#line 6734 "configure"
 #include "confdefs.h"
 #include <Dt/Dt.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6797: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6739: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6816,12 +6758,12 @@ fi
  }
 test -z "$with_cde" && { 
 echo $ac_n "checking for DtDndDragStart in -lDtSvc""... $ac_c" 1>&6
-echo "configure:6820: checking for DtDndDragStart in -lDtSvc" >&5
+echo "configure:6762: checking for DtDndDragStart in -lDtSvc" >&5
 ac_lib_var=`echo DtSvc'_'DtDndDragStart | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lDtSvc "
 cat > conftest.$ac_ext <<EOF
-#line 6825 "configure"
+#line 6767 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -6832,7 +6774,7 @@ int main() {
 DtDndDragStart()
 ; return 0; }
 EOF
-if { (eval echo configure:6836: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6778: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -6901,7 +6843,7 @@ EOF
 fi
 
 echo $ac_n "checking if drag and drop API is needed""... $ac_c" 1>&6
-echo "configure:6905: checking if drag and drop API is needed" >&5
+echo "configure:6847: checking if drag and drop API is needed" >&5
 if test "$with_dragndrop" != "no" ; then
   if test -n "$dragndrop_proto" ; then
     with_dragndrop=yes
@@ -6922,18 +6864,18 @@ EOF
 fi
 
 echo "checking for LDAP" 1>&6
-echo "configure:6926: checking for LDAP" >&5
+echo "configure:6868: checking for LDAP" >&5
 test -z "$with_ldap" && { ac_safe=`echo "ldap.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ldap.h""... $ac_c" 1>&6
-echo "configure:6929: checking for ldap.h" >&5
+echo "configure:6871: checking for ldap.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6932 "configure"
+#line 6874 "configure"
 #include "confdefs.h"
 #include <ldap.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6937: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6879: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6956,15 +6898,15 @@ fi
  }
 test -z "$with_ldap" && { ac_safe=`echo "lber.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for lber.h""... $ac_c" 1>&6
-echo "configure:6960: checking for lber.h" >&5
+echo "configure:6902: checking for lber.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 6963 "configure"
+#line 6905 "configure"
 #include "confdefs.h"
 #include <lber.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:6968: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:6910: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -6988,12 +6930,12 @@ fi
 if test "$with_ldap" != "no"; then
   
 echo $ac_n "checking for ldap_search in -lldap""... $ac_c" 1>&6
-echo "configure:6992: checking for ldap_search in -lldap" >&5
+echo "configure:6934: checking for ldap_search in -lldap" >&5
 ac_lib_var=`echo ldap'_'ldap_search | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lldap "
 cat > conftest.$ac_ext <<EOF
-#line 6997 "configure"
+#line 6939 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7004,7 +6946,7 @@ int main() {
 ldap_search()
 ; return 0; }
 EOF
-if { (eval echo configure:7008: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7029,12 +6971,12 @@ fi
 xe_msg_checking="for ldap_open in -lldap"
 test -n "-llber" && xe_msg_checking="$xe_msg_checking using extra libs -llber"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:7033: checking "$xe_msg_checking"" >&5
+echo "configure:6975: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo ldap'_'ldap_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lldap -llber"
 cat > conftest.$ac_ext <<EOF
-#line 7038 "configure"
+#line 6980 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7045,7 +6987,7 @@ int main() {
 ldap_open()
 ; return 0; }
 EOF
-if { (eval echo configure:7049: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6991: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7070,12 +7012,12 @@ fi
 xe_msg_checking="for ldap_open in -lldap"
 test -n "-llber -lkrb" && xe_msg_checking="$xe_msg_checking using extra libs -llber -lkrb"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:7074: checking "$xe_msg_checking"" >&5
+echo "configure:7016: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo ldap'_'ldap_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lldap -llber -lkrb"
 cat > conftest.$ac_ext <<EOF
-#line 7079 "configure"
+#line 7021 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7086,7 +7028,7 @@ int main() {
 ldap_open()
 ; return 0; }
 EOF
-if { (eval echo configure:7090: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7032: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7111,12 +7053,12 @@ fi
 xe_msg_checking="for ldap_open in -lldap"
 test -n "-llber -lkrb -ldes" && xe_msg_checking="$xe_msg_checking using extra libs -llber -lkrb -ldes"
 echo $ac_n "checking "$xe_msg_checking"""... $ac_c" 1>&6
-echo "configure:7115: checking "$xe_msg_checking"" >&5
+echo "configure:7057: checking "$xe_msg_checking"" >&5
 ac_lib_var=`echo ldap'_'ldap_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lldap -llber -lkrb -ldes"
 cat > conftest.$ac_ext <<EOF
-#line 7120 "configure"
+#line 7062 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7127,7 +7069,7 @@ int main() {
 ldap_open()
 ; return 0; }
 EOF
-if { (eval echo configure:7131: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7073: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7178,10 +7120,10 @@ EOF
   for ac_func in ldap_set_option ldap_get_lderrno ldap_result2error ldap_parse_result
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:7182: checking for $ac_func" >&5
+echo "configure:7124: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7185 "configure"
+#line 7127 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -7204,7 +7146,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:7208: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7150: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -7234,7 +7176,7 @@ done
 fi
 
 echo "checking for PostgreSQL" 1>&6
-echo "configure:7238: checking for PostgreSQL" >&5
+echo "configure:7180: checking for PostgreSQL" >&5
 postgres_h_path=""
 postgres_includes_found=no
 save_c_switch_site="$c_switch_site"
@@ -7242,15 +7184,15 @@ save_c_switch_site="$c_switch_site"
 if test "$with_postgresql" != "no"; then
        ac_safe=`echo "libpq-fe.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for libpq-fe.h""... $ac_c" 1>&6
-echo "configure:7246: checking for libpq-fe.h" >&5
+echo "configure:7188: checking for libpq-fe.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7249 "configure"
+#line 7191 "configure"
 #include "confdefs.h"
 #include <libpq-fe.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7254: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7196: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7277,15 +7219,15 @@ if test "$postgres_includes_found" = "no" -a "$with_postgresql" != "no" -a \
        c_switch_site="$c_switch_site -I/usr/local/pgsql/include"
        ac_safe=`echo "libpq-fe.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for libpq-fe.h""... $ac_c" 1>&6
-echo "configure:7281: checking for libpq-fe.h" >&5
+echo "configure:7223: checking for libpq-fe.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7284 "configure"
+#line 7226 "configure"
 #include "confdefs.h"
 #include <libpq-fe.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7289: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7231: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7315,15 +7257,15 @@ if test "$postgres_includes_found" = "no" -a "$with_postgresql" != "no" -a \
        c_switch_site="$c_switch_site -I/usr/include/pgsql"
        ac_safe=`echo "libpq-fe.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for libpq-fe.h""... $ac_c" 1>&6
-echo "configure:7319: checking for libpq-fe.h" >&5
+echo "configure:7261: checking for libpq-fe.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7322 "configure"
+#line 7264 "configure"
 #include "confdefs.h"
 #include <libpq-fe.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7327: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7269: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7353,15 +7295,15 @@ if test "$postgres_includes_found" = "no" -a "$with_postgresql" != "no" -a \
        c_switch_site="$c_switch_site -I/usr/include/postgresql"
        ac_safe=`echo "libpq-fe.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for libpq-fe.h""... $ac_c" 1>&6
-echo "configure:7357: checking for libpq-fe.h" >&5
+echo "configure:7299: checking for libpq-fe.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7360 "configure"
+#line 7302 "configure"
 #include "confdefs.h"
 #include <libpq-fe.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7365: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7307: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7390,12 +7332,12 @@ fi
 if test "$postgres_includes_found" = "yes"; then
        
 echo $ac_n "checking for PQconnectdb in -lpq""... $ac_c" 1>&6
-echo "configure:7394: checking for PQconnectdb in -lpq" >&5
+echo "configure:7336: checking for PQconnectdb in -lpq" >&5
 ac_lib_var=`echo pq'_'PQconnectdb | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lpq "
 cat > conftest.$ac_ext <<EOF
-#line 7399 "configure"
+#line 7341 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7406,7 +7348,7 @@ int main() {
 PQconnectdb()
 ; return 0; }
 EOF
-if { (eval echo configure:7410: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7352: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7431,12 +7373,12 @@ fi
 if test "$with_postgresql" = "yes"; then
        
 echo $ac_n "checking for PQconnectStart in -lpq""... $ac_c" 1>&6
-echo "configure:7435: checking for PQconnectStart in -lpq" >&5
+echo "configure:7377: checking for PQconnectStart in -lpq" >&5
 ac_lib_var=`echo pq'_'PQconnectStart | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lpq "
 cat > conftest.$ac_ext <<EOF
-#line 7440 "configure"
+#line 7382 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7447,7 +7389,7 @@ int main() {
 PQconnectStart()
 ; return 0; }
 EOF
-if { (eval echo configure:7451: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7393: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7507,15 +7449,15 @@ fi
 
 if test "$window_system" != "none"; then
   echo "checking for graphics libraries" 1>&6
-echo "configure:7511: checking for graphics libraries" >&5
+echo "configure:7453: checking for graphics libraries" >&5
 
     xpm_problem=""
   if test -z "$with_xpm"; then
     echo $ac_n "checking for Xpm - no older than 3.4f""... $ac_c" 1>&6
-echo "configure:7516: checking for Xpm - no older than 3.4f" >&5
+echo "configure:7458: checking for Xpm - no older than 3.4f" >&5
     xe_check_libs=-lXpm
     cat > conftest.$ac_ext <<EOF
-#line 7519 "configure"
+#line 7461 "configure"
 #include "confdefs.h"
 #define XPM_NUMBERS
 #include <X11/xpm.h>
@@ -7524,7 +7466,7 @@ echo "configure:7516: checking for Xpm - no older than 3.4f" >&5
       XpmIncludeVersion != XpmLibraryVersion() ? 1 :
       XpmIncludeVersion < 30406 ? 2 : 0 ;}
 EOF
-if { (eval echo configure:7528: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:7470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ./conftest dummy_arg; xpm_status=$?;
       if test "$xpm_status" = "0"; then
@@ -7566,17 +7508,17 @@ EOF
 
     libs_x="-lXpm $libs_x" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-lXpm\" to \$libs_x"; fi
     echo $ac_n "checking for \"FOR_MSW\" xpm""... $ac_c" 1>&6
-echo "configure:7570: checking for \"FOR_MSW\" xpm" >&5
+echo "configure:7512: checking for \"FOR_MSW\" xpm" >&5
     xe_check_libs=-lXpm
     cat > conftest.$ac_ext <<EOF
-#line 7573 "configure"
+#line 7515 "configure"
 #include "confdefs.h"
 
 int main() {
 XpmCreatePixmapFromData()
 ; return 0; }
 EOF
-if { (eval echo configure:7580: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7522: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   xpm_for_msw=no
 else
@@ -7602,15 +7544,15 @@ EOF
 
     test -z "$with_xface" && { ac_safe=`echo "compface.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for compface.h""... $ac_c" 1>&6
-echo "configure:7606: checking for compface.h" >&5
+echo "configure:7548: checking for compface.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7609 "configure"
+#line 7551 "configure"
 #include "confdefs.h"
 #include <compface.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7614: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7556: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7633,12 +7575,12 @@ fi
  }
   test -z "$with_xface" && { 
 echo $ac_n "checking for UnGenFace in -lcompface""... $ac_c" 1>&6
-echo "configure:7637: checking for UnGenFace in -lcompface" >&5
+echo "configure:7579: checking for UnGenFace in -lcompface" >&5
 ac_lib_var=`echo compface'_'UnGenFace | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lcompface "
 cat > conftest.$ac_ext <<EOF
-#line 7642 "configure"
+#line 7584 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7649,7 +7591,7 @@ int main() {
 UnGenFace()
 ; return 0; }
 EOF
-if { (eval echo configure:7653: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7595: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7701,12 +7643,12 @@ EOF
       if test "$with_png $with_tiff" != "no no"; then
     
 echo $ac_n "checking for inflate in -lc""... $ac_c" 1>&6
-echo "configure:7705: checking for inflate in -lc" >&5
+echo "configure:7647: checking for inflate in -lc" >&5
 ac_lib_var=`echo c'_'inflate | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lc "
 cat > conftest.$ac_ext <<EOF
-#line 7710 "configure"
+#line 7652 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7717,7 +7659,7 @@ int main() {
 inflate()
 ; return 0; }
 EOF
-if { (eval echo configure:7721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7663: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7736,12 +7678,12 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for inflate in -lz""... $ac_c" 1>&6
-echo "configure:7740: checking for inflate in -lz" >&5
+echo "configure:7682: checking for inflate in -lz" >&5
 ac_lib_var=`echo z'_'inflate | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lz "
 cat > conftest.$ac_ext <<EOF
-#line 7745 "configure"
+#line 7687 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7752,7 +7694,7 @@ int main() {
 inflate()
 ; return 0; }
 EOF
-if { (eval echo configure:7756: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7698: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7771,12 +7713,12 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for inflate in -lgz""... $ac_c" 1>&6
-echo "configure:7775: checking for inflate in -lgz" >&5
+echo "configure:7717: checking for inflate in -lgz" >&5
 ac_lib_var=`echo gz'_'inflate | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lgz "
 cat > conftest.$ac_ext <<EOF
-#line 7780 "configure"
+#line 7722 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7787,7 +7729,7 @@ int main() {
 inflate()
 ; return 0; }
 EOF
-if { (eval echo configure:7791: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7733: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7817,15 +7759,15 @@ fi
 
     test -z "$with_jpeg" && { ac_safe=`echo "jpeglib.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for jpeglib.h""... $ac_c" 1>&6
-echo "configure:7821: checking for jpeglib.h" >&5
+echo "configure:7763: checking for jpeglib.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7824 "configure"
+#line 7766 "configure"
 #include "confdefs.h"
 #include <jpeglib.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7829: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7771: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7848,12 +7790,12 @@ fi
  }
   test -z "$with_jpeg" && { 
 echo $ac_n "checking for jpeg_destroy_decompress in -ljpeg""... $ac_c" 1>&6
-echo "configure:7852: checking for jpeg_destroy_decompress in -ljpeg" >&5
+echo "configure:7794: checking for jpeg_destroy_decompress in -ljpeg" >&5
 ac_lib_var=`echo jpeg'_'jpeg_destroy_decompress | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ljpeg "
 cat > conftest.$ac_ext <<EOF
-#line 7857 "configure"
+#line 7799 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7864,7 +7806,7 @@ int main() {
 jpeg_destroy_decompress()
 ; return 0; }
 EOF
-if { (eval echo configure:7868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7810: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -7900,10 +7842,10 @@ EOF
 
     png_problem=""
   test -z "$with_png" && { echo $ac_n "checking for pow""... $ac_c" 1>&6
-echo "configure:7904: checking for pow" >&5
+echo "configure:7846: checking for pow" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7907 "configure"
+#line 7849 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char pow(); below.  */
@@ -7926,7 +7868,7 @@ pow();
 
 ; return 0; }
 EOF
-if { (eval echo configure:7930: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7872: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_pow=yes"
 else
@@ -7947,15 +7889,15 @@ fi
  }
   test -z "$with_png" && { ac_safe=`echo "png.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for png.h""... $ac_c" 1>&6
-echo "configure:7951: checking for png.h" >&5
+echo "configure:7893: checking for png.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 7954 "configure"
+#line 7896 "configure"
 #include "confdefs.h"
 #include <png.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:7959: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:7901: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -7978,12 +7920,12 @@ fi
  }
   test -z "$with_png" && { 
 echo $ac_n "checking for png_read_image in -lpng""... $ac_c" 1>&6
-echo "configure:7982: checking for png_read_image in -lpng" >&5
+echo "configure:7924: checking for png_read_image in -lpng" >&5
 ac_lib_var=`echo png'_'png_read_image | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lpng "
 cat > conftest.$ac_ext <<EOF
-#line 7987 "configure"
+#line 7929 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -7994,7 +7936,7 @@ int main() {
 png_read_image()
 ; return 0; }
 EOF
-if { (eval echo configure:7998: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:7940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8017,10 +7959,10 @@ fi
  }
   if test -z "$with_png"; then
     echo $ac_n "checking for workable png version information""... $ac_c" 1>&6
-echo "configure:8021: checking for workable png version information" >&5
+echo "configure:7963: checking for workable png version information" >&5
     xe_check_libs="-lpng -lz"
     cat > conftest.$ac_ext <<EOF
-#line 8024 "configure"
+#line 7966 "configure"
 #include "confdefs.h"
 #include <png.h>
     int main(int c, char **v) {
@@ -8028,7 +7970,7 @@ echo "configure:8021: checking for workable png version information" >&5
     if (strcmp(png_libpng_ver, PNG_LIBPNG_VER_STRING) != 0) return 1;
     return (PNG_LIBPNG_VER < 10002) ? 2 : 0 ;}
 EOF
-if { (eval echo configure:8032: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:7974: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ./conftest dummy_arg; png_status=$?;
       if test "$png_status" = "0"; then
@@ -8071,15 +8013,15 @@ EOF
 
     test -z "$with_tiff" && { ac_safe=`echo "tiffio.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for tiffio.h""... $ac_c" 1>&6
-echo "configure:8075: checking for tiffio.h" >&5
+echo "configure:8017: checking for tiffio.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8078 "configure"
+#line 8020 "configure"
 #include "confdefs.h"
 #include <tiffio.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8083: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8025: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8102,12 +8044,12 @@ fi
  }
   test -z "$with_tiff" && { 
 echo $ac_n "checking for TIFFClientOpen in -ltiff""... $ac_c" 1>&6
-echo "configure:8106: checking for TIFFClientOpen in -ltiff" >&5
+echo "configure:8048: checking for TIFFClientOpen in -ltiff" >&5
 ac_lib_var=`echo tiff'_'TIFFClientOpen | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ltiff "
 cat > conftest.$ac_ext <<EOF
-#line 8111 "configure"
+#line 8053 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -8118,7 +8060,7 @@ int main() {
 TIFFClientOpen()
 ; return 0; }
 EOF
-if { (eval echo configure:8122: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8064: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8157,10 +8099,10 @@ fi
 if test "$with_x11" = "yes"; then
 
   echo "checking for X11 graphics libraries" 1>&6
-echo "configure:8161: checking for X11 graphics libraries" >&5
+echo "configure:8103: checking for X11 graphics libraries" >&5
 
   echo "checking for the Athena widgets" 1>&6
-echo "configure:8164: checking for the Athena widgets" >&5
+echo "configure:8106: checking for the Athena widgets" >&5
 
     case "$with_athena" in
         "xaw" | "")    athena_variant=Xaw      athena_3d=no  ;;
@@ -8174,12 +8116,12 @@ echo "configure:8164: checking for the Athena widgets" >&5
     if test "$athena_3d" = "no"; then
     
 echo $ac_n "checking for XawScrollbarSetThumb in -l$athena_variant""... $ac_c" 1>&6
-echo "configure:8178: checking for XawScrollbarSetThumb in -l$athena_variant" >&5
+echo "configure:8120: checking for XawScrollbarSetThumb in -l$athena_variant" >&5
 ac_lib_var=`echo $athena_variant'_'XawScrollbarSetThumb | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -l$athena_variant "
 cat > conftest.$ac_ext <<EOF
-#line 8183 "configure"
+#line 8125 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -8190,7 +8132,7 @@ int main() {
 XawScrollbarSetThumb()
 ; return 0; }
 EOF
-if { (eval echo configure:8194: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8136: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8206,12 +8148,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
   echo "$ac_t""yes" 1>&6
           
 echo $ac_n "checking for threeDClassRec in -l$athena_variant""... $ac_c" 1>&6
-echo "configure:8210: checking for threeDClassRec in -l$athena_variant" >&5
+echo "configure:8152: checking for threeDClassRec in -l$athena_variant" >&5
 ac_lib_var=`echo $athena_variant'_'threeDClassRec | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -l$athena_variant "
 cat > conftest.$ac_ext <<EOF
-#line 8215 "configure"
+#line 8157 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -8222,7 +8164,7 @@ int main() {
 threeDClassRec()
 ; return 0; }
 EOF
-if { (eval echo configure:8226: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8253,12 +8195,12 @@ fi
   else
         
 echo $ac_n "checking for threeDClassRec in -l$athena_variant""... $ac_c" 1>&6
-echo "configure:8257: checking for threeDClassRec in -l$athena_variant" >&5
+echo "configure:8199: checking for threeDClassRec in -l$athena_variant" >&5
 ac_lib_var=`echo $athena_variant'_'threeDClassRec | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -l$athena_variant "
 cat > conftest.$ac_ext <<EOF
-#line 8262 "configure"
+#line 8204 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -8269,7 +8211,7 @@ int main() {
 threeDClassRec()
 ; return 0; }
 EOF
-if { (eval echo configure:8273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8215: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8287,12 +8229,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for threeDClassRec in -lXaw""... $ac_c" 1>&6
-echo "configure:8291: checking for threeDClassRec in -lXaw" >&5
+echo "configure:8233: checking for threeDClassRec in -lXaw" >&5
 ac_lib_var=`echo Xaw'_'threeDClassRec | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXaw "
 cat > conftest.$ac_ext <<EOF
-#line 8296 "configure"
+#line 8238 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -8303,7 +8245,7 @@ int main() {
 threeDClassRec()
 ; return 0; }
 EOF
-if { (eval echo configure:8307: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8249: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8334,15 +8276,15 @@ fi
     if test "$athena_3d" = "no"; then
     ac_safe=`echo "X11/Xaw/ThreeD.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Xaw/ThreeD.h""... $ac_c" 1>&6
-echo "configure:8338: checking for X11/Xaw/ThreeD.h" >&5
+echo "configure:8280: checking for X11/Xaw/ThreeD.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8341 "configure"
+#line 8283 "configure"
 #include "confdefs.h"
 #include <X11/Xaw/ThreeD.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8346: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8288: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8362,15 +8304,15 @@ else
   echo "$ac_t""no" 1>&6
 ac_safe=`echo "X11/Xaw/XawInit.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Xaw/XawInit.h""... $ac_c" 1>&6
-echo "configure:8366: checking for X11/Xaw/XawInit.h" >&5
+echo "configure:8308: checking for X11/Xaw/XawInit.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8369 "configure"
+#line 8311 "configure"
 #include "confdefs.h"
 #include <X11/Xaw/XawInit.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8374: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8316: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8396,15 +8338,15 @@ fi
   else
             ac_safe=`echo "X11/$athena_variant/XawInit.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/$athena_variant/XawInit.h""... $ac_c" 1>&6
-echo "configure:8400: checking for X11/$athena_variant/XawInit.h" >&5
+echo "configure:8342: checking for X11/$athena_variant/XawInit.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8403 "configure"
+#line 8345 "configure"
 #include "confdefs.h"
 #include <X11/$athena_variant/XawInit.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8408: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8350: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8421,15 +8363,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "X11/$athena_variant/ThreeD.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/$athena_variant/ThreeD.h""... $ac_c" 1>&6
-echo "configure:8425: checking for X11/$athena_variant/ThreeD.h" >&5
+echo "configure:8367: checking for X11/$athena_variant/ThreeD.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8428 "configure"
+#line 8370 "configure"
 #include "confdefs.h"
 #include <X11/$athena_variant/ThreeD.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8433: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8375: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8457,15 +8399,15 @@ fi
         if test -z "$athena_h_path"; then
       ac_safe=`echo "$athena_variant/XawInit.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $athena_variant/XawInit.h""... $ac_c" 1>&6
-echo "configure:8461: checking for $athena_variant/XawInit.h" >&5
+echo "configure:8403: checking for $athena_variant/XawInit.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8464 "configure"
+#line 8406 "configure"
 #include "confdefs.h"
 #include <$athena_variant/XawInit.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8469: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8411: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8482,15 +8424,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "$athena_variant/ThreeD.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $athena_variant/ThreeD.h""... $ac_c" 1>&6
-echo "configure:8486: checking for $athena_variant/ThreeD.h" >&5
+echo "configure:8428: checking for $athena_variant/ThreeD.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8489 "configure"
+#line 8431 "configure"
 #include "confdefs.h"
 #include <$athena_variant/ThreeD.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8494: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8436: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8519,15 +8461,15 @@ fi
         if test -z "$athena_h_path" -a "$athena_variant" != "Xaw3d"; then
       ac_safe=`echo "X11/Xaw3d/XawInit.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Xaw3d/XawInit.h""... $ac_c" 1>&6
-echo "configure:8523: checking for X11/Xaw3d/XawInit.h" >&5
+echo "configure:8465: checking for X11/Xaw3d/XawInit.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8526 "configure"
+#line 8468 "configure"
 #include "confdefs.h"
 #include <X11/Xaw3d/XawInit.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8531: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8473: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8544,15 +8486,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "X11/Xaw3d/ThreeD.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Xaw3d/ThreeD.h""... $ac_c" 1>&6
-echo "configure:8548: checking for X11/Xaw3d/ThreeD.h" >&5
+echo "configure:8490: checking for X11/Xaw3d/ThreeD.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8551 "configure"
+#line 8493 "configure"
 #include "confdefs.h"
 #include <X11/Xaw3d/ThreeD.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8556: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8498: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8584,15 +8526,15 @@ fi
         if test -z "$athena_h_path" -a "$athena_variant" != "Xaw3d"; then
       ac_safe=`echo "Xaw3d/XawInit.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for Xaw3d/XawInit.h""... $ac_c" 1>&6
-echo "configure:8588: checking for Xaw3d/XawInit.h" >&5
+echo "configure:8530: checking for Xaw3d/XawInit.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8591 "configure"
+#line 8533 "configure"
 #include "confdefs.h"
 #include <Xaw3d/XawInit.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8596: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8538: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8609,15 +8551,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "Xaw3d/ThreeD.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for Xaw3d/ThreeD.h""... $ac_c" 1>&6
-echo "configure:8613: checking for Xaw3d/ThreeD.h" >&5
+echo "configure:8555: checking for Xaw3d/ThreeD.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8616 "configure"
+#line 8558 "configure"
 #include "confdefs.h"
 #include <Xaw3d/ThreeD.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8621: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8563: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8649,15 +8591,15 @@ fi
             if test -z "$athena_h_path"; then
       ac_safe=`echo "X11/Xaw/ThreeD.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for X11/Xaw/ThreeD.h""... $ac_c" 1>&6
-echo "configure:8653: checking for X11/Xaw/ThreeD.h" >&5
+echo "configure:8595: checking for X11/Xaw/ThreeD.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8656 "configure"
+#line 8598 "configure"
 #include "confdefs.h"
 #include <X11/Xaw/ThreeD.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8661: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8603: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8692,15 +8634,15 @@ fi
 
     ac_safe=`echo "Xm/Xm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for Xm/Xm.h""... $ac_c" 1>&6
-echo "configure:8696: checking for Xm/Xm.h" >&5
+echo "configure:8638: checking for Xm/Xm.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 8699 "configure"
+#line 8641 "configure"
 #include "confdefs.h"
 #include <Xm/Xm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:8704: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:8646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -8717,12 +8659,12 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   
 echo $ac_n "checking for XmStringFree in -lXm""... $ac_c" 1>&6
-echo "configure:8721: checking for XmStringFree in -lXm" >&5
+echo "configure:8663: checking for XmStringFree in -lXm" >&5
 ac_lib_var=`echo Xm'_'XmStringFree | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXm "
 cat > conftest.$ac_ext <<EOF
-#line 8726 "configure"
+#line 8668 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -8733,7 +8675,7 @@ int main() {
 XmStringFree()
 ; return 0; }
 EOF
-if { (eval echo configure:8737: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:8679: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -8762,9 +8704,9 @@ fi
 
   if test "$have_motif" = "yes"; then
         echo $ac_n "checking for Lesstif""... $ac_c" 1>&6
-echo "configure:8766: checking for Lesstif" >&5
+echo "configure:8708: checking for Lesstif" >&5
     cat > conftest.$ac_ext <<EOF
-#line 8768 "configure"
+#line 8710 "configure"
 #include "confdefs.h"
 #include <Xm/Xm.h>
 #ifdef LESSTIF_VERSION
@@ -9097,7 +9039,7 @@ fi
 
 if test "$with_mule" = "yes" ; then
   echo "checking for Mule-related features" 1>&6
-echo "configure:9101: checking for Mule-related features" >&5
+echo "configure:9043: checking for Mule-related features" >&5
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining MULE
 EOF
@@ -9122,15 +9064,15 @@ EOF
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:9126: checking for $ac_hdr" >&5
+echo "configure:9068: checking for $ac_hdr" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9129 "configure"
+#line 9071 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9134: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9076: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -9161,12 +9103,12 @@ done
 
   
 echo $ac_n "checking for strerror in -lintl""... $ac_c" 1>&6
-echo "configure:9165: checking for strerror in -lintl" >&5
+echo "configure:9107: checking for strerror in -lintl" >&5
 ac_lib_var=`echo intl'_'strerror | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lintl "
 cat > conftest.$ac_ext <<EOF
-#line 9170 "configure"
+#line 9112 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9177,7 +9119,7 @@ int main() {
 strerror()
 ; return 0; }
 EOF
-if { (eval echo configure:9181: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9123: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9210,18 +9152,18 @@ fi
 
 
   echo "checking for Mule input methods" 1>&6
-echo "configure:9214: checking for Mule input methods" >&5
+echo "configure:9156: checking for Mule input methods" >&5
         case "$with_xim" in "" | "yes" )
     echo "checking for XIM" 1>&6
-echo "configure:9217: checking for XIM" >&5
+echo "configure:9159: checking for XIM" >&5
     
 echo $ac_n "checking for XOpenIM in -lX11""... $ac_c" 1>&6
-echo "configure:9220: checking for XOpenIM in -lX11" >&5
+echo "configure:9162: checking for XOpenIM in -lX11" >&5
 ac_lib_var=`echo X11'_'XOpenIM | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lX11 "
 cat > conftest.$ac_ext <<EOF
-#line 9225 "configure"
+#line 9167 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9232,7 +9174,7 @@ int main() {
 XOpenIM()
 ; return 0; }
 EOF
-if { (eval echo configure:9236: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9178: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9256,12 +9198,12 @@ fi
         if test "$have_motif $have_lesstif" = "yes no"; then
       
 echo $ac_n "checking for XmImMbLookupString in -lXm""... $ac_c" 1>&6
-echo "configure:9260: checking for XmImMbLookupString in -lXm" >&5
+echo "configure:9202: checking for XmImMbLookupString in -lXm" >&5
 ac_lib_var=`echo Xm'_'XmImMbLookupString | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lXm "
 cat > conftest.$ac_ext <<EOF
-#line 9265 "configure"
+#line 9207 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9272,7 +9214,7 @@ int main() {
 XmImMbLookupString()
 ; return 0; }
 EOF
-if { (eval echo configure:9276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9337,15 +9279,15 @@ EOF
 
     if test "$with_xfs" = "yes" ; then
     echo "checking for XFontSet" 1>&6
-echo "configure:9341: checking for XFontSet" >&5
+echo "configure:9283: checking for XFontSet" >&5
     
 echo $ac_n "checking for XmbDrawString in -lX11""... $ac_c" 1>&6
-echo "configure:9344: checking for XmbDrawString in -lX11" >&5
+echo "configure:9286: checking for XmbDrawString in -lX11" >&5
 ac_lib_var=`echo X11'_'XmbDrawString | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lX11 "
 cat > conftest.$ac_ext <<EOF
-#line 9349 "configure"
+#line 9291 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9356,7 +9298,7 @@ int main() {
 XmbDrawString()
 ; return 0; }
 EOF
-if { (eval echo configure:9360: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9302: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9396,15 +9338,15 @@ EOF
     test "$with_wnn6" = "yes" && with_wnn=yes # wnn6 implies wnn support
   test -z "$with_wnn" && { ac_safe=`echo "wnn/jllib.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for wnn/jllib.h""... $ac_c" 1>&6
-echo "configure:9400: checking for wnn/jllib.h" >&5
+echo "configure:9342: checking for wnn/jllib.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9403 "configure"
+#line 9345 "configure"
 #include "confdefs.h"
 #include <wnn/jllib.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9408: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9350: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -9429,10 +9371,10 @@ fi
     for ac_func in crypt
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:9433: checking for $ac_func" >&5
+echo "configure:9375: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9436 "configure"
+#line 9378 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -9455,7 +9397,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:9459: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9401: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -9484,12 +9426,12 @@ done
 
     test "$ac_cv_func_crypt" != "yes" && { 
 echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6
-echo "configure:9488: checking for crypt in -lcrypt" >&5
+echo "configure:9430: checking for crypt in -lcrypt" >&5
 ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lcrypt "
 cat > conftest.$ac_ext <<EOF
-#line 9493 "configure"
+#line 9435 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9500,7 +9442,7 @@ int main() {
 crypt()
 ; return 0; }
 EOF
-if { (eval echo configure:9504: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9446: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9535,12 +9477,12 @@ fi
     if test -z "$with_wnn" -o "$with_wnn" = "yes"; then
     
 echo $ac_n "checking for jl_dic_list_e in -lwnn""... $ac_c" 1>&6
-echo "configure:9539: checking for jl_dic_list_e in -lwnn" >&5
+echo "configure:9481: checking for jl_dic_list_e in -lwnn" >&5
 ac_lib_var=`echo wnn'_'jl_dic_list_e | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lwnn "
 cat > conftest.$ac_ext <<EOF
-#line 9544 "configure"
+#line 9486 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9551,7 +9493,7 @@ int main() {
 jl_dic_list_e()
 ; return 0; }
 EOF
-if { (eval echo configure:9555: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9497: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9569,12 +9511,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for jl_dic_list_e in -lwnn4""... $ac_c" 1>&6
-echo "configure:9573: checking for jl_dic_list_e in -lwnn4" >&5
+echo "configure:9515: checking for jl_dic_list_e in -lwnn4" >&5
 ac_lib_var=`echo wnn4'_'jl_dic_list_e | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lwnn4 "
 cat > conftest.$ac_ext <<EOF
-#line 9578 "configure"
+#line 9520 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9585,7 +9527,7 @@ int main() {
 jl_dic_list_e()
 ; return 0; }
 EOF
-if { (eval echo configure:9589: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9531: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9603,12 +9545,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for jl_dic_list_e in -lwnn6""... $ac_c" 1>&6
-echo "configure:9607: checking for jl_dic_list_e in -lwnn6" >&5
+echo "configure:9549: checking for jl_dic_list_e in -lwnn6" >&5
 ac_lib_var=`echo wnn6'_'jl_dic_list_e | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lwnn6 "
 cat > conftest.$ac_ext <<EOF
-#line 9612 "configure"
+#line 9554 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9619,7 +9561,7 @@ int main() {
 jl_dic_list_e()
 ; return 0; }
 EOF
-if { (eval echo configure:9623: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9565: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9637,12 +9579,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for dic_list_e in -lwnn6_fromsrc""... $ac_c" 1>&6
-echo "configure:9641: checking for dic_list_e in -lwnn6_fromsrc" >&5
+echo "configure:9583: checking for dic_list_e in -lwnn6_fromsrc" >&5
 ac_lib_var=`echo wnn6_fromsrc'_'dic_list_e | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lwnn6_fromsrc "
 cat > conftest.$ac_ext <<EOF
-#line 9646 "configure"
+#line 9588 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9653,7 +9595,7 @@ int main() {
 dic_list_e()
 ; return 0; }
 EOF
-if { (eval echo configure:9657: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9599: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9701,12 +9643,12 @@ EOF
     if test "$with_wnn6" != "no"; then
       
 echo $ac_n "checking for jl_fi_dic_list in -l$libwnn""... $ac_c" 1>&6
-echo "configure:9705: checking for jl_fi_dic_list in -l$libwnn" >&5
+echo "configure:9647: checking for jl_fi_dic_list in -l$libwnn" >&5
 ac_lib_var=`echo $libwnn'_'jl_fi_dic_list | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -l$libwnn "
 cat > conftest.$ac_ext <<EOF
-#line 9710 "configure"
+#line 9652 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9717,7 +9659,7 @@ int main() {
 jl_fi_dic_list()
 ; return 0; }
 EOF
-if { (eval echo configure:9721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9663: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9752,15 +9694,15 @@ EOF
   if test "$with_canna" != "no"; then
     ac_safe=`echo "canna/jrkanji.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for canna/jrkanji.h""... $ac_c" 1>&6
-echo "configure:9756: checking for canna/jrkanji.h" >&5
+echo "configure:9698: checking for canna/jrkanji.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9759 "configure"
+#line 9701 "configure"
 #include "confdefs.h"
 #include <canna/jrkanji.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9764: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9706: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -9787,15 +9729,15 @@ fi
     c_switch_site="$c_switch_site -I/usr/local/canna/include"
     ac_safe=`echo "canna/jrkanji.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for canna/jrkanji.h""... $ac_c" 1>&6
-echo "configure:9791: checking for canna/jrkanji.h" >&5
+echo "configure:9733: checking for canna/jrkanji.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9794 "configure"
+#line 9736 "configure"
 #include "confdefs.h"
 #include <canna/jrkanji.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9799: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9741: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -9823,15 +9765,15 @@ fi
 
   test -z "$with_canna" && { ac_safe=`echo "canna/RK.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for canna/RK.h""... $ac_c" 1>&6
-echo "configure:9827: checking for canna/RK.h" >&5
+echo "configure:9769: checking for canna/RK.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 9830 "configure"
+#line 9772 "configure"
 #include "confdefs.h"
 #include <canna/RK.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:9835: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:9777: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -9854,12 +9796,12 @@ fi
  }
   test -z "$with_canna" && { 
 echo $ac_n "checking for RkBgnBun in -lRKC""... $ac_c" 1>&6
-echo "configure:9858: checking for RkBgnBun in -lRKC" >&5
+echo "configure:9800: checking for RkBgnBun in -lRKC" >&5
 ac_lib_var=`echo RKC'_'RkBgnBun | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lRKC "
 cat > conftest.$ac_ext <<EOF
-#line 9863 "configure"
+#line 9805 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9870,7 +9812,7 @@ int main() {
 RkBgnBun()
 ; return 0; }
 EOF
-if { (eval echo configure:9874: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9816: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9893,12 +9835,12 @@ fi
  }
   test -z "$with_canna" && { 
 echo $ac_n "checking for jrKanjiControl in -lcanna""... $ac_c" 1>&6
-echo "configure:9897: checking for jrKanjiControl in -lcanna" >&5
+echo "configure:9839: checking for jrKanjiControl in -lcanna" >&5
 ac_lib_var=`echo canna'_'jrKanjiControl | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lcanna "
 cat > conftest.$ac_ext <<EOF
-#line 9902 "configure"
+#line 9844 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9909,7 +9851,7 @@ int main() {
 jrKanjiControl()
 ; return 0; }
 EOF
-if { (eval echo configure:9913: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -9958,12 +9900,12 @@ if test "$need_motif" = "yes" ; then
   libs_x="-lXm $libs_x" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-lXm\" to \$libs_x"; fi
     
 echo $ac_n "checking for layout_object_getvalue in -li18n""... $ac_c" 1>&6
-echo "configure:9962: checking for layout_object_getvalue in -li18n" >&5
+echo "configure:9904: checking for layout_object_getvalue in -li18n" >&5
 ac_lib_var=`echo i18n'_'layout_object_getvalue | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -li18n "
 cat > conftest.$ac_ext <<EOF
-#line 9967 "configure"
+#line 9909 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -9974,7 +9916,7 @@ int main() {
 layout_object_getvalue()
 ; return 0; }
 EOF
-if { (eval echo configure:9978: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:9920: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 for ac_func in cbrt closedir dup2 eaccess fmod fpathconf frexp ftime getaddrinfo gethostname getnameinfo getpagesize gettimeofday getcwd getpt getwd logb lrand48 matherr mkdir mktime perror poll random rename res_init rint rmdir select setitimer setpgid setlocale setsid sigblock sighold sigprocmask snprintf stpcpy strcasecmp strerror tzset ulimit usleep utimes waitpid vsnprintf fsync ftruncate umask
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10064: checking for $ac_func" >&5
+echo "configure:10006: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10067 "configure"
+#line 10009 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -10086,7 +10028,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:10090: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10032: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -10121,10 +10063,10 @@ extra_objs="$extra_objs realpath.o" &&  if test "$extra_verbose" = "yes"; then
 for ac_func in getloadavg
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10125: checking for $ac_func" >&5
+echo "configure:10067: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10128 "configure"
+#line 10070 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -10147,7 +10089,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:10151: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10093: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -10183,12 +10125,12 @@ then
 
     
 echo $ac_n "checking for kstat_open in -lkstat""... $ac_c" 1>&6
-echo "configure:10187: checking for kstat_open in -lkstat" >&5
+echo "configure:10129: checking for kstat_open in -lkstat" >&5
 ac_lib_var=`echo kstat'_'kstat_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lkstat "
 cat > conftest.$ac_ext <<EOF
-#line 10192 "configure"
+#line 10134 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -10199,7 +10141,7 @@ int main() {
 kstat_open()
 ; return 0; }
 EOF
-if { (eval echo configure:10203: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10145: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 
     
 echo $ac_n "checking for kvm_read in -lkvm""... $ac_c" 1>&6
-echo "configure:10237: checking for kvm_read in -lkvm" >&5
+echo "configure:10179: checking for kvm_read in -lkvm" >&5
 ac_lib_var=`echo kvm'_'kvm_read | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lkvm "
 cat > conftest.$ac_ext <<EOF
-#line 10242 "configure"
+#line 10184 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -10249,7 +10191,7 @@ int main() {
 kvm_read()
 ; return 0; }
 EOF
-if { (eval echo configure:10253: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10195: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 fi
 
 echo $ac_n "checking whether netdb declares h_errno""... $ac_c" 1>&6
-echo "configure:10287: checking whether netdb declares h_errno" >&5
+echo "configure:10229: checking whether netdb declares h_errno" >&5
 cat > conftest.$ac_ext <<EOF
-#line 10289 "configure"
+#line 10231 "configure"
 #include "confdefs.h"
 #include <netdb.h>
 int main() {
 return h_errno;
 ; return 0; }
 EOF
-if { (eval echo configure:10296: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10238: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
    { test "$extra_verbose" = "yes" && cat << \EOF
 rm -f conftest*
 
 echo $ac_n "checking for sigsetjmp""... $ac_c" 1>&6
-echo "configure:10316: checking for sigsetjmp" >&5
+echo "configure:10258: checking for sigsetjmp" >&5
 cat > conftest.$ac_ext <<EOF
-#line 10318 "configure"
+#line 10260 "configure"
 #include "confdefs.h"
 #include <setjmp.h>
 int main() {
 sigjmp_buf bar; sigsetjmp (bar, 0);
 ; return 0; }
 EOF
-if { (eval echo configure:10325: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10267: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6
    { test "$extra_verbose" = "yes" && cat << \EOF
 rm -f conftest*
 
 echo $ac_n "checking whether localtime caches TZ""... $ac_c" 1>&6
-echo "configure:10345: checking whether localtime caches TZ" >&5
+echo "configure:10287: checking whether localtime caches TZ" >&5
 
 if test "$ac_cv_func_tzset" = "yes"; then
 cat > conftest.$ac_ext <<EOF
-#line 10349 "configure"
+#line 10291 "configure"
 #include "confdefs.h"
 #include <time.h>
 #if STDC_HEADERS
@@ -10380,7 +10322,7 @@ main()
   exit (0);
 }
 EOF
-if { (eval echo configure:10384: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:10326: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   emacs_cv_localtime_cache=no
 else
@@ -10410,9 +10352,9 @@ fi
 
 if test "$HAVE_TIMEVAL" = "yes"; then
 echo $ac_n "checking whether gettimeofday accepts one or two arguments""... $ac_c" 1>&6
-echo "configure:10414: checking whether gettimeofday accepts one or two arguments" >&5
+echo "configure:10356: checking whether gettimeofday accepts one or two arguments" >&5
 cat > conftest.$ac_ext <<EOF
-#line 10416 "configure"
+#line 10358 "configure"
 #include "confdefs.h"
 
 #ifdef TIME_WITH_SYS_TIME
@@ -10433,7 +10375,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:10437: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""two" 1>&6
 else
 
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:10459: checking for inline" >&5
+echo "configure:10401: checking for inline" >&5
 
 ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 10464 "configure"
+#line 10406 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:10471: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:10413: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -10507,17 +10449,17 @@ test "$ac_cv_c_inline" != "no" -a "$GCC" = "yes" && extra_objs="$extra_objs inli
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:10511: checking for working alloca.h" >&5
+echo "configure:10453: checking for working alloca.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10514 "configure"
+#line 10456 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int main() {
 char *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:10521: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10463: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_header_alloca_h=yes
 else
@@ -10541,10 +10483,10 @@ EOF
 fi
 
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:10545: checking for alloca" >&5
+echo "configure:10487: checking for alloca" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10548 "configure"
+#line 10490 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -10572,7 +10514,7 @@ int main() {
 char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:10576: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10518: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_func_alloca_works=yes
 else
@@ -10611,10 +10553,10 @@ EOF
 
 
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:10615: checking whether alloca needs Cray hooks" >&5
+echo "configure:10557: checking whether alloca needs Cray hooks" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10618 "configure"
+#line 10560 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -10638,10 +10580,10 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
 if test $ac_cv_os_cray = yes; then
 for ac_func in _getb67 GETB67 getb67; do
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10642: checking for $ac_func" >&5
+echo "configure:10584: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10645 "configure"
+#line 10587 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -10664,7 +10606,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:10668: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10610: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -10694,10 +10636,10 @@ done
 fi
 
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:10698: checking stack direction for C alloca" >&5
+echo "configure:10640: checking stack direction for C alloca" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10701 "configure"
+#line 10643 "configure"
 #include "confdefs.h"
 find_stack_direction ()
 {
@@ -10716,7 +10658,7 @@ main ()
   exit (find_stack_direction() < 0);
 }
 EOF
-if { (eval echo configure:10720: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:10662: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_c_stack_direction=1
 else
@@ -10745,15 +10687,15 @@ test -n "$ALLOCA" && extra_objs="$extra_objs $ALLOCA" &&  if test "$extra_verbos
 
 ac_safe=`echo "vfork.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for vfork.h""... $ac_c" 1>&6
-echo "configure:10749: checking for vfork.h" >&5
+echo "configure:10691: checking for vfork.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10752 "configure"
+#line 10694 "configure"
 #include "confdefs.h"
 #include <vfork.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:10757: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:10699: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -10781,10 +10723,10 @@ else
 fi
 
 echo $ac_n "checking for working vfork""... $ac_c" 1>&6
-echo "configure:10785: checking for working vfork" >&5
+echo "configure:10727: checking for working vfork" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10788 "configure"
+#line 10730 "configure"
 #include "confdefs.h"
 /* Thanks to Paul Eggert for this test.  */
 #include <stdio.h>
@@ -10879,7 +10821,7 @@ main() {
   }
 }
 EOF
-if { (eval echo configure:10883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:10825: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_func_vfork_works=yes
 else
 
 
 echo $ac_n "checking for working strcoll""... $ac_c" 1>&6
-echo "configure:10909: checking for working strcoll" >&5
+echo "configure:10851: checking for working strcoll" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10912 "configure"
+#line 10854 "configure"
 #include "confdefs.h"
 #include <string.h>
 main ()
@@ -10918,7 +10860,7 @@ main ()
        strcoll ("123", "456") >= 0);
 }
 EOF
-if { (eval echo configure:10922: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:10864: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_func_strcoll_works=yes
 else
 for ac_func in getpgrp
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:10950: checking for $ac_func" >&5
+echo "configure:10892: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 10953 "configure"
+#line 10895 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -10972,7 +10914,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:10976: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:10918: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
 done
 
 echo $ac_n "checking whether getpgrp takes no argument""... $ac_c" 1>&6
-echo "configure:11004: checking whether getpgrp takes no argument" >&5
+echo "configure:10946: checking whether getpgrp takes no argument" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11007 "configure"
+#line 10949 "configure"
 #include "confdefs.h"
 
 /*
@@ -11058,7 +11000,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:11062: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:11004: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   ac_cv_func_getpgrp_void=yes
 else
 
 
 echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:11089: checking for working mmap" >&5
+echo "configure:11031: checking for working mmap" >&5
 case "$opsys" in ultrix* ) have_mmap=no ;; *)
 cat > conftest.$ac_ext <<EOF
-#line 11092 "configure"
+#line 11034 "configure"
 #include "confdefs.h"
 #include <stdio.h>
 #include <unistd.h>
@@ -11121,7 +11063,7 @@ int main (int argc, char *argv[])
   return 1;
 }
 EOF
-if { (eval echo configure:11125: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:11067: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   have_mmap=yes
 else
@@ -11147,9 +11089,9 @@ test "$GNU_MALLOC" != "yes" -a "$have_mmap" != "yes" && rel_alloc=no
 if test "$rel_alloc $have_mmap" = "default yes"; then
   if test "$doug_lea_malloc" = "yes"; then
         echo $ac_n "checking for M_MMAP_THRESHOLD""... $ac_c" 1>&6
-echo "configure:11151: checking for M_MMAP_THRESHOLD" >&5
+echo "configure:11093: checking for M_MMAP_THRESHOLD" >&5
     cat > conftest.$ac_ext <<EOF
-#line 11153 "configure"
+#line 11095 "configure"
 #include "confdefs.h"
 #include <malloc.h>
 int main() {
@@ -11161,7 +11103,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:11165: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:11107: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   rel_alloc=no; echo "$ac_t""yes" 1>&6;
 else
@@ -11186,15 +11128,15 @@ EOF
 
 ac_safe=`echo "termios.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for termios.h""... $ac_c" 1>&6
-echo "configure:11190: checking for termios.h" >&5
+echo "configure:11132: checking for termios.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11193 "configure"
+#line 11135 "configure"
 #include "confdefs.h"
 #include <termios.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11198: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11140: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11237,15 +11179,15 @@ else
   echo "$ac_t""no" 1>&6
 ac_safe=`echo "termio.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for termio.h""... $ac_c" 1>&6
-echo "configure:11241: checking for termio.h" >&5
+echo "configure:11183: checking for termio.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11244 "configure"
+#line 11186 "configure"
 #include "confdefs.h"
 #include <termio.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11249: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11191: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
 
 echo $ac_n "checking for socket""... $ac_c" 1>&6
-echo "configure:11281: checking for socket" >&5
+echo "configure:11223: checking for socket" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11284 "configure"
+#line 11226 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char socket(); below.  */
@@ -11303,7 +11245,7 @@ socket();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11307: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11249: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_socket=yes"
 else
@@ -11318,15 +11260,15 @@ if eval "test \"`echo '$ac_cv_func_'socket`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "netinet/in.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for netinet/in.h""... $ac_c" 1>&6
-echo "configure:11322: checking for netinet/in.h" >&5
+echo "configure:11264: checking for netinet/in.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11325 "configure"
+#line 11267 "configure"
 #include "confdefs.h"
 #include <netinet/in.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11330: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11272: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11343,15 +11285,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "arpa/inet.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for arpa/inet.h""... $ac_c" 1>&6
-echo "configure:11347: checking for arpa/inet.h" >&5
+echo "configure:11289: checking for arpa/inet.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11350 "configure"
+#line 11292 "configure"
 #include "confdefs.h"
 #include <arpa/inet.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11355: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11297: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11376,9 +11318,9 @@ EOF
 }
 
       echo $ac_n "checking "for sun_len member in struct sockaddr_un"""... $ac_c" 1>&6
-echo "configure:11380: checking "for sun_len member in struct sockaddr_un"" >&5
+echo "configure:11322: checking "for sun_len member in struct sockaddr_un"" >&5
       cat > conftest.$ac_ext <<EOF
-#line 11382 "configure"
+#line 11324 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -11389,7 +11331,7 @@ int main() {
 static struct sockaddr_un x; x.sun_len = 1;
 ; return 0; }
 EOF
-if { (eval echo configure:11393: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11335: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_SOCKADDR_SUN_LEN
@@ -11407,9 +11349,9 @@ else
 fi
 rm -f conftest*
       echo $ac_n "checking "for ip_mreq struct in netinet/in.h"""... $ac_c" 1>&6
-echo "configure:11411: checking "for ip_mreq struct in netinet/in.h"" >&5
+echo "configure:11353: checking "for ip_mreq struct in netinet/in.h"" >&5
       cat > conftest.$ac_ext <<EOF
-#line 11413 "configure"
+#line 11355 "configure"
 #include "confdefs.h"
 
 #include <sys/types.h>
@@ -11419,7 +11361,7 @@ int main() {
 static struct ip_mreq x;
 ; return 0; }
 EOF
-if { (eval echo configure:11423: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   echo "$ac_t""yes" 1>&6; { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_MULTICAST
 
 
 echo $ac_n "checking for msgget""... $ac_c" 1>&6
-echo "configure:11454: checking for msgget" >&5
+echo "configure:11396: checking for msgget" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11457 "configure"
+#line 11399 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char msgget(); below.  */
@@ -11476,7 +11418,7 @@ msgget();
 
 ; return 0; }
 EOF
-if { (eval echo configure:11480: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11422: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_msgget=yes"
 else
@@ -11491,15 +11433,15 @@ if eval "test \"`echo '$ac_cv_func_'msgget`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "sys/ipc.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/ipc.h""... $ac_c" 1>&6
-echo "configure:11495: checking for sys/ipc.h" >&5
+echo "configure:11437: checking for sys/ipc.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11498 "configure"
+#line 11440 "configure"
 #include "confdefs.h"
 #include <sys/ipc.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11503: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11445: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11516,15 +11458,15 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   ac_safe=`echo "sys/msg.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/msg.h""... $ac_c" 1>&6
-echo "configure:11520: checking for sys/msg.h" >&5
+echo "configure:11462: checking for sys/msg.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11523 "configure"
+#line 11465 "configure"
 #include "confdefs.h"
 #include <sys/msg.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11528: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11470: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
 ac_safe=`echo "dirent.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for dirent.h""... $ac_c" 1>&6
-echo "configure:11566: checking for dirent.h" >&5
+echo "configure:11508: checking for dirent.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11569 "configure"
+#line 11511 "configure"
 #include "confdefs.h"
 #include <dirent.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11574: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11516: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11597,15 +11539,15 @@ else
   echo "$ac_t""no" 1>&6
 ac_safe=`echo "sys/dir.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for sys/dir.h""... $ac_c" 1>&6
-echo "configure:11601: checking for sys/dir.h" >&5
+echo "configure:11543: checking for sys/dir.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11604 "configure"
+#line 11546 "configure"
 #include "confdefs.h"
 #include <sys/dir.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11609: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11551: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
 ac_safe=`echo "nlist.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for nlist.h""... $ac_c" 1>&6
-echo "configure:11642: checking for nlist.h" >&5
+echo "configure:11584: checking for nlist.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11645 "configure"
+#line 11587 "configure"
 #include "confdefs.h"
 #include <nlist.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11650: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11592: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
 
 echo "checking "for sound support"" 1>&6
-echo "configure:11680: checking "for sound support"" >&5
+echo "configure:11622: checking "for sound support"" >&5
 test -z "$with_native_sound" -a -n "$native_sound_lib" && with_native_sound=yes
 
 if test "$with_native_sound" != "no"; then
     if test -n "$native_sound_lib"; then
     ac_safe=`echo "multimedia/audio_device.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for multimedia/audio_device.h""... $ac_c" 1>&6
-echo "configure:11687: checking for multimedia/audio_device.h" >&5
+echo "configure:11629: checking for multimedia/audio_device.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11690 "configure"
+#line 11632 "configure"
 #include "confdefs.h"
 #include <multimedia/audio_device.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11695: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11637: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
       if test -z "$native_sound_lib"; then
         
 echo $ac_n "checking for ALopenport in -laudio""... $ac_c" 1>&6
-echo "configure:11743: checking for ALopenport in -laudio" >&5
+echo "configure:11685: checking for ALopenport in -laudio" >&5
 ac_lib_var=`echo audio'_'ALopenport | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -laudio "
 cat > conftest.$ac_ext <<EOF
-#line 11748 "configure"
+#line 11690 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -11755,7 +11697,7 @@ int main() {
 ALopenport()
 ; return 0; }
 EOF
-if { (eval echo configure:11759: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11701: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
       if test -z "$native_sound_lib"; then
        
 echo $ac_n "checking for AOpenAudio in -lAlib""... $ac_c" 1>&6
-echo "configure:11790: checking for AOpenAudio in -lAlib" >&5
+echo "configure:11732: checking for AOpenAudio in -lAlib" >&5
 ac_lib_var=`echo Alib'_'AOpenAudio | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lAlib "
 cat > conftest.$ac_ext <<EOF
-#line 11795 "configure"
+#line 11737 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -11802,7 +11744,7 @@ int main() {
 AOpenAudio()
 ; return 0; }
 EOF
-if { (eval echo configure:11806: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
     for dir in "machine" "sys" "linux"; do
       ac_safe=`echo "${dir}/soundcard.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ${dir}/soundcard.h""... $ac_c" 1>&6
-echo "configure:11844: checking for ${dir}/soundcard.h" >&5
+echo "configure:11786: checking for ${dir}/soundcard.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11847 "configure"
+#line 11789 "configure"
 #include "confdefs.h"
 #include <${dir}/soundcard.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11852: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11794: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 if test "$with_nas_sound" != "no"; then
   ac_safe=`echo "audio/audiolib.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for audio/audiolib.h""... $ac_c" 1>&6
-echo "configure:11906: checking for audio/audiolib.h" >&5
+echo "configure:11848: checking for audio/audiolib.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 11909 "configure"
+#line 11851 "configure"
 #include "confdefs.h"
 #include <audio/audiolib.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:11914: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:11856: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -11928,12 +11870,12 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   
     
 echo $ac_n "checking for AuOpenServer in -laudio""... $ac_c" 1>&6
-echo "configure:11932: checking for AuOpenServer in -laudio" >&5
+echo "configure:11874: checking for AuOpenServer in -laudio" >&5
 ac_lib_var=`echo audio'_'AuOpenServer | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -laudio "
 cat > conftest.$ac_ext <<EOF
-#line 11937 "configure"
+#line 11879 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -11944,7 +11886,7 @@ int main() {
 AuOpenServer()
 ; return 0; }
 EOF
-if { (eval echo configure:11948: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:11890: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -11983,7 +11925,7 @@ EOF
  fi
     libs_x="-laudio $libs_x" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"-laudio\" to \$libs_x"; fi
             cat > conftest.$ac_ext <<EOF
-#line 11987 "configure"
+#line 11929 "configure"
 #include "confdefs.h"
 #include <audio/Xtutil.h>
 EOF
@@ -12014,7 +11956,7 @@ if test "$with_esd_sound" != "no"; then
   # Extract the first word of "esd-config", so it can be a program name with args.
 set dummy esd-config; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:12018: checking for $ac_word" >&5
+echo "configure:11960: checking for $ac_word" >&5
 
 if test -n "$have_esd_config"; then
   ac_cv_prog_have_esd_config="$have_esd_config" # Let the user override the test.
     c_switch_site="$c_switch_site `esd-config --cflags`" &&  if test "$extra_verbose" = "yes"; then echo "    Appending \"`esd-config --cflags`\" to \$c_switch_site"; fi
     LIBS="`esd-config --libs` $LIBS" &&  if test "$extra_verbose" = "yes"; then echo "    Prepending \"`esd-config --libs`\" to \$LIBS"; fi
     echo $ac_n "checking for esd_play_stream""... $ac_c" 1>&6
-echo "configure:12047: checking for esd_play_stream" >&5
+echo "configure:11989: checking for esd_play_stream" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12050 "configure"
+#line 11992 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char esd_play_stream(); below.  */
@@ -12069,7 +12011,7 @@ esd_play_stream();
 
 ; return 0; }
 EOF
-if { (eval echo configure:12073: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12015: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_esd_play_stream=yes"
 else
@@ -12120,7 +12062,7 @@ test -z "$with_tty" && with_tty=yes
 
 if test "$with_tty" = "yes"  ; then
   echo "checking for TTY-related features" 1>&6
-echo "configure:12124: checking for TTY-related features" >&5
+echo "configure:12066: checking for TTY-related features" >&5
   { test "$extra_verbose" = "yes" && cat << \EOF
     Defining HAVE_TTY
 EOF
@@ -12136,12 +12078,12 @@ EOF
     if test -z "$with_ncurses"; then
     
 echo $ac_n "checking for tgetent in -lncurses""... $ac_c" 1>&6
-echo "configure:12140: checking for tgetent in -lncurses" >&5
+echo "configure:12082: checking for tgetent in -lncurses" >&5
 ac_lib_var=`echo ncurses'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lncurses "
 cat > conftest.$ac_ext <<EOF
-#line 12145 "configure"
+#line 12087 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -12152,7 +12094,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:12156: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12098: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -12185,15 +12127,15 @@ EOF
 
     ac_safe=`echo "ncurses/curses.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ncurses/curses.h""... $ac_c" 1>&6
-echo "configure:12189: checking for ncurses/curses.h" >&5
+echo "configure:12131: checking for ncurses/curses.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12192 "configure"
+#line 12134 "configure"
 #include "confdefs.h"
 #include <ncurses/curses.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12197: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12139: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 
     ac_safe=`echo "ncurses/term.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ncurses/term.h""... $ac_c" 1>&6
-echo "configure:12219: checking for ncurses/term.h" >&5
+echo "configure:12161: checking for ncurses/term.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12222 "configure"
+#line 12164 "configure"
 #include "confdefs.h"
 #include <ncurses/term.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12227: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12169: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
       c_switch_site="$c_switch_site -I/usr/include/ncurses"
       ac_safe=`echo "ncurses/curses.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ncurses/curses.h""... $ac_c" 1>&6
-echo "configure:12257: checking for ncurses/curses.h" >&5
+echo "configure:12199: checking for ncurses/curses.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12260 "configure"
+#line 12202 "configure"
 #include "confdefs.h"
 #include <ncurses/curses.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12265: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12207: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
        for lib in curses termlib termcap; do
          
 echo $ac_n "checking for tgetent in -l$lib""... $ac_c" 1>&6
-echo "configure:12300: checking for tgetent in -l$lib" >&5
+echo "configure:12242: checking for tgetent in -l$lib" >&5
 ac_lib_var=`echo $lib'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -l$lib "
 cat > conftest.$ac_ext <<EOF
-#line 12305 "configure"
+#line 12247 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -12312,7 +12254,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:12316: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12258: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
       else
        
 echo $ac_n "checking for tgetent in -lcurses""... $ac_c" 1>&6
-echo "configure:12347: checking for tgetent in -lcurses" >&5
+echo "configure:12289: checking for tgetent in -lcurses" >&5
 ac_lib_var=`echo curses'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lcurses "
 cat > conftest.$ac_ext <<EOF
-#line 12352 "configure"
+#line 12294 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -12359,7 +12301,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:12363: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12305: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -12377,12 +12319,12 @@ if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes" ; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6
-echo "configure:12381: checking for tgetent in -ltermcap" >&5
+echo "configure:12323: checking for tgetent in -ltermcap" >&5
 ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ltermcap "
 cat > conftest.$ac_ext <<EOF
-#line 12386 "configure"
+#line 12328 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -12393,7 +12335,7 @@ int main() {
 tgetent()
 ; return 0; }
 EOF
-if { (eval echo configure:12397: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12339: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -12441,15 +12383,15 @@ EOF
 
     test -z "$with_gpm" && { ac_safe=`echo "gpm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for gpm.h""... $ac_c" 1>&6
-echo "configure:12445: checking for gpm.h" >&5
+echo "configure:12387: checking for gpm.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12448 "configure"
+#line 12390 "configure"
 #include "confdefs.h"
 #include <gpm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12453: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12395: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
  }
   test -z "$with_gpm" && { 
 echo $ac_n "checking for Gpm_Open in -lgpm""... $ac_c" 1>&6
-echo "configure:12476: checking for Gpm_Open in -lgpm" >&5
+echo "configure:12418: checking for Gpm_Open in -lgpm" >&5
 ac_lib_var=`echo gpm'_'Gpm_Open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lgpm "
 cat > conftest.$ac_ext <<EOF
-#line 12481 "configure"
+#line 12423 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -12488,7 +12430,7 @@ int main() {
 Gpm_Open()
 ; return 0; }
 EOF
-if { (eval echo configure:12492: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12434: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -12538,20 +12480,20 @@ test "$with_x11" = "yes" -o "$with_tty" = "yes" && extra_objs="$extra_objs event
 
 test "$with_database_gdbm $with_database_dbm $with_database_berkdb" \
   != "no no no" && echo "checking for database support" 1>&6
-echo "configure:12542: checking for database support" >&5
+echo "configure:12484: checking for database support" >&5
 
 if test "$with_database_gdbm $with_database_dbm" != "no no"; then
   ac_safe=`echo "ndbm.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for ndbm.h""... $ac_c" 1>&6
-echo "configure:12547: checking for ndbm.h" >&5
+echo "configure:12489: checking for ndbm.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12550 "configure"
+#line 12492 "configure"
 #include "confdefs.h"
 #include <ndbm.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:12555: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12497: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
 if test "$with_database_gdbm" != "no"; then
   
 echo $ac_n "checking for dbm_open in -lgdbm""... $ac_c" 1>&6
-echo "configure:12585: checking for dbm_open in -lgdbm" >&5
+echo "configure:12527: checking for dbm_open in -lgdbm" >&5
 ac_lib_var=`echo gdbm'_'dbm_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lgdbm "
 cat > conftest.$ac_ext <<EOF
-#line 12590 "configure"
+#line 12532 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -12597,7 +12539,7 @@ int main() {
 dbm_open()
 ; return 0; }
 EOF
-if { (eval echo configure:12601: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12543: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 
 if test "$with_database_dbm" != "no"; then
   echo $ac_n "checking for dbm_open""... $ac_c" 1>&6
-echo "configure:12629: checking for dbm_open" >&5
+echo "configure:12571: checking for dbm_open" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12632 "configure"
+#line 12574 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char dbm_open(); below.  */
@@ -12651,7 +12593,7 @@ dbm_open();
 
 ; return 0; }
 EOF
-if { (eval echo configure:12655: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12597: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_dbm_open=yes"
 else
@@ -12670,12 +12612,12 @@ else
 
     
 echo $ac_n "checking for dbm_open in -ldbm""... $ac_c" 1>&6
-echo "configure:12674: checking for dbm_open in -ldbm" >&5
+echo "configure:12616: checking for dbm_open in -ldbm" >&5
 ac_lib_var=`echo dbm'_'dbm_open | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldbm "
 cat > conftest.$ac_ext <<EOF
-#line 12679 "configure"
+#line 12621 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -12686,7 +12628,7 @@ int main() {
 dbm_open()
 ; return 0; }
 EOF
-if { (eval echo configure:12690: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -12727,10 +12669,10 @@ EOF
 
 if test "$with_database_berkdb" != "no"; then
   echo $ac_n "checking for Berkeley db.h""... $ac_c" 1>&6
-echo "configure:12731: checking for Berkeley db.h" >&5
+echo "configure:12673: checking for Berkeley db.h" >&5
   for header in "db/db.h" "db.h"; do
     cat > conftest.$ac_ext <<EOF
-#line 12734 "configure"
+#line 12676 "configure"
 #include "confdefs.h"
 
 #include <stdlib.h>
@@ -12752,7 +12694,7 @@ int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:12756: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:12698: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   db_h_file="$header"; break
 else
@@ -12768,9 +12710,9 @@ rm -f conftest*
 
   if test "$with_database_berkdb" != "no"; then
     echo $ac_n "checking for Berkeley DB version""... $ac_c" 1>&6
-echo "configure:12772: checking for Berkeley DB version" >&5
+echo "configure:12714: checking for Berkeley DB version" >&5
     cat > conftest.$ac_ext <<EOF
-#line 12774 "configure"
+#line 12716 "configure"
 #include "confdefs.h"
 #include <$db_h_file>
 #if DB_VERSION_MAJOR > 1
 rm -f conftest*
 
     echo $ac_n "checking for $dbfunc""... $ac_c" 1>&6
-echo "configure:12793: checking for $dbfunc" >&5
+echo "configure:12735: checking for $dbfunc" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12796 "configure"
+#line 12738 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $dbfunc(); below.  */
@@ -12815,7 +12757,7 @@ $dbfunc();
 
 ; return 0; }
 EOF
-if { (eval echo configure:12819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12761: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$dbfunc=yes"
 else
@@ -12834,12 +12776,12 @@ else
 
     
 echo $ac_n "checking for $dbfunc in -ldb""... $ac_c" 1>&6
-echo "configure:12838: checking for $dbfunc in -ldb" >&5
+echo "configure:12780: checking for $dbfunc in -ldb" >&5
 ac_lib_var=`echo db'_'$dbfunc | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldb "
 cat > conftest.$ac_ext <<EOF
-#line 12843 "configure"
+#line 12785 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -12850,7 +12792,7 @@ int main() {
 $dbfunc()
 ; return 0; }
 EOF
-if { (eval echo configure:12854: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12796: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 if test "$with_socks" = "yes"; then
   
 echo $ac_n "checking for SOCKSinit in -lsocks""... $ac_c" 1>&6
-echo "configure:12918: checking for SOCKSinit in -lsocks" >&5
+echo "configure:12860: checking for SOCKSinit in -lsocks" >&5
 ac_lib_var=`echo socks'_'SOCKSinit | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lsocks "
 cat > conftest.$ac_ext <<EOF
-#line 12923 "configure"
+#line 12865 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -12930,7 +12872,7 @@ int main() {
 SOCKSinit()
 ; return 0; }
 EOF
-if { (eval echo configure:12934: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12876: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
 
 if test "$with_modules" != "no"; then
   echo "checking for module support" 1>&6
-echo "configure:12989: checking for module support" >&5
+echo "configure:12931: checking for module support" >&5
 
     ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
-echo "configure:12993: checking for dlfcn.h" >&5
+echo "configure:12935: checking for dlfcn.h" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 12996 "configure"
+#line 12938 "configure"
 #include "confdefs.h"
 #include <dlfcn.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:13001: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:12943: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -13015,12 +12957,12 @@ if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   
     
 echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
-echo "configure:13019: checking for dlopen in -ldl" >&5
+echo "configure:12961: checking for dlopen in -ldl" >&5
 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldl "
 cat > conftest.$ac_ext <<EOF
-#line 13024 "configure"
+#line 12966 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13031,7 +12973,7 @@ int main() {
 dlopen()
 ; return 0; }
 EOF
-if { (eval echo configure:13035: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:12977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -13050,12 +12992,12 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for dlopen in -lc""... $ac_c" 1>&6
-echo "configure:13054: checking for dlopen in -lc" >&5
+echo "configure:12996: checking for dlopen in -lc" >&5
 ac_lib_var=`echo c'_'dlopen | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -lc "
 cat > conftest.$ac_ext <<EOF
-#line 13059 "configure"
+#line 13001 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13066,7 +13008,7 @@ int main() {
 dlopen()
 ; return 0; }
 EOF
-if { (eval echo configure:13070: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13012: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -13105,12 +13047,12 @@ EOF
   else
     
 echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6
-echo "configure:13109: checking for shl_load in -ldld" >&5
+echo "configure:13051: checking for shl_load in -ldld" >&5
 ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldld "
 cat > conftest.$ac_ext <<EOF
-#line 13114 "configure"
+#line 13056 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13121,7 +13063,7 @@ int main() {
 shl_load()
 ; return 0; }
 EOF
-if { (eval echo configure:13125: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13067: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -13148,12 +13090,12 @@ else
   echo "$ac_t""no" 1>&6
 
 echo $ac_n "checking for dld_init in -ldld""... $ac_c" 1>&6
-echo "configure:13152: checking for dld_init in -ldld" >&5
+echo "configure:13094: checking for dld_init in -ldld" >&5
 ac_lib_var=`echo dld'_'dld_init | sed 'y%./+-%__p_%'`
 
 xe_check_libs=" -ldld "
 cat > conftest.$ac_ext <<EOF
-#line 13157 "configure"
+#line 13099 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -13164,7 +13106,7 @@ int main() {
 dld_init()
 ; return 0; }
 EOF
-if { (eval echo configure:13168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -13209,7 +13151,7 @@ xehost=$canonical
 xealias=$internal_configuration
 
 echo "checking how to build dynamic libraries for ${xehost}" 1>&6
-echo "configure:13213: checking how to build dynamic libraries for ${xehost}" >&5
+echo "configure:13155: checking how to build dynamic libraries for ${xehost}" >&5
 # Transform *-*-linux* to *-*-linux-gnu*, to support old configure scripts.
 case "$xehost" in
 *-*-linux-gnu*) ;;
@@ -13237,9 +13179,9 @@ if test "$GCC" = "yes"; then
   XEGCC=yes
 else
   echo $ac_n "checking checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:13241: checking checking whether we are using GNU C" >&5
+echo "configure:13183: checking checking whether we are using GNU C" >&5
   cat > conftest.$ac_ext <<EOF
-#line 13243 "configure"
+#line 13185 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -13261,7 +13203,7 @@ rm -f conftest*
 fi
 
 echo $ac_n "checking how to produce PIC code""... $ac_c" 1>&6
-echo "configure:13265: checking how to produce PIC code" >&5
+echo "configure:13207: checking how to produce PIC code" >&5
 wl=
 
 can_build_shared=yes
@@ -13354,18 +13296,18 @@ if test -n "$dll_cflags"; then
   
   # Check to make sure the dll_cflags actually works.
   echo $ac_n "checking if PIC flag ${dll_cflags} really works""... $ac_c" 1>&6
-echo "configure:13358: checking if PIC flag ${dll_cflags} really works" >&5
+echo "configure:13300: checking if PIC flag ${dll_cflags} really works" >&5
   save_CFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS $dll_cflags -DPIC"
   cat > conftest.$ac_ext <<EOF
-#line 13362 "configure"
+#line 13304 "configure"
 #include "confdefs.h"
 
 int main() {
 int x=0;
 ; return 0; }
 EOF
-if { (eval echo configure:13369: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:13311: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   
     # On HP-UX, the stripped-down bundled CC doesn't accept +Z, but also
@@ -13396,7 +13338,7 @@ cc_produces_so=no
 xldf=
 xcldf=
 echo $ac_n "checking if C compiler can produce shared libraries""... $ac_c" 1>&6
-echo "configure:13400: checking if C compiler can produce shared libraries" >&5
+echo "configure:13342: checking if C compiler can produce shared libraries" >&5
 if test "$XEGCC" = yes; then
   xcldf="-shared"
   xldf="-shared"
@@ -13447,14 +13389,14 @@ if test -n "$xcldf"; then
   xe_libs=
   ac_link='${CC-cc} -o conftest $CFLAGS '"$xe_cppflags $xe_ldflags"' conftest.$ac_ext '"$xe_libs"' 1>&5'
   cat > conftest.$ac_ext <<EOF
-#line 13451 "configure"
+#line 13393 "configure"
 #include "confdefs.h"
 
 int main() {
 int x=0;
 ; return 0; }
 EOF
-if { (eval echo configure:13458: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   cc_produces_so=yes
 else
@@ -13479,7 +13421,7 @@ if test -z "$LTLD"; then
   if test "$XEGCC" = yes; then
     # Check if gcc -print-prog-name=ld gives a path.
     echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
-echo "configure:13483: checking for ld used by GCC" >&5
+echo "configure:13425: checking for ld used by GCC" >&5
     ac_prog=`($CC -print-prog-name=ld) 2>&5`
     case "$ac_prog" in
     # Accept absolute paths.
@@ -13504,7 +13446,7 @@ echo "configure:13483: checking for ld used by GCC" >&5
     esac
   else
     echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
-echo "configure:13508: checking for GNU ld" >&5
+echo "configure:13450: checking for GNU ld" >&5
   fi
 
   if test -z "$LTLD"; then
@@ -13542,7 +13484,7 @@ ld_dynamic_link_flags=
 
 # Check to see if it really is or isn't GNU ld.
 echo $ac_n "checking if the linker is GNU ld""... $ac_c" 1>&6
-echo "configure:13546: checking if the linker is GNU ld" >&5
+echo "configure:13488: checking if the linker is GNU ld" >&5
 # I'd rather use --version here, but apparently some GNU ld's only accept -v.
 if $LTLD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
   xe_gnu_ld=yes
@@ -13570,7 +13512,7 @@ else
   # OK - only NOW do we futz about with ld.
   # See if the linker supports building shared libraries.
   echo $ac_n "checking whether the linker supports shared libraries""... $ac_c" 1>&6
-echo "configure:13574: checking whether the linker supports shared libraries" >&5
+echo "configure:13516: checking whether the linker supports shared libraries" >&5
   dll_ld=$CC
   dll_ldflags=$LDFLAGS
   ld_shlibs=yes
@@ -13785,10 +13727,10 @@ EOF
     for ac_func in dlerror _dlerror
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:13789: checking for $ac_func" >&5
+echo "configure:13731: checking for $ac_func" >&5
 
 cat > conftest.$ac_ext <<EOF
-#line 13792 "configure"
+#line 13734 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -13811,7 +13753,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:13815: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:13757: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -13850,11 +13792,11 @@ done
 fi
 
 cat > conftest.$ac_ext <<EOF
-#line 13854 "configure"
+#line 13796 "configure"
 #include "confdefs.h"
 int main(int c,char *v[]){return 0;}
 EOF
-if { (eval echo configure:13858: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
+if { (eval echo configure:13800: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit $?) 2>&5
 then
   :
 else
@@ -14150,17 +14092,6 @@ done
 
 
 
-LOCKDIR=$lockdir
-while true; do
-  case "$LOCKDIR" in
-    *\$* ) eval "LOCKDIR=$LOCKDIR" ;;
-    *) break ;;
-  esac
-done
-
-
-
-
 DOCDIR=$docdir
 while true; do
   case "$DOCDIR" in
@@ -14642,8 +14573,6 @@ test "$with_workshop" = yes && echo "  Compiling in support for Sun WorkShop."
 test "$with_socks" = yes && echo "  Compiling in support for SOCKS."
 test "$with_dnet" = yes && echo "  Compiling in support for DNET."
 test "$with_modules" = "yes" && echo "  Compiling in support for dynamic shared object modules."
-test "$with_clash_detection" != "no" && \
-  echo "  Clash detection will use \"$lockdir\" for locking files."
 test "$use_union_type" = yes && echo "  Using the union type for Lisp_Objects."
 test "$pdump" = yes && echo "  Using the new portable dumper."
 test "$debug" = yes && echo "  Compiling in support for extra debugging code."
@@ -14834,9 +14763,6 @@ s%@SITEMODULEDIR@%$SITEMODULEDIR%g
 s%@etcdir@%$etcdir%g
 s%@ETCDIR_USER_DEFINED@%$ETCDIR_USER_DEFINED%g
 s%@ETCDIR@%$ETCDIR%g
-s%@lockdir@%$lockdir%g
-s%@LOCKDIR_USER_DEFINED@%$LOCKDIR_USER_DEFINED%g
-s%@LOCKDIR@%$LOCKDIR%g
 s%@docdir@%$docdir%g
 s%@DOCDIR_USER_DEFINED@%$DOCDIR_USER_DEFINED%g
 s%@DOCDIR@%$DOCDIR%g
index ff22b3f..e02baf7 100644 (file)
@@ -358,7 +358,6 @@ sitemoduledir='${datadir}/${inststaticdir}/site-modules'
 pkgdir='${datadir}/${instvardir}/lisp'
 package_path=''
 etcdir='${datadir}/${instvardir}/etc'
-lockdir='${statedir}/${inststaticdir}/lock'
 archlibdir='${datadir}/${instvardir}/${configuration}'
 docdir='${archlibdir}'
 with_prefix='yes'
@@ -746,7 +745,7 @@ The default is to autodetect all sound support."])
 
        dnl Has the user specified one of the path options?
        prefix | exec_prefix | bindir | datadir | statedir | libdir | \
-       mandir | infodir | infopath | lispdir | etcdir | lockdir | pkgdir | \
+       mandir | infodir | infopath | lispdir | etcdir | pkgdir | \
        archlibdir | docdir | package_path )
           dnl If the value was omitted, get it from the next argument.
           if test "$valomitted" = "yes"; then
@@ -774,7 +773,6 @@ The default is to autodetect all sound support."])
                AC_DEFINE(LISPDIR_USER_DEFINED)
             AC_DEFINE(MODULEDIR_USER_DEFINED)
                AC_DEFINE(ETCDIR_USER_DEFINED) ;;
-             statedir | lockdir ) AC_DEFINE(LOCKDIR_USER_DEFINED) ;;
             docdir ) AC_DEFINE(DOCDIR_USER_DEFINED) ;;
              exec_prefix | libdir | archlibdir ) AC_DEFINE(ARCHLIBDIR_USER_DEFINED) ;;
            esac
@@ -2271,7 +2269,6 @@ else
        doug_lea_malloc=no
 fi
 after_morecore_hook_exists=yes
-AC_CHECK_FUNC(malloc_get_state, ,doug_lea_malloc=no)
 AC_CHECK_FUNC(malloc_set_state, ,doug_lea_malloc=no)
 AC_MSG_CHECKING(whether __after_morecore_hook exists)
 AC_TRY_LINK([extern void (* __after_morecore_hook)();],[__after_morecore_hook = 0],
@@ -2292,18 +2289,15 @@ elif test "$with_debug_malloc" = "yes" ; then
     - User chose to use Debugging Malloc."
 fi
 
-if test "$doug_lea_malloc" = "yes" ; then
-  if test "$GNU_MALLOC" = yes ; then
-    GNU_MALLOC_reason="
+if test "$doug_lea_malloc" = "yes" -a "$GNU_MALLOC" = "yes" ; then
+  GNU_MALLOC_reason="
     - Using Doug Lea's new malloc from the GNU C Library."
-  fi
   AC_DEFINE(DOUG_LEA_MALLOC)
   if test "$after_morecore_hook_exists" = "no" ; then
     GNU_MALLOC_reason="
     - Using Doug Lea's new malloc from the Linux C Library."
     AC_DEFINE(_NO_MALLOC_WARNING_)
   fi
-  use_minimal_tagbits=yes
 fi
 
 dnl #### mcheck is broken in all versions of Linux libc and glibc.
@@ -4361,17 +4355,6 @@ while true; do
 done
 AC_SUBST(ETCDIR)
 
-AC_SUBST(lockdir)
-AC_SUBST(LOCKDIR_USER_DEFINED)
-LOCKDIR=$lockdir
-while true; do
-  case "$LOCKDIR" in
-    *\$* ) eval "LOCKDIR=$LOCKDIR" ;;
-    *) break ;;
-  esac
-done
-AC_SUBST(LOCKDIR)
-
 AC_SUBST(docdir)
 AC_SUBST(DOCDIR_USER_DEFINED)
 DOCDIR=$docdir
@@ -4684,8 +4667,6 @@ test "$with_workshop" = yes && echo "  Compiling in support for Sun WorkShop."
 test "$with_socks" = yes && echo "  Compiling in support for SOCKS."
 test "$with_dnet" = yes && echo "  Compiling in support for DNET."
 test "$with_modules" = "yes" && echo "  Compiling in support for dynamic shared object modules."
-test "$with_clash_detection" != "no" && \
-  echo "  Clash detection will use \"$lockdir\" for locking files."
 test "$use_union_type" = yes && echo "  Using the union type for Lisp_Objects."
 test "$pdump" = yes && echo "  Using the new portable dumper."
 test "$debug" = yes && echo "  Compiling in support for extra debugging code."
index 39ac03a..65773f1 100644 (file)
@@ -267,7 +267,7 @@ Ctrl<KeyPress>m: ArmAndActivate()\n
 ! Native Widget translations
 ! ======================= 
 Emacs*Text*translations: #override\n\
-       <Btn1Down>:     widget-focus-in()\n
+       <Btn1Down>:     widget-focus-in() select-start()\n
 
 ! XIM input method style 
 ! ======================= 
index 976473c..32108ed 100644 (file)
@@ -44,9 +44,9 @@ internals.info-2: 46628
 internals.info-3: 94463
 internals.info-4: 143504
 internals.info-5: 193454
-internals.info-6: 243016
-internals.info-7: 286633
-internals.info-8: 335499
+internals.info-6: 243017
+internals.info-7: 286634
+internals.info-8: 335500
 \1f
 Tag Table:
 (Indirect)
@@ -115,75 +115,75 @@ Node: Dumping\7f228018
 Node: Overview\7f230239
 Node: Data descriptions\7f230809
 Node: Dumping phase\7f232814
-Node: Object inventory\7f233216
-Node: Address allocation\7f236070
-Node: The header\7f237457
-Node: Data dumping\7f237965
-Node: Pointers dumping\7f238626
-Node: Reloading phase\7f239844
-Node: Remaining issues\7f241605
-Node: Events and the Event Loop\7f242566
-Node: Introduction to Events\7f243016
-Node: Main Loop\7f244965
-Node: Specifics of the Event Gathering Mechanism\7f248540
-Node: Specifics About the Emacs Event\7f260993
-Node: The Event Stream Callback Routines\7f261248
-Node: Other Event Loop Functions\7f261493
-Node: Converting Events\7f262633
-Node: Dispatching Events; The Command Builder\7f263242
-Node: Evaluation; Stack Frames; Bindings\7f263477
-Node: Evaluation\7f263819
-Node: Dynamic Binding; The specbinding Stack; Unwind-Protects\7f270374
-Node: Simple Special Forms\7f272758
-Node: Catch and Throw\7f273541
-Node: Symbols and Variables\7f276116
-Node: Introduction to Symbols\7f276380
-Node: Obarrays\7f277448
-Node: Symbol Values\7f280981
-Node: Buffers and Textual Representation\7f283269
-Node: Introduction to Buffers\7f283927
-Node: The Text in a Buffer\7f286633
-Node: Buffer Lists\7f293783
-Node: Markers and Extents\7f295734
-Node: Bufbytes and Emchars\7f297999
-Node: The Buffer Object\7f298214
-Node: MULE Character Sets and Encodings\7f301694
-Node: Character Sets\7f302756
-Node: Encodings\7f306241
-Node: Japanese EUC (Extended Unix Code)\7f307308
-Node: JIS7\7f308140
-Node: Internal Mule Encodings\7f309490
-Node: Internal String Encoding\7f311320
-Node: Internal Character Encoding\7f313465
-Node: CCL\7f315189
-Node: The Lisp Reader and Compiler\7f321941
-Node: Lstreams\7f322154
-Node: Creating an Lstream\7f323185
-Node: Lstream Types\7f324412
-Node: Lstream Functions\7f324664
-Node: Lstream Methods\7f328230
-Node: Consoles; Devices; Frames; Windows\7f331372
-Node: Introduction to Consoles; Devices; Frames; Windows\7f331687
-Node: Point\7f334220
-Node: Window Hierarchy\7f335499
-Node: The Window Object\7f339947
-Node: The Redisplay Mechanism\7f343384
-Node: Critical Redisplay Sections\7f344176
-Node: Line Start Cache\7f345163
-Node: Redisplay Piece by Piece\7f348399
-Node: Extents\7f350436
-Node: Introduction to Extents\7f350970
-Node: Extent Ordering\7f352112
-Node: Format of the Extent Info\7f353353
-Node: Zero-Length Extents\7f355240
-Node: Mathematics of Extent Ordering\7f356638
-Node: Extent Fragments\7f361395
-Node: Faces\7f362481
-Node: Glyphs\7f362597
-Node: Specifiers\7f365614
-Node: Menus\7f365743
-Node: Subprocesses\7f368001
-Node: Interface to X Windows\7f369977
-Node: Index\7f370148
+Node: Object inventory\7f233217
+Node: Address allocation\7f236071
+Node: The header\7f237458
+Node: Data dumping\7f237966
+Node: Pointers dumping\7f238627
+Node: Reloading phase\7f239845
+Node: Remaining issues\7f241606
+Node: Events and the Event Loop\7f242567
+Node: Introduction to Events\7f243017
+Node: Main Loop\7f244966
+Node: Specifics of the Event Gathering Mechanism\7f248541
+Node: Specifics About the Emacs Event\7f260994
+Node: The Event Stream Callback Routines\7f261249
+Node: Other Event Loop Functions\7f261494
+Node: Converting Events\7f262634
+Node: Dispatching Events; The Command Builder\7f263243
+Node: Evaluation; Stack Frames; Bindings\7f263478
+Node: Evaluation\7f263820
+Node: Dynamic Binding; The specbinding Stack; Unwind-Protects\7f270375
+Node: Simple Special Forms\7f272759
+Node: Catch and Throw\7f273542
+Node: Symbols and Variables\7f276117
+Node: Introduction to Symbols\7f276381
+Node: Obarrays\7f277449
+Node: Symbol Values\7f280982
+Node: Buffers and Textual Representation\7f283270
+Node: Introduction to Buffers\7f283928
+Node: The Text in a Buffer\7f286634
+Node: Buffer Lists\7f293784
+Node: Markers and Extents\7f295735
+Node: Bufbytes and Emchars\7f298000
+Node: The Buffer Object\7f298215
+Node: MULE Character Sets and Encodings\7f301695
+Node: Character Sets\7f302757
+Node: Encodings\7f306242
+Node: Japanese EUC (Extended Unix Code)\7f307309
+Node: JIS7\7f308141
+Node: Internal Mule Encodings\7f309491
+Node: Internal String Encoding\7f311321
+Node: Internal Character Encoding\7f313466
+Node: CCL\7f315190
+Node: The Lisp Reader and Compiler\7f321942
+Node: Lstreams\7f322155
+Node: Creating an Lstream\7f323186
+Node: Lstream Types\7f324413
+Node: Lstream Functions\7f324665
+Node: Lstream Methods\7f328231
+Node: Consoles; Devices; Frames; Windows\7f331373
+Node: Introduction to Consoles; Devices; Frames; Windows\7f331688
+Node: Point\7f334221
+Node: Window Hierarchy\7f335500
+Node: The Window Object\7f339948
+Node: The Redisplay Mechanism\7f343385
+Node: Critical Redisplay Sections\7f344177
+Node: Line Start Cache\7f345164
+Node: Redisplay Piece by Piece\7f348400
+Node: Extents\7f350437
+Node: Introduction to Extents\7f350971
+Node: Extent Ordering\7f352113
+Node: Format of the Extent Info\7f353354
+Node: Zero-Length Extents\7f355241
+Node: Mathematics of Extent Ordering\7f356639
+Node: Extent Fragments\7f361396
+Node: Faces\7f362482
+Node: Glyphs\7f362598
+Node: Specifiers\7f365615
+Node: Menus\7f365744
+Node: Subprocesses\7f368002
+Node: Interface to X Windows\7f369978
+Node: Index\7f370149
 \1f
 End Tag Table
index 320da86..d3cf890 100644 (file)
@@ -63,41 +63,41 @@ lispref.info-9: 388779
 lispref.info-10: 438231
 lispref.info-11: 486459
 lispref.info-12: 536231
-lispref.info-13: 584130
-lispref.info-14: 632353
-lispref.info-15: 680607
-lispref.info-16: 726799
-lispref.info-17: 775532
-lispref.info-18: 825530
-lispref.info-19: 875221
-lispref.info-20: 924062
-lispref.info-21: 972870
-lispref.info-22: 1019178
-lispref.info-23: 1068608
-lispref.info-24: 1117447
-lispref.info-25: 1162793
-lispref.info-26: 1210215
-lispref.info-27: 1255841
-lispref.info-28: 1305126
-lispref.info-29: 1352976
-lispref.info-30: 1401200
-lispref.info-31: 1450877
-lispref.info-32: 1499202
-lispref.info-33: 1548500
-lispref.info-34: 1589835
-lispref.info-35: 1636140
-lispref.info-36: 1685471
-lispref.info-37: 1733879
-lispref.info-38: 1782970
-lispref.info-39: 1832447
-lispref.info-40: 1880005
-lispref.info-41: 1924826
-lispref.info-42: 1962038
-lispref.info-43: 2006636
-lispref.info-44: 2053069
-lispref.info-45: 2093862
-lispref.info-46: 2143132
-lispref.info-47: 2156997
+lispref.info-13: 584131
+lispref.info-14: 632354
+lispref.info-15: 680608
+lispref.info-16: 726800
+lispref.info-17: 775533
+lispref.info-18: 825531
+lispref.info-19: 875222
+lispref.info-20: 924063
+lispref.info-21: 973599
+lispref.info-22: 1021180
+lispref.info-23: 1067504
+lispref.info-24: 1116677
+lispref.info-25: 1165729
+lispref.info-26: 1215204
+lispref.info-27: 1260830
+lispref.info-28: 1310115
+lispref.info-29: 1357965
+lispref.info-30: 1406189
+lispref.info-31: 1455866
+lispref.info-32: 1504191
+lispref.info-33: 1553489
+lispref.info-34: 1594822
+lispref.info-35: 1641127
+lispref.info-36: 1690344
+lispref.info-37: 1727314
+lispref.info-38: 1776244
+lispref.info-39: 1826065
+lispref.info-40: 1872992
+lispref.info-41: 1921089
+lispref.info-42: 1969206
+lispref.info-43: 2017513
+lispref.info-44: 2066217
+lispref.info-45: 2115779
+lispref.info-46: 2158365
+lispref.info-47: 2187578
 \1f
 Tag Table:
 (Indirect)
@@ -327,589 +327,591 @@ Node: Hooks for Loading\7f553011
 Node: Byte Compilation\7f553728
 Node: Speed of Byte-Code\7f555645
 Node: Compilation Functions\7f556852
-Node: Docs and Compilation\7f563239
-Node: Dynamic Loading\7f565892
-Node: Eval During Compile\7f568256
-Node: Compiled-Function Objects\7f569521
-Node: Disassembly\7f574319
-Node: Debugging\7f581573
-Node: Debugger\7f582985
-Node: Error Debugging\7f584130
-Node: Infinite Loops\7f586883
-Node: Function Debugging\7f588127
-Node: Explicit Debug\7f590917
-Node: Using Debugger\7f591688
-Node: Debugger Commands\7f593550
-Node: Invoking the Debugger\7f597867
-Node: Internals of Debugger\7f601782
-Node: Syntax Errors\7f606669
-Node: Excess Open\7f607917
-Node: Excess Close\7f609792
-Node: Compilation Errors\7f611213
-Node: Edebug\7f612501
-Node: Using Edebug\7f614609
-Node: Instrumenting\7f617306
-Node: Edebug Execution Modes\7f620795
-Node: Jumping\7f623905
-Node: Edebug Misc\7f626248
-Node: Breakpoints\7f627637
-Node: Global Break Condition\7f630443
-Node: Embedded Breakpoints\7f631398
-Node: Trapping Errors\7f632353
-Node: Edebug Views\7f634429
-Node: Edebug Eval\7f636394
-Node: Eval List\7f637571
-Node: Reading in Edebug\7f640956
-Node: Printing in Edebug\7f641755
-Node: Tracing\7f643470
-Node: Coverage Testing\7f645356
-Node: The Outside Context\7f647397
-Node: Checking Whether to Stop\7f648346
-Node: Edebug Display Update\7f648993
-Node: Edebug Recursive Edit\7f651016
-Node: Instrumenting Macro Calls\7f652671
-Node: Specification List\7f655153
-Node: Backtracking\7f664564
-Node: Debugging Backquote\7f666502
-Node: Specification Examples\7f670208
-Node: Edebug Options\7f672275
-Node: Read and Print\7f677612
-Node: Streams Intro\7f678589
-Node: Input Streams\7f680607
-Node: Input Functions\7f685508
-Node: Output Streams\7f687568
-Node: Output Functions\7f691619
-Node: Output Variables\7f695919
-Node: Minibuffers\7f700718
-Node: Intro to Minibuffers\7f701870
-Node: Text from Minibuffer\7f704058
-Node: Object from Minibuffer\7f709144
-Node: Minibuffer History\7f713239
-Node: Completion\7f716218
-Node: Basic Completion\7f718193
-Node: Minibuffer Completion\7f723222
-Node: Completion Commands\7f726799
-Node: High-Level Completion\7f731456
-Node: Reading File Names\7f736198
-Node: Programmed Completion\7f739890
-Node: Yes-or-No Queries\7f742272
-Node: Multiple Queries\7f748009
-Node: Reading a Password\7f752076
-Node: Minibuffer Misc\7f753413
-Node: Command Loop\7f758283
-Node: Command Overview\7f759627
-Node: Defining Commands\7f762905
-Node: Using Interactive\7f763653
-Node: Interactive Codes\7f768426
-Node: Interactive Examples\7f774218
-Node: Interactive Call\7f775532
-Node: Command Loop Info\7f780933
-Node: Events\7f785912
-Node: Event Types\7f787372
-Node: Event Contents\7f789295
-Node: Event Predicates\7f793771
-Node: Accessing Mouse Event Positions\7f795096
-Node: Frame-Level Event Position Info\7f795795
-Node: Window-Level Event Position Info\7f796835
-Node: Event Text Position Info\7f798599
-Node: Event Glyph Position Info\7f801091
-Node: Event Toolbar Position Info\7f802414
-Node: Other Event Position Info\7f803085
-Node: Accessing Other Event Info\7f803494
-Node: Working With Events\7f805114
-Node: Converting Events\7f811102
-Node: Reading Input\7f814054
-Node: Key Sequence Input\7f815056
-Node: Reading One Event\7f817010
-Node: Dispatching an Event\7f819827
-Node: Quoted Character Input\7f820278
-Node: Peeking and Discarding\7f821626
-Node: Waiting\7f825530
-Node: Quitting\7f827838
-Node: Prefix Command Arguments\7f832246
-Node: Recursive Editing\7f837333
-Node: Disabling Commands\7f842129
-Node: Command History\7f844197
-Node: Keyboard Macros\7f845934
-Node: Keymaps\7f848151
-Node: Keymap Terminology\7f849728
-Node: Format of Keymaps\7f852657
-Node: Creating Keymaps\7f853068
-Node: Inheritance and Keymaps\7f855147
-Node: Key Sequences\7f857519
-Node: Prefix Keys\7f862315
-Node: Active Keymaps\7f865900
-Node: Key Lookup\7f875221
-Node: Functions for Key Lookup\7f880384
-Node: Changing Key Bindings\7f886081
-Node: Key Binding Commands\7f892978
-Node: Scanning Keymaps\7f895043
-Node: Other Keymap Functions\7f903554
-Node: Menus\7f904176
-Node: Menu Format\7f904768
-Node: Menubar Format\7f913414
-Node: Menubar\7f914039
-Node: Modifying Menus\7f917152
-Node: Menu Filters\7f922166
-Node: Pop-Up Menus\7f924062
-Node: Menu Accelerators\7f926267
-Node: Creating Menu Accelerators\7f927023
-Node: Keyboard Menu Traversal\7f928383
-Node: Menu Accelerator Functions\7f929110
-Node: Buffers Menu\7f932187
-Node: Dialog Boxes\7f933481
-Node: Dialog Box Format\7f933648
-Node: Dialog Box Functions\7f935073
-Node: Toolbar\7f935470
-Node: Toolbar Intro\7f935791
-Node: Toolbar Descriptor Format\7f938200
-Node: Specifying the Toolbar\7f942694
-Node: Other Toolbar Variables\7f946299
-Node: Gutter\7f950725
-Node: Gutter Intro\7f951201
-Node: Gutter Descriptor Format\7f953198
-Node: Specifying a Gutter\7f957652
-Node: Other Gutter Variables\7f961185
-Node: Common Gutter Widgets\7f965570
-Node: Buffer Tabs\7f966562
-Node: Progress Bars\7f966703
-Node: Scrollbars\7f966848
-Node: Drag and Drop\7f966983
-Node: Supported Protocols\7f968059
-Node: OffiX DND\7f968562
-Node: CDE dt\7f969569
-Node: MSWindows OLE\7f970160
-Node: Loose ends\7f970331
-Node: Drop Interface\7f970723
-Node: Drag Interface\7f971745
-Node: Modes\7f971919
-Node: Major Modes\7f972870
-Node: Major Mode Conventions\7f975785
-Node: Example Major Modes\7f981740
-Node: Auto Major Mode\7f989773
-Node: Mode Help\7f997221
-Node: Derived Modes\7f998322
-Node: Minor Modes\7f1000513
-Node: Minor Mode Conventions\7f1001815
-Node: Keymaps and Minor Modes\7f1004678
-Node: Modeline Format\7f1005513
-Node: Modeline Data\7f1007281
-Node: Modeline Variables\7f1011551
-Node: %-Constructs\7f1016267
-Node: Hooks\7f1019178
-Node: Documentation\7f1025940
-Node: Documentation Basics\7f1027363
-Node: Accessing Documentation\7f1030413
-Node: Keys in Documentation\7f1036692
-Node: Describing Characters\7f1040171
-Node: Help Functions\7f1042520
-Node: Obsoleteness\7f1048971
-Node: Files\7f1051965
-Node: Visiting Files\7f1053890
-Node: Visiting Functions\7f1055395
-Node: Subroutines of Visiting\7f1060442
-Node: Saving Buffers\7f1062515
-Node: Reading from Files\7f1068608
-Node: Writing to Files\7f1070765
-Node: File Locks\7f1073482
-Node: Information about Files\7f1076535
-Node: Testing Accessibility\7f1077296
-Node: Kinds of Files\7f1081036
-Node: Truenames\7f1082717
-Node: File Attributes\7f1083719
-Node: Changing File Attributes\7f1088858
-Node: File Names\7f1094264
-Node: File Name Components\7f1095873
-Node: Directory Names\7f1098974
-Node: Relative File Names\7f1102427
-Node: File Name Expansion\7f1103505
-Node: Unique File Names\7f1107412
-Node: File Name Completion\7f1109027
-Node: User Name Completion\7f1111688
-Node: Contents of Directories\7f1113028
-Node: Create/Delete Dirs\7f1116341
-Node: Magic File Names\7f1117447
-Node: Partial Files\7f1123077
-Node: Intro to Partial Files\7f1123305
-Node: Creating a Partial File\7f1124545
-Node: Detached Partial Files\7f1125480
-Node: Format Conversion\7f1126602
-Node: Files and MS-DOS\7f1133118
-Node: Backups and Auto-Saving\7f1135182
-Node: Backup Files\7f1135857
-Node: Making Backups\7f1137254
-Node: Rename or Copy\7f1140003
-Node: Numbered Backups\7f1142496
-Node: Backup Names\7f1144731
-Node: Auto-Saving\7f1148023
-Node: Reverting\7f1156165
-Node: Buffers\7f1159323
-Node: Buffer Basics\7f1160740
-Node: Current Buffer\7f1162793
-Node: Buffer Names\7f1167481
-Node: Buffer File Name\7f1170686
-Node: Buffer Modification\7f1174805
-Node: Modification Time\7f1176998
-Node: Read Only Buffers\7f1180373
-Node: The Buffer List\7f1182791
-Node: Creating Buffers\7f1187621
-Node: Killing Buffers\7f1189767
-Node: Indirect Buffers\7f1193498
-Node: Windows\7f1196070
-Node: Basic Windows\7f1197548
-Node: Splitting Windows\7f1200646
-Node: Deleting Windows\7f1207535
-Node: Selecting Windows\7f1210215
-Node: Cyclic Window Ordering\7f1213344
-Node: Buffers and Windows\7f1217968
-Node: Displaying Buffers\7f1219809
-Node: Choosing Window\7f1224985
-Node: Window Point\7f1232701
-Node: Window Start\7f1234747
-Node: Vertical Scrolling\7f1239237
-Node: Horizontal Scrolling\7f1245374
-Node: Size of Window\7f1248883
-Node: Position of Window\7f1253601
-Node: Resizing Windows\7f1255841
-Node: Window Configurations\7f1261270
-Node: Frames\7f1264695
-Node: Creating Frames\7f1267036
-Node: Frame Properties\7f1268377
-Node: Property Access\7f1269193
-Node: Initial Properties\7f1270042
-Node: X Frame Properties\7f1272528
-Node: Size and Position\7f1277162
-Node: Frame Name\7f1279158
-Node: Frame Titles\7f1280072
-Node: Deleting Frames\7f1281896
-Node: Finding All Frames\7f1282496
-Node: Frames and Windows\7f1284490
-Node: Minibuffers and Frames\7f1286195
-Node: Input Focus\7f1287113
-Node: Visibility of Frames\7f1290190
-Node: Raising and Lowering\7f1292109
-Node: Frame Configurations\7f1294485
-Node: Frame Hooks\7f1295079
-Node: Consoles and Devices\7f1296884
-Node: Basic Console Functions\7f1299627
-Node: Basic Device Functions\7f1300050
-Node: Console Types and Device Classes\7f1300766
-Node: Connecting to a Console or Device\7f1302963
-Node: The Selected Console and Device\7f1305126
-Node: Console and Device I/O\7f1306152
-Node: Positions\7f1306916
-Node: Point\7f1307885
-Node: Motion\7f1310975
-Node: Character Motion\7f1311742
-Node: Word Motion\7f1313979
-Node: Buffer End Motion\7f1315480
-Node: Text Lines\7f1316977
-Node: Screen Lines\7f1321572
-Node: List Motion\7f1325635
-Node: Skipping Characters\7f1329043
-Node: Excursions\7f1331262
-Node: Narrowing\7f1334294
-Node: Markers\7f1339619
-Node: Overview of Markers\7f1340525
-Node: Predicates on Markers\7f1345217
-Node: Creating Markers\7f1346463
-Node: Information from Markers\7f1350500
-Node: Changing Markers\7f1351598
-Node: The Mark\7f1352976
-Node: The Region\7f1361470
-Node: Text\7f1367156
-Node: Near Point\7f1369855
-Node: Buffer Contents\7f1374042
-Node: Comparing Text\7f1375448
-Node: Insertion\7f1376856
-Node: Commands for Insertion\7f1380698
-Node: Deletion\7f1383654
-Node: User-Level Deletion\7f1387249
-Node: The Kill Ring\7f1391410
-Node: Kill Ring Concepts\7f1393584
-Node: Kill Functions\7f1394638
-Node: Yank Commands\7f1396543
-Node: Low-Level Kill Ring\7f1398414
-Node: Internals of Kill Ring\7f1401200
-Node: Undo\7f1403980
-Node: Maintaining Undo\7f1408309
-Node: Filling\7f1410929
-Node: Margins\7f1416923
-Node: Auto Filling\7f1420852
-Node: Sorting\7f1422033
-Node: Columns\7f1431333
-Node: Indentation\7f1433849
-Node: Primitive Indent\7f1434628
-Node: Mode-Specific Indent\7f1435872
-Node: Region Indent\7f1438383
-Node: Relative Indent\7f1441331
-Node: Indent Tabs\7f1443713
-Node: Motion by Indent\7f1445034
-Node: Case Changes\7f1445813
-Node: Text Properties\7f1449064
-Node: Examining Properties\7f1450877
-Node: Changing Properties\7f1452744
-Node: Property Search\7f1456335
-Node: Special Properties\7f1461046
-Node: Saving Properties\7f1461327
-Node: Substitution\7f1464469
-Node: Registers\7f1467739
-Node: Transposition\7f1470282
-Node: Change Hooks\7f1471176
-Node: Transformations\7f1473216
-Node: Searching and Matching\7f1477601
-Node: String Search\7f1478732
-Node: Regular Expressions\7f1483456
-Node: Syntax of Regexps\7f1484823
-Node: Regexp Example\7f1499202
-Node: Regexp Search\7f1501372
-Node: POSIX Regexps\7f1507460
-Node: Search and Replace\7f1509295
-Node: Match Data\7f1512660
-Node: Simple Match Data\7f1513790
-Node: Replacing Match\7f1518055
-Node: Entire Match Data\7f1520389
-Node: Saving Match Data\7f1522380
-Node: Searching and Case\7f1523761
-Node: Standard Regexps\7f1525795
-Node: Syntax Tables\7f1527993
-Node: Syntax Basics\7f1529107
-Node: Syntax Descriptors\7f1532079
-Node: Syntax Class Table\7f1533929
-Node: Syntax Flags\7f1539967
-Node: Syntax Table Functions\7f1543184
-Node: Motion and Syntax\7f1547048
-Node: Parsing Expressions\7f1548500
-Node: Standard Syntax Tables\7f1554569
-Node: Syntax Table Internals\7f1555413
-Node: Abbrevs\7f1556439
-Node: Abbrev Mode\7f1558242
-Node: Abbrev Tables\7f1558962
-Node: Defining Abbrevs\7f1560495
-Node: Abbrev Files\7f1562400
-Node: Abbrev Expansion\7f1564173
-Node: Standard Abbrev Tables\7f1568804
-Node: Extents\7f1569963
-Node: Intro to Extents\7f1571206
-Node: Creating and Modifying Extents\7f1575200
-Node: Extent Endpoints\7f1576707
-Node: Finding Extents\7f1579970
-Node: Mapping Over Extents\7f1583718
-Node: Extent Properties\7f1589835
-Node: Detached Extents\7f1599979
-Node: Extent Parents\7f1601838
-Node: Duplicable Extents\7f1603532
-Node: Extents and Events\7f1606753
-Node: Atomic Extents\7f1608660
-Node: Specifiers\7f1609107
-Node: Introduction to Specifiers\7f1611220
-Node: Specifiers In-Depth\7f1613530
-Node: Specifier Instancing\7f1618442
-Node: Specifier Types\7f1621704
-Node: Adding Specifications\7f1626778
-Node: Retrieving Specifications\7f1636140
-Node: Specifier Tag Functions\7f1639875
-Node: Specifier Instancing Functions\7f1643109
-Node: Specifier Example\7f1646516
-Node: Creating Specifiers\7f1649672
-Node: Specifier Validation Functions\7f1651921
-Node: Other Specification Functions\7f1654305
-Node: Faces and Window-System Objects\7f1658124
-Node: Faces\7f1658448
-Node: Merging Faces\7f1660065
-Node: Basic Face Functions\7f1662026
-Node: Face Properties\7f1664124
-Node: Face Convenience Functions\7f1674366
-Node: Other Face Display Functions\7f1677496
-Node: Fonts\7f1678309
-Node: Font Specifiers\7f1679010
-Node: Font Instances\7f1679251
-Node: Font Instance Names\7f1680218
-Node: Font Instance Size\7f1681059
-Node: Font Instance Characteristics\7f1682345
-Node: Font Convenience Functions\7f1683514
-Node: Colors\7f1684804
-Node: Color Specifiers\7f1685244
-Node: Color Instances\7f1685471
-Node: Color Instance Properties\7f1686215
-Node: Color Convenience Functions\7f1686841
-Node: Glyphs\7f1687894
-Node: Glyph Functions\7f1689486
-Node: Creating Glyphs\7f1689893
-Node: Glyph Properties\7f1691480
-Node: Glyph Convenience Functions\7f1700647
-Node: Glyph Dimensions\7f1704594
-Node: Images\7f1705674
-Node: Image Specifiers\7f1706123
-Node: Image Instantiator Conversion\7f1717472
-Node: Image Instances\7f1718837
-Node: Image Instance Types\7f1719588
-Node: Image Instance Functions\7f1722243
-Node: Glyph Types\7f1726812
-Node: Mouse Pointer\7f1728584
-Node: Redisplay Glyphs\7f1731587
-Node: Subwindows\7f1732620
-Node: Annotations\7f1732863
-Node: Annotation Basics\7f1733879
-Node: Annotation Primitives\7f1737817
-Node: Annotation Properties\7f1739146
-Node: Locating Annotations\7f1742186
-Node: Margin Primitives\7f1743023
-Node: Annotation Hooks\7f1744917
-Node: Display\7f1745577
-Node: Refresh Screen\7f1746555
-Node: Truncation\7f1748466
-Node: The Echo Area\7f1750991
-Node: Warnings\7f1757426
-Node: Invisible Text\7f1761862
-Node: Selective Display\7f1764441
-Node: Overlay Arrow\7f1768567
-Node: Temporary Displays\7f1769920
-Node: Blinking\7f1774041
-Node: Usual Display\7f1776226
-Node: Display Tables\7f1778775
-Node: Display Table Format\7f1779579
-Node: Active Display Table\7f1781021
-Node: Character Descriptors\7f1782213
-Node: Beeping\7f1782970
-Node: Hash Tables\7f1787736
-Node: Introduction to Hash Tables\7f1788344
-Node: Working With Hash Tables\7f1794367
-Node: Weak Hash Tables\7f1795484
-Node: Range Tables\7f1797283
-Node: Introduction to Range Tables\7f1797972
-Node: Working With Range Tables\7f1798403
-Node: Databases\7f1799288
-Node: Connecting to a Database\7f1799587
-Node: Working With a Database\7f1800678
-Node: Other Database Functions\7f1801536
-Node: Processes\7f1802110
-Node: Subprocess Creation\7f1804334
-Node: Synchronous Processes\7f1807623
-Node: MS-DOS Subprocesses\7f1814341
-Node: Asynchronous Processes\7f1815415
-Node: Deleting Processes\7f1819128
-Node: Process Information\7f1820999
-Node: Input to Processes\7f1824925
-Node: Signals to Processes\7f1827215
-Node: Output from Processes\7f1831635
-Node: Process Buffers\7f1832447
-Node: Filter Functions\7f1835314
-Node: Accepting Output\7f1840884
-Node: Sentinels\7f1842411
-Node: Process Window Size\7f1845901
-Node: Transaction Queues\7f1846250
-Node: Network\7f1847948
-Node: System Interface\7f1849782
-Node: Starting Up\7f1851052
-Node: Start-up Summary\7f1851646
-Node: Init File\7f1855200
-Node: Terminal-Specific\7f1857581
-Node: Command Line Arguments\7f1860740
-Node: Getting Out\7f1864229
-Node: Killing XEmacs\7f1864798
-Node: Suspending XEmacs\7f1866467
-Node: System Environment\7f1869809
-Node: User Identification\7f1876476
-Node: Time of Day\7f1880005
-Node: Time Conversion\7f1882792
-Node: Timers\7f1887832
-Node: Terminal Input\7f1890005
-Node: Input Modes\7f1890508
-Node: Translating Input\7f1892921
-Node: Recording Input\7f1897086
-Node: Terminal Output\7f1899186
-Node: Flow Control\7f1902809
-Node: Batch Mode\7f1906601
-Node: X-Windows\7f1907983
-Node: X Selections\7f1908854
-Node: X Server\7f1911064
-Node: Resources\7f1911515
-Node: Server Data\7f1916824
-Node: Grabs\7f1918031
-Node: X Miscellaneous\7f1919611
-Node: ToolTalk Support\7f1921996
-Node: XEmacs ToolTalk API Summary\7f1922213
-Node: Sending Messages\7f1923513
-Node: Example of Sending Messages\7f1923764
-Node: Elisp Interface for Sending Messages\7f1924826
-Node: Receiving Messages\7f1931218
-Node: Example of Receiving Messages\7f1931441
-Node: Elisp Interface for Receiving Messages\7f1932277
-Node: LDAP Support\7f1936102
-Node: Building XEmacs with LDAP support\7f1936596
-Node: XEmacs LDAP API\7f1937573
-Node: LDAP Variables\7f1938625
-Node: The High-Level LDAP API\7f1941225
-Node: The Low-Level LDAP API\7f1944688
-Node: The LDAP Lisp Object\7f1945519
-Node: Opening and Closing a LDAP Connection\7f1946072
-Node: Low-level Operations on a LDAP Server\7f1947872
-Node: LDAP Internationalization\7f1950566
-Node: LDAP Internationalization Variables\7f1951471
-Node: Encoder/Decoder Functions\7f1953200
-Node: Syntax of Search Filters\7f1954239
-Node: PostgreSQL Support\7f1955537
-Node: Building XEmacs with PostgreSQL support\7f1955932
-Node: XEmacs PostgreSQL libpq API\7f1957199
-Node: libpq Lisp Variables\7f1959074
-Node: libpq Lisp Symbols and DataTypes\7f1962038
-Node: Synchronous Interface Functions\7f1975278
-Node: Asynchronous Interface Functions\7f1979769
-Node: Large Object Support\7f1983270
-Node: Other libpq Functions\7f1983897
-Node: Unimplemented libpq Functions\7f1986932
-Node: XEmacs PostgreSQL libpq Examples\7f1992251
-Node: Internationalization\7f1998342
-Node: I18N Levels 1 and 2\7f1998685
-Node: I18N Level 3\7f1999391
-Node: Level 3 Basics\7f1999672
-Node: Level 3 Primitives\7f2000505
-Node: Dynamic Messaging\7f2002111
-Node: Domain Specification\7f2002574
-Node: Documentation String Extraction\7f2004477
-Node: I18N Level 4\7f2005395
-Node: MULE\7f2005587
-Node: Internationalization Terminology\7f2006636
-Node: Charsets\7f2018835
-Node: Charset Properties\7f2019531
-Node: Basic Charset Functions\7f2024246
-Node: Charset Property Functions\7f2026427
-Node: Predefined Charsets\7f2028469
-Node: MULE Characters\7f2031389
-Node: Composite Characters\7f2032236
-Node: Coding Systems\7f2033496
-Node: Coding System Types\7f2035636
-Node: ISO 2022\7f2039620
-Node: EOL Conversion\7f2051897
-Node: Coding System Properties\7f2053069
-Node: Basic Coding System Functions\7f2057386
-Node: Coding System Property Functions\7f2059420
-Node: Encoding and Decoding Text\7f2059978
-Node: Detection of Textual Encoding\7f2061114
-Node: Big5 and Shift-JIS Functions\7f2062650
-Node: Predefined Coding Systems\7f2063776
-Node: CCL\7f2075870
-Node: CCL Syntax\7f2078974
-Node: CCL Statements\7f2080550
-Node: CCL Expressions\7f2085198
-Node: Calling CCL\7f2087737
-Node: CCL Examples\7f2090726
-Node: Category Tables\7f2090863
-Node: Tips\7f2093221
-Node: Style Tips\7f2093862
-Node: Compilation Tips\7f2103381
-Node: Documentation Tips\7f2105295
-Node: Comment Tips\7f2110804
-Node: Library Headers\7f2113806
-Node: Building XEmacs and Object Allocation\7f2117778
-Node: Building XEmacs\7f2118661
-Node: Pure Storage\7f2124996
-Node: Garbage Collection\7f2127784
-Node: Standard Errors\7f2138923
-Node: Standard Buffer-Local Variables\7f2143132
-Node: Standard Keymaps\7f2145765
-Node: Standard Hooks\7f2149497
-Node: Index\7f2156997
+Node: Docs and Compilation\7f563240
+Node: Dynamic Loading\7f565893
+Node: Eval During Compile\7f568257
+Node: Compiled-Function Objects\7f569522
+Node: Disassembly\7f574320
+Node: Debugging\7f581574
+Node: Debugger\7f582986
+Node: Error Debugging\7f584131
+Node: Infinite Loops\7f586884
+Node: Function Debugging\7f588128
+Node: Explicit Debug\7f590918
+Node: Using Debugger\7f591689
+Node: Debugger Commands\7f593551
+Node: Invoking the Debugger\7f597868
+Node: Internals of Debugger\7f601783
+Node: Syntax Errors\7f606670
+Node: Excess Open\7f607918
+Node: Excess Close\7f609793
+Node: Compilation Errors\7f611214
+Node: Edebug\7f612502
+Node: Using Edebug\7f614610
+Node: Instrumenting\7f617307
+Node: Edebug Execution Modes\7f620796
+Node: Jumping\7f623906
+Node: Edebug Misc\7f626249
+Node: Breakpoints\7f627638
+Node: Global Break Condition\7f630444
+Node: Embedded Breakpoints\7f631399
+Node: Trapping Errors\7f632354
+Node: Edebug Views\7f634430
+Node: Edebug Eval\7f636395
+Node: Eval List\7f637572
+Node: Reading in Edebug\7f640957
+Node: Printing in Edebug\7f641756
+Node: Tracing\7f643471
+Node: Coverage Testing\7f645357
+Node: The Outside Context\7f647398
+Node: Checking Whether to Stop\7f648347
+Node: Edebug Display Update\7f648994
+Node: Edebug Recursive Edit\7f651017
+Node: Instrumenting Macro Calls\7f652672
+Node: Specification List\7f655154
+Node: Backtracking\7f664565
+Node: Debugging Backquote\7f666503
+Node: Specification Examples\7f670209
+Node: Edebug Options\7f672276
+Node: Read and Print\7f677613
+Node: Streams Intro\7f678590
+Node: Input Streams\7f680608
+Node: Input Functions\7f685509
+Node: Output Streams\7f687569
+Node: Output Functions\7f691620
+Node: Output Variables\7f695920
+Node: Minibuffers\7f700719
+Node: Intro to Minibuffers\7f701871
+Node: Text from Minibuffer\7f704059
+Node: Object from Minibuffer\7f709145
+Node: Minibuffer History\7f713240
+Node: Completion\7f716219
+Node: Basic Completion\7f718194
+Node: Minibuffer Completion\7f723223
+Node: Completion Commands\7f726800
+Node: High-Level Completion\7f731457
+Node: Reading File Names\7f736199
+Node: Programmed Completion\7f739891
+Node: Yes-or-No Queries\7f742273
+Node: Multiple Queries\7f748010
+Node: Reading a Password\7f752077
+Node: Minibuffer Misc\7f753414
+Node: Command Loop\7f758284
+Node: Command Overview\7f759628
+Node: Defining Commands\7f762906
+Node: Using Interactive\7f763654
+Node: Interactive Codes\7f768427
+Node: Interactive Examples\7f774219
+Node: Interactive Call\7f775533
+Node: Command Loop Info\7f780934
+Node: Events\7f785913
+Node: Event Types\7f787373
+Node: Event Contents\7f789296
+Node: Event Predicates\7f793772
+Node: Accessing Mouse Event Positions\7f795097
+Node: Frame-Level Event Position Info\7f795796
+Node: Window-Level Event Position Info\7f796836
+Node: Event Text Position Info\7f798600
+Node: Event Glyph Position Info\7f801092
+Node: Event Toolbar Position Info\7f802415
+Node: Other Event Position Info\7f803086
+Node: Accessing Other Event Info\7f803495
+Node: Working With Events\7f805115
+Node: Converting Events\7f811103
+Node: Reading Input\7f814055
+Node: Key Sequence Input\7f815057
+Node: Reading One Event\7f817011
+Node: Dispatching an Event\7f819828
+Node: Quoted Character Input\7f820279
+Node: Peeking and Discarding\7f821627
+Node: Waiting\7f825531
+Node: Quitting\7f827839
+Node: Prefix Command Arguments\7f832247
+Node: Recursive Editing\7f837334
+Node: Disabling Commands\7f842130
+Node: Command History\7f844198
+Node: Keyboard Macros\7f845935
+Node: Keymaps\7f848152
+Node: Keymap Terminology\7f849729
+Node: Format of Keymaps\7f852658
+Node: Creating Keymaps\7f853069
+Node: Inheritance and Keymaps\7f855148
+Node: Key Sequences\7f857520
+Node: Prefix Keys\7f862316
+Node: Active Keymaps\7f865901
+Node: Key Lookup\7f875222
+Node: Functions for Key Lookup\7f880385
+Node: Changing Key Bindings\7f886082
+Node: Key Binding Commands\7f892979
+Node: Scanning Keymaps\7f895044
+Node: Other Keymap Functions\7f903555
+Node: Menus\7f904177
+Node: Menu Format\7f904769
+Node: Menubar Format\7f913415
+Node: Menubar\7f914040
+Node: Modifying Menus\7f917153
+Node: Menu Filters\7f922167
+Node: Pop-Up Menus\7f924063
+Node: Menu Accelerators\7f926268
+Node: Creating Menu Accelerators\7f927024
+Node: Keyboard Menu Traversal\7f928384
+Node: Menu Accelerator Functions\7f929111
+Node: Buffers Menu\7f932188
+Node: Dialog Boxes\7f933482
+Node: Dialog Box Format\7f933649
+Node: Dialog Box Functions\7f935074
+Node: Toolbar\7f935471
+Node: Toolbar Intro\7f935906
+Node: Creating Toolbar\7f938306
+Node: Toolbar Descriptor Format\7f939223
+Node: Specifying the Toolbar\7f943720
+Node: Other Toolbar Variables\7f947325
+Node: Gutter\7f951751
+Node: Gutter Intro\7f952340
+Node: Creating Gutter\7f954343
+Node: Gutter Descriptor Format\7f957225
+Node: Specifying a Gutter\7f961682
+Node: Other Gutter Variables\7f965215
+Node: Common Gutter Widgets\7f969600
+Node: Buffer Tabs\7f970592
+Node: Progress Bars\7f970733
+Node: Scrollbars\7f970878
+Node: Drag and Drop\7f971013
+Node: Supported Protocols\7f972089
+Node: OffiX DND\7f972592
+Node: CDE dt\7f973599
+Node: MSWindows OLE\7f974190
+Node: Loose ends\7f974361
+Node: Drop Interface\7f974753
+Node: Drag Interface\7f975775
+Node: Modes\7f975949
+Node: Major Modes\7f976900
+Node: Major Mode Conventions\7f979815
+Node: Example Major Modes\7f985770
+Node: Auto Major Mode\7f993803
+Node: Mode Help\7f1001251
+Node: Derived Modes\7f1002352
+Node: Minor Modes\7f1004543
+Node: Minor Mode Conventions\7f1005845
+Node: Keymaps and Minor Modes\7f1008708
+Node: Modeline Format\7f1009543
+Node: Modeline Data\7f1011311
+Node: Modeline Variables\7f1016464
+Node: %-Constructs\7f1021180
+Node: Hooks\7f1024167
+Node: Documentation\7f1030929
+Node: Documentation Basics\7f1032352
+Node: Accessing Documentation\7f1035402
+Node: Keys in Documentation\7f1041681
+Node: Describing Characters\7f1045160
+Node: Help Functions\7f1047509
+Node: Obsoleteness\7f1053960
+Node: Files\7f1056954
+Node: Visiting Files\7f1058879
+Node: Visiting Functions\7f1060384
+Node: Subroutines of Visiting\7f1065431
+Node: Saving Buffers\7f1067504
+Node: Reading from Files\7f1073597
+Node: Writing to Files\7f1075754
+Node: File Locks\7f1078471
+Node: Information about Files\7f1081524
+Node: Testing Accessibility\7f1082285
+Node: Kinds of Files\7f1086025
+Node: Truenames\7f1087706
+Node: File Attributes\7f1088708
+Node: Changing File Attributes\7f1093847
+Node: File Names\7f1099253
+Node: File Name Components\7f1100862
+Node: Directory Names\7f1103963
+Node: Relative File Names\7f1107416
+Node: File Name Expansion\7f1108494
+Node: Unique File Names\7f1112401
+Node: File Name Completion\7f1114016
+Node: User Name Completion\7f1116677
+Node: Contents of Directories\7f1118017
+Node: Create/Delete Dirs\7f1121330
+Node: Magic File Names\7f1122436
+Node: Partial Files\7f1128066
+Node: Intro to Partial Files\7f1128294
+Node: Creating a Partial File\7f1129534
+Node: Detached Partial Files\7f1130469
+Node: Format Conversion\7f1131591
+Node: Files and MS-DOS\7f1138107
+Node: Backups and Auto-Saving\7f1140171
+Node: Backup Files\7f1140846
+Node: Making Backups\7f1142243
+Node: Rename or Copy\7f1144992
+Node: Numbered Backups\7f1147485
+Node: Backup Names\7f1149720
+Node: Auto-Saving\7f1153012
+Node: Reverting\7f1161154
+Node: Buffers\7f1164312
+Node: Buffer Basics\7f1165729
+Node: Current Buffer\7f1167782
+Node: Buffer Names\7f1172470
+Node: Buffer File Name\7f1175675
+Node: Buffer Modification\7f1179794
+Node: Modification Time\7f1181987
+Node: Read Only Buffers\7f1185362
+Node: The Buffer List\7f1187780
+Node: Creating Buffers\7f1192610
+Node: Killing Buffers\7f1194756
+Node: Indirect Buffers\7f1198487
+Node: Windows\7f1201059
+Node: Basic Windows\7f1202537
+Node: Splitting Windows\7f1205635
+Node: Deleting Windows\7f1212524
+Node: Selecting Windows\7f1215204
+Node: Cyclic Window Ordering\7f1218333
+Node: Buffers and Windows\7f1222957
+Node: Displaying Buffers\7f1224798
+Node: Choosing Window\7f1229974
+Node: Window Point\7f1237690
+Node: Window Start\7f1239736
+Node: Vertical Scrolling\7f1244226
+Node: Horizontal Scrolling\7f1250363
+Node: Size of Window\7f1253872
+Node: Position of Window\7f1258590
+Node: Resizing Windows\7f1260830
+Node: Window Configurations\7f1266259
+Node: Frames\7f1269684
+Node: Creating Frames\7f1272025
+Node: Frame Properties\7f1273366
+Node: Property Access\7f1274182
+Node: Initial Properties\7f1275031
+Node: X Frame Properties\7f1277517
+Node: Size and Position\7f1282151
+Node: Frame Name\7f1284147
+Node: Frame Titles\7f1285061
+Node: Deleting Frames\7f1286885
+Node: Finding All Frames\7f1287485
+Node: Frames and Windows\7f1289479
+Node: Minibuffers and Frames\7f1291184
+Node: Input Focus\7f1292102
+Node: Visibility of Frames\7f1295179
+Node: Raising and Lowering\7f1297098
+Node: Frame Configurations\7f1299474
+Node: Frame Hooks\7f1300068
+Node: Consoles and Devices\7f1301873
+Node: Basic Console Functions\7f1304616
+Node: Basic Device Functions\7f1305039
+Node: Console Types and Device Classes\7f1305755
+Node: Connecting to a Console or Device\7f1307952
+Node: The Selected Console and Device\7f1310115
+Node: Console and Device I/O\7f1311141
+Node: Positions\7f1311905
+Node: Point\7f1312874
+Node: Motion\7f1315964
+Node: Character Motion\7f1316731
+Node: Word Motion\7f1318968
+Node: Buffer End Motion\7f1320469
+Node: Text Lines\7f1321966
+Node: Screen Lines\7f1326561
+Node: List Motion\7f1330624
+Node: Skipping Characters\7f1334032
+Node: Excursions\7f1336251
+Node: Narrowing\7f1339283
+Node: Markers\7f1344608
+Node: Overview of Markers\7f1345514
+Node: Predicates on Markers\7f1350206
+Node: Creating Markers\7f1351452
+Node: Information from Markers\7f1355489
+Node: Changing Markers\7f1356587
+Node: The Mark\7f1357965
+Node: The Region\7f1366459
+Node: Text\7f1372145
+Node: Near Point\7f1374844
+Node: Buffer Contents\7f1379031
+Node: Comparing Text\7f1380437
+Node: Insertion\7f1381845
+Node: Commands for Insertion\7f1385687
+Node: Deletion\7f1388643
+Node: User-Level Deletion\7f1392238
+Node: The Kill Ring\7f1396399
+Node: Kill Ring Concepts\7f1398573
+Node: Kill Functions\7f1399627
+Node: Yank Commands\7f1401532
+Node: Low-Level Kill Ring\7f1403403
+Node: Internals of Kill Ring\7f1406189
+Node: Undo\7f1408969
+Node: Maintaining Undo\7f1413298
+Node: Filling\7f1415918
+Node: Margins\7f1421912
+Node: Auto Filling\7f1425841
+Node: Sorting\7f1427022
+Node: Columns\7f1436322
+Node: Indentation\7f1438838
+Node: Primitive Indent\7f1439617
+Node: Mode-Specific Indent\7f1440861
+Node: Region Indent\7f1443372
+Node: Relative Indent\7f1446320
+Node: Indent Tabs\7f1448702
+Node: Motion by Indent\7f1450023
+Node: Case Changes\7f1450802
+Node: Text Properties\7f1454053
+Node: Examining Properties\7f1455866
+Node: Changing Properties\7f1457733
+Node: Property Search\7f1461324
+Node: Special Properties\7f1466035
+Node: Saving Properties\7f1466316
+Node: Substitution\7f1469458
+Node: Registers\7f1472728
+Node: Transposition\7f1475271
+Node: Change Hooks\7f1476165
+Node: Transformations\7f1478205
+Node: Searching and Matching\7f1482590
+Node: String Search\7f1483721
+Node: Regular Expressions\7f1488445
+Node: Syntax of Regexps\7f1489812
+Node: Regexp Example\7f1504191
+Node: Regexp Search\7f1506361
+Node: POSIX Regexps\7f1512449
+Node: Search and Replace\7f1514284
+Node: Match Data\7f1517649
+Node: Simple Match Data\7f1518779
+Node: Replacing Match\7f1523044
+Node: Entire Match Data\7f1525378
+Node: Saving Match Data\7f1527369
+Node: Searching and Case\7f1528750
+Node: Standard Regexps\7f1530784
+Node: Syntax Tables\7f1532982
+Node: Syntax Basics\7f1534096
+Node: Syntax Descriptors\7f1537068
+Node: Syntax Class Table\7f1538918
+Node: Syntax Flags\7f1544956
+Node: Syntax Table Functions\7f1548173
+Node: Motion and Syntax\7f1552037
+Node: Parsing Expressions\7f1553489
+Node: Standard Syntax Tables\7f1559558
+Node: Syntax Table Internals\7f1560402
+Node: Abbrevs\7f1561428
+Node: Abbrev Mode\7f1563231
+Node: Abbrev Tables\7f1563951
+Node: Defining Abbrevs\7f1565484
+Node: Abbrev Files\7f1567389
+Node: Abbrev Expansion\7f1569162
+Node: Standard Abbrev Tables\7f1573793
+Node: Extents\7f1574952
+Node: Intro to Extents\7f1576195
+Node: Creating and Modifying Extents\7f1580187
+Node: Extent Endpoints\7f1581694
+Node: Finding Extents\7f1584957
+Node: Mapping Over Extents\7f1588705
+Node: Extent Properties\7f1594822
+Node: Detached Extents\7f1604966
+Node: Extent Parents\7f1606825
+Node: Duplicable Extents\7f1608519
+Node: Extents and Events\7f1611740
+Node: Atomic Extents\7f1613647
+Node: Specifiers\7f1614094
+Node: Introduction to Specifiers\7f1616207
+Node: Specifiers In-Depth\7f1618517
+Node: Specifier Instancing\7f1623429
+Node: Specifier Types\7f1626691
+Node: Adding Specifications\7f1631765
+Node: Retrieving Specifications\7f1641127
+Node: Specifier Tag Functions\7f1644862
+Node: Specifier Instancing Functions\7f1648096
+Node: Specifier Example\7f1651503
+Node: Creating Specifiers\7f1654659
+Node: Specifier Validation Functions\7f1658976
+Node: Other Specification Functions\7f1661360
+Node: Faces and Window-System Objects\7f1665179
+Node: Faces\7f1665503
+Node: Merging Faces\7f1667120
+Node: Basic Face Functions\7f1669081
+Node: Face Properties\7f1671179
+Node: Face Convenience Functions\7f1681421
+Node: Other Face Display Functions\7f1684551
+Node: Fonts\7f1685364
+Node: Font Specifiers\7f1686065
+Node: Font Instances\7f1687250
+Node: Font Instance Names\7f1688217
+Node: Font Instance Size\7f1689058
+Node: Font Instance Characteristics\7f1690344
+Node: Font Convenience Functions\7f1691513
+Node: Colors\7f1692803
+Node: Color Specifiers\7f1693243
+Node: Color Instances\7f1695601
+Node: Color Instance Properties\7f1696345
+Node: Color Convenience Functions\7f1696971
+Node: Glyphs\7f1698024
+Node: Glyph Functions\7f1699625
+Node: Creating Glyphs\7f1700032
+Node: Glyph Properties\7f1712671
+Node: Glyph Convenience Functions\7f1721838
+Node: Glyph Dimensions\7f1725785
+Node: Images\7f1726865
+Node: Image Specifiers\7f1727314
+Node: Image Instantiator Conversion\7f1742660
+Node: Image Instances\7f1744025
+Node: Image Instance Types\7f1744776
+Node: Image Instance Functions\7f1747539
+Node: Glyph Types\7f1754590
+Node: Mouse Pointer\7f1756362
+Node: Redisplay Glyphs\7f1759365
+Node: Subwindows\7f1760398
+Node: Annotations\7f1760641
+Node: Annotation Basics\7f1761657
+Node: Annotation Primitives\7f1765595
+Node: Annotation Properties\7f1766924
+Node: Locating Annotations\7f1769964
+Node: Margin Primitives\7f1770801
+Node: Annotation Hooks\7f1772695
+Node: Display\7f1773355
+Node: Refresh Screen\7f1774333
+Node: Truncation\7f1776244
+Node: The Echo Area\7f1778769
+Node: Warnings\7f1785204
+Node: Invisible Text\7f1789640
+Node: Selective Display\7f1792219
+Node: Overlay Arrow\7f1796345
+Node: Temporary Displays\7f1797698
+Node: Blinking\7f1801819
+Node: Usual Display\7f1804004
+Node: Display Tables\7f1806553
+Node: Display Table Format\7f1807357
+Node: Active Display Table\7f1808799
+Node: Character Descriptors\7f1812794
+Node: Beeping\7f1813551
+Node: Hash Tables\7f1818317
+Node: Introduction to Hash Tables\7f1818925
+Node: Working With Hash Tables\7f1824948
+Node: Weak Hash Tables\7f1826065
+Node: Range Tables\7f1827864
+Node: Introduction to Range Tables\7f1828553
+Node: Working With Range Tables\7f1828984
+Node: Databases\7f1829869
+Node: Connecting to a Database\7f1830168
+Node: Working With a Database\7f1831259
+Node: Other Database Functions\7f1832117
+Node: Processes\7f1832691
+Node: Subprocess Creation\7f1834915
+Node: Synchronous Processes\7f1838204
+Node: MS-DOS Subprocesses\7f1844922
+Node: Asynchronous Processes\7f1845996
+Node: Deleting Processes\7f1849709
+Node: Process Information\7f1851580
+Node: Input to Processes\7f1855506
+Node: Signals to Processes\7f1857796
+Node: Output from Processes\7f1862216
+Node: Process Buffers\7f1863028
+Node: Filter Functions\7f1865895
+Node: Accepting Output\7f1871465
+Node: Sentinels\7f1872992
+Node: Process Window Size\7f1876482
+Node: Transaction Queues\7f1876831
+Node: Network\7f1878529
+Node: System Interface\7f1880363
+Node: Starting Up\7f1881633
+Node: Start-up Summary\7f1882227
+Node: Init File\7f1885781
+Node: Terminal-Specific\7f1888162
+Node: Command Line Arguments\7f1891321
+Node: Getting Out\7f1894810
+Node: Killing XEmacs\7f1895379
+Node: Suspending XEmacs\7f1897048
+Node: System Environment\7f1900390
+Node: User Identification\7f1907057
+Node: Time of Day\7f1910586
+Node: Time Conversion\7f1913373
+Node: Timers\7f1918413
+Node: Terminal Input\7f1920586
+Node: Input Modes\7f1921089
+Node: Translating Input\7f1923502
+Node: Recording Input\7f1927667
+Node: Terminal Output\7f1929767
+Node: Flow Control\7f1933390
+Node: Batch Mode\7f1937182
+Node: X-Windows\7f1938564
+Node: X Selections\7f1939435
+Node: X Server\7f1941645
+Node: Resources\7f1942096
+Node: Server Data\7f1947405
+Node: Grabs\7f1948612
+Node: X Miscellaneous\7f1950192
+Node: ToolTalk Support\7f1952577
+Node: XEmacs ToolTalk API Summary\7f1952794
+Node: Sending Messages\7f1954094
+Node: Example of Sending Messages\7f1954345
+Node: Elisp Interface for Sending Messages\7f1955407
+Node: Receiving Messages\7f1961799
+Node: Example of Receiving Messages\7f1962022
+Node: Elisp Interface for Receiving Messages\7f1962858
+Node: LDAP Support\7f1966683
+Node: Building XEmacs with LDAP support\7f1967177
+Node: XEmacs LDAP API\7f1968154
+Node: LDAP Variables\7f1969206
+Node: The High-Level LDAP API\7f1971806
+Node: The Low-Level LDAP API\7f1975269
+Node: The LDAP Lisp Object\7f1976100
+Node: Opening and Closing a LDAP Connection\7f1976653
+Node: Low-level Operations on a LDAP Server\7f1978453
+Node: LDAP Internationalization\7f1981147
+Node: LDAP Internationalization Variables\7f1982052
+Node: Encoder/Decoder Functions\7f1983781
+Node: Syntax of Search Filters\7f1984820
+Node: PostgreSQL Support\7f1986118
+Node: Building XEmacs with PostgreSQL support\7f1986513
+Node: XEmacs PostgreSQL libpq API\7f1987780
+Node: libpq Lisp Variables\7f1989655
+Node: libpq Lisp Symbols and DataTypes\7f1992619
+Node: Synchronous Interface Functions\7f2005859
+Node: Asynchronous Interface Functions\7f2010350
+Node: Large Object Support\7f2013851
+Node: Other libpq Functions\7f2014478
+Node: Unimplemented libpq Functions\7f2017513
+Node: XEmacs PostgreSQL libpq Examples\7f2022832
+Node: Internationalization\7f2028923
+Node: I18N Levels 1 and 2\7f2029266
+Node: I18N Level 3\7f2029972
+Node: Level 3 Basics\7f2030253
+Node: Level 3 Primitives\7f2031086
+Node: Dynamic Messaging\7f2032692
+Node: Domain Specification\7f2033155
+Node: Documentation String Extraction\7f2035058
+Node: I18N Level 4\7f2035976
+Node: MULE\7f2036168
+Node: Internationalization Terminology\7f2037217
+Node: Charsets\7f2049416
+Node: Charset Properties\7f2050112
+Node: Basic Charset Functions\7f2054827
+Node: Charset Property Functions\7f2057008
+Node: Predefined Charsets\7f2059050
+Node: MULE Characters\7f2061970
+Node: Composite Characters\7f2062817
+Node: Coding Systems\7f2064077
+Node: Coding System Types\7f2066217
+Node: ISO 2022\7f2070201
+Node: EOL Conversion\7f2082478
+Node: Coding System Properties\7f2083650
+Node: Basic Coding System Functions\7f2087967
+Node: Coding System Property Functions\7f2090001
+Node: Encoding and Decoding Text\7f2090559
+Node: Detection of Textual Encoding\7f2091695
+Node: Big5 and Shift-JIS Functions\7f2093231
+Node: Predefined Coding Systems\7f2094357
+Node: CCL\7f2106451
+Node: CCL Syntax\7f2109555
+Node: CCL Statements\7f2111131
+Node: CCL Expressions\7f2115779
+Node: Calling CCL\7f2118318
+Node: CCL Examples\7f2121307
+Node: Category Tables\7f2121444
+Node: Tips\7f2123802
+Node: Style Tips\7f2124443
+Node: Compilation Tips\7f2133962
+Node: Documentation Tips\7f2135876
+Node: Comment Tips\7f2141385
+Node: Library Headers\7f2144387
+Node: Building XEmacs and Object Allocation\7f2148359
+Node: Building XEmacs\7f2149242
+Node: Pure Storage\7f2155577
+Node: Garbage Collection\7f2158365
+Node: Standard Errors\7f2169504
+Node: Standard Buffer-Local Variables\7f2173713
+Node: Standard Keymaps\7f2176346
+Node: Standard Hooks\7f2180078
+Node: Index\7f2187578
 \1f
 End Tag Table
index 2aaa9bd..e7754f9 100644 (file)
@@ -33,26 +33,26 @@ translation approved by the author instead of in the original English.
 Indirect:
 xemacs.info-1: 1350
 xemacs.info-2: 48915
-xemacs.info-3: 96893
-xemacs.info-4: 145419
-xemacs.info-5: 193446
-xemacs.info-6: 243306
-xemacs.info-7: 290410
-xemacs.info-8: 339182
-xemacs.info-9: 388710
-xemacs.info-10: 438339
-xemacs.info-11: 485732
-xemacs.info-12: 535325
-xemacs.info-13: 582878
-xemacs.info-14: 632686
-xemacs.info-15: 677477
-xemacs.info-16: 727101
-xemacs.info-17: 775368
-xemacs.info-18: 825010
-xemacs.info-19: 849389
-xemacs.info-20: 881042
-xemacs.info-21: 930187
-xemacs.info-22: 972577
+xemacs.info-3: 98487
+xemacs.info-4: 147631
+xemacs.info-5: 197228
+xemacs.info-6: 246668
+xemacs.info-7: 296605
+xemacs.info-8: 343420
+xemacs.info-9: 392044
+xemacs.info-10: 441144
+xemacs.info-11: 489787
+xemacs.info-12: 539726
+xemacs.info-13: 581524
+xemacs.info-14: 631267
+xemacs.info-15: 680901
+xemacs.info-16: 730886
+xemacs.info-17: 780057
+xemacs.info-18: 826008
+xemacs.info-19: 856894
+xemacs.info-20: 888547
+xemacs.info-21: 937894
+xemacs.info-22: 980480
 \1f
 Tag Table:
 (Indirect)
@@ -84,333 +84,338 @@ Node: Tools Menu\7f90468
 Node: Help Menu\7f90959
 Node: Menu Customization\7f91360
 Node: Entering Emacs\7f95590
-Node: Exiting\7f96893
-Node: Command Switches\7f99984
-Node: Startup Paths\7f109171
-Node: Basic\7f116751
-Node: Blank Lines\7f126229
-Node: Continuation Lines\7f127655
-Node: Position Info\7f129087
-Node: Arguments\7f132220
-Node: Undo\7f135357
-Node: Minibuffer\7f138304
-Node: Minibuffer File\7f140914
-Node: Minibuffer Edit\7f142719
-Node: Completion\7f145419
-Node: Completion Example\7f147350
-Node: Completion Commands\7f148444
-Node: Strict Completion\7f151100
-Node: Completion Options\7f152881
-Node: Minibuffer History\7f154175
-Node: Repetition\7f157359
-Node: M-x\7f160192
-Node: Help\7f165286
-Node: Help Summary\7f166696
-Node: Key Help\7f169482
-Node: Name Help\7f170441
-Node: Apropos\7f173086
-Node: Library Keywords\7f176205
-Node: Help Mode\7f178526
-Node: Misc Help\7f179023
-Node: Mark\7f182172
-Node: Setting Mark\7f184026
-Node: Using Region\7f187148
-Node: Marking Objects\7f187885
-Node: Mark Ring\7f189723
-Node: Mouse Selection\7f191439
-Node: Additional Mouse Operations\7f193446
-Node: Killing\7f197650
-Node: Yanking\7f203286
-Node: Kill Ring\7f204089
-Node: Appending Kills\7f205691
-Node: Earlier Kills\7f207728
-Node: Using X Selections\7f210341
-Node: X Clipboard Selection\7f211591
-Node: X Selection Commands\7f213768
-Node: X Cut Buffers\7f214854
-Node: Active Regions\7f216213
-Node: Accumulating Text\7f220793
-Node: Rectangles\7f223866
-Node: Registers\7f227385
-Node: RegPos\7f228839
-Node: RegText\7f229995
-Node: RegRect\7f231101
-Node: RegConfig\7f231980
-Node: RegNumbers\7f232920
-Node: RegFiles\7f233638
-Node: Bookmarks\7f234296
-Node: Display\7f237668
-Node: Scrolling\7f239163
-Node: Horizontal Scrolling\7f243306
-Node: Selective Display\7f244501
-Node: Display Vars\7f245720
-Node: Search\7f248398
-Node: Incremental Search\7f249591
-Node: Non-Incremental Search\7f258518
-Node: Word Search\7f259960
-Node: Regexp Search\7f261578
-Node: Regexps\7f263114
-Node: Search Case\7f273415
-Node: Replace\7f274196
-Node: Unconditional Replace\7f275144
-Node: Regexp Replace\7f276279
-Node: Replacement and Case\7f277214
-Node: Query Replace\7f278194
-Node: Other Repeating Search\7f281421
-Node: Fixit\7f282676
-Node: Kill Errors\7f283256
-Node: Transpose\7f284589
-Node: Fixing Case\7f286993
-Node: Spelling\7f287639
-Node: Files\7f289100
-Node: File Names\7f290410
-Node: Visiting\7f294747
-Node: Saving\7f301433
-Node: Backup\7f306356
-Node: Backup Names\7f307752
-Node: Backup Deletion\7f309235
-Node: Backup Copying\7f310385
-Node: Interlocking\7f312091
-Node: Reverting\7f316219
-Node: Auto Save\7f318131
-Node: Auto Save Files\7f319098
-Node: Auto Save Control\7f320939
-Node: Recover\7f322777
-Node: Version Control\7f323932
-Node: Concepts of VC\7f325970
-Node: Editing with VC\7f327580
-Node: Variables for Check-in/out\7f332836
-Node: Log Entries\7f334735
-Node: Change Logs and VC\7f335915
-Node: Old Versions\7f339182
-Node: VC Status\7f341185
-Node: Renaming and VC\7f342899
-Node: Snapshots\7f343578
-Node: Making Snapshots\7f344079
-Node: Snapshot Caveats\7f345372
-Node: Version Headers\7f347181
-Node: ListDir\7f349880
-Node: Comparing Files\7f351929
-Node: Dired\7f353462
-Node: Dired Enter\7f354133
-Node: Dired Edit\7f354958
-Node: Dired Deletion\7f356705
-Node: Dired Immed\7f359928
-Node: Misc File Ops\7f361204
-Node: Buffers\7f363692
-Node: Select Buffer\7f365850
-Node: List Buffers\7f367645
-Node: Misc Buffer\7f369403
-Node: Kill Buffer\7f371046
-Node: Several Buffers\7f372176
-Node: Windows\7f376042
-Node: Basic Window\7f376753
-Node: Split Window\7f378472
-Node: Other Window\7f380605
-Node: Pop Up Window\7f383034
-Node: Change Window\7f384539
-Node: Mule\7f387447
-Node: Mule Intro\7f388710
-Node: Language Environments\7f389726
-Node: Input Methods\7f391833
-Node: Select Input Method\7f395553
-Node: Coding Systems\7f397708
-Node: Recognize Coding\7f401894
-Node: Specify Coding\7f405220
-Node: Major Modes\7f410151
-Node: Choosing Modes\7f412370
-Node: Indentation\7f414760
-Node: Indentation Commands\7f416855
-Node: Tab Stops\7f419584
-Node: Just Spaces\7f421433
-Node: Text\7f422248
-Node: Text Mode\7f424231
-Node: Nroff Mode\7f426310
-Node: TeX Mode\7f427953
-Node: TeX Editing\7f430205
-Node: TeX Print\7f433639
-Node: Outline Mode\7f436858
-Node: Outline Format\7f438339
-Node: Outline Motion\7f441139
-Node: Outline Visibility\7f442692
-Node: Words\7f445613
-Node: Sentences\7f448560
-Node: Paragraphs\7f450756
-Node: Pages\7f453044
-Node: Filling\7f455644
-Node: Auto Fill\7f456215
-Node: Fill Commands\7f458362
-Node: Fill Prefix\7f460527
-Node: Case\7f462715
-Node: Programs\7f464743
-Node: Program Modes\7f467292
-Node: Lists\7f469524
-Node: Defuns\7f475364
-Node: Grinding\7f478017
-Node: Basic Indent\7f478645
-Node: Multi-line Indent\7f480666
-Node: Lisp Indent\7f482282
-Node: C Indent\7f485732
-Node: Matching\7f490972
-Node: Comments\7f492494
-Node: Balanced Editing\7f498946
-Node: Lisp Completion\7f499960
-Node: Documentation\7f500975
-Node: Change Log\7f502214
-Node: Tags\7f504792
-Node: Tag Syntax\7f506441
-Node: Create Tags Table\7f510385
-Node: Etags Regexps\7f514445
-Node: Select Tags Table\7f519103
-Node: Find Tag\7f522876
-Node: Tags Search\7f525840
-Node: List Tags\7f529296
-Node: Fortran\7f530325
-Node: Fortran Motion\7f531401
-Node: Fortran Indent\7f532221
-Node: ForIndent Commands\7f532906
-Node: ForIndent Num\7f534051
-Node: ForIndent Conv\7f535325
-Node: ForIndent Vars\7f536101
-Node: Fortran Comments\7f537269
-Node: Fortran Columns\7f540867
-Node: Fortran Abbrev\7f542290
-Node: Asm Mode\7f543199
-Node: Running\7f543751
-Node: Compilation\7f544721
-Node: Lisp Modes\7f549571
-Node: Lisp Libraries\7f550844
-Node: Loading\7f551398
-Node: Compiling Libraries\7f555858
-Node: Mocklisp\7f558749
-Node: Lisp Eval\7f559426
-Node: Lisp Debug\7f563066
-Node: Lisp Interaction\7f568491
-Node: External Lisp\7f569846
-Node: Packages\7f571920
-Node: Package Terminology\7f572661
-Node: Using Packages\7f574019
-Node: Building Packages\7f582878
-Node: Abbrevs\7f585400
-Node: Defining Abbrevs\7f587600
-Node: Expanding Abbrevs\7f590047
-Node: Editing Abbrevs\7f592749
-Node: Saving Abbrevs\7f594622
-Node: Dynamic Abbrevs\7f596562
-Node: Picture\7f597864
-Node: Basic Picture\7f600297
-Node: Insert in Picture\7f602582
-Node: Tabs in Picture\7f604004
-Node: Rectangles in Picture\7f605525
-Node: Sending Mail\7f607433
-Node: Mail Format\7f609144
-Node: Mail Headers\7f610494
-Node: Mail Mode\7f616902
-Node: Reading Mail\7f620515
-Node: Calendar/Diary\7f622090
-Node: Calendar Motion\7f623762
-Node: Calendar Unit Motion\7f624645
-Node: Move to Beginning or End\7f626968
-Node: Specified Dates\7f628101
-Node: Scroll Calendar\7f628989
-Node: Mark and Region\7f630780
-Node: General Calendar\7f632686
-Node: LaTeX Calendar\7f634294
-Node: Holidays\7f636308
-Node: Sunrise/Sunset\7f639410
-Node: Lunar Phases\7f642453
-Node: Other Calendars\7f643838
-Node: Calendar Systems\7f645325
-Node: To Other Calendar\7f648436
-Node: From Other Calendar\7f650427
-Node: Mayan Calendar\7f652732
-Node: Diary\7f655927
-Node: Diary Commands\7f657676
-Node: Format of Diary File\7f660982
-Node: Date Formats\7f663852
-Node: Adding to Diary\7f666426
-Node: Special Diary Entries\7f668057
-Node: Calendar Customization\7f673396
-Node: Calendar Customizing\7f674258
-Node: Holiday Customizing\7f677477
-Node: Date Display Format\7f683945
-Node: Time Display Format\7f684903
-Node: Daylight Savings\7f686041
-Node: Diary Customizing\7f689229
-Node: Hebrew/Islamic Entries\7f693850
-Node: Fancy Diary Display\7f697190
-Node: Included Diary Files\7f699087
-Node: Sexp Diary Entries\7f700068
-Node: Appt Customizing\7f705158
-Node: Sorting\7f706204
-Node: Shell\7f711010
-Node: Single Shell\7f712303
-Node: Interactive Shell\7f713902
-Node: Shell Mode\7f717667
-Node: Terminal emulator\7f720158
-Node: Term Mode\7f722467
-Node: Paging in Term\7f723381
-Node: Narrowing\7f724179
-Node: Hardcopy\7f726129
-Node: Recursive Edit\7f727101
-Node: Dissociated Press\7f730088
-Node: CONX\7f732651
-Node: Amusements\7f733675
-Node: Emulation\7f734155
-Node: Customization\7f735999
-Node: Minor Modes\7f737844
-Node: Variables\7f739476
-Node: Examining\7f741432
-Node: Easy Customization\7f742893
-Node: Customization Groups\7f743907
-Node: Changing an Option\7f746836
-Node: Face Customization\7f753092
-Node: Specific Customization\7f754856
-Node: Edit Options\7f757463
-Node: Locals\7f759047
-Node: File Variables\7f762226
-Node: Keyboard Macros\7f766780
-Node: Basic Kbd Macro\7f768951
-Node: Save Kbd Macro\7f770883
-Node: Kbd Macro Query\7f772552
-Node: Key Bindings\7f774494
-Node: Keymaps\7f775368
-Node: Rebinding\7f779218
-Node: Interactive Rebinding\7f779917
-Node: Programmatic Rebinding\7f782109
-Node: Key Bindings Using Strings\7f784916
-Node: Disabling\7f786543
-Node: Syntax\7f788315
-Node: Syntax Entry\7f789196
-Node: Syntax Change\7f793280
-Node: Init File\7f795449
-Node: Init Syntax\7f796954
-Node: Init Examples\7f799306
-Node: Terminal Init\7f803496
-Node: Audible Bell\7f805206
-Node: Faces\7f808637
-Node: Frame Components\7f813479
-Node: X Resources\7f813924
-Node: Geometry Resources\7f815583
-Node: Iconic Resources\7f818031
-Node: Resource List\7f818503
-Node: Face Resources\7f825010
-Node: Widgets\7f828687
-Node: Menubar Resources\7f829626
-Node: Quitting\7f830559
-Node: Lossage\7f833537
-Node: Stuck Recursive\7f834181
-Node: Screen Garbled\7f834887
-Node: Text Garbled\7f836021
-Node: Unasked-for Search\7f836660
-Node: Emergency Escape\7f837445
-Node: Total Frustration\7f839224
-Node: Bugs\7f839855
-Node: Glossary\7f849389
-Node: Manifesto\7f881042
-Node: Key Index\7f904518
-Node: Command Index\7f930187
-Node: Variable Index\7f972577
-Node: Concept Index\7f988769
+Node: Exiting\7f98487
+Node: Command Switches\7f102960
+Node: Startup Paths\7f112147
+Node: Basic\7f119484
+Node: Inserting Text\7f120892
+Node: Moving Point\7f123888
+Node: Erasing\7f127494
+Node: Basic Files\7f128799
+Node: Basic Help\7f130721
+Node: Blank Lines\7f131316
+Node: Continuation Lines\7f132892
+Node: Position Info\7f134559
+Node: Arguments\7f137975
+Node: Undo\7f142074
+Node: Minibuffer\7f145021
+Node: Minibuffer File\7f147631
+Node: Minibuffer Edit\7f149436
+Node: Completion\7f152377
+Node: Completion Example\7f154308
+Node: Completion Commands\7f155403
+Node: Strict Completion\7f158379
+Node: Completion Options\7f160160
+Node: Minibuffer History\7f161668
+Node: Repetition\7f164852
+Node: M-x\7f167697
+Node: Help\7f172791
+Node: Help Summary\7f174201
+Node: Key Help\7f176987
+Node: Name Help\7f177946
+Node: Apropos\7f180591
+Node: Library Keywords\7f183710
+Node: Help Mode\7f186031
+Node: Misc Help\7f186528
+Node: Mark\7f189677
+Node: Setting Mark\7f191531
+Node: Using Region\7f194653
+Node: Marking Objects\7f195390
+Node: Mark Ring\7f197228
+Node: Mouse Selection\7f198944
+Node: Additional Mouse Operations\7f200951
+Node: Killing\7f205155
+Node: Yanking\7f210791
+Node: Kill Ring\7f211594
+Node: Appending Kills\7f213196
+Node: Earlier Kills\7f215233
+Node: Using X Selections\7f217846
+Node: X Clipboard Selection\7f219096
+Node: X Selection Commands\7f221273
+Node: X Cut Buffers\7f222359
+Node: Active Regions\7f223718
+Node: Accumulating Text\7f228298
+Node: Rectangles\7f231371
+Node: Registers\7f234890
+Node: RegPos\7f236344
+Node: RegText\7f237500
+Node: RegRect\7f238606
+Node: RegConfig\7f239485
+Node: RegNumbers\7f240425
+Node: RegFiles\7f241143
+Node: Bookmarks\7f241801
+Node: Display\7f245173
+Node: Scrolling\7f246668
+Node: Horizontal Scrolling\7f250811
+Node: Selective Display\7f252006
+Node: Display Vars\7f253225
+Node: Search\7f255903
+Node: Incremental Search\7f257096
+Node: Non-Incremental Search\7f266023
+Node: Word Search\7f267465
+Node: Regexp Search\7f269083
+Node: Regexps\7f270619
+Node: Search Case\7f280920
+Node: Replace\7f281701
+Node: Unconditional Replace\7f282649
+Node: Regexp Replace\7f283784
+Node: Replacement and Case\7f284719
+Node: Query Replace\7f285699
+Node: Other Repeating Search\7f288926
+Node: Fixit\7f290181
+Node: Kill Errors\7f290761
+Node: Transpose\7f292094
+Node: Fixing Case\7f294498
+Node: Spelling\7f295144
+Node: Files\7f296605
+Node: File Names\7f297915
+Node: Visiting\7f302252
+Node: Saving\7f308938
+Node: Backup\7f313861
+Node: Backup Names\7f315257
+Node: Backup Deletion\7f316740
+Node: Backup Copying\7f317890
+Node: Interlocking\7f319596
+Node: Reverting\7f323724
+Node: Auto Save\7f325636
+Node: Auto Save Files\7f326603
+Node: Auto Save Control\7f328444
+Node: Recover\7f330282
+Node: Version Control\7f331437
+Node: Concepts of VC\7f333475
+Node: Editing with VC\7f335085
+Node: Variables for Check-in/out\7f340341
+Node: Log Entries\7f342240
+Node: Change Logs and VC\7f343420
+Node: Old Versions\7f346687
+Node: VC Status\7f348690
+Node: Renaming and VC\7f350404
+Node: Snapshots\7f351083
+Node: Making Snapshots\7f351584
+Node: Snapshot Caveats\7f352877
+Node: Version Headers\7f354686
+Node: ListDir\7f357385
+Node: Comparing Files\7f359434
+Node: Dired\7f360967
+Node: Dired Enter\7f361638
+Node: Dired Edit\7f362463
+Node: Dired Deletion\7f364210
+Node: Dired Immed\7f367433
+Node: Misc File Ops\7f368709
+Node: Buffers\7f371197
+Node: Select Buffer\7f373355
+Node: List Buffers\7f375150
+Node: Misc Buffer\7f376908
+Node: Kill Buffer\7f378551
+Node: Several Buffers\7f379681
+Node: Windows\7f383547
+Node: Basic Window\7f384258
+Node: Split Window\7f385977
+Node: Other Window\7f388110
+Node: Pop Up Window\7f390539
+Node: Change Window\7f392044
+Node: Mule\7f394952
+Node: Mule Intro\7f396215
+Node: Language Environments\7f397231
+Node: Input Methods\7f399338
+Node: Select Input Method\7f403058
+Node: Coding Systems\7f405213
+Node: Recognize Coding\7f409399
+Node: Specify Coding\7f412725
+Node: Major Modes\7f417656
+Node: Choosing Modes\7f419875
+Node: Indentation\7f422265
+Node: Indentation Commands\7f424360
+Node: Tab Stops\7f427089
+Node: Just Spaces\7f428938
+Node: Text\7f429753
+Node: Text Mode\7f431736
+Node: Nroff Mode\7f433815
+Node: TeX Mode\7f435458
+Node: TeX Editing\7f437710
+Node: TeX Print\7f441144
+Node: Outline Mode\7f444363
+Node: Outline Format\7f445844
+Node: Outline Motion\7f448644
+Node: Outline Visibility\7f450197
+Node: Words\7f453118
+Node: Sentences\7f456065
+Node: Paragraphs\7f458261
+Node: Pages\7f460549
+Node: Filling\7f463149
+Node: Auto Fill\7f463720
+Node: Fill Commands\7f465867
+Node: Fill Prefix\7f468032
+Node: Case\7f470220
+Node: Programs\7f472248
+Node: Program Modes\7f474797
+Node: Lists\7f477029
+Node: Defuns\7f482869
+Node: Grinding\7f485522
+Node: Basic Indent\7f486150
+Node: Multi-line Indent\7f488171
+Node: Lisp Indent\7f489787
+Node: C Indent\7f493237
+Node: Matching\7f498477
+Node: Comments\7f499999
+Node: Balanced Editing\7f506451
+Node: Lisp Completion\7f507465
+Node: Documentation\7f508480
+Node: Change Log\7f509719
+Node: Tags\7f512297
+Node: Tag Syntax\7f513946
+Node: Create Tags Table\7f517890
+Node: Etags Regexps\7f521950
+Node: Select Tags Table\7f526608
+Node: Find Tag\7f530381
+Node: Tags Search\7f533345
+Node: List Tags\7f536801
+Node: Fortran\7f537830
+Node: Fortran Motion\7f538906
+Node: Fortran Indent\7f539726
+Node: ForIndent Commands\7f540411
+Node: ForIndent Num\7f541556
+Node: ForIndent Conv\7f542830
+Node: ForIndent Vars\7f543606
+Node: Fortran Comments\7f544774
+Node: Fortran Columns\7f548372
+Node: Fortran Abbrev\7f549795
+Node: Asm Mode\7f550704
+Node: Running\7f551256
+Node: Compilation\7f552226
+Node: Lisp Modes\7f557076
+Node: Lisp Libraries\7f558349
+Node: Loading\7f558903
+Node: Compiling Libraries\7f563363
+Node: Mocklisp\7f566254
+Node: Lisp Eval\7f566931
+Node: Lisp Debug\7f570571
+Node: Lisp Interaction\7f575996
+Node: External Lisp\7f577351
+Node: Packages\7f579425
+Node: Package Terminology\7f580166
+Node: Using Packages\7f581524
+Node: Building Packages\7f590383
+Node: Abbrevs\7f592905
+Node: Defining Abbrevs\7f595105
+Node: Expanding Abbrevs\7f597552
+Node: Editing Abbrevs\7f600254
+Node: Saving Abbrevs\7f602127
+Node: Dynamic Abbrevs\7f604067
+Node: Picture\7f605369
+Node: Basic Picture\7f607802
+Node: Insert in Picture\7f610087
+Node: Tabs in Picture\7f611509
+Node: Rectangles in Picture\7f613030
+Node: Sending Mail\7f614938
+Node: Mail Format\7f616649
+Node: Mail Headers\7f617999
+Node: Mail Mode\7f624407
+Node: Reading Mail\7f628020
+Node: Calendar/Diary\7f629595
+Node: Calendar Motion\7f631267
+Node: Calendar Unit Motion\7f632150
+Node: Move to Beginning or End\7f634473
+Node: Specified Dates\7f635606
+Node: Scroll Calendar\7f636494
+Node: Mark and Region\7f638285
+Node: General Calendar\7f640191
+Node: LaTeX Calendar\7f641799
+Node: Holidays\7f643813
+Node: Sunrise/Sunset\7f646915
+Node: Lunar Phases\7f649958
+Node: Other Calendars\7f651343
+Node: Calendar Systems\7f652830
+Node: To Other Calendar\7f655941
+Node: From Other Calendar\7f657932
+Node: Mayan Calendar\7f660237
+Node: Diary\7f663432
+Node: Diary Commands\7f665181
+Node: Format of Diary File\7f668487
+Node: Date Formats\7f671357
+Node: Adding to Diary\7f673931
+Node: Special Diary Entries\7f675562
+Node: Calendar Customization\7f680901
+Node: Calendar Customizing\7f681763
+Node: Holiday Customizing\7f684982
+Node: Date Display Format\7f691450
+Node: Time Display Format\7f692408
+Node: Daylight Savings\7f693546
+Node: Diary Customizing\7f696734
+Node: Hebrew/Islamic Entries\7f701355
+Node: Fancy Diary Display\7f704695
+Node: Included Diary Files\7f706592
+Node: Sexp Diary Entries\7f707573
+Node: Appt Customizing\7f712663
+Node: Sorting\7f713709
+Node: Shell\7f718515
+Node: Single Shell\7f719808
+Node: Interactive Shell\7f721407
+Node: Shell Mode\7f725172
+Node: Terminal emulator\7f727663
+Node: Term Mode\7f729972
+Node: Paging in Term\7f730886
+Node: Narrowing\7f731684
+Node: Hardcopy\7f733634
+Node: Recursive Edit\7f734606
+Node: Dissociated Press\7f737593
+Node: CONX\7f740156
+Node: Amusements\7f741180
+Node: Emulation\7f741660
+Node: Customization\7f743504
+Node: Minor Modes\7f745349
+Node: Variables\7f746981
+Node: Examining\7f748937
+Node: Easy Customization\7f750398
+Node: Customization Groups\7f751412
+Node: Changing an Option\7f754341
+Node: Face Customization\7f760597
+Node: Specific Customization\7f762361
+Node: Edit Options\7f764968
+Node: Locals\7f766552
+Node: File Variables\7f769731
+Node: Keyboard Macros\7f774285
+Node: Basic Kbd Macro\7f776456
+Node: Save Kbd Macro\7f778388
+Node: Kbd Macro Query\7f780057
+Node: Key Bindings\7f781999
+Node: Keymaps\7f782873
+Node: Rebinding\7f786723
+Node: Interactive Rebinding\7f787422
+Node: Programmatic Rebinding\7f789614
+Node: Key Bindings Using Strings\7f792421
+Node: Disabling\7f794048
+Node: Syntax\7f795820
+Node: Syntax Entry\7f796701
+Node: Syntax Change\7f800785
+Node: Init File\7f802954
+Node: Init Syntax\7f804459
+Node: Init Examples\7f806811
+Node: Terminal Init\7f811001
+Node: Audible Bell\7f812711
+Node: Faces\7f816142
+Node: Frame Components\7f820984
+Node: X Resources\7f821429
+Node: Geometry Resources\7f823088
+Node: Iconic Resources\7f825536
+Node: Resource List\7f826008
+Node: Face Resources\7f832515
+Node: Widgets\7f836192
+Node: Menubar Resources\7f837131
+Node: Quitting\7f838064
+Node: Lossage\7f841042
+Node: Stuck Recursive\7f841686
+Node: Screen Garbled\7f842392
+Node: Text Garbled\7f843526
+Node: Unasked-for Search\7f844165
+Node: Emergency Escape\7f844950
+Node: Total Frustration\7f846729
+Node: Bugs\7f847360
+Node: Glossary\7f856894
+Node: Manifesto\7f888547
+Node: Key Index\7f912023
+Node: Command Index\7f937894
+Node: Variable Index\7f980480
+Node: Concept Index\7f996566
 \1f
 End Tag Table
index 8c5ccaa..e8c6378 100644 (file)
@@ -1124,25 +1124,55 @@ File: xemacs.info,  Node: Entering Emacs,  Next: Exiting,  Prev: Pull-down Menus
 Entering and Exiting Emacs
 **************************
 
-   The usual way to invoke Emacs is to type `emacs <RET>' at the shell
-(for XEmacs, type `xemacs <RET>').  Emacs clears the screen and then
-displays an initial advisory message and copyright notice.  You can
-begin typing Emacs commands immediately afterward.
-
-   Some operating systems insist on discarding all type-ahead when Emacs
-starts up; they give Emacs no way to prevent this.  Therefore, it is
-wise to wait until Emacs clears the screen before typing the first
-editing command.
+   The usual way to invoke XEmacs is to type `xemacs <RET>' at the
+shell.  XEmacs clears the screen and then displays an initial advisory
+message and copyright notice.  You can begin typing XEmacs commands
+immediately afterward.
+
+   Some operating systems insist on discarding all type-ahead when
+XEmacs starts up; they give XEmacs no way to prevent this.  Therefore,
+it is advisable to wait until XEmacs clears the screen before typing
+your first editing command.
+
+   If you run XEmacs from a shell window under the X Window System, run
+it in the background with `xemacs&'.  This way, XEmacs does not tie up
+the shell window, so you can use that to run other shell commands while
+XEmacs operates its own X windows.  You can begin typing XEmacs commands
+as soon as you direct your keyboard input to the XEmacs frame.
 
    Before Emacs reads the first command, you have not had a chance to
 give a command to specify a file to edit.  Since Emacs must always have
-a current buffer for editing, it presents a buffer, by default, a
-buffer named `*scratch*'.  The buffer is in Lisp Interaction mode; you
-can use it to type Lisp expressions and evaluate them, or you can
-ignore that capability and simply doodle.  You can specify a different
-major mode for this buffer by setting the variable `initial-major-mode'
-in your init file.  *Note Init File::.
-
-   It is possible to give Emacs arguments in the shell command line to
-specify files to visit, Lisp files to load, and functions to call.
+a current buffer for editing, it presents a buffer, by default, a buffer
+named `*scratch*'.  The buffer is in Lisp Interaction mode; you can use
+it to type Lisp expressions and evaluate them, or you can ignore that
+capability and simply doodle.  (You can specify a different major mode
+for this buffer by setting the variable `initial-major-mode' in your
+init file.  *Note Init File::.)
+
+   It is possible to specify files to be visited, Lisp files to be
+loaded, and functions to be called, by giving Emacs arguments in the
+shell command line.  *Note Command Switches::.  But we don't recommend
+doing this.  The feature exists mainly for compatibility with other
+editors.
+
+   Many other editors are designed to be started afresh each time you
+want to edit.  You edit one file and then exit the editor.  The next
+time you want to edit either another file or the same one, you must run
+the editor again.  With these editors, it makes sense to use a
+command-line argument to say which file to edit.
+
+   But starting a new Emacs each time you want to edit a different file
+does not make sense.  For one thing, this would be annoyingly slow.  For
+another, this would fail to take advantage of Emacs's ability to visit
+more than one file in a single editing session.  And it would lose the
+other accumulated context, such as registers, undo history, and the mark
+ring.
+
+   The recommended way to use XEmacs is to start it only once, just
+after you log in, and do all your editing in the same Emacs session.
+Each time you want to edit a different file, you visit it with the
+existing Emacs, which eventually comes to have many files in it ready
+for editing.  Usually you do not kill the Emacs until you are about to
+log out.  *Note Files::, for more information on visiting more than one
+file.
 
index de7a277..1bc5ee6 100644 (file)
@@ -36,17 +36,20 @@ Exiting Emacs
 =============
 
    There are two commands for exiting Emacs because there are two kinds
-of exiting: "suspending" Emacs and "killing" Emacs.  "Suspending" means
-stopping Emacs temporarily and returning control to its superior
-(usually the shell), allowing you to resume editing later in the same
-Emacs job, with the same files, same kill ring, same undo history, and
-so on.  This is the usual way to exit.  "Killing" Emacs means
-destroying the Emacs job.  You can run Emacs again later, but you will
-get a fresh Emacs; there is no way to resume the same editing session
-after it has been killed.
+of exiting: "suspending" Emacs and "killing" Emacs.
+
+   "Suspending" means stopping Emacs temporarily and returning control
+to its parent process (usually a shell), allowing you to resume editing
+later in the same Emacs job, with the same buffers, same kill ring,
+same undo history, and so on.  This is the usual way to exit.
+
+   "Killing" Emacs means destroying the Emacs job.  You can run Emacs
+again later, but you will get a fresh Emacs; there is no way to resume
+the same editing session after it has been killed.
 
 `C-z'
-     Suspend Emacs (`suspend-emacs').  If used under the X window
+     Suspend Emacs or iconify a frame
+     (`suspend-emacs-or-iconify-frame').  If used under the X window
      system, shrink the X window containing the Emacs frame to an icon
      (see below).
 
@@ -57,41 +60,65 @@ after it has been killed.
 window containing the Emacs frame to an icon.  The Emacs process is
 stopped temporarily, and control is returned to the window manager.  If
 more than one frame is associated with the Emacs process, only the
-frame from which you used `C-z' is retained.  The X windows containing
-the other Emacs frames are closed.
+frame from which you used `C-z' is iconified.
 
    To activate the "suspended" Emacs, use the appropriate window manager
 mouse gestures.  Usually left-clicking on the icon reactivates and
 reopens the X window containing the Emacs frame, but the window manager
 you use determines what exactly happens.  To actually kill the Emacs
-process, use `C-x C-c' or the Exit Emacs item on the File menu.
-
-   On systems that do not permit programs to be suspended, `C-z' runs
-an inferior shell that communicates directly with the terminal, and
-Emacs waits until you exit the subshell.  On these systems, the only way
-to return to the shell from which Emacs was started (to log out, for
-example) is to kill Emacs.  `C-d' or `exit' are typical commands to
-exit a subshell.
+process, use `C-x C-c' or the Exit XEmacs item on the File menu.
+
+   To suspend Emacs, type `C-z' (`suspend-emacs').  This takes you back
+to the shell from which you invoked Emacs.  You can resume Emacs with
+the shell command `%xemacs' in most common shells.
+
+   On systems that do not support suspending programs, `C-z' starts an
+inferior shell that communicates directly with the terminal.  Emacs
+waits until you exit the subshell.  (The way to do that is probably
+with `C-d' or `exit', but it depends on which shell you use.)  The only
+way on these systems to get back to the shell from which Emacs was run
+(to log out, for example) is to kill Emacs.
+
+   Suspending also fails if you run Emacs under a shell that doesn't
+support suspending programs, even if the system itself does support it.
+In such a case, you can set the variable `cannot-suspend' to a
+non-`nil' value to force `C-z' to start an inferior shell.  (One might
+also describe Emacs's parent shell as "inferior" for failing to support
+job control properly, but that is a matter of taste.)
+
+   When Emacs communicates directly with an X server and creates its own
+dedicated X windows, `C-z' has a different meaning.  Suspending an
+applications that uses its own X windows is not meaningful or useful.
+Instead, `C-z' runs the command `iconify-or-deiconify-frame', which
+temporarily closes up the selected Emacs frame.  The way to get back to
+a shell window is with the window manager.
 
    To kill Emacs, type `C-x C-c' (`save-buffers-kill-emacs').  A
-two-character key is used for this to make it harder to type.  In
-XEmacs, selecting the Exit Emacs option of the File menu is an
-alternate way of issuing the command.
+two-character key is used for this to make it harder to type.  Selecting
+the Exit XEmacs option of the File menu is an alternate way of issuing
+the command.
 
    Unless a numeric argument is used, this command first offers to save
-any modified buffers.  If you do not save all buffers, you are asked for
-reconfirmation with `yes' before killing Emacs, since any changes not
-saved will be lost.  If any subprocesses are still running, `C-x C-c'
-asks you to confirm killing them, since killing Emacs kills the
-subprocesses simultaneously.
-
-   In most programs running on Unix, certain characters may instantly
-suspend or kill the program.  (In Berkeley Unix these characters are
-normally `C-z' and `C-c'.)  This Unix feature is turned off while you
-are in Emacs. The meanings of `C-z' and `C-x C-c' as keys in Emacs were
-inspired by the standard Berkeley Unix meanings of `C-z' and `C-c', but
-that is their only relationship with Unix.  You could customize these
-keys to do anything (*note Keymaps::).
+any modified file-visiting buffers.  If you do not save all buffers,
+you are asked for reconfirmation with `yes' before killing Emacs, since
+any changes not saved will be lost forever.  If any subprocesses are
+still running, `C-x C-c' asks you to confirm killing them, since killing
+Emacs will kill the subprocesses immediately.
+
+   There is no way to restart an Emacs session once you have killed it.
+You can, however, arrange for Emacs to record certain session
+information, such as which files are visited, when you kill it, so that
+the next time you restart Emacs it will try to visit the same files and
+so on.
+
+   The operating system usually listens for certain special characters
+whose meaning is to kill or suspend the program you are running.  This
+operating system feature is turned off while you are in Emacs.  The
+meanings of `C-z' and `C-x C-c' as keys in Emacs were inspired by the
+use of `C-z' and `C-c' on several operating systems as the characters
+for stopping or killing a program, but that is their only relationship
+with the operating system.  You can customize these keys to run any
+commands of your choice (*note Keymaps::).
 
 \1f
 File: xemacs.info,  Node: Command Switches,  Next: Startup Paths,  Prev: Exiting,  Up: Top
@@ -500,12 +527,6 @@ aiding in debugging any problems which come up.
      `/usr/local/info' as well as the directories of the environment
      variable `INFOPATH' to `Info-directory-list'.
 
-`lock-directory'
-`superlock-file'
-     Are the site-specific locations of the lock directory and the
-     superlock file, respectively.  The `lock-directory' variable may
-     also be initialized from the `EMACSLOCKDIR' environment variable.
-
 `exec-directory'
      Is the directory of architecture-dependent files that come with
      XEmacs, especially executable programs intended for XEmacs to
@@ -539,64 +560,102 @@ Basic Editing Commands
    We now give the basics of how to enter text, make corrections, and
 save the text in a file.  If this material is new to you, you might
 learn it more easily by running the Emacs learn-by-doing tutorial.  To
-do this, type `Control-h t' (`help-with-tutorial').
+use the tutorial, run Emacs and type `Control-h t'
+(`help-with-tutorial').  You can also use Tutorials item from the Help
+menu.
+
+   XEmacs comes with many translations of tutorial.  If your XEmacs is
+with MULE and you set up language environment correctly, XEmacs choses
+right tutorial when available (*note Language Environments::).  If you
+want specific translation, give `C-h t' a prefix argument, like `C-u
+C-h t'.
+
+   To clear the screen and redisplay, type `C-l' (`recenter').
+
+* Menu:
+
+
+* Inserting Text::      Inserting text by simply typing it.
+* Moving Point::        How to move the cursor to the place where you want to
+                         change something.
+* Erasing::            Deleting and killing text.
+* Files: Basic Files.   Visiting, creating, and saving files.
+* Help: Basic Help.     Asking what a character does.
+* Blank Lines::                Commands to make or delete blank lines.
+* Continuation Lines::  Lines too wide for the screen.
+* Position Info::       What page, line, row, or column is point on?
+* Arguments::          Numeric arguments for repeating a command.
+
+\1f
+File: xemacs.info,  Node: Inserting Text,  Next: Moving Point,  Up: Basic
 
 Inserting Text
 ==============
 
    To insert printing characters into the text you are editing, just
-type them.  This inserts the characters into the buffer at the cursor
-(that is, at "point"; *note Point::).  The cursor moves forward.  Any
-characters after the cursor move forward too.  If the text in the buffer
-is `FOOBAR', with the cursor before the `B', and you type `XX', the
-result is `FOOXXBAR', with the cursor still before the `B'.
-
-   To "delete" text you have just inserted, use <DEL>.  <DEL> deletes
-the character BEFORE the cursor (not the one that the cursor is on top
-of or under; that is the character AFTER the cursor).  The cursor and
-all characters after it move backwards.  Therefore, if you type a
-printing character and then type <DEL>, they cancel out.
+type them.  This inserts the characters you type into the buffer at the
+cursor (that is, at "point"; *note Point::).  The cursor moves forward,
+and any text after the cursor moves forward too.  If the text in the
+buffer is `FOOBAR', with the cursor before the `B', then if you type
+`XX', you get `FOOXXBAR', with the cursor still before the `B'.
+
+   To "delete" text you have just inserted, use <BS>.  <BS> deletes the
+character _before_ the cursor (not the one that the cursor is on top of
+or under; that is the character AFTER the cursor).  The cursor and all
+characters after it move backwards.  Therefore, if you type a printing
+character and then type <BS>, they cancel out.
 
    To end a line and start typing a new one, type <RET>.  This inserts
 a newline character in the buffer.  If point is in the middle of a
 line, <RET> splits the line.  Typing <DEL> when the cursor is at the
-beginning of a line rubs out the newline before the line, thus joining
-the line with the preceding line.
+beginning of a line deletes the preceding newline, thus joining the
+line with the preceding line.
 
-   Emacs automatically splits lines when they become too long, if you
-turn on a special mode called "Auto Fill" mode.  *Note Filling::, for
-information on using Auto Fill mode.
+   Emacs can split lines automatically when they become too long, if you
+turn on a special minor mode called "Auto Fill" mode.  *Note Filling::,
+for how to use Auto Fill mode.
 
-   Customization information: <DEL>, in most modes, runs the command
-`delete-backward-char'; <RET> runs the command `newline', and
-self-inserting printing characters run the command `self-insert', which
-inserts whatever character was typed to invoke it.  Some major modes
-rebind <DEL> to other commands.
+   If you prefer to have text characters replace (overwrite) existing
+text rather than shove it to the right, you can enable Overwrite mode,
+a minor mode.  *Note Minor Modes::.
 
    Direct insertion works for printing characters and <SPC>, but other
-characters act as editing commands and do not insert themselves.  If
-you need to insert a control character or a character whose code is
-above 200 octal, you must "quote" it by typing the character
-`control-q' (`quoted-insert') first.  There are two ways to use `C-q':
-
-   * `Control-q' followed by any non-graphic character (even `C-g')
-     inserts that character.
-
-   * `Control-q' followed by three octal digits inserts the character
-     with the specified character code.
+characters act as editing commands and do not insert themselves.  If you
+need to insert a control character or a character whose code is above
+200 octal, you must "quote" it by typing the character `Control-q'
+(`quoted-insert') first.  (This character's name is normally written
+`C-q' for short.)  There are two ways to use `C-q':
+
+   * `C-q' followed by any non-graphic character (even `C-g') inserts
+     that character.
+
+   * `C-q' followed by a sequence of octal digits inserts the character
+     with the specified octal character code.  You can use any number of
+     octal digits; any non-digit terminates the sequence.  If the
+     terminating character is <RET>, it serves only to terminate the
+     sequence; any other non-digit is itself used as input after
+     terminating the sequence.  (The use of octal sequences is disabled
+     in ordinary non-binary Overwrite mode, to give you a convenient
+     way to insert a digit instead of overwriting with it.)
 
 A numeric argument to `C-q' specifies how many copies of the quoted
 character should be inserted (*note Arguments::).
 
-   If you prefer to have text characters replace (overwrite) existing
-text instead of moving it to the right, you can enable Overwrite mode, a
-minor mode.  *Note Minor Modes::.
+   Customization information: <DEL>, in most modes, runs the command
+`backward-or-forward-delete-char'; <RET> runs the command `newline',
+and self-inserting printing characters run the command `self-insert',
+which inserts whatever character was typed to invoke it.  Some major
+modes rebind <DEL> to other commands.
+
+\1f
+File: xemacs.info,  Node: Moving Point,  Next: Erasing,  Prev: Inserting Text,  Up: Basic
 
 Changing the Location of Point
 ==============================
 
    To do more than insert characters, you have to know how to move point
-(*note Point::).  Here are a few of the available commands.
+(*note Point::).  The simplest way to do this is with arrow keys, or by
+clicking the left mouse button where you want to move to.
 
    NOTE: Many of the following commands have two versions, one that uses
 the function keys (e.g. <LEFT> or <END>) and one that doesn't.  The
@@ -652,11 +711,13 @@ TTY's), but the latter are available on all terminals.
      on the frame to bring point to the center of the window.
 
 `M-r'
-     Move point to left margin on the line halfway down the frame or
-     window (`move-to-window-line').  Text does not move on the frame.
-     A numeric argument says how many screen lines down from the top of
-     the window (zero for the top).  A negative argument counts from
-     the bottom (-1 for the bottom).
+     Move point to left margin, vertically centered in the window
+     (`move-to-window-line').  Text does not move on the screen.
+
+     A numeric argument says which screen line to place point on.  It
+     counts screen lines down from the top of the window (zero for the
+     top line).  A negative argument counts lines from the bottom (-1
+     for the bottom line).
 
 `C-t'
      Transpose two characters, the ones before and after the cursor
@@ -673,36 +734,46 @@ TTY's), but the latter are available on all terminals.
      Move to the end of the buffer (`end-of-buffer').
 
 `M-x goto-char'
-     Read a number N and move the cursor to character number N.
-     Position 1 is the beginning of the buffer.
+     Read a number N and move point to buffer position N.  Position 1
+     is the beginning of the buffer.
 
 `M-g'
-     Read a number N and move cursor to line number N (`goto-line').
+     Read a number N and move point to line number N (`goto-line').
      Line 1 is the beginning of the buffer.
 
-`C-x C-n'
+`M-x set-goal-column'
      Use the current column of point as the "semi-permanent goal
      column" for `C-n' and `C-p' (`set-goal-column').  Henceforth, those
      commands always move to this column in each line moved into, or as
      close as possible given the contents of the line.  This goal
      column remains in effect until canceled.
 
-`C-u C-x C-n'
+`C-u M-x set-goal-column'
      Cancel the goal column.  Henceforth, `C-n' and `C-p' once again
      try to avoid changing the horizontal position, as usual.
 
-   If you set the variable `track-eol' to a non-`nil' value, `C-n' and
-`C-p' move to the end of the line when at the end of the starting line.
-By default, `track-eol' is `nil'.
+   If you set the variable `track-eol' to a non-`nil' value, then `C-n'
+and `C-p' when at the end of the starting line move to the end of
+another line.  Normally, `track-eol' is `nil'.  *Note Variables::, for
+how to set variables such as `track-eol'.
+
+   Normally, `C-n' on the last line of a buffer appends a newline to
+it.  If the variable `next-line-add-newlines' is `nil', then `C-n' gets
+an error instead (like `C-p' on the first line).
+
+\1f
+File: xemacs.info,  Node: Erasing,  Next: Basic Files,  Prev: Moving Point,  Up: Basic
 
 Erasing Text
 ============
 
 `<DEL>'
-     Delete the character before the cursor (`delete-backward-char').
+     Delete the character before or after point
+     (`backward-or-forward-delete-char').  You can customize this
+     behavior by setting the variable `delete-key-deletes-forward'.
 
 `C-d'
-     Delete the character after the cursor (`delete-char').
+     Delete the character after point (`delete-char').
 
 `C-k'
      Kill to the end of the line (`kill-line').
@@ -714,85 +785,87 @@ Erasing Text
      Kill back to the beginning of the previous word
      (`backward-kill-word').
 
-   In contrast to the <DEL> key, which deletes the character before the
-cursor, `Control-d' deletes the character after the cursor, causing the
-rest of the text on the line to shift left.  If `Control-d' is typed at
-the end of a line, that line and the next line are joined.
+   You already know about the <DEL> key which deletes the character
+before point (that is, before the cursor).  Another key, `Control-d'
+(`C-d' for short), deletes the character after point (that is, the
+character that the cursor is on).  This shifts the rest of the text on
+the line to the left.  If you type `C-d' at the end of a line, it joins
+together that line and the next line.
 
-   To erase a larger amount of text, use `Control-k', which kills a
-line at a time.  If you use `C-k' at the beginning or in the middle of
-a line, it kills all the text up to the end of the line.  If you use
+   To erase a larger amount of text, use the `C-k' key, which kills a
+line at a time.  If you type `C-k' at the beginning or middle of a
+line, it kills all the text up to the end of the line.  If you type
 `C-k' at the end of a line, it joins that line and the next line.
 
    *Note Killing::, for more flexible ways of killing text.
 
+\1f
+File: xemacs.info,  Node: Basic Files,  Next: Basic Help,  Prev: Erasing,  Up: Basic
+
 Files
 =====
 
-   The commands above are sufficient for creating and altering text in
-an Emacs buffer.  More advanced Emacs commands just make things easier.
-But to keep any text permanently you must put it in a "file".  Files
-are named units of text which are stored by the operating system and
-which you can retrieve by name.  To look at or use the contents of a
-file in any way, including editing the file with Emacs, you must
-specify the file name.
+   The commands described above are sufficient for creating and altering
+text in an Emacs buffer; the more advanced Emacs commands just make
+things easier.  But to keep any text permanently you must put it in a
+"file".  Files are named units of text which are stored by the
+operating system for you to retrieve later by name.  To look at or use
+the contents of a file in any way, including editing the file with
+Emacs, you must specify the file name.
 
    Consider a file named `/usr/rms/foo.c'.  To begin editing this file
 from Emacs, type:
 
      C-x C-f /usr/rms/foo.c <RET>
 
-The file name is given as an "argument" to the command `C-x C-f'
-(`find-file').  The command uses the "minibuffer" to read the argument.
-You have to type <RET> to terminate the argument (*note Minibuffer::).
+Here the file name is given as an "argument" to the command `C-x C-f'
+(`find-file').  That command uses the "minibuffer" to read the
+argument, and you type <RET> to terminate the argument (*note
+Minibuffer::).
 
    You can also use the Open... menu item from the File menu, then type
 the name of the file to the prompt.
 
-   Emacs obeys the command by "visiting" the file: it creates a buffer,
-copies the contents of the file into the buffer, and then displays the
-buffer for you to edit.  You can make changes in the buffer, and then
-"save" the file by typing `C-x C-s' (`save-buffer') or choosing Save
-Buffer from the File menu.  This makes the changes permanent by copying
-the altered contents of the buffer back into the file `/usr/rms/foo.c'.
-Until then, the changes are only inside your Emacs buffer, and the
-file `foo.c' is not changed.
+   Emacs obeys the command by "visiting" the file: creating a buffer,
+copying the contents of the file into the buffer, and then displaying
+the buffer for you to edit.  If you alter the text, you can "save" the
+new text in the file by typing `C-x C-s' (`save-buffer') or choosing
+Save Buffer from the File menu.  This makes the changes permanent by
+copying the altered buffer contents back into the file
+`/usr/rms/foo.c'.  Until you save, the changes exist only inside Emacs,
+and the file `foo.c' is unaltered.
 
    To create a file, visit the file with `C-x C-f' as if it already
 existed or choose Open... from the File menu and provide the name for
-the new file in the minibuffer.  Emacs will create an empty buffer in
-which you can insert the text you want to put in the file.  When you
-save the buffer with `C-x C-s', or by choosing Save Buffer from the
-File menu, the file is created.
+the new file.  Emacs will create an empty buffer in which you can
+insert the text you want to put in the file.  When you save the buffer
+with `C-x C-s', or by choosing Save Buffer from the File menu, the file
+is created.
+
+   To learn more about using files, *Note Files::.
 
-   To learn more about using files, *note Files::.
+\1f
+File: xemacs.info,  Node: Basic Help,  Next: Blank Lines,  Prev: Basic Files,  Up: Basic
 
 Help
 ====
 
-   If you forget what a key does, you can use the Help character
-(`C-h') to find out: Type `C-h k' followed by the key you want to know
-about.  For example, `C-h k C-n' tells you what `C-n' does.  `C-h' is a
-prefix key; `C-h k' is just one of its subcommands (the command
-`describe-key').  The other subcommands of `C-h' provide different
-kinds of help.  Type `C-h' three times to get a description of all the
-help facilities.  *Note Help::.
-
-* Menu:
-
-* Blank Lines::        Commands to make or delete blank lines.
-* Continuation Lines:: Lines too wide for the frame.
-* Position Info::      What page, line, row, or column is point on?
-* Arguments::         Numeric arguments for repeating a command.
+   If you forget what a key does, you can find out with the Help
+character, which is `C-h' (or <F1>, which is an alias for `C-h').  Type
+`C-h k' followed by the key you want to know about; for example, `C-h k
+C-n' tells you all about what `C-n' does.  `C-h' is a prefix key; `C-h
+k' is just one of its subcommands (the command `describe-key').  The
+other subcommands of `C-h' provide different kinds of help.  Type `C-h'
+twice to get a description of all the help facilities.  *Note Help::.
 
 \1f
-File: xemacs.info,  Node: Blank Lines,  Next: Continuation Lines,  Prev: Basic,  Up: Basic
+File: xemacs.info,  Node: Blank Lines,  Next: Continuation Lines,  Prev: Basic Help,  Up: Basic
 
 Blank Lines
 ===========
 
-   Here are special commands and techniques for entering and removing
-blank lines.
+   Here are special commands and techniques for putting in and taking
+out blank lines.
 
 `C-o'
      Insert one or more blank lines after the cursor (`open-line').
@@ -802,24 +875,25 @@ blank lines.
      (`delete-blank-lines').
 
    When you want to insert a new line of text before an existing line,
-you just type the new line of text, followed by <RET>.  If you prefer
-to create a blank line first and then insert the desired text, use the
-key `C-o' (`open-line'), which inserts a newline after point but leaves
-point in front of the newline.  Then type the text into the new line.
-`C-o F O O' has the same effect as `F O O <RET>', except for the final
-location of point.
-
-   To create several blank lines, type `C-o' several times, or give
-`C-o' an argument indicating how many blank lines to create.  *Note
-Arguments::, for more information.
-
-   If you have many blank lines in a row and want to get rid of them,
-use `C-x C-o' (`delete-blank-lines').  If point is on a blank line
-which is adjacent to at least one other blank line, `C-x C-o' deletes
-all but one of the blank lines.  If point is on a blank line with no
-other adjacent blank line, the sole blank line is deleted.  If point is
-on a non-blank line, `C-x C-o' deletes any blank lines following that
-non-blank line.
+you can do it by typing the new line of text, followed by <RET>.
+However, it may be easier to see what you are doing if you first make a
+blank line and then insert the desired text into it.  This is easy to do
+using the key `C-o' (`open-line'), which inserts a newline after point
+but leaves point in front of the newline.  After `C-o', type the text
+for the new line.  `C-o F O O' has the same effect as `F O O <RET>',
+except for the final location of point.
+
+   You can make several blank lines by typing `C-o' several times, or
+by giving it a numeric argument to tell it how many blank lines to make.
+*Note Arguments::, for how.  If you have a fill prefix, then `C-o'
+command inserts the fill prefix on the new line, when you use it at the
+beginning of a line.  *Note Fill Prefix::.
+
+   The easy way to get rid of extra blank lines is with the command
+`C-x C-o' (`delete-blank-lines').  `C-x C-o' in a run of several blank
+lines deletes all but one of them.  `C-x C-o' on a solitary blank line
+deletes that blank line.  When point is on a nonblank line, `C-x C-o'
+deletes any blank lines following that nonblank line.
 
 \1f
 File: xemacs.info,  Node: Continuation Lines,  Next: Position Info,  Prev: Blank Lines,  Up: Basic
@@ -827,27 +901,34 @@ File: xemacs.info,  Node: Continuation Lines,  Next: Position Info,  Prev: Blank
 Continuation Lines
 ==================
 
-   If you add too many characters to one line without breaking with a
-<RET>, the line grows to occupy two (or more) screen lines, with a
-curved arrow at the extreme right margin of all but the last line.  The
-curved arrow indicates that the following screen line is not really a
-distinct line in the text, but just the "continuation" of a line too
-long to fit the frame.  You can use Auto Fill mode (*note Filling::) to
-have Emacs insert newlines automatically when a line gets too long.
+   If you add too many characters to one line without breaking it with
+<RET>, the line will grow to occupy two (or more) lines on the screen,
+with a curved arrow at the extreme right margin of all but the last of
+them.  The curved arrow says that the following screen line is not
+really a distinct line in the text, but just the "continuation" of a
+line too long to fit the screen.  Continuation is also called "line
+wrapping".
+
+   Sometimes it is nice to have Emacs insert newlines automatically when
+a line gets too long.  Continuation on the screen does not do that.  Use
+Auto Fill mode (*note Filling::) if that's what you want.
 
    Instead of continuation, long lines can be displayed by "truncation".
 This means that all the characters that do not fit in the width of the
 frame or window do not appear at all.  They remain in the buffer,
-temporarily invisible.  Three diagonal dots in the last column (instead
-of the curved arrow inform you that truncation is in effect.
+temporarily invisible.  Right arrow in the last column (instead of the
+curved arrow) inform you that truncation is in effect.
+
+   Truncation instead of continuation happens whenever horizontal
+scrolling is in use, and optionally in all side-by-side windows (*note
+Windows::).  You can enable truncation for a particular buffer by
+setting the variable `truncate-lines' to non-`nil' in that buffer.
+(*Note Variables::.)  Altering the value of `truncate-lines' makes it
+local to the current buffer; until that time, the default value is in
+effect.  The default is initially `nil'.  *Note Locals::.
 
-   To turn off continuation for a particular buffer, set the variable
-`truncate-lines' to non-`nil' in that buffer.  Truncation instead of
-continuation also happens whenever horizontal scrolling is in use, and
-optionally whenever side-by-side windows are in use (*note Windows::).
-Altering the value of `truncate-lines' makes it local to the current
-buffer; until that time, the default value is in effect.  The default
-is initially `nil'.  *Note Locals::.
+   *Note Display Vars::, for additional variables that affect how text
+is displayed.
 
 \1f
 File: xemacs.info,  Node: Position Info,  Next: Arguments,  Prev: Continuation Lines,  Up: Basic
@@ -868,15 +949,20 @@ information, it is not displayed all the time.
 `M-x what-line'
      Print line number of point in the buffer.
 
+`M-x line-number-mode'
+     Toggle automatic display of current line number.
+
 `M-='
      Print number of lines and characters in the current region
-     (`count-lines-region').
+     (`count-lines-region').  *Note Mark::, for information about the
+     region.
 
 `C-x ='
      Print character code of character after point, character position
      of point, and column of point (`what-cursor-position').
 
    There are several commands for printing line numbers:
+
    * `M-x what-line' counts lines from the beginning of the file and
      prints the line number point is on.  The first line of the file is
      line number 1.  You can use these numbers as arguments to `M-x
@@ -888,19 +974,21 @@ information, it is not displayed all the time.
      current page.
 
    * `M-=' (`count-lines-region') prints the number of lines in the
-     region (*note Mark::).
+     region (*note Mark::).  *Note Pages::, for the command `C-x l'
+     which counts the lines in the
 
-   The command `C-x =' (`what-cursor-position') provides information
-about point and about the column the cursor is in.  It prints a line in
-the echo area that looks like this:
+   The command `C-x =' (`what-cursor-position') can be used to find out
+the column that the cursor is in, and other miscellaneous information
+about point.  It prints a line in the echo area that looks like this:
 
-     Char: x (0170)  point=65986 of 563027(12%)  column 44
+     Char: c (0143, 99, 0x63)  point=18862 of 24800(76%)  column 53
 
-(In fact, this is the output produced when point is before `column 44'
+(In fact, this is the output produced when point is before `column 53'
 in the example.)
 
-   The two values after `Char:' describe the character following point,
-first by showing it and second by giving its octal character code.
+   The four values after `Char:' describe the character that follows
+point, first by showing it and then by giving its character code in
+octal, decimal and hex.
 
    `point=' is followed by the position of point expressed as a
 character count.  The front of the buffer counts as position 1, one
@@ -915,7 +1003,7 @@ from the left edge of the window.
 beginning and the end temporarily invisible, `C-x =' prints additional
 text describing the current visible range.  For example, it might say:
 
-     Char: x (0170)  point=65986 of 563025(12%) <65102 - 68533>  column 44
+     Char: c (0143, 99, 0x63)  point=19674 of 24575(80%) <19591 - 19703>  column 69
 
 where the two extra numbers give the smallest and largest character
 position that point is allowed to assume.  The characters between those
@@ -933,13 +1021,15 @@ File: xemacs.info,  Node: Arguments,  Prev: Position Info,  Up: Basic
 Numeric Arguments
 =================
 
-   Any Emacs command can be given a "numeric argument".  Some commands
+   In mathematics and computer usage, the word "argument" means "data
+provided to a function or operation."  Any Emacs command can be given a
+"numeric argument" (also called a "prefix argument").  Some commands
 interpret the argument as a repetition count.  For example, giving an
 argument of ten to the key `C-f' (the command `forward-char', move
 forward one character) moves forward ten characters.  With these
 commands, no argument is equivalent to an argument of one.  Negative
-arguments are allowed.  Often they tell a command to move or act
-backwards.
+arguments are allowed.  Often they tell a command to move or act  in
+the opposite direction.
 
    If your keyboard has a <META> key (labelled with a diamond on
 Sun-type keyboards and labelled `Alt' on some other keyboards), the
@@ -947,16 +1037,19 @@ easiest way to specify a numeric argument is to type digits and/or a
 minus sign while holding down the <META> key.  For example,
      M-5 C-n
 
-moves down five lines.  The characters `Meta-1', `Meta-2', and so on,
-as well as `Meta--', do this because they are keys bound to commands
-(`digit-argument' and `negative-argument') that are defined to
-contribute to an argument for the next command.
+would move down five lines.  The characters `Meta-1', `Meta-2', and so
+on, as well as `Meta--', do this because they are keys bound to
+commands (`digit-argument' and `negative-argument') that are defined to
+contribute to an argument for the next command.  Digits and `-'
+modified with Control, or Control and Meta, also specify numeric
+arguments.
 
    Another way of specifying an argument is to use the `C-u'
 (`universal-argument') command followed by the digits of the argument.
-With `C-u', you can type the argument digits without holding down shift
-keys.  To type a negative argument, start with a minus sign.  Just a
-minus sign normally means -1.  `C-u' works on all terminals.
+With `C-u', you can type the argument digits without holding down
+modifier keys; `C-u' works on all terminals.  To type a negative
+argument, type a minus sign after `C-u'.  Just a minus sign without
+digits normally means -1.
 
    `C-u' followed by a character which is neither a digit nor a minus
 sign has the special meaning of "multiply by four".  It multiplies the
@@ -984,9 +1077,22 @@ argument of one.  (*Note Killing::, for more information on `C-k'.)
 
    A few commands treat a plain `C-u' differently from an ordinary
 argument.  A few others may treat an argument of just a minus sign
-differently from an argument of -1.  These unusual cases will be
-described when they come up; they are always to make the individual
-command more convenient to use.
+differently from an argument of -1.  These unusual cases are described
+when they come up; they are always for reasons of convenience of use of
+the individual command.
+
+   You can use a numeric argument to insert multiple copies of a
+character.  This is straightforward unless the character is a digit; for
+example, `C-u 6 4 a' inserts 64 copies of the character `a'.  But this
+does not work for inserting digits; `C-u 6 4 1' specifies an argument
+of 641, rather than inserting anything.  To separate the digit to
+insert from the argument, type another `C-u'; for example, `C-u 6 4 C-u
+1' does insert 64 copies of the character `1'.
+
+   We use the term "prefix argument" as well as "numeric argument" to
+emphasize that you type the argument before the command, and to
+distinguish these arguments from minibuffer arguments that come after
+the command.
 
 \1f
 File: xemacs.info,  Node: Undo,  Next: Minibuffer,  Prev: Basic,  Up: Top
@@ -1109,99 +1215,3 @@ how XEmacs handles such conflicts:
 * Minibuffer History::    Reusing recent minibuffer arguments.
 * Repetition::           Re-executing commands that used the minibuffer.
 
-\1f
-File: xemacs.info,  Node: Minibuffer File,  Next: Minibuffer Edit,  Prev: Minibuffer,  Up: Minibuffer
-
-Minibuffers for File Names
-==========================
-
-   Sometimes the minibuffer starts out with text in it.  For example,
-when you are supposed to give a file name, the minibuffer starts out
-containing the "default directory", which ends with a slash.  This is
-to inform you which directory the file will be found in if you do not
-specify a directory.
-
-   For example, the minibuffer might start out with these contents:
-
-     Find File: /u2/emacs/src/
-
-where `Find File: ' is the prompt.  Typing `buffer.c' specifies the
-file `/u2/emacs/src/buffer.c'.  To find files in nearby directories,
-use `..'; thus, if you type `../lisp/simple.el', you will get the file
-named `/u2/emacs/lisp/simple.el'.  Alternatively, you can kill with
-`M-<DEL>' the directory names you don't want (*note Words::).
-
-   If you don't want any of the default, you can kill it with `C-a
-C-k'.  But you don't need to kill the default; you can simply ignore it.
-Insert an absolute file name, one starting with a slash or a tilde,
-after the default directory.  For example, to specify the file
-`/etc/termcap', just insert that name, giving these minibuffer contents:
-
-     Find File: /u2/emacs/src//etc/termcap
-
-XEmacs gives a special meaning to a double slash (which is not normally
-a useful thing to write): it means, "ignore everything before the
-second slash in the pair."  Thus, `/u2/emacs/src/' is ignored in the
-example above, and you get the file `/etc/termcap'.
-
-   If you set `insert-default-directory' to `nil', the default
-directory is not inserted in the minibuffer.  This way, the minibuffer
-starts out empty.  But the name you type, if relative, is still
-interpreted with respect to the same default directory.
-
-\1f
-File: xemacs.info,  Node: Minibuffer Edit,  Next: Completion,  Prev: Minibuffer File,  Up: Minibuffer
-
-Editing in the Minibuffer
-=========================
-
-   The minibuffer is an XEmacs buffer (albeit a peculiar one), and the
-usual XEmacs commands are available for editing the text of an argument
-you are entering.
-
-   Since <RET> in the minibuffer is defined to exit the minibuffer, you
-can't use it to insert a newline in the minibuffer.  To do that, type
-`C-o' or `C-q C-j'.  (Recall that a newline is really the character
-control-J.)
-
-   The minibuffer has its own window which always has space on the
-screen but acts as if it were not there when the minibuffer is not in
-use.  When the minibuffer is in use, its window is just like the
-others; you can switch to another window with `C-x o', edit text in
-other windows and perhaps even visit more files, before returning to the
-minibuffer to submit the argument.  You can kill text in another window,
-return to the minibuffer window, and then yank the text to use it in the
-argument.  *Note Windows::.
-
-   There are some restrictions on the use of the minibuffer window,
-however.  You cannot switch buffers in it--the minibuffer and its
-window are permanently attached.  Also, you cannot split or kill the
-minibuffer window. But you can make it taller in the normal fashion with
-`C-x ^'.
-
-   If while in the minibuffer you issue a command that displays help
-text of any sort in another window, you can use the `C-M-v' command
-while in the minibuffer to scroll the help text.  This lasts until you
-exit the minibuffer.  This feature is especially useful if a completing
-minibuffer gives you a list of possible completions.  *Note Other
-Window::.
-
-   If the variable `minibuffer-confirm-incomplete' is `t', you are
-asked for confirmation if there is no known completion for the text you
-typed. For example, if you attempted to visit a non-existent file, the
-minibuffer might read:
-             Find File: chocolate_bar.c [no completions, confirm]
-   If you press `Return' again, that confirms the filename. Otherwise,
-you can continue editing it.
-
-   XEmacs supports recursive use of the minibuffer.  However, it is easy
-to do this by accident (because of autorepeating keyboards, for example)
-and get confused.  Therefore, most XEmacs commands that use the
-minibuffer refuse to operate if the minibuffer window is selected.  If
-the minibuffer is active but you have switched to a different window,
-recursive use of the minibuffer is allowed--if you know enough to try
-to do this, you probably will not get confused.
-
-   If you set the variable `enable-recursive-minibuffers' to a
-non-`nil', recursive use of the minibuffer is always allowed.
-
index d822f79..34adf30 100644 (file)
@@ -30,6 +30,105 @@ versions, except that the sections entitled "The GNU Manifesto",
 translation approved by the author instead of in the original English.
 
 \1f
+File: xemacs.info,  Node: Minibuffer File,  Next: Minibuffer Edit,  Prev: Minibuffer,  Up: Minibuffer
+
+Minibuffers for File Names
+==========================
+
+   Sometimes the minibuffer starts out with text in it.  For example,
+when you are supposed to give a file name, the minibuffer starts out
+containing the "default directory", which ends with a slash.  This is
+to inform you which directory the file will be found in if you do not
+specify a directory.
+
+   For example, the minibuffer might start out with these contents:
+
+     Find File: /u2/emacs/src/
+
+where `Find File: ' is the prompt.  Typing `buffer.c' specifies the
+file `/u2/emacs/src/buffer.c'.  To find files in nearby directories,
+use `..'; thus, if you type `../lisp/simple.el', you will get the file
+named `/u2/emacs/lisp/simple.el'.  Alternatively, you can kill with
+`M-<DEL>' the directory names you don't want (*note Words::).
+
+   If you don't want any of the default, you can kill it with `C-a
+C-k'.  But you don't need to kill the default; you can simply ignore it.
+Insert an absolute file name, one starting with a slash or a tilde,
+after the default directory.  For example, to specify the file
+`/etc/termcap', just insert that name, giving these minibuffer contents:
+
+     Find File: /u2/emacs/src//etc/termcap
+
+XEmacs gives a special meaning to a double slash (which is not normally
+a useful thing to write): it means, "ignore everything before the
+second slash in the pair."  Thus, `/u2/emacs/src/' is ignored in the
+example above, and you get the file `/etc/termcap'.
+
+   If you set `insert-default-directory' to `nil', the default
+directory is not inserted in the minibuffer.  This way, the minibuffer
+starts out empty.  But the name you type, if relative, is still
+interpreted with respect to the same default directory.
+
+\1f
+File: xemacs.info,  Node: Minibuffer Edit,  Next: Completion,  Prev: Minibuffer File,  Up: Minibuffer
+
+Editing in the Minibuffer
+=========================
+
+   The minibuffer is an XEmacs buffer (albeit a peculiar one), and the
+usual XEmacs commands are available for editing the text of an argument
+you are entering.
+
+   Since <RET> in the minibuffer is defined to exit the minibuffer, you
+can't use it to insert a newline in the minibuffer.  To do that, type
+`C-o' or `C-q C-j'.  (Recall that a newline is really the character
+control-J.)
+
+   The minibuffer has its own window which always has space on the
+screen but acts as if it were not there when the minibuffer is not in
+use.  When the minibuffer is in use, its window is just like the
+others; you can switch to another window with `C-x o', edit text in
+other windows and perhaps even visit more files, before returning to the
+minibuffer to submit the argument.  You can kill text in another window,
+return to the minibuffer window, and then yank the text to use it in the
+argument.  *Note Windows::.
+
+   There are some restrictions on the use of the minibuffer window,
+however.  You cannot switch buffers in it--the minibuffer and its
+window are permanently attached.  Also, you cannot split or kill the
+minibuffer window. But you can make it taller in the normal fashion with
+`C-x ^'.  If you enable Resize-Minibuffer mode, then the minibuffer
+window expands vertically as necessary to hold the text that you put in
+the minibuffer.  Use `M-x resize-minibuffer-mode' to enable or disable
+this minor mode (*note Minor Modes::).
+
+   If while in the minibuffer you issue a command that displays help
+text of any sort in another window, you can use the `C-M-v' command
+while in the minibuffer to scroll the help text.  This lasts until you
+exit the minibuffer.  This feature is especially useful if a completing
+minibuffer gives you a list of possible completions.  *Note Other
+Window::.
+
+   If the variable `minibuffer-confirm-incomplete' is `t', you are
+asked for confirmation if there is no known completion for the text you
+typed. For example, if you attempted to visit a non-existent file, the
+minibuffer might read:
+             Find File: chocolate_bar.c [no completions, confirm]
+   If you press `Return' again, that confirms the filename. Otherwise,
+you can continue editing it.
+
+   XEmacs supports recursive use of the minibuffer.  However, it is easy
+to do this by accident (because of autorepeating keyboards, for example)
+and get confused.  Therefore, most XEmacs commands that use the
+minibuffer refuse to operate if the minibuffer window is selected.  If
+the minibuffer is active but you have switched to a different window,
+recursive use of the minibuffer is allowed--if you know enough to try
+to do this, you probably will not get confused.
+
+   If you set the variable `enable-recursive-minibuffers' to a
+non-`nil', recursive use of the minibuffer is always allowed.
+
+\1f
 File: xemacs.info,  Node: Completion,  Next: Minibuffer History,  Prev: Minibuffer Edit,  Up: Minibuffer
 
 Completion
@@ -91,7 +190,7 @@ possibilities for the very next character--it could be any of `c-'--so
 no more characters are added; instead, <TAB> displays a list of all
 possible completions in another window.
 
-   If you go on to type `f <TAB>', this <TAB> sees `auto-f'.  The only
+   If you go on to type `-f <TAB>', this <TAB> sees `auto-f'.  The only
 command name starting this way is `auto-fill-mode', so completion fills
 in the rest of that.  You now have `auto-fill-mode' in the minibuffer
 after typing just `au <TAB> f <TAB>'.  Note that <TAB> has this effect
@@ -150,6 +249,14 @@ window that displays a list of completions:
      but you must click in the list of completions, not in the
      minibuffer itself.
 
+`<PRIOR>'
+`M-v'
+     Typing <PRIOR> or `M-v', while in the minibuffer, selects the
+     window showing the completion list buffer
+     (`switch-to-completions').  This paves the way for using the
+     commands below.  (Selecting that window in the usual ways has the
+     same effect, but this way is more convenient.)
+
 `<RET>'
      Typing <RET> _in the completion list buffer_ chooses the
      completion that point is in or next to (`choose-completion').  To
@@ -234,6 +341,10 @@ in contexts where `completing-read' allows answers that are not valid
 completions, an extra <RET> must be typed to confirm the response.
 This is helpful for catching typos.
 
+   Icomplete mode presents a constantly-updated display that tells you
+what completions are available for the text you've entered so far.  The
+command to enable or disable this minor mode is `M-x icomplete-mode'.
+
 \1f
 File: xemacs.info,  Node: Minibuffer History,  Next: Repetition,  Prev: Completion,  Up: Minibuffer
 
@@ -320,11 +431,11 @@ name.
      Re-execute a recent minibuffer command (`repeat-complex-command').
 
 `M-p'
-     Within `C-x <ESC>', move to previous recorded command
+     Within `C-x <ESC> <ESC>', move to previous recorded command
      (`previous-history-element').
 
 `M-n'
-     Within `C-x <ESC>', move to the next (more recent) recorded
+     Within `C-x <ESC> <ESC>', move to the next (more recent) recorded
      command (`next-history-element').
 
 `M-x list-command-history'
@@ -1116,87 +1227,3 @@ delimiter (to exclude it).  Finally, `C-x h' (`mark-whole-buffer') sets
 up the entire buffer as the region by putting point at the beginning
 and the mark at the end.
 
-\1f
-File: xemacs.info,  Node: Mark Ring,  Prev: Marking Objects,  Up: Mark
-
-The Mark Ring
--------------
-
-   Aside from delimiting the region, the mark is also useful for marking
-a spot that you may want to go back to.  To make this feature more
-useful, Emacs remembers 16 previous locations of the mark in the "mark
-ring".  Most commands that set the mark push the old mark onto this
-ring.  To return to a marked location, use `C-u C-<SPC>' (or `C-u
-C-@'); this is the command `set-mark-command' given a numeric argument.
-The command moves point to where the mark was, and restores the mark
-from the ring of former marks. Repeated use of this command moves point
-to all the old marks on the ring, one by one.  The marks you have seen
-go to the end of the ring, so no marks are lost.
-
-   Each buffer has its own mark ring.  All editing commands use the
-current buffer's mark ring.  In particular, `C-u C-<SPC>' always stays
-in the same buffer.
-
-   Many commands that can move long distances, such as `M-<'
-(`beginning-of-buffer'), start by setting the mark and saving the old
-mark on the mark ring.  This makes it easier for you to move back
-later.  Searches set the mark, unless they do not actually move point.
-When a command sets the mark, `Mark Set' is printed in the echo area.
-
-   The variable `mark-ring-max' is the maximum number of entries to
-keep in the mark ring.  If that many entries exist and another entry is
-added, the last entry in the list is discarded.  Repeating `C-u
-C-<SPC>' circulates through the entries that are currently in the ring.
-
-   The variable `mark-ring' holds the mark ring itself, as a list of
-marker objects in the order most recent first.  This variable is local
-in every buffer.
-
-\1f
-File: xemacs.info,  Node: Mouse Selection,  Next: Additional Mouse Operations,  Prev: Mark,  Up: Top
-
-Selecting Text with the Mouse
-=============================
-
-   If you are using XEmacs under X, you can use the mouse pointer to
-select text. (The normal mouse pointer is an I-beam, the same pointer
-that `xterm' uses.)
-
-   The glyph variable `text-pointer-glyph' controls the shape of the
-mouse pointer when over text.  You can also control the shape of the
-mouse pointer when over nontext using `nontext-pointer-glyph', and the
-shape of the mouse pointer when over the modeline using
-`modeline-pointer-glyph'. (Remember, you should use `set-glyph-image',
-not `setq', to set one of these variables.)
-
-   If you want to get fancy, you can set the foreground and background
-colors of the mouse pointer by setting the `pointer' face.
-
-   There are two ways to select a region of text with the mouse:
-
-   To select a word in text, double-click with the left mouse button
-while the mouse cursor is over the word.  The word is highlighted when
-selected. On monochrome monitors, a stippled background indicates that a
-region of text has been highlighted. On color monitors, a color
-background indicates highlighted text. You can triple-click to select
-whole lines.
-
-   To select an arbitrary region of text:
-
-  1. Move the mouse cursor over the character at the beginning of the
-     region of text you want to select.
-
-  2. Press and hold the left mouse button.
-
-  3. While holding the left mouse button down, drag the cursor to the
-     character at the end of the region of text you want to select.
-
-  4. Release the left mouse button.
-        The selected region of text is highlighted.
-
-   Once a region of text is selected, it becomes the primary X selection
-(*note Using X Selections::) as well as the Emacs selected region. You
-can paste it into other X applications and use the options from the
-Edit pull-down menu on it.  Since it is also the Emacs region, you can
-use Emacs region commands on it.
-
index 4204c58..0ce9a98 100644 (file)
@@ -1,3 +1,16 @@
+2000-05-28  Martin Buchholz <martin@xemacs.org>
+
+       * XEmacs 21.2.34 is released.
+
+2000-05-11  Ben Wing  <ben@xemacs.org>
+
+       * i.c (get_command): fix unused var warning.
+       
+       * make-docfile.c (MDGET):
+       * make-docfile.c (read_c_string):
+       rewrite and reindent -- handle closing doc string comment that's
+       not at beg of line.
+
 2000-05-01  Martin Buchholz <martin@xemacs.org>
 
        * XEmacs 21.2.33 is released.
index c3e3de9..e71f67b 100644 (file)
@@ -45,8 +45,6 @@ LIBS "@LIBS@"
 LISPDIR "@LISPDIR@"
 LISPDIR_USER_DEFINED "@LISPDIR_USER_DEFINED@"
 LN_S "@LN_S@"
-LOCKDIR "@LOCKDIR@"
-LOCKDIR_USER_DEFINED "@LOCKDIR_USER_DEFINED@"
 MAKE_SUBDIR "@MAKE_SUBDIR@"
 MODULEDIR "@MODULEDIR@"
 MODULEDIR_USER_DEFINED "@MODULEDIR_USER_DEFINED@"
@@ -116,7 +114,6 @@ libexecdir "@libexecdir@"
 libs_xauth "@libs_xauth@"
 lispdir "@lispdir@"
 localstatedir "@localstatedir@"
-lockdir "@lockdir@"
 lwlib_objs "@lwlib_objs@"
 machfile "@machfile@"
 mandir "@mandir@"
index 1bec21f..097b311 100644 (file)
@@ -90,7 +90,7 @@ start_pump (I_connector* pi)
 static LPTSTR
 get_command (void)
 {
-  LPTSTR q, ws, cl = GetCommandLine ();
+  LPTSTR cl = GetCommandLine ();
   int ix;
 
   while (1)
index 141287a..d971a11 100644 (file)
@@ -303,48 +303,59 @@ char buf[128];
  Convert escape sequences \n and \t to newline and tab;
  discard \ followed by newline.  */
 
+#define MDGET do { prevc = c; c = getc (infile); } while (0)
 static int
 read_c_string (FILE *infile, int printflag, int c_docstring)
 {
-  register int c;
+  register int prevc = 0, c = 0;
   char *p = buf;
   int start = -1;
 
-  c = getc (infile);
+  MDGET;
   while (c != EOF)
     {
       while ((c_docstring || c != '"') && c != EOF)
        {
-         if (start)
+         if (c == '*')
            {
-             if (c == '*')
+             int cc = getc (infile);
+             if (cc == '/')
                {
-                 int cc = getc (infile);
-                 if (cc == '/')
-                   break;
-                 else
-                   ungetc (cc, infile);
+                 if (prevc != '\n')
+                   {
+                     if (printflag > 0)
+                       {
+                         if (ellcc)
+                           fprintf (outfile, "\\n\\");
+                         putc ('\n', outfile);
+                       }
+                     else if (printflag < 0)
+                       *p++ = '\n';
+                   }
+                 break;
                }
+             else
+               ungetc (cc, infile);
+           }
 
-             if (start != -1)
+         if (start == 1)
+           {
+             if (printflag > 0)
                {
-                 if (printflag > 0)
-            {
-              if (ellcc)
-                fprintf (outfile, "\\n\\");
-              putc ('\n', outfile);
-            }
-                 else if (printflag < 0)
-                   *p++ = '\n';
+                 if (ellcc)
+                   fprintf (outfile, "\\n\\");
+                 putc ('\n', outfile);
                }
+             else if (printflag < 0)
+               *p++ = '\n';
            }
 
          if (c == '\\')
            {
-             c = getc (infile);
+             MDGET;
              if (c == '\n')
                {
-                 c = getc (infile);
+                 MDGET;
                  start = 1;
                  continue;
                }
@@ -358,32 +369,36 @@ read_c_string (FILE *infile, int printflag, int c_docstring)
          else
            {
              start = 0;
-             if (printflag > 0) {
-                if (ellcc && c == '"')
-                  putc ('\\', outfile);
-               putc (c, outfile);
-              }
+             if (printflag > 0)
+               {
+                 if (ellcc && c == '"')
+                   putc ('\\', outfile);
+                 putc (c, outfile);
+               }
              else if (printflag < 0)
                *p++ = c;
            }
-         c = getc (infile);
+         MDGET;
        }
       /* look for continuation of string */
       if (Current_file_type == c_file)
        {
-         while (isspace (c = getc (infile)))
-           ;
+         do
+           {
+             MDGET;
+           }
+         while (isspace (c));
          if (c != '"')
            break;
        }
       else
        {
-         c = getc (infile);
+         MDGET;
          if (c != '"')
            break;
          /* If we had a "", concatenate the two strings.  */
        }
-      c = getc (infile);
+      MDGET;
     }
 
   if (printflag < 0)
index bc53514..8793cb0 100644 (file)
@@ -1,3 +1,196 @@
+2000-05-28  Martin Buchholz <martin@xemacs.org>
+
+       * XEmacs 21.2.34 is released.
+
+2000-05-20  Karl M. Hegbloom  <karlheg@bittersweet.inetarena.com>
+
+       * font-lock.el (font-lock-keywords): Rewrote docstring
+
+2000-05-22  Karl M. Hegbloom  <karlheg@debian.org>
+
+       * loadhist.el (unload-feature): handle case where x is both boundp
+       and fboundp
+
+2000-05-22  Karl M. Hegbloom  <karlheg@debian.org>
+
+       * packages.el: It's ok to use built-in macros, but not lisp
+       defined ones.
+
+2000-05-20  Ben Wing  <ben@xemacs.org>
+
+       * font-lock.el:
+       * font-lock.el (font-lock-message-threshold):
+       * font-lock.el (font-lock-mode):
+       * font-lock.el (font-lock-default-fontify-buffer):
+       * font-lock.el (font-lock-always-fontify-immediately):
+       * font-lock.el (font-lock-old-extent): Removed.
+       * font-lock.el (font-lock-old-len): Removed.
+       * font-lock.el (font-lock-fontify-glumped-region): Removed.
+       * font-lock.el (font-lock-pending-extent-table): New.
+       * font-lock.el (font-lock-range-table): New.
+       * font-lock.el (font-lock-after-change-function):
+       * font-lock.el (font-lock-after-change-function-1): Removed.
+       * font-lock.el (font-lock-fontify-pending-extents): New.
+       * font-lock.el ('font-lock-revert-cleanup): Removed.
+       * font-lock.el ('font-lock-revert-setup): Removed.
+       Rewrite deferral code to handle any number of changes, merging
+       them properly.  Remove hacked-up code for revert-buffer, now
+       unnecessary.
+       
+       * menubar-items.el (default-menubar):
+       In Options->Edit Init File, don't switch to emacs-lisp-mode
+       unless necessary; doing this turns off font-lock.
+
+2000-05-15  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * keydefs.el: Define C-x BS to backward-kill-sentence.
+
+2000-05-15  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * files.el (hack-local-variables-prop-line): Use non-greedy
+       matching to process -*-texinfo-*- -*-.
+
+2000-05-11  Jonathan Marten <jonathan.marten@uk.sun.com>
+
+       * minibuf.el (minibuf-directory-files): new function.
+       (read-file-name-activate-callback): use minibuf-directory-files.
+       (read-directory-name-internal): ditto.
+       (mouse-file-display-completion-list): ditto.
+       (mouse-directory-display-completion-list): ditto.
+       (read-file-name-internal): remove "./" from completion list unless
+       explicitly matched, for consistency.
+
+2000-05-11  Ben Wing  <ben@xemacs.org>
+
+       * gutter-items.el (gutter-buffers-tab):
+       * gutter-items.el (add-tab-to-gutter):
+       * gutter-items.el (update-tab-in-gutter):
+       * gutter-items.el (remove-buffer-from-gutter-tab): Removed.
+       * gutter-items.el (append-progress-display):
+       * gutter-items.el (abort-progress-display):
+       * gutter-items.el (raw-append-progress-display):
+       Further fixes.  Use set-glyph-image not set-image-instance-property,
+       to fix problems with multiple windows in a frame.
+       
+       * menubar-items.el (tutorials-menu-filter):
+       Fix typo.
+       
+       * startup.el (early-error-handler):
+       Display message box under windows; otherwise, message will disappear
+       before it can be viewed.
+       
+       * update-elc.el:
+       Fix bug in NEEDTODUMP processing.
+
+2000-05-08  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * startup.el (lock-directory): Removed.
+       (superlock-file): Ditto.
+       (startup-set-paths): Remove lockdir.
+       (startup-setup-paths-warning): Remove lock-directory.
+
+       * setup-paths.el (paths-find-lock-directory): Removed.
+       (paths-find-superlock-file): Ditto.
+
+2000-05-09  Ben Wing  <ben@xemacs.org>
+
+       * faces.el (set-face-property):
+       * faces.el (set-face-font):
+       * faces.el (set-face-foreground):
+       * faces.el (set-face-background):
+       * faces.el (set-face-background-pixmap):
+       * faces.el (set-face-underline-p):
+       * faces.el (set-face-strikethru-p):
+       * faces.el (set-face-highlight-p):
+       * faces.el (set-face-dim-p):
+       * faces.el (set-face-blinking-p):
+       * faces.el (set-face-reverse-p):
+       doc string changes.
+       
+       * glyphs.el:
+       * glyphs.el (make-image-specifier):
+       * glyphs.el (glyph-property):
+       * glyphs.el (set-glyph-image):
+       * glyphs.el (make-glyph):
+       * glyphs.el (make-pointer-glyph):
+       * glyphs.el (make-icon-glyph):
+       * glyphs.el (widget-image-instance-p): New.
+       authorship info, lots of doc changes.  New predicate, inadvertently
+       omitted.  the general principle with specifier docs is now that
+       the description of instantiators should go with the make-foo-specifier
+       fun's doc string, rather than in foo-specifier-p.  this follows
+       conventions elsewhere in XEmacs and in general is a lot more obvious
+       of a place to look.  sometimes the make-foo-specifier function needs
+       to be created in the process.
+       
+       * gutter.el:
+       * gutter.el (make-gutter-specifier): New.
+       * gutter.el (make-gutter-size-specifier): New.
+       * gutter.el (make-gutter-visible-specifier): New.
+       specifier doc updates according to the conventions specified before.
+
+       * objects.el:
+       * objects.el (make-font-specifier):
+       * objects.el (make-color-specifier):
+       * objects.el (make-face-boolean-specifier): New.
+       specifier doc updates according to the conventions specified before.
+
+       * specifier.el:
+       * specifier.el (set-specifier):
+       * specifier.el (make-integer-specifier): New.
+       * specifier.el (make-boolean-specifier): New.
+       * specifier.el (make-natnum-specifier): New.
+       * specifier.el (make-generic-specifier): New.
+       * specifier.el (make-display-table-specifier): New.
+       specifier doc updates according to the conventions specified before.
+
+       * toolbar.el:
+       * toolbar.el (make-toolbar-specifier): New.
+       specifier doc updates according to the conventions specified before.
+
+2000-05-09  Ben Wing  <ben@xemacs.org>
+
+       * process.el (call-process-internal): Revert to previous version
+       because Mike's change clashed with a change I did not long before.
+       Changed progn to prog1 to fix the bug pointed out by Mike Alexander.
+       Thanks very much Mike for pointing out the bug and submitting a
+       patch!
+
+2000-04-13  Mike Alexander  <mta@arbortext.com>
+
+       * process.el (call-process-internal): Send the correct input buffer
+       (call-process-internal): Return the exit status of the process
+
+2000-05-07  Ben Wing  <ben@xemacs.org>
+
+       * winnt.el:
+       * winnt.el (nt-quote-args-verbatim): Removed.
+       * winnt.el (nt-quote-args-prefix-quote): Removed.
+       * winnt.el (nt-quote-args-backslash-quote): Removed.
+       * winnt.el (nt-quote-args-double-quote): Removed.
+       * winnt.el (nt-quote-args-functions-alist): Removed.
+       * winnt.el (nt-quote-process-args): Removed.
+       Remove all stuff for argument quoting.  We borrow the code instead
+       from Emacs 20.6, which is much more careful in its quoting
+       (e.g. in handling runs of the escape character) and avoids most of
+       the need for this Lisp mechanism by checking to see whether we're
+       running a Cygwin or normal program and doing the appropriate
+       quoting.  If we end up needing such a mechanism, we should add
+       it by extending the variable `mswindows-quote-process-args' so it
+       can take an alist of regexps.
+
+2000-05-07  Ben Wing  <ben@xemacs.org>
+
+       * keydefs.el:
+       Restore M-up, M-down to 21.1 state.  Put *ward-sentence on
+       C-M-left, C-M-right instead.  Define C-M-up, C-M-down to scroll
+       the window without moving point.
+       
+       * simple.el:
+       * simple.el (scroll-up-one): New.
+       * simple.el (scroll-down-one): New.
+       Functions for use with C-M-up/down.
+
 2000-05-01  Martin Buchholz <martin@xemacs.org>
 
        * XEmacs 21.2.33 is released.
index 242478a..21ff01b 100644 (file)
@@ -60,8 +60,8 @@
 (custom-add-loads 'files '("files"))
 (custom-add-loads 'build '("build-report"))
 (custom-add-loads 'font-lock '("font-lock"))
-(custom-add-loads 'external '("process" "cus-edit"))
-(custom-add-loads 'development '("process" "lisp-mode" "cus-edit"))
+(custom-add-loads 'external '("process2" "cus-edit"))
+(custom-add-loads 'development '("process2" "lisp-mode" "cus-edit"))
 (custom-add-loads 'gnuserv '("gnuserv"))
 (custom-add-loads 'gutter '("gutter" "gutter-items"))
 (custom-add-loads 'fill-comments '("simple"))
@@ -73,7 +73,7 @@
 (custom-add-loads 'display '("toolbar" "scrollbar" "auto-show"))
 (custom-add-loads 'faces '("faces" "font" "cus-edit" "font-lock" "hyper-apropos" "info" "wid-edit"))
 (custom-add-loads 'emacs '("faces" "help" "files" "cus-edit" "package-get"))
-(custom-add-loads 'processes '("process" "gnuserv"))
+(custom-add-loads 'processes '("process2" "gnuserv"))
 (custom-add-loads 'hyper-apropos '("hyper-apropos"))
 (custom-add-loads 'wp '("printer" "cus-edit"))
 (custom-add-loads 'vc '("files"))
index 616c510..d149cb0 100644 (file)
@@ -292,41 +292,41 @@ If PROPERTY is not a built-in property, then this function will
 The following symbols have predefined meanings:
 
  foreground         The foreground color of the face.
-                    For valid instantiators, see `color-specifier-p'.
+                    For valid instantiators, see `make-color-specifier'.
 
  background         The background color of the face.
-                    For valid instantiators, see `color-specifier-p'.
+                    For valid instantiators, see `make-color-specifier'.
 
  font               The font used to display text covered by this face.
-                    For valid instantiators, see `font-specifier-p'.
+                    For valid instantiators, see `make-font-specifier'.
 
  display-table      The display table of the face.
                     This should be a vector of 256 elements.
 
  background-pixmap  The pixmap displayed in the background of the face.
                     Only used by faces on X devices.
-                    For valid instantiators, see `image-specifier-p'.
+                    For valid instantiators, see `make-image-specifier'.
 
  underline          Underline all text covered by this face.
-                    For valid instantiators, see `face-boolean-specifier-p'.
+                    For valid instantiators, see `make-face-boolean-specifier'.
 
  strikethru         Draw a line through all text covered by this face.
-                    For valid instantiators, see `face-boolean-specifier-p'.
+                    For valid instantiators, see `make-face-boolean-specifier'.
 
  highlight          Highlight all text covered by this face.
                     Only used by faces on TTY devices.
-                    For valid instantiators, see `face-boolean-specifier-p'.
+                    For valid instantiators, see `make-face-boolean-specifier'.
 
  dim                Dim all text covered by this face.
-                    For valid instantiators, see `face-boolean-specifier-p'.
+                    For valid instantiators, see `make-face-boolean-specifier'.
 
  blinking           Blink all text covered by this face.
                     Only used by faces on TTY devices.
-                    For valid instantiators, see `face-boolean-specifier-p'.
+                    For valid instantiators, see `make-face-boolean-specifier'.
 
  reverse            Reverse the foreground and background colors.
                     Only used by faces on TTY devices.
-                    For valid instantiators, see `face-boolean-specifier-p'.
+                    For valid instantiators, see `make-face-boolean-specifier'.
 
  doc-string         Description of what the face's normal use is.
                     NOTE: This is not a specifier, unlike all
@@ -433,7 +433,7 @@ See `face-property-instance' for more information."
 
 FACE may be either a face object or a symbol representing a face.
 
-FONT should be an instantiator (see `font-specifier-p'), a list of
+FONT should be an instantiator (see `make-font-specifier'), a list of
   instantiators, an alist of specifications (each mapping a
   locale to an instantiator list), or a font specifier object.
 
@@ -490,7 +490,7 @@ See `face-property-instance' for more information."
 
 FACE may be either a face object or a symbol representing a face.
 
-COLOR should be an instantiator (see `color-specifier-p'), a list of
+COLOR should be an instantiator (see `make-color-specifier'), a list of
   instantiators, an alist of specifications (each mapping a locale to
   an instantiator list), or a color specifier object.
 
@@ -547,7 +547,7 @@ See `face-property-instance' for more information."
 
 FACE may be either a face object or a symbol representing a face.
 
-COLOR should be an instantiator (see `color-specifier-p'), a list of
+COLOR should be an instantiator (see `make-color-specifier'), a list of
   instantiators, an alist of specifications (each mapping a locale to
   an instantiator list), or a color specifier object.
 
@@ -595,7 +595,7 @@ This property is only used on window system devices.
 
 FACE may be either a face object or a symbol representing a face.
 
-PIXMAP should be an instantiator (see `image-specifier-p'), a list
+PIXMAP should be an instantiator (see `make-image-specifier'), a list
   of instantiators, an alist of specifications (each mapping a locale
   to an instantiator list), or an image specifier object.
 
@@ -652,7 +652,7 @@ See `face-property-instance' for the semantics of the DOMAIN argument."
                                  how-to-add)
   "Change the underline property of FACE to UNDERLINE-P.
 UNDERLINE-P is normally a face-boolean instantiator; see
- `face-boolean-specifier-p'.
+ `make-face-boolean-specifier'.
 See `set-face-property' for the semantics of the LOCALE, TAG-SET, and
  HOW-TO-ADD arguments."
   (interactive (face-interactive "underline-p" "underlined"))
@@ -667,7 +667,7 @@ See `face-property-instance' for the semantics of the DOMAIN argument."
                                  how-to-add)
   "Change whether FACE is strikethru-d (i.e. struck through) in LOCALE.
 STRIKETHRU-P is normally a face-boolean instantiator; see
- `face-boolean-specifier-p'.
+ `make-face-boolean-specifier'.
 See `set-face-property' for the semantics of the LOCALE, TAG-SET, and
  HOW-TO-ADD arguments."
   (interactive (face-interactive "strikethru-p" "strikethru-d"))
@@ -682,7 +682,7 @@ See `face-property-instance' for the semantics of the DOMAIN argument."
                                  how-to-add)
   "Change whether FACE is highlighted in LOCALE (TTY locales only).
 HIGHLIGHT-P is normally a face-boolean instantiator; see
- `face-boolean-specifier-p'.
+ `make-face-boolean-specifier'.
 See `set-face-property' for the semantics of the LOCALE, TAG-SET, and
  HOW-TO-ADD arguments."
   (interactive (face-interactive "highlight-p" "highlighted"))
@@ -696,7 +696,7 @@ See `face-property-instance' for the semantics of the DOMAIN argument."
 (defun set-face-dim-p (face dim-p &optional locale tag-set how-to-add)
   "Change whether FACE is dimmed in LOCALE.
 DIM-P is normally a face-boolean instantiator; see
- `face-boolean-specifier-p'.
+ `make-face-boolean-specifier'.
 See `set-face-property' for the semantics of the LOCALE, TAG-SET, and
  HOW-TO-ADD arguments."
   (interactive (face-interactive "dim-p" "dimmed"))
@@ -711,7 +711,7 @@ See `face-property-instance' for the semantics of the DOMAIN argument."
                                 how-to-add)
   "Change whether FACE is blinking in LOCALE (TTY locales only).
 BLINKING-P is normally a face-boolean instantiator; see
- `face-boolean-specifier-p'.
+ `make-face-boolean-specifier'.
 See `set-face-property' for the semantics of the LOCALE, TAG-SET, and
  HOW-TO-ADD arguments."
   (interactive (face-interactive "blinking-p" "blinking"))
@@ -725,7 +725,7 @@ See `face-property-instance' for the semantics of the DOMAIN argument."
 (defun set-face-reverse-p (face reverse-p &optional locale tag-set how-to-add)
   "Change whether FACE is reversed in LOCALE (TTY locales only).
 REVERSE-P is normally a face-boolean instantiator; see
- `face-boolean-specifier-p'.
+ `make-face-boolean-specifier'.
 See `set-face-property' for the semantics of the LOCALE, TAG-SET, and
  HOW-TO-ADD arguments."
   (interactive (face-interactive "reverse-p" "reversed"))
index f38a941..7a64a89 100644 (file)
@@ -1542,7 +1542,7 @@ for current buffer."
        (cond ((not (search-forward "-*-" end t))
               ;; doesn't have one.
               (setq force t))
-             ((looking-at "[ \t]*\\([^ \t\n\r:;]+\\)\\([ \t]*-\\*-\\)")
+             ((looking-at "[ \t]*\\([^ \t\n\r:;]+?\\)\\([ \t]*-\\*-\\)")
               ;; Antiquated form: "-*- ModeName -*-".
               (setq result
                     (list (cons 'mode
index 3969793..ce98ccc 100644 (file)
@@ -178,8 +178,8 @@ The size is measured in characters.  This affects `font-lock-fontify-region'
 but not `font-lock-fontify-buffer'. (In other words, when you first visit
 a file and it gets fontified, you will see status messages no matter what
 size the file is.  However, if you do something else like paste a
-chunk of text or revert a buffer, you will see status messages only if the
-changed region is large enough.)
+chunk of text, you will see status messages only if the changed region is
+large enough.)
 
 Note that setting `font-lock-verbose' to nil disables the status
 messages entirely."
@@ -318,95 +318,123 @@ megabyte for buffers in `rmail-mode', and size is irrelevant otherwise."
 
 ;;;###autoload
 (defvar font-lock-keywords nil
-  "A list of the keywords to highlight.
-Each element should be of the form:
-
- MATCHER
- (MATCHER . MATCH)
- (MATCHER . FACENAME)
- (MATCHER . HIGHLIGHT)
- (MATCHER HIGHLIGHT ...)
- (eval . FORM)
-
-where HIGHLIGHT should be either MATCH-HIGHLIGHT or MATCH-ANCHORED.
-
-FORM is an expression, whose value should be a keyword element,
-evaluated when the keyword is (first) used in a buffer.  This feature
-can be used to provide a keyword that can only be generated when Font
-Lock mode is actually turned on.
+  "A list defining the keywords for `font-lock-mode' to highlight.
+
+ FONT-LOCK-KEYWORDS := List of FONT-LOCK-FORM's.
+
+ FONT-LOCK-FORM     :== MATCHER
+                      | (MATCHER . MATCH)
+                      | (MATCHER . FACE-FORM)
+                      | (MATCHER . HIGHLIGHT)
+                      | (MATCHER HIGHLIGHT ...)
+                      | (eval . FORM)
+
+ MATCHER            :== A string containing a regexp.
+                      | A variable containing a regexp to search for.
+                      | A function to call to make the search.
+                        It is called with one arg, the limit of the search,
+                        and should leave MATCH results in the XEmacs global
+                        match data.
+
+ MATCH              :== An integer match subexpression number from MATCHER.
+
+ FACE-FORM           :== The symbol naming a defined face.
+                      | Expression whos value is the face name to use.  If you
+                        want FACE-FORM to be a symbol that evaluates to a face,
+                        use a form like \"(progn sym)\".
+
+ HIGHLIGHT          :== MATCH-HIGHLIGHT
+                      | MATCH-ANCHORED
+
+ FORM               :== Expression returning a FONT-LOCK-FORM, evaluated when
+                        the FONT-LOCK-FORM is first used in a buffer.  This
+                        feature can be used to provide a FONT-LOCK-FORM that
+                        can only be generated when Font Lock mode is actually
+                        turned on.
+
+ MATCH-HIGHLIGHT    :== (MATCH FACE-FORM OVERRIDE LAXMATCH)
+
+ OVERRIDE           :== t        - overwrite existing fontification
+                      | 'keep    - only parts not already fontified are
+                                   highlighted.
+                      | 'prepend - merge faces, this fontification has
+                                   precedence over existing
+                      | 'append  - merge faces, existing fontification has
+                                   precedence over
+                                   this face.
+
+ LAXMATCH           :== If non-nil, no error is signalled if there is no MATCH
+                        in MATCHER.
+
+ MATCH-ANCHORED     :== (ANCHOR-MATCHER PRE-MATCH-FORM \\
+                                          POST-MATCH-FORM MATCH-HIGHLIGHT ...)
+
+ ANCHOR-MATCHER     :== Like a MATCHER, except that the limit of the search
+                        defaults to the end of the line after PRE-MATCH-FORM
+                        is evaluated.  However, if PRE-MATCH-FORM returns a
+                        position greater than the end of the line, that
+                        position is used as the limit of the search.  It is
+                        generally a bad idea to return a position greater than
+                        the end of the line, i.e., cause the ANCHOR-MATCHER
+                        search to span lines.
+
+ PRE-MATCH-FORM     :== Evaluated before the ANCHOR-MATCHER is used, therefore
+                        can be used to initialize before, ANCHOR-MATCHER is
+                        used.  Typically, PRE-MATCH-FORM is used to move to
+                        some position relative to the original MATCHER, before
+                        starting with the ANCHOR-MATCHER.
+
+ POST-MATCH-FORM    :== Like PRE-MATCH-FORM, but used to clean up after the
+                        ANCHOR-MATCHER.  It might be used to move, before
+                        resuming with MATCH-ANCHORED's parent's MATCHER.
+
+For example, an element of the first form highlights (if not already highlighted):
+
+  \"\\\\<foo\\\\>\"                    Discrete occurrences of \"foo\" in the value
+                                 of the variable `font-lock-keyword-face'.
+
+  (\"fu\\\\(bar\\\\)\" . 1)            Substring \"bar\" within all occurrences of
+                                 \"fubar\" in the value of
+                                 `font-lock-keyword-face'.
+
+  (\"fubar\" . fubar-face)         Occurrences of \"fubar\" in the value of
+                                 `fubar-face'.
+
+  (\"foo\\\\|bar\" 0 foo-bar-face t) Occurrences of either \"foo\" or \"bar\" in the
+                                 value of `foo-bar-face', even if already
+                                 highlighted.
+
+  (fubar-match 1 fubar-face)     The first subexpression within all
+                                 occurrences of whatever the function
+                                 `fubar-match' finds and matches in the value
+                                 of `fubar-face'.
+
+  (\"\\\\<anchor\\\\>\" (0 anchor-face) (\"\\\\<item\\\\>\" nil nil (0 item-face)))
+   -------------- ---------------  ------------ --- --- -------------
+       |            |               |            |   |          |
+   MATCHER          |         ANCHOR-MATCHER     |   +------+ MATCH-HIGHLIGHT
+             MATCH-HIGHLIGHT                 PRE-MATCH-FORM |
+                                                           POST-MATCH-FORM
+
+  Discrete occurrences of \"anchor\" in the value of `anchor-face', and
+  subsequent discrete occurrences of \"item\" (on the same line) in the value
+  of `item-face'.  (Here PRE-MATCH-FORM and POST-MATCH-FORM are nil.
+  Therefore \"item\" is initially searched for starting from the end of the
+  match of \"anchor\", and searching for subsequent instance of \"anchor\"
+  resumes from where searching for \"item\" concluded.)
 
 For highlighting single items, typically only MATCH-HIGHLIGHT is required.
-However, if an item or (typically) items is to be highlighted following the
-instance of another item (the anchor) then MATCH-ANCHORED may be required.
-
-MATCH-HIGHLIGHT should be of the form:
-
- (MATCH FACENAME OVERRIDE LAXMATCH)
-
-Where MATCHER can be either the regexp to search for, a variable
-containing the regexp to search for, or the function to call to make
-the search (called with one argument, the limit of the search).  MATCH
-is the subexpression of MATCHER to be highlighted.  FACENAME is either
-a symbol naming a face, or an expression whose value is the face name
-to use.  If you want FACENAME to be a symbol that evaluates to a face,
-use a form like \"(progn sym)\".
-
-OVERRIDE and LAXMATCH are flags.  If OVERRIDE is t, existing fontification may
-be overwritten.  If `keep', only parts not already fontified are highlighted.
-If `prepend' or `append', existing fontification is merged with the new, in
-which the new or existing fontification, respectively, takes precedence.
-If LAXMATCH is non-nil, no error is signalled if there is no MATCH in MATCHER.
-
-For example, an element of the form highlights (if not already highlighted):
-
- \"\\\\\\=<foo\\\\\\=>\"               Discrete occurrences of \"foo\" in the value of the
-                       variable `font-lock-keyword-face'.
- (\"fu\\\\(bar\\\\)\" . 1)     Substring \"bar\" within all occurrences of \"fubar\" in
-                       the value of `font-lock-keyword-face'.
- (\"fubar\" . fubar-face)      Occurrences of \"fubar\" in the value of `fubar-face'.
- (\"foo\\\\|bar\" 0 foo-bar-face t)
-                       Occurrences of either \"foo\" or \"bar\" in the value
-                       of `foo-bar-face', even if already highlighted.
-
-MATCH-ANCHORED should be of the form:
-
- (MATCHER PRE-MATCH-FORM POST-MATCH-FORM MATCH-HIGHLIGHT ...)
-
-Where MATCHER is as for MATCH-HIGHLIGHT with one exception; see below.
-PRE-MATCH-FORM and POST-MATCH-FORM are evaluated before the first, and after
-the last, instance MATCH-ANCHORED's MATCHER is used.  Therefore they can be
-used to initialize before, and cleanup after, MATCHER is used.  Typically,
-PRE-MATCH-FORM is used to move to some position relative to the original
-MATCHER, before starting with MATCH-ANCHORED's MATCHER.  POST-MATCH-FORM might
-be used to move, before resuming with MATCH-ANCHORED's parent's MATCHER.
-
-For example, an element of the form highlights (if not already highlighted):
-
- (\"\\\\\\=<anchor\\\\\\=>\" (0 anchor-face) (\"\\\\\\=<item\\\\\\=>\" nil nil (0 item-face)))
-
- Discrete occurrences of \"anchor\" in the value of `anchor-face', and subsequent
- discrete occurrences of \"item\" (on the same line) in the value of `item-face'.
- (Here PRE-MATCH-FORM and POST-MATCH-FORM are nil.  Therefore \"item\" is
- initially searched for starting from the end of the match of \"anchor\", and
- searching for subsequent instance of \"anchor\" resumes from where searching
- for \"item\" concluded.)
-
-The above-mentioned exception is as follows.  The limit of the MATCHER search
-defaults to the end of the line after PRE-MATCH-FORM is evaluated.
-However, if PRE-MATCH-FORM returns a position greater than the position after
-PRE-MATCH-FORM is evaluated, that position is used as the limit of the search.
-It is generally a bad idea to return a position greater than the end of the
-line, i.e., cause the MATCHER search to span lines.
-
-Note that the MATCH-ANCHORED feature is experimental; in the future, we may
-replace it with other ways of providing this functionality.
+However, if an item or (typically) several items are to be highlighted
+following the instance of another item (the anchor) then MATCH-ANCHORED may be
+required.
 
 These regular expressions should not match text which spans lines.  While
-\\[font-lock-fontify-buffer] handles multi-line patterns correctly, updating
-when you edit the buffer does not, since it considers text one line at a time.
+\\[font-lock-fontify-buffer] handles multi-line patterns correctly, updating when you
+edit the buffer does not, since it considers text one line at a time.
 
-Be very careful composing regexps for this list;
-the wrong pattern can dramatically slow things down!")
+Be very careful composing regexps for this list; the wrong pattern can
+dramatically slow things down!
+")
 ;;;###autoload
 (make-variable-buffer-local 'font-lock-keywords)
 
@@ -829,11 +857,6 @@ See the variable `font-lock-keywords' for customization."
     (set (make-local-variable 'font-lock-mode) on-p)
     (cond (on-p
           (font-lock-set-defaults-1)
-          (make-local-hook 'before-revert-hook)
-          (make-local-hook 'after-revert-hook)
-          ;; If buffer is reverted, must clean up the state.
-          (add-hook 'before-revert-hook 'font-lock-revert-setup nil t)
-          (add-hook 'after-revert-hook 'font-lock-revert-cleanup nil t)
           (run-hooks 'font-lock-mode-hook)
           (cond (font-lock-fontified
                  nil)
@@ -845,13 +868,9 @@ See the variable `font-lock-keywords' for customization."
                             (buffer-name)))))
          (font-lock-fontified
           (setq font-lock-fontified nil)
-          (remove-hook 'before-revert-hook 'font-lock-revert-setup t)
-          (remove-hook 'after-revert-hook 'font-lock-revert-cleanup t)
           (font-lock-unfontify-region (point-min) (point-max))
           (font-lock-thing-lock-cleanup))
          (t
-          (remove-hook 'before-revert-hook 'font-lock-revert-setup t)
-          (remove-hook 'after-revert-hook 'font-lock-revert-cleanup t)
           (font-lock-thing-lock-cleanup)))
     (redraw-modeline)))
 
@@ -974,45 +993,46 @@ This can take a while for large buffers."
 (defun font-lock-unfontify-region (beg end &optional loudly)
   (funcall font-lock-unfontify-region-function beg end loudly))
 
-;; #### In these functions, the FSF is careful to do
-;; (save-restriction
-;;   (widen)
-;; before anything else.  Should we copy?
 (defun font-lock-default-fontify-buffer ()
   (interactive)
-  (let ((was-on font-lock-mode)
-       (font-lock-verbose (or font-lock-verbose (interactive-p)))
-       (font-lock-message-threshold 0)
-       (aborted nil))
-    ;; Turn it on to run hooks and get the right font-lock-keywords.
-    (or was-on (font-lock-mode 1))
-    (font-lock-unfontify-region (point-min) (point-max) t)
-;;    (buffer-syntactic-context-flush-cache)
+  ;; if we don't widen, then the C code will fail to
+  ;; realize that we're inside a comment.
+  (save-restriction
+    (widen)
+    (let ((was-on font-lock-mode)
+         (font-lock-verbose (or font-lock-verbose (interactive-p)))
+         (font-lock-message-threshold 0)
+         (aborted nil))
+      ;; Turn it on to run hooks and get the right font-lock-keywords.
+      (or was-on (font-lock-mode 1))
+      (font-lock-unfontify-region (point-min) (point-max) t)
+      ;;    (buffer-syntactic-context-flush-cache)
     
-    ;; If a ^G is typed during fontification, abort the fontification, but
-    ;; return normally (do not signal.)  This is to make it easy to abort
-    ;; fontification if it's taking a long time, without also causing the
-    ;; buffer not to pop up.  If a real abort is desired, the user can ^G
-    ;; again.
-    ;;
-    ;; Possibly this should happen down in font-lock-fontify-region instead
-    ;; of here, but since that happens from the after-change-hook (meaning
-    ;; much more frequently) I'm afraid of the bad consequences of stealing
-    ;; the interrupt character at inopportune times.
-    ;;
-    (condition-case nil
-       (save-excursion
-         (font-lock-fontify-region (point-min) (point-max)))
-      (t
-       (setq aborted t)))
-
-    (or was-on         ; turn it off if it was off.
-       (let ((font-lock-fontified nil)) ; kludge to prevent defontification
-         (font-lock-mode 0)))
-    (set (make-local-variable 'font-lock-fontified) t)
-    (when (and aborted font-lock-verbose)
-      (lprogress-display 'font-lock "Fontifying %s... aborted." 'abort (buffer-name))))
-  (run-hooks 'font-lock-after-fontify-buffer-hook))
+      ;; If a ^G is typed during fontification, abort the fontification, but
+      ;; return normally (do not signal.)  This is to make it easy to abort
+      ;; fontification if it's taking a long time, without also causing the
+      ;; buffer not to pop up.  If a real abort is desired, the user can ^G
+      ;; again.
+      ;;
+      ;; Possibly this should happen down in font-lock-fontify-region instead
+      ;; of here, but since that happens from the after-change-hook (meaning
+      ;; much more frequently) I'm afraid of the bad consequences of stealing
+      ;; the interrupt character at inopportune times.
+      ;;
+      (condition-case nil
+         (save-excursion
+           (font-lock-fontify-region (point-min) (point-max)))
+       (t
+        (setq aborted t)))
+
+      (or was-on                       ; turn it off if it was off.
+         (let ((font-lock-fontified nil)) ; kludge to prevent defontification
+           (font-lock-mode 0)))
+      (set (make-local-variable 'font-lock-fontified) t)
+      (when (and aborted font-lock-verbose)
+       (lprogress-display 'font-lock "Fontifying %s... aborted."
+                          'abort (buffer-name))))
+    (run-hooks 'font-lock-after-fontify-buffer-hook)))
 
 (defun font-lock-default-unfontify-buffer ()
   (font-lock-unfontify-region (point-min) (point-max))
@@ -1058,10 +1078,7 @@ This can take a while for large buffers."
     (and (not modified) (buffer-modified-p) (set-buffer-modified-p nil))))
 
 ;; Following is the original FSF version (similar to our original
-;; version, before all the crap I added below).
-;;
-;; Probably that crap should either be fixed up so it works better,
-;; or tossed away.
+;; version, before the deferred stuff was added).
 ;;
 ;; I think that lazy-lock v2 tries to do something similar.
 ;; Those efforts should be merged.
@@ -1075,111 +1092,97 @@ This can take a while for large buffers."
 ;      (progn (goto-char beg) (beginning-of-line) (point))
 ;      (progn (goto-char end) (forward-line 1) (point))))))
 
-(defvar font-lock-old-extent nil)
-(defvar font-lock-old-len 0)
-
-(defun font-lock-fontify-glumped-region ()
-  ;; even if something goes wrong in the fontification, mark the glumped
-  ;; region as fontified; otherwise, the same error might get signaled
-  ;; after every command.
-  (unwind-protect
-      ;; buffer/extent may be deleted.
-      (if (and (extent-live-p font-lock-old-extent)
-              (buffer-live-p (extent-object font-lock-old-extent)))
-         (save-excursion
-           (set-buffer (extent-object font-lock-old-extent))
-           (font-lock-after-change-function-1
-            (extent-start-position font-lock-old-extent)
-            (extent-end-position font-lock-old-extent)
-            font-lock-old-len)))
-    (detach-extent font-lock-old-extent)
-    (setq font-lock-old-extent nil)))
+(defvar font-lock-always-fontify-immediately nil
+  "Set this to non-nil to disable font-lock deferral.
+Otherwise, changes to existing text will not be processed until the
+next redisplay cycle, avoiding excessive fontification when many
+buffer modifications are performed or a buffer is reverted.")
 
-(defun font-lock-pre-idle-hook ()
-  (condition-case nil
-      (if font-lock-old-extent
-         (font-lock-fontify-glumped-region))
-    (error (warn "Error caught in `font-lock-pre-idle-hook'"))))
+(defvar font-lock-pending-extent-table (make-hash-table :weakness 'key))
+(defvar font-lock-range-table (make-range-table))
 
-(defvar font-lock-always-fontify-immediately nil
-  "Set this to non-nil to disable font-lock deferral.")
+(defun font-lock-pre-idle-hook ()
+  (condition-case font-lock-error
+      (if (> (hash-table-count font-lock-pending-extent-table) 0)
+         (font-lock-fontify-pending-extents))
+    (error (warn "Error caught in `font-lock-pre-idle-hook': %s"
+                font-lock-error))))
 
 ;;; called when any modification is made to buffer text.  This function
-;;; attempts to glump adjacent changes together so that excessive
-;;; fontification is avoided.  This function could easily be adapted
-;;; to other after-change-functions.
+;;; remembers the changed ranges until the next redisplay, at which point
+;;; the extents are merged and pruned, and the resulting ranges fontified.
+;;; This function could easily be adapted to other after-change-functions.
 
 (defun font-lock-after-change-function (beg end old-len)
-  (let ((obeg (and font-lock-old-extent
-                  (extent-start-position font-lock-old-extent)))
-       (oend (and font-lock-old-extent
-                  (extent-end-position font-lock-old-extent)))
-       (bc-end (+ beg old-len)))
-
-    ;; If this change can't be merged into the glumped one,
-    ;; we need to fontify the glumped one right now.
-    (if (and font-lock-old-extent
-            (or (not (eq (current-buffer)
-                         (extent-object font-lock-old-extent)))
-                (< bc-end obeg)
-                (> beg oend)))
-       (font-lock-fontify-glumped-region))
-  
-    (if font-lock-old-extent
-       ;; Update glumped region.
-       (progn
-         ;; Any characters in the before-change region that are
-         ;; outside the glumped region go into the glumped
-         ;; before-change region.
-         (if (> bc-end oend)
-             (setq font-lock-old-len (+ font-lock-old-len (- bc-end oend))))
-         (if (> obeg beg)
-             (setq font-lock-old-len (+ font-lock-old-len (- obeg beg))))
-         ;; New glumped region is the union of the glumped region
-         ;; and the new region.
-         (set-extent-endpoints font-lock-old-extent
-                               (min obeg beg)
-                               (max oend end)))
-
-      ;; No glumped region, so create one.
-      (setq font-lock-old-extent (make-extent beg end))
-      (set-extent-property font-lock-old-extent 'detachable nil)
-      (set-extent-property font-lock-old-extent 'end-open nil)
-      (setq font-lock-old-len old-len))
-
+  (when font-lock-mode
+    (let ((ex (make-extent beg end)))
+      (set-extent-property ex 'detachable nil)
+      (set-extent-property ex 'end-open nil)
+      (let ((exs (gethash (current-buffer) font-lock-pending-extent-table)))
+       (push ex exs)
+       (puthash (current-buffer) exs font-lock-pending-extent-table)))
     (if font-lock-always-fontify-immediately
-       (font-lock-fontify-glumped-region))))
-
-(defun font-lock-after-change-function-1 (beg end old-len)
-  (if (null font-lock-mode)
-      nil
-    (save-excursion
-      (save-restriction
-       ;; if we don't widen, then fill-paragraph (and any command that
-       ;; operates on a narrowed region) confuses things, because the C
-       ;; code will fail to realize that we're inside a comment.
-       (widen)
-       (save-match-data
-         (let ((zmacs-region-stays zmacs-region-stays)) ; protect from change!
-           (goto-char beg)
-           ;; Maybe flush the internal cache used by syntactically-sectionize.
-           ;; (It'd be nice if this was more automatic.)  Any deletions mean
-           ;; the cache is invalid, and insertions at beginning or end of line
-           ;; mean that the bol cache might be invalid.
-;;         (if (or (> old-len 0) (bobp) (= (preceding-char) ?\n))
-;;             (buffer-syntactic-context-flush-cache))
-
-           ;; Always recompute the whole line.
-           (goto-char end)
-           (forward-line 1)
-           (setq end (point))
-           (goto-char beg)
-           (beginning-of-line)
-           (setq beg (point))
-           ;; Rescan between start of line from `beg' and start of line after
-           ;; `end'.
-           (font-lock-fontify-region beg end)))))))
-
+       (font-lock-fontify-pending-extents))))
+
+(defun font-lock-fontify-pending-extents ()
+  ;; ah, the beauty of mapping functions.
+  ;; this function is actually shorter than the old version, which handled
+  ;; only one buffer and one contiguous region!
+  (save-match-data
+    (maphash
+     #'(lambda (buffer exs)
+        ;; remove first, to avoid infinite reprocessing if error
+        (remhash buffer font-lock-pending-extent-table)
+        (when (buffer-live-p buffer)
+          (clear-range-table font-lock-range-table)
+          (with-current-buffer buffer
+            (save-excursion
+              (save-restriction
+                ;; if we don't widen, then the C code will fail to
+                ;; realize that we're inside a comment.
+                (widen)
+                (let ((zmacs-region-stays
+                       zmacs-region-stays)) ; protect from change!
+                  (mapc
+                   #'(lambda (ex)
+                       ;; paranoia.
+                       (when (and (extent-live-p ex)
+                                  (not (extent-detached-p ex)))
+                         ;; first expand the ranges to full lines, because
+                         ;; that is what will be fontified; then use a
+                         ;; range table to merge the ranges.
+                         (let* ((beg (extent-start-position ex))
+                                (end (extent-end-position ex))
+                                (beg (progn (goto-char beg)
+                                            (beginning-of-line)
+                                            (point)))
+                                (end (progn (goto-char end)
+                                            (forward-line 1)
+                                            (point))))
+                           (detach-extent ex)
+                           (put-range-table beg end t
+                                            font-lock-range-table))))
+                   exs)
+                  (map-range-table
+                   #'(lambda (beg end val)
+                       ;; Maybe flush the internal cache used by
+                       ;; syntactically-sectionize.  (It'd be nice if this
+                       ;; was more automatic.)  Any deletions mean the
+                       ;; cache is invalid, and insertions at beginning or
+                       ;; end of line mean that the bol cache might be
+                       ;; invalid.
+                       ;; #### This code has been commented out for some time
+                       ;; now and is bit-rotting.  Someone should look into
+                       ;; this.
+;;                     (if (or change-was-deletion (bobp)
+;;                             (= (preceding-char) ?\n))
+;;                         (buffer-syntactic-context-flush-cache))
+                       (if (and (= beg (point-min))
+                                (= end (point-max)))
+                           (font-lock-fontify-buffer)
+                         (font-lock-fontify-region beg end)))
+                   font-lock-range-table)))))))
+     font-lock-pending-extent-table)))
 \f
 ;; Syntactic fontification functions.
 
@@ -1567,28 +1570,6 @@ START should be at the beginning of a line."
        ((and (boundp 'lazy-lock-mode) lazy-lock-mode)
         (lazy-lock-after-fontify-buffer))))
 
-;; If the buffer is about to be reverted, it won't be fontified afterward.
-;(defun font-lock-revert-setup ()
-;  (setq font-lock-fontified nil))
-
-;; If the buffer has just been reverted, normally that turns off
-;; Font Lock mode.  So turn the mode back on if necessary.
-;; sb 1999-03-03 -- The above comment no longer appears to be operative as
-;; the first call to normal-mode *will* restore the font-lock state and
-;; this call forces a second font-locking to occur when reverting a buffer,
-;; which is wasteful at best. 
-;;(defun font-lock-revert-cleanup ())
-
-;; <andy@xemacs.org> 12-10-99. This still does not work right, I think
-;; after change functions will still get us. The simplest thing to do
-;; is unconditionally turn-off font-lock before revert (and thus nuke
-;; all hooks) and then turn it on again afterwards. This also happens
-;; to be much faster because fontifying from scratch is better than
-;; trying to do incremental changes for the whole buffer.
-
-(defalias 'font-lock-revert-cleanup 'turn-on-font-lock)
-(defalias 'font-lock-revert-setup 'turn-off-font-lock)
-
 \f
 ;; Various functions.
 
@@ -2369,7 +2350,7 @@ The name is assumed to begin with a capital letter.")
 
         ;; Class names:
         (list (concat "\\<\\(class\\|interface\\)\\>\\s *"
-                                                                java-font-lock-identifier-regexp)
+                      java-font-lock-identifier-regexp)
               2 'font-lock-function-name-face)
         
         ;; Package declarations:
index 08a791a..dc3b882 100644 (file)
@@ -1,7 +1,7 @@
 ;;; glyphs.el --- Lisp interface to C glyphs
 
 ;; Copyright (C) 1994, 1997 Free Software Foundation, Inc.
-;; Copyright (C) 1995, 1996 Ben Wing.
+;; Copyright (C) 1995, 1996, 2000 Ben Wing.
 
 ;; Author: Chuck Thompson <cthomp@cs.uiuc.edu>, Ben Wing <ben@xemacs.org>
 ;; Maintainer: XEmacs Development Team
 
 ;;; Synched up with: Not in FSF.
 
+;;; Authorship:
+
+;; Prototype created 1995 by Chuck Thompson.
+;; Completely rewritten by Ben Wing, 1995.
+;; Various cleanups (esp. doc strings) by Ben Wing, May 2000.
+
 ;;; Commentary:
 
 ;; This file is dumped with XEmacs.
 
 ;;; Code:
 
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; font specifiers
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; image specifiers
 
 (defun make-image-specifier (spec-list)
   "Return a new `image' specifier object with the specification list SPEC-LIST.
 SPEC-LIST can be a list of specifications (each of which is a cons of a
 locale and a list of instantiators), a single instantiator, or a list
 of instantiators.  See `make-specifier' for more information about
-specifiers."
+specifiers.
+
+An image specifier is used for images (pixmaps, widgets and the like).
+It is used to describe the actual image in a glyph.  It is instanced
+as an image-instance.  Note that \"image\" as used in XEmacs does not
+actually refer to what the term \"image\" normally means (a picture,
+e.g. in .GIF or .JPG format, and called a \"pixmap\" in XEmacs), but
+includes all types of graphical elements, including pixmaps, widgets
+\(buttons, sliders, text fields, etc.) and even strings of text.
+
+Note that, in practice, you rarely, if ever, need to actually create
+an image specifier! (The function `make-image-specifier' exists mainly
+for completeness.) Pretty much the only use for image specifiers is to
+control how glyphs are displayed, and the image specifier associated
+with a glyph (the `image' property of a glyph) is created
+automatically when a glyph is created (see `make-glyph') and need not
+\(and cannot, for that matter) ever be changed.  In fact, the design
+decision to create a separate image specifier type, rather than make
+glyphs themselves be specifiers, is debatable -- the other properties
+of glyphs are rarely used and could conceivably have been incorporated
+into the glyph's instantiator.  The rarely used glyph types (buffer,
+pointer, icon) could also have been incorporated into the instantiator.
+
+Image instantiators come in many formats: `xbm', `xpm', `gif', `jpeg',
+etc.  This describes the format of the data describing the image.  The
+resulting image instances also come in many types -- `mono-pixmap',
+`color-pixmap', `text', `pointer', etc.  This refers to the behavior of
+the image and the sorts of places it can appear. (For example, a
+color-pixmap image has fixed colors specified for it, while a
+mono-pixmap image comes in two unspecified shades \"foreground\" and
+\"background\" that are determined from the face of the glyph or
+surrounding text; a text image appears as a string of text and has an
+unspecified foreground, background, and font; a pointer image behaves
+like a mono-pixmap image but can only be used as a mouse pointer
+\[mono-pixmap images cannot be used as mouse pointers]; etc.) It is
+important to keep the distinction between image instantiator format and
+image instance type in mind.  Typically, a given image instantiator
+format can result in many different image instance types (for example,
+`xpm' can be instanced as `color-pixmap', `mono-pixmap', or `pointer';
+whereas `cursor-font' can be instanced only as `pointer'), and a
+particular image instance type can be generated by many different
+image instantiator formats (e.g.  `color-pixmap' can be generated by `xpm',
+`gif', `jpeg', etc.).
+
+See `make-image-instance' for a more detailed discussion of image
+instance types.
+
+An image instantiator should be a string or a vector of the form
+
+ [FORMAT :KEYWORD VALUE ...]
+
+i.e. a format symbol followed by zero or more alternating keyword-value
+pairs.  FORMAT should be one of
+
+'nothing
+   Don't display anything; no keywords are valid for this.
+   Can only be instanced as `nothing'.
+'string
+   Display this image as a text string.  Can only be instanced
+   as `text', although support for instancing as `mono-pixmap'
+   and `color-pixmap' should be added.
+'formatted-string
+   Display this image as a text string, with replaceable fields;
+   not currently implemented. (It is, instead, equivalent to `string'.)
+'xbm
+   An X bitmap; only if X or MS Windows support was compiled into this
+   XEmacs.  Can be instanced as `mono-pixmap', `color-pixmap', or `pointer'.
+'xpm
+   An XPM pixmap; only if XPM support was compiled into this XEmacs.
+   Can be instanced as `color-pixmap', `mono-pixmap', or `pointer'.
+'xface
+   An X-Face bitmap, used to encode people's faces in e-mail messages;
+   only if X-Face support was compiled into this XEmacs.  Can be
+   instanced as `mono-pixmap', `color-pixmap', or `pointer'.
+'gif
+   A GIF87 or GIF89 image; only if GIF support was compiled into this
+   XEmacs.  NOTE: only the first frame of animated gifs will be displayed.
+   Can be instanced as `color-pixmap'.
+'jpeg
+   A JPEG image; only if JPEG support was compiled into this XEmacs.
+   Can be instanced as `color-pixmap'.
+'png
+   A PNG image; only if PNG support was compiled into this XEmacs.
+   Can be instanced as `color-pixmap'.
+'tiff
+   A TIFF image; only if TIFF support was compiled into this XEmacs.
+   Can be instanced as `color-pixmap'.
+'bmp
+   A MS Windows BMP image; only if MS Windows support was compiled into
+   this XEmacs.  Can be instanced as `color-pixmap'.
+'cursor-font
+   One of the standard cursor-font names, such as \"watch\" or
+   \"right_ptr\" under X.  Under X, this is, more specifically, any
+   of the standard cursor names from appendix B of the Xlib manual
+   [also known as the file <X11/cursorfont.h>] minus the XC_ prefix.
+   On other window systems, the valid names will be specific to the
+   type of window system.  Can only be instanced as `pointer'.
+'mswindows-resource
+   An MS Windows pointer resource.  Specifies a resource to retrieve
+   directly from the system (an OEM resource) or from a file, particularly
+   an executable file.  If the resource is to be retrieved from a file, use
+   :file and optionally :resource-id.  Otherwise use :resource-id.  Always
+   specify :resource-type to specify the type (cursor, bitmap or icon) of
+   the resource.  Possible values for :resource-id are listed below.  Can
+   be instanced as `pointer' or `color-pixmap'.
+'font
+   A glyph from a font; i.e. the name of a font, and glyph index into it
+   of the form \"FONT fontname index [[mask-font] mask-index]\".
+   Currently can only be instanced as `pointer', although this should
+   probably be fixed.
+'subwindow
+   An embedded windowing system window.  Can only be instanced as
+   `subwindow'.
+'button
+   A button widget; either a push button, radio button or toggle button.
+   Can only be instanced as `widget'.
+'combo-box
+   A drop list of selectable items in a widget, for editing text.
+   Can only be instanced as `widget'.
+'edit-field
+   A text editing widget.  Can only be instanced as `widget'.
+'label
+   A static, text-only, widget; for displaying text.  Can only be instanced
+   as `widget'.
+'layout
+   A widget for controlling the positioning of children underneath it.
+   Through the use of nested layouts, a widget hierarchy can be created
+   which can have the appearance of any standard dialog box or similar
+   arrangement; all of this is counted as one \"glyph\" and could appear
+   in many of the places that expect a single glyph.  Can only be instanced
+   as `widget'.
+'native-layout
+   The native version of a layout widget.  #### Document me better!
+   Can only be instanced as `widget'.
+'progress-gauge
+   A sliding widget, for showing progress.  Can only be instanced as
+   `widget'.
+'tab-control
+   A tab widget; a series of user selectable tabs.  Can only be instanced
+   as `widget'.
+'tree-view
+   A folding widget.  Can only be instanced as `widget'.
+'scrollbar
+   A scrollbar widget.  Can only be instanced as `widget'.
+'autodetect
+   XEmacs tries to guess what format the data is in.  If X support
+   exists, the data string will be checked to see if it names a filename.
+   If so, and this filename contains XBM or XPM data, the appropriate
+   sort of pixmap or pointer will be created. [This includes picking up
+   any specified hotspot or associated mask file.] Otherwise, if `pointer'
+   is one of the allowable image-instance types and the string names a
+   valid cursor-font name, the image will be created as a pointer.
+   Otherwise, the image will be displayed as text.  If no X support
+   exists, the image will always be displayed as text.  Can be instanced as
+   `mono-pixmap', `color-pixmap', `pointer', or `text'.
+'inherit
+   Inherit from the background-pixmap property of a face.  Can only be
+   instanced as `mono-pixmap'.
+
+The valid keywords are:
+
+:data
+   Inline data.  For most formats above, this should be a string.  For
+   XBM images, this should be a list of three elements: width, height, and
+   a string of bit data.  This keyword is valid for all of the bitmap/pixmap
+   formats, as well as `string', `formatted-string', `font', `cursor-font',
+   and `autodetect'.
+:file
+   Data is contained in a file.  The value is the name of this file.
+   If both :data and :file are specified, the image is created from
+   what is specified in :data and the string in :file becomes the
+   value of the `image-instance-file-name' function when applied to
+   the resulting image-instance.  This keyword is valid for all of the
+   bitmap/pixmap formats as well as `mswindows-resource'.
+:foreground
+:background
+   For `xbm', `xface', `cursor-font', `widget' and `font'.  These keywords
+   allow you to explicitly specify foreground and background colors.
+   The argument should be anything acceptable to `make-color-instance'.
+   This will cause what would be a `mono-pixmap' to instead be colorized
+   as a two-color color-pixmap, and specifies the foreground and/or
+   background colors for a pointer instead of black and white.
+:mask-data
+   For `xbm' and `xface'.  This specifies a mask to be used with the
+   bitmap.  The format is a list of width, height, and bits, like for
+   :data.
+:mask-file
+   For `xbm' and `xface'.  This specifies a file containing the mask data.
+   If neither a mask file nor inline mask data is given for an XBM image,
+   and the XBM image comes from a file, XEmacs will look for a mask file
+   with the same name as the image file but with \"Mask\" or \"msk\"
+   appended.  For example, if you specify the XBM file \"left_ptr\"
+   [usually located in \"/usr/include/X11/bitmaps\"], the associated
+   mask file \"left_ptrmsk\" will automatically be picked up.
+:hotspot-x
+:hotspot-y
+   For `xbm' and `xface'.  These keywords specify a hotspot if the image
+   is instantiated as a `pointer'.  Note that if the XBM image file
+   specifies a hotspot, it will automatically be picked up if no
+   explicit hotspot is given.
+:color-symbols
+   Only for `xpm'.  This specifies an alist that maps strings
+   that specify symbolic color names to the actual color to be used
+   for that symbolic color (in the form of a string or a color-specifier
+   object).  If this is not specified, the contents of `xpm-color-symbols'
+   are used to generate the alist.
+:resource-id
+   Only for `mswindows-resource'.  This must be either an integer (which
+   directly specifies a resource number) or a string.  Valid strings are
+
+   -- For bitmaps:
+
+   \"close\", \"uparrow\", \"dnarrow\", \"rgarrow\", \"lfarrow\",
+   \"reduce\", \"zoom\", \"restore\", \"reduced\", \"zoomd\",
+   \"restored\", \"uparrowd\", \"dnarrowd\", \"rgarrowd\", \"lfarrowd\",
+   \"mnarrow\", \"combo\", \"uparrowi\", \"dnarrowi\", \"rgarrowi\",
+   \"lfarrowi\", \"size\", \"btsize\", \"check\", \"checkboxes\", and
+   \"btncorners\".
+
+   -- For cursors:
+
+   \"normal\", \"ibeam\", \"wait\", \"cross\", \"up\", \"sizenwse\",
+   \"sizenesw\", \"sizewe\", \"sizens\", \"sizeall\", and \"no\".
+
+   -- For icons:
+
+   \"sample\", \"hand\", \"ques\", \"bang\", \"note\", and \"winlogo\".
+:resource-type
+   Only for `mswindows-resource'.  This must be a symbol, either `cursor',
+   `icon', or `bitmap', specifying the type of resource to be retrieved.
+:face
+   Only for `inherit'.  This specifies the face to inherit from.
+   For widgets this also specifies the face to use for display. It defaults
+   to gui-element-face.
+
+Keywords accepted as menu item specs are also accepted by widgets.
+These are `:selected', `:active', `:suffix', `:keys', `:style',
+`:filter', `:config', `:included', `:key-sequence', `:accelerator',
+`:label' and `:callback'.
+
+If instead of a vector, the instantiator is a string, it will be
+converted into a vector by looking it up according to the specs in the
+`console-type-image-conversion-list' (q.v.) for the console type of
+the domain (usually a window; sometimes a frame or device) over which
+the image is being instantiated.
+
+If the instantiator specifies data from a file, the data will be read
+in at the time that the instantiator is added to the image (which may
+be well before when the image is actually displayed), and the
+instantiator will be converted into one of the inline-data forms, with
+the filename retained using a :file keyword.  This implies that the
+file must exist when the instantiator is added to the image, but does
+not need to exist at any other time (e.g. it may safely be a temporary
+file).
+"
   (make-specifier-and-init 'image spec-list))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; glyphs
 
 (defconst built-in-glyph-specifiers
   '(image contrib-p baseline)
-  "A list of the built-in face properties that are specifiers.")
+  "A list of the built-in glyph properties that are specifiers.")
 
 (defun glyph-property (glyph property &optional locale)
   "Return GLYPH's value of PROPERTY in LOCALE.
@@ -287,7 +547,7 @@ See `glyph-property-instance' for more information."
   "Change the image of GLYPH in LOCALE.
 
 SPEC should be an instantiator (a string or vector; see
-  `image-specifier-p' for a description of possible values here),
+  `make-image-specifier' for a description of possible values here),
   a list of (possibly tagged) instantiators, an alist of specifications
   (each mapping a locale to an instantiator list), or an image specifier
   object.
@@ -380,20 +640,162 @@ See `set-glyph-property' for more information."
   (set-glyph-property glyph 'baseline spec locale tag-set how-to-add))
 
 (defun make-glyph (&optional spec-list type)
-  "Return a new `glyph' object of type TYPE.
-
-TYPE should be one of `buffer' (used for glyphs in an extent, the modeline,
+  "Create a new glyph of type TYPE.
+
+A glyph in XEmacs does NOT refer to a single unit of textual display (the
+XEmacs term for this is \"rune\"), but rather is an object encapsulating
+a graphical element, such as an image or widget (an element such as a
+button or text field; \"widget\" is the term for this under X Windows,
+and it's called a \"control\" under MS Windows).  This graphical element
+could appear in a buffer, a margin, a gutter, or a toolbar, or as a mouse
+pointer or an icon, for example.
+
+Creating a glyph using `make-glyph' does not specify *where* the glyph
+will be used, but it does specify *what* the glyph will look like.  In
+particular, SPEC-LIST is used to specify this, and it's used to
+initialize the glyph's `image' property, which is an image
+specifier. (Note that \"image\" as used in the context of a glyph's
+`image' property or in the terms \"image specifier\", \"image
+instantiator\", or \"image instance\" does not refer to what people
+normally think of as an image (which in XEmacs is called a
+\"pixmap\"), but to any graphical element -- a pixmap, a widget, or
+even a block of text, when used in the places that call for a glyph.)
+The format of the SPEC-LIST is typically an image instantiator (a
+string or a vector; see `make-image-specifier' for a detailed description
+of the valid image instantiators), but can also be a list of such
+instantiators (each one in turn is tried until an image is
+successfully produced), a cons of a locale (frame, buffer, etc.)  and
+an instantiator, a list of such conses, or any other form accepted by
+`canonicalize-spec-list'.
+
+If you're not familiar with specifiers, you should be in order to
+understand how glyphs work.  The clearest introduction to specifiers
+is in the Lispref manual, available under Info. (Choose
+Help->Info->Info Contents on the menubar or type \\[info].) You can
+also see `make-specifier' for a capsule summary.  What's important to
+keep in mind is that a specifier lets you set a different value for
+any particular buffer, window, frame, device, or console.  This allows
+for a great deal of flexibility; in particular, only one global glyph
+needs to exist for a particular purpose (e.g. the icon used to represent
+an iconified frame, the mouse pointer used over particular areas of a
+frame, etc.), and in these cases you do not create your own glyph, but
+rather modify the existing one.
+
+As well as using SPEC-LIST to initialize the glyph, you can set
+specifications using `set-glyph-image'.  Note that, due to a possibly
+questionable historical design decision, a glyph itself is not
+actually a specifier, but rather is an object containing an image
+specifier (as well as other, seldom-used properties).  Therefore, you
+cannot set or access specifications for the glyph's image by directly
+using `set-specifier', `specifier-instance' or the like on the glyph;
+instead use them on `(glyph-image GLYPH)' or use the convenience
+functions `set-glyph-image', `glyph-image-instance', and
+`glyph-image'.
+
+Once you have created a glyph, you specify where it will be used as follows:
+
+-- To insert a glyph into a buffer, create an extent in the buffer and then
+   use `set-extent-begin-glyph' or `set-extent-end-glyph' to set a glyph
+   to be displayed at the corresponding edge of the extent. (It is common
+   to create zero-width extents for this purpose.)
+
+-- To insert a glyph into the left or right margin of a buffer, first
+   make sure the margin is visible by setting a value for the specifiers
+   `left-margin-width' or `right-margin-width'. (Not strictly necessary
+   when using margin glyphs with layout policy `whitespace'.) Then follow
+   the same procedure above for inserting a glyph in a buffer, and then
+   set a non-default layout policy for the glyph using
+   `set-extent-begin-glyph-layout' or `set-extent-end-glyph-layout'.
+   Alternatively, use the high-level annotations API (see
+   `make-annotation'). (In point of fact, you can also use the annotations
+   API for glyphs in a buffer, by setting a layout policy of `text'.)
+
+-- To insert a glyph into the modeline, just put the glyph directly as
+   one of the modeline elements. (Unfortunately you can't currently
+   put a begin glyph or end glyph on one of the modeline extents --
+   they're ignored.)
+
+-- To insert a glyph into a toolbar, specify it as part of a toolbar
+   instantiator (typically set on the specifier `default-toolbar').
+   See `default-toolbar' for more information. (Note that it is standard
+   practice to use a symbol in place of the glyph list in the toolbar
+   instantiator; the symbol is evalled to get the glyph list.  This
+   facilitates both creating the toolbar instantiator and modifying
+   individual glyphs in a toolbar later on.  For example, you can
+   change the way that the Mail toolbar button looks by modifying the
+   value of the variable `toolbar-mail-icon' (in general, `toolbar-*-icon')
+   and then calling `(set-specifier-dirty-flag default-toolbar)'.
+   (#### Unfortunately this doesn't quite work the way it should; the
+   change will appear in new frames, but not existing ones.
+
+-- To insert a glyph into a gutter, create or modify a gutter instantiator
+   (typically set on the specifier `default-gutter').  Gutter instantiators
+   consist of strings or lists of strings, so to insert a glyph, create an
+   extent over the string, and use `set-extent-begin-glyph' or
+   `set-extent-end-glyph' to set a glyph to be displayed at the corresponding
+   edge of the extent, just like for glyphs in a buffer.
+
+-- To use a glyph as the icon for a frame, you do not actually create a new
+   glyph; rather, you change the specifications for the existing glyph
+   `frame-icon-glyph'. (Remember that, because of the specifier nature of
+   glyphs, you can set different values for any particular buffer or frame.)
+
+-- To use a glyph as the mouse pointer, in general you do not create a
+   new glyph, but rather you change the specifications of various existing
+   glyphs, such as `text-pointer-glyph' for the pointer used over text,
+   `modeline-pointer-glyph' for the pointer used over the modeline, etc.
+   Do an apropos over `*-pointer-glyph' to find all of them. (Note also
+   that you can temporarily set the mouse pointer to some specific shape
+   by using `set-frame-pointer', which takes an image instace, as obtained
+   from calling `glyph-image-instance' on a glyph of type `pointer' --
+   either one of the above-mentioned variables or one you created yourself.
+   (See below for what it means to create a glyph of type `pointer'.)
+   This pointer will last only until the next mouse motion event is
+   processed or certain other things happen, such as creating or deleting
+   a window. (In fact, the above-mentioned pointer glyph variables are
+   implemented as part of the default handler for mouse motion events.
+   If you want to customize this behavior, take a look at `mode-motion-hook',
+   or `mouse-motion-handler' if you really want to get low-level.)
+
+-- To use a glyph to control the shape of miscellaneous redisplay effects
+   such as the truncation and continuation markers, set the appropriate
+   existing glyph variables, as for icons and pointers above.  See
+   `continuation-glyph', `control-arrow-glyph', `hscroll-glyph',
+   `invisible-text-glyph', `octal-escape-glyph', and `truncation-glyph'.
+   See also `overlay-arrow-string', an odd redisplay leftover which can
+   be set to a glyph you created, and will cause the glyph to be displayed
+   on top of the text position specified in the marker stored in
+   `overlay-arrow-position'.
+
+-- To use a glyph in a display table (i.e. to control the appearance of
+   any individual character), create the appropriate character glyphs
+   and then set a specification for the specifier `current-display-table',
+   which controls the appearance of characters.  You can also set an
+   overriding display table for use with text displayed in a particular
+   face; see `set-face-display-table' and `make-display-table'.
+   #### Note: Display tables do not currently support general Mule
+   characters.  They will be overhauled at some point to support this
+   and to provide other features required under Mule.
+
+-- To use a glyph as the background pixmap of a face: Note that the
+   background pixmap of a face is actually an image specifier -- probably
+   the only place in XEmacs where an image specifier occurs outside of
+   a glyph.  Similarly to how the glyph's image specifier works, you
+   don't create your own image specifier, but rather add specifications
+   to the existing one (using `set-face-background-pixmap').  Note that
+   the image instance that is generated in order to actually display the
+   background pixmap is of type `mono-pixmap', meaning that it's a two-color
+   image and the foreground and background of the image get filled in with
+   the corresponding colors from the face.
+
+It is extremely rare that you will ever have to specify a value for TYPE,
+which should be one of `buffer' (used for glyphs in an extent, the modeline,
 the toolbar, or elsewhere in a buffer), `pointer' (used for the mouse-pointer),
-or `icon' (used for a frame's icon), and defaults to `buffer'.
-
-SPEC-LIST is used to initialize the glyph's image.  It is typically an
-image instantiator (a string or a vector; see `image-specifier-p' for
-a detailed description of the valid image instantiators), but can also
-be a list of such instantiators (each one in turn is tried until an
-image is successfully produced), a cons of a locale (frame, buffer, etc.)
-and an instantiator, a list of such conses, or any other form accepted
-by `canonicalize-spec-list'.  See `make-specifier' for more information
-about specifiers."
+or `icon' (used for a frame's icon), and defaults to `buffer'.  The only cases
+where it needs to be specified is when creating icon or pointer glyphs, and
+in both cases the necessary glyphs have already been created at startup and
+are accessed through the appropriate variables, e.g. `text-pointer-glyph'
+(or in general, `*-pointer-glyph') and `frame-icon-glyph'."
   (let ((glyph (make-glyph-internal type)))
     (and spec-list (set-glyph-image glyph spec-list))
     glyph))
@@ -412,38 +814,22 @@ about specifiers."
 
 (defun make-pointer-glyph (&optional spec-list)
   "Return a new `pointer-glyph' object with the specification list SPEC-LIST.
-
 This is equivalent to calling `make-glyph', specifying a type of `pointer'.
+See `make-glyph' for more information.
 
-SPEC-LIST is used to initialize the glyph's image.  It is typically an
-image instantiator (a string or a vector; see `image-specifier-p' for
-a detailed description of the valid image instantiators), but can also
-be a list of such instantiators (each one in turn is tried until an
-image is successfully produced), a cons of a locale (frame, buffer, etc.)
-and an instantiator, a list of such conses, or any other form accepted
-by `canonicalize-spec-list'.  See `make-specifier' for more information
-about specifiers.
-
-You can also create a glyph with an empty SPEC-LIST and add image
-instantiators afterwards using `set-glyph-image'."
+It is extremely unlikely that you will ever need to create a pointer glyph.
+Instead, you probably want to be calling `set-glyph-image' on an existing
+glyph, e.g. `text-pointer-glyph'."
   (make-glyph spec-list 'pointer))
 
 (defun make-icon-glyph (&optional spec-list)
   "Return a new `icon-glyph' object with the specification list SPEC-LIST.
-
 This is equivalent to calling `make-glyph', specifying a type of `icon'.
+See `make-glyph' for more information.
 
-SPEC-LIST is used to initialize the glyph's image.  It is typically an
-image instantiator (a string or a vector; see `image-specifier-p' for
-a detailed description of the valid image instantiators), but can also
-be a list of such instantiators (each one in turn is tried until an
-image is successfully produced), a cons of a locale (frame, buffer, etc.)
-and an instantiator, a list of such conses, or any other form accepted
-by `canonicalize-spec-list'.  See `make-specifier' for more information
-about specifiers.
-
-You can also create a glyph with an empty SPEC-LIST and add image
-instantiators afterwards using `set-glyph-image'."
+It is extremely unlikely that you will ever need to create a icon glyph.
+Instead, you probably want to be calling `set-glyph-image' on
+`frame-icon-glyph'."
   (make-glyph spec-list 'icon))
 
 (defun nothing-image-instance-p (object)
@@ -468,9 +854,12 @@ instantiators afterwards using `set-glyph-image'."
   "Return t if OBJECT is an image instance of type `pointer'."
   (and (image-instance-p object) (eq 'pointer (image-instance-type object))))
 
+(defun widget-image-instance-p (object)
+  "Return t if OBJECT is an image instance of type `widget'."
+  (and (image-instance-p object) (eq 'widget (image-instance-type object))))
+
 (defun subwindow-image-instance-p (object)
-  "Return t if OBJECT is an image instance of type `subwindow'.
-Subwindows are not implemented in this version of XEmacs."
+  "Return t if OBJECT is an image instance of type `subwindow'."
   (and (image-instance-p object) (eq 'subwindow (image-instance-type object))))
 
 ;;;;;;;;;; the built-in glyphs
index d9e8fd3..777ddc3 100644 (file)
@@ -33,8 +33,7 @@
 
 (defvar gutter-buffers-tab nil
   "A tab widget in the gutter for displaying buffers.
-Do not set this. Use `glyph-image-instance' and
-`set-image-instance-property' to change the properties of the tab.")
+Do not set this. Use `set-glyph-image' to change the properties of the tab.")
 
 (defcustom gutter-buffers-tab-visible-p
   (gutter-element-visible-p default-gutter-visible-p 'buffers-tab)
@@ -278,16 +277,7 @@ items by redefining the function `format-buffers-menu-line'."
     (set-extent-begin-glyph 
      gutter-buffers-tab-extent
      (setq gutter-buffers-tab 
-          (make-glyph 
-           (vector 'tab-control :descriptor "Buffers" :face buffers-tab-face
-                   :orientation gutter-buffers-tab-orientation
-                   (if (or (eq gutter-buffers-tab-orientation 'top)
-                           (eq gutter-buffers-tab-orientation 'bottom))
-                       :pixel-width :pixel-height)
-                   (if (or (eq gutter-buffers-tab-orientation 'top)
-                           (eq gutter-buffers-tab-orientation 'bottom))
-                       '(gutter-pixel-width) '(gutter-pixel-height))
-                   :properties (list :items (buffers-tab-items nil nil t))))))
+          (make-glyph)))
 
     ;; Nuke all existing tabs
     (remove-gutter-element top-gutter 'buffers-tab)
@@ -324,52 +314,44 @@ items by redefining the function `format-buffers-menu-line'."
                 )))
      (console-type-list))))
 
-(defun update-tab-in-gutter (&optional frame-or-buffer force-selection)
+(defun update-tab-in-gutter (frame &optional force-selection)
   "Update the tab control in the gutter area."
-  (let ((locale (if (framep frame-or-buffer) frame-or-buffer)))
     ;; dedicated frames don't get tabs
-    (unless (and (framep locale)
-                (window-dedicated-p (frame-selected-window locale)))
-      (when (specifier-instance default-gutter-visible-p locale)
-       (unless (and gutter-buffers-tab 
-                    (eq (default-gutter-position)
-                        gutter-buffers-tab-orientation))
-         (add-tab-to-gutter))
-       (when (valid-image-instantiator-format-p 'tab-control locale)
-         (let ((inst (glyph-image-instance 
-                      gutter-buffers-tab
-                      (when (framep frame-or-buffer)
-                        (last-nonminibuf-window frame-or-buffer)))))
-           (set-image-instance-property inst :items 
-                                        (buffers-tab-items 
-                                         nil locale force-selection))))))))
-
-(defun remove-buffer-from-gutter-tab ()
-  "Remove the current buffer from the tab control in the gutter area."
-  (when (and (valid-image-instantiator-format-p 'tab-control)
-            (specifier-instance default-gutter-visible-p))
-    (let ((inst (glyph-image-instance gutter-buffers-tab))
-         (buffers (buffers-tab-items t)))
-      (unless buffers
-       (setq buffers (build-buffers-tab-internal 
-                      (list 
-                       (get-buffer-create "*scratch*")))))
-      (set-image-instance-property inst :items buffers))))
+  (unless (window-dedicated-p (frame-selected-window frame))
+    (when (specifier-instance default-gutter-visible-p frame)
+      (unless (and gutter-buffers-tab
+                  (eq (default-gutter-position)
+                      gutter-buffers-tab-orientation))
+       (add-tab-to-gutter))
+      (when (valid-image-instantiator-format-p 'tab-control frame)
+       (set-glyph-image
+        gutter-buffers-tab
+        (vector 'tab-control :descriptor "Buffers" :face buffers-tab-face
+                :orientation gutter-buffers-tab-orientation
+                (if (or (eq gutter-buffers-tab-orientation 'top)
+                        (eq gutter-buffers-tab-orientation 'bottom))
+                    :pixel-width :pixel-height)
+                (if (or (eq gutter-buffers-tab-orientation 'top)
+                        (eq gutter-buffers-tab-orientation 'bottom))
+                    '(gutter-pixel-width) '(gutter-pixel-height))
+                :properties
+                (list :items
+                      (buffers-tab-items nil frame force-selection)))
+        frame)))))
 
 ;; A myriad of different update hooks all doing slightly different things
-(add-hook 'kill-buffer-hook 'remove-buffer-from-gutter-tab)
 (add-hook 'create-frame-hook 
          #'(lambda (frame)
              (when gutter-buffers-tab (update-tab-in-gutter frame t))))
 (add-hook 'buffer-list-changed-hook 'update-tab-in-gutter)
 (add-hook 'default-gutter-position-changed-hook
          #'(lambda ()
-             (when gutter-buffers-tab (update-tab-in-gutter))))
+             (when gutter-buffers-tab
+               (mapc #'update-tab-in-gutter (frame-list)))))
 (add-hook 'gutter-element-visibility-changed-hook
          #'(lambda (prop visible-p)
              (when (and (eq prop 'buffers-tab) visible-p)
-               (update-tab-in-gutter))))
-
+               (mapc #'update-tab-in-gutter (frame-list)))))
 ;;
 ;; progress display
 ;; ripped off from message display
@@ -382,8 +364,8 @@ textual and displayed in the echo area."
   :type 'boolean
   :group 'gutter)
 
-(defvar progress-glyph-height 32
-  "Height of the gutter area for progress messages.")
+(defvar progress-glyph-height 24
+  "Height of the progress gauge glyph.")
 
 (defvar progress-display-popup-period 0.5
   "The time that the progress gauge should remain up after completion")
@@ -396,7 +378,7 @@ textual and displayed in the echo area."
 (defvar progress-gauge-glyph
   (make-glyph
    `[progress-gauge
-     :pixel-height (- progress-glyph-height 8)
+     :pixel-height (eval progress-glyph-height)
      :pixel-width 250
      :descriptor "Progress"]))
 
@@ -407,30 +389,31 @@ displayed above the gauge itself. If STYLE is 'small then the gauge
 and text are arranged side-by-side."  
   (cond
    ((eq style 'small)
-    (setq progress-glyph-height 24)
+    (setq progress-glyph-height 16)
     (setq progress-layout-glyph
          (make-glyph
           `[layout
             :orientation horizontal
+            :margin-width 4
             :items (,progress-gauge-glyph
                     [button
-                     :pixel-height (- progress-glyph-height 8)
+                     :pixel-height (eval progress-glyph-height)
                      ;; 'quit is special and acts "asynchronously".
                      :descriptor "Stop" :callback 'quit]
                     ,progress-text-glyph)])))
    (t 
-    (setq progress-glyph-height 32)
+    (setq progress-glyph-height 24)
     (setq progress-layout-glyph
          (make-glyph
           `[layout 
             :orientation vertical :justify left
+            :margin-width 4
             :items (,progress-text-glyph
                     [layout 
-                     :pixel-height (eval progress-glyph-height)
                      :orientation horizontal
                      :items (,progress-gauge-glyph
                              [button 
-                              :pixel-height (- progress-glyph-height 8)
+                              :pixel-height (eval progress-glyph-height)
                               :descriptor " Stop "
                               ;; 'quit is special and acts "asynchronously".
                               :callback 'quit])])])))))
@@ -457,6 +440,7 @@ Do not modify this directly--use the `progress-display' or
    `[layout :orientation vertical :justify left
            :items (,progress-text-glyph
                    [layout
+                    :margin-width 4
                     :pixel-height progress-glyph-height
                     :orientation horizontal])]))
 
@@ -537,6 +521,8 @@ you should just use (progress nil)."
        (progn
          (setcdr top message)
          (if (equal tmsg message)
+             ;; #### use of set-image-instance-property is wrong.
+             ;; use set-glyph-image instead.
              (set-image-instance-property 
               (glyph-image-instance progress-gauge-glyph
                                     (frame-selected-window frame))
@@ -572,6 +558,8 @@ you should just use (progress nil)."
          ;; fixup the gutter specifiers
          (set-gutter-element bottom-gutter 'progress gutter-string frame)
          (set-specifier bottom-gutter-border-width 2 frame)
+         ;; #### use of set-image-instance-property is wrong.
+         ;; use set-glyph-image instead.
          (set-image-instance-property 
           (glyph-image-instance progress-text-glyph
                                 (frame-selected-window frame)) :data message)
@@ -600,6 +588,8 @@ you should just use (progress nil)."
       ;; fixup the gutter specifiers
       (set-gutter-element bottom-gutter 'progress gutter-string frame)
       (set-specifier bottom-gutter-border-width 2 frame)
+      ;; #### use of set-image-instance-property is wrong.
+      ;; use set-glyph-image instead.
       (set-image-instance-property 
        (glyph-image-instance progress-gauge-glyph 
                             (frame-selected-window frame))
index f4565a6..b5c8ab8 100644 (file)
@@ -108,6 +108,61 @@ non-nil if it is visible in optional DOMAIN."
     (or (and (listp spec) (memq 'buffers-tab spec))
        spec)))
 
+(defun make-gutter-specifier (spec-list)
+  "Return a new `gutter' specifier object with the given specification list.
+SPEC-LIST can be a list of specifications (each of which is a cons of a
+locale and a list of instantiators), a single instantiator, or a list
+of instantiators.  See `make-specifier' for more information about
+specifiers.
+
+Gutter specifiers are used to specify the format of a gutter.
+The values of the variables `default-gutter', `top-gutter',
+`left-gutter', `right-gutter', and `bottom-gutter' are always
+gutter specifiers.
+
+Valid gutter instantiators are called \"gutter descriptors\" and are
+either strings or property-lists of strings.  See `default-gutter' for
+a description of the exact format."
+  (make-specifier-and-init 'gutter spec-list))
+
+(defun make-gutter-size-specifier (spec-list)
+  "Return a new `gutter-size' specifier object with the given spec list.
+SPEC-LIST can be a list of specifications (each of which is a cons of a
+locale and a list of instantiators), a single instantiator, or a list
+of instantiators.  See `make-specifier' for more information about
+specifiers.
+
+Gutter-size specifiers are used to specify the size of a gutter.  The
+values of the variables `default-gutter-size', `top-gutter-size',
+`left-gutter-size', `right-gutter-size', and `bottom-gutter-size' are
+always gutter-size specifiers.
+
+Valid gutter-size instantiators are either integers or the special
+symbol 'autodetect. If a gutter-size is set to 'autodetect them the
+size of the gutter will be adjusted to just accomodate the gutters
+contents. 'autodetect only works for top and bottom gutters."
+  (make-specifier-and-init 'gutter-size spec-list))
+
+(defun make-gutter-visible-specifier (spec-list)
+  "Return a new `gutter-visible' specifier object with the given spec list.
+SPEC-LIST can be a list of specifications (each of which is a cons of a
+locale and a list of instantiators), a single instantiator, or a list
+of instantiators.  See `make-specifier' for more information about
+specifiers.
+
+Gutter-visible specifiers are used to specify the visibility of a
+gutter.  The values of the variables `default-gutter-visible-p',
+`top-gutter-visible-p', `left-gutter-visible-p',
+`right-gutter-visible-p', and `bottom-gutter-visible-p' are always
+gutter-visible specifiers.
+
+Valid gutter-visible instantiators are t, nil or a list of symbols.
+If a gutter-visible instantiator is set to a list of symbols, and the
+correspondong gutter specification is a property-list strings, then
+elements of the gutter specification will only be visible if the
+corresponding symbol occurs in the gutter-visible instantiator."
+  (make-specifier-and-init 'gutter-visible spec-list))
+
 (defun init-gutter ()
   "Initialize the gutter."
   ;; do nothing as yet.
index 82652ea..765ee58 100644 (file)
@@ -385,6 +385,7 @@ Keymap for characters following C-c.")
 ;; Default binding of "Control-h" is help.
 (define-key global-map 'backspace 'delete-backward-char)
 (define-key global-map '(meta backspace) 'backward-kill-word)
+(define-key global-map [(control x) backspace] 'backward-kill-sentence)
 
 (define-key global-map "\M-\C-z" 'activate-region)
 
@@ -549,24 +550,26 @@ Keymap for characters following C-c.")
 (define-key global-map '(control kp-down) 'forward-block-of-lines)
 
 ;; context-sensitive movement
-;; (meta control left/right) should be reserved for bindings that
-;; switch between buffers/web pages/etc.
 (define-key global-map '(meta left)    'backward-sexp)
 (define-key global-map '(meta right)   'forward-sexp)
-(define-key global-map '(meta up)      'backward-sentence)
-(define-key global-map '(meta down)    'forward-sentence)
-(define-key global-map '(meta control up) 'backward-paragraph)
-(define-key global-map '(meta control down) 'forward-paragraph)
+(define-key global-map '(meta up)      'backward-paragraph)
+(define-key global-map '(meta down)    'forward-paragraph)
+(define-key global-map '(meta control left) 'backward-sentence)
+(define-key global-map '(meta control right) 'forward-sentence)
+(define-key global-map '(meta control up) 'scroll-down-one)
+(define-key global-map '(meta control down) 'scroll-up-one)
 (define-key global-map '(meta control home)    'beginning-of-defun)
 (define-key global-map '(meta control end)     'end-of-defun)
 (define-key global-map '(meta control prior)   'backward-page)
 (define-key global-map '(meta control next)    'forward-page)
 (define-key global-map '(meta kp-left)  'backward-sexp)
 (define-key global-map '(meta kp-right) 'forward-sexp)
-(define-key global-map '(meta kp-up)   'backward-sentence)
-(define-key global-map '(meta kp-down) 'forward-sentence)
-(define-key global-map '(meta control kp-up) 'backward-paragraph)
-(define-key global-map '(meta control kp-down) 'forward-paragraph)
+(define-key global-map '(meta kp-up)   'backward-paragraph)
+(define-key global-map '(meta kp-down) 'forward-paragraph)
+(define-key global-map '(meta control kp-left) 'backward-sentence)
+(define-key global-map '(meta control kp-right) 'forward-sentence)
+(define-key global-map '(meta control kp-up) 'scroll-down-one)
+(define-key global-map '(meta control kp-down) 'scroll-up-one)
 (define-key global-map '(meta control kp-home) 'beginning-of-defun)
 (define-key global-map '(meta control kp-end)  'end-of-defun)
 (define-key global-map '(meta control kp-prior)        'backward-page)
index 7783fd3..228aa09 100644 (file)
@@ -123,7 +123,11 @@ is nil, raise an error."
       (when dependents
        (error "Loaded libraries %s depend on %s"
               (prin1-to-string dependents) file))))
-  (let* ((flist (feature-symbols feature)) (file (car flist)))
+  (let* ((flist (feature-symbols feature))
+        (file (car flist)))
+    (flet ((reset-aload (x)
+            (let ((aload (get x 'autoload)))
+              (if aload (fset x (cons 'autoload aload))))))
     (mapcar
      #'(lambda (x)
         (cond ((stringp x) nil)
@@ -131,12 +135,17 @@ is nil, raise an error."
                ;; Remove any feature names that this file provided.
                (if (eq (car x) 'provide)
                    (setq features (delq (cdr x) features))))
-              ((boundp x) (makunbound x))
+              ((and (boundp x)
+                    (fboundp x))
+               (makunbound x)
+               (fmakunbound x)
+               (reset-aload x))
+              ((boundp x)
+               (makunbound x))
               ((fboundp x)
                (fmakunbound x)
-               (let ((aload (get x 'autoload)))
-                 (if aload (fset x (cons 'autoload aload)))))))
-     (cdr flist))
+               (reset-aload x))))
+     (cdr flist)))
     ;; Delete the load-history element for this file.
     (let ((elt (assoc file load-history)))
       (setq load-history (delq elt load-history)))))
index eda0c93..c61764c 100644 (file)
@@ -1374,7 +1374,8 @@ which will not be used as accelerators."
        ;; #### there should be something that holds the name that the init
        ;; file should be created as, when it's not present.
        (progn (find-file (or user-init-file "~/.emacs"))
-             (emacs-lisp-mode))]
+             (or (eq major-mode 'emacs-lisp-mode)
+                 (emacs-lisp-mode)))]
       ["%_Save Options to .emacs File" customize-save-customized]
       )
 
@@ -1866,13 +1867,13 @@ If this is a relative filename, it is put into the same directory as your
                                          current-language-environment))
                            `([,(car lang)
                               (help-with-tutorial nil ,(cdr tut))]))))
-                language-info-alist))
-     ;; Non mule tutorials.
-     (mapcar #'(lambda (lang)
-                `[,(car lang)
-                  (help-with-tutorial ,(format "TUTORIAL.%s"
-                                               (cadr lang)))])
-            tutorial-supported-languages))))
+                language-info-alist)
+       ;; Non mule tutorials.
+       (mapcar #'(lambda (lang)
+                  `[,(car lang)
+                    (help-with-tutorial ,(format "TUTORIAL.%s"
+                                                 (cadr lang)))])
+              tutorial-supported-languages)))))
 
 \f
 (set-menubar default-menubar)
index 342f5bd..6343c2d 100644 (file)
@@ -1544,6 +1544,24 @@ If DEFAULT-VALUE is non-nil, return that if user enters an empty
            (setq n (1+ n))))
       new)))
 
+
+;; Wrapper for `directory-files' for use in generating completion lists.
+;; Generates output in the same format as `file-name-all-completions'.
+;;
+;; The EFS replacement for `directory-files' doesn't support the FILES-ONLY
+;; option, so it has to be faked.  The listing cache will hopefully
+;; improve the performance of this operation.
+(defun minibuf-directory-files (dir &optional match-regexp files-only)
+  (let ((want-file (or (eq files-only nil) (eq files-only t)))
+        (want-dirs (or (eq files-only nil) (not (eq files-only t)))))
+    (delete nil
+            (mapcar (function (lambda (f)
+                                (if (file-directory-p (expand-file-name f dir))
+                                    (and want-dirs (file-name-as-directory f))
+                                  (and want-file f))))
+                    (delete "." (directory-files dir nil match-regexp))))))
+
+
 (defun read-file-name-2 (history prompt dir default
                                 must-match initial-contents
                                 completer)
@@ -1632,7 +1650,7 @@ If DEFAULT-VALUE is non-nil, return that if user enters an empty
       (reset-buffer completion-buf)
       (let ((standard-output completion-buf))
        (display-completion-list
-        (delete "." (directory-files full nil nil nil (if dir-p 'directory)))
+         (minibuf-directory-files full nil (if dir-p 'directory))
         :user-data dir-p
         :reference-buffer minibuf
         :activate-callback 'read-file-name-activate-callback)
@@ -1825,7 +1843,9 @@ DIR defaults to current buffer's directory default."
             ((eq action 't)
              ;; all completions
              (mapcar #'un-substitute-in-file-name
-                     (file-name-all-completions name dir)))
+                     (if (string= name "")
+                         (delete "./" (file-name-all-completions "" dir))
+                       (file-name-all-completions name dir))))
             (t;; nil
              ;; complete
              (let* ((d (or dir default-directory))
@@ -1854,17 +1874,13 @@ DIR defaults to current buffer's directory default."
    #'(lambda (action orig string specdir dir name)
       (let* ((dirs #'(lambda (fn)
                       (let ((l (if (equal name "")
-                                   (directory-files
+                                   (minibuf-directory-files
                                     dir
-                                    nil
                                     ""
-                                    nil
                                     'directories)
-                                 (directory-files
+                                 (minibuf-directory-files
                                   dir
-                                  nil
                                   (concat "\\`" (regexp-quote name))
-                                  nil
                                   'directories))))
                         (mapcar fn
                                 ;; Wretched unix
@@ -1947,7 +1963,7 @@ whether it is a file(/result) or a directory (/result/)."
   (let ((standard-output (window-buffer window)))
     (condition-case nil
        (display-completion-list
-        (directory-files dir nil nil nil t)
+        (minibuf-directory-files dir nil t)
         :window-width (window-width window)
         :window-height (window-text-area-height window)
         :completion-string ""
@@ -1963,7 +1979,7 @@ whether it is a file(/result) or a directory (/result/)."
   (let ((standard-output (window-buffer window)))
     (condition-case nil
        (display-completion-list
-        (delete "." (directory-files dir nil nil nil 1))
+        (minibuf-directory-files dir nil 1)
         :window-width (window-width window)
         :window-height (window-text-area-height window)
         :completion-string ""
index 9c1d690..86b7bd8 100644 (file)
 SPEC-LIST can be a list of specifications (each of which is a cons of a
 locale and a list of instantiators), a single instantiator, or a list
 of instantiators.  See `make-specifier' for more information about
-specifiers."
+specifiers.
+
+Valid instantiators for font specifiers are:
+
+-- a string naming a font (e.g. under X this might be
+   \"-*-courier-medium-r-*-*-*-140-*-*-*-*-iso8859-*\" for a 14-point
+   upright medium-weight Courier font)
+-- a font instance (use that instance directly if the device matches,
+   or use the string that generated it)
+-- a vector of no elements (only on TTY's; this means to set no font
+   at all, thus using the \"natural\" font of the terminal's text)
+-- a vector of one element (a face to inherit from)
+"
   (make-specifier-and-init 'font spec-list))
 
 (defun font-name (font &optional domain charset)
@@ -127,7 +139,21 @@ and is equivalent to the sum of the font instance's ascent and descent."
 SPEC-LIST can be a list of specifications (each of which is a cons of a
 locale and a list of instantiators), a single instantiator, or a list
 of instantiators.  See `make-specifier' for a detailed description of
-how specifiers work."
+how specifiers work.
+
+Valid instantiators for color specifiers are:
+
+-- a string naming a color (e.g. under X this might be \"lightseagreen2\"
+   or \"#F534B2\")
+-- a color instance (use that instance directly if the device matches,
+   or use the string that generated it)
+-- a vector of no elements (only on TTY's; this means to set no color
+   at all, thus using the \"natural\" color of the terminal's text)
+-- a vector of one or two elements: a face to inherit from, and
+   optionally a symbol naming which property of that face to inherit,
+   either `foreground' or `background' (if omitted, defaults to the same
+   property that this color specifier is used for; if this specifier is
+   not part of a face, the instantiator would not be valid)."
   (make-specifier-and-init 'color spec-list))
 
 (defun color-name (color &optional domain)
@@ -146,4 +172,24 @@ to using `specifier-instance' and applying `color-instance-rgb-components'
 to the result.  See `make-specifier' for more information about specifiers."
   (ws-object-property-1 'color-instance-rgb-components color domain))
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; face-boolean specifiers
+
+(defun make-face-boolean-specifier (spec-list)
+  "Return a new `face-boolean' specifier object with the given spec list.
+SPEC-LIST can be a list of specifications (each of which is a cons of a
+locale and a list of instantiators), a single instantiator, or a list
+of instantiators.  See `make-specifier' for a detailed description of
+how specifiers work.
+
+Valid instantiators for face-boolean specifiers are
+
+-- t or nil
+-- a vector of two or three elements: a face to inherit from,
+   optionally a symbol naming the property of that face to inherit from
+   (if omitted, defaults to the same property that this face-boolean
+   specifier is used for; if this specifier is not part of a face,
+   the instantiator would not be valid), and optionally a value which,
+   if non-nil, means to invert the sense of the inherited property."
+  (make-specifier-and-init 'color spec-list))
+
 ;;; objects.el ends here.
index 2d1eaf3..9ecd6db 100644 (file)
@@ -38,8 +38,8 @@
 ;;   (this goes for any package loaded before `subr.el'.)
 ;;
 ;; - not to use macros, because they are not yet available (and this
-;;   file must be loadable uncompiled.)  This rules out CL-style
-;;   macros like `when', for instance.
+;;   file must be loadable uncompiled.)  Built in macros, such as
+;;   `when' and `unless' are fine, of course.
 ;;
 ;; - not to use `defcustom'.  If you must add user-customizable
 ;;   variables here, use `defvar', and add the variable to
index c0602de..1fc438a 100644 (file)
@@ -129,7 +129,7 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
              (if buffer
                  (set-marker (process-mark proc) (point buffer) buffer))
              (unwind-protect
-                 (progn
+                 (prog1
                    (catch 'call-process-done
                      (when (not discard)
                        (set-process-sentinel
index a01dff3..f26dad8 100644 (file)
   "Find the documentation directory."
   (paths-find-architecture-directory roots "lib-src" nil configure-doc-directory))
 
-(defun paths-find-lock-directory (roots)
-  "Find the lock directory."
-  (defvar configure-lock-directory)
-  (paths-find-site-directory roots "lock" "EMACSLOCKDIR" configure-lock-directory))
-
-(defun paths-find-superlock-file (lock-directory)
-  "Find the superlock file."
-  ;; #### There is no such variable configure-superlock-file!
-  (cond
-   ((null lock-directory)
-    nil)
-   ((and configure-superlock-file
-        (file-directory-p (file-name-directory configure-superlock-file)))
-    configure-superlock-file)
-   (t
-    (expand-file-name "!!!SuperLock!!!" lock-directory))))
-
 (defun paths-find-exec-directory (roots)
   "Find the binary directory."
   (paths-find-architecture-directory roots "lib-src"
index cf2652a..9ece9ae 100644 (file)
@@ -2001,6 +2001,17 @@ is nil.  If BUFFER is nil, the current buffer is assumed."
       (beginning-of-buffer nil)
       (end-of-buffer nil))))
 
+(defun scroll-up-one ()
+  "Scroll text of current window upward one line.
+On attempt to scroll past end of buffer, `end-of-buffer' is signaled.
+On attempt to scroll past beginning of buffer, `beginning-of-buffer' is
+signaled.
+
+If `signal-error-on-buffer-boundary' is nil, attempts to scroll past buffer
+boundaries do not cause an error to be signaled."
+  (interactive "_")
+  (scroll-up-command 1))
+
 (defun scroll-up-command (&optional n)
   "Scroll text of current window upward ARG lines; or near full screen if no ARG.
 A near full screen is `next-screen-context-lines' less than a full screen.
@@ -2020,6 +2031,17 @@ boundaries do not cause an error to be signaled."
       (beginning-of-buffer nil)
       (end-of-buffer nil))))
 
+(defun scroll-down-one ()
+  "Scroll text of current window downward one line.
+On attempt to scroll past end of buffer, `end-of-buffer' is signaled.
+On attempt to scroll past beginning of buffer, `beginning-of-buffer' is
+signaled.
+
+If `signal-error-on-buffer-boundary' is nil, attempts to scroll past buffer
+boundaries do not cause an error to be signaled."
+  (interactive "_")
+  (scroll-down-command 1))
+
 (defun scroll-down-command (&optional n)
   "Scroll text of current window downward ARG lines; or near full screen if no ARG.
 A near full screen is `next-screen-context-lines' less than a full screen.
index 5653975..08b037e 100644 (file)
@@ -1,7 +1,7 @@
 ;;; specifier.el --- Lisp interface to specifiers
 
 ;; Copyright (C) 1997 Free Software Foundation, Inc.
-;; Copyright (C) 1995, 1996 Ben Wing.
+;; Copyright (C) 1995, 1996, 2000 Ben Wing.
 
 ;; Author: Ben Wing <ben@xemacs.org>
 ;; Keywords: internal, dumped
@@ -275,18 +275,20 @@ indicate that it applies everywhere.  LOCALE usually defaults to
 
 VALUE is usually what is called an \"instantiator\" (which, roughly
 speaking, corresponds to the \"value\" of the property governed by
-SPECIFIER).  The valid instantiators for SPECIFIER depend on the
-type of SPECIFIER (which you can determine using `specifier-type').
-The specifier `scrollbar-width', for example, is of type `integer',
-meaning its valid instantiators are integers.  The specifier
-governing the background color of the `default' face (you can
-retrieve this specifier using `(face-background 'default)') is
-of type `color', meaning its valid instantiators are strings naming
-colors and color-instance objects.  For some types of specifiers,
-such as `image' and `toolbar', the instantiators can be very
-complex.  Generally this is documented in the appropriate predicate
-function -- `color-specifier-p', `image-specifier-p',
-`toolbar-specifier-p', etc.
+SPECIFIER).  The valid instantiators for SPECIFIER depend on the type
+of SPECIFIER (which you can determine using `specifier-type').  The
+specifier `scrollbar-width', for example, is of type `integer',
+meaning its valid instantiators are integers.  The specifier governing
+the background color of the `default' face (you can retrieve this
+specifier using `(face-background 'default)') is of type `color',
+meaning its valid instantiators are strings naming colors and
+color-instance objects.  For some types of specifiers, such as `image'
+and `toolbar', the instantiators can be very complex.  Generally this
+is documented in the appropriate creation function --
+e.g. `make-color-specifier', `make-font-specifier',
+`make-image-specifier' -- or in the global variable holding the most
+common specifier for that type (`default-toolbar', `default-gutter',
+`current-display-table').
 
 NOTE: It does *not* work to give a VALUE of nil as a way of
 removing the specifications for a locale.  Use `remove-specifier'
@@ -526,6 +528,58 @@ Example:
                                              ,(car oldval))))
                                       oldvallist varlist))))))))
 
+(defun make-integer-specifier (spec-list)
+  "Return a new `integer' specifier object with the given specification list.
+SPEC-LIST can be a list of specifications (each of which is a cons of a
+locale and a list of instantiators), a single instantiator, or a list
+of instantiators.  See `make-specifier' for more information about
+specifiers.
+
+Valid instantiators for integer specifiers are integers."
+  (make-specifier-and-init 'integer spec-list))
+
+(defun make-boolean-specifier (spec-list)
+  "Return a new `boolean' specifier object with the given specification list.
+SPEC-LIST can be a list of specifications (each of which is a cons of a
+locale and a list of instantiators), a single instantiator, or a list
+of instantiators.  See `make-specifier' for more information about
+specifiers.
+
+Valid instantiators for boolean specifiers are t and nil."
+  (make-specifier-and-init 'boolean spec-list))
+
+(defun make-natnum-specifier (spec-list)
+  "Return a new `natnum' specifier object with the given specification list.
+SPEC-LIST can be a list of specifications (each of which is a cons of a
+locale and a list of instantiators), a single instantiator, or a list
+of instantiators.  See `make-specifier' for more information about
+specifiers.
+
+Valid instantiators for natnum specifiers are non-negative integers."
+  (make-specifier-and-init 'natnum spec-list))
+
+(defun make-generic-specifier (spec-list)
+  "Return a new `generic' specifier object with the given specification list.
+SPEC-LIST can be a list of specifications (each of which is a cons of a
+locale and a list of instantiators), a single instantiator, or a list
+of instantiators.  See `make-specifier' for more information about
+specifiers.
+
+Valid instantiators for generic specifiers are all Lisp values.
+They are returned back unchanged when a specifier is instantiated."
+  (make-specifier-and-init 'generic spec-list))
+
+(defun make-display-table-specifier (spec-list)
+  "Return a new `display-table' specifier object with the given spec list.
+SPEC-LIST can be a list of specifications (each of which is a cons of a
+locale and a list of instantiators), a single instantiator, or a list
+of instantiators.  See `make-specifier' for more information about
+specifiers.
+
+Valid instantiators for display-table specifiers are described in
+detail in the doc string for `current-display-table'."
+  (make-specifier-and-init 'display-table spec-list))
+
 ;; Evaluate this for testing:
 ; (cl-prettyexpand '(let-specifier ((modeline-shadow-thickness 0 (selected-window) 'x) (fubar (value) baz)) (sit-for 1)))
 \f
index 8c2686e..f2bc2d3 100644 (file)
@@ -369,11 +369,10 @@ Type ^H^H^H (Control-h Control-h Control-h) to get more help options.\n")
        (princ "\n\n" stream)))
     (when (not suppress-early-error-handler-backtrace)
       (backtrace stream t)))
+  (if (fboundp 'mswindows-message-box)
+      (mswindows-message-box "Initialization error"))
   (kill-emacs -1))
 
-(defvar lock-directory)
-(defvar superlock-file)
-
 (defun normal-top-level ()
   (if command-line-processed
       (message "Back to top level.")
@@ -1146,18 +1145,6 @@ It's idempotent, so call this as often as you like!"
       (princ (format "Info-directory-list:\n%S\n" Info-directory-list)
             'external-debugging-output))
 
-  (if (boundp 'lock-directory)
-      (progn
-       (setq lock-directory (paths-find-lock-directory roots))
-       (setq superlock-file (paths-find-superlock-file lock-directory))
-
-       (if debug-paths
-           (progn
-             (princ (format "lock-directory:\n%S\n" lock-directory)
-                    'external-debugging-output)
-             (princ (format "superlock-file:\n%S\n" superlock-file)
-                    'external-debugging-output)))))
-
   (setq exec-directory (paths-find-exec-directory roots))
 
   (if debug-paths
@@ -1205,20 +1192,15 @@ It's idempotent, so call this as often as you like!"
     (princ (buffer-string) 'external-debugging-output)))
 
 (defun startup-setup-paths-warning ()
-  (let ((lock (if (boundp 'lock-directory) lock-directory 't))
-       (warnings '()))
-    (if (and (stringp lock) (null (file-directory-p lock)))
-       (setq lock nil))
+  (let ((warnings '()))
     (cond
      ((null (and lisp-directory exec-directory data-directory doc-directory
-                load-path
-                lock))
+                load-path))
       (save-excursion
        (set-buffer (get-buffer-create " *warning-tmp*"))
        (erase-buffer)
        (buffer-disable-undo (current-buffer))
        (if (null lisp-directory) (push "lisp-directory" warnings))
-       (if (null lock)           (push "lock-directory" warnings))
        (if (null exec-directory) (push "exec-directory" warnings))
        (if (null data-directory) (push "data-directory" warnings))
        (if (null doc-directory)  (push "doc-directory"  warnings))
index 772abf5..74d44e7 100644 (file)
@@ -198,4 +198,21 @@ as an argument if release is over a blank area of the toolbar."
   (setq zmacs-region-stays t)
   (release-toolbar-button-internal event nil))
 
+(defun make-toolbar-specifier (spec-list)
+  "Return a new `toolbar' specifier object with the given specification list.
+SPEC-LIST can be a list of specifications (each of which is a cons of a
+locale and a list of instantiators), a single instantiator, or a list
+of instantiators.  See `make-specifier' for more information about
+specifiers.
+
+Toolbar specifiers are used to specify the format of a toolbar.
+The values of the variables `default-toolbar', `top-toolbar',
+`left-toolbar', `right-toolbar', and `bottom-toolbar' are always
+toolbar specifiers.
+
+Valid toolbar instantiators are called \"toolbar descriptors\"
+and are lists of vectors.  See `default-toolbar' for a description
+of the exact format."
+  (make-specifier-and-init 'toolbar spec-list))
+
 ;;; toolbar.el ends here
index d9c33c8..c27378e 100644 (file)
             (if (string-match "\\.elc?\\'" arg)
                 (substring arg 0 (match-beginning 0))
               arg)))
-           (if (and dumped-exe
-                    (or (and (file-exists-p (concat frob ".el"))
-                             (file-newer-than-file-p (concat frob ".el")
-                                                     dumped-exe))
-                        (and (file-exists-p (concat frob ".elc"))
-                             (file-newer-than-file-p (concat frob ".elc")
-                                                     dumped-exe))))
-               (setq need-to-dump t)))
+           (when (and dumped-exe
+                      (or (and (file-exists-p
+                                (concat "../lisp/" frob ".el"))
+                               (file-newer-than-file-p
+                                (concat "../lisp/" frob ".el")
+                                dumped-exe))
+                          (and (file-exists-p
+                                (concat "../lisp/" frob ".elc"))
+                               (file-newer-than-file-p
+                                (concat "../lisp/" frob ".elc")
+                                dumped-exe))))
+             (setq need-to-dump t)))
 
       (if (null (member (file-name-nondirectory arg)
                        packages-unbytecompiled-lisp))
index bba50dc..f2ac1bd 100644 (file)
@@ -1,3 +1,7 @@
+2000-05-28  Martin Buchholz <martin@xemacs.org>
+
+       * XEmacs 21.2.34 is released.
+
 2000-05-01  Martin Buchholz <martin@xemacs.org>
 
        * XEmacs 21.2.33 is released.
index 41ff8e5..94fd8f1 100644 (file)
@@ -1,3 +1,31 @@
+2000-05-28  Martin Buchholz <martin@xemacs.org>
+
+       * XEmacs 21.2.34 is released.
+
+2000-05-17  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * xemacs/basic.texi: Document translation of tutorial.
+       * xemacs/startup.texi: Remove lock-directory.
+       * xemacs/enterings.texi: Update.
+
+2000-05-17  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * lispref/display.texi:
+       * lispref/faces.texi:
+       * lispref/glyphs.texi:
+       * lispref/gutter.texi:
+       * lispref/modes.texi:
+       * lispref/specifiers.texi:
+       * lispref/toolbar.texi:
+       Update.  Merge Ben's doc-string update.
+
+2000-05-08  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * xemacs/basic.texi:
+       * xemacs/enterings.texi:
+       * xemacs/mini.texi:
+       Partial sync with FSF Emacs 20.6 and some update.
+
 2000-05-01  Martin Buchholz <martin@xemacs.org>
 
        * XEmacs 21.2.33 is released.
index dc213f4..e46d7f2 100644 (file)
@@ -5051,7 +5051,7 @@ For a description about the internals: @xref{lrecords}.
 
 Our next candidates are the other objects that behave quite differently
 than everything else: the strings. They consists of two parts, a
-fixed-size portion (@code{struct Lisp_string}) holding the string's
+fixed-size portion (@code{struct Lisp_String}) holding the string's
 length, its property list and a pointer to the second part, and the
 actual string data, which is stored in string-chars blocks comparable to
 frob blocks. In this block, the data is not only freed, but also a
@@ -5787,7 +5787,7 @@ field and a pointer to an associated array of lrecord_description.
 @node Dumping phase, Reloading phase, Data descriptions, Dumping
 @section Dumping phase
 
-Dumping is done by calling the function pdump() (in alloc.c) which is
+Dumping is done by calling the function pdump() (in dumper.c) which is
 invoked from Fdump_emacs (in emacs.c).  This function performs a number
 of tasks.
 
index 8d92bd0..6feb3e0 100644 (file)
@@ -235,7 +235,7 @@ prevent processing of subsequent files.  (The file that gets the error
 will not, of course, produce any compiled code.)
 
 @example
-% emacs -batch -f batch-byte-compile *.el
+% xemacs -batch -f batch-byte-compile *.el
 @end example
 @end defun
 
index 0b11270..fdc5c74 100644 (file)
@@ -31,7 +31,7 @@ select the type of database file to use.  (Note:  XEmacs may not
 support both of these types.)
 
 For a @var{type} of @code{'dbm}, there are no subtypes, so
-@var{subtype} should by @code{nil}.
+@var{subtype} should be @code{nil}.
 
 For a @var{type} of @code{'berkeley_db}, the following subtypes are
 available:  @code{'hash}, @code{'btree}, and @code{'recno}.  See the
index 1517f0f..1a85ffc 100644 (file)
@@ -996,6 +996,71 @@ the contents of a display table, using additional indirection
 to a ``glyph table'' and such.  Note that ``glyph'' has a different
 meaning in XEmacs.)
 
+@defvar current-display-table
+
+The display table currently in use.  This is a specifier.
+
+Display tables are used to control how characters are displayed.  Each
+time that redisplay processes a character, it is looked up in all the
+display tables that apply (obtained by calling @code{specifier-instance}
+on @code{current-display-table} and any overriding display tables
+specified in currently active faces).  The first entry found that
+matches the character determines how the character is displayed.  If
+there is no matching entry, the default display method is
+used. (Non-control characters are displayed as themselves and control
+characters are displayed according to the buffer-local variable
+@code{ctl-arrow}.  Control characters are further affected by
+@code{control-arrow-glyph} and @code{octal-escape-glyph}.)
+
+Each instantiator in this specifier and the display-table specifiers
+in faces is a display table or a list of such tables.  If a list, each
+table will be searched in turn for an entry matching a particular
+character.  Each display table is one of
+
+@itemize @bullet
+@item
+A vector, specifying values for characters starting at 0.
+@item
+A char table, either of type @code{char} or @code{generic}.
+@item
+A range table.
+@end itemize
+
+Each entry in a display table should be one of
+
+@itemize @bullet
+@item
+nil (this entry is ignored and the search continues).
+@item
+A character (use this character; if it happens to be the same as
+the original character, default processing happens, otherwise
+redisplay attempts to display this character directly;
+#### At some point recursive display-table lookup will be
+implemented).
+@item
+A string (display each character in the string directly;
+#### At some point recursive display-table lookup will be
+implemented).
+@item
+A glyph (display the glyph;
+#### At some point recursive display-table lookup will be
+implemented when a string glyph is being processed).
+@item
+A cons of the form (format "@var{string}") where @var{string} is a
+printf-like spec used to process the character. #### Unfortunately no
+formatting directives other than %% are implemented.
+@item
+A vector (each element of the vector is processed recursively;
+in such a case, nil elements in the vector are simply ignored).
+
+#### At some point in the near future, display tables are likely to
+be expanded to include other features, such as referencing characters
+in particular fonts and allowing the character search to continue
+all the way up the chain of specifier instantiators.  These features
+are necessary to properly display Unicode characters.
+@end itemize
+@end defvar
+
   Individual faces can also specify an overriding display table;
 this is set using @code{set-face-display-table}.  @xref{Faces}.
 
index e332f78..a654d69 100644 (file)
@@ -94,9 +94,9 @@ functions in preference to the lower-level extent functions.  For more
 information, @xref{Annotations}.
 
   If an extent has its @code{detachable} property set, it will become
-@dfn{detached} (i.e. no longer in the buffer) when all its text its
+@dfn{detached} (i.e. no longer in the buffer) when all its text is
 deleted.  Otherwise, it will simply shrink down to zero-length and
-sit it the same place in the buffer.  By default, the @code{detachable}
+sit in the same place in the buffer.  By default, the @code{detachable}
 property is set on newly-created extents.  @xref{Detached Extents}.
 
   If an extent has its @code{duplicable} property set, it will be
index 9afd173..ee36e15 100644 (file)
@@ -476,6 +476,33 @@ This predicate returns @code{t} if @var{object} is a font specifier, and
 @code{nil} otherwise.
 @end defun
 
+@defun make-font-specifier spec-list
+
+Return a new @code{font} specifier object with the given specification
+list.  @var{spec-list} can be a list of specifications (each of which is
+a cons of a locale and a list of instantiators), a single instantiator,
+or a list of instantiators.  @xref{Specifiers}, for more information
+about specifiers.
+
+Valid instantiators for font specifiers are:
+
+@itemize @bullet
+
+@item
+A string naming a font (e.g. under X this might be
+"-*-courier-medium-r-*-*-*-140-*-*-*-*-iso8859-*" for a 14-point
+upright medium-weight Courier font).
+@item
+A font instance (use that instance directly if the device matches,
+or use the string that generated it).
+@item
+A vector of no elements (only on TTY's; this means to set no font
+at all, thus using the "natural" font of the terminal's text).
+@item
+A vector of one element (a face to inherit from).
+@end itemize
+@end defun
+
 @node Font Instances
 @subsection Font Instances
 
@@ -634,6 +661,63 @@ applying @code{font-instance-properties} to the result.
 This function returns non-@code{nil} if @var{object} is a color specifier.
 @end defun
 
+@defun make-color-specifier spec-list
+
+Return a new @code{color} specifier object with the given specification
+list.  @var{spec-list} can be a list of specifications (each of which is
+a cons of a locale and a list of instantiators), a single instantiator,
+or a list of instantiators.  @xref{Specifiers}, for a detailed
+description of how specifiers work.
+
+Valid instantiators for color specifiers are:
+
+@itemize @bullet
+@item
+A string naming a color (e.g. under X this might be "lightseagreen2" or
+"#F534B2").
+
+@item
+A color instance (use that instance directly if the device matches,
+or use the string that generated it).
+
+@item
+A vector of no elements (only on TTY's; this means to set no color at
+all, thus using the "natural" color of the terminal's text).
+
+@item
+A vector of one or two elements: a face to inherit from, and optionally
+a symbol naming which property of that face to inherit, either
+@code{foreground} or @code{background} (if omitted, defaults to the same
+property that this color specifier is used for; if this specifier is not
+part of a face, the instantiator would not be valid).
+@end itemize
+@end defun
+
+@defun make-face-boolean-specifier spec-list
+
+Return a new @code{face-boolean} specifier object with the given spec
+list.  @var{spec-list} can be a list of specifications (each of which is
+a cons of a locale and a list of instantiators), a single instantiator,
+or a list of instantiators.  @xref{Specifiers}, for a detailed
+description of how specifiers work.
+
+Valid instantiators for face-boolean specifiers are
+
+@itemize @bullet
+@item
+t or nil.
+@item
+A vector of two or three elements: a face to inherit from, optionally a
+symbol naming the property of that face to inherit from (if omitted,
+defaults to the same property that this face-boolean specifier is used
+for; if this specifier is not part of a face, the instantiator would not
+be valid), and optionally a value which, if non-nil, means to invert the
+sense of the inherited property.
+@end itemize
+
+@end defun
+
+
 @node Color Instances
 @subsection Color Instances
 @cindex color instances
index 3cffa49..8373674 100644 (file)
@@ -7,15 +7,15 @@
 @chapter Glyphs
 @cindex glyphs
 
-  A @dfn{glyph} is an object that is used for pixmaps and images of all
-sorts, as well as for things that ``act'' like pixmaps, such as
-non-textual strings (@dfn{annotations}) displayed in a buffer or in the
-margins.  It is used in begin-glyphs and end-glyphs attached to extents,
-marginal and textual annotations, overlay arrows (@code{overlay-arrow-*}
-variables), toolbar buttons, mouse pointers, frame icons, truncation and
-continuation markers, and the like. (Basically, any place there is an
-image or something that acts like an image, there will be a glyph object
-representing it.)
+  A @dfn{glyph} is an object that is used for pixmaps, widgets and
+images of all sorts, as well as for things that ``act'' like pixmaps,
+such as non-textual strings (@dfn{annotations}) displayed in a buffer or
+in the margins.  It is used in begin-glyphs and end-glyphs attached to
+extents, marginal and textual annotations, overlay arrows
+(@code{overlay-arrow-*} variables), toolbar buttons, mouse pointers,
+frame icons, truncation and continuation markers, and the
+like. (Basically, any place there is an image or something that acts
+like an image, there will be a glyph object representing it.)
 
   The actual image that is displayed (as opposed to its position or
 clipping) is defined by an @dfn{image specifier} object contained
@@ -71,6 +71,179 @@ one of @code{buffer} (used for glyphs in an extent, the modeline, the
 toolbar, or elsewhere in a buffer), @code{pointer} (used for the
 mouse-pointer), or @code{icon} (used for a frame's icon), and defaults
 to @code{buffer}.  @xref{Glyph Types}.
+
+A glyph in XEmacs does @strong{NOT} refer to a single unit of textual
+display (the XEmacs term for this is @dfn{rune}), but rather is an
+object encapsulating a graphical element, such as an image or widget (an
+element such as a button or text field; @dfn{widget} is the term for
+this under X Windows, and it's called a @dfn{control} under MS Windows).
+This graphical element could appear in a buffer, a margin, a gutter, or
+a toolbar, or as a mouse pointer or an icon, for example.
+
+Creating a glyph using @code{make-glyph} does not specify @emph{where}
+the glyph will be used, but it does specify @emph{what} the glyph will
+look like.  In particular, SPEC-LIST is used to specify this, and it's
+used to initialize the glyph's @code{image} property, which is an image
+specifier. (Note that @dfn{image} as used in the context of a glyph's
+@code{image} property or in the terms @dfn{image specifier}, @dfn{image
+instantiator}, or @dfn{image instance} does not refer to what people
+normally think of as an image (which in XEmacs is called a
+@dfn{pixmap}), but to any graphical element---a pixmap, a widget, or
+even a block of text, when used in the places that call for a glyph.)
+The format of the SPEC-LIST is typically an image instantiator (a string
+or a vector; @ref{Image Specifiers}), but can also be a list of such
+instantiators (each one in turn is tried until an image is successfully
+produced), a cons of a locale (frame, buffer, etc.)  and an
+instantiator, a list of such conses, or any other form accepted by
+@code{canonicalize-spec-list}. @xref{Specifiers}, for more information
+about specifiers.
+
+If you're not familiar with specifiers, you should be in order to
+understand how glyphs work.  The clearest introduction to specifiers
+is in the Lispref manual, available under Info. (Choose
+Help->Info->Info Contents on the menubar or type C-h i.) You can
+also see @code{make-specifier} for a capsule summary.  What's important to
+keep in mind is that a specifier lets you set a different value for
+any particular buffer, window, frame, device, or console.  This allows
+for a great deal of flexibility; in particular, only one global glyph
+needs to exist for a particular purpose (e.g. the icon used to represent
+an iconified frame, the mouse pointer used over particular areas of a
+frame, etc.), and in these cases you do not create your own glyph, but
+rather modify the existing one.
+
+As well as using @var{spec-list} to initialize the glyph, you can set
+specifications using @code{set-glyph-image}.  Note that, due to a
+possibly questionable historical design decision, a glyph itself is not
+actually a specifier, but rather is an object containing an image
+specifier (as well as other, seldom-used properties).  Therefore, you
+cannot set or access specifications for the glyph's image by directly
+using @code{set-specifier}, @code{specifier-instance} or the like on the
+glyph; instead use them on @code{(glyph-image @var{glyph})} or use the
+convenience functions @code{set-glyph-image},
+@code{glyph-image-instance}, and @code{glyph-image}.
+
+Once you have created a glyph, you specify where it will be used as
+follows:
+
+@itemize @bullet
+@item
+To insert a glyph into a buffer, create an extent in the buffer and then
+use @code{set-extent-begin-glyph} or @code{set-extent-end-glyph} to set
+a glyph to be displayed at the corresponding edge of the extent. (It is
+common to create zero-width extents for this purpose.)
+
+@item
+To insert a glyph into the left or right margin of a buffer, first
+make sure the margin is visible by setting a value for the specifiers
+@code{left-margin-width} or @code{right-margin-width}. (Not strictly necessary
+when using margin glyphs with layout policy @code{whitespace}.) Then follow
+the same procedure above for inserting a glyph in a buffer, and then
+set a non-default layout policy for the glyph using
+@code{set-extent-begin-glyph-layout} or @code{set-extent-end-glyph-layout}.
+Alternatively, use the high-level annotations API (see
+@code{make-annotation}). (In point of fact, you can also use the annotations
+API for glyphs in a buffer, by setting a layout policy of @code{text}.)
+
+@item
+To insert a glyph into the modeline, just put the glyph directly as one
+of the modeline elements. (Unfortunately you can't currently put a begin
+glyph or end glyph on one of the modeline extents---they're ignored.)
+
+@item
+To insert a glyph into a toolbar, specify it as part of a toolbar
+instantiator (typically set on the specifier @code{default-toolbar}).
+See @code{default-toolbar} for more information. (Note that it is
+standard practice to use a symbol in place of the glyph list in the
+toolbar instantiator; the symbol is evalled to get the glyph list.  This
+facilitates both creating the toolbar instantiator and modifying
+individual glyphs in a toolbar later on.  For example, you can change
+the way that the Mail toolbar button looks by modifying the value of the
+variable @code{toolbar-mail-icon} (in general, @code{toolbar-*-icon})
+and then calling @code{(set-specifier-dirty-flag default-toolbar)}.
+(#### Unfortunately this doesn't quite work the way it should; the
+change will appear in new frames, but not existing ones.
+
+@item
+To insert a glyph into a gutter, create or modify a gutter instantiator
+(typically set on the specifier @code{default-gutter}).  Gutter
+instantiators consist of strings or lists of strings, so to insert a
+glyph, create an extent over the string, and use
+@code{set-extent-begin-glyph} or @code{set-extent-end-glyph} to set a
+glyph to be displayed at the corresponding edge of the extent, just like
+for glyphs in a buffer.
+
+@item
+To use a glyph as the icon for a frame, you do not actually create a new
+glyph; rather, you change the specifications for the existing glyph
+@code{frame-icon-glyph}. (Remember that, because of the specifier nature
+of glyphs, you can set different values for any particular buffer or
+frame.)
+
+@item
+To use a glyph as the mouse pointer, in general you do not create a new
+glyph, but rather you change the specifications of various existing
+glyphs, such as @code{text-pointer-glyph} for the pointer used over
+text, @code{modeline-pointer-glyph} for the pointer used over the
+modeline, etc.  Do an apropos over @code{*-pointer-glyph} to find all of
+them. (Note also that you can temporarily set the mouse pointer to some
+specific shape by using @code{set-frame-pointer}, which takes an image
+instace, as obtained from calling @code{glyph-image-instance} on a glyph
+of type @code{pointer} -- either one of the above-mentioned variables or
+one you created yourself.  (See below for what it means to create a
+glyph of type @code{pointer}.)  This pointer will last only until the
+next mouse motion event is processed or certain other things happen,
+such as creating or deleting a window. (In fact, the above-mentioned
+pointer glyph variables are implemented as part of the default handler
+for mouse motion events.  If you want to customize this behavior, take a
+look at @code{mode-motion-hook}, or @code{mouse-motion-handler} if you
+really want to get low-level.)
+
+@item
+To use a glyph to control the shape of miscellaneous redisplay effects
+such as the truncation and continuation markers, set the appropriate
+existing glyph variables, as for icons and pointers above.  See
+@code{continuation-glyph}, @code{control-arrow-glyph},
+@code{hscroll-glyph}, @code{invisible-text-glyph},
+@code{octal-escape-glyph}, and @code{truncation-glyph}.  See also
+@code{overlay-arrow-string}, an odd redisplay leftover which can be set
+to a glyph you created, and will cause the glyph to be displayed on top
+of the text position specified in the marker stored in
+@code{overlay-arrow-position}.
+
+@item
+To use a glyph in a display table (i.e. to control the appearance of any
+individual character), create the appropriate character glyphs and then
+set a specification for the specifier @code{current-display-table},
+which controls the appearance of characters.  You can also set an
+overriding display table for use with text displayed in a particular
+face; see @code{set-face-display-table} and @code{make-display-table}.
+#### Note: Display tables do not currently support general Mule
+characters.  They will be overhauled at some point to support this
+and to provide other features required under Mule.
+
+@item
+To use a glyph as the background pixmap of a face: Note that the
+background pixmap of a face is actually an image specifier -- probably
+the only place in XEmacs where an image specifier occurs outside of a
+glyph.  Similarly to how the glyph's image specifier works, you don't
+create your own image specifier, but rather add specifications to the
+existing one (using @code{set-face-background-pixmap}).  Note that the
+image instance that is generated in order to actually display the
+background pixmap is of type @code{mono-pixmap}, meaning that it's a
+two-color image and the foreground and background of the image get
+filled in with the corresponding colors from the face.
+@end itemize
+
+It is extremely rare that you will ever have to specify a value for
+TYPE, which should be one of @code{buffer} (used for glyphs in an
+extent, the modeline, the toolbar, or elsewhere in a buffer),
+@code{pointer} (used for the mouse-pointer), or @code{icon} (used for a
+frame's icon), and defaults to @code{buffer}.  The only cases where it
+needs to be specified is when creating icon or pointer glyphs, and in
+both cases the necessary glyphs have already been created at startup and
+are accessed through the appropriate variables,
+e.g. @code{text-pointer-glyph} (or in general, @code{*-pointer-glyph})
+and @code{frame-icon-glyph}.  @xref{Glyph Types}.
 @end defun
 
 @defun make-glyph-internal &optional type
@@ -78,13 +251,25 @@ This function creates a new, uninitialized glyph of type @var{type}.
 @end defun
 
 @defun make-pointer-glyph &optional spec-list
-This function is equivalent to calling @code{make-glyph} with a
-@var{type} of @code{pointer}.
+
+Return a new @code{pointer-glyph} object with the specification list
+@var{spec-list}.  This function is equivalent to calling
+@code{make-glyph} with a @var{type} of @code{pointer}.
+
+It is extremely unlikely that you will ever need to create a pointer
+glyph.  Instead, you probably want to be calling @code{set-glyph-image}
+on an existing glyph, e.g. @code{text-pointer-glyph}.
 @end defun
 
 @defun make-icon-glyph &optional spec-list
-This function is equivalent to calling @code{make-glyph} with a
-@var{type} of @code{icon}.
+
+Return a new @code{pointer-glyph} object with the specification list
+@var{spec-list}.  This function is equivalent to calling
+@code{make-glyph} with a @var{type} of @code{icon}.
+
+It is extremely unlikely that you will ever need to create a pointer
+glyph.  Instead, you probably want to be calling @code{set-glyph-image}
+on an existing glyph, e.g. @code{text-pointer-glyph}.
 @end defun
 
 @node Glyph Properties
@@ -420,10 +605,21 @@ a glyph.
 @end defun
 
 @defun make-image-specifier spec-list
-This function creates a new image specifier object and initializes
-it according to @var{spec-list}.  It is unlikely that you will ever
-want to do this, but this function is provided for completeness and
-for experimentation purposes.  @xref{Specifiers}.
+This function creates a new image specifier object and initializes it
+according to @var{spec-list}. @xref{Specifiers}.
+
+Note that, in practice, you rarely, if ever, need to actually create an
+image specifier! (This function exists mainly for completeness.) Pretty
+much the only use for image specifiers is to control how glyphs are
+displayed, and the image specifier associated with a glyph (the
+@code{image} property of a glyph) is created automatically when a glyph
+is created and need not (and cannot, for that matter) ever be changed
+(@pxref{Glyphs}).  In fact, the design decision to create a separate
+image specifier type, rather than make glyphs themselves be specifiers,
+is debatable---the other properties of glyphs are rarely used and could
+conceivably have been incorporated into the glyph's instantiator.  The
+rarely used glyph types (buffer, pointer, icon) could also have been
+incorporated into the instantiator.
 @end defun
 
   Image instantiators come in many formats: @code{xbm}, @code{xpm},
@@ -516,8 +712,49 @@ A glyph from a font; i.e. the name of a font, and glyph index into it
 of the form @samp{@var{font} fontname index [[mask-font] mask-index]}.
 Only if X support was compiled into this XEmacs.  Currently can only be
 instanced as @code{pointer}, although this should probably be fixed.
+@item mswindows-resource
+An MS Windows pointer resource.  Specifies a resource to retrieve
+directly from the system (an OEM resource) or from a file, particularly
+an executable file.  If the resource is to be retrieved from a file, use
+:file and optionally :resource-id.  Otherwise use :resource-id.  Always
+specify :resource-type to specify the type (cursor, bitmap or icon) of
+the resource.  Possible values for :resource-id are listed below.  Can
+be instanced as @code{pointer} or @code{color-pixmap}.
 @item subwindow
-An embedded X window; not currently implemented.
+An embedded windowing system window.  Can only be instanced as
+@code{subwindow}.
+@item button
+A button widget; either a push button, radio button or toggle button.
+Can only be instanced as @code{widget}.
+@item combo-box
+A drop list of selectable items in a widget, for editing text.
+Can only be instanced as @code{widget}.
+@item edit-field
+A text editing widget.  Can only be instanced as @code{widget}.
+@item label
+A static, text-only, widget; for displaying text.  Can only be instanced
+as @code{widget}.
+@item layout
+A widget for controlling the positioning of children underneath it.
+Through the use of nested layouts, a widget hierarchy can be created
+which can have the appearance of any standard dialog box or similar
+arrangement; all of this is counted as one @dfn{glyph} and could appear
+in many of the places that expect a single glyph.  Can only be instanced
+as @code{widget}.
+@item native-layout
+@c   #### Document me better!
+The native version of a layout widget.
+Can only be instanced as @code{widget}.
+@item progress-gauge
+A sliding widget, for showing progress.  Can only be instanced as
+@code{widget}.
+@item tab-control
+A tab widget; a series of user selectable tabs.  Can only be instanced
+as @code{widget}.
+@item tree-view
+A folding widget.  Can only be instanced as @code{widget}.
+@item scrollbar
+A scrollbar widget.  Can only be instanced as @code{widget}.
 @item autodetect
 XEmacs tries to guess what format the data is in.  If X support exists,
 the data string will be checked to see if it names a filename.  If so,
@@ -528,6 +765,9 @@ is one of the allowable image-instance types and the string names a
 valid cursor-font name, the image will be created as a pointer.
 Otherwise, the image will be displayed as text.  If no X support exists,
 the image will always be displayed as text.
+@item inherit
+Inherit from the background-pixmap property of a face.  Can only be
+instanced as @code{mono-pixmap}.
 @end table
 
 The valid keywords are:
@@ -587,8 +827,44 @@ specify symbolic color names to the actual color to be used for that
 symbolic color (in the form of a string or a color-specifier object).
 If this is not specified, the contents of @code{xpm-color-symbols} are
 used to generate the alist.
+@item :resource-id
+Only for @code{mswindows-resource}.  This must be either an integer
+(which directly specifies a resource number) or a string.  Valid strings
+are
+
+For bitmaps:
+
+"close", "uparrow", "dnarrow", "rgarrow", "lfarrow",
+"reduce", "zoom", "restore", "reduced", "zoomd",
+"restored", "uparrowd", "dnarrowd", "rgarrowd", "lfarrowd",
+"mnarrow", "combo", "uparrowi", "dnarrowi", "rgarrowi",
+"lfarrowi", "size", "btsize", "check", "checkboxes", and
+"btncorners".
+
+For cursors:
+
+"normal", "ibeam", "wait", "cross", "up", "sizenwse",
+"sizenesw", "sizewe", "sizens", "sizeall", and "no".
+
+For icons:
+
+"sample", "hand", "ques", "bang", "note", and "winlogo".
+@item :resource-type
+Only for @code{mswindows-resource}.  This must be a symbol, either
+@code{cursor}, @code{icon}, or @code{bitmap}, specifying the type of
+resource to be retrieved.
+@item :face
+Only for @code{inherit}.  This specifies the face to inherit from.  For
+widgets this also specifies the face to use for display. It defaults to
+gui-element-face.
 @end table
 
+Keywords accepted as menu item specs are also accepted by widgets.
+These are @code{:selected}, @code{:active}, @code{:suffix},
+@code{:keys}, @code{:style}, @code{:filter}, @code{:config},
+@code{:included}, @code{:key-sequence}, @code{:accelerator},
+@code{:label} and @code{:callback}.
+
 If instead of a vector, the instantiator is a string, it will be
 converted into a vector by looking it up according to the specs in the
 @code{console-type-image-conversion-list} for the console type of
@@ -770,10 +1046,14 @@ This function returns non-@code{nil} if @var{object} is an image
 instance of type @code{nothing}.
 @end defun
 
+@defun widget-image-instance-p object
+Return t if @var{object} is an image instance of type @code{widget}.
+@end defun
+
 @node Image Instance Functions
 @subsubsection Image Instance Functions
 
-@defun make-image-instance data &optional device dest-types no-error
+@defun make-image-instance data &optional domain dest-types no-error
 This function creates a new image-instance object.
 
 @var{data} is an image instantiator, which describes the image
@@ -789,14 +1069,47 @@ image formats, the most natural types are @code{color-pixmap}, followed
 by @code{mono-pixmap}, followed by @code{pointer}.  For the string and
 formatted-string formats, the most natural types are @code{text},
 followed by @code{mono-pixmap} (not currently implemented), followed by
-@code{color-pixmap} (not currently implemented).  The other formats can
-only be instantiated as one type. (If you want to control more
-specifically the order of the types into which an image is instantiated,
-just call @code{make-image-instance} repeatedly until it succeeds,
-passing less and less preferred destination types each time.
+@code{color-pixmap} (not currently implemented).  For MS Windows
+resources, the most natural type for pointer resources is
+@code{pointer}, and for the others it's @code{color-pixmap}.  The other
+formats can only be instantiated as one type. (If you want to control
+more specifically the order of the types into which an image is
+instantiated, just call @code{make-image-instance} repeatedly until it
+succeeds, passing less and less preferred destination types each time.
 
 If @var{dest-types} is omitted, all possible types are allowed.
 
+@var{domain} specifies the domain to which the image instance will be
+attached.  This domain is termed the @dfn{governing domain}.  The type
+of the governing domain depends on the image instantiator
+format. (Although, more correctly, it should probably depend on the
+image instance type.) For example, pixmap image instances are specific
+to a device, but widget image instances are specific to a particular
+XEmacs window because in order to display such a widget when two windows
+onto the same buffer want to display the widget, two separate underlying
+widgets must be created. (That's because a widget is actually a child
+window-system window, and all window-system windows have a unique
+existence on the screen.) This means that the governing domain for a
+pixmap image instance will be some device (most likely, the only
+existing device), whereas the governing domain for a widget image
+instance will be some XEmacs window.
+
+If you specify an overly general @var{domain} (e.g. a frame when a
+window was wanted), an error is signaled.  If you specify an overly
+specific @var{domain} (e.g. a window when a device was wanted), the
+corresponding general domain is fetched and used instead.  For
+@code{make-image-instance}, it makes no difference whether you specify
+an overly specific domain or the properly general domain derived from
+it.  However, it does matter when creating an image instance by
+instantiating a specifier or glyph (e.g. with
+@code{glyph-image-instance}), because the more specific domain causes
+spec lookup to start there and proceed to more general domains. (It
+would also matter when creating an image instance with an instantiator
+format of @code{inherit}, but we currently disallow this. #### We should
+fix this.)
+n
+If omitted, @var{domain} defaults to the selected window.
+
 @var{no-error} controls what happens when the image cannot be generated.
 If @var{nil}, an error message is generated.  If @var{t}, no messages
 are generated and this function returns @var{nil}.  If anything else, a
@@ -818,6 +1131,17 @@ returned.
 This function returns the name of the given image instance.
 @end defun
 
+@defun image-instance-domain image-instance
+
+Return the governing domain of the given @var{image-instance}.  The
+governing domain of an image instance is the domain that the image
+instance is specific to.  It is @emph{NOT} necessarily the domain that
+was given to the call to @code{specifier-instance} that resulted in the
+creation of this image instance.  See @code{make-image-instance} for
+more information on governing domains.
+@end defun
+
+
 @defun image-instance-string image-instance
 This function returns the string of the given image instance.  This will
 only be non-@code{nil} for text image instances.
index 4da9fa2..34c8d47 100644 (file)
@@ -14,13 +14,15 @@ can contain arbitrary text or graphics.
 
 @menu
 * Gutter Intro::               An introduction.
-* Gutter Descriptor Format::   How to create a gutter.
+* Creating Gutter::             How to create a gutter.
+* Gutter Descriptor Format::   Accessing and modifying a gutter's
+                                  properties.
 * Specifying a Gutter::                Setting a gutter's contents.
 * Other Gutter Variables::     Controlling the size of gutters.
 * Common Gutter Widgets::       Things to put in gutters.
 @end menu
 
-@node Gutter Intro, Gutter Descriptor Format, , Gutter
+@node Gutter Intro, Creating Gutter, Gutter, Gutter
 @section Gutter Intro
 
   A @dfn{gutter} is a rectangle displayed along one edge of a frame.  It
@@ -57,7 +59,70 @@ from the default just sets the position-specific specifiers, and if
 the user sets the default gutter to the same position, it will just
 not be visible.
 
-@node Gutter Descriptor Format, Specifying a Gutter, Gutter Intro, Gutter
+@node Creating Gutter, Gutter Descriptor Format, Gutter Intro, Gutter
+@section Creating Gutter
+
+@defun make-gutter-specifier spec-list
+
+Return a new @code{gutter} specifier object with the given specification
+list.  @var{spec-list} can be a list of specifications (each of which is
+a cons of a locale and a list of instantiators), a single instantiator,
+or a list of instantiators.  @xref{Specifiers}, for more information
+about specifiers.
+
+Gutter specifiers are used to specify the format of a gutter.  The
+values of the variables @code{default-gutter}, @code{top-gutter},
+@code{left-gutter}, @code{right-gutter}, and @code{bottom-gutter} are
+always gutter specifiers.
+
+Valid gutter instantiators are called "gutter descriptors" and are
+either strings or property-lists of strings.  See @code{default-gutter}
+for a description of the exact format.
+@end defun
+
+@defun make-gutter-size-specifier spec-list
+
+Return a new @code{gutter-size} specifier object with the given spec
+list.  @var{spec-list} can be a list of specifications (each of which is
+a cons of a locale and a list of instantiators), a single instantiator,
+or a list of instantiators.  @xref{Specifiers}, for more information
+about specifiers.
+
+Gutter-size specifiers are used to specify the size of a gutter.  The
+values of the variables @code{default-gutter-size},
+@code{top-gutter-size}, @code{left-gutter-size},
+@code{right-gutter-size}, and @code{bottom-gutter-size} are always
+gutter-size specifiers.
+
+Valid gutter-size instantiators are either integers or the special
+symbol @code{autodetect}. If a gutter-size is set to @code{autodetect}
+them the size of the gutter will be adjusted to just accomodate the
+gutters contents. @code{autodetect} only works for top and bottom
+gutters.
+@end defun
+
+@defun make-gutter-visible-specifier spec-list
+
+Return a new @code{gutter-visible} specifier object with the given spec
+list.  @var{spec-list} can be a list of specifications (each of which is
+a cons of a locale and a list of instantiators), a single instantiator,
+or a list of instantiators.  @xref{Specifiers}, for more information
+about specifiers.
+
+Gutter-visible specifiers are used to specify the visibility of a
+gutter.  The values of the variables @code{default-gutter-visible-p},
+@code{top-gutter-visible-p}, @code{left-gutter-visible-p},
+@code{right-gutter-visible-p}, and @code{bottom-gutter-visible-p} are
+always gutter-visible specifiers.
+
+Valid gutter-visible instantiators are t, nil or a list of symbols.  If
+a gutter-visible instantiator is set to a list of symbols, and the
+correspondong gutter specification is a property-list strings, then
+elements of the gutter specification will only be visible if the
+corresponding symbol occurs in the gutter-visible instantiator.
+@end defun
+
+@node Gutter Descriptor Format, Specifying a Gutter, Creating Gutter, Gutter
 @section Gutter Descriptor Format
 
   The contents of a gutter are specified using a @dfn{gutter descriptor}.
@@ -383,13 +448,13 @@ time-consuming operations like downloading.
 * Progress Bars::       Visual indication of operation progress.
 @end menu
 
-@node Buffer Tabs, Progress Bars, , Common Gutter Widgets
-@section Buffer Tabs
+@node Buffer Tabs, Progress Bars, ,Common Gutter Widgets
+@subsection Buffer Tabs
 
   Not documented yet.
 
-@node Progress Bars, , Buffer Tabs, Common Gutter Widgets
-@section Progress Bars
+@node Progress Bars,  , Buffer Tabs, Common Gutter Widgets
+@subsection Progress Bars
 
   Not documented yet.
 
index 332a960..d338082 100644 (file)
@@ -920,7 +920,7 @@ is controlled using the @code{modeline} face.  @xref{Faces}.
 
   The modeline contents are controlled by a data structure of lists,
 strings, symbols, and numbers kept in the buffer-local variable
-@code{mode-line-format}.  The data structure is called a @dfn{modeline
+@code{modeline-format}.  The data structure is called a @dfn{modeline
 construct}, and it is built in recursive fashion out of simpler modeline
 constructs.  The same data structure is used for constructing
 frame titles (@pxref{Frame Titles}).
@@ -943,8 +943,8 @@ Because of this, very few modes need to alter @code{modeline-format}.
 For most purposes, it is sufficient to alter the variables referenced by
 @code{modeline-format}.
 
-  A modeline construct may be a list, a symbol, or a string.  If the
-value is a list, each element may be a list, a symbol, or a string.
+  A modeline construct may be a string, symbol, glyph, generic
+specifier, list or cons cell.
 
 @table @code
 @cindex percent symbol in modeline
@@ -956,13 +956,22 @@ is left justified).  @xref{%-Constructs}.
 
 @item @var{symbol}
 A symbol as a modeline construct stands for its value.  The value of
-@var{symbol} is used as a modeline construct, in place of @var{symbol}.
-However, the symbols @code{t} and @code{nil} are ignored; so is any
-symbol whose value is void.
+@var{symbol} is processed as a modeline construct, in place of
+@var{symbol}.  However, the symbols @code{t} and @code{nil} are ignored;
+so is any symbol whose value is void.
 
 There is one exception: if the value of @var{symbol} is a string, it is
 displayed verbatim: the @code{%}-constructs are not recognized.
 
+@item @var{glyph}
+A glyph is displayed as is.
+
+@item @var{generic-specifier}
+A @var{generic-specifier} (i.e. a specifier of type @code{generic})
+stands for its instance.  The instance of @var{generic-specifier} is
+computed in the current window using the equivalent of
+@code{specifier-instance} and the value is processed.
+
 @item (@var{string} @var{rest}@dots{}) @r{or} (@var{list} @var{rest}@dots{})
 A list whose first element is a string or list means to process all the
 elements recursively and concatenate the results.  This is the most
@@ -987,6 +996,19 @@ if @var{width} is negative) on the right.
 
 For example, the usual way to show what percentage of a buffer is above
 the top of the window is to use a list like this: @code{(-3 "%p")}.
+
+@item (@var{extent} @var{rest}@dots{})
+
+A list whose car is an extent means the cdr of the list is processed
+normally but the results are displayed using the face of the extent, and
+mouse clicks over this section are processed using the keymap of the
+extent. (In addition, if the extent has a help-echo property, that
+string will be echoed when the mouse moves over this section.) If
+extents are nested, all keymaps are properly consulted when processing
+mouse clicks, but multiple faces are not correctly merged (only the
+first face is used), and lists of faces are not correctly handled.
+@c #### Document generate-modeline-string.
+@c See `generated-modeline-string' for more information.
 @end table
 
   If you do alter @code{modeline-format} itself, the new value should
@@ -1202,10 +1224,10 @@ The status of the subprocess belonging to the current buffer, obtained with
 
 @c The following two may only apply in XEmacs.
 @item %l
-the current line number.
+The current line number.
 
 @item %S
-the name of the selected frame; this is only meaningful under the
+The name of the selected frame; this is only meaningful under the
 X Window System.  @xref{Frame Name}.
 
 @item %t
@@ -1226,6 +1248,9 @@ visible on screen; or @samp{Bottom} or @samp{All}.
 @samp{Narrow} when narrowing is in effect; nothing otherwise (see
 @code{narrow-to-region} in @ref{Narrowing}).
 
+@item %C
+Under XEmacs/mule, the mnemonic for @code{buffer-file-coding-system}.
+
 @item %[
 An indication of the depth of recursive editing levels (not counting
 minibuffer levels): one @samp{[} for each editing level.
index 89bd121..660d251 100644 (file)
@@ -703,7 +703,7 @@ and can be used to restrict the scope of that instantiator to a
 particular device class or device type and/or to mark instantiators
 added by a particular package so that they can be later removed.
 
-A specifier tag set consists of a list of zero of more specifier tags,
+A specifier tag set consists of a list of zero or more specifier tags,
 each of which is a symbol that is recognized by XEmacs as a tag.  (The
 valid device types and device classes are always tags, as are any tags
 defined by @code{define-specifier-tag}.) It is called a ``tag set'' (as
@@ -934,11 +934,11 @@ of the symbols @code{generic}, @code{integer}, @code{natnum},
 @code{face-boolean}, or @code{toolbar}.
 
 For more information on particular types of specifiers, see the
-functions @code{generic-specifier-p}, @code{integer-specifier-p},
-@code{natnum-specifier-p}, @code{boolean-specifier-p},
-@code{color-specifier-p}, @code{font-specifier-p},
-@code{image-specifier-p}, @code{face-boolean-specifier-p}, and
-@code{toolbar-specifier-p}.
+functions @code{make-generic-specifier}, @code{make-integer-specifier},
+@code{make-natnum-specifier}, @code{make-boolean-specifier},
+@code{make-color-specifier}, @code{make-font-specifier},
+@code{make-image-specifier}, @code{make-face-boolean-specifier}, and
+@code{make-toolbar-specifier}.
 @end defun
 
 @defun make-specifier-and-init type spec-list &optional dont-canonicalize
@@ -954,6 +954,59 @@ this conversion is not performed, and the @var{spec-list} must already
 be in full form.  See @code{canonicalize-spec-list}.
 @end defun
 
+@defun make-integer-specifier spec-list
+
+Return a new @code{integer} specifier object with the given
+specification list.  @var{spec-list} can be a list of specifications
+(each of which is a cons of a locale and a list of instantiators), a
+single instantiator, or a list of instantiators.
+
+Valid instantiators for integer specifiers are integers.
+@end defun
+
+@defun make-boolean-specifier spec-list
+
+Return a new @code{boolean} specifier object with the given
+specification list.  @var{spec-list} can be a list of specifications
+(each of which is a cons of a locale and a list of instantiators), a
+single instantiator, or a list of instantiators.
+
+Valid instantiators for boolean specifiers are @code{t} and @code{nil}.
+@end defun
+
+@defun make-natnum-specifier spec-list
+
+Return a new @code{natnum} specifier object with the given specification
+list.  @var{spec-list} can be a list of specifications (each of which is
+a cons of a locale and a list of instantiators), a single instantiator,
+or a list of instantiators.
+
+Valid instantiators for natnum specifiers are non-negative integers.
+@end defun
+
+@defun make-generic-specifier spec-list
+
+Return a new @code{generic} specifier object with the given
+specification list.  @var{spec-list} can be a list of specifications
+(each of which is a cons of a locale and a list of instantiators), a
+single instantiator, or a list of instantiators.
+
+Valid instantiators for generic specifiers are all Lisp values.  They
+are returned back unchanged when a specifier is instantiated.
+@end defun
+
+@defun make-display-table-specifier spec-list
+
+Return a new @code{display-table} specifier object with the given spec
+list.  @var{spec-list} can be a list of specifications (each of which is
+a cons of a locale and a list of instantiators), a single instantiator,
+or a list of instantiators.
+
+Valid instantiators for display-table specifiers are described in detail
+in the doc string for @code{current-display-table} (@pxref{Active
+Display Table}).
+@end defun
+
 @node Specifier Validation Functions
 @section Functions for Checking the Validity of Specifier Components
 
index 13747cd..3d725a6 100644 (file)
@@ -9,7 +9,9 @@
 
 @menu
 * Toolbar Intro::              An introduction.
-* Toolbar Descriptor Format::  How to create a toolbar.
+* Creating Toolbar::            How to create a toolbar.
+* Toolbar Descriptor Format::  Accessing and modifying a toolbar's
+                                  properties.
 * Specifying the Toolbar::     Setting a toolbar's contents.
 * Other Toolbar Variables::    Controlling the size of toolbars.
 @end menu
@@ -57,6 +59,27 @@ from the default just sets the position-specific specifiers, and if
 the user sets the default toolbar to the same position, it will just
 not be visible.
 
+@node Creating Toolbar
+@section Creating Toolbar
+
+@defun make-toolbar-specifier spec-list
+
+Return a new @code{toolbar} specifier object with the given
+specification list.  @var{spec-list} can be a list of specifications
+(each of which is a cons of a locale and a list of instantiators), a
+single instantiator, or a list of instantiators.  @xref{Specifiers}, for
+more information about specifiers.
+
+Toolbar specifiers are used to specify the format of a toolbar.  The
+values of the variables @code{default-toolbar}, @code{top-toolbar},
+@code{left-toolbar}, @code{right-toolbar}, and @code{bottom-toolbar} are
+always toolbar specifiers.
+
+Valid toolbar instantiators are called "toolbar descriptors"
+and are lists of vectors.  See @code{default-toolbar} for a description
+of the exact format.
+@end defun
+
 @node Toolbar Descriptor Format
 @section Toolbar Descriptor Format
 
index 32cfc00..2c6f1c6 100644 (file)
@@ -1,4 +1,6 @@
-
+@c This is part of the XEmacs manual.
+@c Copyright (C) 1985, 86, 87, 93, 94, 95, 1997 Free Software Foundation, Inc.
+@c See file xemacs.texi for copying conditions.
 @node Basic, Undo, Startup Paths, Top
 @chapter Basic Editing Commands
 
@@ -7,8 +9,34 @@
   We now give the basics of how to enter text, make corrections, and
 save the text in a file.  If this material is new to you, you might
 learn it more easily by running the Emacs learn-by-doing tutorial.  To
-do this, type @kbd{Control-h t} (@code{help-with-tutorial}).
+use the tutorial, run Emacs and type @kbd{Control-h t}
+(@code{help-with-tutorial}).  You can also use @b{Tutorials} item from
+the @b{Help} menu.
+
+XEmacs comes with many translations of tutorial.  If your XEmacs is with
+MULE and you set up language environment correctly, XEmacs choses right
+tutorial when available (@pxref{Language Environments}).  If you want
+specific translation, give @kbd{C-h t} a prefix argument, like @kbd{C-u
+C-h t}.
+
+  To clear the screen and redisplay, type @kbd{C-l} (@code{recenter}).
+
+@menu
 
+* Inserting Text::      Inserting text by simply typing it.
+* Moving Point::        How to move the cursor to the place where you want to
+                         change something.
+* Erasing::            Deleting and killing text.
+* Files: Basic Files.   Visiting, creating, and saving files.
+* Help: Basic Help.     Asking what a character does.
+* Blank Lines::                Commands to make or delete blank lines.
+* Continuation Lines::  Lines too wide for the screen.
+* Position Info::       What page, line, row, or column is point on?
+* Arguments::          Numeric arguments for repeating a command.
+@c * Repeating::           A short-cut for repeating the previous command.
+@end menu
+
+@node Inserting Text, Moving Point, , Basic
 @section Inserting Text
 
 @cindex insertion
@@ -16,74 +44,92 @@ do this, type @kbd{Control-h t} (@code{help-with-tutorial}).
 @cindex cursor
 @cindex graphic characters
   To insert printing characters into the text you are editing, just type
-them.  This inserts the characters into the buffer at the cursor (that
-is, at @dfn{point}; @pxref{Point}).  The cursor moves forward.  Any
-characters after the cursor move forward too.  If the text in the buffer
-is @samp{FOOBAR}, with the cursor before the @samp{B}, and you type
-@kbd{XX}, the result is @samp{FOOXXBAR}, with the cursor still before the
-@samp{B}.
-
-@kindex DEL
+them.  This inserts the characters you type into the buffer at the
+cursor (that is, at @dfn{point}; @pxref{Point}).  The cursor moves
+forward, and any text after the cursor moves forward too.  If the text
+in the buffer is @samp{FOOBAR}, with the cursor before the @samp{B},
+then if you type @kbd{XX}, you get @samp{FOOXXBAR}, with the cursor
+still before the @samp{B}.
+
+@kindex BS
 @cindex deletion
-   To @dfn{delete} text you have just inserted, use @key{DEL}.
-@key{DEL} deletes the character @var{before} the cursor (not the one
-that the cursor is on top of or under; that is the character @var{after}
-the cursor).  The cursor and all characters after it move backwards.
-Therefore, if you type a printing character and then type @key{DEL},
-they cancel out.
+   To @dfn{delete} text you have just inserted, use @key{BS}.  @key{BS}
+deletes the character @emph{before} the cursor (not the one that the
+cursor is on top of or under; that is the character @var{after} the
+cursor).  The cursor and all characters after it move backwards.
+Therefore, if you type a printing character and then type @key{BS}, they
+cancel out.
 
 @kindex RET
 @cindex newline
    To end a line and start typing a new one, type @key{RET}.  This
 inserts a newline character in the buffer.  If point is in the middle of
 a line, @key{RET} splits the line.  Typing @key{DEL} when the cursor is
-at the beginning of a line rubs out the newline before the line, thus
-joining the line with the preceding line.
+at the beginning of a line deletes the preceding newline, thus joining
+the line with the preceding line.
 
-  Emacs automatically splits lines when they become too long, if you
-turn on a special mode called @dfn{Auto Fill} mode.  @xref{Filling}, for
-information on using Auto Fill mode.
+  Emacs can split lines automatically when they become too long, if you
+turn on a special minor mode called @dfn{Auto Fill} mode.
+@xref{Filling}, for how to use Auto Fill mode.
 
-@findex delete-backward-char
-@findex newline
-@findex self-insert
-  Customization information: @key{DEL}, in most modes, runs the command
-@code{delete-backward-char}; @key{RET} runs the command @code{newline},
-and self-inserting printing characters run the command
-@code{self-insert}, which inserts whatever character was typed to invoke
-it.  Some major modes rebind @key{DEL} to other commands.
+  If you prefer to have text characters replace (overwrite) existing
+text rather than shove it to the right, you can enable Overwrite mode,
+a minor mode.  @xref{Minor Modes}.
 
 @cindex quoting
 @kindex C-q
 @findex quoted-insert
-  Direct insertion works for printing characters and @key{SPC}, but
-other characters act as editing commands and do not insert themselves.
-If you need to insert a control character or a character whose code is
-above 200 octal, you must @dfn{quote} it by typing the character
-@kbd{control-q} (@code{quoted-insert}) first.  There are two ways to use
-@kbd{C-q}:@refill
+  Direct insertion works for printing characters and @key{SPC}, but other
+characters act as editing commands and do not insert themselves.  If you
+need to insert a control character or a character whose code is above 200
+octal, you must @dfn{quote} it by typing the character @kbd{Control-q}
+(@code{quoted-insert}) first.  (This character's name is normally written
+@kbd{C-q} for short.)  There are two ways to use @kbd{C-q}:
 
 @itemize @bullet
 @item
-@kbd{Control-q} followed by any non-graphic character (even @kbd{C-g})
+@kbd{C-q} followed by any non-graphic character (even @kbd{C-g})
 inserts that character.
+
 @item
-@kbd{Control-q} followed by three octal digits inserts the character
-with the specified character code.
+@kbd{C-q} followed by a sequence of octal digits inserts the character
+with the specified octal character code.  You can use any number of
+octal digits; any non-digit terminates the sequence.  If the terminating
+character is @key{RET}, it serves only to terminate the sequence; any
+other non-digit is itself used as input after terminating the sequence.
+(The use of octal sequences is disabled in ordinary non-binary Overwrite
+mode, to give you a convenient way to insert a digit instead of
+overwriting with it.)
 @end itemize
 
 @noindent
 A numeric argument to @kbd{C-q} specifies how many copies of the quoted
 character should be inserted (@pxref{Arguments}).
 
-  If you prefer to have text characters replace (overwrite) existing
-text instead of moving it to the right, you can enable Overwrite mode, a
-minor mode.  @xref{Minor Modes}.
+@findex backward-or-forward-delete-char
+@findex newline
+@findex self-insert
+  Customization information: @key{DEL}, in most modes, runs the command
+@code{backward-or-forward-delete-char}; @key{RET} runs the command
+@code{newline}, and self-inserting printing characters run the command
+@code{self-insert}, which inserts whatever character was typed to invoke
+it.  Some major modes rebind @key{DEL} to other commands.
 
+@node Moving Point, Erasing, Inserting Text, Basic
 @section Changing the Location of Point
 
+@cindex arrow keys
+@kindex LEFT
+@kindex RIGHT
+@kindex UP
+@kindex DOWN
+@cindex moving point
+@cindex movement
+@cindex cursor motion
+@cindex moving the cursor
   To do more than insert characters, you have to know how to move point
-(@pxref{Point}).  Here are a few of the available commands.
+(@pxref{Point}).  The simplest way to do this is with arrow keys, or by
+clicking the left mouse button where you want to move to.
 
   NOTE: Many of the following commands have two versions, one that uses
 the function keys (e.g. @key{LEFT} or @key{END}) and one that doesn't.
@@ -149,7 +195,10 @@ Move forward one word (@code{forward-word}).
 Move backward one word (@code{backward-word}).
 @item C-n
 @itemx DOWN
-Move down one line, vertically (@code{next-line}).  This command attempts to keep the horizontal position unchanged, so if you start in the middle of one line, you end in the middle of the next.  When on the last line of text, @kbd{C-n} creates a new line and moves onto it.
+Move down one line, vertically (@code{next-line}).  This command
+attempts to keep the horizontal position unchanged, so if you start in
+the middle of one line, you end in the middle of the next.  When on the
+last line of text, @kbd{C-n} creates a new line and moves onto it.
 @item C-p
 @itemx UP
 Move up one line, vertically (@code{previous-line}).
@@ -163,14 +212,16 @@ Move up one page, vertically (@code{scroll-down}).
 Clear the frame and reprint everything (@code{recenter}).  Text moves
 on the frame to bring point to the center of the window.
 @item M-r
-Move point to left margin on the line halfway down the frame or
-window (@code{move-to-window-line}).  Text does not move on the
-frame.  A numeric argument says how many screen lines down from the
-top of the window (zero for the top).  A negative argument counts from
-the bottom (@minus{}1 for the bottom).
+Move point to left margin, vertically centered in the window
+(@code{move-to-window-line}).  Text does not move on the screen.
+
+A numeric argument says which screen line to place point on.  It counts
+screen lines down from the top of the window (zero for the top line).  A
+negative argument counts lines from the bottom (@minus{}1 for the bottom
+line).
 @item C-t
 Transpose two characters, the ones before and after the cursor
-@*(@code{transpose-chars}).
+(@code{transpose-chars}).
 @item M-<
 @itemx C-HOME
 Move to the top of the buffer (@code{beginning-of-buffer}).  With
@@ -180,35 +231,46 @@ numeric argument @var{n}, move to @var{n}/10 of the way from the top.
 @itemx C-END
 Move to the end of the buffer (@code{end-of-buffer}).
 @item M-x goto-char
-Read a number @var{n} and move the cursor to character number @var{n}.
+Read a number @var{n} and move point to buffer position @var{n}.
 Position 1 is the beginning of the buffer.
 @item M-g
-Read a number @var{n} and move cursor to line number @var{n}
+Read a number @var{n} and move point to line number @var{n}
 (@code{goto-line}).  Line 1 is the beginning of the buffer.
-@item C-x C-n
+@c @item C-x C-n
+@item M-x set-goal-column
 @findex set-goal-column
 Use the current column of point as the @dfn{semi-permanent goal column} for
 @kbd{C-n} and @kbd{C-p} (@code{set-goal-column}).  Henceforth, those
 commands always move to this column in each line moved into, or as
 close as possible given the contents of the line.  This goal column remains
 in effect until canceled.
-@item C-u C-x C-n
+@c @item C-u C-x C-n
+@item C-u M-x set-goal-column
 Cancel the goal column.  Henceforth, @kbd{C-n} and @kbd{C-p} once
 again try to avoid changing the horizontal position, as usual.
 @end table
 
 @vindex track-eol
   If you set the variable @code{track-eol} to a non-@code{nil} value,
-@kbd{C-n} and @kbd{C-p} move to the end of the line when at the end of
-the starting line.  By default, @code{track-eol} is @code{nil}.
+then @kbd{C-n} and @kbd{C-p} when at the end of the starting line move
+to the end of another line.  Normally, @code{track-eol} is @code{nil}.
+@xref{Variables}, for how to set variables such as @code{track-eol}.
+
+@vindex next-line-add-newlines
+  Normally, @kbd{C-n} on the last line of a buffer appends a newline to
+it.  If the variable @code{next-line-add-newlines} is @code{nil}, then
+@kbd{C-n} gets an error instead (like @kbd{C-p} on the first line).
 
+@node Erasing, Basic Files, Moving Point, Basic
 @section Erasing Text
 
 @table @kbd
 @item @key{DEL}
-Delete the character before the cursor (@code{delete-backward-char}).
+Delete the character before or after point
+(@code{backward-or-forward-delete-char}).  You can customize
+this behavior by setting the variable @code{delete-key-deletes-forward}.
 @item C-d
-Delete the character after the cursor (@code{delete-char}).
+Delete the character after point (@code{delete-char}).
 @item C-k
 Kill to the end of the line (@code{kill-line}).
 @item M-d
@@ -218,30 +280,34 @@ Kill back to the beginning of the previous word
 (@code{backward-kill-word}).
 @end table
 
-  In contrast to the @key{DEL} key, which deletes the character before
-the cursor, @kbd{Control-d} deletes the character after the cursor,
-causing the rest of the text on the line to shift left.  If
-@kbd{Control-d} is typed at the end of a line, that line and the next
-line are joined.
-
-  To erase a larger amount of text, use @kbd{Control-k}, which kills a
-line at a time.  If you use @kbd{C-k} at the beginning or in the middle
-of a line, it kills all the text up to the end of the line.  If you use
-@kbd{C-k} at the end of a line, it joins that line and the next
-line.
+@cindex killing characters and lines
+@cindex deleting characters and lines
+@cindex erasing characters and lines
+  You already know about the @key{DEL} key which deletes the character
+before point (that is, before the cursor).  Another key, @kbd{Control-d}
+(@kbd{C-d} for short), deletes the character after point (that is, the
+character that the cursor is on).  This shifts the rest of the text on
+the line to the left.  If you type @kbd{C-d} at the end of a line, it
+joins together that line and the next line.
+
+  To erase a larger amount of text, use the @kbd{C-k} key, which kills a
+line at a time.  If you type @kbd{C-k} at the beginning or middle of a
+line, it kills all the text up to the end of the line.  If you type
+@kbd{C-k} at the end of a line, it joins that line and the next line.
 
   @xref{Killing}, for more flexible ways of killing text.
 
+@node Basic Files, Basic Help, Erasing, Basic
 @section Files
 
 @cindex files
-  The commands above are sufficient for creating and altering text in an
-Emacs buffer.  More advanced Emacs commands just make things easier.  But
-to keep any text permanently you must put it in a @dfn{file}.  Files are
-named units of text which are stored by the operating system and which
-you can retrieve by name.  To look at or use the contents of a file in
-any way, including editing the file with Emacs, you must specify the
-file name.
+  The commands described above are sufficient for creating and altering
+text in an Emacs buffer; the more advanced Emacs commands just make
+things easier.  But to keep any text permanently you must put it in a
+@dfn{file}.  Files are named units of text which are stored by the
+operating system for you to retrieve later by name.  To look at or use
+the contents of a file in any way, including editing the file with
+Emacs, you must specify the file name.
 
   Consider a file named @file{/usr/rms/foo.c}.  To begin editing
 this file from Emacs, type:
@@ -251,54 +317,51 @@ C-x C-f /usr/rms/foo.c @key{RET}
 @end example
 
 @noindent
-The file name is given as an @dfn{argument} to the command @kbd{C-x
-C-f} (@code{find-file}).  The command uses the @dfn{minibuffer} to
-read the argument.  You have to type @key{RET} to terminate the argument
-(@pxref{Minibuffer}).@refill
+Here the file name is given as an @dfn{argument} to the command @kbd{C-x
+C-f} (@code{find-file}).  That command uses the @dfn{minibuffer} to
+read the argument, and you type @key{RET} to terminate the argument
+(@pxref{Minibuffer}).
 
   You can also use the @b{Open...} menu item from the @b{File} menu, then
 type the name of the file to the prompt.
 
-  Emacs obeys the command by @dfn{visiting} the file: it creates a
-buffer, copies the contents of the file into the buffer, and then
-displays the buffer for you to edit.  You can make changes in the
-buffer, and then @dfn{save} the file by typing @kbd{C-x C-s}
-(@code{save-buffer}) or choosing @b{Save Buffer} from the @b{File} menu.
-This makes the changes permanent by copying the altered contents of the
-buffer back into the file @file{/usr/rms/foo.c}.  Until then, the
-changes are only inside your Emacs buffer, and the file @file{foo.c} is
-not changed.@refill
+  Emacs obeys the command by @dfn{visiting} the file: creating a buffer,
+copying the contents of the file into the buffer, and then displaying
+the buffer for you to edit.  If you alter the text, you can @dfn{save}
+the new text in the file by typing @kbd{C-x C-s} (@code{save-buffer}) or
+choosing @b{Save Buffer} from the @b{File} menu.  This makes the changes
+permanent by copying the altered buffer contents back into the file
+@file{/usr/rms/foo.c}.  Until you save, the changes exist only inside
+Emacs, and the file @file{foo.c} is unaltered.
 
   To create a file, visit the file with @kbd{C-x C-f} as if it already
 existed or choose @b{Open...} from the @b{File} menu and provide the
-name for the new file in the minibuffer.  Emacs will create an empty
-buffer in which you can insert the text you want to put in the file.
-When you save the buffer with @kbd{C-x C-s}, or by choosing @b{Save
-Buffer} from the @b{File} menu, the file is created.
+name for the new file.  Emacs will create an empty buffer in which you
+can insert the text you want to put in the file.  When you save the
+buffer with @kbd{C-x C-s}, or by choosing @b{Save Buffer} from the
+@b{File} menu, the file is created.
 
-  To learn more about using files, @pxref{Files}.
+  To learn more about using files, @xref{Files}.
 
+@node Basic Help, Blank Lines, Basic Files, Basic
 @section Help
 
-  If you forget what a key does, you can use the Help character
-(@kbd{C-h}) to find out: Type @kbd{C-h k} followed by the key you want
-to know about.  For example, @kbd{C-h k C-n} tells you what @kbd{C-n}
+@cindex getting help with keys
+  If you forget what a key does, you can find out with the Help
+character, which is @kbd{C-h} (or @key{F1}, which is an alias for
+@kbd{C-h}).  Type @kbd{C-h k} followed by the key you want to know
+about; for example, @kbd{C-h k C-n} tells you all about what @kbd{C-n}
 does.  @kbd{C-h} is a prefix key; @kbd{C-h k} is just one of its
 subcommands (the command @code{describe-key}).  The other subcommands of
-@kbd{C-h} provide different kinds of help.  Type @kbd{C-h} three times
-to get a description of all the help facilities.  @xref{Help}.@refill
-
-@menu
-* Blank Lines::        Commands to make or delete blank lines.
-* Continuation Lines:: Lines too wide for the frame.
-* Position Info::      What page, line, row, or column is point on?
-* Arguments::         Numeric arguments for repeating a command.
-@end menu
+@kbd{C-h} provide different kinds of help.  Type @kbd{C-h} twice to get
+a description of all the help facilities.  @xref{Help}.
 
-@node Blank Lines, Continuation Lines, Basic, Basic
+@node Blank Lines, Continuation Lines, Basic Help, Basic
 @section Blank Lines
 
-  Here are special commands and techniques for entering and removing
+@cindex inserting blank lines
+@cindex deleting blank lines
+  Here are special commands and techniques for putting in and taking out
 blank lines.
 
 @c widecommands
@@ -315,55 +378,65 @@ Delete all but one of many consecutive blank lines
 @cindex blank lines
 @findex open-line
 @findex delete-blank-lines
-  When you want to insert a new line of text before an existing line,
-you just type the new line of text, followed by @key{RET}.  If you
-prefer to create a blank line first and then insert the desired text,
-use the key @kbd{C-o} (@code{open-line}), which inserts a newline after
-point but leaves point in front of the newline.  Then type
-the text into the new line.  @kbd{C-o F O O} has the same effect as
-@kbd{F O O @key{RET}}, except for the final location of point.
-
-  To create several blank lines, type @kbd{C-o} several times, or
-give @kbd{C-o} an argument indicating how many blank lines to create.
-@xref{Arguments}, for more information.
-
-  If you have many blank lines in a row and want to get rid of them, use
-@kbd{C-x C-o} (@code{delete-blank-lines}).  If point is on a blank
-line which is adjacent to at least one other blank line, @kbd{C-x C-o}
-deletes all but one of the blank lines.
-If point is on a blank line with no other adjacent blank line, the
-sole blank line is deleted.  If point is on a non-blank
-line, @kbd{C-x C-o} deletes any blank lines following that non-blank
-line.
+  When you want to insert a new line of text before an existing line, you
+can do it by typing the new line of text, followed by @key{RET}.
+However, it may be easier to see what you are doing if you first make a
+blank line and then insert the desired text into it.  This is easy to do
+using the key @kbd{C-o} (@code{open-line}), which inserts a newline
+after point but leaves point in front of the newline.  After @kbd{C-o},
+type the text for the new line.  @kbd{C-o F O O} has the same effect as
+@w{@kbd{F O O @key{RET}}}, except for the final location of point.
+
+  You can make several blank lines by typing @kbd{C-o} several times, or
+by giving it a numeric argument to tell it how many blank lines to make.
+@xref{Arguments}, for how.  If you have a fill prefix, then @kbd{C-o}
+command inserts the fill prefix on the new line, when you use it at the
+beginning of a line.  @xref{Fill Prefix}.
+
+  The easy way to get rid of extra blank lines is with the command
+@kbd{C-x C-o} (@code{delete-blank-lines}).  @kbd{C-x C-o} in a run of
+several blank lines deletes all but one of them.  @kbd{C-x C-o} on a
+solitary blank line deletes that blank line.  When point is on a
+nonblank line, @kbd{C-x C-o} deletes any blank lines following that
+nonblank line.
 
 @node Continuation Lines, Position Info, Blank Lines, Basic
 @section Continuation Lines
 
 @cindex continuation line
-  If you add too many characters to one line without breaking with a
-@key{RET}, the line grows to occupy two (or more) screen lines, with a
-curved arrow at the extreme right margin of all but the last line.  The
-curved arrow indicates that the following screen line is not really a
-distinct line in the text, but just the @dfn{continuation} of a line too
-long to fit the frame.  You can use Auto Fill mode (@pxref{Filling})
-to have Emacs insert newlines automatically when a line gets too long.
-
+@cindex wrapping
+@cindex line wrapping
+  If you add too many characters to one line without breaking it with
+@key{RET}, the line will grow to occupy two (or more) lines on the
+screen, with a curved arrow at the extreme right margin of all but the
+last of them.  The curved arrow says that the following screen line is
+not really a distinct line in the text, but just the @dfn{continuation}
+of a line too long to fit the screen.  Continuation is also called
+@dfn{line wrapping}.
+
+  Sometimes it is nice to have Emacs insert newlines automatically when
+a line gets too long.  Continuation on the screen does not do that.  Use
+Auto Fill mode (@pxref{Filling}) if that's what you want.
 
 @vindex truncate-lines
 @cindex truncation
   Instead of continuation, long lines can be displayed by @dfn{truncation}.
 This means that all the characters that do not fit in the width of the
 frame or window do not appear at all.  They remain in the buffer,
-temporarily invisible.  Three diagonal dots in the last column (instead of
-the curved arrow inform you that truncation is in effect.
+temporarily invisible.  Right arrow in the last column (instead of the
+curved arrow) inform you that truncation is in effect.
+
+  Truncation instead of continuation happens whenever horizontal
+scrolling is in use, and optionally in all side-by-side windows
+(@pxref{Windows}).  You can enable truncation for a particular buffer by
+setting the variable @code{truncate-lines} to non-@code{nil} in that
+buffer.  (@xref{Variables}.)  Altering the value of
+@code{truncate-lines} makes it local to the current buffer; until that
+time, the default value is in effect.  The default is initially
+@code{nil}.  @xref{Locals}.
 
-  To turn off continuation for a particular buffer, set the
-variable @code{truncate-lines} to non-@code{nil} in that buffer.
-Truncation instead of continuation also happens whenever horizontal
-scrolling is in use, and optionally whenever side-by-side windows are in
-use (@pxref{Windows}).  Altering the value of @code{truncate-lines} makes
-it local to the current buffer; until that time, the default value is in
-effect.  The default is initially @code{nil}.  @xref{Locals}.@refill
+  @xref{Display Vars}, for additional variables that affect how text is
+displayed.
 
 @node Position Info, Arguments, Continuation Lines, Basic
 @section Cursor Position Information
@@ -380,9 +453,12 @@ information, it is not displayed all the time.
 Print page number of point, and line number within page.
 @item M-x what-line
 Print line number of point in the buffer.
+@item M-x line-number-mode
+Toggle automatic display of current line number.
 @item M-=
-Print number of lines and characters in the current region 
-(@code{count-lines-region}).
+Print number of lines and characters in the current region
+(@code{count-lines-region}).  @xref{Mark}, for information about the
+region.
 @item C-x =
 Print character code of character after point, character position of
 point, and column of point (@code{what-cursor-position}).
@@ -396,6 +472,7 @@ point, and column of point (@code{what-cursor-position}).
 @findex count-lines-region
 
   There are several commands for printing line numbers:
+
 @itemize @bullet
 @item
 @kbd{M-x what-line} counts lines from the beginning of the file and
@@ -407,26 +484,28 @@ goto-line}.
 counts lines within the page, printing both of them.  @xref{Pages}, for
 the command @kbd{C-x l}, which counts the lines in the current page.
 @item
-@kbd{M-=} (@code{count-lines-region}) prints the number of lines in
-the region (@pxref{Mark}).
+@kbd{M-=} (@code{count-lines-region}) prints the number of lines in the
+region (@pxref{Mark}).  @xref{Pages}, for the command @kbd{C-x l} which
+counts the lines in the
 @end itemize
 
 @kindex C-x =
 @findex what-cursor-position
-  The command @kbd{C-x =} (@code{what-cursor-position}) provides
-information about point and about the column the cursor is in.
-It prints a line in the echo area that looks like this:
+  The command @kbd{C-x =} (@code{what-cursor-position}) can be used to find out
+the column that the cursor is in, and other miscellaneous information about
+point.  It prints a line in the echo area that looks like this:
 
 @example
-Char: x (0170)  point=65986 of 563027(12%)  column 44
+Char: c (0143, 99, 0x63)  point=18862 of 24800(76%)  column 53 
 @end example
 
 @noindent
-(In fact, this is the output produced when point is before @samp{column 44}
-in the example.)
+(In fact, this is the output produced when point is before @samp{column
+53} in the example.)
 
-  The two values after @samp{Char:} describe the character following point,
-first by showing it and second by giving its octal character code.
+  The four values after @samp{Char:} describe the character that follows
+point, first by showing it and then by giving its character code in
+octal, decimal and hex. 
 
   @samp{point=} is followed by the position of point expressed as a character
 count.  The front of the buffer counts as position 1, one character later
@@ -434,8 +513,8 @@ as 2, and so on.  The next, larger number is the total number of characters
 in the buffer.  Afterward in parentheses comes the position expressed as a
 percentage of the total size.
 
-  @samp{column} is followed by the horizontal position of point, in columns
-from the left edge of the window.
+  @samp{column} is followed by the horizontal position of point, in
+columns from the left edge of the window.
 
   If the buffer has been narrowed, making some of the text at the
 beginning and the end temporarily invisible, @kbd{C-x =} prints
@@ -443,7 +522,7 @@ additional text describing the current visible range.  For example, it
 might say:
 
 @smallexample
-Char: x (0170)  point=65986 of 563025(12%) <65102 - 68533>  column 44
+Char: c (0143, 99, 0x63)  point=19674 of 24575(80%) <19591 - 19703>  column 69 
 @end smallexample
 
 @noindent
@@ -463,12 +542,15 @@ point=563026 of 563025(100%)  column 0
 @section Numeric Arguments
 @cindex numeric arguments
 
-  Any Emacs command can be given a @dfn{numeric argument}.  Some commands
-interpret the argument as a repetition count.  For example, giving an
-argument of ten to the key @kbd{C-f} (the command @code{forward-char}, move
-forward one character) moves forward ten characters.  With these commands,
-no argument is equivalent to an argument of one.  Negative arguments are
-allowed.  Often they tell a command to move or act backwards.
+  In mathematics and computer usage, the word @dfn{argument} means
+``data provided to a function or operation.''  Any Emacs command can be
+given a @dfn{numeric argument} (also called a @dfn{prefix argument}).
+Some commands interpret the argument as a repetition count.  For
+example, giving an argument of ten to the key @kbd{C-f} (the command
+@code{forward-char}, move forward one character) moves forward ten
+characters.  With these commands, no argument is equivalent to an
+argument of one.  Negative arguments are allowed.  Often they tell a
+command to move or act  in the opposite direction.
 
 @kindex M-1
 @kindex M-@t{-}
@@ -482,18 +564,21 @@ minus sign while holding down the @key{META} key.  For example,
 M-5 C-n
 @end example
 @noindent
-moves down five lines.  The characters @kbd{Meta-1}, @kbd{Meta-2}, and
-so on, as well as @kbd{Meta--}, do this because they are keys bound to
-commands (@code{digit-argument} and @code{negative-argument}) that are
-defined to contribute to an argument for the next command.
+would move down five lines.  The characters @kbd{Meta-1}, @kbd{Meta-2},
+and so on, as well as @kbd{Meta--}, do this because they are keys bound
+to commands (@code{digit-argument} and @code{negative-argument}) that
+are defined to contribute to an argument for the next command.  Digits
+and @kbd{-} modified with Control, or Control and Meta, also specify
+numeric arguments.
 
 @kindex C-u
 @findex universal-argument
   Another way of specifying an argument is to use the @kbd{C-u}
-(@code{universal-argument}) command followed by the digits of the argument.
-With @kbd{C-u}, you can type the argument digits without holding
-down shift keys.  To type a negative argument, start with a minus sign.
-Just a minus sign normally means @minus{}1.  @kbd{C-u} works on all terminals.
+(@code{universal-argument}) command followed by the digits of the
+argument.  With @kbd{C-u}, you can type the argument digits without
+holding down modifier keys; @kbd{C-u} works on all terminals.  To type a
+negative argument, type a minus sign after @kbd{C-u}.  Just a minus sign
+without digits normally means @minus{}1.
 
   @kbd{C-u} followed by a character which is neither a digit nor a minus
 sign has the special meaning of ``multiply by four''.  It multiplies the
@@ -503,7 +588,7 @@ is a good way to move forward ``fast'', since it moves about 1/5 of a line
 in the usual size frame.  Other useful combinations are @kbd{C-u C-n},
 @kbd{C-u C-u C-n} (move down a good fraction of a frame), @kbd{C-u C-u
 C-o} (make ``a lot'' of blank lines), and @kbd{C-u C-k} (kill four
-lines).@refill
+lines).
 
   Some commands care only about whether there is an argument and not about
 its value.  For example, the command @kbd{M-q} (@code{fill-paragraph}) with
@@ -519,32 +604,47 @@ special: it kills the text up to the next newline, or, if point is right at
 the end of the line, it kills the newline itself.  Thus, two @kbd{C-k}
 commands with no arguments can kill a non-blank line, just like @kbd{C-k}
 with an argument of one.  (@xref{Killing}, for more information on
-@kbd{C-k}.)@refill
+@kbd{C-k}.)
 
   A few commands treat a plain @kbd{C-u} differently from an ordinary
 argument.  A few others may treat an argument of just a minus sign
-differently from an argument of @minus{}1.  These unusual cases will be
-described when they come up; they are always to make the individual
-command more convenient to use.
+differently from an argument of @minus{}1.  These unusual cases are
+described when they come up; they are always for reasons of convenience
+of use of the individual command.
+
+  You can use a numeric argument to insert multiple copies of a
+character.  This is straightforward unless the character is a digit; for
+example, @kbd{C-u 6 4 a} inserts 64 copies of the character @samp{a}.
+But this does not work for inserting digits; @kbd{C-u 6 4 1} specifies
+an argument of 641, rather than inserting anything.  To separate the
+digit to insert from the argument, type another @kbd{C-u}; for example,
+@kbd{C-u 6 4 C-u 1} does insert 64 copies of the character @samp{1}.
+
+  We use the term ``prefix argument'' as well as ``numeric argument'' to
+emphasize that you type the argument before the command, and to
+distinguish these arguments from minibuffer arguments that come after
+the command.
 
-@c section Autoarg Mode
 @ignore
-@cindex autoarg mode
-  Users of ASCII keyboards may prefer to use Autoarg mode.  Autoarg mode
-means that you don't need to type @kbd{C-u} to specify a numeric argument.
-Instead, you type just the digits.  Digits followed by an ordinary
-inserting character are themselves inserted, but digits followed by an
-Escape or Control character serve as an argument to it and are not
-inserted.  A minus sign can also be part of an argument, but only at the
-beginning.  If you type a minus sign following some digits, both the digits
-and the minus sign are inserted.
-
-  To use Autoarg mode, set the variable Autoarg Mode nonzero.
-@xref{Variables}.
-
-  Autoargument digits echo at the bottom of the frame; the first
-nondigit causes them to be inserted or uses them as an argument.  To
-insert some digits and nothing else, you must follow them with a Space
-and then rub it out.  @kbd{C-g} cancels the digits, while Delete inserts
-them all and then rubs out the last.
+@node Repeating
+@section Repeating a Command
+@cindex repeating a command
+
+@kindex C-x z
+@findex repeat
+  The command @kbd{C-x z} (@code{repeat}) provides another way to repeat
+an Emacs command many times.  This command repeats the previous Emacs
+command, whatever that was.  Repeating a command uses the same arguments
+that were used before; it does not read new arguments each time.
+
+  To repeat the command more than once, type additional @kbd{z}'s: each
+@kbd{z} repeats the command one more time.  Repetition ends when you
+type a character other than @kbd{z}, or press a mouse button.
+
+  For example, suppose you type @kbd{C-u 2 0 C-d} to delete 20
+characters.  You can repeat that command (including its argument) three
+additional times, to delete a total of 80 characters, by typing @kbd{C-x
+z z z}.  The first @kbd{C-x z} repeats the command once, and each
+subsequent @kbd{z} repeats it once again.
+
 @end ignore
index 2c9b33c..00d45ae 100644 (file)
@@ -1,53 +1,91 @@
-
+@c This is part of the XEmacs manual.
+@c Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995 Free Software Foundation, Inc.
+@c See file xemacs.texi for copying conditions.
 @node Entering Emacs, Exiting, Pull-down Menus, Top
 @chapter Entering and Exiting Emacs
-@cindex entering Emacs
 @cindex entering XEmacs
+@cindex starting XEmacs
 
-  The usual way to invoke Emacs is to type @kbd{emacs @key{RET}} at the
-shell (for XEmacs, type @kbd{xemacs @key{RET}}).  Emacs clears the
-screen and then displays an initial advisory message and copyright
-notice.  You can begin typing Emacs commands immediately afterward.
+  The usual way to invoke XEmacs is to type @kbd{xemacs @key{RET}} at
+the shell.  XEmacs clears the screen and then displays an initial
+advisory message and copyright notice.  You can begin typing XEmacs
+commands immediately afterward.
 
-  Some operating systems insist on discarding all type-ahead when Emacs
-starts up; they give Emacs no way to prevent this.  Therefore, it is
-wise to wait until Emacs clears the screen before typing the first
+  Some operating systems insist on discarding all type-ahead when XEmacs
+starts up; they give XEmacs no way to prevent this.  Therefore, it is
+advisable to wait until XEmacs clears the screen before typing your first
 editing command.
 
+  If you run XEmacs from a shell window under the X Window System, run it
+in the background with @samp{xemacs&}.  This way, XEmacs does not tie up
+the shell window, so you can use that to run other shell commands while
+XEmacs operates its own X windows.  You can begin typing XEmacs commands
+as soon as you direct your keyboard input to the XEmacs frame.
+
 @vindex initial-major-mode
   Before Emacs reads the first command, you have not had a chance to
-give a command to specify a file to edit.  Since Emacs must always have a
-current buffer for editing, it presents a buffer, by default, a buffer named
-@samp{*scratch*}.  The buffer is in Lisp Interaction
-mode; you can use it to type Lisp expressions and evaluate them, or you
-can ignore that capability and simply doodle.  You can specify a
-different major mode for this buffer by setting the variable
-@code{initial-major-mode} in your init file.  @xref{Init File}.
+give a command to specify a file to edit.  Since Emacs must always have
+a current buffer for editing, it presents a buffer, by default, a buffer
+named @samp{*scratch*}.  The buffer is in Lisp Interaction mode; you can
+use it to type Lisp expressions and evaluate them, or you can ignore
+that capability and simply doodle.  (You can specify a different major
+mode for this buffer by setting the variable @code{initial-major-mode}
+in your init file.  @xref{Init File}.)
+
+  It is possible to specify files to be visited, Lisp files to be
+loaded, and functions to be called, by giving Emacs arguments in the
+shell command line.  @xref{Command Switches}.  But we don't recommend
+doing this.  The feature exists mainly for compatibility with other
+editors.
 
-  It is possible to give Emacs arguments in the shell command line to
-specify files to visit, Lisp files to load, and functions to call.
+  Many other editors are designed to be started afresh each time you
+want to edit.  You edit one file and then exit the editor.  The next
+time you want to edit either another file or the same one, you must run
+the editor again.  With these editors, it makes sense to use a
+command-line argument to say which file to edit.
+
+  But starting a new Emacs each time you want to edit a different file
+does not make sense.  For one thing, this would be annoyingly slow.  For
+another, this would fail to take advantage of Emacs's ability to visit
+more than one file in a single editing session.  And it would lose the
+other accumulated context, such as registers, undo history, and the mark
+ring.
+
+  The recommended way to use XEmacs is to start it only once, just
+after you log in, and do all your editing in the same Emacs session.
+Each time you want to edit a different file, you visit it with the
+existing Emacs, which eventually comes to have many files in it ready
+for editing.  Usually you do not kill the Emacs until you are about to
+log out.  @xref{Files}, for more information on visiting more than one
+file.
 
 @node Exiting, Command Switches, Entering Emacs, Top
 @section Exiting Emacs
 @cindex exiting
 @cindex killing Emacs
 @cindex suspending
+@cindex leaving Emacs
+@cindex quitting Emacs
 @cindex shrinking XEmacs frame
 
   There are two commands for exiting Emacs because there are two kinds
 of exiting: @dfn{suspending} Emacs and @dfn{killing} Emacs.
-@dfn{Suspending} means stopping Emacs temporarily and returning control
-to its superior (usually the shell), allowing you to resume editing
-later in the same Emacs job, with the same files, same kill ring, same
-undo history, and so on.  This is the usual way to exit.  @dfn{Killing}
-Emacs means destroying the Emacs job.  You can run Emacs again later,
-but you will get a fresh Emacs; there is no way to resume the same
-editing session after it has been killed.
+
+  @dfn{Suspending} means stopping Emacs temporarily and returning
+control to its parent process (usually a shell), allowing you to resume
+editing later in the same Emacs job, with the same buffers, same kill
+ring, same undo history, and so on.  This is the usual way to exit.
+
+  @dfn{Killing} Emacs means destroying the Emacs job.  You can run Emacs
+again later, but you will get a fresh Emacs; there is no way to resume
+the same editing session after it has been killed.
 
 @table @kbd
 @item C-z
-Suspend Emacs (@code{suspend-emacs}).  If used under the X window system,
-shrink the X window containing the Emacs frame to an icon (see below).
+Suspend Emacs or iconify a frame
+(@code{suspend-emacs-or-iconify-frame}).  If used under the X window
+system, shrink the X window containing the Emacs frame to an icon (see
+below).
 @item C-x C-c
 Kill Emacs (@code{save-buffers-kill-emacs}).
 @end table
@@ -56,45 +94,68 @@ If you use XEmacs under the X window system, @kbd{C-z} shrinks
 the X window containing the Emacs frame to an icon.  The Emacs process
 is stopped temporarily, and control is returned to the window manager.
 If more than one frame is associated with the Emacs process, only the
-frame from which you used @kbd{C-z} is retained.  The X windows
-containing the other Emacs frames are closed. 
+frame from which you used @kbd{C-z} is iconified.
 
 To activate the "suspended" Emacs, use the appropriate window manager
 mouse gestures.  Usually left-clicking on the icon reactivates and
 reopens the X window containing the Emacs frame, but the window manager
 you use determines what exactly happens.  To actually kill the Emacs
-process, use @kbd{C-x C-c} or the @b{Exit Emacs} item on the @b{File}
+process, use @kbd{C-x C-c} or the @b{Exit XEmacs} item on the @b{File}
 menu.
 
 @kindex C-z
 @findex suspend-emacs
-  On systems that do not permit programs to be suspended, @kbd{C-z} runs
-an inferior shell that communicates directly with the terminal, and
-Emacs waits until you exit the subshell.  On these systems, the only way
-to return to the shell from which Emacs was started (to log out, for
-example) is to kill Emacs.  @kbd{C-d} or @code{exit} are typical
-commands to exit a subshell.
+  To suspend Emacs, type @kbd{C-z} (@code{suspend-emacs}).  This takes
+you back to the shell from which you invoked Emacs.  You can resume
+Emacs with the shell command @samp{%xemacs} in most common shells.
+
+  On systems that do not support suspending programs, @kbd{C-z} starts
+an inferior shell that communicates directly with the terminal.
+Emacs waits until you exit the subshell.  (The way to do that is
+probably with @kbd{C-d} or @samp{exit}, but it depends on which shell
+you use.)  The only way on these systems to get back to the shell from
+which Emacs was run (to log out, for example) is to kill Emacs.
+
+  Suspending also fails if you run Emacs under a shell that doesn't
+support suspending programs, even if the system itself does support it.
+In such a case, you can set the variable @code{cannot-suspend} to a
+non-@code{nil} value to force @kbd{C-z} to start an inferior shell.
+(One might also describe Emacs's parent shell as ``inferior'' for
+failing to support job control properly, but that is a matter of taste.)
+
+  When Emacs communicates directly with an X server and creates its own
+dedicated X windows, @kbd{C-z} has a different meaning.  Suspending an
+applications that uses its own X windows is not meaningful or useful.
+Instead, @kbd{C-z} runs the command @code{iconify-or-deiconify-frame},
+which temporarily closes up the selected Emacs frame.
+The way to get back to a shell window is with the window manager.
 
 @kindex C-x C-c
 @findex save-buffers-kill-emacs
   To kill Emacs, type @kbd{C-x C-c} (@code{save-buffers-kill-emacs}).  A
-two-character key is used for this to make it harder to type.  In
-XEmacs, selecting the @b{Exit Emacs} option of the @b{File} menu is an
-alternate way of issuing the command.
+two-character key is used for this to make it harder to type.  Selecting
+the @b{Exit XEmacs} option of the @b{File} menu is an alternate way of
+issuing the command.
 
 Unless a numeric argument is used, this command first offers to save any
-modified buffers.  If you do not save all buffers, you are asked for
-reconfirmation with @kbd{yes} before killing Emacs, since any changes
-not saved will be lost.  If any subprocesses are still running, @kbd{C-x
-C-c} asks you to confirm killing them, since killing Emacs kills the
-subprocesses simultaneously.
-
-  In most programs running on Unix, certain characters may instantly
-suspend or kill the program.  (In Berkeley Unix these characters are
-normally @kbd{C-z} and @kbd{C-c}.)  @i{This Unix feature is turned off
-while you are in Emacs.} The meanings of @kbd{C-z} and @kbd{C-x C-c} as
-keys in Emacs were inspired by the standard Berkeley Unix meanings of
-@kbd{C-z} and @kbd{C-c}, but that is their only relationship with Unix.
-You could customize these keys to do anything (@pxref{Keymaps}).
-
-@c ??? What about system V here?
+modified file-visiting buffers.  If you do not save all buffers, you are
+asked for reconfirmation with @kbd{yes} before killing Emacs, since any
+changes not saved will be lost forever.  If any subprocesses are still
+running, @kbd{C-x C-c} asks you to confirm killing them, since killing
+Emacs will kill the subprocesses immediately.
+
+  There is no way to restart an Emacs session once you have killed it.
+You can, however, arrange for Emacs to record certain session
+information, such as which files are visited, when you kill it, so that
+the next time you restart Emacs it will try to visit the same files and
+so on.
+@c @xref{Saving Emacs Sessions}.
+
+  The operating system usually listens for certain special characters
+whose meaning is to kill or suspend the program you are running.
+@b{This operating system feature is turned off while you are in Emacs.}
+The meanings of @kbd{C-z} and @kbd{C-x C-c} as keys in Emacs were
+inspired by the use of @kbd{C-z} and @kbd{C-c} on several operating
+systems as the characters for stopping or killing a program, but that is
+their only relationship with the operating system.  You can customize
+these keys to run any commands of your choice (@pxref{Keymaps}).
index 3d75b35..3976ba6 100644 (file)
@@ -135,7 +135,10 @@ argument.  @xref{Windows}.
 however.  You cannot switch buffers in it---the minibuffer and its
 window are permanently attached.  Also, you cannot split or kill the
 minibuffer window. But you can make it taller in the normal fashion with
-@kbd{C-x ^}.
+@kbd{C-x ^}.  If you enable Resize-Minibuffer mode, then the
+minibuffer window expands vertically as necessary to hold the text that
+you put in the minibuffer.  Use @kbd{M-x resize-minibuffer-mode} to
+enable or disable this minor mode (@pxref{Minor Modes}).
 
 @kindex C-M-v
   If while in the minibuffer you issue a command that displays help text
@@ -227,7 +230,7 @@ possibilities for the very next character---it could be any of
 @samp{c-}---so no more characters are added; instead, @key{TAB}
 displays a list of all possible completions in another window.
 
-  If you go on to type @kbd{f @key{TAB}}, this @key{TAB} sees
+  If you go on to type @kbd{-f @key{TAB}}, this @key{TAB} sees
 @samp{auto-f}.  The only command name starting this way is
 @code{auto-fill-mode}, so completion fills in the rest of that.  You now
 have @samp{auto-fill-mode} in the minibuffer after typing just @kbd{au
@@ -285,6 +288,15 @@ completions chooses that completion (@code{mouse-choose-completion}).
 You normally use this command while point is in the minibuffer; but you
 must click in the list of completions, not in the minibuffer itself.
 
+@findex switch-to-completions
+@item @key{PRIOR}
+@itemx M-v
+Typing @key{PRIOR} or @kbd{M-v}, while in the minibuffer, selects the
+window showing the completion list buffer
+(@code{switch-to-completions}).  This paves the way for using the
+commands below.  (Selecting that window in the usual ways has the same
+effect, but this way is more convenient.)
+
 @findex choose-completion
 @item @key{RET}
 Typing @key{RET} @emph{in the completion list buffer} chooses the
@@ -375,6 +387,12 @@ then in contexts where @code{completing-read} allows answers that are
 not valid completions, an extra @key{RET} must be typed to confirm the
 response.  This is helpful for catching typos.
 
+@cindex Icomplete mode
+  Icomplete mode presents a constantly-updated display that tells you
+what completions are available for the text you've entered so far.  The
+command to enable or disable this minor mode is @kbd{M-x
+icomplete-mode}.
+
 @node Minibuffer History, Repetition, Completion, Minibuffer
 @section Minibuffer History
 @cindex minibuffer history
@@ -479,11 +497,11 @@ the command name.
 @item C-x @key{ESC} @key{ESC}
 Re-execute a recent minibuffer command (@code{repeat-complex-command}).
 @item M-p
-Within @kbd{C-x @key{ESC}}, move to previous recorded command
+Within @kbd{C-x @key{ESC} @key{ESC}}, move to previous recorded command
 (@code{previous-history-element}).
 @item M-n
-Within @kbd{C-x @key{ESC}}, move to the next (more recent) recorded
-command (@code{next-history-element}).
+Within @kbd{C-x @key{ESC} @key{ESC}}, move to the next (more recent)
+recorded command (@code{next-history-element}).
 @item M-x list-command-history
 Display the entire command history, showing all the commands
 @kbd{C-x @key{ESC} @key{ESC}} can repeat, most recent first.
index 263feb5..3fca5ee 100644 (file)
@@ -158,16 +158,6 @@ variable @code{INFOPATH}
 @vindex INFOPATH
 to @code{Info-directory-list}.
 
-@item lock-directory
-@itemx superlock-file
-@vindex lock-directory
-@vindex superlock-file
-Are the site-specific locations of the lock directory and the superlock
-file, respectively.  The @code{lock-directory} variable may also be
-initialized from the @code{EMACSLOCKDIR}
-@vindex EMACSLOCKDIR
-environment variable.
-
 @item exec-directory
 @vindex exec-directory
 Is the directory of architecture-dependent files that come with XEmacs,
index b8bbb4d..3d55b83 100644 (file)
@@ -1,3 +1,11 @@
+2000-05-28  Martin Buchholz <martin@xemacs.org>
+
+       * XEmacs 21.2.34 is released.
+
+2000-05-12  Craig Lanning  <CraigL@DyCon.com>
+
+       * inc\sys\socket.h: Don't define timeval as ws_timeval for mingw32
+
 2000-05-01  Martin Buchholz <martin@xemacs.org>
 
        * XEmacs 21.2.33 is released.
index da05b2f..7d4753c 100644 (file)
@@ -1,3 +1,875 @@
+2000-05-28  Martin Buchholz <martin@xemacs.org>
+
+       * XEmacs 21.2.34 is released.
+
+2000-05-22  Jan Vroonhof  <vroonhof@math.ethz.ch>
+
+       * redisplay.c (VERTICAL_CLIP): No longer reset when updating line
+       start cache.
+       (updating_line_start_cache): Gone.
+       (regenerate_window): Replace resetting of VERTICAL_CLIP by
+       generic code to force a minimum of 1 line laid out in the
+       CMOTION_DISP case.
+
+2000-05-22  Jan Vroonhof  <vroonhof@math.ethz.ch>
+
+       * glyphs.c (instantiate_image_instantiator): Check for initialized
+       height & width no longer special cases IMAGE_NOTHING.
+       (nothing_instantiate): Set height and width of instance.
+
+2000-05-24  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * unexelf.c (unexec): Search for ".data" section.
+       Initialize new_data2_offset from old_data_index.
+       Remove redundant check for ElfW.
+
+2000-05-23  Andy Piper  <andy@xemacs.org>
+
+       * glyphs.c (get_image_instantiator_governing_domain): allow more
+       specific domains as the governing domain rather than expecting an
+       exact match. This fixes problems with layouts.
+
+2000-05-22  Andy Piper  <andy@xemacs.org>
+
+       * redisplay-output.c (compare_runes): check for non-images
+
+       * glyphs.c (set_glyph_dirty_p): ditto.
+       (update_glyph_cachel_data): ditto.
+
+       * glyphs-widget.c (layout_post_instantiate): ditto.
+       (layout_post_instantiate): ditto.
+
+       * event-msw.c (mswindows_wnd_proc): warning removal.
+
+2000-05-12  Craig Lanning  <CraigL@DyCon.com>
+
+       * s\mingw32.h: Added #undef for CLASH_DETECTION.
+
+       * syswindows.h: Moved PBS_SMOOTH definition to syscommctrl.h.
+
+       * syscommctrl.h (PBS_SMOOTH): Moved from syswindows.h.
+
+       * nt.c (rva_to_section): mingw32 needs rva_to_section.
+       (mswindows_executable_type): mingw32 now has enough headers for
+       this to work.
+
+2000-05-20  Andy Piper  <andy@xemacs.org>
+
+       * console-msw.c (mswindows_output_last_error): ; -> ,
+
+2000-05-12  Andy Piper  <andy@xemacs.org>
+
+       * console-msw.c (FROB): compare ints with ints.
+
+2000-05-11  Andy Piper  <andy@xemacs.org>
+
+       * glyphs-x.c (x_finalize_image_instance): make minimal build
+       happy.
+
+2000-05-20  Ben Wing  <ben@xemacs.org>
+
+       * event-Xt.c:
+       * event-Xt.c (vars_of_event_Xt):
+       move modifier-keys-are-sticky to event-stream.c.
+       
+       * event-msw.c:
+       * event-msw.c (mswindows_enqueue_mouse_button_event):
+       * event-msw.c (key_needs_default_processing_p):
+       * event-msw.c (XEMSW_LCONTROL):
+       * event-msw.c (mswindows_handle_sticky_modifiers):
+       * event-msw.c (FROB):
+       * event-msw.c (clear_sticky_modifiers):
+       * event-msw.c (output_modifier_keyboard_state):
+       * event-msw.c (output_alt_keyboard_state):
+       * event-msw.c (mswindows_wnd_proc):
+       * event-msw.c (mswindows_modifier_state):
+       * event-msw.c (emacs_mswindows_handle_magic_event):
+       implement sticky modifiers.
+       
+       * event-stream.c:
+       * event-stream.c (vars_of_event_stream):
+       move modifier-keys-are-sticky here.
+
+       * lisp.h:
+       add CHECK_FUNCTION.
+       
+       * rangetab.c:
+       implement map-range-table.
+
+
+2000-05-17  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * redisplay-tty.c (reset_tty_modes):
+       (tty_redisplay_shutdown): Adjust argument type to
+       tty_frame_output_end.
+
+2000-05-11  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * eval.c (Fbacktrace): Don't output a line with only right
+       parenthesis.
+
+2000-05-17  Kenji Itoh  <keit@tpj.co.jp>
+
+       * postgresql.c (Fpq_connect_poll): Replace `PS' with `polling_status'.
+       (Fpq_reset_poll): Ditto.
+
+2000-05-16  Katsumi Yamaoka  <yamaoka@jpl.org>
+
+       * redisplay-tty.c: Replace tty_output_end with tty_frame_output_end.
+
+2000-05-16  Ben Wing  <ben@xemacs.org>
+
+       * buffer.c:
+       * buffer.c (dfc_convert_to/from_internal_format):
+       * buffer.c (reinit_vars_of_buffer):
+       Fix conversion functions to allow reentrancy.
+       
+       * console-msw.c:
+       * console-msw.c (mswindows_output_last_error):
+       New fun, generally useful -- output a human-readable
+       version of GetLastError() on the console.
+       
+       * console-msw.h:
+       * console-msw.h (struct mswindows_frame):
+       Changes for DeferWindowPos.  Declare mswindows_output_last_error().
+       
+       * console-stream.c (stream_output_begin):
+       * console-stream.c (stream_output_end):
+       * console-stream.c (stream_output_vertical_divider):
+       * console-stream.c (stream_clear_region):
+       * console-stream.c (stream_flash):
+       * console-stream.c (console_type_create_stream):
+       Delete blank stream methods, not needed.
+       
+       * console.h (struct console_methods):
+       Split begin/end methods into window and frame.
+       
+       * event-msw.c:
+       * event-msw.c (mswindows_handle_paint):
+       * event-msw.c (output_alt_keyboard_state):
+       * event-msw.c (mswindows_wnd_proc):
+       * event-msw.c (vars_of_event_mswindows):
+       Comment about problems with ignored-expose.
+       Define mswindows-debug-events; not really implemented.
+       
+       * frame-msw.c (mswindows_init_frame_1):
+       random cleanups.
+       
+       * glyphs-msw.c:
+       * glyphs-msw.c (begin_defer_window_pos):
+       * glyphs-msw.c (mswindows_unmap_subwindow):
+       * glyphs-msw.c (mswindows_map_subwindow):
+       * glyphs-msw.c (mswindows_resize_subwindow):
+       Use DeferWindowPos to reduce flashing when mapping/unmapping.
+       
+       * glyphs.c (make_image_instance_1):
+       Fix crash.
+       
+       * gutter.c (Fredisplay_gutter_area):
+       Use new begin/end methods.
+       
+       * lisp.h (Dynarr_new2):
+       New creation fun.
+       
+       * redisplay-msw.c:
+       * redisplay-msw.c (mswindows_frame_output_begin):
+       * redisplay-msw.c (mswindows_frame_output_end):
+       * redisplay-msw.c (console_type_create_redisplay_mswindows):
+       New begin/end methods -- handle DeferWindowPos.
+       
+       * redisplay-output.c (redisplay_move_cursor):
+       * redisplay-output.c (redraw_cursor_in_window):
+       * redisplay-output.c (redisplay_update_line):
+       * redisplay-output.c (redisplay_output_window):
+       New begin/end methods.
+
+       * redisplay-tty.c:
+       * redisplay-tty.c (tty_frame_output_begin):
+       * redisplay-tty.c (tty_frame_output_end):
+       * redisplay-tty.c (console_type_create_redisplay_tty):
+       New begin/end methods.
+
+       * redisplay-x.c:
+       * redisplay-x.c (x_window_output_begin):
+       * redisplay-x.c (x_window_output_end):
+       * redisplay-x.c (console_type_create_redisplay_x):
+       New begin/end methods.
+
+       * redisplay.c (redisplay_frame):
+       * redisplay.c (Fredisplay_echo_area):
+       New begin/end methods.
+       use MAYBE_DEVMETH for clear_frame; it may not exist.
+
+       * window.h (WINDOW_XFRAME):
+       WINDOW_XFOO macros -- get locale and decode struct pointer.
+
+
+2000-05-12  Ben Wing  <ben@xemacs.org>
+
+       * emacs.c:
+       * emacs.c (ensure_no_quitting_from_now_on):
+       * emacs.c (fatal_error_signal):
+       * emacs.c (mswindows_handle_hardware_exceptions):
+       * emacs.c (main):
+       * emacs.c (Fkill_emacs):
+       * emacs.c (shut_down_emacs):
+       * emacs.c (assert_failed):
+       various improvements in fatal error handling.
+       
+       * eval.c:
+       move preparing_for_armageddon to emacs.c.
+       
+       * lisp.h:
+       declare fatal_error_in_progress.
+       
+       * print.c:
+       * print.c (std_handle_out_external):
+       * print.c (std_handle_out_va):
+       * print.c (stderr_out):
+       * print.c (stdout_out):
+       use console under mswin when no standard output.
+       don't do code conversion during fatal error.
+       
+       * scrollbar.c (Fscrollbar_page_up):
+       * scrollbar.c (Fscrollbar_page_down):
+       fix missing else.  reindent.
+
+2000-05-11  Jan Vroonhof  <vroonhof@math.ethz.ch>
+
+       Emergency fix.  
+       
+       * glyphs.h (GLYPH_CACHEL_DESCENT): 
+       (GLYPH_CACHEL_DESCENT): 
+       (GLYPH_CACHEL_DESCENT): 
+       * glyphs.h (GLYPH_CACHEL_ASCENT): Match parameters to variables
+       used in case these are inline functions.
+       Use more absurd values to error check.
+
+       include window.h for error check functions.
+
+2000-05-11  Ben Wing  <ben@xemacs.org>
+
+       * cmdloop.c (Freally_early_error_handler):
+       Display message box under windows; otherwise, message will disappear
+       before it can be viewed.
+
+       * console-msw.c:
+       * console-msw.c (Fmswindows_message_box):
+       * console-msw.c (FROB):
+       * console-msw.c (syms_of_console_mswindows):
+       Define new fun `mswindows-message-box'.
+       #### I will merge this into `popup-dialog-box'; just give me
+       a bit of time.
+       
+       * general.c:
+       * general.c (syms_of_general):
+       Some new symbols used in `mswindows-message-box'.
+       
+       * glyphs.c:
+       * glyphs.c (Fset_image_instance_property):
+       put warning in this fun.
+       
+       * glyphs.h:
+       * glyphs.h (GLYPH_CACHEL_WIDTH):
+       * glyphs.h (GLYPH_CACHEL_ASCENT):
+       * glyphs.h (GLYPH_CACHEL):
+       * glyphs.h (GLYPH_CACHEL_GLYPH):
+       define error-checking versions to try to catch a bug i've seen --
+       redisplay gets in an infinite loop because the glyph width of the
+       continuation glyph is 65535.
+       
+       * lisp.h:
+       Extern message-box stuff.
+
+       * window.c (allocate_window):
+       * window.c (make_dummy_parent):
+       * window.c (Fset_window_configuration):
+       Use EQUAL not EQ for subwindow caches to make them work a bit
+       better. (Something is still very broken.)
+       
+
+2000-05-11  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * glyphs.c (image_instantiate): Suppress gcc warnings.
+       (Fmake_image_instance): Fix doc string.
+       * specifier.c (Fmake_specifier): Ditto.
+
+2000-05-02  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * paths.h.in (PATH_LOCK): Removed.
+       * config.h.in (LOCKDIR_USER_DEFINED): Removed.
+       * emacs.c (complex_vars_of_emacs): Remove configure-lock-directory.
+
+2000-05-08  Yoshiki Hayashi  <yoshiki@xemacs.org>
+
+       * fns.c (Ffeaturep): Update e-mail address in doc-string.
+       Document (featurep '(and xemacs 21.02)).
+
+2000-05-09  Ben Wing  <ben@xemacs.org>
+
+       * buffer.c (complex_vars_of_buffer):
+       update modeline-format doc.
+       
+       * device.h:
+       comment about how DFW_DEVICE should be merged with DOMAIN_DEVICE.
+       
+       * emacs.c:
+       timeline of all released versions of Emacs, for use in creating
+       authorship comments and in synching up.
+       
+       * glyphs-widget.c (image_instantiator_buttons):
+       * glyphs-widget.c (image_instantiator_edit_fields):
+       * glyphs-widget.c (image_instantiator_combo_box):
+       * glyphs-widget.c (image_instantiator_scrollbar):
+       * glyphs-widget.c (image_instantiator_progress_guage):
+       * glyphs-widget.c (image_instantiator_tree_view):
+       * glyphs-widget.c (image_instantiator_tab_control):
+       * glyphs-widget.c (image_instantiator_labels):
+       * glyphs-widget.c (image_instantiator_layout):
+       * glyphs-widget.c (image_instantiator_native_layout):
+       rename decode_domain method to governing_domain.
+       
+       * glyphs.c:
+       * glyphs.c (Fvalid_image_instantiator_format_p): doc update.
+       * glyphs.c (add_entry_to_device_ii_format_list):
+       make sure we don't put an entry more than once into the list.
+       * glyphs.c (check_instance_cache_mapper):
+       *************************************************************
+       allow for nil.  THIS SHOULD FIX A REAL CRASH THAT MANY PEOPLE
+       HAVE BEEN GETTING.
+       *************************************************************
+       * glyphs.c (get_image_instantiator_governing_domain):
+       clean up, expand on new concept of governing domain.
+       * glyphs.c (instantiate_image_instantiator):
+       * glyphs.c (allocate_image_instance):
+       use governing_domain instead of cache_domain in naming.
+       * glyphs.c (Fvalid_image_instance_type_p): fix docs.
+       * glyphs.c (make_image_instance_1):
+       * glyphs.c (Fmake_image_instance):
+       allow for any domain (not just device), and process the
+       governing domain correctly.  very big doc fix.
+       * glyphs.c (Fimage_instance_domain):
+       new primitive, to retrieve the governing domain of an image instance.
+       * glyphs.c (image_instantiate):
+       use new governing_domain stuff.  this fixes a crash you could get
+       by instantiating certain widget glyphs in frame locales. (should
+       signal an error instead of crashing.)
+       * glyphs.c (Fimage_specifier_p): move doc to make-image-specifier.
+       * glyphs.c (Fglyphp): clean up doc.
+       * glyphs.c (subwindow_governing_domain): renamed from *_decode_domain.
+       * glyphs.c (syms_of_glyphs):
+       declare Fimage_instance_domain, remove unused Qlayout_image_instance_p.
+       * glyphs.c (image_instantiator_format_create): add some comments about
+       bogus code.
+       * glyphs.c (specifier_vars_of_glyphs): totally rewrite the doc string
+       for current-display-table. (Apparently Hrjove implemented in 1998 a
+       design I wrote up in 1996, but didn't update the doc string.)
+       
+       * glyphs.h: clean up a doc string.
+       * glyphs.h (governing_domain):
+       * glyphs.h (struct image_instantiator_methods):
+       changes for governing_domain stuff.
+       
+       * gutter.c:
+       * gutter.c (Fgutter_specifier_p):
+       * gutter.c (Fgutter_size_specifier_p):
+       * gutter.c (Fgutter_visible_specifier_p):
+       * objects.c:
+       * objects.c (Fcolor_specifier_p):
+       * objects.c (Ffont_specifier_p):
+       * objects.c (Fface_boolean_specifier_p):
+       doc strings moved to make-*-specifier.
+       
+       * redisplay.c (add_disp_table_entry_runes_1):
+       * redisplay.c (generate_fstring_runes):
+       * redisplay.c (screen):
+       add random comments and doc strings.
+       
+       * specifier.c:
+       * specifier.c (Fmake_specifier):
+       major overhaul of this doc string.
+       
+       * specifier.c (Fvalid_specifier_domain_p):
+       comment about the bogosity of image instances being domains.
+       * specifier.c (decode_domain):
+       now non-static, used in glyphs.c.
+       * specifier.c (specifier_instance):
+       comment about the bogosity of image instances being domains.
+       * specifier.c (Fgeneric_specifier_p):
+       move doc string to make-generic-specifier.
+       * specifier.c (VALID_SINGLE_DISPTABLE_INSTANTIATOR_P):
+       rebackslashify.
+       
+       * specifier.h:
+       * specifier.h (DOMAIN_FRAME):
+       * specifier.h (DOMAIN_LIVE_P):
+       * specifier.h (DOMAIN_XDEVICE):
+       rebackslashify.
+       add comments about problems with these macros.
+       prototype for decode_domain.
+       
+       * toolbar.c:
+       * toolbar.c (Ftoolbar_specifier_p):
+       move doc string to `make-toolbar-specifier'.
+       
+       * window.c (window_unmap_subwindows_cache_mapper):
+       *************************************************************
+       allow for nil.  THIS SHOULD FIX A REAL CRASH THAT MANY PEOPLE
+       HAVE BEEN GETTING.
+       *************************************************************
+
+2000-05-09  Andy Piper  <andy@xemacs.org>
+
+       * glyphs.h: declare reset_frame_subwindow_instance_cache.
+
+       * window.c (Fset_window_configuration): reset the frame subwindow
+       cache and re-initialize the window subwindow caches.
+
+       * glyphs.c (reset_frame_subwindow_instance_cache): new function.
+
+2000-05-09  Ben Wing  <ben@xemacs.org>
+
+       * ntheap.c (recreate_heap): Changed unknown (VC6 only?) SIZE_T to
+       DWORD.
+
+2000-04-26  Mike Woolley  <mike@bulsara.com>
+
+       * ntheap.c: Changed recreate_heap to limit the amount reserved
+       for the heap to that which is actually available. Also now
+       displays a message box (with some dignostics) in the event that
+       it still can't start.
+
+2000-05-07  Jan Vroonhof  <vroonhof@math.ethz.ch>
+
+       * callproc.c (Fold_call_process_internal): GCPRO path
+
+2000-05-08  Jan Vroonhof  <jan@xemacs.org>
+
+       Patch by Bill Perry.
+       
+       * scrollbar.c (Fscrollbar_page_up): Conditionalize on type of call 
+       back data instead of #ifdef.
+       (Fscrollbar_page_down): ditto.
+
+2000-05-07  Ben Wing  <ben@xemacs.org>
+
+       * buffer.h:
+       Kludge for defining Qmswindows_tstr.
+       
+       * nt.c:
+       * nt.c (open_input_file):
+       * nt.c (open_output_file):
+       * nt.c (rva_to_section):
+       * nt.c (mswindows_executable_type):
+       Move all memory-mapped-file routines here (some were in unexnt.c,
+       which is bad because they are used by process-nt.c, and unexnt
+       won't be around when portable dumping).  Synched the above routines
+       with FSF 20.6.
+       
+       * nt.h:
+       Removed ifdef'd out bogus code.
+       Fixed some prototypes.
+       
+       * nt.h (file_data):
+       * nt.h (OFFSET_TO_RVA):
+       * nt.h (RVA_TO_OFFSET):
+       * nt.h (RVA_TO_PTR):
+       Moved the memory-mapped-file structures, macros and prototypes
+       here, to parallel nt.c.  ntheap.h should really be removed
+       entirely, and it's a non-portable-dumper specific file.
+       
+       * ntheap.h (round_to_next):
+       Moved the memory-mapped-file structures, macros and prototypes
+       to nt.h.
+
+       * ntproc.c (compare_env):
+       Moved rva_to_section and mswindows_executable_type to nt.c.
+       Moved compare_env to process-nt.c.
+       ntproc.c will die, one day.
+
+       * ntproc.c (sys_spawnve):
+       Account for win32_ -> mswindows_.
+
+       * process-nt.c:
+       * process-nt.c (struct nt_process_data):
+       * process-nt.c (ensure_console_window_exists):
+       * process-nt.c (compare_env):
+       * process-nt.c (nt_create_process):
+       * process-nt.c (nt_kill_process_by_pid):
+       * process-nt.c (syms_of_process_nt):
+       * process-nt.c (vars_of_process_nt):
+       Introduce variable `mswindows-quote-process-args', from FSF 20.6.
+       Copy argument quoting code from FSF 20.6 (with appropriate Mule-ization
+       changes).  Eliminate our old `nt-quote-process-args' mechanism.
+       Synch up nt_create_process with FSF 20.6 sys_spawnve.
+       Move compare_env here from ntproc.c.
+       
+       * process.c (Fprocess_send_region):
+       Takes an optional fourth argument, BUFFER, which should fix some
+       problems with call-process.
+       
+       * syscommctrl.h:
+       Move ICC_BAR_CLASSES here from syswindows.h, to avoid a warning.
+       
+       * syswindows.h:
+       Move ICC_BAR_CLASSES to syscommctrl.h.
+       Add preliminary macros for MSWindows/Mule.  More to come.
+
+       * unexnt.c:
+       * unexnt.c (unexec):
+       open_output_file moved to nt.c.
+
+
+2000-05-05  Andy Piper  <andy@xemacs.org>
+
+       * window.c (window_unmap_subwindows_cache_mapper): remove the dead
+       instance from the frame cache also since GC may catch up too late
+       to make frame deletion sane.
+
+2000-05-04  Andy Piper  <andy@xemacs.org>
+
+       * glyphs-x.c (x_widget_instantiate): gcpro widget callbacks.
+       (x_finalize_image_instance): ungcpro on deletion.
+
+       * glyphs.c (image_instantiator_format_create): give pointers a
+       query geometry method so that the geometry is at least set.
+
+       * glyphs-x.c (image_instantiator_format_create_glyphs_x): only
+       initialize layouts if using widgets.
+
+2000-05-03  Andy Piper  <andy@xemacs.org>
+
+       * nt.c: remove bogus reference to sysmmsystem.h
+
+       * gui-x.c (popup_selection_callback): fix no selection abort.
+
+2000-05-02  Andy Piper  <andy@xemacs.org>
+
+       * glyphs-msw.c (mswindows_update_widget): cope with nil text.
+       (mswindows_widget_instantiate): ditto.
+
+       * glyphs-widget.c (initialize_widget_image_instance): initialize
+       children correctly.
+       (widget_instantiate): cope with children and items in the same
+       instance.
+
+       * glyphs.c (mark_image_instance): cope with children as a first
+       class member.
+       (image_instance_equal): ditto.
+       (image_instance_hash): ditto.
+       (image_instance_changed): ditto.
+
+2000-04-30  Andy Piper  <andy@xemacs.org>
+
+       * glyphs.c (subwindow_query_geometry): new function. Return some
+       defaults.
+       (subwindow_instantiate): don't assign dimensions if none have been
+       given.
+       (image_instantiator_format_create): add subwindow_query_geometry.
+       (print_image_instance): cope with layouts as widgets.
+
+2000-04-29  Andy Piper  <andy@xemacs.org>
+
+       * frame.c (delete_frame_internal): call
+       free_frame_subwindow_instance_cache so that all subwindows are
+       finalized before their parent.
+       (mark_frame): remove subwindow_cachels.
+       (Fmake_frame): remove subwindow_cachel manipulation.
+       (allocate_frame_core): subwindow_instance_cache is a weak list.
+       (delete_frame_internal): set subwindow_instance_cache to nil.
+
+       * glyphs-msw.c (mswindows_finalize_image_instance): make double
+       finalization safe.
+       (mswindows_finalize_image_instance): use the device
+       not the domain as the domain may have died already.
+
+       * glyphs-x.c (x_finalize_image_instance): ditto.
+       (x_subwindow_instantiate): remove SUBWINDOW_WIDTH &
+       HEIGHT.
+
+       * redisplay-output.c (redisplay_unmap_subwindows): update for
+       subwindow instance cache as a weak list.
+       (redisplay_unmap_subwindows_maybe): ditto.
+       (redisplay_unmap_subwindows_except_us): ditto.
+
+       * glyphs.c (unmap_subwindow): error checking will check the domain
+       so don't deal with it here. Don't use cachels anymore.
+       (map_subwindow): ditto.
+       (update_subwindow_cachel_data): remove old accessor names.
+       (subwindow_instantiate): remove SUBWINDOW_WIDTH & HEIGHT.
+       (Fresize_subwindow): don't update cachel.
+       (mark_subwindow_cachels):
+       (update_subwindow_cachel_data):
+       (add_subwindow_cachel):
+       (get_subwindow_cachel_index):
+       (update_subwindow_cachel):
+       (reset_subwindow_cachels):
+       (mark_subwindow_cachels_as_not_updated): deleted.
+       (cache_subwindow_instance_in_frame_maybe): new function. Add a
+       subwindow instance to the frame cache.
+       (find_matching_subwindow): update for subwindow instance cache as
+       a weak list.
+       (update_widget_instances): ditto.
+       (image_instance_type_to_mask):inlined.
+       (free_frame_subwindow_instance_cache): new function. finalize all
+       subwindows that are instantiated.
+
+       * glyphs.h (struct Lisp_Image_Instance): add display_data instead
+       of cachel information.
+       (IMAGE_INSTANCE_DISPLAY_X):
+       (IMAGE_INSTANCE_DISPLAY_Y):
+       (IMAGE_INSTANCE_DISPLAY_WIDTH):
+       (IMAGE_INSTANCE_DISPLAY_HEIGHT):
+       (XIMAGE_INSTANCE_DISPLAY_X):
+       (XIMAGE_INSTANCE_DISPLAY_Y):
+       (XIMAGE_INSTANCE_DISPLAY_WIDTH):
+       (XIMAGE_INSTANCE_DISPLAY_HEIGHT): new accessors.  
+       remove subwindow_cachel structure and function references.
+       (image_instance_type_to_mask): inline from glyphs.c
+
+       * redisplay.c (redisplay_frame): remove subwindow_cachel
+       references.
+
+       * frame.h (struct frame): remove subwindow_cachels.
+       (FRAME_SUBWINDOW_CACHE): access subwindow_instance_cache.
+
+       * frameslots.h: add subwindow_instance_cache.
+
+       * window.c (replace_window): check subwindow cache of replacement.
+       (window_unmap_subwindows_cache_mapper):
+       (window_unmap_subwindows): new functions. Unmap all subwindows
+       cached on this window.
+       (mark_window_as_deleted): unmap all subwindows.
+
+2000-04-27  Andy Piper  <andy@xemacs.org>
+
+       * glyphs.h (IIFORMAT_METH_OR_GIVEN): cope with null meths.
+
+       * glyphs-widget.c (widget_layout): return something.
+       (layout_layout): return something. Fail if not intialized.
+       (layout_query_geometry): ditto.
+       (image_instantiator_native_layout): new function. Initialized the
+       native layout type.
+       (widget_instantiate): don't do layout stuff here.
+
+       * glyphs.c (instantiate_image_instantiator): reorded calling or
+       instantiate and post_instantiate with layout in between.
+       (image_instance_layout): be more selective about deciding whether
+       the layout has been done or not.
+
+       * glyphs.h (struct image_instantiator_methods): return a value
+       from layout_method.
+
+2000-04-26  Andy Piper  <andy@xemacs.org>
+
+       * glyphs.c (allocate_image_instance): make initial width and
+       height unspecified. Set initialized to 0.
+
+       * syscommctrl.h new file. Encapsulates commctrl.h.
+
+       * syswindows.h new file. Encapsulates windows.h.
+
+       * ntplay.c: use new syswindows.h and syscommctrl.h header.
+       * nt.c: ditto.
+       * console-msw.h: ditto.
+       
+       * redisplay-tty.c (tty_output_display_block): remove layout references.
+
+       * glyphs-msw.c (mswindows_widget_instantiate): use the domain
+       window handle rather than just the frame.
+
+       * glyphs.c (mark_image_instance): remove layout references.
+       (print_image_instance): ditto.
+       (image_instance_equal): ditto.
+       (image_instance_hash): ditto.
+       (decode_image_instance_type): ditto.
+       (encode_image_instance_type): ditto.
+       (image_instantiate): ditto.
+       (allocate_glyph): ditto.
+       (Fimage_instance_height): ditto.
+       (Fimage_instance_width): ditto.
+       (update_subwindow): ditto.
+
+       * redisplay-x.c (x_output_display_block): recode for layouts as
+       widgets.
+
+       * redisplay-output.c (redisplay_output_layout): recode for layouts
+       as widgets.
+       (compare_runes): remove layout references.
+
+       * redisplay-msw.c (mswindows_output_display_block): recode for
+       layouts as widgets.
+
+       * glyphs-widget.c (image_instantiator_layout): remove
+       layout_possible_dest_types.
+       (layout_possible_dest_types): deleted.
+
+       * glyphs.h (image_instance_type): remove layout references.
+       (struct Lisp_Image_Instance): ditto. Add initialized flag.
+       (IMAGE_INSTANCE_INITIALIZED): new accessor.
+       (XIMAGE_INSTANCE_INITIALIZED): ditto.
+       
+2000-04-25  Andy Piper  <andy@xemacs.org>
+
+       * glyphs-widget.c (image_instantiator_buttons):
+       (image_instantiator_edit_fields):
+       (image_instantiator_combo_box):
+       (image_instantiator_scrollbar):
+       (image_instantiator_progress_guage):
+       (image_instantiator_tree_view):
+       (image_instantiator_tab_control):
+       (image_instantiator_labels):
+       (image_instantiator_layout): call default post_instantiate method.
+       (widget_post_instantiate): new function. Simply lays out the
+       widgets.
+
+       * glyphs.h (struct image_instantiator_methods): add
+       post_instantiate method.
+
+       * glyphs.c (instantiate_image_instantiator): add post_instantiate
+       method calls.
+
+2000-04-23  Andy Piper  <andy@xemacs.org>
+
+       * glyphs.h (struct image_instantiator_methods): add
+       decode_domain_method.
+       (struct Lisp_Image_Instance): remove subwindow frame - it can be
+       derived from the domain.
+       (IMAGE_INSTANCE_FRAME): new accessor.
+       (XIMAGE_INSTANCE_FRAME): ditto.
+
+       * glyphs.c (print_image_instance): use IMAGE_INSTANCE_FRAME
+       instead of _SUBWINDOW_FRAME.
+       (finalize_image_instance): ditto.
+       (Fimage_instance_foreground): ditto.
+       (Fimage_instance_background): ditto.
+       (image_instantiate): ditto.
+       (update_subwindow_cachel): ditto.
+       (update_subwindow): ditto.
+       (unmap_subwindow): ditto.
+       (map_subwindow): ditto
+       (subwindow_instantiate): ditto.
+       * glyphs-msw.c (mswindows_update_widget): ditto.
+       (mswindows_progress_gauge_instantiate): ditto.
+       (mswindows_tab_control_update): ditto.
+       * glyphs-x.c (x_update_widget): ditto.
+       (x_widget_instantiate): ditto.
+       (x_tab_control_instantiate): ditto.
+       (x_tab_control_update): ditto.
+       * event-msw.c (mswindows_wnd_proc): ditto
+
+       * glyphs-widget.c (image_instantiator_layout): use
+       subwindow_decode_domain.
+       (image_instantiator_buttons): ditto.
+       (image_instantiator_edit_fields): ditto.
+       (image_instantiator_combo_box): ditto.
+       (image_instantiator_scrollbar): ditto.
+       (image_instantiator_progress_guage): ditto.
+       (image_instantiator_tree_view): ditto.
+       (image_instantiator_tab_control): ditto.
+       (image_instantiator_labels): ditto.
+       (image_instantiator_layout): ditto.
+
+       * glyphs.c: add instance error checking to many functions.
+       (instantiate_image_instantiator): decode device from cache_domain.
+       (image_instantiate): partially rewrite by using
+       decode_image_instantiator_domain to determine what domain the
+       instance needs to be cached in.
+       (decode_image_instantiator_domain): new function. Determine what
+       domain the image needs to be cached in.
+       (check_window_subwindow_cache): new error checking function.
+       (check_instance_cache_mapper): ditto.
+       (check_image_instance_structure): ditto.
+       (subwindow_decode_domain): new function. Encodes a window as a
+       subwindow's cache domain.
+       (image_instantiator_format_create): use it for text and
+       subwindows.
+
+2000-04-21  Andy Piper  <andy@xemacs.org>
+
+       * glyphs.c (image_instance_device): new function.
+       (image_instance_frame): new function.
+       (image_instance_window): new function.
+       (image_instance_live_p): new function.
+
+       * window.c (mark_window_as_deleted): reset the subwindow_instance_
+       cache to nil.
+
+       * glyphs.h (struct Lisp_Image_Instance): device->domain.
+       (IMAGE_INSTANCE_DOMAIN): new accessor.
+       (XIMAGE_INSTANCE_DOMAIN): ditto.
+
+       * glyphs-x.c (x_finalize_image_instance): device->domain.
+
+       * glyphs-msw.c (init_image_instance_geometry): device->domain.
+       (mswindows_finalize_image_instance): ditto.
+
+       * glyphs-eimage.c (jpeg_instantiate): device->domain.
+       (gif_instantiate): ditto.
+       (png_instantiate): ditto.
+       (tiff_instantiate): ditto.
+
+       * glyphs.c (instantiate_image_instantiator): use domain rather
+       than device.
+       (mark_image_instance): device -> domain.
+       (print_image_instance): ditto.
+       (finalize_image_instance): ditto.
+       (image_instance_equal): ditto.
+       (allocate_image_instance): ditto.
+       (Fcolorize_image_instance): ditto.
+       (query_string_geometry): ditto.
+       (image_instantiate): ditto
+       (query_string_font): ditto.
+       (image_instantiate): ditto.
+       (update_subwindow): ditto.
+       (unmap_subwindow): ditto.
+       (map_subwindow): ditto.
+       (subwindow_instantiate): ditto.
+
+       * specifier.h (DOMAIN_DEVICE): new, semantically correct, decoder.
+       (DOMAIN_FRAME): ditto.
+       (DOMAIN_WINDOW): ditto.
+       (DOMAIN_LIVE_P): ditto.
+       (XDOMAIN_DEVICE): ditto.
+       (XDOMAIN_FRAME): ditto.
+       (XDOMAIN_WINDOW): ditto.
+
+       * specifier.c (Fvalid_specifier_domain_p): add image instances as
+       a valid specifier domain.
+
+2000-04-19  Andy Piper  <andy@xemacs.org>
+
+       * glyphs-widget.c (syms_of_glyphs_widget): remove
+       widget-callback-current-channel.
+       (vars_of_glyphs_widget): ditto.
+       * glyphs.h: ditto
+
+       * gui.c (get_gui_callback): revert to previous behaviour.
+
+2000-04-18  Andy Piper  <andy@xemacs.org>
+
+       * glyphs.h (struct Lisp_Image_Instance): add margin_width.
+       (IMAGE_INSTANCE_MARGIN_WIDTH): new.
+       (XIMAGE_INSTANCE_MARGIN_WIDTH): new.
+
+       * glyphs.c (image_instance_equal): add margin_width.
+       (image_instance_hash): ditto.
+
+       * glyphs-widget.c (widget_instantiate): deal with margin-width.
+       (layout_query_geometry): ditto.
+       (layout_layout): ditto.
+       (syms_of_glyphs_widget): add margin-width.
+       (image_instantiator_layout): allow margin-width.
+
+       * glyphs.c (update_widget_instances): make a normal function.
+       (syms_of_glyphs): remove Qupdate_widget_instances.
+       * glyphs.h: ditto.
+
+       * gui-x.c (popup_selection_callback): use enqueue_magic_eval_event
+       so that we don't corrupt ideas about the last event or
+       command. Remove widget-callback-current-channel fiddling.
+       * gui-msw.c (mswindows_handle_gui_wm_command): ditto.
+
 2000-05-01  Martin Buchholz <martin@xemacs.org>
 
        * XEmacs 21.2.33 is released.
index 5485825..abad796 100644 (file)
@@ -1830,8 +1830,18 @@ coding_system_is_binary (Lisp_Object coding_system)
 #define coding_system_is_binary(coding_system) 1
 #endif
 
-static Extbyte_dynarr *conversion_out_dynarr;
-static Bufbyte_dynarr *conversion_in_dynarr;
+typedef struct
+{
+  Dynarr_declare (Bufbyte_dynarr *);
+} Bufbyte_dynarr_dynarr;
+
+typedef struct
+{
+  Dynarr_declare (Extbyte_dynarr *);
+} Extbyte_dynarr_dynarr;
+
+static Extbyte_dynarr_dynarr *conversion_out_dynarr_list;
+static Bufbyte_dynarr_dynarr *conversion_in_dynarr_list;
 
 static int dfc_convert_to_external_format_in_use;
 static int dfc_convert_to_internal_format_in_use;
@@ -1860,6 +1870,7 @@ dfc_convert_to_external_format (dfc_conversion_type source_type,
                                dfc_conversion_data *sink)
 {
   int count = specpdl_depth ();
+  Extbyte_dynarr *conversion_out_dynarr;
 
   type_checking_assert
     (((source_type == DFC_TYPE_DATA) ||
@@ -1869,20 +1880,20 @@ dfc_convert_to_external_format (dfc_conversion_type source_type,
      ((sink_type == DFC_TYPE_DATA) ||
       (sink_type == DFC_TYPE_LISP_LSTREAM && LSTREAMP (source->lisp_object))));
 
-  if (dfc_convert_to_external_format_in_use != 0)
-    error ("Can't call a conversion function from a conversion function");
-  else
-    dfc_convert_to_external_format_in_use = 1;
-
   record_unwind_protect (dfc_convert_to_external_format_reset_in_use,
-                        Qzero);
+                        make_int (dfc_convert_to_external_format_in_use));
+  if (Dynarr_length (conversion_out_dynarr_list) <=
+      dfc_convert_to_external_format_in_use)
+    Dynarr_add (conversion_out_dynarr_list, Dynarr_new (Extbyte));
+  conversion_out_dynarr = Dynarr_at (conversion_out_dynarr_list,
+                                    dfc_convert_to_external_format_in_use);
+  dfc_convert_to_external_format_in_use++;
+  Dynarr_reset (conversion_out_dynarr);
 
 #ifdef FILE_CODING
   coding_system = Fget_coding_system (coding_system);
 #endif
 
-  Dynarr_reset (conversion_out_dynarr);
-
   /* Here we optimize in the case where the coding system does no
      conversion. However, we don't want to optimize in case the source
      or sink is an lstream, since writing to an lstream can cause a
@@ -2015,6 +2026,7 @@ dfc_convert_to_internal_format (dfc_conversion_type source_type,
                                dfc_conversion_data *sink)
 {
   int count = specpdl_depth ();
+  Bufbyte_dynarr *conversion_in_dynarr;
 
   type_checking_assert
     ((source_type == DFC_TYPE_DATA ||
@@ -2023,20 +2035,20 @@ dfc_convert_to_internal_format (dfc_conversion_type source_type,
     (sink_type   == DFC_TYPE_DATA ||
      sink_type   == DFC_TYPE_LISP_LSTREAM));
 
-  if (dfc_convert_to_internal_format_in_use != 0)
-    error ("Can't call a conversion function from a conversion function");
-  else
-    dfc_convert_to_internal_format_in_use = 1;
-
   record_unwind_protect (dfc_convert_to_internal_format_reset_in_use,
-                        Qzero);
+                        make_int (dfc_convert_to_internal_format_in_use));
+  if (Dynarr_length (conversion_in_dynarr_list) <=
+      dfc_convert_to_internal_format_in_use)
+    Dynarr_add (conversion_in_dynarr_list, Dynarr_new (Bufbyte));
+  conversion_in_dynarr = Dynarr_at (conversion_in_dynarr_list,
+                                   dfc_convert_to_internal_format_in_use);
+  dfc_convert_to_internal_format_in_use++;
+  Dynarr_reset (conversion_in_dynarr);
 
 #ifdef FILE_CODING
   coding_system = Fget_coding_system (coding_system);
 #endif
 
-  Dynarr_reset (conversion_in_dynarr);
-
   if (source_type != DFC_TYPE_LISP_LSTREAM &&
       sink_type   != DFC_TYPE_LISP_LSTREAM &&
       coding_system_is_binary (coding_system))
@@ -2218,8 +2230,10 @@ syms_of_buffer (void)
 void
 reinit_vars_of_buffer (void)
 {
-  conversion_in_dynarr  = Dynarr_new (Bufbyte);
-  conversion_out_dynarr = Dynarr_new (Extbyte);
+  conversion_in_dynarr_list = Dynarr_new2 (Bufbyte_dynarr_dynarr,
+                                          Bufbyte_dynarr *);
+  conversion_out_dynarr_list = Dynarr_new2 (Extbyte_dynarr_dynarr,
+                                           Extbyte_dynarr *);
 
   staticpro_nodump (&Vbuffer_alist);
   Vbuffer_alist = Qnil;
@@ -2661,31 +2675,31 @@ This is the same as (default-value 'case-fold-search).
   DEFVAR_BUFFER_LOCAL ("modeline-format", modeline_format /*
 Template for displaying modeline for current buffer.
 Each buffer has its own value of this variable.
-Value may be a string, a symbol or a list or cons cell.
-For a symbol, its value is used (but it is ignored if t or nil).
+Value may be a string, symbol, glyph, generic specifier, list or cons cell.
+For a symbol, its value is processed (but it is ignored if t or nil).
  A string appearing directly as the value of a symbol is processed verbatim
  in that the %-constructs below are not recognized.
 For a glyph, it is inserted as is.
+For a generic specifier (i.e. a specifier of type `generic'), its instance
+ is computed in the current window using the equivalent of `specifier-instance'
+ and the value is processed.
 For a list whose car is a symbol, the symbol's value is taken,
  and if that is non-nil, the cadr of the list is processed recursively.
  Otherwise, the caddr of the list (if there is one) is processed.
 For a list whose car is a string or list, each element is processed
  recursively and the results are effectively concatenated.
 For a list whose car is an integer, the cdr of the list is processed
-  and padded (if the number is positive) or truncated (if negative)
-  to the width specified by that number.
+ and padded (if the number is positive) or truncated (if negative)
+ to the width specified by that number.
 For a list whose car is an extent, the cdr of the list is processed
  normally but the results are displayed using the face of the
  extent, and mouse clicks over this section are processed using the
  keymap of the extent. (In addition, if the extent has a help-echo
  property, that string will be echoed when the mouse moves over this
- section.) See `generated-modeline-string' for more information.
-For a list whose car is a face, the cdr of the list is processed
- normally but the results will be displayed using the face in the car.
-For a list whose car is a keymap, the cdr of the list is processed
- normally but the keymap will apply for mouse clicks over the results,
- in addition to `modeline-map'.  Nested keymap specifications are
- handled properly.
+ section.) If extents are nested, all keymaps are properly consulted
+ when processing mouse clicks, but multiple faces are not correctly
+ merged (only the first face is used), and lists of faces are not
+ correctly handled.  See `generated-modeline-string' for more information.
 A string is printed verbatim in the modeline except for %-constructs:
   (%-constructs are processed when the string is the entire modeline-format
    or when it is found in a cons-cell or a list)
index 879aa23..8db8653 100644 (file)
@@ -1306,6 +1306,11 @@ typedef union { char c; void *p; } *dfc_aliasing_voidpp;
    argument to TO_EXTERNAL_FORMAT() and TO_INTERNAL_FORMAT(). */
 #define Qnative Qfile_name
 
+#ifdef HAVE_MS_WINDOWS
+/* #### kludge!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+   Remove this as soon as my Mule code is integrated. */
+#define Qmswindows_tstr Qnative
+#endif
 \f
 /************************************************************************/
 /*                                                                      */
index 7e44f9e..1ce04b0 100644 (file)
@@ -188,7 +188,7 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
   char *bufptr = buf;
   int bufsize = 16384;
   int speccount = specpdl_depth ();
-  struct gcpro gcpro1, gcpro2;
+  struct gcpro gcpro1, gcpro2, gcpro3;
   char **new_argv = alloca_array (char *, max (2, nargs - 2));
 
   /* File to use for stderr in the child.
@@ -235,7 +235,7 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
     NUNGCPRO;
   }
 
-  GCPRO1 (current_dir);
+  GCPRO2 (current_dir, path);
 
   if (nargs >= 2 && ! NILP (args[1]))
     {
@@ -250,7 +250,7 @@ If you quit, the process is killed with SIGINT, or SIGKILL if you
 
   UNGCPRO;
 
-  GCPRO2 (infile, current_dir);                /* Fexpand_file_name might trash it */
+  GCPRO3 (infile, current_dir, path);          /* Fexpand_file_name might trash it */
 
   if (nargs >= 3)
     {
index eba7f4d..e015320 100644 (file)
@@ -121,6 +121,10 @@ You should almost certainly not be using this.
   stderr_out ("*** Backtrace\n");
   Fbacktrace (Qexternal_debugging_output, Qt);
   stderr_out ("*** Killing XEmacs\n");
+#ifdef HAVE_MS_WINDOWS
+  Fmswindows_message_box (build_string ("Initialization error"),
+                         Qnil, Qnil);
+#endif
   return Fkill_emacs (make_int (-1));
 }
 
index fd66608..eb7ca5c 100644 (file)
@@ -893,7 +893,6 @@ on various systems. */
 #undef SITELISPDIR_USER_DEFINED
 #undef ARCHLIBDIR_USER_DEFINED
 #undef ETCDIR_USER_DEFINED
-#undef LOCKDIR_USER_DEFINED
 #undef INFODIR_USER_DEFINED
 #undef INFOPATH_USER_DEFINED
 
index 0eb61e1..df68e17 100644 (file)
@@ -28,14 +28,51 @@ Boston, MA 02111-1307, USA.  */
 
 #include <config.h>
 #include "lisp.h"
-#include "events.h"
-#include "opaque.h"
 
+#include "buffer.h"
 #include "console-msw.h"
+#include "events.h"
+#include "opaque.h"
 
 DEFINE_CONSOLE_TYPE (mswindows);
 DEFINE_CONSOLE_TYPE (msprinter);
 
+Lisp_Object Qabortretryignore;
+Lisp_Object Qapplmodal;
+Lisp_Object Qdefault_desktop_only;
+Lisp_Object Qdefbutton1;
+Lisp_Object Qdefbutton2;
+Lisp_Object Qdefbutton3;
+Lisp_Object Qdefbutton4;
+/* Lisp_Object Qhelp; */
+Lisp_Object Qiconasterisk;
+Lisp_Object Qiconexclamation;
+Lisp_Object Qiconhand;
+Lisp_Object Qiconinformation;
+Lisp_Object Qiconquestion;
+Lisp_Object Qiconstop;
+/* Lisp_Object Qok; */
+Lisp_Object Qokcancel;
+Lisp_Object Qretrycancel;
+/* Lisp_Object Qright; */
+Lisp_Object Qrtlreading;
+Lisp_Object Qservice_notification;
+Lisp_Object Qsetforeground;
+Lisp_Object Qsystemmodal;
+Lisp_Object Qtaskmodal;
+Lisp_Object Qtopmost;
+Lisp_Object Qyesno;
+Lisp_Object Qyesnocancel;
+
+/* Lisp_Object Qabort; */
+/* Lisp_Object Qcancel; */
+/* Lisp_Object Qignore; */
+/* Lisp_Object Qno; */
+/* Lisp_Object Qok; */
+/* Lisp_Object Qretry; */
+/* Lisp_Object Qyes; */
+
+
 /************************************************************************/
 /*                       mswindows console methods                      */
 /************************************************************************/
@@ -261,6 +298,242 @@ DSYMNAME (Lisp_Object obj)
 
 #endif /* DEBUG_XEMACS */
 
+DEFUN ("mswindows-message-box", Fmswindows_message_box, 1, 3, 0, /*
+Pop up an MS Windows message box.
+MESSAGE is the string to display.  Optional argument FLAG controls
+what appears in the box and how it behaves; it is a symbol or list of
+symbols, described below.  Second optional argument TITLE controls the
+title bar; if omitted, a standard title bar will be used, probably
+displaying "XEmacs".
+
+Possible flags are
+
+
+-- To specify the buttons in the message box:
+
+abortretryignore 
+  The message box contains three push buttons: Abort, Retry, and Ignore. 
+ok 
+  The message box contains one push button: OK. This is the default. 
+okcancel 
+  The message box contains two push buttons: OK and Cancel. 
+retrycancel 
+  The message box contains two push buttons: Retry and Cancel. 
+yesno 
+  The message box contains two push buttons: Yes and No. 
+yesnocancel 
+  The message box contains three push buttons: Yes, No, and Cancel. 
+
+
+-- To display an icon in the message box:
+iconexclamation, iconwarning
+  An exclamation-point icon appears in the message box. 
+iconinformation, iconasterisk
+  An icon consisting of a lowercase letter i in a circle appears in
+  the message box. 
+iconquestion
+  A question-mark icon appears in the message box. 
+iconstop, iconerror, iconhand
+  A stop-sign icon appears in the message box. 
+
+
+-- To indicate the default button: 
+
+defbutton1
+  The first button is the default button.  This is the default.
+defbutton2
+  The second button is the default button. 
+defbutton3
+  The third button is the default button. 
+defbutton4
+  The fourth button is the default button. 
+
+
+-- To indicate the modality of the dialog box:
+applmodal
+  The user must respond to the message box before continuing work in
+  the window identified by the hWnd parameter. However, the user can
+  move to the windows of other applications and work in those windows.
+  Depending on the hierarchy of windows in the application, the user
+  may be able to move to other windows within the application. All
+  child windows of the parent of the message box are automatically
+  disabled, but popup windows are not.  This is the default.
+systemmodal
+  Same as applmodal except that the message box has the WS_EX_TOPMOST
+  style. Use system-modal message boxes to notify the user of serious,
+  potentially damaging errors that require immediate attention (for
+  example, running out of memory). This flag has no effect on the
+  user's ability to interact with windows other than those associated
+  with hWnd.
+taskmodal
+  Same as applmodal except that all the top-level windows belonging to
+  the current task are disabled if the hWnd parameter is NULL. Use
+  this flag when the calling application or library does not have a
+  window handle available but still needs to prevent input to other
+  windows in the current application without suspending other
+  applications.
+
+
+In addition, you can specify the following flags: 
+
+default-desktop-only 
+  The desktop currently receiving input must be a default desktop;
+  otherwise, the function fails. A default desktop is one an
+  application runs on after the user has logged on.
+help 
+  Adds a Help button to the message box. Choosing the Help button or
+  pressing F1 generates a Help event.
+right 
+  The text is right-justified. 
+rtlreading 
+  Displays message and caption text using right-to-left reading order
+  on Hebrew and Arabic systems.
+setforeground 
+  The message box becomes the foreground window. Internally, Windows
+  calls the SetForegroundWindow function for the message box.
+topmost 
+  The message box is created with the WS_EX_TOPMOST window style. 
+service-notification 
+  Windows NT only: The caller is a service notifying the user of an
+  event. The function displays a message box on the current active
+  desktop, even if there is no user logged on to the computer.  If
+  this flag is set, the hWnd parameter must be NULL. This is so the
+  message box can appear on a desktop other than the desktop
+  corresponding to the hWnd.
+
+
+
+The return value is one of the following menu-item values returned by
+the dialog box:
+abort
+  Abort button was selected. 
+cancel
+  Cancel button was selected. 
+ignore
+  Ignore button was selected. 
+no
+  No button was selected. 
+ok
+  OK button was selected. 
+retry
+  Retry button was selected. 
+yes
+  Yes button was selected. 
+
+If a message box has a Cancel button, the function returns the
+`cancel' value if either the ESC key is pressed or the Cancel button
+is selected.  If the message box has no Cancel button, pressing ESC has
+no effect.  */
+       (message_, flags, title))
+{
+  Lisp_Object tail;
+  Extbyte *msgout;
+  Extbyte *titleout = 0;
+  UINT sty = 0;
+
+  if (noninteractive)
+    return Qcancel;
+
+  if (!CONSP (flags))
+    {
+      CHECK_SYMBOL (flags);
+      flags = list1 (flags);
+    }
+
+  CHECK_STRING (message_);
+  TO_EXTERNAL_FORMAT (LISP_STRING, message_,
+                     C_STRING_ALLOCA, msgout,
+                     Qmswindows_tstr);
+  
+  if (!NILP (title))
+    {
+      CHECK_STRING (title);
+      TO_EXTERNAL_FORMAT (LISP_STRING, title,
+                         C_STRING_ALLOCA, titleout,
+                         Qmswindows_tstr);
+    }
+
+  EXTERNAL_LIST_LOOP (tail, flags)
+    {
+      Lisp_Object st = XCAR (tail);
+      CHECK_SYMBOL (st);
+      if (0)
+       ;
+#define FROB(sym, val) else if (EQ (st, sym)) sty |= val
+      FROB (Qabortretryignore, MB_ABORTRETRYIGNORE);
+      FROB (Qapplmodal, MB_APPLMODAL);
+      FROB (Qdefault_desktop_only, MB_DEFAULT_DESKTOP_ONLY);
+      FROB (Qdefbutton1, MB_DEFBUTTON1);
+      FROB (Qdefbutton2, MB_DEFBUTTON2);
+      FROB (Qdefbutton3, MB_DEFBUTTON3);
+      FROB (Qdefbutton4, MB_DEFBUTTON4);
+      FROB (Qhelp, MB_HELP);
+      FROB (Qiconasterisk, MB_ICONASTERISK);
+      FROB (Qiconexclamation, MB_ICONEXCLAMATION);
+      FROB (Qiconhand, MB_ICONHAND);
+      FROB (Qiconinformation, MB_ICONINFORMATION);
+      FROB (Qiconquestion, MB_ICONQUESTION);
+      FROB (Qiconstop, MB_ICONSTOP);
+      FROB (Qok, MB_OK);
+      FROB (Qokcancel, MB_OKCANCEL);
+      FROB (Qretrycancel, MB_RETRYCANCEL);
+      FROB (Qright, MB_RIGHT);
+      FROB (Qrtlreading, MB_RTLREADING);
+      FROB (Qservice_notification, MB_SERVICE_NOTIFICATION);
+      FROB (Qsetforeground, MB_SETFOREGROUND);
+      FROB (Qsystemmodal, MB_SYSTEMMODAL);
+      FROB (Qtaskmodal, MB_TASKMODAL);
+      FROB (Qtopmost, MB_TOPMOST);
+      FROB (Qyesno, MB_YESNO);
+      FROB (Qyesnocancel, MB_YESNOCANCEL);
+#undef FROB
+
+      else
+       signal_simple_error ("Unrecognized flag", st);
+    }
+
+  {
+    int retval = MessageBox (NULL, msgout, titleout, sty);
+
+    if (retval == 0)
+      error ("Out of memory when calling `mswindows-message-box'");
+
+#define FROB(sym, val) if (retval == val) return sym
+    FROB (Qabort, IDABORT);
+    FROB (Qcancel, IDCANCEL);
+    FROB (Qignore, IDIGNORE);
+    FROB (Qno, IDNO);
+    FROB (Qok, IDOK);
+    FROB (Qretry, IDRETRY);
+    FROB (Qyes, IDYES);
+#undef FROB
+    
+    signal_simple_error ("Unknown return value from MessageBox()",
+                        make_int (retval));
+  }
+
+  return Qnil;
+}
+
+void
+mswindows_output_last_error (char *frob)
+{
+  LPVOID lpMsgBuf;
+  int errval = GetLastError();
+  
+  FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER
+                | FORMAT_MESSAGE_FROM_SYSTEM,
+                NULL, errval,
+                MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+                (LPTSTR) &lpMsgBuf,
+                0,
+                NULL);
+  stderr_out ("last error during %s is %d: %s\n",
+             frob, errval, (char*)lpMsgBuf);
+}
 
 \f
 /************************************************************************/
@@ -270,6 +543,42 @@ DSYMNAME (Lisp_Object obj)
 void
 syms_of_console_mswindows (void)
 {
+  defsymbol (&Qabortretryignore, "abortretryignore");
+  defsymbol (&Qapplmodal, "applmodal");
+  defsymbol (&Qdefault_desktop_only, "default-desktop-only");
+  defsymbol (&Qdefbutton1, "defbutton1");
+  defsymbol (&Qdefbutton2, "defbutton2");
+  defsymbol (&Qdefbutton3, "defbutton3");
+  defsymbol (&Qdefbutton4, "defbutton4");
+  /* defsymbol (&Qhelp, "help"); */
+  defsymbol (&Qiconasterisk, "iconasterisk");
+  defsymbol (&Qiconexclamation, "iconexclamation");
+  defsymbol (&Qiconhand, "iconhand");
+  defsymbol (&Qiconinformation, "iconinformation");
+  defsymbol (&Qiconquestion, "iconquestion");
+  defsymbol (&Qiconstop, "iconstop");
+  /* defsymbol (&Qok, "ok"); */
+  defsymbol (&Qokcancel, "okcancel");
+  defsymbol (&Qretrycancel, "retrycancel");
+  /* defsymbol (&Qright, "right"); */
+  defsymbol (&Qrtlreading, "rtlreading");
+  defsymbol (&Qservice_notification, "service-notification");
+  defsymbol (&Qsetforeground, "setforeground");
+  defsymbol (&Qsystemmodal, "systemmodal");
+  defsymbol (&Qtaskmodal, "taskmodal");
+  defsymbol (&Qtopmost, "topmost");
+  defsymbol (&Qyesno, "yesno");
+  defsymbol (&Qyesnocancel, "yesnocancel");
+
+  /* defsymbol (&Qabort, "abort"); */
+  /* defsymbol (&Qcancel, "cancel"); */
+  /* defsymbol (&Qignore, "ignore"); */
+  /* defsymbol (&Qno, "no"); */
+  /* defsymbol (&Qok, "ok"); */
+  /* defsymbol (&Qretry, "retry"); */
+  /* defsymbol (&Qyes, "yes"); */
+
+  DEFSUBR (Fmswindows_message_box);
 }
 
 void
index b5c3573..eacfbf5 100644 (file)
@@ -33,13 +33,8 @@ Boston, MA 02111-1307, USA.  */
 #define INCLUDED_console_msw_h_
 
 #include "console.h"
-#include <windows.h>
-#include <ddeml.h>     /* DDE management library */
-#if !defined(__CYGWIN32__) && !defined(__MINGW32__) \
-       || CYGWIN_VERSION_DLL_MAJOR > 20
-#include <shellapi.h>  /* FileManager/Explorer drag and drop */
-#include <commctrl.h>
-#endif
+#include "syswindows.h"
+#include "syscommctrl.h"
 
 #ifdef HAVE_XPM
 #include <X11/xpm.h>
@@ -164,6 +159,9 @@ struct mswindows_frame
   /* DC for this win32 window */
   HDC hdc;
 
+  /* Used with DeferWindowPos */
+  HDWP hdwp;
+
   /* Time of last click event, for button 2 emul */
   DWORD last_click_time;
 
@@ -352,4 +350,7 @@ Lisp_Object mswindows_handle_gui_wm_command (struct frame* f,
 
 int msw_windows9x_p (void);
 
+
+void mswindows_output_last_error (char *frob);
+
 #endif /* INCLUDED_console_msw_h_ */
index 600937c..33daa91 100644 (file)
@@ -201,16 +201,6 @@ stream_eol_cursor_width (void)
 }
 
 static void
-stream_output_begin (struct device *d)
-{
-}
-
-static void
-stream_output_end (struct device *d)
-{
-}
-
-static void
 stream_output_display_block (struct window *w, struct display_line *dl,
                             int block, int start, int end,
                             int start_pixpos, int cursor_start,
@@ -219,16 +209,6 @@ stream_output_display_block (struct window *w, struct display_line *dl,
 }
 
 static void
-stream_output_vertical_divider (struct window *w, int clear)
-{
-}
-
-static void
-stream_clear_to_window_end (struct window *w, int ypos1, int ypos2)
-{
-}
-
-static void
 stream_clear_region (Lisp_Object window, struct device* d, struct frame * f,
                  face_index findex, int x, int y,
                  int width, int height, Lisp_Object fcolor, Lisp_Object bcolor,
@@ -236,11 +216,6 @@ stream_clear_region (Lisp_Object window, struct device* d, struct frame * f,
 {
 }
 
-static void
-stream_clear_frame (struct frame *f)
-{
-}
-
 static int
 stream_flash (struct device *d)
 {
@@ -285,14 +260,9 @@ console_type_create_stream (void)
   CONSOLE_HAS_METHOD (stream, right_margin_width);
   CONSOLE_HAS_METHOD (stream, text_width);
   CONSOLE_HAS_METHOD (stream, output_display_block);
-  CONSOLE_HAS_METHOD (stream, output_vertical_divider);
   CONSOLE_HAS_METHOD (stream, divider_height);
   CONSOLE_HAS_METHOD (stream, eol_cursor_width);
-  CONSOLE_HAS_METHOD (stream, clear_to_window_end);
   CONSOLE_HAS_METHOD (stream, clear_region);
-  CONSOLE_HAS_METHOD (stream, clear_frame);
-  CONSOLE_HAS_METHOD (stream, output_begin);
-  CONSOLE_HAS_METHOD (stream, output_end);
   CONSOLE_HAS_METHOD (stream, flash);
   CONSOLE_HAS_METHOD (stream, ring_bell);
 }
index 4dad2be..6e3118b 100644 (file)
@@ -152,8 +152,10 @@ struct console_methods
                               int, int, int, int,
                               Lisp_Object, Lisp_Object, Lisp_Object);
   void (*clear_frame_method) (struct frame *);
-  void (*output_begin_method) (struct device *);
-  void (*output_end_method) (struct device *);
+  void (*window_output_begin_method) (struct window *);
+  void (*frame_output_begin_method) (struct frame *);
+  void (*window_output_end_method) (struct window *);
+  void (*frame_output_end_method) (struct frame *);
   int (*flash_method) (struct device *);
   void (*ring_bell_method) (struct device *, int volume, int pitch,
                            int duration);
index 1734233..76ef314 100644 (file)
@@ -40,13 +40,6 @@ Boston, MA 02111-1307, USA.  */
 #include "frame.h"
 #include "sysdep.h"
 
-#if (defined (__CYGWIN32__) || defined(__MINGW32__)) && \
-       CYGWIN_VERSION_DLL_MAJOR < 21
-extern BOOL WINAPI DdeFreeStringHandle(DWORD,HSZ);
-#else
-#include <winspool.h>
-#endif
-
 #if !(defined (__CYGWIN32__) || defined(__MINGW32__))
 # include <objbase.h>  /* For CoInitialize */
 #endif
index d33b1ea..31f5388 100644 (file)
@@ -426,6 +426,8 @@ int valid_device_class_p (Lisp_Object class);
 #define MARK_DEVICE_WINDOWS_STRUCTURE_CHANGED(d)       \
   ((void) (windows_structure_changed = (d)->windows_structure_changed = 1))
 
+/* #### unify this with DOMAIN_DEVICE once the latter has image instances
+   expunged from it. */
 /* This turns out to be used heavily so we make it a macro to make it
    inline.  Also, the majority of the time the object will turn out to
    be a window so we move it from being checked last to being checked
index fe1d119..e1208f2 100644 (file)
@@ -2,6 +2,7 @@
    Copyright (C) 1985, 1986, 1987, 1992, 1993, 1994
    Free Software Foundation, Inc.
    Copyright (C) 1995 Sun Microsystems, Inc.
+   Copyright (C) 2000 Ben Wing.
 
 This file is part of XEmacs.
 
@@ -22,6 +23,141 @@ Boston, MA 02111-1307, USA.  */
 
 /* Synched up with: Mule 2.0, FSF 19.28. */
 
+/* Capsule summary of the various releases of Lucid Emacs/XEmacs and
+   FSF/GNU Emacs.  Provided here for use in cross-referencing version
+   releases and dates in comments, esp. in the authorship comments at
+   the beginning of each file.  More information about history can be
+   found in the beginning of the Internals Manual and in the About page.
+
+
+-- A time line for Lucid Emacs/XEmacs is
+
+version 19.0 shipped with Energize 1.0, April 1992.
+version 19.1 released June 4, 1992.
+version 19.2 released June 19, 1992.
+version 19.3 released September 9, 1992.
+version 19.4 released January 21, 1993.
+version 19.5 was a repackaging of 19.4 with a few bug fixes and
+  shipped with Energize 2.0.  Never released to the net.
+version 19.6 released April 9, 1993.
+version 19.7 was a repackaging of 19.6 with a few bug fixes and
+  shipped with Energize 2.1.  Never released to the net.
+version 19.8 released September 6, 1993.
+version 19.9 released January 12, 1994.
+version 19.10 released May 27, 1994.
+version 19.11 (first XEmacs) released September 13, 1994.
+version 19.12 released June 23, 1995.
+version 19.13 released September 1, 1995.
+version 19.14 released June 23, 1996.
+version 20.0 released February 9, 1997.
+version 19.15 released March 28, 1997.
+version 20.1 (not released to the net) April 15, 1997.
+version 20.2 released May 16, 1997.
+version 19.16 released October 31, 1997.
+version 20.3 (the first stable version of XEmacs 20.x) released
+  November 30, 1997.
+version 20.4 released February 28, 1998.
+
+
+-- A time line for GNU Emacs version 19 is
+
+version 19.7 (beta) (first beta release) released ??????; prob. late May 1993.
+version 19.8 (beta) released May 27, 1993.
+version 19.9 (beta) released May 27, 1993.
+version 19.10 (beta) released May 30, 1993.
+version 19.11 (beta) released June 1, 1993.
+version 19.12 (beta) released June 2, 1993.
+version 19.13 (beta) released June 8, 1993.
+version 19.14 (beta) released June 17, 1993.
+version 19.15 (beta) released June 19, 1993.
+version 19.16 (beta) released July 6, 1993.
+version 19.17 (beta) released late July, 1993.
+version 19.18 (beta) released August 9, 1993.
+version 19.19 (beta) released August 15, 1993.
+version 19.20 (beta) released November 17, 1993.
+version 19.21 (beta) released November 17, 1993.
+version 19.22 (beta) released November 28, 1993.
+version 19.23 (beta) released May 17, 1994.
+version 19.24 (beta) released May 16, 1994.
+version 19.25 (beta) released June 3, 1994.
+version 19.26 (beta) released September 11, 1994.
+version 19.27 (beta) released September 14, 1994.
+version 19.28 (first ``official'' release) released November 1, 1994.
+version 19.29 released June 21, 1995.
+version 19.30 released November 24, 1995.
+version 19.31 released May 25, 1996.
+version 19.32 released July 31, 1996.
+version 19.33 released August 11, 1996.
+version 19.34 released August 21, 1996.
+version 19.34b released September 6, 1996.
+
+
+-- A time line for GNU Emacs version 20 is
+
+version 20.1 released September 17, 1997.
+version 20.2 released September 20, 1997.
+version 20.3 released August 19, 1998.
+
+
+-- A time line for GNU Emacs version 18 and older is
+
+GNU Emacs version 15 (15.34) was released sometime in 1984 or 1985 and
+  shared some code with a version of Emacs written by James Gosling (the
+  same James Gosling who later created the Java language).
+GNU Emacs version 16 (first released version was 16.56) was released on
+  July 15, 1985.  All Gosling code was removed due to potential copyright
+  problems with the code.
+version 16.57: released on September 16, 1985.
+versions 16.58, 16.59: released on September 17, 1985.
+version 16.60: released on September 19, 1985.  These later version 16's
+  incorporated patches from the net, esp. for getting Emacs to work under
+  System V.
+version 17.36 (first official v17 release) released on December 20, 1985.
+  Included a TeX-able user manual.  First official unpatched version that
+   worked on vanilla System V machines.
+version 17.43 (second official v17 release) released on January 25, 1986.
+version 17.45 released on January 30, 1986.
+version 17.46 released on February 4, 1986.
+version 17.48 released on February 10, 1986.
+version 17.49 released on February 12, 1986.
+version 17.55 released on March 18, 1986.
+version 17.57 released on March 27, 1986.
+version 17.58 released on April 4, 1986.
+version 17.61 released on April 12, 1986.
+version 17.63 released on May 7, 1986.
+version 17.64 released on May 12, 1986.
+version 18.24 (a beta version) released on October 2, 1986.
+version 18.30 (a beta version) released on November 15, 1986.
+version 18.31 (a beta version) released on November 23, 1986.
+version 18.32 (a beta version) released on December 7, 1986.
+version 18.33 (a beta version) released on December 12, 1986.
+version 18.35 (a beta version) released on January 5, 1987.
+version 18.36 (a beta version) released on January 21, 1987.
+January 27, 1987: The Great Usenet Renaming.  net.emacs is now comp.emacs.
+version 18.37 (a beta version) released on February 12, 1987.
+version 18.38 (a beta version) released on March 3, 1987.
+version 18.39 (a beta version) released on March 14, 1987.
+version 18.40 (a beta version) released on March 18, 1987.
+version 18.41 (the first ``official'' release) released on March 22, 1987.
+version 18.45 released on June 2, 1987.
+version 18.46 released on June 9, 1987.
+version 18.47 released on June 18, 1987.
+version 18.48 released on September 3, 1987.
+version 18.49 released on September 18, 1987.
+version 18.50 released on February 13, 1988.
+version 18.51 released on May 7, 1988.
+version 18.52 released on September 1, 1988.
+version 18.53 released on February 24, 1989.
+version 18.54 released on April 26, 1989.
+version 18.55 released on August 23, 1989.  This is the earliest version
+  that is still available by FTP.
+version 18.56 released on January 17, 1991.
+version 18.57 released late January, 1991.
+version 18.58 released ?????.
+version 18.59 released October 31, 1992.
+
+*/
+
 /* Note: It is necessary to specify <config.h> and not "config.h" in
    order for the --srcdir type of compilation to work properly.
    Otherwise the config.h from the srcdir, rather than the one from
@@ -170,8 +306,10 @@ Lisp_Object Vconfigure_exec_prefix_directory, Vconfigure_prefix_directory;
    priority. */
 int emacs_priority;
 
-/* If non-zero a filter or a sentinel is running.  Tested to save the match
-   data on the first attempt to change it inside asynchronous code. */
+/* Some FSF junk with running_asynch_code, to preserve the match
+   data.  Not necessary because we don't call process filters
+   asynchronously (i.e. from within QUIT). */
+/* #### Delete this when merging the rest of my code */
 int running_asynch_code;
 
 /* If non-zero, a window-system was specified on the command line. */
@@ -241,11 +379,63 @@ Lisp_Object Qsave_buffers_kill_emacs;
 extern Lisp_Object Vlisp_EXEC_SUFFIXES;
 
 \f
-/* Signal code for the fatal signal that was received */
-static int fatal_error_code;
 
-/* Nonzero if handling a fatal error already */
-static int fatal_error_in_progress;
+/* Ben's capsule summary about expected and unexpected exits from XEmacs.
+
+   Expected exits occur when the user directs XEmacs to exit, for example
+   by pressing the close button on the only frame in XEmacs, or by typing
+   C-x C-c.  This runs `save-buffers-kill-emacs', which saves any necessary
+   buffers, and then exits using the primitive `kill-emacs'.
+
+   However, unexpected exits occur in a few different ways:
+
+     -- a memory access violation or other hardware-generated exception
+        occurs.  This is the worst possible problem to deal with, because
+        the fault can occur while XEmacs is in any state whatsoever, even
+        quite unstable ones.  As a result, we need to be *extremely* careful
+        what we do.
+     -- we are using one X display (or if we've used more, we've closed the
+        others already), and some hardware or other problem happens and
+        suddenly we've lost our connection to the display.  In this situation,
+       things are not so dire as in the last one; our code itself isn't
+       trashed, so we can continue execution as normal, after having set
+       things up so that we can exit at the appropriate time.  Our exit
+       still needs to be of the emergency nature; we have no displays, so
+       any attempts to use them will fail.  We simply want to auto-save
+       (the single most important thing to do during shut-down), do minimal
+       cleanup of stuff that has an independent existence outside of XEmacs,
+       and exit.
+
+       Currently, both unexpected exit scenarios described above set
+       preparing_for_armageddon to indicate that nonessential and possibly
+       dangerous things should not be done, specifically:
+
+       -- no garbage collection.
+       -- no hooks are run.
+       -- no messages of any sort from autosaving.
+       -- autosaving tries harder, ignoring certain failures.
+       -- existing frames are not deleted.
+
+       (Also, all places that set preparing_for_armageddon also
+       set dont_check_for_quit.  This happens separately because it's
+       also necessary to set other variables to make absolutely sure
+       no quitting happens.)
+
+       In the first scenario above (the access violation), we also set
+       fatal_error_in_progress.  This causes more things to not happen:
+
+       -- assertion failures do not abort.
+       -- printing code does not do code conversion or gettext when
+          printing to stdout/stderr.
+*/
+
+/* Nonzero if handling a fatal error already. */
+int fatal_error_in_progress;
+
+/* Non-nil means we're going down, so we better not run any hooks
+   or do other non-essential stuff. */
+int preparing_for_armageddon;
+
 
 static JMP_BUF run_temacs_catch;
 
@@ -255,23 +445,54 @@ static char *run_temacs_args;
 static size_t run_temacs_argv_size;
 static size_t run_temacs_args_size;
 
-static void shut_down_emacs (int sig, Lisp_Object stuff);
+static void shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save);
+
+static void
+ensure_no_quitting_from_now_on (void)
+{
+  /* make sure no quitting from now on!! */
+  dont_check_for_quit = 1;
+  Vinhibit_quit = Qt;
+  Vquit_flag = Qnil;
+}
 
 /* Handle bus errors, illegal instruction, etc. */
 SIGTYPE
 fatal_error_signal (int sig)
 {
-  fatal_error_code = sig;
-  signal (sig, SIG_DFL);
+  fatal_error_in_progress++;
+  preparing_for_armageddon = 1;
+
+  ensure_no_quitting_from_now_on ();
+
   /* Unblock the signal so that if the same signal gets sent in the
      code below, we avoid a deadlock. */
-  EMACS_UNBLOCK_SIGNAL (fatal_error_code);
+  EMACS_UNBLOCK_SIGNAL (sig);
+
+  /* Only try auto-saving first time through.  If we crash in auto-saving,
+     don't do it again. */
+  if (fatal_error_in_progress == 1)
+    {
+      Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
+      /* Do this so that the variable has the same value of 2 regardless of
+        whether we made it through auto-saving correctly. */
+      fatal_error_in_progress++;
+    }
+  else if (fatal_error_in_progress == 2)
+    stderr_out ("WARNING: Unable to auto-save your files properly.\n"
+               "Some or all may in fact have been auto-saved.\n"
+               "\n");
+
+  /* Now, reset our signal handler, so the next time, we just die.
+     Don't do this before auto-saving. */
+  signal (sig, SIG_DFL);
 
+  /* Keep in mind that there's more than one signal that we can crash
+     on. */
   /* If fatal error occurs in code below, avoid infinite recursion.  */
-  if (! fatal_error_in_progress)
+  if (fatal_error_in_progress <= 2)
     {
-      fatal_error_in_progress = dont_check_for_quit = 1;
-      shut_down_emacs (sig, Qnil);
+      shut_down_emacs (sig, Qnil, 1);
       stderr_out ("\nLisp backtrace follows:\n\n");
       Fbacktrace (Qexternal_debugging_output, Qt);
 # if 0 /* This is evil, rarely useful, and causes grief in some cases. */
@@ -290,9 +511,62 @@ fatal_error_signal (int sig)
 # endif
     }
   /* Signal the same code; this time it will really be fatal. */
-  kill (getpid (), fatal_error_code);
+  kill (getpid (), sig);
   SIGRETURN;
 }
+
+#ifdef _MSC_VER
+
+static DWORD
+mswindows_handle_hardware_exceptions (DWORD code)
+{
+  if (code != STATUS_ACCESS_VIOLATION && code != STATUS_ILLEGAL_INSTRUCTION
+      && code != STATUS_PRIVILEGED_INSTRUCTION
+      && code != STATUS_DATATYPE_MISALIGNMENT)
+    return EXCEPTION_CONTINUE_SEARCH;
+
+  /* I don't know if this filter is still wrapped in the outer __try, but
+     it doesn't hurt to have another one. --ben */
+  __try
+    {
+      fatal_error_in_progress++;
+      preparing_for_armageddon = 1;
+
+      ensure_no_quitting_from_now_on ();
+
+      /* Only try auto-saving first time through.  If we crash in auto-saving,
+        don't do it again. */
+      if (fatal_error_in_progress == 1)
+       {
+         Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
+         /* Do this so that the variable has the same value of 2 regardless of
+            whether we made it through auto-saving correctly. */
+         fatal_error_in_progress++;
+       }
+      else if (fatal_error_in_progress == 2)
+       stderr_out ("WARNING: Unable to auto-save your files properly.\n"
+                   "Some or all may in fact have been auto-saved.\n"
+                   "\n");
+
+      /* If fatal error occurs in code below, avoid infinite recursion.  */
+      if (fatal_error_in_progress <= 2)
+       {
+         shut_down_emacs (-1, Qnil, 1);
+         stderr_out ("\nLisp backtrace follows:\n\n");
+         Fbacktrace (Qexternal_debugging_output, Qt);
+       }
+    }
+  /* VC++ documentation says that
+     GetExceptionCode() cannot be called inside the filter itself. */
+  __except (mswindows_handle_hardware_exceptions (GetExceptionCode ())) {}
+
+  /* pretend we didn't handle this, so that the debugger is invoked and/or
+     the normal GPF box appears. */
+  return EXCEPTION_CONTINUE_SEARCH;
+}
+
+#endif /* _MSC_VER */
+
 \f
 
 #ifdef SIGDANGER
@@ -1686,7 +1960,6 @@ main_1 (int argc, char **argv, char **envp, int restart)
 #endif
       reinit_vars_of_objects ();
       reinit_vars_of_print ();
-      reinit_vars_of_redisplay ();
       reinit_vars_of_search ();
       reinit_vars_of_undo ();
       reinit_vars_of_window ();
@@ -2173,6 +2446,16 @@ Do not call this.  It will reinitialize your XEmacs.  You'll be sorry.
 int
 main (int argc, char **argv, char **envp)
 {
+
+#ifdef _MSC_VER
+  /* Under VC++, access violations and the like are not sent through
+     the standard signal() mechanism.  Rather, they need to be handled
+     using the Microsoft "structured exception handling" mechanism,
+     which vaguely resembles the C++ mechanisms. */
+  __try
+  {
+#endif
+
   int     volatile vol_argc = argc;
   char ** volatile vol_argv = argv;
   char ** volatile vol_envp = envp;
@@ -2290,6 +2573,14 @@ main (int argc, char **argv, char **envp)
   run_temacs_argc = -1;
 
   main_1 (vol_argc, vol_argv, vol_envp, restarted);
+
+#ifdef _MSC_VER
+  }
+  /* VC++ documentation says that
+     GetExceptionCode() cannot be called inside the filter itself. */
+  __except (mswindows_handle_hardware_exceptions (GetExceptionCode ())) {}
+#endif
+
   return 0; /* unreached */
 }
 
@@ -2334,9 +2625,7 @@ all of which are called before XEmacs is actually killed.
   if (!preparing_for_armageddon && !noninteractive)
     run_hook (Qkill_emacs_hook);
 
-  /* make sure no quitting from now on!! */
-  dont_check_for_quit = 1;
-  Vinhibit_quit = Qt;
+  ensure_no_quitting_from_now_on ();
 
   if (!preparing_for_armageddon)
     {
@@ -2364,7 +2653,7 @@ all of which are called before XEmacs is actually killed.
 
   UNGCPRO;
 
-  shut_down_emacs (0, STRINGP (arg) ? arg : Qnil);
+  shut_down_emacs (0, STRINGP (arg) ? arg : Qnil, 0);
 
 #if defined(GNU_MALLOC)
   __free_hook =
@@ -2387,45 +2676,54 @@ all of which are called before XEmacs is actually killed.
 
    If SIG is a signal number, print a message for it.
 
-   This is called by fatal signal handlers, X protocol error handlers,
-   and Fkill_emacs.  */
+   This is called by fatal signal handlers and Fkill_emacs.  It used to
+   be called by X protocol error handlers, but instead they now call
+   Fkill_emacs. */
 static void
-shut_down_emacs (int sig, Lisp_Object stuff)
+shut_down_emacs (int sig, Lisp_Object stuff, int no_auto_save)
 {
   /* This function can GC */
   /* Prevent running of hooks and other non-essential stuff
      from now on.  */
   preparing_for_armageddon = 1;
 
-  /* In case frames or windows are screwed up, avoid assertion
-     failures here */
-  Vinhibit_quit = Qt;
+  ensure_no_quitting_from_now_on ();
 
 #ifdef QUANTIFY
   quantify_stop_recording_data ();
 #endif /* QUANTIFY */
 
-#if 0
   /* This is absolutely the most important thing to do, so make sure
      we do it now, before anything else.  We might have crashed and
      be in a weird inconsistent state, and potentially anything could
      set off another protection fault and cause us to bail out
      immediately. */
-  /* I'm not removing the code entirely, yet.  We have run up against
+  /* Steve writes the following:
+
+     [[I'm not removing the code entirely, yet.  We have run up against
      a spate of problems in diagnosing crashes due to crashes within
      crashes.  It has very definitely been determined that code called
      during auto-saving cannot work if XEmacs crashed inside of GC.
      We already auto-save on an itimer so there cannot be too much
      unsaved stuff around, and if we get better crash reports we might
-     be able to get more problems fixed so I'm disabling this.  -slb */
-  Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
-#endif
+     be able to get more problems fixed so I'm disabling this.  -slb]]
+
+     and DISABLES AUTO-SAVING ENTIRELY during crashes!  Way way bad idea.
+
+     Instead let's just be more intelligent about avoiding crashing
+     when possible, esp. nested crashes.
+  */
+  if (!no_auto_save)
+    Fdo_auto_save (Qt, Qnil); /* do this before anything hazardous */
 
   fflush (stdout);
   reset_all_consoles ();
   if (sig && sig != SIGTERM)
     {
-      stderr_out ("\nFatal error (%d).\n", sig);
+      if (sig == -1)
+       stderr_out ("\nFatal error.\n\n");
+      else
+       stderr_out ("\nFatal error (%d).\n\n", sig);
       stderr_out
        ("Your files have been auto-saved.\n"
         "Use `M-x recover-session' to recover them.\n"
@@ -2444,6 +2742,7 @@ shut_down_emacs (int sig, Lisp_Object stuff)
 #endif
         "*MAKE SURE* to include the information in the command\n"
         "M-x describe-installation.\n"
+#ifndef _MSC_VER
         "\n"
         "If at all possible, *please* try to obtain a C stack backtrace;\n"
         "it will help us immensely in determining what went wrong.\n"
@@ -2452,7 +2751,10 @@ shut_down_emacs (int sig, Lisp_Object stuff)
         "directory in which you started the editor, or maybe in your home\n"
         "directory), and type\n"
         "\n"
-        "  gdb ");
+        "  gdb "
+#endif
+        );
+#ifndef _MSC_VER
       {
        const char *name;
        char *dir = 0;
@@ -2479,6 +2781,7 @@ shut_down_emacs (int sig, Lisp_Object stuff)
         "(If you don't have GDB on your system, you might have DBX,\n"
         "or XDB, or SDB.  A similar procedure should work for all of\n"
         "these.  Ask your system administrator if you need more help.)\n");
+#endif /* _MSC_VER */
     }
 
   stuff_buffered_input (stuff);
@@ -2742,17 +3045,75 @@ Non-nil return value means XEmacs is running without interactive terminal.
 #ifdef USE_ASSERTIONS
 /* This highly dubious kludge ... shut up Jamie, I'm tired of your slagging. */
 
-DOESNT_RETURN
-assert_failed (const char *file, int line, const char *expr)
-{
-  stderr_out ("Fatal error: assertion failed, file %s, line %d, %s\n",
-             file, line, expr);
+static int in_assert_failed;
+static const char *assert_failed_file;
+static int assert_failed_line;
+static const char *assert_failed_expr;
+
+#ifdef fprintf
+#undef fprintf
+#endif
+
 #undef abort   /* avoid infinite #define loop... */
+
 #if defined (WINDOWSNT) && defined (DEBUG_XEMACS)
-  DebugBreak ();
-#elif !defined (ASSERTIONS_DONT_ABORT)
+#define enter_debugger() DebugBreak ()
+#else
+#define enter_debugger()
+#endif
+
+void
+assert_failed (const char *file, int line, const char *expr)
+{
+  /* If we're already crashing, let's not crash again.  This might be
+     critical to getting auto-saving working properly. */
+  if (fatal_error_in_progress)
+    return;
+
+  /* We are extremely paranoid so we sensibly deal with recursive
+     assertion failures. */
+  in_assert_failed++;
+
+  if (in_assert_failed >= 4)
+    _exit (-1);
+  else if (in_assert_failed == 3)
+    {
+      enter_debugger ();
+      _exit (-1);
+    }
+  else if (in_assert_failed == 2)
+    {
+      /* Not stderr_out(), which does additional things and may trigger
+        a recursive assertion failure.  fprintf was undeffed above, in
+        case it was encapsulated. */
+      fprintf (stderr,
+              "Fatal error: recursive assertion failure, "
+              "file %s, line %d, %s\n",
+              file, line, expr);
+      fprintf (stderr,
+              "Original assertion failure: file %s, line %d, %s\n",
+              assert_failed_file, assert_failed_line, assert_failed_expr);
+    }
+  else
+    {
+      assert_failed_file = file;
+      assert_failed_line = line;
+      assert_failed_expr = expr;
+      if (!initialized)
+       fprintf (stderr,
+                "Fatal error: assertion failed, file %s, line %d, %s\n",
+                file, line, expr);
+      else
+       stderr_out ("Fatal error: assertion failed, file %s, line %d, %s\n",
+                   file, line, expr);
+    }
+
+  enter_debugger ();
+#if !defined (ASSERTIONS_DONT_ABORT)
   abort ();
 #endif
+  in_assert_failed = 0;
 }
 #endif /* USE_ASSERTIONS */
 
@@ -3176,19 +3537,6 @@ or were installed as packages, and are intended for XEmacs to use.
 */ );
   Vdata_directory_list = Qnil;
 
-#ifdef CLASH_DETECTION
-  DEFVAR_LISP ("configure-lock-directory", &Vconfigure_lock_directory /*
-For internal use by the build procedure only.
-configure's idea of what LOCK-DIRECTORY will be.
-*/ );
-#ifdef PATH_LOCK
-  Vconfigure_lock_directory = Ffile_name_as_directory
-    (build_string ((char *) PATH_LOCK));
-#else
-  Vconfigure_lock_directory = Qnil;
-#endif
-#endif /* CLASH_DETECTION */
-
   DEFVAR_LISP ("site-directory", &Vsite_directory /*
 *Directory of site-specific Lisp files that come with XEmacs.
 */ );
index 803d96a..da95e4e 100644 (file)
@@ -143,10 +143,6 @@ Lisp_Object Vcurrent_warning_class;
 /* Special catch tag used in call_with_suspended_errors(). */
 Lisp_Object Qunbound_suspended_errors_tag;
 
-/* Non-nil means we're going down, so we better not run any hooks
-   or do other non-essential stuff. */
-int preparing_for_armageddon;
-
 /* Non-nil means record all fset's and provide's, to be undone
    if the file being autoloaded is not fully loaded.
    They are recorded by being consed onto the front of Vautoload_queue:
@@ -4901,8 +4897,8 @@ function calls.
                      Fprin1 (backlist->args[i], stream);
                    }
                }
+             write_c_string (")\n", stream);
            }
-         write_c_string (")\n", stream);
          backlist = backlist->next;
        }
     }
index 154e5f0..78b1c40 100644 (file)
@@ -86,8 +86,6 @@ XtAppContext Xt_app_con;
 /* Do we accept events sent by other clients? */
 int x_allow_sendevents;
 
-int modifier_keys_are_sticky;
-
 #ifdef DEBUG_XEMACS
 int x_debug_events;
 #endif
@@ -3160,15 +3158,6 @@ vars_of_event_Xt (void)
   dispatch_event_queue_tail = Qnil;
   pdump_wire (&dispatch_event_queue_tail);
 
-  DEFVAR_BOOL ("modifier-keys-are-sticky", &modifier_keys_are_sticky /*
-*Non-nil makes modifier keys sticky.
-This means that you can release the modifier key before pressing down
-the key that you wish to be modified.  Although this is non-standard
-behavior, it is recommended because it reduces the strain on your hand,
-thus reducing the incidence of the dreaded Emacs-pinky syndrome.
-*/ );
-  modifier_keys_are_sticky = 0;
-
   DEFVAR_BOOL ("x-allow-sendevents", &x_allow_sendevents /*
 *Non-nil means to allow synthetic events.  Nil means they are ignored.
 Beware: allowing emacs to process SendEvents opens a big security hole.
index a949be8..5b7d03b 100644 (file)
@@ -1,4 +1,4 @@
-/* The  mswindows event_stream interface.
+/* The mswindows event_stream interface.
    Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
    Copyright (C) 1995 Sun Microsystems, Inc.
    Copyright (C) 1996, 2000 Ben Wing.
@@ -58,6 +58,7 @@ Boston, MA 02111-1307, USA.  */
 #include "process.h"
 #include "redisplay.h"
 #include "select.h"
+#include "window.h"
 #include "sysproc.h"
 #include "syswait.h"
 #include "systime.h"
@@ -78,10 +79,6 @@ typedef unsigned int SOCKET;
 # include <shlobj.h>   /* For IShellLink */
 #endif
 
-#if defined (__CYGWIN32__) && (CYGWIN_VERSION_DLL_MAJOR < 20)
-typedef NMHDR *LPNMHDR;
-#endif
-
 #ifdef HAVE_MENUBARS
 #define ADJR_MENUFLAG TRUE
 #else
@@ -103,6 +100,8 @@ static int mswindows_modifier_state (BYTE* keymap, int has_AltGr);
 static void mswindows_set_chord_timer (HWND hwnd);
 static int mswindows_button2_near_enough (POINTS p1, POINTS p2);
 static int mswindows_current_layout_has_AltGr (void);
+static int mswindows_handle_sticky_modifiers (WPARAM wParam, LPARAM lParam,
+                                             int downp, int keyp);
 
 static struct event_stream *mswindows_event_stream;
 
@@ -151,6 +150,10 @@ int mswindows_mouse_button_max_skew_x;
 int mswindows_mouse_button_max_skew_y;
 int mswindows_mouse_button_tolerance;
 
+#ifdef DEBUG_XEMACS
+int mswindows_debug_events;
+#endif
+
 /* This is the event signaled by the event pump.
    See mswindows_pump_outstanding_events for comments */
 static Lisp_Object mswindows_error_caught_in_modal_loop;
@@ -936,17 +939,21 @@ mswindows_enqueue_process_event (Lisp_Process* p)
 }
 
 static void
-mswindows_enqueue_mouse_button_event (HWND hwnd, UINT msg, POINTS where, DWORD when)
+mswindows_enqueue_mouse_button_event (HWND hwnd, UINT msg, POINTS where,
+                                     DWORD when)
 {
+  int downp = (msg == WM_LBUTTONDOWN || msg == WM_MBUTTONDOWN ||
+              msg == WM_RBUTTONDOWN);
 
   /* We always use last message time, because mouse button
      events may get delayed, and XEmacs double click
      recognition will fail */
 
   Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
-  Lisp_Event* event = XEVENT(emacs_event);
+  Lisp_Event* event = XEVENT (emacs_event);
 
-  event->channel = mswindows_find_frame(hwnd);
+  mswindows_handle_sticky_modifiers (0, 0, downp, 0);
+  event->channel = mswindows_find_frame (hwnd);
   event->timestamp = when;
   event->event.button.button =
     (msg==WM_LBUTTONDOWN || msg==WM_LBUTTONUP) ? 1 :
@@ -955,8 +962,7 @@ mswindows_enqueue_mouse_button_event (HWND hwnd, UINT msg, POINTS where, DWORD w
   event->event.button.y = where.y;
   event->event.button.modifiers = mswindows_modifier_state (NULL, 0);
 
-  if (msg==WM_LBUTTONDOWN || msg==WM_MBUTTONDOWN ||
-      msg==WM_RBUTTONDOWN)
+  if (downp)
     {
       event->event_type = button_press_event;
       SetCapture (hwnd);
@@ -1664,6 +1670,9 @@ mswindows_handle_paint (struct frame *frame)
         windows are unmapped, however once we are in the guts of
         WM_PAINT we need to make sure that we don't register
         unmaps then because they will not actually occur. */
+      /* #### commenting out the next line seems to fix some problems
+        but not all.  only andy currently understands this stuff and
+        he needs to review it more carefully. --ben */
       if (!check_for_ignored_expose (frame, x, y, width, height))
        {
          hold_ignored_expose_registration = 1;
@@ -1681,17 +1690,288 @@ mswindows_handle_paint (struct frame *frame)
 static int
 key_needs_default_processing_p (UINT vkey)
 {
-  if (mswindows_alt_by_itself_activates_menu && vkey == VK_MENU)
+  if (mswindows_alt_by_itself_activates_menu && vkey == VK_MENU
+      /* if we let ALT activate the menu like this, then sticky ALT-modified
+        keystrokes become impossible. */
+      && !modifier_keys_are_sticky)
     return 1;
 
   return 0;
 }
 
+/* key-handling code is always ugly.  It just ends up working out
+   that way.
+
+   #### Most of the sticky-modifier code below is copied from similar
+   code in event-Xt.c.  They should somehow or other be merged.
+
+   Here are some pointers:
+
+   -- DOWN_MASK indicates which modifiers should be treated as "down"
+      when the corresponding upstroke happens.  It gets reset for
+      a particular modifier when that modifier goes up, and reset
+      for all modifiers when a non-modifier key is pressed.  Example:
+
+      I press Control-A-Shift and then release Control-A-Shift.
+      I want the Shift key to be sticky but not the Control key.
+
+   -- If a modifier key is sticky, I can unstick it by pressing
+      the modifier key again. */
+
+static WPARAM last_downkey;
+static int need_to_add_mask, down_mask;
+
+#define XEMSW_LCONTROL (1<<0)
+#define XEMSW_RCONTROL (1<<1)
+#define XEMSW_LSHIFT (1<<2)
+#define XEMSW_RSHIFT (1<<3)
+#define XEMSW_LMENU (1<<4)
+#define XEMSW_RMENU (1<<5)
+
+static int
+mswindows_handle_sticky_modifiers (WPARAM wParam, LPARAM lParam,
+                                  int downp, int keyp)
+{
+  int mods = 0;
+
+  if (!modifier_keys_are_sticky) /* Optimize for non-sticky modifiers */
+    return 0;
+
+  if (! (keyp &&
+        (wParam == VK_CONTROL || wParam == VK_LCONTROL ||
+         wParam == VK_RCONTROL ||
+         wParam == VK_MENU || wParam == VK_LMENU ||
+         wParam == VK_RMENU ||
+         wParam == VK_SHIFT || wParam == VK_LSHIFT ||
+         wParam == VK_RSHIFT)))
+    { /* Not a modifier key */
+      if (downp && keyp && !last_downkey)
+       last_downkey = wParam;
+      /* If I hold press-and-release the Control key and then press
+        and hold down the right arrow, I want it to auto-repeat
+        Control-Right.  On the other hand, if I do the same but
+        manually press the Right arrow a bunch of times, I want
+        to see one Control-Right and then a bunch of Rights.
+        This means that we need to distinguish between an
+        auto-repeated key and a key pressed and released a bunch
+        of times. */
+      else if (downp && !keyp ||
+              (downp && keyp && last_downkey &&
+               (wParam != last_downkey ||
+                /* the "previous key state" bit indicates autorepeat */
+                ! (lParam & (1 << 30)))))
+       {
+         need_to_add_mask = 0;
+         last_downkey = 0;
+       }
+      if (downp)
+       down_mask = 0;
+
+      mods = need_to_add_mask;
+    }
+  else                          /* Modifier key pressed */
+    {
+      /* If a non-modifier key was pressed in the middle of a bunch
+        of modifiers, then it unsticks all the modifiers that were
+        previously pressed.  We cannot unstick the modifiers until
+        now because we want to check for auto-repeat of the
+        non-modifier key. */
+
+      if (last_downkey)
+       {
+         last_downkey = 0;
+         need_to_add_mask = 0;
+       }
+
+#define FROB(mask)                             \
+do {                                           \
+  if (downp && keyp)                           \
+    {                                          \
+      /* If modifier key is already sticky,    \
+         then unstick it.  Note that we do     \
+         not test down_mask to deal with the   \
+        unlikely but possible case that the    \
+        modifier key auto-repeats. */          \
+      if (need_to_add_mask & mask)             \
+       {                                       \
+         need_to_add_mask &= ~mask;            \
+         down_mask &= ~mask;                   \
+       }                                       \
+      else                                     \
+       down_mask |= mask;                      \
+    }                                          \
+  else                                         \
+    {                                          \
+      if (down_mask & mask)                    \
+       {                                       \
+         down_mask &= ~mask;                   \
+         need_to_add_mask |= mask;             \
+       }                                       \
+    }                                          \
+} while (0)
+
+      if (wParam == VK_CONTROL && (lParam & 0x1000000)
+         || wParam == VK_RCONTROL)
+       FROB (XEMSW_RCONTROL);
+      if (wParam == VK_CONTROL && !(lParam & 0x1000000)
+         || wParam == VK_LCONTROL)
+       FROB (XEMSW_LCONTROL);
+
+      if (wParam == VK_SHIFT && (lParam & 0x1000000)
+         || wParam == VK_RSHIFT)
+       FROB (XEMSW_RSHIFT);
+      if (wParam == VK_SHIFT && !(lParam & 0x1000000)
+         || wParam == VK_LSHIFT)
+       FROB (XEMSW_LSHIFT);
+
+      if (wParam == VK_MENU && (lParam & 0x1000000)
+         || wParam == VK_RMENU)
+       FROB (XEMSW_RMENU);
+      if (wParam == VK_MENU && !(lParam & 0x1000000)
+         || wParam == VK_LMENU)
+       FROB (XEMSW_LMENU);
+    }
+#undef FROB
+
+  if (mods && downp)
+    {
+      BYTE keymap[256];
+
+      GetKeyboardState (keymap);
+
+      if (mods & XEMSW_LCONTROL)
+       {
+         keymap [VK_CONTROL] |= 0x80;
+         keymap [VK_LCONTROL] |= 0x80;
+       }
+      if (mods & XEMSW_RCONTROL)
+       {
+         keymap [VK_CONTROL] |= 0x80;
+         keymap [VK_RCONTROL] |= 0x80;
+       }
+
+      if (mods & XEMSW_LSHIFT)
+       {
+         keymap [VK_SHIFT] |= 0x80;
+         keymap [VK_LSHIFT] |= 0x80;
+       }
+      if (mods & XEMSW_RSHIFT)
+       {
+         keymap [VK_SHIFT] |= 0x80;
+         keymap [VK_RSHIFT] |= 0x80;
+       }
+
+      if (mods & XEMSW_LMENU)
+       {
+         keymap [VK_MENU] |= 0x80;
+         keymap [VK_LMENU] |= 0x80;
+       }
+      if (mods & XEMSW_RMENU)
+       {
+         keymap [VK_MENU] |= 0x80;
+         keymap [VK_RMENU] |= 0x80;
+       }
+
+      SetKeyboardState (keymap);
+      return 1;
+    }
+
+  return 0;
+}
+
+static void
+clear_sticky_modifiers (void)
+{
+  need_to_add_mask = 0;
+  last_downkey     = 0;
+  down_mask        = 0;
+}
+
+#ifdef DEBUG_XEMACS
+
+static void
+output_modifier_keyboard_state (void)
+{
+  BYTE keymap[256];
+
+  GetKeyboardState (keymap);
+
+  stderr_out ("GetKeyboardState VK_MENU %d %d VK_LMENU %d %d VK_RMENU %d %d\n",
+             keymap[VK_MENU] & 0x80 ? 1 : 0,
+             keymap[VK_MENU] & 0x1 ? 1 : 0,
+             keymap[VK_LMENU] & 0x80 ? 1 : 0,
+             keymap[VK_LMENU] & 0x1 ? 1 : 0,
+             keymap[VK_RMENU] & 0x80 ? 1 : 0,
+             keymap[VK_RMENU] & 0x1 ? 1 : 0);
+  stderr_out ("GetKeyboardState VK_CONTROL %d %d VK_LCONTROL %d %d VK_RCONTROL %d %d\n",
+             keymap[VK_CONTROL] & 0x80 ? 1 : 0,
+             keymap[VK_CONTROL] & 0x1 ? 1 : 0,
+             keymap[VK_LCONTROL] & 0x80 ? 1 : 0,
+             keymap[VK_LCONTROL] & 0x1 ? 1 : 0,
+             keymap[VK_RCONTROL] & 0x80 ? 1 : 0,
+             keymap[VK_RCONTROL] & 0x1 ? 1 : 0);
+  stderr_out ("GetKeyboardState VK_SHIFT %d %d VK_LSHIFT %d %d VK_RSHIFT %d %d\n",
+             keymap[VK_SHIFT] & 0x80 ? 1 : 0,
+             keymap[VK_SHIFT] & 0x1 ? 1 : 0,
+             keymap[VK_LSHIFT] & 0x80 ? 1 : 0,
+             keymap[VK_LSHIFT] & 0x1 ? 1 : 0,
+             keymap[VK_RSHIFT] & 0x80 ? 1 : 0,
+             keymap[VK_RSHIFT] & 0x1 ? 1 : 0);
+}
+
+/* try to debug the stuck-alt-key problem.
+
+ #### this happens only inconsistently, and may only happen when using
+ StickyKeys in the Win2000 accessibility section of the control panel,
+ which is extremely broken for other reasons.  */
+
+static void
+output_alt_keyboard_state (void)
+{
+  BYTE keymap[256];
+  SHORT keystate[3];
+  // SHORT asyncstate[3];
+
+  GetKeyboardState (keymap);
+  keystate[0] = GetKeyState (VK_MENU);
+  keystate[1] = GetKeyState (VK_LMENU);
+  keystate[2] = GetKeyState (VK_RMENU);
+  /* Doing this interferes with key processing. */
+/*   asyncstate[0] = GetAsyncKeyState (VK_MENU); */
+/*   asyncstate[1] = GetAsyncKeyState (VK_LMENU); */
+/*   asyncstate[2] = GetAsyncKeyState (VK_RMENU); */
+
+  stderr_out ("GetKeyboardState VK_MENU %d %d VK_LMENU %d %d VK_RMENU %d %d\n",
+             keymap[VK_MENU] & 0x80 ? 1 : 0,
+             keymap[VK_MENU] & 0x1 ? 1 : 0,
+             keymap[VK_LMENU] & 0x80 ? 1 : 0,
+             keymap[VK_LMENU] & 0x1 ? 1 : 0,
+             keymap[VK_RMENU] & 0x80 ? 1 : 0,
+             keymap[VK_RMENU] & 0x1 ? 1 : 0);
+  stderr_out ("GetKeyState VK_MENU %d %d VK_LMENU %d %d VK_RMENU %d %d\n",
+             keystate[0] & 0x8000 ? 1 : 0,
+             keystate[0] & 0x1 ? 1 : 0,
+             keystate[1] & 0x8000 ? 1 : 0,
+             keystate[1] & 0x1 ? 1 : 0,
+             keystate[2] & 0x8000 ? 1 : 0,
+             keystate[2] & 0x1 ? 1 : 0);
+/*   stderr_out ("GetAsyncKeyState VK_MENU %d %d VK_LMENU %d %d VK_RMENU %d %d\n", */
+/*           asyncstate[0] & 0x8000 ? 1 : 0, */
+/*           asyncstate[0] & 0x1 ? 1 : 0, */
+/*           asyncstate[1] & 0x8000 ? 1 : 0, */
+/*           asyncstate[1] & 0x1 ? 1 : 0, */
+/*           asyncstate[2] & 0x8000 ? 1 : 0, */
+/*           asyncstate[2] & 0x1 ? 1 : 0); */
+}
+
+#endif /* DEBUG_XEMACS */  
+
+
 /*
  * The windows procedure for the window class XEMACS_CLASS
  */
 LRESULT WINAPI
-mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+mswindows_wnd_proc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 {
   /* Note: Remember to initialize emacs_event and event before use.
      This code calls code that can GC. You must GCPRO before calling such code. */
@@ -1726,11 +2006,23 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 
     case WM_KEYUP:
     case WM_SYSKEYUP:
+
       /* See Win95 comment under WM_KEYDOWN */
       {
        BYTE keymap[256];
        int should_set_keymap = 0;
 
+#ifdef DEBUG_XEMACS
+       if (mswindows_debug_events)
+         {
+           stderr_out ("%s wparam=%d lparam=%d\n",
+                       message == WM_KEYUP ? "WM_KEYUP" : "WM_SYSKEYUP",
+                       wParam, (int)lParam);
+           output_alt_keyboard_state ();
+         }         
+#endif /* DEBUG_XEMACS */  
+
+       mswindows_handle_sticky_modifiers (wParam, lParam, 0, 1);
        if (wParam == VK_CONTROL)
          {
            GetKeyboardState (keymap);
@@ -1744,12 +2036,13 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
            should_set_keymap = 1;
          }
 
-       if (should_set_keymap
-           && (message != WM_SYSKEYUP
-               || NILP (Vmenu_accelerator_enabled)))
+       if (should_set_keymap)
+         //        && (message != WM_SYSKEYUP
+         //    || NILP (Vmenu_accelerator_enabled)))
          SetKeyboardState (keymap);
 
       }
+      
       if (key_needs_default_processing_p (wParam))
        goto defproc;
       else
@@ -1757,6 +2050,7 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 
     case WM_KEYDOWN:
     case WM_SYSKEYDOWN:
+
       /* In some locales the right-hand Alt key is labelled AltGr. This key
        * should produce alternative charcaters when combined with another key.
        * eg on a German keyboard pressing AltGr+q should produce '@'.
@@ -1766,24 +2060,58 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        * We get round this by removing all modifiers from the keymap before
        * calling TranslateMessage() unless AltGr is *really* down. */
       {
-       BYTE keymap[256];
+       BYTE keymap_trans[256];
+       BYTE keymap_orig[256];
+       BYTE keymap_sticky[256];
        int has_AltGr = mswindows_current_layout_has_AltGr ();
-       int mods;
+       int mods = 0;
        int extendedp = lParam & 0x1000000;
        Lisp_Object keysym;
+       int sticky_changed;
 
+#ifdef DEBUG_XEMACS
+       if (mswindows_debug_events)
+         {
+           stderr_out ("%s wparam=%d lparam=%d\n",
+                       message == WM_KEYDOWN ? "WM_KEYDOWN" : "WM_SYSKEYDOWN",
+                       wParam, (int)lParam);
+           output_alt_keyboard_state ();
+         }         
+#endif /* DEBUG_XEMACS */  
+
+       GetKeyboardState (keymap_orig);
        frame = XFRAME (mswindows_find_frame (hwnd));
-       GetKeyboardState (keymap);
-       mods = mswindows_modifier_state (keymap, has_AltGr);
+       if ((sticky_changed =
+            mswindows_handle_sticky_modifiers (wParam, lParam, 1, 1)))
+         {
+           GetKeyboardState (keymap_sticky);
+           if (keymap_sticky[VK_MENU] & 0x80)
+             {
+               message = WM_SYSKEYDOWN;
+               /* We have to set the "context bit" so that the
+                  TranslateMessage() call below that generates the
+                  SYSCHAR message does its thing; see the documentation
+                  on WM_SYSKEYDOWN */
+               lParam |= 1 << 29;
+             }
+         }
+       else
+         memcpy (keymap_sticky, keymap_orig, 256);
+
+       mods = mswindows_modifier_state (keymap_sticky, has_AltGr);
 
        /* Handle non-printables */
        if (!NILP (keysym = mswindows_key_to_emacs_keysym (wParam, mods,
                                                           extendedp)))
-         mswindows_enqueue_keypress_event (hwnd, keysym, mods);
+         {
+           mswindows_enqueue_keypress_event (hwnd, keysym, mods);
+           if (sticky_changed)
+             SetKeyboardState (keymap_orig);
+         }
        else    /* Normal keys & modifiers */
          {
-           Emchar quit_ch = CONSOLE_QUIT_CHAR (XCONSOLE (mswindows_find_console (hwnd)));
-           BYTE keymap_orig[256];
+           Emchar quit_ch =
+             CONSOLE_QUIT_CHAR (XCONSOLE (mswindows_find_console (hwnd)));
            POINT pnt = { LOWORD (GetMessagePos()), HIWORD (GetMessagePos()) };
            MSG msg, tranmsg;
            int potential_accelerator = 0;
@@ -1800,11 +2128,15 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
             * to loosely track Left and Right modifiers on behalf of the OS,
             * without screwing up Windows NT which tracks them properly. */
            if (wParam == VK_CONTROL)
-             keymap [extendedp ? VK_RCONTROL : VK_LCONTROL] |= 0x80;
+             {
+               keymap_orig[extendedp ? VK_RCONTROL : VK_LCONTROL] |= 0x80;
+               keymap_sticky[extendedp ? VK_RCONTROL : VK_LCONTROL] |= 0x80;
+             }
            else if (wParam == VK_MENU)
-             keymap [extendedp ? VK_RMENU : VK_LMENU] |= 0x80;
-
-           memcpy (keymap_orig, keymap, 256);
+             {
+               keymap_orig[extendedp ? VK_RMENU : VK_LMENU] |= 0x80;
+               keymap_sticky[extendedp ? VK_RMENU : VK_LMENU] |= 0x80;
+             }
 
            if (!NILP (Vmenu_accelerator_enabled) &&
                !(mods & XEMACS_MOD_SHIFT) && message == WM_SYSKEYDOWN)
@@ -1813,24 +2145,27 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
            /* Remove shift modifier from an ascii character */
            mods &= ~XEMACS_MOD_SHIFT;
 
+           memcpy (keymap_trans, keymap_sticky, 256);
+
            /* Clear control and alt modifiers unless AltGr is pressed */
-           keymap [VK_RCONTROL] = 0;
-           keymap [VK_LMENU] = 0;
-           if (!has_AltGr || !(keymap [VK_LCONTROL] & 0x80)
-               || !(keymap [VK_RMENU] & 0x80))
+           keymap_trans[VK_RCONTROL] = 0;
+           keymap_trans[VK_LMENU] = 0;
+           if (!has_AltGr || !(keymap_trans[VK_LCONTROL] & 0x80)
+               || !(keymap_trans[VK_RMENU] & 0x80))
              {
-               keymap [VK_LCONTROL] = 0;
-               keymap [VK_CONTROL] = 0;
-               keymap [VK_RMENU] = 0;
-               keymap [VK_MENU] = 0;
+               keymap_trans[VK_LCONTROL] = 0;
+               keymap_trans[VK_CONTROL] = 0;
+               keymap_trans[VK_RMENU] = 0;
+               keymap_trans[VK_MENU] = 0;
              }
-           SetKeyboardState (keymap);
+           SetKeyboardState (keymap_trans);
 
            /* Maybe generate some WM_[SYS]CHARs in the queue */
            TranslateMessage (&msg);
 
            while (PeekMessage (&tranmsg, hwnd, WM_CHAR, WM_CHAR, PM_REMOVE)
-                  || PeekMessage (&tranmsg, hwnd, WM_SYSCHAR, WM_SYSCHAR, PM_REMOVE))
+                  || PeekMessage (&tranmsg, hwnd, WM_SYSCHAR, WM_SYSCHAR,
+                                  PM_REMOVE))
              {
                int mods1 = mods;
                WPARAM ch = tranmsg.wParam;
@@ -1840,9 +2175,12 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                   upon dequeueing the event */
                /* #### This might also not withstand localization, if
                   quit character is not a latin-1 symbol */
-               if (((quit_ch < ' ' && (mods & XEMACS_MOD_CONTROL) && quit_ch + 'a' - 1 == ch)
-                    || (quit_ch >= ' ' && !(mods & XEMACS_MOD_CONTROL) && quit_ch == ch))
-                   && ((mods  & ~(XEMACS_MOD_CONTROL | XEMACS_MOD_SHIFT)) == 0))
+               if (((quit_ch < ' ' && (mods & XEMACS_MOD_CONTROL)
+                     && quit_ch + 'a' - 1 == ch)
+                    || (quit_ch >= ' ' && !(mods & XEMACS_MOD_CONTROL)
+                        && quit_ch == ch))
+                   && ((mods  & ~(XEMACS_MOD_CONTROL | XEMACS_MOD_SHIFT))
+                       == 0))
                  {
                    mods1 |= FAKE_MOD_QUIT;
                    ++mswindows_quit_chars_count;
@@ -1855,16 +2193,21 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                  }
                mswindows_enqueue_keypress_event (hwnd, make_char (ch), mods1);
              } /* while */
-           SetKeyboardState (keymap_orig);
+
            /* This generates WM_SYSCHAR messages, which are interpreted
               by DefWindowProc as the menu selections. */
            if (got_accelerator)
              { 
+               SetKeyboardState (keymap_sticky);
                TranslateMessage (&msg);
+               SetKeyboardState (keymap_orig);
                goto defproc;
              }
+
+           SetKeyboardState (keymap_orig);
          } /* else */
       }
+
       if (key_needs_default_processing_p (wParam))
        goto defproc;
       else
@@ -2389,7 +2732,7 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                       (XCOLOR_INSTANCE
                        (FACE_BACKGROUND
                         (XIMAGE_INSTANCE_WIDGET_FACE (image_instance),
-                         XIMAGE_INSTANCE_SUBWINDOW_FRAME (image_instance)))));
+                         XIMAGE_INSTANCE_FRAME (image_instance)))));
                  }
                last_widget_brushed = ii;
                SetTextColor
@@ -2398,7 +2741,7 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                   (XCOLOR_INSTANCE
                    (FACE_FOREGROUND
                     (XIMAGE_INSTANCE_WIDGET_FACE (image_instance),
-                     XIMAGE_INSTANCE_SUBWINDOW_FRAME (image_instance)))));
+                     XIMAGE_INSTANCE_FRAME (image_instance)))));
                SetBkMode (hdc, OPAQUE);
                SetBkColor
                  (hdc,
@@ -2406,7 +2749,7 @@ mswindows_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                   (XCOLOR_INSTANCE
                    (FACE_BACKGROUND
                     (XIMAGE_INSTANCE_WIDGET_FACE (image_instance),
-                     XIMAGE_INSTANCE_SUBWINDOW_FRAME (image_instance)))));
+                     XIMAGE_INSTANCE_FRAME (image_instance)))));
                return (LRESULT)widget_brush;
              }
          }
@@ -2582,13 +2925,15 @@ mswindows_current_layout_has_AltGr (void)
 
 /* Returns the state of the modifier keys in the format expected by the
  * Lisp_Event key_data, button_data and motion_data modifiers member */
-int mswindows_modifier_state (BYTE* keymap, int has_AltGr)
+static int
+mswindows_modifier_state (BYTE* keymap, int has_AltGr)
 {
   int mods = 0;
+  BYTE keymap2[256];
 
   if (keymap == NULL)
     {
-      keymap = (BYTE*) alloca(256);
+      keymap = keymap2;
       GetKeyboardState (keymap);
       has_AltGr = mswindows_current_layout_has_AltGr ();
     }
@@ -2839,18 +3184,19 @@ emacs_mswindows_handle_magic_event (Lisp_Event *emacs_event)
        struct frame *f = XFRAME (frame);
        int in_p = (EVENT_MSWINDOWS_MAGIC_TYPE(emacs_event) == WM_SETFOCUS);
        Lisp_Object conser;
+       struct gcpro gcpro1;
 
-       /* struct gcpro gcpro1; */
-
-       /* Clear sticky modifiers here (if we had any) */
+       /* On focus change, clear all memory of sticky modifiers
+          to avoid non-intuitive behavior. */
+       clear_sticky_modifiers ();
 
        conser = Fcons (frame, Fcons (FRAME_DEVICE (f), in_p ? Qt : Qnil));
-       /* GCPRO1 (conser); XXX Not necessary? */
+       GCPRO1 (conser);
        emacs_handle_focus_change_preliminary (conser);
        /* Under X the stuff up to here is done in the X event handler.
           I Don't know why */
        emacs_handle_focus_change_final (conser);
-       /* UNGCPRO; */
+       UNGCPRO;
 
       }
       break;
@@ -3165,6 +3511,20 @@ vars_of_event_mswindows (void)
   mswindows_error_caught_in_modal_loop = Qnil;
   staticpro (&mswindows_error_caught_in_modal_loop);
 
+
+#ifdef DEBUG_XEMACS
+  DEFVAR_INT ("mswindows-debug-events", &mswindows_debug_events /*
+If non-zero, display debug information about Windows events that XEmacs sees.
+Information is displayed in a console window.  Currently defined values are:
+
+1 == non-verbose output
+2 == verbose output
+
+#### Unfortunately, not yet implemented.
+*/ );
+  mswindows_debug_events = 0;
+#endif
+
   DEFVAR_BOOL ("mswindows-alt-by-itself-activates-menu",
               &mswindows_alt_by_itself_activates_menu /*
 *Controls whether pressing and releasing the Alt key activates the menubar.
index e2b46bb..e3cbf1f 100644 (file)
@@ -121,6 +121,8 @@ Lisp_Object Qpre_idle_hook, Vpre_idle_hook;
 /* Control gratuitous keyboard focus throwing. */
 int focus_follows_mouse;
 
+int modifier_keys_are_sticky;
+
 #if 0 /* FSF Emacs crap */
 /* Hook run after a command if there's no more input soon.  */
 Lisp_Object Qpost_command_idle_hook, Vpost_command_idle_hook;
@@ -4754,6 +4756,15 @@ you should *bind* this, not set it.
 */ );
     Vretry_undefined_key_binding_unshifted = Qt;
 
+  DEFVAR_BOOL ("modifier-keys-are-sticky", &modifier_keys_are_sticky /*
+*Non-nil makes modifier keys sticky.
+This means that you can release the modifier key before pressing down
+the key that you wish to be modified.  Although this is non-standard
+behavior, it is recommended because it reduces the strain on your hand,
+thus reducing the incidence of the dreaded Emacs-pinky syndrome.
+*/ );
+  modifier_keys_are_sticky = 0;
+
 #ifdef HAVE_XIM
   DEFVAR_LISP ("composed-character-default-binding",
                &Vcomposed_character_default_binding /*
index d22368e..e3bce63 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -3229,10 +3229,13 @@ Examples:
   (featurep '(or (and xemacs 19.15) (and emacs 19.34)))
     => ; Non-nil on XEmacs 19.15 and later, or FSF Emacs 19.34 and later.
 
+  (featurep '(and xemacs 21.02))
+    => ; Non-nil on XEmacs 21.2 and later.
+
 NOTE: The advanced arguments of this function (anything other than a
 symbol) are not yet supported by FSF Emacs.  If you feel they are useful
 for supporting multiple Emacs variants, lobby Richard Stallman at
-<bug-gnu-emacs@prep.ai.mit.edu>.
+<bug-gnu-emacs@gnu.org>.
 */
        (fexp))
 {
index f049a23..6679792 100644 (file)
@@ -127,13 +127,6 @@ mswindows_init_frame_1 (struct frame *f, Lisp_Object props)
     abs (XINT (height));
       
   /* Misc frame stuff */
-  FRAME_MSWINDOWS_DATA(f)->button2_need_lbutton = 0;
-  FRAME_MSWINDOWS_DATA(f)->button2_need_rbutton = 0;
-  FRAME_MSWINDOWS_DATA(f)->button2_is_down = 0;
-  FRAME_MSWINDOWS_DATA(f)->ignore_next_lbutton_up = 0;
-  FRAME_MSWINDOWS_DATA(f)->ignore_next_rbutton_up = 0;
-  FRAME_MSWINDOWS_DATA(f)->sizing = 0;
-  FRAME_MSWINDOWS_DATA(f)->paint_pending = 0;
   FRAME_MSWINDOWS_MENU_HASH_TABLE(f) = Qnil;
 #ifdef HAVE_TOOLBARS
   FRAME_MSWINDOWS_TOOLBAR_HASH_TABLE(f) = 
index fbb1a61..7549f4e 100644 (file)
@@ -130,8 +130,6 @@ mark_frame (Lisp_Object obj)
 #define MARKED_SLOT(x) mark_object (f->x)
 #include "frameslots.h"
 
-  mark_subwindow_cachels (f->subwindow_cachels);
-
   if (FRAME_LIVE_P (f)) /* device is nil for a dead frame */
     MAYBE_FRAMEMETH (f, mark_frame, (f));
 
@@ -208,7 +206,7 @@ allocate_frame_core (Lisp_Object device)
   f->last_nonminibuf_window = root_window;
 
   /* cache of subwindows visible on frame */
-  f->subwindow_cachels    = Dynarr_new (subwindow_cachel);
+  f->subwindow_instance_cache    = make_weak_list (WEAK_LIST_SIMPLE);
 
   /* associated exposure ignore list */
   f->subwindow_exposures = 0;
@@ -466,7 +464,6 @@ See `set-frame-properties', `default-x-frame-plist', and
 #endif
       reset_face_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f)));
       reset_glyph_cachels (XWINDOW (FRAME_SELECTED_WINDOW (f)));
-      reset_subwindow_cachels (f);
 
       change_frame_size (f, f->height, f->width, 0);
     }
@@ -1553,6 +1550,12 @@ delete_frame_internal (struct frame *f, int force,
   free_frame_toolbars (f);
 #endif
   free_frame_gutters (f);
+  /* Unfortunately deleting the frame will also delete the parent of
+     all of the subwindow instances current on the frame. I think this
+     can lead to bad things when trying to finalize the
+     instances. Thus we loop over the instance cache calling the
+     finalize method for each instance. */
+  free_frame_subwindow_instance_cache (f);
 
   /* This must be done before the window and window_mirror structures
      are freed.  The scrollbar information is attached to them. */
@@ -1564,11 +1567,7 @@ delete_frame_internal (struct frame *f, int force,
   f->root_window = Qnil;
 
   /* clear out the cached glyph information */
-  if (f->subwindow_cachels)
-    {
-      Dynarr_free (f->subwindow_cachels);
-      f->subwindow_cachels = 0;
-    }
+  f->subwindow_instance_cache = Qnil;
 
   /* Remove the frame now from the list.  This way, any events generated
      on this frame by the maneuvers below will disperse themselves. */
index e77a490..ceae5b0 100644 (file)
@@ -94,9 +94,6 @@ struct frame
 
   int modiff;
 
-  /* subwindow cache elements for this frame */
-  subwindow_cachel_dynarr *subwindow_cachels;
-
   struct expose_ignore* subwindow_exposures;
   struct expose_ignore* subwindow_exposures_tail;
 
@@ -547,7 +544,7 @@ extern int frame_changed;
   NON_LVALUE ((f)->last_nonminibuf_window)
 #define FRAME_SB_VCACHE(f) ((f)->sb_vcache)
 #define FRAME_SB_HCACHE(f) ((f)->sb_hcache)
-#define FRAME_SUBWINDOW_CACHE(f) ((f)->subwindow_cachels)
+#define FRAME_SUBWINDOW_CACHE(f) ((f)->subwindow_instance_cache)
 
 #if 0 /* FSFmacs */
 
index 4fe27bf..c473817 100644 (file)
@@ -145,6 +145,9 @@ Boston, MA 02111-1307, USA.  */
   MARKED_SLOT_ARRAY (toolbar_border_width, 4);
 #endif
 
+/* Cache of subwindow instances for this frame */
+  MARKED_SLOT (subwindow_instance_cache);
+
   /* Possible frame-local default for outside margin widths. */
   MARKED_SLOT (left_margin_width);
   MARKED_SLOT (right_margin_width);
index e3c8e4c..7ed8d4c 100644 (file)
@@ -31,6 +31,7 @@ Boston, MA 02111-1307, USA.  */
 #include <config.h>
 #include "lisp.h"
 
+Lisp_Object Qabort;
 Lisp_Object Qactually_requested;
 Lisp_Object Qafter;
 Lisp_Object Qall;
@@ -47,8 +48,9 @@ Lisp_Object Qbottom;
 Lisp_Object Qbottom_margin;
 Lisp_Object Qbuffer;
 Lisp_Object Qbutton;
-Lisp_Object Qcenter;
+Lisp_Object Qcancel;
 Lisp_Object Qcategory;
+Lisp_Object Qcenter;
 Lisp_Object Qchannel;
 Lisp_Object Qchar;
 Lisp_Object Qcharacter;
@@ -82,18 +84,20 @@ Lisp_Object Qface;
 Lisp_Object Qfile_name;
 Lisp_Object Qfont;
 Lisp_Object Qframe;
-Lisp_Object Qfunction;
 Lisp_Object Qfuncall;
+Lisp_Object Qfunction;
 Lisp_Object Qgap_overhead;
 Lisp_Object Qgeneric;
 Lisp_Object Qgeometry;
 Lisp_Object Qglobal;
 Lisp_Object Qgutter;
 Lisp_Object Qheight;
+Lisp_Object Qhelp;
 Lisp_Object Qhighlight;
 Lisp_Object Qhorizontal;
 Lisp_Object Qicon;
 Lisp_Object Qid;
+Lisp_Object Qignore;
 Lisp_Object Qimage;
 Lisp_Object Qinfo;
 Lisp_Object Qinherit;
@@ -122,11 +126,13 @@ Lisp_Object Qmotion;
 Lisp_Object Qmsprinter;
 Lisp_Object Qmswindows;
 Lisp_Object Qname;
+Lisp_Object Qno;
 Lisp_Object Qnone;
 Lisp_Object Qnot;
 Lisp_Object Qnothing;
 Lisp_Object Qnotice;
 Lisp_Object Qobject;
+Lisp_Object Qok;
 Lisp_Object Qold_assoc;
 Lisp_Object Qold_delete;
 Lisp_Object Qold_delq;
@@ -147,6 +153,7 @@ Lisp_Object Qrassoc;
 Lisp_Object Qrassq;
 Lisp_Object Qrequire;
 Lisp_Object Qresource;
+Lisp_Object Qretry;
 Lisp_Object Qreturn;
 Lisp_Object Qreverse;
 Lisp_Object Qright;
@@ -179,16 +186,18 @@ Lisp_Object Qunimplemented;
 Lisp_Object Qvalue_assoc;
 Lisp_Object Qvertical;
 Lisp_Object Qwarning;
-Lisp_Object Qwidth;
 Lisp_Object Qwidget;
+Lisp_Object Qwidth;
 Lisp_Object Qwindow;
 Lisp_Object Qwindow_system;
 Lisp_Object Qx;
 Lisp_Object Qy;
+Lisp_Object Qyes;
 
 void
 syms_of_general (void)
 {
+  defsymbol (&Qabort, "abort");
   defsymbol (&Qactually_requested, "actually-requested");
   defsymbol (&Qafter, "after");
   defsymbol (&Qall, "all");
@@ -205,6 +214,7 @@ syms_of_general (void)
   defsymbol (&Qbottom_margin, "bottom-margin");
   defsymbol (&Qbuffer, "buffer");
   defsymbol (&Qbutton, "button");
+  defsymbol (&Qcancel, "cancel");
   defsymbol (&Qcategory, "category");
   defsymbol (&Qcenter, "center");
   defsymbol (&Qchannel, "channel");
@@ -240,18 +250,20 @@ syms_of_general (void)
   defsymbol (&Qfile_name, "file-name");
   defsymbol (&Qfont, "font");
   defsymbol (&Qframe, "frame");
-  defsymbol (&Qfunction, "function");
   defsymbol (&Qfuncall, "funcall");
+  defsymbol (&Qfunction, "function");
   defsymbol (&Qgap_overhead, "gap-overhead");
   defsymbol (&Qgeneric, "generic");
   defsymbol (&Qgeometry, "geometry");
   defsymbol (&Qglobal, "global");
   defsymbol (&Qgutter, "gutter");
   defsymbol (&Qheight, "height");
+  defsymbol (&Qhelp, "help");
   defsymbol (&Qhighlight, "highlight");
   defsymbol (&Qhorizontal, "horizontal");
   defsymbol (&Qicon, "icon");
   defsymbol (&Qid, "id");
+  defsymbol (&Qignore, "ignore");
   defsymbol (&Qimage, "image");
   defsymbol (&Qinfo, "info");
   defsymbol (&Qinherit, "inherit");
@@ -280,11 +292,13 @@ syms_of_general (void)
   defsymbol (&Qmsprinter, "msprinter");
   defsymbol (&Qmswindows, "mswindows");
   defsymbol (&Qname, "name");
+  defsymbol (&Qno, "no");
   defsymbol (&Qnone, "none");
   defsymbol (&Qnot, "not");
   defsymbol (&Qnothing, "nothing");
   defsymbol (&Qnotice, "notice");
   defsymbol (&Qobject, "object");
+  defsymbol (&Qok, "ok");
   defsymbol (&Qold_assoc, "old-assoc");
   defsymbol (&Qold_delete, "old-delete");
   defsymbol (&Qold_delq, "old-delq");
@@ -305,6 +319,7 @@ syms_of_general (void)
   defsymbol (&Qrassq, "rassq");
   defsymbol (&Qrequire, "require");
   defsymbol (&Qresource, "resource");
+  defsymbol (&Qretry, "retry");
   defsymbol (&Qreturn, "return");
   defsymbol (&Qreverse, "reverse");
   defsymbol (&Qright, "right");
@@ -337,10 +352,11 @@ syms_of_general (void)
   defsymbol (&Qvalue_assoc, "value-assoc");
   defsymbol (&Qvertical, "vertical");
   defsymbol (&Qwarning, "warning");
-  defsymbol (&Qwidth, "width");
   defsymbol (&Qwidget, "widget");
+  defsymbol (&Qwidth, "width");
   defsymbol (&Qwindow, "window");
   defsymbol (&Qwindow_system, "window-system");
   defsymbol (&Qx, "x");
   defsymbol (&Qy, "y");
+  defsymbol (&Qyes, "yes");
 }
index 928b8e6..cb61afa 100644 (file)
@@ -56,6 +56,7 @@ Boston, MA 02111-1307, USA.  */
 #include "buffer.h"
 #include "frame.h"
 #include "opaque.h"
+#include "window.h"
 
 #include "sysfile.h"
 
@@ -480,7 +481,7 @@ jpeg_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
 
   /* Step 6.5: Create the pixmap and set up the image instance */
   /* now instantiate */
-  MAYBE_DEVMETH (XDEVICE (ii->device),
+  MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
                 init_image_instance_from_eimage,
                 (ii, cinfo.output_width, cinfo.output_height, 1,
                  unwind.eimage, dest_mask,
@@ -706,7 +707,7 @@ gif_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
       }
 
     /* now instantiate */
-    MAYBE_DEVMETH (XDEVICE (ii->device),
+    MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
                   init_image_instance_from_eimage,
                   (ii, width, height, unwind.giffile->ImageCount, unwind.eimage, dest_mask,
                    instantiator, domain));
@@ -1017,7 +1018,7 @@ png_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   }
 
   /* now instantiate */
-  MAYBE_DEVMETH (XDEVICE (ii->device),
+  MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
                 init_image_instance_from_eimage,
                 (ii, width, height, 1, unwind.eimage, dest_mask,
                  instantiator, domain));
@@ -1299,7 +1300,7 @@ tiff_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   }
 
   /* now instantiate */
-  MAYBE_DEVMETH (XDEVICE (ii->device),
+  MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
                 init_image_instance_from_eimage,
                 (ii, width, height, 1, unwind.eimage, dest_mask,
                  instantiator, domain));
index 440e272..1320e03 100644 (file)
@@ -20,7 +20,7 @@ Boston, MA 02111-1307, USA.  */
 
 /* Synched up with: Not in FSF. */
 
-/* written by Andy Piper <andy@xemacs.org> plagerising bits from
+/* written by Andy Piper <andy@xemacs.org> plagiarising bits from
    glyphs-x.c */
 
 #include <config.h>
@@ -57,7 +57,6 @@ DECLARE_IMAGE_INSTANTIATOR_FORMAT (nothing);
 DECLARE_IMAGE_INSTANTIATOR_FORMAT (string);
 DECLARE_IMAGE_INSTANTIATOR_FORMAT (formatted_string);
 DECLARE_IMAGE_INSTANTIATOR_FORMAT (inherit);
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
 #ifdef HAVE_JPEG
 DECLARE_IMAGE_INSTANTIATOR_FORMAT (jpeg);
 #endif
@@ -80,6 +79,8 @@ DEFINE_DEVICE_IIFORMAT (msprinter, xbm);
 DEFINE_DEVICE_IIFORMAT (mswindows, xface);
 DEFINE_DEVICE_IIFORMAT (msprinter, xface);
 #endif
+DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
+DEFINE_DEVICE_IIFORMAT (mswindows, native_layout);
 DEFINE_DEVICE_IIFORMAT (mswindows, button);
 DEFINE_DEVICE_IIFORMAT (mswindows, edit_field);
 DEFINE_DEVICE_IIFORMAT (mswindows, subwindow);
@@ -132,8 +133,7 @@ get_device_compdc (struct device *d)
  */
 static void init_image_instance_geometry (Lisp_Image_Instance *ii)
 {
-  Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
-  struct device *d = XDEVICE (device);
+  struct device *d = DOMAIN_XDEVICE (ii->domain);
   
   if (/* #### Scaleable && */ DEVICE_MSPRINTER_P (d))
     {
@@ -349,8 +349,7 @@ init_image_instance_from_dibitmap (Lisp_Image_Instance *ii,
                                   int x_hot, int y_hot,
                                   int create_mask)
 {
-  Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
-  struct device *d = XDEVICE (device);
+  struct device *d = XDEVICE (IMAGE_INSTANCE_DEVICE (ii));
   void* bmp_buf=0;
   enum image_instance_type type;
   HBITMAP bitmap;
@@ -2072,11 +2071,13 @@ extern int debug_widget_instances;
 static void
 mswindows_finalize_image_instance (Lisp_Image_Instance *p)
 {
-  if (DEVICE_LIVE_P (XDEVICE (p->device)))
+  if (!p->data)
+    return;
+
+  if (DEVICE_LIVE_P (XDEVICE (IMAGE_INSTANCE_DEVICE (p))))
     {
-      if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET
-         ||
-         IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
+      if (image_instance_type_to_mask (IMAGE_INSTANCE_TYPE (p))
+         & (IMAGE_WIDGET_MASK | IMAGE_SUBWINDOW_MASK))
        {
 #ifdef DEBUG_WIDGETS
          debug_widget_instances--;
@@ -2139,6 +2140,14 @@ mswindows_widget_hfont (Lisp_Image_Instance *p,
   return mswindows_get_hfont (XFONT_INSTANCE (font), under, strike);
 }
 
+static HDWP
+begin_defer_window_pos (struct frame *f)
+{
+  if (FRAME_MSWINDOWS_DATA (f)->hdwp == 0)
+    FRAME_MSWINDOWS_DATA (f)->hdwp = BeginDeferWindowPos (10);
+  return FRAME_MSWINDOWS_DATA (f)->hdwp;
+}
+  
 /* unmap the image if it is a widget. This is used by redisplay via
    redisplay_unmap_subwindows */
 static void
@@ -2146,11 +2155,26 @@ mswindows_unmap_subwindow (Lisp_Image_Instance *p)
 {
   if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
     {
-      SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
-                   NULL,
-                   0, 0, 0, 0,
-                   SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE
-                   | SWP_NOSENDCHANGING);
+      struct frame *f = XFRAME (IMAGE_INSTANCE_FRAME (p));
+      HDWP hdwp = begin_defer_window_pos (f);
+      HDWP new_hdwp;
+      new_hdwp = DeferWindowPos (hdwp, IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
+                                NULL,
+                                0, 0, 0, 0,
+                                SWP_HIDEWINDOW | SWP_NOACTIVATE |
+                                SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER
+                                /* Setting this flag causes the call to
+                                   DeferWindowPos to fail with
+                                   "Invalid parameter".  I don't understand
+                                   why we bother to try and set this
+                                   anyway. -- ben */
+                                /* | SWP_NOSENDCHANGING */
+                                );
+      if (!new_hdwp)
+       mswindows_output_last_error ("unmapping");
+      else
+       hdwp = new_hdwp;
+      FRAME_MSWINDOWS_DATA (f)->hdwp = hdwp;
       if (GetFocus() == WIDGET_INSTANCE_MSWINDOWS_HANDLE (p))
        SetFocus (GetParent (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p)));
     }
@@ -2162,6 +2186,9 @@ static void
 mswindows_map_subwindow (Lisp_Image_Instance *p, int x, int y,
                         struct display_glyph_area* dga)
 {
+  struct frame *f = XFRAME (IMAGE_INSTANCE_FRAME (p));
+  HDWP hdwp = begin_defer_window_pos (f);
+  HDWP new_hdwp;
   /* move the window before mapping it ... */
   SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
                NULL,
@@ -2175,12 +2202,24 @@ mswindows_map_subwindow (Lisp_Image_Instance *p, int x, int y,
                SWP_NOZORDER | SWP_NOSIZE
                | SWP_NOCOPYBITS | SWP_NOSENDCHANGING);
   /* ... now map it - we are not allowed to move it at the same time. */
-  SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
-               NULL,
-               0, 0, 0, 0,
-               SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE
-               | SWP_SHOWWINDOW | SWP_NOCOPYBITS
-               | SWP_NOSENDCHANGING);
+  new_hdwp = DeferWindowPos (hdwp, IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p),
+                            NULL,
+                            0, 0, 0, 0,
+                            SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE
+                            | SWP_SHOWWINDOW
+                            /* | SWP_NOCOPYBITS */
+                            /* Setting this flag causes the call to
+                               DeferWindowPos to fail with
+                               "Invalid parameter".  I don't understand
+                               why we bother to try and set this
+                               anyway. -- ben */
+                            /* | SWP_NOSENDCHANGING */
+                            | SWP_NOACTIVATE);
+  if (!new_hdwp)
+    mswindows_output_last_error ("mapping");
+  else
+    hdwp = new_hdwp;
+  FRAME_MSWINDOWS_DATA (f)->hdwp = hdwp;
 }
 
 /* resize the subwindow instance */
@@ -2188,11 +2227,12 @@ static void
 mswindows_resize_subwindow (Lisp_Image_Instance* ii, int w, int h)
 {
   /* Set the size of the control .... */
-  SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
-               NULL,
-               0, 0, w, h,
-               SWP_NOZORDER | SWP_NOMOVE
-               | SWP_NOCOPYBITS | SWP_NOSENDCHANGING);
+  if (!SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii),
+                    NULL,
+                    0, 0, w, h,
+                    SWP_NOZORDER | SWP_NOMOVE
+                    | SWP_NOCOPYBITS | SWP_NOSENDCHANGING))
+    mswindows_output_last_error ("resizing");
 }
 
 /* Simply resize the window here. */
@@ -2210,17 +2250,16 @@ static void
 mswindows_update_widget (Lisp_Image_Instance *p)
 {
   /* Possibly update the face font and colors. */
-  if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p)
-      ||
-      XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (p))->faces_changed
-      ||
-      IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p))
+  if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (p))
+      && (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p)
+         || XFRAME (IMAGE_INSTANCE_FRAME (p))->faces_changed
+         || IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p)))
     {
       /* set the widget font from the widget face */
       SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p),
                   WM_SETFONT,
                   (WPARAM) mswindows_widget_hfont
-                  (p, IMAGE_INSTANCE_SUBWINDOW_FRAME (p)),
+                  (p, IMAGE_INSTANCE_FRAME (p)),
                   MAKELPARAM (TRUE, 0));
     }
   /* Possibly update the dimensions. */
@@ -2231,7 +2270,8 @@ mswindows_update_widget (Lisp_Image_Instance *p)
                                  IMAGE_INSTANCE_HEIGHT (p));
     }
   /* Possibly update the text in the widget. */
-  if (IMAGE_INSTANCE_TEXT_CHANGED (p))
+  if (IMAGE_INSTANCE_TEXT_CHANGED (p)
+      && !NILP (IMAGE_INSTANCE_WIDGET_TEXT (p)))
     {
       Extbyte* lparam=0;
       TO_EXTERNAL_FORMAT (LISP_STRING, IMAGE_INSTANCE_WIDGET_TEXT (p),
@@ -2249,7 +2289,7 @@ static int
 mswindows_register_gui_item (Lisp_Object image_instance,
                             Lisp_Object gui, Lisp_Object domain)
 {
-  Lisp_Object frame = FW_FRAME (domain);
+  Lisp_Object frame = DOMAIN_FRAME (domain);
   struct frame* f = XFRAME (frame);
   int id = gui_item_id_hash (FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f),
                             gui,
@@ -2278,7 +2318,7 @@ mswindows_subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instant
 {
   Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
-  Lisp_Object frame = FW_FRAME (domain);
+  Lisp_Object frame = DOMAIN_FRAME (domain);
   HWND wnd;
 
   CHECK_MSWINDOWS_DEVICE (device);
@@ -2400,7 +2440,7 @@ mswindows_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiat
   /* this function can call lisp */
   Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), style;
-  Lisp_Object frame = FW_FRAME (domain);
+  Lisp_Object frame = DOMAIN_FRAME (domain);
   Extbyte* nm=0;
   HWND wnd;
   int id = 0xffff;
@@ -2438,7 +2478,7 @@ mswindows_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiat
                        IMAGE_INSTANCE_WIDGET_WIDTH (ii),
                        IMAGE_INSTANCE_WIDGET_HEIGHT (ii),
                        /* parent window */
-                       FRAME_MSWINDOWS_HANDLE (XFRAME (frame)),
+                       DOMAIN_MSWINDOWS_HANDLE (domain),
                        (HMENU)id,       /* No menu */
                        NULL, /* must be null for this class */
                        NULL)) == NULL)
@@ -2468,9 +2508,32 @@ mswindows_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiat
   IMAGE_INSTANCE_SUBWINDOW_ID (ii) = wnd;
   SetWindowLong (wnd, GWL_USERDATA, (LONG)LISP_TO_VOID(image_instance));
   /* set the widget font from the widget face */
-  SendMessage (wnd, WM_SETFONT,
-              (WPARAM) mswindows_widget_hfont (ii, domain),
-              MAKELPARAM (TRUE, 0));
+  if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)))
+    SendMessage (wnd, WM_SETFONT,
+                (WPARAM) mswindows_widget_hfont (ii, domain),
+                MAKELPARAM (TRUE, 0));
+}
+
+/* Instantiate a native layout widget. */
+static void
+mswindows_native_layout_instantiate (Lisp_Object image_instance,
+                                    Lisp_Object instantiator,
+                                    Lisp_Object pointer_fg, Lisp_Object pointer_bg,
+                                    int dest_mask, Lisp_Object domain)
+{
+  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+
+  mswindows_widget_instantiate (image_instance, instantiator, pointer_fg,
+                               pointer_bg, dest_mask, domain, "STATIC", 
+                               /* Approximation to styles available with
+                                  an XEmacs layout. */
+                               EQ (IMAGE_INSTANCE_LAYOUT_BORDER (ii),
+                                   Qetched_in) ||
+                               EQ (IMAGE_INSTANCE_LAYOUT_BORDER (ii),
+                                   Qetched_out) ||
+                               GLYPHP (IMAGE_INSTANCE_LAYOUT_BORDER (ii))
+                               ? SS_ETCHEDFRAME : SS_SUNKEN,
+                               0);
 }
 
 /* Instantiate a button widget. Unfortunately instantiated widgets are
@@ -2593,7 +2656,7 @@ mswindows_progress_gauge_instantiate (Lisp_Object image_instance, Lisp_Object in
                         (XCOLOR_INSTANCE
                          (FACE_BACKGROUND
                           (XIMAGE_INSTANCE_WIDGET_FACE (ii),
-                           XIMAGE_INSTANCE_SUBWINDOW_FRAME (ii))))));
+                           XIMAGE_INSTANCE_FRAME (ii))))));
 #endif
 #ifdef PBS_SETBARCOLOR
   SendMessage (wnd, PBS_SETBARCOLOR, 0,
@@ -2601,7 +2664,7 @@ mswindows_progress_gauge_instantiate (Lisp_Object image_instance, Lisp_Object in
                          (XCOLOR_INSTANCE
                           (FACE_FOREGROUND
                            (XIMAGE_INSTANCE_WIDGET_FACE (ii),
-                            XIMAGE_INSTANCE_SUBWINDOW_FRAME (ii))))));
+                            XIMAGE_INSTANCE_FRAME (ii))))));
 #endif
 }
 
@@ -2785,7 +2848,7 @@ mswindows_tab_control_update (Lisp_Object image_instance)
       LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii)))
        {
          add_tab_item (image_instance, wnd, XCAR (rest),
-                       IMAGE_INSTANCE_SUBWINDOW_FRAME (ii), i);
+                       IMAGE_INSTANCE_FRAME (ii), i);
          if (gui_item_selected_p (XCAR (rest)))
            selected = i;
          i++;
@@ -3013,7 +3076,6 @@ image_instantiator_format_create_glyphs_mswindows (void)
 {
   IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, nothing);
   IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, string);
-  IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, layout);
   IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, formatted_string);
   IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, inherit);
   /* image-instantiator types */
@@ -3046,44 +3108,41 @@ image_instantiator_format_create_glyphs_mswindows (void)
   IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, gif);
 #endif
 #ifdef HAVE_WIDGETS
+  INITIALIZE_DEVICE_IIFORMAT (mswindows, widget);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, widget, property);
+  /* layout widget */
+  IIFORMAT_VALID_CONSOLE (mswindows, layout);
+  INITIALIZE_DEVICE_IIFORMAT (mswindows, native_layout);
+  IIFORMAT_HAS_DEVMETHOD (mswindows, native_layout, instantiate);
   /* button widget */
   INITIALIZE_DEVICE_IIFORMAT (mswindows, button);
   IIFORMAT_HAS_DEVMETHOD (mswindows, button, property);
   IIFORMAT_HAS_DEVMETHOD (mswindows, button, instantiate);
   IIFORMAT_HAS_DEVMETHOD (mswindows, button, update);
-
+  /* edit-field widget */
   INITIALIZE_DEVICE_IIFORMAT (mswindows, edit_field);
   IIFORMAT_HAS_DEVMETHOD (mswindows, edit_field, instantiate);
-
+  /* subwindow */
   INITIALIZE_DEVICE_IIFORMAT (mswindows, subwindow);
   IIFORMAT_HAS_DEVMETHOD (mswindows, subwindow, instantiate);
-
-  INITIALIZE_DEVICE_IIFORMAT (mswindows, widget);
-  IIFORMAT_HAS_DEVMETHOD (mswindows, widget, property);
-
   /* label */
   INITIALIZE_DEVICE_IIFORMAT (mswindows, label);
   IIFORMAT_HAS_DEVMETHOD (mswindows, label, instantiate);
-
   /* combo box */
   INITIALIZE_DEVICE_IIFORMAT (mswindows, combo_box);
   IIFORMAT_HAS_DEVMETHOD (mswindows, combo_box, property);
   IIFORMAT_HAS_DEVMETHOD (mswindows, combo_box, instantiate);
-
   /* scrollbar */
   INITIALIZE_DEVICE_IIFORMAT (mswindows, scrollbar);
   IIFORMAT_HAS_DEVMETHOD (mswindows, scrollbar, instantiate);
-
   /* progress gauge */
   INITIALIZE_DEVICE_IIFORMAT (mswindows, progress_gauge);
   IIFORMAT_HAS_DEVMETHOD (mswindows, progress_gauge, update);
   IIFORMAT_HAS_DEVMETHOD (mswindows, progress_gauge, instantiate);
-
   /* tree view widget */
   INITIALIZE_DEVICE_IIFORMAT (mswindows, tree_view);
   /*  IIFORMAT_HAS_DEVMETHOD (mswindows, progress, set_property);*/
   IIFORMAT_HAS_DEVMETHOD (mswindows, tree_view, instantiate);
-
   /* tab control widget */
   INITIALIZE_DEVICE_IIFORMAT (mswindows, tab_control);
   IIFORMAT_HAS_DEVMETHOD (mswindows, tab_control, instantiate);
index 80d7c64..c2cba15 100644 (file)
@@ -96,14 +96,21 @@ struct mswindows_subwindow_data
 };
 
 #define MSWINDOWS_SUBWINDOW_DATA(i) \
-((struct mswindows_subwindow_data *) (i)->data)
-
+  ((struct mswindows_subwindow_data *) (i)->data)
 #define IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW(i) \
      (MSWINDOWS_SUBWINDOW_DATA (i)->clip_window)
 
+#define XIMAGE_INSTANCE_MSWINDOWS_SUBWINDOW_DATA(i) \
+  MSWINDOWS_SUBWINDOW_DATA (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW(i) \
   IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (XIMAGE_INSTANCE (i))
 
+#define DOMAIN_MSWINDOWS_HANDLE(domain) \
+  ((IMAGE_INSTANCEP (domain) && \
+  XIMAGE_INSTANCE_MSWINDOWS_SUBWINDOW_DATA (domain)) ? \
+   XWIDGET_INSTANCE_MSWINDOWS_HANDLE (domain) : \
+   FRAME_MSWINDOWS_HANDLE (DOMAIN_XFRAME (domain)))
+
 #endif /* HAVE_MS_WINDOWS */
 
 #endif /* INCLUDED_glyphs_msw_h_ */
index 8456c25..d7c8c58 100644 (file)
@@ -55,12 +55,13 @@ DEFINE_IMAGE_INSTANTIATOR_FORMAT (tab_control);
 Lisp_Object Qtab_control;
 DEFINE_IMAGE_INSTANTIATOR_FORMAT (layout);
 Lisp_Object Qlayout;
+DEFINE_IMAGE_INSTANTIATOR_FORMAT (native_layout);
+Lisp_Object Qnative_layout;
 
 Lisp_Object Q_descriptor, Q_height, Q_width, Q_properties, Q_items;
 Lisp_Object Q_image, Q_text, Q_orientation, Q_justify, Q_border;
+Lisp_Object Q_margin_width;
 Lisp_Object Qetched_in, Qetched_out, Qbevel_in, Qbevel_out;
-Lisp_Object Vwidget_callback_current_channel;
-Lisp_Object Qwidget_callback_current_channel;
 
 #ifdef DEBUG_WIDGETS
 int debug_widget_instances;
@@ -274,7 +275,7 @@ widget_property (Lisp_Object image_instance, Lisp_Object prop)
     return Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii), prop, Qnil);
 
   /* .. then try device specific methods ... */
-  meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii), 
+  meths = decode_device_ii_format (image_instance_device (image_instance),
                                   IMAGE_INSTANCE_WIDGET_TYPE (ii), 
                                   ERROR_ME_NOT);
   if (meths && HAS_IIFORMAT_METH_P (meths, property))
@@ -304,7 +305,7 @@ widget_set_property (Lisp_Object image_instance, Lisp_Object prop, Lisp_Object v
     }
 
   /* Now try device specific methods first ... */
-  meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii), 
+  meths = decode_device_ii_format (image_instance_device (image_instance), 
                                   IMAGE_INSTANCE_WIDGET_TYPE (ii), 
                                   ERROR_ME_NOT);
   if (meths && HAS_IIFORMAT_METH_P (meths, set_property)
@@ -331,30 +332,32 @@ widget_set_property (Lisp_Object image_instance, Lisp_Object prop, Lisp_Object v
 }
 
 /* Like the rest of redisplay, we want widget updates to occur
-asynchronously. Thus toolkit specific methods for setting properties
-must be called by redisplay instead of by *_set_property. Thus
-*_set_property records the change and this function actually
-implements it. We want to be slightly clever about this however by
-supplying format specific functions for the updates instead of lumping
-them all into this function. Note that there is no need for format
-generic functions. */
+   asynchronously. Thus toolkit specific methods for setting
+   properties must be called by redisplay instead of by
+   *_set_property. Thus *_set_property records the change and this
+   function actually implements it. We want to be slightly clever
+   about this however by supplying format specific functions for the
+   updates instead of lumping them all into this function. Note that
+   there is no need for format generic functions. */
 void
 update_widget (Lisp_Object widget)
 {
   Lisp_Image_Instance* ii = XIMAGE_INSTANCE (widget);
   struct image_instantiator_methods* meths;
 
-  if (IMAGE_INSTANCE_TYPE (ii) != IMAGE_WIDGET)
+  if (!WIDGET_IMAGE_INSTANCEP (widget)
+      || EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
+      || EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
     return;
 
   /* Device generic methods. We must update the widget's size as it
      may have been changed by the the layout routines. We also do this
      here so that explicit resizing from lisp does not result in
      synchronous updates. */
-  MAYBE_DEVMETH (XDEVICE (ii->device), update_widget, (ii));
+  MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain), update_widget, (ii));
 
   /* Device-format specific methods */
-  meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii), 
+  meths = decode_device_ii_format (image_instance_device (widget), 
                                   IMAGE_INSTANCE_WIDGET_TYPE (ii), 
                                   ERROR_ME_NOT);
   MAYBE_IIFORMAT_METH (meths, update, (widget));
@@ -389,7 +392,7 @@ widget_query_geometry (Lisp_Object image_instance,
       IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii))
     {
       /* .. then try device specific methods ... */
-      meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii), 
+      meths = decode_device_ii_format (image_instance_device (image_instance),
                                       IMAGE_INSTANCE_WIDGET_TYPE (ii), 
                                       ERROR_ME_NOT);
       if (meths && HAS_IIFORMAT_METH_P (meths, query_geometry))
@@ -437,7 +440,7 @@ widget_query_geometry (Lisp_Object image_instance,
     }
 }
 
-static void 
+static int 
 widget_layout (Lisp_Object image_instance, 
               unsigned int width, unsigned int height, Lisp_Object domain)
 {
@@ -445,21 +448,22 @@ widget_layout (Lisp_Object image_instance,
   struct image_instantiator_methods* meths;
 
   /* .. then try device specific methods ... */
-  meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii), 
+  meths = decode_device_ii_format (image_instance_device (image_instance),
                                   IMAGE_INSTANCE_WIDGET_TYPE (ii), 
                                   ERROR_ME_NOT);
   if (meths && HAS_IIFORMAT_METH_P (meths, layout))
-    IIFORMAT_METH (meths, layout, (image_instance, 
-                                  width, height, domain));
+    return IIFORMAT_METH (meths, layout, (image_instance, 
+                                         width, height, domain));
   else
     {
       /* ... then format specific methods ... */
       meths = decode_device_ii_format (Qnil, IMAGE_INSTANCE_WIDGET_TYPE (ii), 
                                       ERROR_ME_NOT);
       if (meths && HAS_IIFORMAT_METH_P (meths, layout))
-       IIFORMAT_METH (meths, layout, (image_instance, 
-                                      width, height, domain));
+       return IIFORMAT_METH (meths, layout, (image_instance, 
+                                             width, height, domain));
     }
+  return 1;
 }
 
 static void
@@ -516,6 +520,7 @@ initialize_widget_image_instance (Lisp_Image_Instance *ii, Lisp_Object type)
   IMAGE_INSTANCE_WIDGET_PROPS (ii) = Qnil;
   SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Qnil);
   IMAGE_INSTANCE_WIDGET_ITEMS (ii) = allocate_gui_item ();
+  IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = Qnil;
   IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii) = Qnil;
   IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (ii) = Qnil;
   IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii) = Qnil;
@@ -547,15 +552,15 @@ widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   Lisp_Object props = find_keyword_in_vector (instantiator, Q_properties);
   Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
   Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation);
+  Lisp_Object mwidth = find_keyword_in_vector (instantiator, Q_margin_width);
   int pw=0, ph=0, tw=0, th=0;
   
   /* this just does pixel type sizing */
   subwindow_instantiate (image_instance, instantiator, pointer_fg, pointer_bg,
                         dest_mask, domain);
-
-  if (!(dest_mask & (IMAGE_WIDGET_MASK | IMAGE_LAYOUT_MASK)))
-    incompatible_image_types (instantiator, dest_mask, 
-                             IMAGE_WIDGET_MASK | IMAGE_LAYOUT_MASK);
+  
+  if (!(dest_mask & IMAGE_WIDGET_MASK))
+    incompatible_image_types (instantiator, dest_mask, IMAGE_WIDGET_MASK);
 
   initialize_widget_image_instance (ii, XVECTOR_DATA (instantiator)[0]);
 
@@ -566,57 +571,10 @@ widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   if (!NILP (face))
     SET_IMAGE_INSTANCE_WIDGET_FACE (ii, Fget_face (face));
   
-  /* Do layout specific initialisation. This feels a bit tacky, but
-     the alternative is a myriad of different little functions. */
-  if (EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout))
-    {
-      Lisp_Object rest, children = Qnil;
-      Lisp_Object border = find_keyword_in_vector (instantiator, Q_border);
-
-      if (NILP (orient))
-       {
-         IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL;
-       }
-      IMAGE_INSTANCE_TYPE (ii) = IMAGE_LAYOUT;
-      
-      if (EQ (border, Qt))
-       {
-         IMAGE_INSTANCE_LAYOUT_BORDER (ii) = Qetched_in;
-       }
-      else if (GLYPHP (border))
-       {
-         /* We are going to be sneaky here and add the border text as
-            just another child, the layout and output routines don't know
-            this and will just display at the offsets we prescribe. */
-         Lisp_Object gii = glyph_image_instance (border, domain, ERROR_ME, 1);
-         /* make sure we are designated as the parent. */
-         XIMAGE_INSTANCE_PARENT (gii) = image_instance;
-         children = Fcons (gii, children);
-         IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (0);
-       }
-      else
-       {
-         IMAGE_INSTANCE_LAYOUT_BORDER (ii) = border;
-       }
-
-      /* Pick up the sub-widgets. */
-      LIST_LOOP (rest, items)
-       {
-         /* make sure the image is instantiated */
-         Lisp_Object gii = glyph_image_instance (XCAR (rest), domain, ERROR_ME, 1);
-         /* make sure we are designated as the parent. */
-         XIMAGE_INSTANCE_PARENT (gii) = image_instance;
-         children = Fcons (gii, children);
-       }
-      /* Make sure elements in the layout are in the order the
-        user expected. */
-      children = Fnreverse (children);
-      IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = children;
-    }
   /* retrieve the gui item information. This is easy if we have been
      provided with a vector, more difficult if we have just been given
      keywords */
-  else if (STRINGP (desc) || NILP (desc))
+  if (STRINGP (desc) || NILP (desc))
     {
       /* big cheat - we rely on the fact that a gui item looks like an instantiator */
       IMAGE_INSTANCE_WIDGET_ITEMS (ii) = 
@@ -626,14 +584,16 @@ widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   else
     IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
       gui_parse_item_keywords_no_errors (desc);
-
+      
   /* Pick up the orientation before we do our first layout. */
   if (EQ (orient, Qleft) || EQ (orient, Qright) || EQ (orient, Qvertical))
     IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL;
 
   /* parse more gui items out of the properties */
   if (!NILP (props)
-      && !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout))
+      && 
+      !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qlayout)
+      && !EQ (IMAGE_INSTANCE_WIDGET_TYPE (ii), Qnative_layout))
     {
       if (NILP (items))
        {
@@ -709,15 +669,23 @@ widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
       IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
     }
 
-  /* When we create the widgets the window system expects a valid
-     size, so If we still don' t have sizes, call layout to pick them
-     up. If query_geometry or layout relies on the widget being in
-     existence then we are in catch 22. */
-  image_instance_layout (image_instance, 
-                        pw ? pw : IMAGE_UNSPECIFIED_GEOMETRY,
-                        ph ? ph : IMAGE_UNSPECIFIED_GEOMETRY,
-                        domain);
+  /* Pick up the margin width. */
+  if (!NILP (mwidth))
+    IMAGE_INSTANCE_MARGIN_WIDTH (ii) = XINT (mwidth);
+
+  /* Layout for the layout widget is premature at this point since the
+     children will not have been instantiated. We can't instantiate
+     them until the device instantiation method for the layout has
+     been executed. We do however want to record any specified
+     dimensions. */
+  if (pw)      IMAGE_INSTANCE_WIDTH (ii) = pw;
+  if (ph)      IMAGE_INSTANCE_HEIGHT (ii) = ph;
+}
 
+static void
+widget_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+                        Lisp_Object domain)
+{
 #ifdef DEBUG_WIDGETS
   debug_widget_instances++;
   stderr_out ("instantiated ");
@@ -878,12 +846,6 @@ progress_gauge_set_property (Lisp_Object image_instance,
 /*****************************************************************************
  *                              widget layout                               *
  *****************************************************************************/
-static int
-layout_possible_dest_types (void)
-{
-  return IMAGE_LAYOUT_MASK;
-}
-
 /* we need to convert things like glyphs to images, eval expressions
    etc.*/
 static Lisp_Object
@@ -911,6 +873,79 @@ layout_normalize (Lisp_Object inst, Lisp_Object console_type)
   return inst;
 }
 
+static void
+layout_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+                   Lisp_Object pointer_fg, Lisp_Object pointer_bg,
+                   int dest_mask, Lisp_Object domain)
+{
+  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation);
+  Lisp_Object border = find_keyword_in_vector (instantiator, Q_border);
+
+  /* Do widget type instantiation first. */
+  widget_instantiate (image_instance, instantiator, pointer_fg, pointer_bg,
+                     dest_mask, domain);
+
+  if (NILP (orient))
+    {
+      IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) = LAYOUT_VERTICAL;
+    }
+      
+  if (EQ (border, Qt))
+    {
+      IMAGE_INSTANCE_LAYOUT_BORDER (ii) = Qetched_in;
+    }
+  else
+    {
+      IMAGE_INSTANCE_LAYOUT_BORDER (ii) = border;
+    }
+  /* We don't do the children yet as we might not have a containing
+     window. */
+}
+
+static void
+layout_post_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+                        Lisp_Object domain)
+{
+  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+  Lisp_Object items = find_keyword_in_vector (instantiator, Q_items);
+  Lisp_Object rest, children = Qnil;
+
+  if (GLYPHP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
+    {
+      /* We are going to be sneaky here and add the border text as
+        just another child, the layout and output routines don't know
+        this and will just display at the offsets we prescribe. */
+      Lisp_Object gii = glyph_image_instance 
+       (IMAGE_INSTANCE_LAYOUT_BORDER (ii),
+        image_instance, ERROR_ME, 1);
+
+      if (!IMAGE_INSTANCEP (gii))
+       return;
+      /* make sure we are designated as the parent. */
+      XIMAGE_INSTANCE_PARENT (gii) = image_instance;
+      children = Fcons (gii, children);
+      IMAGE_INSTANCE_LAYOUT_BORDER (ii) = make_int (0);
+    }
+
+  /* Pick up the sub-widgets. */
+  LIST_LOOP (rest, items)
+    {
+      /* make sure the image is instantiated */
+      Lisp_Object gii = glyph_image_instance (XCAR (rest), 
+                                             image_instance, ERROR_ME, 1);
+      if (!IMAGE_INSTANCEP (gii))
+       return;
+      /* make sure we are designated as the parent. */
+      XIMAGE_INSTANCE_PARENT (gii) = image_instance;
+      children = Fcons (gii, children);
+    }
+  /* Make sure elements in the layout are in the order the
+     user expected. */
+  children = Fnreverse (children);
+  IMAGE_INSTANCE_LAYOUT_CHILDREN (ii) = children;
+}
+
 /* Layout widget. Sizing commentary: we have a number of problems that
    we would like to address. Some consider some of these more
    important than others. It used to be that size information was
@@ -969,6 +1004,10 @@ layout_query_geometry (Lisp_Object image_instance, unsigned int* width,
   int maxph = 0, maxpw = 0, nitems = 0, ph_adjust = 0;
   unsigned int gheight, gwidth;
 
+  /* If we are not initialized then we won't have any children. */
+  if (!IMAGE_INSTANCE_INITIALIZED (ii))
+      return;
+
   /* First just set up what we already have. */
   if (width)   *width = IMAGE_INSTANCE_WIDTH (ii);
   if (height)  *height = IMAGE_INSTANCE_HEIGHT (ii);
@@ -1018,9 +1057,11 @@ layout_query_geometry (Lisp_Object image_instance, unsigned int* width,
     }
   else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
           == LAYOUT_HORIZONTAL)
-    *width = maxpw + (nitems + 1) * WIDGET_BORDER_WIDTH * 2;
+    *width = maxpw + ((nitems + 1) * WIDGET_BORDER_WIDTH +
+                     IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2;
   else 
-    *width = maxpw + 2 * WIDGET_BORDER_WIDTH * 2;
+    *width = maxpw + 2 * (WIDGET_BORDER_WIDTH * 2 + 
+                         IMAGE_INSTANCE_MARGIN_WIDTH (ii));
 
   /* Work out vertical spacings. */
   if (!NILP (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (ii)))
@@ -1032,12 +1073,14 @@ layout_query_geometry (Lisp_Object image_instance, unsigned int* width,
     }
   else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii)
           == LAYOUT_VERTICAL)
-    *height = maxph + (nitems + 1) * WIDGET_BORDER_HEIGHT * 2 + ph_adjust;
+    *height = maxph + ((nitems + 1) * WIDGET_BORDER_HEIGHT +
+                      IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
   else
-    *height = maxph + 2 * WIDGET_BORDER_HEIGHT * 2 + ph_adjust;
+    *height = maxph + (2 * WIDGET_BORDER_HEIGHT +
+                      IMAGE_INSTANCE_MARGIN_WIDTH (ii)) * 2 + ph_adjust;
 }
 
-static void
+int
 layout_layout (Lisp_Object image_instance, 
               unsigned int width, unsigned int height, Lisp_Object domain)
 {
@@ -1047,7 +1090,11 @@ layout_layout (Lisp_Object image_instance,
   int x, y, maxph = 0, maxpw = 0, nitems = 0,
     horiz_spacing, vert_spacing, ph_adjust = 0;
   unsigned int gheight, gwidth;
-  
+
+  /* If we are not initialized then we won't have any children. */
+  if (!IMAGE_INSTANCE_INITIALIZED (ii))
+      return 0;
+
   /* Pick up the border text if we have one. */
   if (INTP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)))
     {
@@ -1095,20 +1142,26 @@ layout_layout (Lisp_Object image_instance,
           == LAYOUT_HORIZONTAL)
     /* We have a larger area to display in so distribute the space
        evenly. */
-    horiz_spacing = (width - maxpw) / (nitems + 1);
+    horiz_spacing = (width - (maxpw + 
+                             IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2)) 
+      / (nitems + 1);
   else
-    horiz_spacing = (width - maxpw) / 2;
+    horiz_spacing = (width - maxpw) / 2
+      - IMAGE_INSTANCE_MARGIN_WIDTH (ii);
 
   if (height < maxph)
     vert_spacing = WIDGET_BORDER_HEIGHT * 2;
   else if (IMAGE_INSTANCE_SUBWINDOW_ORIENT (ii) 
           == LAYOUT_VERTICAL)
-    vert_spacing = (height - (maxph + ph_adjust)) / (nitems + 1);
+    vert_spacing = (height - (maxph + ph_adjust + 
+                             IMAGE_INSTANCE_MARGIN_WIDTH (ii) * 2)) 
+      / (nitems + 1);
   else
-    vert_spacing = (height - (maxph + ph_adjust)) / 2;
+    vert_spacing = (height - (maxph + ph_adjust)) / 2 
+      - IMAGE_INSTANCE_MARGIN_WIDTH (ii);
 
-  y = vert_spacing + ph_adjust;
-  x = horiz_spacing;
+  y = vert_spacing + ph_adjust + IMAGE_INSTANCE_MARGIN_WIDTH (ii);
+  x = horiz_spacing + IMAGE_INSTANCE_MARGIN_WIDTH (ii);
 
   /* Now flip through putting items where we want them, paying
      attention to justification. Make sure we don't mess with the
@@ -1156,6 +1209,41 @@ layout_layout (Lisp_Object image_instance,
       /* Now layout subwidgets if they require it. */
       image_instance_layout (glyph, gwidth, gheight, domain);
     }
+  return 1;
+}
+
+/* Layout subwindows if they are real subwindows. */
+static int
+native_layout_layout (Lisp_Object image_instance,
+                     unsigned int width, unsigned int height,
+                     Lisp_Object domain)
+{
+  Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
+  Lisp_Object rest;
+  
+  /* The first time this gets called, the layout will be only
+     partially instantiated. The children get done in
+     post_instantiate. */
+  if (!IMAGE_INSTANCE_INITIALIZED (ii))
+    return 0;
+
+  /* Defining this overrides the default layout_layout so we first have to call that to get 
+     suitable instances and values set up. */
+  layout_layout (image_instance, width, height, domain);
+
+  LIST_LOOP (rest, IMAGE_INSTANCE_LAYOUT_CHILDREN (ii))
+    {
+      struct display_glyph_area dga;
+      dga.xoffset = 0;
+      dga.yoffset = 0;
+      dga.width = IMAGE_INSTANCE_WIDTH (ii);
+      dga.height = IMAGE_INSTANCE_HEIGHT (ii);
+
+      map_subwindow (XCAR (rest), 
+                    IMAGE_INSTANCE_XOFFSET (ii),
+                    IMAGE_INSTANCE_YOFFSET (ii), &dga);
+    }
+  return 1;
 }
 
 \f
@@ -1176,12 +1264,12 @@ syms_of_glyphs_widget (void)
   defkeyword (&Q_orientation, ":orientation");
   defkeyword (&Q_justify, ":justify");
   defkeyword (&Q_border, ":border");
+  defkeyword (&Q_margin_width, ":margin-width");
 
   defsymbol (&Qetched_in, "etched-in");
   defsymbol (&Qetched_out, "etched-out");
   defsymbol (&Qbevel_in, "bevel-in");
   defsymbol (&Qbevel_out, "bevel-out");
-  defsymbol (&Qwidget_callback_current_channel, "widget-callback-current-channel");
 }
 
 #define VALID_GUI_KEYWORDS(type) do {                                                  \
@@ -1225,7 +1313,9 @@ static void image_instantiator_buttons (void)
   IIFORMAT_HAS_SHARED_METHOD (button, validate, widget);
   IIFORMAT_HAS_SHARED_METHOD (button, possible_dest_types, widget);
   IIFORMAT_HAS_SHARED_METHOD (button, instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (button, post_instantiate, widget);
   IIFORMAT_HAS_SHARED_METHOD (button, normalize, widget);
+  IIFORMAT_HAS_SHARED_METHOD (button, governing_domain, subwindow);
   IIFORMAT_HAS_METHOD (button, query_geometry);
   IIFORMAT_VALID_KEYWORD (button,
                          Q_image, check_valid_glyph_or_instantiator);
@@ -1239,6 +1329,8 @@ static void image_instantiator_edit_fields (void)
   IIFORMAT_HAS_SHARED_METHOD (edit_field, validate, widget);
   IIFORMAT_HAS_SHARED_METHOD (edit_field, possible_dest_types, widget);
   IIFORMAT_HAS_SHARED_METHOD (edit_field, instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (edit_field, post_instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (edit_field, governing_domain, subwindow);
   VALID_WIDGET_KEYWORDS (edit_field);
   VALID_GUI_KEYWORDS (edit_field);
 }
@@ -1248,6 +1340,8 @@ static void image_instantiator_combo_box (void)
   INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (combo_box, "combo-box");
   IIFORMAT_HAS_METHOD (combo_box, validate);
   IIFORMAT_HAS_SHARED_METHOD (combo_box, possible_dest_types, widget);
+  IIFORMAT_HAS_SHARED_METHOD (combo_box, governing_domain, subwindow);
+
   VALID_GUI_KEYWORDS (combo_box);
 
   IIFORMAT_VALID_KEYWORD (combo_box, Q_width, check_valid_int);
@@ -1263,6 +1357,8 @@ static void image_instantiator_scrollbar (void)
   IIFORMAT_HAS_SHARED_METHOD (scrollbar, validate, widget);
   IIFORMAT_HAS_SHARED_METHOD (scrollbar, possible_dest_types, widget);
   IIFORMAT_HAS_SHARED_METHOD (scrollbar, instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (scrollbar, post_instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (scrollbar, governing_domain, subwindow);
   VALID_GUI_KEYWORDS (scrollbar);
 
   IIFORMAT_VALID_KEYWORD (scrollbar, Q_pixel_width, check_valid_int_or_function);
@@ -1276,6 +1372,8 @@ static void image_instantiator_progress_guage (void)
   IIFORMAT_HAS_SHARED_METHOD (progress_gauge, validate, widget);
   IIFORMAT_HAS_SHARED_METHOD (progress_gauge, possible_dest_types, widget);
   IIFORMAT_HAS_SHARED_METHOD (progress_gauge, instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (progress_gauge, post_instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (progress_gauge, governing_domain, subwindow);
   IIFORMAT_HAS_METHOD (progress_gauge, set_property);
   VALID_WIDGET_KEYWORDS (progress_gauge);
   VALID_GUI_KEYWORDS (progress_gauge);
@@ -1287,6 +1385,8 @@ static void image_instantiator_tree_view (void)
   IIFORMAT_HAS_SHARED_METHOD (tree_view, validate, combo_box);
   IIFORMAT_HAS_SHARED_METHOD (tree_view, possible_dest_types, widget);
   IIFORMAT_HAS_SHARED_METHOD (tree_view, instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (tree_view, post_instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (tree_view, governing_domain, subwindow);
   IIFORMAT_HAS_METHOD (tree_view, query_geometry);
   VALID_WIDGET_KEYWORDS (tree_view);
   VALID_GUI_KEYWORDS (tree_view);
@@ -1299,6 +1399,8 @@ static void image_instantiator_tab_control (void)
   IIFORMAT_HAS_SHARED_METHOD (tab_control, validate, combo_box);
   IIFORMAT_HAS_SHARED_METHOD (tab_control, possible_dest_types, widget);
   IIFORMAT_HAS_SHARED_METHOD (tab_control, instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (tab_control, post_instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (tab_control, governing_domain, subwindow);
   IIFORMAT_HAS_METHOD (tab_control, query_geometry);
   IIFORMAT_HAS_METHOD (tab_control, set_property);
   VALID_WIDGET_KEYWORDS (tab_control);
@@ -1312,24 +1414,50 @@ static void image_instantiator_labels (void)
   INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (label, "label");
   IIFORMAT_HAS_SHARED_METHOD (label, possible_dest_types, widget);
   IIFORMAT_HAS_SHARED_METHOD (label, instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (label, post_instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (label, governing_domain, subwindow);
   VALID_WIDGET_KEYWORDS (label);
   IIFORMAT_VALID_KEYWORD (label, Q_descriptor, check_valid_string);
 }
 
+#define VALID_LAYOUT_KEYWORDS(layout) \
+  VALID_WIDGET_KEYWORDS (layout);                                              \
+  IIFORMAT_VALID_KEYWORD (layout, Q_orientation, check_valid_orientation);     \
+  IIFORMAT_VALID_KEYWORD (layout, Q_justify, check_valid_justification);       \
+  IIFORMAT_VALID_KEYWORD (layout, Q_border, check_valid_border);               \
+  IIFORMAT_VALID_KEYWORD (layout, Q_margin_width, check_valid_int);    \
+  IIFORMAT_VALID_KEYWORD (layout, Q_items,                             \
+                         check_valid_glyph_or_instantiator_list)
+
 static void image_instantiator_layout (void)
 {
   INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (layout, "layout");
-  IIFORMAT_HAS_METHOD (layout, possible_dest_types);
-  IIFORMAT_HAS_SHARED_METHOD (layout, instantiate, widget);
+  IIFORMAT_HAS_SHARED_METHOD (layout, possible_dest_types, widget);
+  IIFORMAT_HAS_METHOD (layout, instantiate);
+  IIFORMAT_HAS_METHOD (layout, post_instantiate);
+  IIFORMAT_HAS_SHARED_METHOD (layout, governing_domain, subwindow);
   IIFORMAT_HAS_METHOD (layout, normalize);
   IIFORMAT_HAS_METHOD (layout, query_geometry);
   IIFORMAT_HAS_METHOD (layout, layout);
-  VALID_WIDGET_KEYWORDS (layout);
-  IIFORMAT_VALID_KEYWORD (layout, Q_orientation, check_valid_orientation);
-  IIFORMAT_VALID_KEYWORD (layout, Q_justify, check_valid_justification);
-  IIFORMAT_VALID_KEYWORD (layout, Q_border, check_valid_border);
-  IIFORMAT_VALID_KEYWORD (layout, Q_items,
-                         check_valid_glyph_or_instantiator_list);
+
+  VALID_GUI_KEYWORDS (layout);
+  VALID_LAYOUT_KEYWORDS (layout);
+}
+
+static void image_instantiator_native_layout (void)
+{
+  INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (native_layout, "native-layout");
+  IIFORMAT_HAS_SHARED_METHOD (native_layout, possible_dest_types, widget);
+  IIFORMAT_HAS_SHARED_METHOD (native_layout, instantiate, layout);
+  IIFORMAT_HAS_SHARED_METHOD (native_layout, post_instantiate, layout);
+  IIFORMAT_HAS_METHOD (native_layout, layout);
+  IIFORMAT_HAS_SHARED_METHOD (native_layout, governing_domain, subwindow);
+  IIFORMAT_HAS_SHARED_METHOD (native_layout, normalize, layout);
+  IIFORMAT_HAS_SHARED_METHOD (native_layout, query_geometry, layout);
+  IIFORMAT_HAS_SHARED_METHOD (native_layout, layout, layout);
+
+  VALID_GUI_KEYWORDS (native_layout);
+  VALID_LAYOUT_KEYWORDS (native_layout);
 }
 
 void
@@ -1345,6 +1473,7 @@ image_instantiator_format_create_glyphs_widget (void)
   image_instantiator_tab_control();
   image_instantiator_labels();
   image_instantiator_layout();
+  image_instantiator_native_layout();
 }
 
 void
@@ -1359,10 +1488,4 @@ void
 vars_of_glyphs_widget (void)
 {
   reinit_vars_of_glyphs_widget ();
-
-  DEFVAR_LISP ("widget-callback-current-channel", &Vwidget_callback_current_channel /*
-The domain that is current when a widget callback is invoked.
-This is invariably the frame that the widget is instantiated in.
-*/);
-  Vwidget_callback_current_channel = Qnil;
 }
index 4ed6e97..2b6d350 100644 (file)
@@ -98,7 +98,6 @@ DECLARE_IMAGE_INSTANTIATOR_FORMAT (nothing);
 DECLARE_IMAGE_INSTANTIATOR_FORMAT (string);
 DECLARE_IMAGE_INSTANTIATOR_FORMAT (formatted_string);
 DECLARE_IMAGE_INSTANTIATOR_FORMAT (inherit);
-DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
 #ifdef HAVE_JPEG
 DECLARE_IMAGE_INSTANTIATOR_FORMAT (jpeg);
 #endif
@@ -128,7 +127,9 @@ DEFINE_IMAGE_INSTANTIATOR_FORMAT (font);
 DEFINE_IMAGE_INSTANTIATOR_FORMAT (autodetect);
 
 #ifdef HAVE_WIDGETS
+DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
 DEFINE_DEVICE_IIFORMAT (x, widget);
+DEFINE_DEVICE_IIFORMAT (x, native_layout);
 DEFINE_DEVICE_IIFORMAT (x, button);
 DEFINE_DEVICE_IIFORMAT (x, progress_gauge);
 DEFINE_DEVICE_IIFORMAT (x, edit_field);
@@ -394,11 +395,14 @@ x_finalize_image_instance (Lisp_Image_Instance *p)
   if (!p->data)
     return;
 
-  if (DEVICE_LIVE_P (XDEVICE (p->device)))
+  if (DEVICE_LIVE_P (XDEVICE (IMAGE_INSTANCE_DEVICE (p))))
     {
-      Display *dpy = DEVICE_X_DISPLAY (XDEVICE (p->device));
-
-      if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET)
+      Display *dpy = DEVICE_X_DISPLAY 
+       (XDEVICE (IMAGE_INSTANCE_DEVICE (p)));
+      if (0)
+       ;
+#ifdef HAVE_WIDGETS
+      else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET)
        {
          if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
            {
@@ -408,10 +412,15 @@ x_finalize_image_instance (Lisp_Image_Instance *p)
 #endif
              lw_destroy_widget (IMAGE_INSTANCE_X_WIDGET_ID (p));
              lw_destroy_widget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
+
+             /* We can release the callbacks again. */
+             ungcpro_popup_callbacks (IMAGE_INSTANCE_X_WIDGET_LWID (p));
+
              IMAGE_INSTANCE_X_WIDGET_ID (p) = 0;
              IMAGE_INSTANCE_X_CLIPWIDGET (p) = 0;
            }
        }
+#endif
       else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
        {
          if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
@@ -2210,11 +2219,11 @@ x_update_widget (Lisp_Image_Instance *p)
   /* Possibly update the colors and font */
   if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p)
       ||
-      XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (p))->faces_changed
+      XFRAME (IMAGE_INSTANCE_FRAME (p))->faces_changed
       ||
       IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p))
     {
-      update_widget_face (wv, p, IMAGE_INSTANCE_SUBWINDOW_FRAME (p));
+      update_widget_face (wv, p, IMAGE_INSTANCE_FRAME (p));
     }
 
   /* Possibly update the text. */
@@ -2267,15 +2276,15 @@ x_subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   /* This function can GC */
   Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
-  Lisp_Object frame = FW_FRAME (domain);
+  Lisp_Object frame = DOMAIN_FRAME (domain);
   struct frame* f = XFRAME (frame);
   Display *dpy;
   Screen *xs;
   Window pw, win;
   XSetWindowAttributes xswa;
   Mask valueMask = 0;
-  unsigned int w = IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii),
-    h = IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii);
+  unsigned int w = IMAGE_INSTANCE_WIDTH (ii),
+    h = IMAGE_INSTANCE_HEIGHT (ii);
 
   if (!DEVICE_X_P (XDEVICE (device)))
     signal_simple_error ("Not an X device", device);
@@ -2420,7 +2429,7 @@ x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), pixel;
   struct device* d = XDEVICE (device);
-  Lisp_Object frame = FW_FRAME (domain);
+  Lisp_Object frame = DOMAIN_FRAME (domain);
   struct frame* f = XFRAME (frame);
   char* nm=0;
   Widget wid;
@@ -2478,12 +2487,12 @@ x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
      anymore...*/
   pixel = FACE_FOREGROUND
     (IMAGE_INSTANCE_WIDGET_FACE (ii),
-     IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
+     IMAGE_INSTANCE_FRAME (ii));
   fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
 
   pixel = FACE_BACKGROUND
     (IMAGE_INSTANCE_WIDGET_FACE (ii),
-     IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
+     IMAGE_INSTANCE_FRAME (ii));
   bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
 
   lw_add_widget_value_arg (wv, XtNbackground, bcolor.pixel);
@@ -2513,6 +2522,9 @@ x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   XtSetMappedWhenManaged (wid, TRUE);
 
   free_widget_value_tree (wv);
+  /* A kludgy but simple way to make sure the callback for a widget
+     doesn't get deleted. */
+  gcpro_popup_callbacks (id);
 }
 
 /* get properties of a control */
@@ -2529,6 +2541,18 @@ x_widget_property (Lisp_Object image_instance, Lisp_Object prop)
   return Qunbound;
 }
 
+/* Instantiate a layout control for putting other widgets in. */
+static void
+x_native_layout_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
+                            Lisp_Object pointer_fg, Lisp_Object pointer_bg,
+                            int dest_mask, Lisp_Object domain)
+{
+  Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
+
+  x_widget_instantiate (image_instance, instantiator, pointer_fg,
+                       pointer_bg, dest_mask, domain, "layout", 0);
+}
+
 /* Instantiate a button widget. Unfortunately instantiated widgets are
    particular to a frame since they need to have a parent. It's not
    like images where you just select the image into the context you
@@ -2692,7 +2716,7 @@ x_tab_control_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
                                IMAGE_INSTANCE_WIDGET_ITEMS (ii));
 
   update_tab_widget_face (wv, ii,
-                         IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
+                         IMAGE_INSTANCE_FRAME (ii));
 
   x_widget_instantiate (image_instance, instantiator, pointer_fg,
                        pointer_bg, dest_mask, domain, "tab-control", wv);
@@ -2707,7 +2731,7 @@ x_tab_control_update (Lisp_Object image_instance)
   /* Possibly update the face. */
   if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (ii)
       ||
-      XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii))->faces_changed
+      XFRAME (IMAGE_INSTANCE_FRAME (ii))->faces_changed
       ||
       IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
     {
@@ -2718,7 +2742,7 @@ x_tab_control_update (Lisp_Object image_instance)
        return;
 
       update_tab_widget_face (wv, ii,
-                             IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
+                             IMAGE_INSTANCE_FRAME (ii));
 
       lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, True);
     }
@@ -2775,7 +2799,9 @@ image_instantiator_format_create_glyphs_x (void)
 {
   IIFORMAT_VALID_CONSOLE (x, nothing);
   IIFORMAT_VALID_CONSOLE (x, string);
+#ifdef HAVE_WIDGETS
   IIFORMAT_VALID_CONSOLE (x, layout);
+#endif
   IIFORMAT_VALID_CONSOLE (x, formatted_string);
   IIFORMAT_VALID_CONSOLE (x, inherit);
 #ifdef HAVE_XPM
@@ -2800,12 +2826,15 @@ image_instantiator_format_create_glyphs_x (void)
   INITIALIZE_DEVICE_IIFORMAT (x, subwindow);
   IIFORMAT_HAS_DEVMETHOD (x, subwindow, instantiate);
 #ifdef HAVE_WIDGETS
+  /* layout widget */
+  INITIALIZE_DEVICE_IIFORMAT (x, native_layout);
+  IIFORMAT_HAS_DEVMETHOD (x, native_layout, instantiate);
   /* button widget */
   INITIALIZE_DEVICE_IIFORMAT (x, button);
   IIFORMAT_HAS_DEVMETHOD (x, button, property);
   IIFORMAT_HAS_DEVMETHOD (x, button, instantiate);
   IIFORMAT_HAS_DEVMETHOD (x, button, update);
-
+  /* general widget methods. */
   INITIALIZE_DEVICE_IIFORMAT (x, widget);
   IIFORMAT_HAS_DEVMETHOD (x, widget, property);
   /* progress gauge */
index 3ef30f3..791926b 100644 (file)
@@ -122,6 +122,11 @@ struct x_subwindow_data
   (X_SUBWINDOW_INSTANCE_DATA (i)->data.wid.id)
 #define IMAGE_INSTANCE_X_CLIPWIDGET(i) \
   (X_SUBWINDOW_INSTANCE_DATA (i)->data.wid.clip_window)
+#define IMAGE_INSTANCE_X_SUBWINDOW_ID(i) \
+  (* (Window *) & IMAGE_INSTANCE_SUBWINDOW_ID (i))
+#define IMAGE_INSTANCE_X_WIDGET_ID(i) \
+  (* (Widget *) & IMAGE_INSTANCE_SUBWINDOW_ID (i))
+
 #define XIMAGE_INSTANCE_X_SUBWINDOW_PARENT(i) \
   IMAGE_INSTANCE_X_SUBWINDOW_PARENT (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_X_SUBWINDOW_DISPLAY(i) \
@@ -136,10 +141,14 @@ struct x_subwindow_data
   IMAGE_INSTANCE_X_CLIPWIDGET (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_X_CLIPWINDOW(i) \
   IMAGE_INSTANCE_X_CLIPWINDOW (XIMAGE_INSTANCE (i))
-#define IMAGE_INSTANCE_X_SUBWINDOW_ID(i) \
-  (* (Window *) & IMAGE_INSTANCE_SUBWINDOW_ID (i))
-#define IMAGE_INSTANCE_X_WIDGET_ID(i) \
-  (* (Widget *) & IMAGE_INSTANCE_SUBWINDOW_ID (i))
+#define XIMAGE_INSTANCE_X_WIDGET_ID(i) \
+  IMAGE_INSTANCE_X_WIDGET_ID (XIMAGE_INSTANCE (i))
+
+#define DOMAIN_X_WIDGET(domain) \
+  ((IMAGE_INSTANCEP (domain) && \
+  X_SUBWINDOW_INSTANCE_DATA (XIMAGE_INSTANCE (domain))) ? \
+   XIMAGE_INSTANCE_X_WIDGET_ID (domain) : \
+   FRAME_X_CONTAINER_WIDGET (f) (DOMAIN_XFRAME (domain)))
 
 #endif /* HAVE_X_WINDOWS */
 #endif /* INCLUDED_glyphs_x_h_ */
index 66b05c5..c30eb56 100644 (file)
@@ -1,7 +1,7 @@
 /* Generic glyph/image implementation + display tables
    Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
    Copyright (C) 1995 Tinker Systems
-   Copyright (C) 1995, 1996 Ben Wing
+   Copyright (C) 1995, 1996, 2000 Ben Wing
    Copyright (C) 1995 Sun Microsystems
    Copyright (C) 1998, 1999, 2000 Andy Piper
 
@@ -30,20 +30,21 @@ Boston, MA 02111-1307, USA.  */
 #include <config.h>
 #include "lisp.h"
 
+#include "blocktype.h"
 #include "buffer.h"
+#include "chartab.h"
 #include "device.h"
 #include "elhash.h"
 #include "faces.h"
 #include "frame.h"
+#include "glyphs.h"
 #include "insdel.h"
-#include "opaque.h"
 #include "objects.h"
+#include "opaque.h"
+#include "rangetab.h"
 #include "redisplay.h"
+#include "specifier.h"
 #include "window.h"
-#include "frame.h"
-#include "chartab.h"
-#include "rangetab.h"
-#include "blocktype.h"
 
 #ifdef HAVE_XPM
 #include <X11/xpm.h>
@@ -58,8 +59,6 @@ Lisp_Object Qmono_pixmap_image_instance_p;
 Lisp_Object Qcolor_pixmap_image_instance_p;
 Lisp_Object Qpointer_image_instance_p;
 Lisp_Object Qsubwindow_image_instance_p;
-Lisp_Object Qlayout_image_instance_p;
-Lisp_Object Qupdate_widget_instances;
 Lisp_Object Qwidget_image_instance_p;
 Lisp_Object Qconst_glyph_variable;
 Lisp_Object Qmono_pixmap, Qcolor_pixmap, Qsubwindow;
@@ -82,6 +81,7 @@ DEFINE_IMAGE_INSTANTIATOR_FORMAT (string);
 DEFINE_IMAGE_INSTANTIATOR_FORMAT (formatted_string);
 DEFINE_IMAGE_INSTANTIATOR_FORMAT (subwindow);
 DEFINE_IMAGE_INSTANTIATOR_FORMAT (text);
+DEFINE_IMAGE_INSTANTIATOR_FORMAT (pointer);
 
 #ifdef HAVE_WINDOW_SYSTEM
 DEFINE_IMAGE_INSTANTIATOR_FORMAT (xbm);
@@ -121,16 +121,19 @@ typedef struct
   Dynarr_declare (struct image_instantiator_format_entry);
 } image_instantiator_format_entry_dynarr;
 
+/* This contains one entry per format, per device it's defined on. */
 image_instantiator_format_entry_dynarr *
   the_image_instantiator_format_entry_dynarr;
 
-static Lisp_Object allocate_image_instance (Lisp_Object device, Lisp_Object glyph);
+static Lisp_Object allocate_image_instance (Lisp_Object governing_domain, 
+                                           Lisp_Object glyph);
 static void image_validate (Lisp_Object instantiator);
 static void glyph_property_was_changed (Lisp_Object glyph,
                                        Lisp_Object property,
                                        Lisp_Object locale);
 static void set_image_instance_dirty_p (Lisp_Object instance, int dirty);
 static void register_ignored_expose (struct frame* f, int x, int y, int width, int height);
+static void cache_subwindow_instance_in_frame_maybe (Lisp_Object instance);
 /* Unfortunately windows and X are different. In windows BeginPaint()
    will prevent WM_PAINT messages being generated so it is unnecessary
    to register exposures as they will not occur. Under X they will
@@ -222,13 +225,18 @@ DEFUN ("valid-image-instantiator-format-p", Fvalid_image_instantiator_format_p,
 Given an IMAGE-INSTANTIATOR-FORMAT, return non-nil if it is valid.
 If LOCALE is non-nil then the format is checked in that domain.
 If LOCALE is nil the current console is used.
+
 Valid formats are some subset of 'nothing, 'string, 'formatted-string,
 'xpm, 'xbm, 'xface, 'gif, 'jpeg, 'png, 'tiff, 'cursor-font, 'font,
-'autodetect, 'widget and 'subwindow, depending on how XEmacs was compiled.
+'autodetect, 'subwindow, 'inherit, 'mswindows-resource, 'bmp,
+'native-layout, 'layout, 'label, 'tab-control, 'tree-view,
+'progress-gauge, 'scrollbar, 'combo-box, 'edit-field, 'button,
+'widget, 'pointer, and 'text, depending on how XEmacs was compiled.
 */
        (image_instantiator_format, locale))
 {
-  return valid_image_instantiator_format_p (image_instantiator_format, locale) ?
+  return valid_image_instantiator_format_p (image_instantiator_format,
+                                           locale) ?
     Qt : Qnil;
 }
 
@@ -251,8 +259,9 @@ add_entry_to_device_ii_format_list (Lisp_Object device, Lisp_Object symbol,
   entry.device = device;
   entry.meths = meths;
   Dynarr_add (the_image_instantiator_format_entry_dynarr, entry);
-  Vimage_instantiator_format_list =
-    Fcons (symbol, Vimage_instantiator_format_list);
+  if (NILP (memq_no_quit (symbol, Vimage_instantiator_format_list)))
+    Vimage_instantiator_format_list =
+      Fcons (symbol, Vimage_instantiator_format_list);
 }
 
 void
@@ -542,6 +551,86 @@ alist_to_tagged_vector (Lisp_Object tag, Lisp_Object alist)
   return Fvector (len, elt);
 }
 
+#ifdef ERROR_CHECK_GLYPHS
+static int
+check_instance_cache_mapper (Lisp_Object key, Lisp_Object value,
+                            void *flag_closure)
+{
+  /* This function can GC */
+  /* value can be nil; we cache failures as well as successes */
+  if (!NILP (value))
+    {
+      Lisp_Object window;
+      VOID_TO_LISP (window, flag_closure);
+      assert (EQ (XIMAGE_INSTANCE_DOMAIN (value), window));
+    }
+
+  return 0;
+}
+
+void
+check_window_subwindow_cache (struct window* w)
+{
+  Lisp_Object window;
+  
+  XSETWINDOW (window, w);
+
+  assert (!NILP (w->subwindow_instance_cache));
+  elisp_maphash (check_instance_cache_mapper,
+                w->subwindow_instance_cache,
+                LISP_TO_VOID (window));
+}
+
+void
+check_image_instance_structure (Lisp_Object instance)
+{
+  /* Weird nothing images exist at startup when the console is
+     deleted. */
+  if (!NOTHING_IMAGE_INSTANCEP (instance))
+    assert (DOMAIN_LIVE_P (instance));
+  if (WINDOWP (XIMAGE_INSTANCE_DOMAIN (instance)))
+    check_window_subwindow_cache 
+      (XWINDOW (XIMAGE_INSTANCE_DOMAIN (instance)));
+}
+#endif
+
+/* Determine what kind of domain governs the image instance.
+   Verify that the given domain is at least as specific, and extract
+   the governing domain from it. */
+static Lisp_Object
+get_image_instantiator_governing_domain (Lisp_Object instantiator,
+                                        Lisp_Object domain)
+{
+  int governing_domain;
+
+  struct image_instantiator_methods *meths = 
+    decode_image_instantiator_format (XVECTOR_DATA (instantiator)[0],
+                                     ERROR_ME);
+  governing_domain = IIFORMAT_METH_OR_GIVEN (meths, governing_domain, (),
+                                            GOVERNING_DOMAIN_DEVICE);
+
+  if (governing_domain == GOVERNING_DOMAIN_WINDOW
+      && NILP (DOMAIN_WINDOW (domain)))
+    signal_simple_error_2 ("Domain for this instantiator must be resolvable to a window",
+                          instantiator, domain);
+  else if (governing_domain == GOVERNING_DOMAIN_FRAME
+          && NILP (DOMAIN_FRAME (domain)))
+    signal_simple_error_2
+      ("Domain for this instantiator must be resolvable to a frame",
+       instantiator, domain);
+
+  if (governing_domain == GOVERNING_DOMAIN_WINDOW)
+    domain = DOMAIN_WINDOW (domain);
+  else if (governing_domain == GOVERNING_DOMAIN_FRAME)
+    domain = DOMAIN_FRAME (domain);
+  else if (governing_domain == GOVERNING_DOMAIN_DEVICE)
+    domain = DOMAIN_DEVICE (domain);
+  else
+    abort ();
+
+  return domain;
+}
+
 static Lisp_Object
 normalize_image_instantiator (Lisp_Object instantiator,
                              Lisp_Object contype,
@@ -576,54 +665,73 @@ normalize_image_instantiator (Lisp_Object instantiator,
 }
 
 static Lisp_Object
-instantiate_image_instantiator (Lisp_Object device, Lisp_Object domain,
+instantiate_image_instantiator (Lisp_Object governing_domain,
+                               Lisp_Object domain,
                                Lisp_Object instantiator,
                                Lisp_Object pointer_fg, Lisp_Object pointer_bg,
                                int dest_mask, Lisp_Object glyph)
 {
-  Lisp_Object ii = allocate_image_instance (device, glyph);
+  Lisp_Object ii = allocate_image_instance (governing_domain, glyph);
   Lisp_Image_Instance* p = XIMAGE_INSTANCE (ii);
-  struct image_instantiator_methods *meths;
+  struct image_instantiator_methods *meths, *device_meths;
   struct gcpro gcpro1;
-  int  methp = 0;
 
   GCPRO1 (ii);
-  if (!valid_image_instantiator_format_p (XVECTOR_DATA (instantiator)[0], device))
+  if (!valid_image_instantiator_format_p (XVECTOR_DATA (instantiator)[0], 
+                                         DOMAIN_DEVICE (governing_domain)))
     signal_simple_error
       ("Image instantiator format is invalid in this locale.",
        instantiator);
 
   meths = decode_image_instantiator_format (XVECTOR_DATA (instantiator)[0],
                                            ERROR_ME);
-  methp = (int)HAS_IIFORMAT_METH_P (meths, instantiate);
   MAYBE_IIFORMAT_METH (meths, instantiate, (ii, instantiator, pointer_fg,
                                            pointer_bg, dest_mask, domain));
 
-  /* now do device specific instantiation */
-  meths = decode_device_ii_format (device, XVECTOR_DATA (instantiator)[0],
-                                  ERROR_ME_NOT);
+  /* Now do device specific instantiation. */
+  device_meths = decode_device_ii_format (DOMAIN_DEVICE (governing_domain), 
+                                         XVECTOR_DATA (instantiator)[0],
+                                         ERROR_ME_NOT);
 
-  if (!methp && (!meths || !HAS_IIFORMAT_METH_P (meths, instantiate)))
+  if (!HAS_IIFORMAT_METH_P (meths, instantiate)
+      && (!device_meths || !HAS_IIFORMAT_METH_P (device_meths, instantiate)))
     signal_simple_error
       ("Don't know how to instantiate this image instantiator?",
        instantiator);
-  MAYBE_IIFORMAT_METH (meths, instantiate, (ii, instantiator, pointer_fg,
-                                           pointer_bg, dest_mask, domain));
-  UNGCPRO;
 
-  /* Some code may have already laid out the widget, if not then do it
-     here. */
+  /* In general native window system methods will require sane
+     geometry values, thus the instance needs to have been laid-out
+     before they get called. */
+  image_instance_layout (ii, XIMAGE_INSTANCE_WIDTH (ii),
+                        XIMAGE_INSTANCE_HEIGHT (ii), domain);
+
+  MAYBE_IIFORMAT_METH (device_meths, instantiate, (ii, instantiator, pointer_fg,
+                                                  pointer_bg, dest_mask, domain));
+  /* Do post instantiation. */
+  MAYBE_IIFORMAT_METH (meths, post_instantiate, (ii, instantiator, domain));
+  MAYBE_IIFORMAT_METH (device_meths, post_instantiate, (ii, instantiator, domain));
+
+  /* We're done. */
+  IMAGE_INSTANCE_INITIALIZED (p) = 1;
+  /* Now that we're done verify that we really are laid out. */
   if (IMAGE_INSTANCE_LAYOUT_CHANGED (p))
-    image_instance_layout (ii, IMAGE_UNSPECIFIED_GEOMETRY,
-                          IMAGE_UNSPECIFIED_GEOMETRY, domain);
-
+      image_instance_layout (ii, XIMAGE_INSTANCE_WIDTH (ii),
+                            XIMAGE_INSTANCE_HEIGHT (ii), domain);
+  
   /* We *must* have a clean image at this point. */
   IMAGE_INSTANCE_TEXT_CHANGED (p) = 0;
   IMAGE_INSTANCE_SIZE_CHANGED (p) = 0;
   IMAGE_INSTANCE_LAYOUT_CHANGED (p) = 0;
   IMAGE_INSTANCE_DIRTYP (p) = 0;
 
-  return ii;
+  assert ( XIMAGE_INSTANCE_HEIGHT (ii) 
+             != IMAGE_UNSPECIFIED_GEOMETRY
+             && XIMAGE_INSTANCE_WIDTH (ii) 
+             != IMAGE_UNSPECIFIED_GEOMETRY);
+
+  ERROR_CHECK_IMAGE_INSTANCE (ii);
+
+  RETURN_UNGCPRO (ii);
 }
 
 \f
@@ -638,7 +746,23 @@ mark_image_instance (Lisp_Object obj)
 {
   Lisp_Image_Instance *i = XIMAGE_INSTANCE (obj);
 
+  /* #### I want to check the instance here, but there are way too
+     many instances of the instance being marked while the domain is
+     dead. For instance you can get marked through an event when using
+     callback_ex.*/
+#if 0
+  ERROR_CHECK_IMAGE_INSTANCE (obj);
+#endif
+
   mark_object (i->name);
+  /* Is this legal in marking? We may get in the situation where the
+     domain has been deleted - making the instance unusable. It seems
+     better to remove the domain so that it can be finalized. */
+  if (!DOMAIN_LIVE_P (i->domain))
+    i->domain = Qnil;
+  else
+    mark_object (i->domain);
+
   /* We don't mark the glyph reference since that would create a
      circularity preventing GC. */
   switch (IMAGE_INSTANCE_TYPE (i))
@@ -657,23 +781,27 @@ mark_image_instance (Lisp_Object obj)
       break;
 
     case IMAGE_WIDGET:
-    case IMAGE_LAYOUT:
       mark_object (IMAGE_INSTANCE_WIDGET_TYPE (i));
       mark_object (IMAGE_INSTANCE_WIDGET_PROPS (i));
       mark_object (IMAGE_INSTANCE_WIDGET_FACE (i));
       mark_object (IMAGE_INSTANCE_WIDGET_ITEMS (i));
+      mark_object (IMAGE_INSTANCE_LAYOUT_CHILDREN (i));
       mark_object (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (i));
       mark_object (IMAGE_INSTANCE_WIDGET_HEIGHT_SUBR (i));
       mark_object (IMAGE_INSTANCE_WIDGET_WIDTH_SUBR (i));
     case IMAGE_SUBWINDOW:
-      mark_object (IMAGE_INSTANCE_SUBWINDOW_FRAME (i));
       break;
 
     default:
       break;
     }
 
-  MAYBE_DEVMETH (XDEVICE (i->device), mark_image_instance, (i));
+  /* The image may have been previously finalized (yes that's wierd,
+     see Fdelete_frame() and mark_window_as_deleted()), in which case
+     the domain will be nil, so cope with this. */
+  if (!NILP (IMAGE_INSTANCE_DEVICE (i)))
+    MAYBE_DEVMETH (XDEVICE (IMAGE_INSTANCE_DEVICE (i)), 
+                  mark_image_instance, (i));
 
   return i->device;
 }
@@ -697,7 +825,7 @@ print_image_instance (Lisp_Object obj, Lisp_Object printcharfun,
       write_c_string (" ", printcharfun);
     }
   write_c_string ("on ", printcharfun);
-  print_internal (ii->device, printcharfun, 0);
+  print_internal (ii->domain, printcharfun, 0);
   write_c_string (" ", printcharfun);
   switch (IMAGE_INSTANCE_TYPE (ii))
     {
@@ -773,7 +901,7 @@ print_image_instance (Lisp_Object obj, Lisp_Object printcharfun,
     case IMAGE_WIDGET:
       print_internal (IMAGE_INSTANCE_WIDGET_TYPE (ii), printcharfun, 0);
 
-      if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)))
+      if (GUI_ITEMP (IMAGE_INSTANCE_WIDGET_ITEM (ii)))
        {
          write_c_string (" ", printcharfun);
          print_internal (IMAGE_INSTANCE_WIDGET_TEXT (ii), printcharfun, 1);
@@ -788,9 +916,8 @@ print_image_instance (Lisp_Object obj, Lisp_Object printcharfun,
 
 
     case IMAGE_SUBWINDOW:
-    case IMAGE_LAYOUT:
-      sprintf (buf, " %dx%d", IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii),
-              IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii));
+      sprintf (buf, " %dx%d", IMAGE_INSTANCE_WIDTH (ii),
+              IMAGE_INSTANCE_HEIGHT (ii));
       write_c_string (buf, printcharfun);
 
       /* This is stolen from frame.c.  Subwindows are strange in that they
@@ -799,7 +926,7 @@ print_image_instance (Lisp_Object obj, Lisp_Object printcharfun,
 
       write_c_string (" on #<", printcharfun);
       {
-       struct frame* f  = XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
+       struct frame* f  = XFRAME (IMAGE_INSTANCE_FRAME (ii));
 
        if (!FRAME_LIVE_P (f))
          write_c_string ("dead", printcharfun);
@@ -817,7 +944,7 @@ print_image_instance (Lisp_Object obj, Lisp_Object printcharfun,
       abort ();
     }
 
-  MAYBE_DEVMETH (XDEVICE (ii->device), print_image_instance,
+  MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain), print_image_instance,
                 (ii, printcharfun, escapeflag));
   sprintf (buf, " 0x%x>", ii->header.uid);
   write_c_string (buf, printcharfun);
@@ -828,23 +955,20 @@ finalize_image_instance (void *header, int for_disksave)
 {
   Lisp_Image_Instance *i = (Lisp_Image_Instance *) header;
 
-  if (IMAGE_INSTANCE_TYPE (i) == IMAGE_NOTHING)
-    /* objects like this exist at dump time, so don't bomb out. */
+  /* objects like this exist at dump time, so don't bomb out. */
+  if (IMAGE_INSTANCE_TYPE (i) == IMAGE_NOTHING
+      || 
+      NILP (IMAGE_INSTANCE_DEVICE (i)))
     return;
   if (for_disksave) finalose (i);
 
-  /* do this so that the cachels get reset */
-  if (IMAGE_INSTANCE_TYPE (i) == IMAGE_WIDGET
-      ||
-      IMAGE_INSTANCE_TYPE (i) == IMAGE_SUBWINDOW
-      ||
-      IMAGE_INSTANCE_TYPE (i) == IMAGE_SUBWINDOW)
-    {
-      MARK_FRAME_SUBWINDOWS_CHANGED
-       (XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (i)));
-    }
+  /* We can't use the domain here, because it might have
+     disappeared. */
+  MAYBE_DEVMETH (XDEVICE (IMAGE_INSTANCE_DEVICE (i)),
+                finalize_image_instance, (i));
 
-  MAYBE_DEVMETH (XDEVICE (i->device), finalize_image_instance, (i));
+  /* Make sure we don't try this twice. */
+  IMAGE_INSTANCE_DEVICE (i) = Qnil;
 }
 
 static int
@@ -852,13 +976,16 @@ image_instance_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
 {
   Lisp_Image_Instance *i1 = XIMAGE_INSTANCE (obj1);
   Lisp_Image_Instance *i2 = XIMAGE_INSTANCE (obj2);
-  struct device *d1 = XDEVICE (i1->device);
-  struct device *d2 = XDEVICE (i2->device);
 
-  if (d1 != d2)
-    return 0;
-  if (IMAGE_INSTANCE_TYPE (i1) != IMAGE_INSTANCE_TYPE (i2)
+  ERROR_CHECK_IMAGE_INSTANCE (obj1);
+  ERROR_CHECK_IMAGE_INSTANCE (obj2);
+
+  if (!EQ (IMAGE_INSTANCE_DOMAIN (i1),
+          IMAGE_INSTANCE_DOMAIN (i2))
+      || IMAGE_INSTANCE_TYPE (i1) != IMAGE_INSTANCE_TYPE (i2)
       || IMAGE_INSTANCE_WIDTH (i1) != IMAGE_INSTANCE_WIDTH (i2)
+      || IMAGE_INSTANCE_MARGIN_WIDTH (i1) !=
+      IMAGE_INSTANCE_MARGIN_WIDTH (i2)
       || IMAGE_INSTANCE_HEIGHT (i1) != IMAGE_INSTANCE_HEIGHT (i2)
       || IMAGE_INSTANCE_XOFFSET (i1) != IMAGE_INSTANCE_XOFFSET (i2)
       || IMAGE_INSTANCE_YOFFSET (i1) != IMAGE_INSTANCE_YOFFSET (i2))
@@ -900,7 +1027,6 @@ image_instance_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
       break;
 
     case IMAGE_WIDGET:
-    case IMAGE_LAYOUT:
       if (!(EQ (IMAGE_INSTANCE_WIDGET_TYPE (i1),
                IMAGE_INSTANCE_WIDGET_TYPE (i2))
            && IMAGE_INSTANCE_SUBWINDOW_ID (i1) ==
@@ -911,6 +1037,9 @@ image_instance_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
            && internal_equal (IMAGE_INSTANCE_WIDGET_ITEMS (i1),
                               IMAGE_INSTANCE_WIDGET_ITEMS (i2),
                               depth + 1)
+           && internal_equal (IMAGE_INSTANCE_LAYOUT_CHILDREN (i1),
+                              IMAGE_INSTANCE_LAYOUT_CHILDREN (i2),
+                              depth + 1)
            && internal_equal (IMAGE_INSTANCE_WIDGET_PROPS (i1),
                               IMAGE_INSTANCE_WIDGET_PROPS (i2),
                               depth + 1)
@@ -934,40 +1063,47 @@ image_instance_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
       abort ();
     }
 
-  return DEVMETH_OR_GIVEN (d1, image_instance_equal, (i1, i2, depth), 1);
+  return DEVMETH_OR_GIVEN (DOMAIN_XDEVICE (i1->domain), 
+                          image_instance_equal, (i1, i2, depth), 1);
 }
 
-#if 0
-/* internal_hash will not go very far down a list because of the way
-   its written. For items we need to hash all elements so we provide
-   our own list hashing function. */
-static unsigned long
-full_list_hash (Lisp_Object obj, int depth)
+/* Image instance domain manipulators. We can't error check in these
+   otherwise we get into infinite recursion. */
+Lisp_Object
+image_instance_device (Lisp_Object instance)
 {
-  unsigned long hash = 0;
-  Lisp_Object rest;
+  return XIMAGE_INSTANCE_DEVICE (instance);
+}
 
-  if (!CONSP (obj))
-    return internal_hash (obj, depth + 1);
+Lisp_Object
+image_instance_frame (Lisp_Object instance)
+{
+  return XIMAGE_INSTANCE_FRAME (instance);
+}
 
-  hash = LISP_HASH (XCAR (obj));
-  LIST_LOOP (rest, XCDR (obj))
-    {
-      hash = HASH2 (hash, internal_hash (XCAR (rest), depth + 1));
-    }
-  return hash;
+Lisp_Object
+image_instance_window (Lisp_Object instance)
+{
+  return DOMAIN_WINDOW (XIMAGE_INSTANCE_DOMAIN (instance));
+}
+
+int
+image_instance_live_p (Lisp_Object instance)
+{
+  return DOMAIN_LIVE_P (XIMAGE_INSTANCE_DOMAIN (instance));
 }
-#endif
 
 static unsigned long
 image_instance_hash (Lisp_Object obj, int depth)
 {
   Lisp_Image_Instance *i = XIMAGE_INSTANCE (obj);
-  struct device *d = XDEVICE (i->device);
-  unsigned long hash = HASH3 ((unsigned long) d,
+  unsigned long hash = HASH4 (LISP_HASH (IMAGE_INSTANCE_DOMAIN (i)),
                              IMAGE_INSTANCE_WIDTH (i),
+                             IMAGE_INSTANCE_MARGIN_WIDTH (i),
                              IMAGE_INSTANCE_HEIGHT (i));
 
+  ERROR_CHECK_IMAGE_INSTANCE (obj);
+
   switch (IMAGE_INSTANCE_TYPE (i))
     {
     case IMAGE_NOTHING:
@@ -988,13 +1124,14 @@ image_instance_hash (Lisp_Object obj, int depth)
       break;
 
     case IMAGE_WIDGET:
-    case IMAGE_LAYOUT:
       /* We need the hash to be equivalent to what should be
          displayed. */
-      hash = HASH4 (hash,
+      hash = HASH5 (hash,
                    LISP_HASH (IMAGE_INSTANCE_WIDGET_TYPE (i)),
                    internal_hash (IMAGE_INSTANCE_WIDGET_PROPS (i), depth + 1),
-                   internal_hash (IMAGE_INSTANCE_WIDGET_ITEMS (i), depth + 1));
+                   internal_hash (IMAGE_INSTANCE_WIDGET_ITEMS (i), depth + 1),
+                   internal_hash (IMAGE_INSTANCE_LAYOUT_CHILDREN (i), 
+                                  depth + 1));
     case IMAGE_SUBWINDOW:
       hash = HASH2 (hash, (int) IMAGE_INSTANCE_SUBWINDOW_ID (i));
       break;
@@ -1003,8 +1140,10 @@ image_instance_hash (Lisp_Object obj, int depth)
       abort ();
     }
 
-  return HASH2 (hash, DEVMETH_OR_GIVEN (d, image_instance_hash, (i, depth),
-                                       0));
+  return HASH2 (hash, DEVMETH_OR_GIVEN 
+               (XDEVICE (image_instance_device (obj)),
+                image_instance_hash, (i, depth),
+                0));
 }
 
 DEFINE_LRECORD_IMPLEMENTATION ("image-instance", image_instance,
@@ -1014,23 +1153,36 @@ DEFINE_LRECORD_IMPLEMENTATION ("image-instance", image_instance,
                               Lisp_Image_Instance);
 
 static Lisp_Object
-allocate_image_instance (Lisp_Object device, Lisp_Object glyph)
+allocate_image_instance (Lisp_Object governing_domain, Lisp_Object glyph)
 {
   Lisp_Image_Instance *lp =
     alloc_lcrecord_type (Lisp_Image_Instance, &lrecord_image_instance);
   Lisp_Object val;
 
   zero_lcrecord (lp);
-  lp->device = device;
+  /* It's not possible to simply keep a record of the domain in which
+     the instance was instantiated. This is because caching may mean
+     that the domain becomes invalid but the instance remains
+     valid. However, the only truly relevant domain is the domain in
+     which the instance is cached since this is the one that will be
+     common to the instances. */
+  lp->domain = governing_domain;
+  /* The cache domain is not quite sufficient since the domain can get
+     deleted before the image instance does. We need to know the
+     domain device in order to finalize the image instance
+     properly. We therefore record the device also. */
+  lp->device = DOMAIN_DEVICE (governing_domain);
   lp->type = IMAGE_NOTHING;
   lp->name = Qnil;
   lp->x_offset = 0;
   lp->y_offset = 0;
-  lp->width = 0;
-  lp->height = 0;
+  lp->width = IMAGE_UNSPECIFIED_GEOMETRY;
+  lp->margin_width = 0;
+  lp->height = IMAGE_UNSPECIFIED_GEOMETRY;
   lp->parent = glyph;
   /* So that layouts get done. */
   lp->layout_changed = 1;
+  lp->initialized = 0;
 
   XSETIMAGE_INSTANCE (val, lp);
   MARK_GLYPHS_CHANGED;
@@ -1051,7 +1203,6 @@ decode_image_instance_type (Lisp_Object type, Error_behavior errb)
   if (EQ (type, Qpointer))      return IMAGE_POINTER;
   if (EQ (type, Qsubwindow))    return IMAGE_SUBWINDOW;
   if (EQ (type, Qwidget))    return IMAGE_WIDGET;
-  if (EQ (type, Qlayout))    return IMAGE_LAYOUT;
 
   maybe_signal_simple_error ("Invalid image-instance type", type,
                             Qimage, errb);
@@ -1071,7 +1222,6 @@ encode_image_instance_type (enum image_instance_type type)
     case IMAGE_POINTER:      return Qpointer;
     case IMAGE_SUBWINDOW:    return Qsubwindow;
     case IMAGE_WIDGET:    return Qwidget;
-    case IMAGE_LAYOUT:    return Qlayout;
     default:
       abort ();
     }
@@ -1080,16 +1230,6 @@ encode_image_instance_type (enum image_instance_type type)
 }
 
 static int
-image_instance_type_to_mask (enum image_instance_type type)
-{
-  /* This depends on the fact that enums are assigned consecutive
-     integers starting at 0. (Remember that IMAGE_UNKNOWN is the
-     first enum.) I'm fairly sure this behavior is ANSI-mandated,
-     so there should be no portability problems here. */
-  return (1 << ((int) (type) - 1));
-}
-
-static int
 decode_image_instance_type_list (Lisp_Object list)
 {
   Lisp_Object rest;
@@ -1158,7 +1298,7 @@ valid_image_instance_type_p (Lisp_Object type)
 DEFUN ("valid-image-instance-type-p", Fvalid_image_instance_type_p, 1, 1, 0, /*
 Given an IMAGE-INSTANCE-TYPE, return non-nil if it is valid.
 Valid types are some subset of 'nothing, 'text, 'mono-pixmap, 'color-pixmap,
-'pointer, and 'subwindow, depending on how XEmacs was compiled.
+'pointer, 'subwindow, and 'widget, depending on how XEmacs was compiled.
 */
        (image_instance_type))
 {
@@ -1209,26 +1349,32 @@ Lisp_Object image_instance_parent_glyph (Lisp_Image_Instance* ii)
 }
 
 static Lisp_Object
-make_image_instance_1 (Lisp_Object data, Lisp_Object device,
+make_image_instance_1 (Lisp_Object data, Lisp_Object domain,
                       Lisp_Object dest_types)
 {
   Lisp_Object ii;
   struct gcpro gcpro1;
   int dest_mask;
+  Lisp_Object governing_domain;
 
-  XSETDEVICE (device, decode_device (device));
-  /* instantiate_image_instantiator() will abort if given an
-     image instance ... */
   if (IMAGE_INSTANCEP (data))
     signal_simple_error ("Image instances not allowed here", data);
   image_validate (data);
+  domain = decode_domain (domain);
+  /* instantiate_image_instantiator() will abort if given an
+     image instance ... */
   dest_mask = decode_image_instance_type_list (dest_types);
-  data = normalize_image_instantiator (data, DEVICE_TYPE (XDEVICE (device)),
+  data = normalize_image_instantiator (data,
+                                      DEVICE_TYPE (DOMAIN_XDEVICE (domain)),
                                       make_int (dest_mask));
   GCPRO1 (data);
-  if (VECTORP (data) && EQ (XVECTOR_DATA (data)[0], Qinherit))
+  /* After normalizing the data, it's always either an image instance (which
+     we filtered out above) or a vector. */
+  if (EQ (XVECTOR_DATA (data)[0], Qinherit))
     signal_simple_error ("Inheritance not allowed here", data);
-  ii = instantiate_image_instantiator (device, device, data,
+  governing_domain =
+    get_image_instantiator_governing_domain (data, domain);
+  ii = instantiate_image_instantiator (governing_domain, domain, data,
                                       Qnil, Qnil, dest_mask, Qnil);
   RETURN_UNGCPRO (ii);
 }
@@ -1243,7 +1389,7 @@ However, it may occasionally be useful to explicitly create image
 instances, if you want more control over the instantiation process.
 
 DATA is an image instantiator, which describes the image; see
-`image-specifier-p' for a description of the allowed values.
+`make-image-specifier' for a description of the allowed values.
 
 DEST-TYPES should be a list of allowed image instance types that can
 be generated.  The recognized image instance types are
@@ -1270,37 +1416,70 @@ be generated.  The recognized image instance types are
   another program to be responsible for drawing into the window.
 'widget
   A child window that contains a window-system widget, e.g. a push
-  button.
-
-The DEST-TYPES list is unordered.  If multiple destination types
-are possible for a given instantiator, the "most natural" type
-for the instantiator's format is chosen. (For XBM, the most natural
-types are `mono-pixmap', followed by `color-pixmap', followed by
-`pointer'.  For the other normal image formats, the most natural
-types are `color-pixmap', followed by `mono-pixmap', followed by
-`pointer'.  For the string and formatted-string formats, the most
-natural types are `text', followed by `mono-pixmap' (not currently
-implemented), followed by `color-pixmap' (not currently implemented).
-The other formats can only be instantiated as one type. (If you
-want to control more specifically the order of the types into which
-an image is instantiated, just call `make-image-instance' repeatedly
-until it succeeds, passing less and less preferred destination types
-each time.
+  button, text field, or slider.
+
+The DEST-TYPES list is unordered.  If multiple destination types are
+possible for a given instantiator, the "most natural" type for the
+instantiator's format is chosen. (For XBM, the most natural types are
+`mono-pixmap', followed by `color-pixmap', followed by `pointer'.  For
+the other normal image formats, the most natural types are
+`color-pixmap', followed by `mono-pixmap', followed by `pointer'.  For
+the string and formatted-string formats, the most natural types are
+`text', followed by `mono-pixmap' (not currently implemented),
+followed by `color-pixmap' (not currently implemented).  For MS
+Windows resources, the most natural type for pointer resources is
+`pointer', and for the others it's `color-pixmap'.  The other formats
+can only be instantiated as one type. (If you want to control more
+specifically the order of the types into which an image is
+instantiated, just call `make-image-instance' repeatedly until it
+succeeds, passing less and less preferred destination types each
+time.)
+
+See `make-image-specifier' for a description of the different image
+instantiator formats.
 
 If DEST-TYPES is omitted, all possible types are allowed.
 
+DOMAIN specifies the domain to which the image instance will be attached.
+This domain is termed the \"governing domain\".  The type of the governing
+domain depends on the image instantiator format. (Although, more correctly,
+it should probably depend on the image instance type.) For example, pixmap
+image instances are specific to a device, but widget image instances are
+specific to a particular XEmacs window because in order to display such a
+widget when two windows onto the same buffer want to display the widget,
+two separate underlying widgets must be created. (That's because a widget
+is actually a child window-system window, and all window-system windows have
+a unique existence on the screen.) This means that the governing domain for
+a pixmap image instance will be some device (most likely, the only existing
+device), whereas the governing domain for a widget image instance will be
+some XEmacs window.
+
+If you specify an overly general DOMAIN (e.g. a frame when a window was
+wanted), an error is signaled.  If you specify an overly specific DOMAIN
+\(e.g. a window when a device was wanted), the corresponding general domain
+is fetched and used instead.  For `make-image-instance', it makes no
+difference whether you specify an overly specific domain or the properly
+general domain derived from it.  However, it does matter when creating an
+image instance by instantiating a specifier or glyph (e.g. with
+`glyph-image-instance'), because the more specific domain causes spec lookup
+to start there and proceed to more general domains. (It would also matter
+when creating an image instance with an instantiator format of `inherit',
+but we currently disallow this. #### We should fix this.)
+
+If omitted, DOMAIN defaults to the selected window.
+
 NO-ERROR controls what happens when the image cannot be generated.
 If nil, an error message is generated.  If t, no messages are
 generated and this function returns nil.  If anything else, a warning
 message is generated and this function returns nil.
 */
-       (data, device, dest_types, no_error))
+       (data, domain, dest_types, no_error))
 {
   Error_behavior errb = decode_error_behavior_flag (no_error);
 
   return call_with_suspended_errors ((lisp_fn_t) make_image_instance_1,
                                     Qnil, Qimage, errb,
-                                    3, data, device, dest_types);
+                                    3, data, domain, dest_types);
 }
 
 DEFUN ("image-instance-p", Fimage_instance_p, 1, 1, 0, /*
@@ -1319,6 +1498,7 @@ The return value will be one of 'nothing, 'text, 'mono-pixmap,
        (image_instance))
 {
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
   return encode_image_instance_type (XIMAGE_INSTANCE_TYPE (image_instance));
 }
 
@@ -1331,6 +1511,20 @@ Return the name of the given image instance.
   return XIMAGE_INSTANCE_NAME (image_instance);
 }
 
+DEFUN ("image-instance-domain", Fimage_instance_domain, 1, 1, 0, /*
+Return the governing domain of the given image instance.
+The governing domain of an image instance is the domain that the image
+instance is specific to.  It is NOT necessarily the domain that was
+given to the call to `specifier-instance' that resulted in the creation
+of this image instance.  See `make-image-instance' for more information
+on governing domains.
+*/
+       (image_instance))
+{
+  CHECK_IMAGE_INSTANCE (image_instance);
+  return XIMAGE_INSTANCE_DOMAIN (image_instance);
+}
+
 DEFUN ("image-instance-string", Fimage_instance_string, 1, 1, 0, /*
 Return the string of the given image instance.
 This will only be non-nil for text image instances and widgets.
@@ -1358,12 +1552,13 @@ the image instance in the domain.
   struct image_instantiator_methods* meths;
 
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
   CHECK_SYMBOL (prop);
   ii = XIMAGE_INSTANCE (image_instance);
 
   /* ... then try device specific methods ... */
   type = encode_image_instance_type (IMAGE_INSTANCE_TYPE (ii));
-  meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii),
+  meths = decode_device_ii_format (image_instance_device (image_instance),
                                   type, ERROR_ME_NOT);
   if (meths && HAS_IIFORMAT_METH_P (meths, property)
       &&
@@ -1387,7 +1582,14 @@ DEFUN ("set-image-instance-property", Fset_image_instance_property, 3, 3, 0, /*
 Set the given property of the given image instance.
 Does nothing if the property or the property method do not exist for
 the image instance in the domain.
-*/
+
+WARNING: If you are thinking about using this function, think again.
+You probably want to be using `set-glyph-image' to change the glyph's
+specifier.  Be especially wary if you are thinking of calling this
+function after having called `glyph-image-instance'.  Unless you are
+absolutely sure what you're doing, pretty much the only legitimate
+uses for this function are setting user-specified info in a widget,
+such as text in a text field.  */
        (image_instance, prop, val))
 {
   Lisp_Image_Instance* ii;
@@ -1395,11 +1597,12 @@ the image instance in the domain.
   struct image_instantiator_methods* meths;
 
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
   CHECK_SYMBOL (prop);
   ii = XIMAGE_INSTANCE (image_instance);
   type = encode_image_instance_type (IMAGE_INSTANCE_TYPE (ii));
   /* try device specific methods first ... */
-  meths = decode_device_ii_format (IMAGE_INSTANCE_DEVICE (ii),
+  meths = decode_device_ii_format (image_instance_device (image_instance),
                                   type, ERROR_ME_NOT);
   if (meths && HAS_IIFORMAT_METH_P (meths, set_property)
       &&
@@ -1442,6 +1645,7 @@ Return the file name from which IMAGE-INSTANCE was read, if known.
        (image_instance))
 {
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   switch (XIMAGE_INSTANCE_TYPE (image_instance))
     {
@@ -1461,6 +1665,7 @@ Return the file name from which IMAGE-INSTANCE's mask was read, if known.
        (image_instance))
 {
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   switch (XIMAGE_INSTANCE_TYPE (image_instance))
     {
@@ -1481,6 +1686,7 @@ This is 0 for a bitmap, or a positive integer for a pixmap.
        (image_instance))
 {
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   switch (XIMAGE_INSTANCE_TYPE (image_instance))
     {
@@ -1500,6 +1706,7 @@ Return the height of the image instance, in pixels.
        (image_instance))
 {
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   switch (XIMAGE_INSTANCE_TYPE (image_instance))
     {
@@ -1508,7 +1715,6 @@ Return the height of the image instance, in pixels.
     case IMAGE_POINTER:
     case IMAGE_SUBWINDOW:
     case IMAGE_WIDGET:
-    case IMAGE_LAYOUT:
       return make_int (XIMAGE_INSTANCE_HEIGHT (image_instance));
 
     default:
@@ -1522,6 +1728,7 @@ Return the width of the image instance, in pixels.
        (image_instance))
 {
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   switch (XIMAGE_INSTANCE_TYPE (image_instance))
     {
@@ -1530,7 +1737,6 @@ Return the width of the image instance, in pixels.
     case IMAGE_POINTER:
     case IMAGE_SUBWINDOW:
     case IMAGE_WIDGET:
-    case IMAGE_LAYOUT:
       return make_int (XIMAGE_INSTANCE_WIDTH (image_instance));
 
     default:
@@ -1549,6 +1755,7 @@ This will always be nil for a non-pointer image instance.
        (image_instance))
 {
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   switch (XIMAGE_INSTANCE_TYPE (image_instance))
     {
@@ -1573,6 +1780,7 @@ This will always be nil for a non-pointer image instance.
        (image_instance))
 {
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   switch (XIMAGE_INSTANCE_TYPE (image_instance))
     {
@@ -1594,6 +1802,7 @@ colorized mono pixmaps and for pointers.)
        (image_instance))
 {
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   switch (XIMAGE_INSTANCE_TYPE (image_instance))
     {
@@ -1605,7 +1814,7 @@ colorized mono pixmaps and for pointers.)
     case IMAGE_WIDGET:
       return FACE_FOREGROUND (
                              XIMAGE_INSTANCE_WIDGET_FACE (image_instance),
-                             XIMAGE_INSTANCE_SUBWINDOW_FRAME
+                             XIMAGE_INSTANCE_FRAME
                              (image_instance));
 
     default:
@@ -1621,6 +1830,7 @@ colorized mono pixmaps and for pointers.)
        (image_instance))
 {
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   switch (XIMAGE_INSTANCE_TYPE (image_instance))
     {
@@ -1632,7 +1842,7 @@ colorized mono pixmaps and for pointers.)
     case IMAGE_WIDGET:
       return FACE_BACKGROUND (
                              XIMAGE_INSTANCE_WIDGET_FACE (image_instance),
-                             XIMAGE_INSTANCE_SUBWINDOW_FRAME
+                             XIMAGE_INSTANCE_FRAME
                              (image_instance));
 
     default:
@@ -1654,16 +1864,18 @@ instance is a mono pixmap; otherwise, the same image instance is returned.
   Lisp_Object device;
 
   CHECK_IMAGE_INSTANCE (image_instance);
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
   CHECK_COLOR_INSTANCE (foreground);
   CHECK_COLOR_INSTANCE (background);
 
-  device = XIMAGE_INSTANCE_DEVICE (image_instance);
+  device = image_instance_device (image_instance);
   if (!HAS_DEVMETH_P (XDEVICE (device), colorize_image_instance))
     return image_instance;
 
   /* #### There should be a copy_image_instance(), which calls a
      device-specific method to copy the window-system subobject. */
-  new = allocate_image_instance (device, Qnil);
+  new = allocate_image_instance (XIMAGE_INSTANCE_DOMAIN (image_instance), 
+                                Qnil);
   copy_lcrecord (XIMAGE_INSTANCE (new), XIMAGE_INSTANCE (image_instance));
   /* note that if this method returns non-zero, this method MUST
      copy any window-system resources, so that when one image instance is
@@ -1690,6 +1902,7 @@ image_instance_query_geometry (Lisp_Object image_instance,
   Lisp_Image_Instance* ii = XIMAGE_INSTANCE (image_instance);
   Lisp_Object type;
   struct image_instantiator_methods* meths;
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   type = encode_image_instance_type (IMAGE_INSTANCE_TYPE (ii));
   meths = decode_device_ii_format (Qnil, type, ERROR_ME_NOT);
@@ -1724,6 +1937,12 @@ image_instance_layout (Lisp_Object image_instance,
   Lisp_Object type;
   struct image_instantiator_methods* meths;
 
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
+
+  /* Nothing is as nothing does. */
+  if (NOTHING_IMAGE_INSTANCEP (image_instance))
+    return;
+
   type = encode_image_instance_type (IMAGE_INSTANCE_TYPE (ii));
   meths = decode_device_ii_format (Qnil, type, ERROR_ME_NOT);
 
@@ -1732,7 +1951,8 @@ image_instance_layout (Lisp_Object image_instance,
       ||
       height == IMAGE_UNSPECIFIED_GEOMETRY)
     {
-      unsigned int dwidth, dheight;
+      unsigned int dwidth = IMAGE_UNSPECIFIED_GEOMETRY,
+         dheight = IMAGE_UNSPECIFIED_GEOMETRY;
 
       /* Get the desired geometry. */
       if (meths && HAS_IIFORMAT_METH_P (meths, query_geometry))
@@ -1754,6 +1974,13 @@ image_instance_layout (Lisp_Object image_instance,
        height = dheight;
     }
 
+  /* If we don't have sane values then we cannot layout at this point and
+     must just return. */
+  if (width == IMAGE_UNSPECIFIED_GEOMETRY
+      ||
+      height == IMAGE_UNSPECIFIED_GEOMETRY)
+      return;
+
   /* At this point width and height should contain sane values. Thus
      we set the glyph geometry and lay it out. */
   if (IMAGE_INSTANCE_WIDTH (ii) != width
@@ -1766,15 +1993,11 @@ image_instance_layout (Lisp_Object image_instance,
   IMAGE_INSTANCE_WIDTH (ii) = width;
   IMAGE_INSTANCE_HEIGHT (ii) = height;
 
-  if (meths && HAS_IIFORMAT_METH_P (meths, layout))
-    {
-      IIFORMAT_METH (meths, layout, (image_instance, width, height, domain));
-    }
-  /* else no change to the geometry. */
-
-  /* Do not clear the dirty flag here - redisplay will do this for
-     us at the end. */
-  IMAGE_INSTANCE_LAYOUT_CHANGED (ii) = 0;
+  if (IIFORMAT_METH_OR_GIVEN (meths, layout, 
+                             (image_instance, width, height, domain), 1))
+    /* Do not clear the dirty flag here - redisplay will do this for
+       us at the end. */
+    IMAGE_INSTANCE_LAYOUT_CHANGED (ii) = 0;
 }
 
 /*
@@ -1847,7 +2070,11 @@ nothing_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
 
   if (dest_mask & IMAGE_NOTHING_MASK)
-    IMAGE_INSTANCE_TYPE (ii) = IMAGE_NOTHING;
+    {
+      IMAGE_INSTANCE_TYPE (ii) = IMAGE_NOTHING;
+      IMAGE_INSTANCE_HEIGHT (ii) = 0;
+      IMAGE_INSTANCE_WIDTH (ii) = 0;
+    }
   else
     incompatible_image_types (instantiator, dest_mask, IMAGE_NOTHING_MASK);
 }
@@ -1917,7 +2144,7 @@ string_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
 
   /* Should never get here with a domain other than a window. */
-  assert (!NILP (string) && WINDOWP (domain));
+  assert (!NILP (string) && WINDOWP (DOMAIN_WINDOW (domain)));
   if (dest_mask & IMAGE_TEXT_MASK)
     {
       IMAGE_INSTANCE_TYPE (ii) = IMAGE_TEXT;
@@ -1941,7 +2168,7 @@ query_string_geometry (Lisp_Object string, Lisp_Object face,
   unsigned char charsets[NUM_LEADING_BYTES];
   struct face_cachel frame_cachel;
   struct face_cachel *cachel;
-  Lisp_Object frame = FW_FRAME (domain);
+  Lisp_Object frame = DOMAIN_FRAME (domain);
 
   /* Compute height */
   if (height)
@@ -1960,7 +2187,8 @@ query_string_geometry (Lisp_Object string, Lisp_Object face,
        }
       else
        {
-         cachel = WINDOW_FACE_CACHEL (XWINDOW (domain), DEFAULT_INDEX);
+         cachel = WINDOW_FACE_CACHEL (DOMAIN_XWINDOW (domain),
+                                      DEFAULT_INDEX);
        }
 
       ensure_face_cachel_complete (cachel, domain, charsets);
@@ -1993,7 +2221,7 @@ query_string_font (Lisp_Object string, Lisp_Object face, Lisp_Object domain)
   struct face_cachel frame_cachel;
   struct face_cachel *cachel;
   int i;
-  Lisp_Object frame = FW_FRAME (domain);
+  Lisp_Object frame = DOMAIN_FRAME (domain);
 
   /* Compute string font info */
   find_charsets_in_bufbyte_string (charsets,
@@ -2748,18 +2976,22 @@ image_instantiate (Lisp_Object specifier, Lisp_Object matchspec,
                   Lisp_Object domain, Lisp_Object instantiator,
                   Lisp_Object depth)
 {
-  Lisp_Object device = DFW_DEVICE (domain);
-  struct device *d = XDEVICE (device);
   Lisp_Object glyph = IMAGE_SPECIFIER_ATTACHEE (XIMAGE_SPECIFIER (specifier));
   int dest_mask = XIMAGE_SPECIFIER_ALLOWED (specifier);
   int pointerp = dest_mask & image_instance_type_to_mask (IMAGE_POINTER);
 
   if (IMAGE_INSTANCEP (instantiator))
     {
-      /* make sure that the image instance's device and type are
+      /* make sure that the image instance's governing domain and type are
         matching. */
-
-      if (EQ (device, XIMAGE_INSTANCE_DEVICE (instantiator)))
+      Lisp_Object governing_domain = XIMAGE_INSTANCE_DOMAIN (instantiator);
+
+      if ((DEVICEP (governing_domain)
+          && EQ (governing_domain, DOMAIN_DEVICE (domain)))
+         || (FRAMEP (governing_domain)
+             && EQ (governing_domain, DOMAIN_FRAME (domain)))
+         || (WINDOWP (governing_domain)
+             && EQ (governing_domain, DOMAIN_WINDOW (domain))))
        {
          int mask =
            image_instance_type_to_mask (XIMAGE_INSTANCE_TYPE (instantiator));
@@ -2770,8 +3002,8 @@ image_instantiate (Lisp_Object specifier, Lisp_Object matchspec,
                                 instantiator);
        }
       else
-       signal_simple_error_2 ("Wrong device for image instance",
-                              instantiator, device);
+       signal_simple_error_2 ("Wrong domain for image instance",
+                              instantiator, domain);
     }
   else if (VECTORP (instantiator)
           && EQ (XVECTOR_DATA (instantiator)[0], Qinherit))
@@ -2788,12 +3020,13 @@ image_instantiate (Lisp_Object specifier, Lisp_Object matchspec,
       Lisp_Object ls3 = Qnil;
       Lisp_Object pointer_fg = Qnil;
       Lisp_Object pointer_bg = Qnil;
+      Lisp_Object governing_domain =
+       get_image_instantiator_governing_domain (instantiator, domain);
 
       /* We have to put subwindow, widget and text image instances in
         a per-window cache so that we can see the same glyph in
-        different windows. Unfortunately we do not know the type of
-        image_instance until after it has been created. We thus need
-        to be really careful how we place things.  */
+        different windows. We use governing_domain to determine the type
+        of image_instance that will be created. */
 
       if (pointerp)
        {
@@ -2802,121 +3035,101 @@ image_instantiate (Lisp_Object specifier, Lisp_Object matchspec,
          ls3 = list3 (instantiator, pointer_fg, pointer_bg);
        }
 
-      /* First look in the hash table. */
-      subtable = Fgethash (make_int (dest_mask), d->image_instance_cache,
-                          Qunbound);
-      if (UNBOUNDP (subtable))
-       {
-         /* For the image instance cache, we do comparisons with EQ rather
-            than with EQUAL, as we do for color and font names.
-            The reasons are:
-
-            1) pixmap data can be very long, and thus the hashing and
-            comparing will take awhile.
-            2) It's not so likely that we'll run into things that are EQUAL
-            but not EQ (that can happen a lot with faces, because their
-            specifiers are copied around); but pixmaps tend not to be
-            in faces.
-
-            However, if the image-instance could be a pointer, we have to
-            use EQUAL because we massaged the instantiator into a cons3
-            also containing the foreground and background of the
-            pointer face.
-          */
-
-         subtable = make_lisp_hash_table (20,
-                                          pointerp ? HASH_TABLE_KEY_CAR_WEAK
-                                          : HASH_TABLE_KEY_WEAK,
-                                          pointerp ? HASH_TABLE_EQUAL
-                                          : HASH_TABLE_EQ);
-         Fputhash (make_int (dest_mask), subtable,
-                   d->image_instance_cache);
-         instance = Qunbound;
-       }
-      else
+      /* First look in the device cache. */
+      if (DEVICEP (governing_domain))
        {
-         instance = Fgethash (pointerp ? ls3 : instantiator,
-                              subtable, Qunbound);
-         /* subwindows have a per-window cache and have to be treated
-            differently.  dest_mask can be a bitwise OR of all image
-            types so we will only catch someone possibly trying to
-            instantiate a subwindow type thing. Unfortunately, this
-            will occur most of the time so this probably slows things
-            down. But with the current design I don't see anyway
-            round it. */
-         if (UNBOUNDP (instance)
-             &&
-             dest_mask & (IMAGE_SUBWINDOW_MASK
-                          | IMAGE_WIDGET_MASK
-                          | IMAGE_LAYOUT_MASK
-                          | IMAGE_TEXT_MASK)
-             && WINDOWP (domain))
+         subtable = Fgethash (make_int (dest_mask), 
+                              XDEVICE (governing_domain)->
+                              image_instance_cache,
+                              Qunbound);
+         if (UNBOUNDP (subtable))
            {
-             instance = Fgethash (instantiator,
-                                  XWINDOW (domain)->subwindow_instance_cache,
-                                  Qunbound);
+             /* For the image instance cache, we do comparisons with
+                EQ rather than with EQUAL, as we do for color and
+                font names.  The reasons are:
+                
+                1) pixmap data can be very long, and thus the hashing
+                and comparing will take awhile.
+
+                2) It's not so likely that we'll run into things that
+                are EQUAL but not EQ (that can happen a lot with
+                faces, because their specifiers are copied around);
+                but pixmaps tend not to be in faces.
+                
+                However, if the image-instance could be a pointer, we
+                have to use EQUAL because we massaged the
+                instantiator into a cons3 also containing the
+                foreground and background of the pointer face.  */
+
+             subtable = make_lisp_hash_table 
+               (20, pointerp ? HASH_TABLE_KEY_CAR_WEAK
+                : HASH_TABLE_KEY_WEAK,
+                pointerp ? HASH_TABLE_EQUAL
+                : HASH_TABLE_EQ);
+             Fputhash (make_int (dest_mask), subtable,
+                       XDEVICE (governing_domain)->image_instance_cache);
+             instance = Qunbound;
            }
+         else
+           {
+             instance = Fgethash (pointerp ? ls3 : instantiator,
+                                  subtable, Qunbound);
+           }
+       }
+      else if (WINDOWP (governing_domain))
+       {
+         /* Subwindows have a per-window cache and have to be treated
+            differently. */
+         instance =
+           Fgethash (instantiator,
+                     XWINDOW (governing_domain)->subwindow_instance_cache,
+                     Qunbound);
        }
+      else
+       abort ();       /* We're not allowed anything else currently. */
 
+      /* If we don't have an instance at this point then create
+         one. */
       if (UNBOUNDP (instance))
        {
          Lisp_Object locative =
            noseeum_cons (Qnil,
                          noseeum_cons (pointerp ? ls3 : instantiator,
-                                       subtable));
+                                       DEVICEP (governing_domain) ? subtable 
+                                       : XWINDOW (governing_domain)
+                                       ->subwindow_instance_cache));
          int speccount = specpdl_depth ();
 
-         /* make sure we cache the failures, too.
-            Use an unwind-protect to catch such errors.
-            If we fail, the unwind-protect records nil in
-            the hash table.  If we succeed, we change the
-            car of the locative to the resulting instance,
-            which gets recorded instead. */
+         /* Make sure we cache the failures, too.  Use an
+            unwind-protect to catch such errors.  If we fail, the
+            unwind-protect records nil in the hash table.  If we
+            succeed, we change the car of the locative to the
+            resulting instance, which gets recorded instead. */
          record_unwind_protect (image_instantiate_cache_result,
                                 locative);
-         instance = instantiate_image_instantiator (device,
-                                                    domain,
-                                                    instantiator,
-                                                    pointer_fg, pointer_bg,
-                                                    dest_mask,
-                                                    glyph);
+         instance = 
+           instantiate_image_instantiator (governing_domain,
+                                           domain, instantiator,
+                                           pointer_fg, pointer_bg,
+                                           dest_mask, glyph);
+
+         /* We need a per-frame cache for redisplay. */
+         cache_subwindow_instance_in_frame_maybe (instance);
 
          Fsetcar (locative, instance);
-         /* only after the image has been instantiated do we know
-             whether we need to put it in the per-window image instance
-             cache. */
-         if (image_instance_type_to_mask (XIMAGE_INSTANCE_TYPE (instance))
-             &
-             (IMAGE_SUBWINDOW_MASK 
-              | IMAGE_WIDGET_MASK
-              | IMAGE_LAYOUT_MASK
-              | IMAGE_TEXT_MASK ))
-           {
 #ifdef ERROR_CHECK_GLYPHS
-             if (XIMAGE_INSTANCE_TYPE (instance) != IMAGE_TEXT)
-               assert (EQ (XIMAGE_INSTANCE_SUBWINDOW_FRAME (instance),
-                           FW_FRAME (domain)));
-#endif
-             if (!WINDOWP (domain))
-               signal_simple_error ("Can't instantiate text or subwindow outside a window",
-                                    instantiator);
-#ifdef ERROR_CHECK_GLYPHS
-             if (XIMAGE_INSTANCE_TYPE (instance) != IMAGE_TEXT)
-               assert (EQ (XIMAGE_INSTANCE_SUBWINDOW_FRAME (instance),
-                           FW_FRAME (domain)));
+         if (image_instance_type_to_mask (XIMAGE_INSTANCE_TYPE (instance))
+             & (IMAGE_SUBWINDOW_MASK | IMAGE_WIDGET_MASK))
+             assert (EQ (XIMAGE_INSTANCE_FRAME (instance),
+                         DOMAIN_FRAME (domain)));
 #endif
-             Fsetcdr (XCDR (locative), XWINDOW (domain)->subwindow_instance_cache);
-           }
          unbind_to (speccount, Qnil);
 #ifdef ERROR_CHECK_GLYPHS
          if (image_instance_type_to_mask (XIMAGE_INSTANCE_TYPE (instance))
-             &
-             (IMAGE_SUBWINDOW_MASK 
-              | IMAGE_WIDGET_MASK
-              | IMAGE_LAYOUT_MASK
-              | IMAGE_TEXT_MASK ))
+             & (IMAGE_SUBWINDOW_MASK | IMAGE_WIDGET_MASK))
            assert (EQ (Fgethash ((pointerp ? ls3 : instantiator),
-                                 XWINDOW (domain)->subwindow_instance_cache,
+                                 XWINDOW (governing_domain)
+                                 ->subwindow_instance_cache,
                                  Qunbound), instance));
 #endif
        }
@@ -2929,9 +3142,10 @@ image_instantiate (Lisp_Object specifier, Lisp_Object matchspec,
 #ifdef ERROR_CHECK_GLYPHS
       if (image_instance_type_to_mask (XIMAGE_INSTANCE_TYPE (instance))
          & (IMAGE_SUBWINDOW_MASK | IMAGE_WIDGET_MASK))
-       assert (EQ (XIMAGE_INSTANCE_SUBWINDOW_FRAME (instance),
-                   FW_FRAME (domain)));
+       assert (EQ (XIMAGE_INSTANCE_FRAME (instance),
+                   DOMAIN_FRAME (domain)));
 #endif
+      ERROR_CHECK_IMAGE_INSTANCE (instance);
       return instance;
     }
 
@@ -3146,187 +3360,7 @@ image_copy_instantiator (Lisp_Object arg)
 
 DEFUN ("image-specifier-p", Fimage_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is an image specifier.
-
-An image specifier is used for images (pixmaps and the like).  It is used
-to describe the actual image in a glyph.  It is instanced as an image-
-instance.
-
-Image instantiators come in many formats: `xbm', `xpm', `gif', `jpeg',
-etc.  This describes the format of the data describing the image.  The
-resulting image instances also come in many types -- `mono-pixmap',
-`color-pixmap', `text', `pointer', etc.  This refers to the behavior of
-the image and the sorts of places it can appear. (For example, a
-color-pixmap image has fixed colors specified for it, while a
-mono-pixmap image comes in two unspecified shades "foreground" and
-"background" that are determined from the face of the glyph or
-surrounding text; a text image appears as a string of text and has an
-unspecified foreground, background, and font; a pointer image behaves
-like a mono-pixmap image but can only be used as a mouse pointer
-\[mono-pixmap images cannot be used as mouse pointers]; etc.) It is
-important to keep the distinction between image instantiator format and
-image instance type in mind.  Typically, a given image instantiator
-format can result in many different image instance types (for example,
-`xpm' can be instanced as `color-pixmap', `mono-pixmap', or `pointer';
-whereas `cursor-font' can be instanced only as `pointer'), and a
-particular image instance type can be generated by many different
-image instantiator formats (e.g.  `color-pixmap' can be generated by `xpm',
-`gif', `jpeg', etc.).
-
-See `make-image-instance' for a more detailed discussion of image
-instance types.
-
-An image instantiator should be a string or a vector of the form
-
- [FORMAT :KEYWORD VALUE ...]
-
-i.e. a format symbol followed by zero or more alternating keyword-value
-pairs.  FORMAT should be one of
-
-'nothing
-  (Don't display anything; no keywords are valid for this.
-   Can only be instanced as `nothing'.)
-'string
-  (Display this image as a text string.  Can only be instanced
-   as `text', although support for instancing as `mono-pixmap'
-   should be added.)
-'formatted-string
-  (Display this image as a text string, with replaceable fields;
-  not currently implemented.)
-'xbm
-  (An X bitmap; only if X or Windows support was compiled into this XEmacs.
-   Can be instanced as `mono-pixmap', `color-pixmap', or `pointer'.)
-'xpm
-  (An XPM pixmap; only if XPM support was compiled into this XEmacs.
-   Can be instanced as `color-pixmap', `mono-pixmap', or `pointer'.)
-'xface
-  (An X-Face bitmap, used to encode people's faces in e-mail messages;
-  only if X-Face support was compiled into this XEmacs.  Can be
-  instanced as `mono-pixmap', `color-pixmap', or `pointer'.)
-'gif
-  (A GIF87 or GIF89 image; only if GIF support was compiled into this
-   XEmacs.  NOTE: only the first frame of animated gifs will be displayed.
-   Can be instanced as `color-pixmap'.)
-'jpeg
-  (A JPEG image; only if JPEG support was compiled into this XEmacs.
-   Can be instanced as `color-pixmap'.)
-'png
-  (A PNG image; only if PNG support was compiled into this XEmacs.
-   Can be instanced as `color-pixmap'.)
-'tiff
-  (A TIFF image; only if TIFF support was compiled into this XEmacs.
-   Can be instanced as `color-pixmap'.)
-'cursor-font
-  (One of the standard cursor-font names, such as "watch" or
-   "right_ptr" under X.  Under X, this is, more specifically, any
-   of the standard cursor names from appendix B of the Xlib manual
-   [also known as the file <X11/cursorfont.h>] minus the XC_ prefix.
-   On other window systems, the valid names will be specific to the
-   type of window system.  Can only be instanced as `pointer'.)
-'font
-  (A glyph from a font; i.e. the name of a font, and glyph index into it
-   of the form "FONT fontname index [[mask-font] mask-index]".
-   Currently can only be instanced as `pointer', although this should
-   probably be fixed.)
-'subwindow
-  (An embedded windowing system window.)
-'edit-field
-  (A text editing widget glyph.)
-'button
-  (A button widget glyph; either a push button, radio button or toggle button.)
-'tab-control
-  (A tab widget glyph; a series of user selectable tabs.)
-'progress-gauge
-  (A sliding widget glyph, for showing progress.)
-'combo-box
-  (A drop list of selectable items in a widget glyph, for editing text.)
-'label
-  (A static, text-only, widget glyph; for displaying text.)
-'tree-view
-  (A folding widget glyph.)
-'autodetect
-  (XEmacs tries to guess what format the data is in.  If X support
-  exists, the data string will be checked to see if it names a filename.
-  If so, and this filename contains XBM or XPM data, the appropriate
-  sort of pixmap or pointer will be created. [This includes picking up
-  any specified hotspot or associated mask file.] Otherwise, if `pointer'
-  is one of the allowable image-instance types and the string names a
-  valid cursor-font name, the image will be created as a pointer.
-  Otherwise, the image will be displayed as text.  If no X support
-  exists, the image will always be displayed as text.)
-'inherit
-  Inherit from the background-pixmap property of a face.
-
-The valid keywords are:
-
-:data
-  (Inline data.  For most formats above, this should be a string.  For
-  XBM images, this should be a list of three elements: width, height, and
-  a string of bit data.  This keyword is not valid for instantiator
-  formats `nothing' and `inherit'.)
-:file
-  (Data is contained in a file.  The value is the name of this file.
-  If both :data and :file are specified, the image is created from
-  what is specified in :data and the string in :file becomes the
-  value of the `image-instance-file-name' function when applied to
-  the resulting image-instance.  This keyword is not valid for
-  instantiator formats `nothing', `string', `formatted-string',
-  `cursor-font', `font', `autodetect', and `inherit'.)
-:foreground
-:background
-  (For `xbm', `xface', `cursor-font', `widget' and `font'.  These keywords
-  allow you to explicitly specify foreground and background colors.
-  The argument should be anything acceptable to `make-color-instance'.
-  This will cause what would be a `mono-pixmap' to instead be colorized
-  as a two-color color-pixmap, and specifies the foreground and/or
-  background colors for a pointer instead of black and white.)
-:mask-data
-  (For `xbm' and `xface'.  This specifies a mask to be used with the
-  bitmap.  The format is a list of width, height, and bits, like for
-  :data.)
-:mask-file
-  (For `xbm' and `xface'.  This specifies a file containing the mask data.
-  If neither a mask file nor inline mask data is given for an XBM image,
-  and the XBM image comes from a file, XEmacs will look for a mask file
-  with the same name as the image file but with "Mask" or "msk"
-  appended.  For example, if you specify the XBM file "left_ptr"
-  [usually located in "/usr/include/X11/bitmaps"], the associated
-  mask file "left_ptrmsk" will automatically be picked up.)
-:hotspot-x
-:hotspot-y
-  (For `xbm' and `xface'.  These keywords specify a hotspot if the image
-  is instantiated as a `pointer'.  Note that if the XBM image file
-  specifies a hotspot, it will automatically be picked up if no
-  explicit hotspot is given.)
-:color-symbols
-  (Only for `xpm'.  This specifies an alist that maps strings
-  that specify symbolic color names to the actual color to be used
-  for that symbolic color (in the form of a string or a color-specifier
-  object).  If this is not specified, the contents of `xpm-color-symbols'
-  are used to generate the alist.)
-:face
-  (Only for `inherit'.  This specifies the face to inherit from.
-  For widget glyphs this also specifies the face to use for
-  display. It defaults to gui-element-face.)
-
-Keywords accepted as menu item specs are also accepted by widget
-glyphs. These are `:selected', `:active', `:suffix', `:keys',
-`:style', `:filter', `:config', `:included', `:key-sequence',
-`:accelerator', `:label' and `:callback'.
-
-If instead of a vector, the instantiator is a string, it will be
-converted into a vector by looking it up according to the specs in the
-`console-type-image-conversion-list' (q.v.) for the console type of
-the domain (usually a window; sometimes a frame or device) over which
-the image is being instantiated.
-
-If the instantiator specifies data from a file, the data will be read
-in at the time that the instantiator is added to the image (which may
-be well before when the image is actually displayed), and the
-instantiator will be converted into one of the inline-data forms, with
-the filename retained using a :file keyword.  This implies that the
-file must exist when the instantiator is added to the image, but does
-not need to exist at any other time (e.g. it may safely be a temporary
-file).
+See `make-image-specifier' for a description of image instantiators.
 */
        (object))
 {
@@ -3496,8 +3530,7 @@ allocate_glyph (enum glyph_type type,
       XIMAGE_SPECIFIER_ALLOWED (g->image) =
        IMAGE_NOTHING_MASK | IMAGE_TEXT_MASK
        | IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK
-       | IMAGE_SUBWINDOW_MASK | IMAGE_WIDGET_MASK
-       | IMAGE_LAYOUT_MASK;
+       | IMAGE_SUBWINDOW_MASK | IMAGE_WIDGET_MASK;
       break;
     case GLYPH_POINTER:
       XIMAGE_SPECIFIER_ALLOWED (g->image) =
@@ -3612,11 +3645,13 @@ iconified.  Their image can be instantiated as `mono-pixmap' and
 DEFUN ("glyphp", Fglyphp, 1, 1, 0, /*
 Return non-nil if OBJECT is a glyph.
 
-A glyph is an object used for pixmaps and the like.  It is used
+A glyph is an object used for pixmaps, widgets and the like.  It is used
 in begin-glyphs and end-glyphs attached to extents, in marginal and textual
 annotations, in overlay arrows (overlay-arrow-* variables), in toolbar
-buttons, and the like.  Its image is described using an image specifier --
-see `image-specifier-p'.
+buttons, and the like.  Much more detailed information can be found at
+`make-glyph'.  Its image is described using an image specifier --
+see `make-image-specifier'.  See also `make-image-instance' for further
+information.
 */
        (object))
 {
@@ -3651,6 +3686,7 @@ glyph_image_instance (Lisp_Object glyph, Lisp_Object domain,
                                                   domain, errb, no_quit, 0,
                                                   Qzero);
   assert (!UNBOUNDP (image_instance));
+  ERROR_CHECK_IMAGE_INSTANCE (image_instance);
 
   return image_instance;
 }
@@ -3808,6 +3844,9 @@ set_glyph_dirty_p (Lisp_Object glyph_or_image, Lisp_Object window, int dirty)
          XGLYPH_DIRTYP (glyph_or_image) = dirty;
        }
 
+      if (!IMAGE_INSTANCEP (instance))
+       return;
+
       XIMAGE_INSTANCE_DIRTYP (instance) = dirty;
     }
 }
@@ -3957,6 +3996,9 @@ update_glyph_cachel_data (struct window *w, Lisp_Object glyph,
         and passing it to the size functions. */
       instance = glyph_image_instance (glyph, window, ERROR_ME_NOT, 1);
 
+      if (!IMAGE_INSTANCEP (instance))
+       return;
+
       /* Mark text instance of the glyph dirty if faces have changed,
         because its geometry might have changed. */
       invalidate_glyph_geometry_maybe (instance, w);
@@ -4092,139 +4134,68 @@ compute_glyph_cachel_usage (glyph_cachel_dynarr *glyph_cachels,
    per-frame instance cache that we use to determine if a subwindow is
    obscuring an area that we want to clear. We need to be able to flip
    through this quickly so a hashtable is not suitable hence the
-   subwindow_cachels. The question is should we just not mark
-   instances in the subwindow_cachels or should we try and invalidate
-   the cache at suitable points in redisplay? If we don't invalidate
-   the cache it will fill up with crud that will only get removed when
-   the frame is deleted. So invalidation is good, the question is when
-   and whether we mark as well. Go for the simple option - don't mark,
-   MARK_SUBWINDOWS_CHANGED when a subwindow gets deleted. */
-
-void
-mark_subwindow_cachels (subwindow_cachel_dynarr *elements)
-{
-  int elt;
-
-  if (!elements)
-    return;
-
-  for (elt = 0; elt < Dynarr_length (elements); elt++)
-    {
-      struct subwindow_cachel *cachel = Dynarr_atp (elements, elt);
-      mark_object (cachel->subwindow);
-    }
-}
+   subwindow_cachels. This is a weak list so unreference instances
+   will get deleted properly. */
 
-static void
-update_subwindow_cachel_data (struct frame *f, Lisp_Object subwindow,
-                         struct subwindow_cachel *cachel)
-{
-  cachel->subwindow   = subwindow;
-  cachel->width   = XIMAGE_INSTANCE_SUBWINDOW_WIDTH (subwindow);
-  cachel->height   = XIMAGE_INSTANCE_SUBWINDOW_HEIGHT (subwindow);
-  cachel->updated = 1;
-}
+/* redisplay in general assumes that drawing something will erase
+   what was there before. unfortunately this does not apply to
+   subwindows that need to be specifically unmapped in order to
+   disappear. we take a brute force approach - on the basis that its
+   cheap - and unmap all subwindows in a display line */
 
+/* Put new instances in the frame subwindow cache. This is less costly than
+   doing it every time something gets mapped, and deleted instances will be
+   removed automatically. */
 static void
-add_subwindow_cachel (struct frame *f, Lisp_Object subwindow)
+cache_subwindow_instance_in_frame_maybe (Lisp_Object instance)
 {
-  struct subwindow_cachel new_cachel;
-
-  xzero (new_cachel);
-  new_cachel.subwindow = Qnil;
-  new_cachel.x=0;
-  new_cachel.y=0;
-  new_cachel.being_displayed=0;
-
-  update_subwindow_cachel_data (f, subwindow, &new_cachel);
-  Dynarr_add (f->subwindow_cachels, new_cachel);
-}
-
-static int
-get_subwindow_cachel_index (struct frame *f, Lisp_Object subwindow)
-{
-  int elt;
-
-  if (noninteractive)
-    return 0;
-
-  for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
+  Lisp_Image_Instance* ii = XIMAGE_INSTANCE (instance);
+  if (image_instance_type_to_mask (IMAGE_INSTANCE_TYPE (ii))
+      & (IMAGE_WIDGET_MASK | IMAGE_SUBWINDOW_MASK))
     {
-      struct subwindow_cachel *cachel =
-       Dynarr_atp (f->subwindow_cachels, elt);
-
-      if (EQ (cachel->subwindow, subwindow) && !NILP (subwindow))
-       {
-         if (!cachel->updated)
-           update_subwindow_cachel_data (f, subwindow, cachel);
-         return elt;
-       }
+      struct frame* f = DOMAIN_XFRAME (IMAGE_INSTANCE_DOMAIN (ii));
+      XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f))
+       = Fcons (instance, XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f)));
     }
-
-  /* If we didn't find the glyph, add it and then return its index. */
-  add_subwindow_cachel (f, subwindow);
-  return elt;
 }
 
-static void
-update_subwindow_cachel (Lisp_Object subwindow)
+/* Unmap and finalize all subwindow instances in the frame cache. This
+   is necessary because GC will not guarantee the order things get
+   deleted in and moreover, frame finalization deletes the window
+   system windows before deleting XEmacs windows, and hence
+   subwindows.  */
+void
+free_frame_subwindow_instance_cache (struct frame* f)
 {
-  struct frame* f;
-  int elt;
-
-  if (NILP (subwindow))
-    return;
-
-  f = XFRAME ( XIMAGE_INSTANCE_SUBWINDOW_FRAME (subwindow));
+  Lisp_Object rest;
 
-  for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
+  LIST_LOOP (rest, XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f)))
     {
-      struct subwindow_cachel *cachel =
-       Dynarr_atp (f->subwindow_cachels, elt);
-
-      if (EQ (cachel->subwindow, subwindow) && !NILP (subwindow))
-       {
-         update_subwindow_cachel_data (f, subwindow, cachel);
-       }
+      Lisp_Image_Instance *ii = XIMAGE_INSTANCE (XCAR (rest));
+      /* Make sure that the subwindow is unmapped so that window
+        deletion will not try and do it again. */
+      unmap_subwindow (XCAR (rest));
+      finalize_image_instance (ii, 0);
     }
 }
 
-/* redisplay in general assumes that drawing something will erase
-   what was there before. unfortunately this does not apply to
-   subwindows that need to be specifically unmapped in order to
-   disappear. we take a brute force approach - on the basis that its
-   cheap - and unmap all subwindows in a display line */
+/* Unmap and remove all instances from the frame cache. */
 void
-reset_subwindow_cachels (struct frame *f)
+reset_frame_subwindow_instance_cache (struct frame* f)
 {
-  int elt;
-  for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
-    {
-      struct subwindow_cachel *cachel =
-       Dynarr_atp (f->subwindow_cachels, elt);
+  Lisp_Object rest;
 
-      if (!NILP (cachel->subwindow) && cachel->being_displayed)
-       {
-         cachel->updated = 1;
-         /* #### This is not optimal as update_subwindow will search
-             the cachels for ourselves as well. We could easily optimize. */
-         unmap_subwindow (cachel->subwindow);
-       }
+  LIST_LOOP (rest, XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f)))
+    {
+      Lisp_Object value = XCAR (rest);
+      /* Make sure that the subwindow is unmapped so that window
+        deletion will not try and do it again. */
+      unmap_subwindow (value);
+      XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f))
+       = delq_no_quit (value, XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f)));
     }
-  Dynarr_reset (f->subwindow_cachels);
-}
-
-void
-mark_subwindow_cachels_as_not_updated (struct frame *f)
-{
-  int elt;
-
-  for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
-    Dynarr_atp (f->subwindow_cachels, elt)->updated = 0;
 }
 
-
-
 /*****************************************************************************
  *                              subwindow exposure ignorance                    *
  *****************************************************************************/
@@ -4315,20 +4286,23 @@ register_ignored_expose (struct frame* f, int x, int y, int width, int height)
  ****************************************************************************/
 int find_matching_subwindow (struct frame* f, int x, int y, int width, int height)
 {
-  int elt;
+  Lisp_Object rest;
 
-  for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
+  LIST_LOOP (rest, XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f)))
     {
-      struct subwindow_cachel *cachel =
-       Dynarr_atp (f->subwindow_cachels, elt);
+      Lisp_Image_Instance *ii = XIMAGE_INSTANCE (XCAR (rest));
 
-      if (cachel->being_displayed
+      if (IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (ii)
          &&
-         cachel->x <= x && cachel->y <= y
+         IMAGE_INSTANCE_DISPLAY_X (ii) <= x 
+         && 
+         IMAGE_INSTANCE_DISPLAY_Y (ii) <= y 
          &&
-         cachel->x + cachel->width >= x + width
+         IMAGE_INSTANCE_DISPLAY_X (ii)
+         + IMAGE_INSTANCE_DISPLAY_WIDTH (ii) >= x + width
          &&
-         cachel->y + cachel->height >= y + height)
+         IMAGE_INSTANCE_DISPLAY_Y (ii)
+         + IMAGE_INSTANCE_DISPLAY_HEIGHT (ii) >= y + height)
        {
          return 1;
        }
@@ -4356,9 +4330,9 @@ update_subwindow (Lisp_Object subwindow)
      Fsignal will abort. */
   specbind (Qinhibit_quit, Qt);
 
-  if (IMAGE_INSTANCE_TYPE (ii) == IMAGE_WIDGET
-      ||
-      IMAGE_INSTANCE_TYPE (ii) == IMAGE_LAYOUT)
+  ERROR_CHECK_IMAGE_INSTANCE (subwindow);
+
+  if (WIDGET_IMAGE_INSTANCEP (subwindow))
     {
       if (image_instance_changed (subwindow))
        update_widget (subwindow);
@@ -4369,9 +4343,10 @@ update_subwindow (Lisp_Object subwindow)
     }
   else if (IMAGE_INSTANCE_TYPE (ii) == IMAGE_SUBWINDOW
           &&
-          !NILP (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)))
+          !NILP (IMAGE_INSTANCE_FRAME (ii)))
     {
-      MAYBE_DEVMETH (XDEVICE (ii->device), update_subwindow, (ii));
+      MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
+                    update_subwindow, (ii));
     }
 
   IMAGE_INSTANCE_SIZE_CHANGED (ii) = 0;
@@ -4398,72 +4373,77 @@ image_instance_changed (Lisp_Object subwindow)
   if (internal_hash (subwindow, IMAGE_INSTANCE_HASH_DEPTH) != 
       IMAGE_INSTANCE_DISPLAY_HASH (ii))
     return 1;
-  else if ((WIDGET_IMAGE_INSTANCEP (subwindow)
-           || LAYOUT_IMAGE_INSTANCEP (subwindow))
-          && !internal_equal (IMAGE_INSTANCE_WIDGET_ITEMS (ii),
-                              IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii), 0))
+  /* #### I think there is probably a bug here. This gets called for
+     layouts - and yet the pending items are always nil for
+     layouts. We are saved by layout optimization, but I'm undecided
+     as to what the correct fix is. */
+  else if (WIDGET_IMAGE_INSTANCEP (subwindow)
+          && (!internal_equal (IMAGE_INSTANCE_WIDGET_ITEMS (ii),
+                               IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii), 0)
+              || !NILP (IMAGE_INSTANCE_LAYOUT_CHILDREN (ii))))
     return 1;
   else
     return 0;
 }
 
 /* Update all the subwindows on a frame. */
-DEFUN ("update-widget-instances", Fupdate_widget_instances,1, 1, 0, /*
-Given a FRAME, re-evaluate the display hash code for all widgets in the frame.
-Don't use this.
-*/
-       (frame))
+void
+update_widget_instances (Lisp_Object frame)
 {
-  int elt;
   struct frame* f;
+  Lisp_Object rest;
+
+  /* Its possible for the preceeding callback to have deleted the
+     frame, so cope with this. */
+  if (!FRAMEP (frame) || !FRAME_LIVE_P (XFRAME (frame)))
+    return;
+
   CHECK_FRAME (frame);
   f = XFRAME (frame);
-
+  
   /* If we get called we know something has changed. */
-  for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
-      {
-       struct subwindow_cachel *cachel =
-         Dynarr_atp (f->subwindow_cachels, elt);
-
-       if (cachel->being_displayed &&
-           image_instance_changed (cachel->subwindow))
-         {
-           set_image_instance_dirty_p (cachel->subwindow, 1);
-           MARK_FRAME_GLYPHS_CHANGED (f);
-         }
-      }
-  return Qnil;
+  LIST_LOOP (rest, XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f)))
+    {
+      Lisp_Object widget = XCAR (rest);
+      
+      if (XIMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (widget)
+         &&
+         image_instance_changed (widget))
+       {
+         set_image_instance_dirty_p (widget, 1);
+         MARK_FRAME_GLYPHS_CHANGED (f);
+       }
+    }
 }
 
 /* remove a subwindow from its frame */
 void unmap_subwindow (Lisp_Object subwindow)
 {
   Lisp_Image_Instance* ii = XIMAGE_INSTANCE (subwindow);
-  int elt;
-  struct subwindow_cachel* cachel;
   struct frame* f;
 
-  if (!(IMAGE_INSTANCE_TYPE (ii) == IMAGE_WIDGET
-       ||
-       IMAGE_INSTANCE_TYPE (ii) == IMAGE_SUBWINDOW)
+  ERROR_CHECK_IMAGE_INSTANCE (subwindow);
+
+  if (!image_instance_type_to_mask (IMAGE_INSTANCE_TYPE (ii))
+      & (IMAGE_WIDGET_MASK | IMAGE_SUBWINDOW_MASK)
       ||
-      NILP (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)))
+      !IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (ii))
     return;
+
 #ifdef DEBUG_WIDGETS
   stderr_out ("unmapping subwindow %d\n", IMAGE_INSTANCE_SUBWINDOW_ID (ii));
 #endif
-  f = XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
-  elt = get_subwindow_cachel_index (f, subwindow);
-  cachel = Dynarr_atp (f->subwindow_cachels, elt);
+  f = XFRAME (IMAGE_INSTANCE_FRAME (ii));
 
   /* make sure we don't get expose events */
-  register_ignored_expose (f, cachel->x, cachel->y, cachel->width, cachel->height);
-  cachel->x = ~0;
-  cachel->y = ~0;
-  cachel->being_displayed = 0;
+  register_ignored_expose (f, IMAGE_INSTANCE_DISPLAY_X (ii),
+                          IMAGE_INSTANCE_DISPLAY_Y (ii),
+                          IMAGE_INSTANCE_DISPLAY_WIDTH (ii),
+                          IMAGE_INSTANCE_DISPLAY_HEIGHT (ii));
   IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (ii) = 0;
 
-  MAYBE_DEVMETH (XDEVICE (ii->device), unmap_subwindow, (ii));
+  MAYBE_DEVMETH (XDEVICE (IMAGE_INSTANCE_DEVICE (ii)), 
+                unmap_subwindow, (ii));
 }
 
 /* show a subwindow in its frame */
@@ -4471,15 +4451,12 @@ void map_subwindow (Lisp_Object subwindow, int x, int y,
                    struct display_glyph_area *dga)
 {
   Lisp_Image_Instance* ii = XIMAGE_INSTANCE (subwindow);
-  int elt;
-  struct subwindow_cachel* cachel;
   struct frame* f;
 
-  if (!(IMAGE_INSTANCE_TYPE (ii) == IMAGE_WIDGET
-       ||
-       IMAGE_INSTANCE_TYPE (ii) == IMAGE_SUBWINDOW)
-      ||
-      NILP (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)))
+  ERROR_CHECK_IMAGE_INSTANCE (subwindow);
+
+  if (!image_instance_type_to_mask (IMAGE_INSTANCE_TYPE (ii))
+      & (IMAGE_WIDGET_MASK | IMAGE_SUBWINDOW_MASK))
     return;
 
 #ifdef DEBUG_WIDGETS
@@ -4487,17 +4464,15 @@ void map_subwindow (Lisp_Object subwindow, int x, int y,
              IMAGE_INSTANCE_SUBWINDOW_ID (ii),
              dga->width, dga->height, x, y);
 #endif
-  f = XFRAME (IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
+  f = XFRAME (IMAGE_INSTANCE_FRAME (ii));
   IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (ii) = 1;
-  elt = get_subwindow_cachel_index (f, subwindow);
-  cachel = Dynarr_atp (f->subwindow_cachels, elt);
-  cachel->x = x;
-  cachel->y = y;
-  cachel->width = dga->width;
-  cachel->height = dga->height;
-  cachel->being_displayed = 1;
+  IMAGE_INSTANCE_DISPLAY_X (ii) = x;
+  IMAGE_INSTANCE_DISPLAY_Y (ii) = y;
+  IMAGE_INSTANCE_DISPLAY_WIDTH (ii) = dga->width;
+  IMAGE_INSTANCE_DISPLAY_HEIGHT (ii) = dga->height;
 
-  MAYBE_DEVMETH (XDEVICE (ii->device), map_subwindow, (ii, x, y, dga));
+  MAYBE_DEVMETH (DOMAIN_XDEVICE (ii->domain),
+                map_subwindow, (ii, x, y, dga));
 }
 
 static int
@@ -4506,6 +4481,12 @@ subwindow_possible_dest_types (void)
   return IMAGE_SUBWINDOW_MASK;
 }
 
+int
+subwindow_governing_domain (void)
+{
+  return GOVERNING_DOMAIN_WINDOW;
+}
+
 /* Partially instantiate a subwindow. */
 void
 subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
@@ -4513,8 +4494,8 @@ subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
                       int dest_mask, Lisp_Object domain)
 {
   Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
-  Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
-  Lisp_Object frame = FW_FRAME (domain);
+  Lisp_Object device = image_instance_device (image_instance);
+  Lisp_Object frame = DOMAIN_FRAME (domain);
   Lisp_Object width = find_keyword_in_vector (instantiator, Q_pixel_width);
   Lisp_Object height = find_keyword_in_vector (instantiator, Q_pixel_height);
 
@@ -4527,31 +4508,35 @@ subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
   ii->data = 0;
   IMAGE_INSTANCE_SUBWINDOW_ID (ii) = 0;
   IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (ii) = 0;
-  IMAGE_INSTANCE_SUBWINDOW_FRAME (ii) = frame;
 
-  /* #### This stuff may get overidden by the widget code and is
-     actually really dumb now that we have dynamic geometry
-     calculations. What should really happen is that the subwindow
-     should query its child for an appropriate geometry. */
   if (INTP (width))
     {
       int w = 1;
       if (XINT (width) > 1)
        w = XINT (width);
-      IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii) = w;
+      IMAGE_INSTANCE_WIDTH (ii) = w;
+      IMAGE_INSTANCE_SUBWINDOW_H_RESIZEP (ii) = 0;
     }
-  else
-    IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii) = 20;
 
   if (INTP (height))
     {
       int h = 1;
       if (XINT (height) > 1)
        h = XINT (height);
-      IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii) = h;
+      IMAGE_INSTANCE_HEIGHT (ii) = h;
+      IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP (ii) = 0;
     }
-  else
-    IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii) = 20;
+}
+
+/* This is just a backup in case no-one has assigned a suitable geometry. 
+   #### It should really query the enclose window for geometry. */
+static void
+subwindow_query_geometry (Lisp_Object image_instance, unsigned int* width,
+                         unsigned int* height, enum image_instance_geometry disp,
+                         Lisp_Object domain)
+{
+  if (width)   *width = 20;
+  if (height)  *height = 20;
 }
 
 DEFUN ("subwindowp", Fsubwindowp, 1, 1, 0, /*
@@ -4600,9 +4585,6 @@ If a value is nil that parameter is not changed.
   IMAGE_INSTANCE_WIDTH (ii) = neww;
   IMAGE_INSTANCE_SIZE_CHANGED (ii) = 1;
 
-  /* need to update the cachels as redisplay will not do this */
-  update_subwindow_cachel (subwindow);
-
   return subwindow;
 }
 
@@ -4736,7 +4718,7 @@ Don't use this.
              /* We might need to kick redisplay at this point - but we
                 also might not. */
              MARK_DEVICE_FRAMES_GLYPHS_CHANGED
-               (XDEVICE (IMAGE_INSTANCE_DEVICE (ii)));
+               (XDEVICE (image_instance_device (value)));
              /* Cascade dirtiness so that we can have an animated glyph in a layout
                 for instance. */
              set_image_instance_dirty_p (value, 1);
@@ -4793,7 +4775,6 @@ syms_of_glyphs (void)
   DEFSUBR (Fvalid_image_instantiator_format_p);
   DEFSUBR (Fset_console_type_image_conversion_list);
   DEFSUBR (Fconsole_type_image_conversion_list);
-  DEFSUBR (Fupdate_widget_instances);
 
   defkeyword (&Q_file, ":file");
   defkeyword (&Q_data, ":data");
@@ -4828,8 +4809,6 @@ syms_of_glyphs (void)
   defsymbol (&Qpointer_image_instance_p, "pointer-image-instance-p");
   defsymbol (&Qwidget_image_instance_p, "widget-image-instance-p");
   defsymbol (&Qsubwindow_image_instance_p, "subwindow-image-instance-p");
-  defsymbol (&Qlayout_image_instance_p, "layout-image-instance-p");
-  defsymbol (&Qupdate_widget_instances, "update-widget-instances");
 
   DEFSUBR (Fmake_image_instance);
   DEFSUBR (Fimage_instance_p);
@@ -4837,6 +4816,7 @@ syms_of_glyphs (void)
   DEFSUBR (Fvalid_image_instance_type_p);
   DEFSUBR (Fimage_instance_type_list);
   DEFSUBR (Fimage_instance_name);
+  DEFSUBR (Fimage_instance_domain);
   DEFSUBR (Fimage_instance_string);
   DEFSUBR (Fimage_instance_file_name);
   DEFSUBR (Fimage_instance_mask_file_name);
@@ -5015,11 +4995,14 @@ image_instantiator_format_create (void)
   INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (string, "string");
 
   IIFORMAT_HAS_METHOD (string, validate);
+  IIFORMAT_HAS_SHARED_METHOD (string, governing_domain, subwindow);
   IIFORMAT_HAS_METHOD (string, possible_dest_types);
   IIFORMAT_HAS_METHOD (string, instantiate);
 
   IIFORMAT_VALID_KEYWORD (string, Q_data, check_valid_string);
   /* Do this so we can set strings. */
+  /* #### Andy, what is this?  This is a bogus format and should not be
+     visible to the user. */
   INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (text, "text");
   IIFORMAT_HAS_METHOD (text, set_property);
   IIFORMAT_HAS_METHOD (text, query_geometry);
@@ -5031,10 +5014,18 @@ image_instantiator_format_create (void)
   IIFORMAT_HAS_METHOD (formatted_string, instantiate);
   IIFORMAT_VALID_KEYWORD (formatted_string, Q_data, check_valid_string);
 
+  /* Do this so pointers have geometry. */
+  /* #### Andy, what is this?  This is a bogus format and should not be
+     visible to the user. */
+  INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (pointer, "pointer");
+  IIFORMAT_HAS_SHARED_METHOD (pointer, query_geometry, subwindow);
+
   /* subwindows */
   INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (subwindow, "subwindow");
   IIFORMAT_HAS_METHOD (subwindow, possible_dest_types);
+  IIFORMAT_HAS_METHOD (subwindow, governing_domain);
   IIFORMAT_HAS_METHOD (subwindow, instantiate);
+  IIFORMAT_HAS_METHOD (subwindow, query_geometry);
   IIFORMAT_VALID_KEYWORD (subwindow, Q_pixel_width, check_valid_int);
   IIFORMAT_VALID_KEYWORD (subwindow, Q_pixel_height, check_valid_int);
 
@@ -5181,12 +5172,53 @@ specifier_vars_of_glyphs (void)
   DEFVAR_SPECIFIER ("current-display-table", &Vcurrent_display_table /*
 *The display table currently in use.
 This is a specifier; use `set-specifier' to change it.
-The display table is a vector created with `make-display-table'.
-The 256 elements control how to display each possible text character.
-Each value should be a string, a glyph, a vector or nil.
-If a value is a vector it must be composed only of strings and glyphs.
-nil means display the character in the default fashion.
-Faces can have their own, overriding display table.
+
+Display tables are used to control how characters are displayed.  Each
+time that redisplay processes a character, it is looked up in all the
+display tables that apply (obtained by calling `specifier-instance' on
+`current-display-table' and any overriding display tables specified in
+currently active faces).  The first entry found that matches the
+character determines how the character is displayed.  If there is no
+matching entry, the default display method is used. (Non-control
+characters are displayed as themselves and control characters are
+displayed according to the buffer-local variable `ctl-arrow'.  Control
+characters are further affected by `control-arrow-glyph' and
+`octal-escape-glyph'.)
+
+Each instantiator in this specifier and the display-table specifiers
+in faces is a display table or a list of such tables.  If a list, each
+table will be searched in turn for an entry matching a particular
+character.  Each display table is one of
+
+-- a vector, specifying values for characters starting at 0
+-- a char table, either of type `char' or `generic'
+-- a range table
+
+Each entry in a display table should be one of
+
+-- nil (this entry is ignored and the search continues)
+-- a character (use this character; if it happens to be the same as
+   the original character, default processing happens, otherwise
+   redisplay attempts to display this character directly;
+   #### At some point recursive display-table lookup will be
+   implemented.)
+-- a string (display each character in the string directly;
+   #### At some point recursive display-table lookup will be
+   implemented.)
+-- a glyph (display the glyph;
+   #### At some point recursive display-table lookup will be
+   implemented when a string glyph is being processed.)
+-- a cons of the form (format "STRING") where STRING is a printf-like
+   spec used to process the character. #### Unfortunately no
+   formatting directives other than %% are implemented.
+-- a vector (each element of the vector is processed recursively;
+   in such a case, nil elements in the vector are simply ignored)
+
+#### At some point in the near future, display tables are likely to
+be expanded to include other features, such as referencing characters
+in particular fonts and allowing the character search to continue
+all the way up the chain of specifier instantiators.  These features
+are necessary to properly display Unicode characters.
 */ );
   Vcurrent_display_table = Fmake_specifier (Qdisplay_table);
   set_specifier_fallback (Vcurrent_display_table,
index 77ae598..95fc7f6 100644 (file)
@@ -50,19 +50,21 @@ struct image_instantiator_methods;
   tiff                         color-pixmap
   bmp                          color-pixmap
   cursor-font                  pointer
-  mswindows-resource           pointer
+  mswindows-resource           pointer, color-pixmap
   font                         pointer
   subwindow                    subwindow
   inherit                      mono-pixmap
   autodetect                   mono-pixmap, color-pixmap, pointer, text
   button                       widget
   edit-field                   widget
-  combo        -box                    widget
+  combo-box                    widget
   progress-gauge               widget
   tab-control                  widget
   tree-view                    widget
   scrollbar                    widget
-  static                       widget
+  label                                widget
+  layout                       widget
+  native-layout                        widget
 */
 
 /* These are methods specific to a particular format of image instantiator
@@ -96,6 +98,13 @@ enum image_instance_geometry
 #define WIDGET_BORDER_HEIGHT 4
 #define WIDGET_BORDER_WIDTH 4
 
+enum governing_domain
+{
+  GOVERNING_DOMAIN_WINDOW,
+  GOVERNING_DOMAIN_FRAME,
+  GOVERNING_DOMAIN_DEVICE
+};
+
 struct image_instantiator_methods
 {
   Lisp_Object symbol;
@@ -120,6 +129,10 @@ struct image_instantiator_methods
   Lisp_Object (*normalize_method) (Lisp_Object instantiator,
                                   Lisp_Object console_type);
 
+  /* Governing domain method: Return an int indicating what type of
+     domain an instance in this format is governed by. */
+  int (*governing_domain_method) (void);
+
   /* Possible-dest-types method: Return a mask indicating what dest types
      are compatible with this format. */
   int (*possible_dest_types_method) (void);
@@ -134,6 +147,11 @@ struct image_instantiator_methods
                              Lisp_Object pointer_bg,
                              int dest_mask,
                              Lisp_Object domain);
+  /* Post instantiate method: finish instantiation of the image
+     instance. */
+  void (*post_instantiate_method) (Lisp_Object image_instance,
+                                  Lisp_Object instantiator,
+                                  Lisp_Object domain);
   /* Property method: Given an image instance, return device specific
      properties. */
   Lisp_Object (*property_method) (Lisp_Object image_instance,
@@ -155,10 +173,10 @@ struct image_instantiator_methods
                                 Lisp_Object domain);
 
   /* Layout the instance and its children bounded by the provided
-     dimensions. */
-  void (*layout_method) (Lisp_Object image_instance,
-                                 unsigned int width, unsigned int height,
-                                 Lisp_Object domain);
+     dimensions. Returns success or failure. */
+  int (*layout_method) (Lisp_Object image_instance,
+                       unsigned int width, unsigned int height,
+                       Lisp_Object domain);
 };
 
 /***** Calling an image-instantiator method *****/
@@ -187,7 +205,7 @@ do {                                                        \
    the specified value */
 
 #define IIFORMAT_METH_OR_GIVEN(mstruc, m, args, given) \
-  (HAS_IIFORMAT_METH_P (mstruc, m) ?                   \
+  ((mstruc && HAS_IIFORMAT_METH_P (mstruc, m)) ?               \
    IIFORMAT_METH (mstruc, m, args) : (given))
 
 /***** Defining new image-instantiator types *****/
@@ -336,6 +354,7 @@ void initialize_subwindow_image_instance (Lisp_Image_Instance*);
 void subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
                            Lisp_Object pointer_fg, Lisp_Object pointer_bg,
                            int dest_mask, Lisp_Object domain);
+int subwindow_governing_domain (void);
 void widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
                         Lisp_Object pointer_fg, Lisp_Object pointer_bg,
                         int dest_mask, Lisp_Object domain);
@@ -346,6 +365,9 @@ void image_instance_query_geometry (Lisp_Object image_instance,
 void image_instance_layout (Lisp_Object image_instance,
                            unsigned int width, unsigned int height,
                            Lisp_Object domain);
+int layout_layout (Lisp_Object image_instance,
+                  unsigned int width, unsigned int height,
+                  Lisp_Object domain);
 int invalidate_glyph_geometry_maybe (Lisp_Object glyph_or_ii, struct window* w);
 
 DECLARE_DOESNT_RETURN (incompatible_image_types (Lisp_Object instantiator,
@@ -395,6 +417,18 @@ DECLARE_LRECORD (image_instance, Lisp_Image_Instance);
 #define CHECK_IMAGE_INSTANCE(x) CHECK_RECORD (x, image_instance)
 #define CONCHECK_IMAGE_INSTANCE(x) CONCHECK_RECORD (x, image_instance)
 
+#ifdef ERROR_CHECK_GLYPHS
+void check_image_instance_structure (Lisp_Object instance);
+void check_window_subwindow_cache (struct window* w);
+#define ERROR_CHECK_IMAGE_INSTANCE(ii) \
+  check_image_instance_structure (ii)
+#define ERROR_CHECK_SUBWINDOW_CACHE(w) \
+  check_window_subwindow_cache (w)
+#else
+#define ERROR_CHECK_IMAGE_INSTANCE(ii)
+#define ERROR_CHECK_SUBWINDOW_CACHE(w)
+#endif
+
 enum image_instance_type
 {
   IMAGE_UNKNOWN,
@@ -404,8 +438,7 @@ enum image_instance_type
   IMAGE_COLOR_PIXMAP,
   IMAGE_POINTER,
   IMAGE_SUBWINDOW,
-  IMAGE_WIDGET,
-  IMAGE_LAYOUT
+  IMAGE_WIDGET
 };
 
 #define IMAGE_NOTHING_MASK (1 << 0)
@@ -415,7 +448,13 @@ enum image_instance_type
 #define IMAGE_POINTER_MASK (1 << 4)
 #define IMAGE_SUBWINDOW_MASK (1 << 5)
 #define IMAGE_WIDGET_MASK (1 << 6)
-#define IMAGE_LAYOUT_MASK (1 << 7)
+
+/* This depends on the fact that enums are assigned consecutive
+   integers starting at 0. (Remember that IMAGE_UNKNOWN is the
+   first enum.) I'm fairly sure this behavior is ANSI-mandated,
+   so there should be no portability problems here. */
+#define image_instance_type_to_mask(type) \
+  ((int) (1 << ((int) (type) - 1)))
 
 #define IMAGE_INSTANCE_TYPE_P(ii, type) \
 (IMAGE_INSTANCEP (ii) && XIMAGE_INSTANCE_TYPE (ii) == type)
@@ -434,8 +473,6 @@ enum image_instance_type
      IMAGE_INSTANCE_TYPE_P (ii, IMAGE_SUBWINDOW)
 #define WIDGET_IMAGE_INSTANCEP(ii) \
      IMAGE_INSTANCE_TYPE_P (ii, IMAGE_WIDGET)
-#define LAYOUT_IMAGE_INSTANCEP(ii) \
-     IMAGE_INSTANCE_TYPE_P (ii, IMAGE_LAYOUT)
 
 #define CHECK_NOTHING_IMAGE_INSTANCE(x) do {                   \
   CHECK_IMAGE_INSTANCE (x);                                    \
@@ -480,23 +517,20 @@ enum image_instance_type
     x = wrong_type_argument (Qwidget_image_instance_p, (x));   \
 } while (0)
 
-#define CHECK_LAYOUT_IMAGE_INSTANCE(x) do {                    \
-  CHECK_IMAGE_INSTANCE (x);                                    \
-  if (!LAYOUT_IMAGE_INSTANCEP (x))                             \
-    x = wrong_type_argument (Qlayout_image_instance_p, (x));   \
-} while (0)
-
 struct Lisp_Image_Instance
 {
   struct lcrecord_header header;
-  Lisp_Object device;
+  Lisp_Object domain;          /* The domain in which we were cached. */
+  Lisp_Object device;          /* The device of the domain. Recorded
+                                  since the domain may get deleted
+                                  before us. */
   Lisp_Object name;
   /* The glyph from which we were instantiated. This is a weak
      reference. */
   Lisp_Object parent;
   enum image_instance_type type;
   unsigned int x_offset, y_offset;     /* for layout purposes */
-  unsigned int width, height;
+  unsigned int width, height, margin_width;
   unsigned long display_hash; /* Hash value representing the structure
                                 of the image_instance when it was
                                 last displayed. */
@@ -505,6 +539,7 @@ struct Lisp_Image_Instance
   unsigned int text_changed : 1;
   unsigned int layout_changed : 1; 
   unsigned int optimize_output : 1; /* For outputting layouts. */
+  unsigned int initialized : 1; /* When we're fully done. */
 
   union
   {
@@ -529,22 +564,29 @@ struct Lisp_Image_Instance
     } pixmap; /* used for pointers as well */
     struct
     {
-      Lisp_Object frame;
       void* subwindow;         /* specific devices can use this as necessary */
-      unsigned int being_displayed : 1;        /* used to detect when needs to be unmapped */
+      struct 
+      {                                /* We need these so we can do without
+                                  subwindow_cachel */
+       unsigned int x, y;      
+       unsigned int width, height;
+      } display_data;
+      unsigned int being_displayed : 1; /* used to detect when needs
+                                          to be unmapped */
       unsigned int v_resize : 1;       /* Whether the vsize is allowed to change. */
       unsigned int h_resize : 1;       /* Whether the hsize is allowed to change. */
       unsigned int orientation : 1; /* Vertical or horizontal. */
       unsigned int justification : 2; /* Left, right or center. */
-      /* Face for colors and font. We specify this here becuase we
+      /* Face for colors and font. We specify this here because we
         want people to be able to put :face in the instantiator
         spec. Using gyph-face is more inconvenient, although more
         general. */
       Lisp_Object face;
       Lisp_Object type;
       Lisp_Object props;       /* properties or border*/
-      Lisp_Object items;       /* a list of gui_items or children */
+      Lisp_Object items;       /* a list of displayed gui_items */
       Lisp_Object pending_items; /* gui_items that should be displayed */
+      Lisp_Object children;    /* a list of children */
       Lisp_Object width;       /* dynamic width spec. */
       Lisp_Object height;      /* dynamic height spec. */
       /* Change flags to augment dirty. */
@@ -568,7 +610,10 @@ struct Lisp_Image_Instance
 #define IMAGE_INSTANCE_HASH_DEPTH 0
 
 /* Accessor macros. */
+#define IMAGE_INSTANCE_DOMAIN(i) ((i)->domain)
+#define IMAGE_INSTANCE_DOMAIN_LIVE_P(i) (DOMAIN_LIVE_P ((i)->domain))
 #define IMAGE_INSTANCE_DEVICE(i) ((i)->device)
+#define IMAGE_INSTANCE_FRAME(i) (DOMAIN_FRAME ((i)->domain))
 #define IMAGE_INSTANCE_NAME(i) ((i)->name)
 #define IMAGE_INSTANCE_PARENT(i) ((i)->parent)
 #define IMAGE_INSTANCE_GLYPH(i) (image_instance_parent_glyph(i))
@@ -576,14 +621,18 @@ struct Lisp_Image_Instance
 #define IMAGE_INSTANCE_XOFFSET(i) ((i)->x_offset)
 #define IMAGE_INSTANCE_YOFFSET(i) ((i)->y_offset)
 #define IMAGE_INSTANCE_WIDTH(i) ((i)->width)
+#define IMAGE_INSTANCE_MARGIN_WIDTH(i) ((i)->margin_width)
 #define IMAGE_INSTANCE_HEIGHT(i) ((i)->height)
+#define IMAGE_INSTANCE_INITIALIZED(i) ((i)->initialized)
 #define IMAGE_INSTANCE_DISPLAY_HASH(i) ((i)->display_hash)
 #define IMAGE_INSTANCE_PIXMAP_TYPE_P(i)                        \
  ((IMAGE_INSTANCE_TYPE (i) == IMAGE_MONO_PIXMAP)       \
   || (IMAGE_INSTANCE_TYPE (i) == IMAGE_COLOR_PIXMAP))
 #define IMAGE_INSTANCE_DIRTYP(i) ((i)->dirty)
 #define IMAGE_INSTANCE_NEEDS_LAYOUT(i) \
-  (IMAGE_INSTANCE_DIRTYP (i) && IMAGE_INSTANCE_LAYOUT_CHANGED (i))
+  ((IMAGE_INSTANCE_DIRTYP (i) && IMAGE_INSTANCE_LAYOUT_CHANGED (i)) \
+   || (FRAMEP (IMAGE_INSTANCE_FRAME (i)) \
+       && XFRAME (IMAGE_INSTANCE_FRAME (i))->size_changed))
 #define IMAGE_INSTANCE_FACE(i) \
   (GLYPHP (IMAGE_INSTANCE_GLYPH (i)) ? \
    XGLYPH_FACE (IMAGE_INSTANCE_GLYPH (i)) : Qnil)
@@ -627,12 +676,14 @@ struct Lisp_Image_Instance
 #define IMAGE_INSTANCE_PIXMAP_TIMEOUT(i) ((i)->u.pixmap.timeout)
 
 /* Subwindow properties */
-#define IMAGE_INSTANCE_SUBWINDOW_WIDTH(i) \
- IMAGE_INSTANCE_WIDTH(i)
-#define IMAGE_INSTANCE_SUBWINDOW_HEIGHT(i) \
-  IMAGE_INSTANCE_HEIGHT(i)
 #define IMAGE_INSTANCE_SUBWINDOW_ID(i) ((i)->u.subwindow.subwindow)
-#define IMAGE_INSTANCE_SUBWINDOW_FRAME(i) ((i)->u.subwindow.frame)
+/* Display data. */
+#define IMAGE_INSTANCE_DISPLAY_X(i) ((i)->u.subwindow.display_data.x)
+#define IMAGE_INSTANCE_DISPLAY_Y(i) ((i)->u.subwindow.display_data.y)
+#define IMAGE_INSTANCE_DISPLAY_WIDTH(i) \
+  ((i)->u.subwindow.display_data.width)
+#define IMAGE_INSTANCE_DISPLAY_HEIGHT(i) \
+  ((i)->u.subwindow.display_data.height)
 #define IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP(i) \
 ((i)->u.subwindow.being_displayed)
 #define IMAGE_INSTANCE_SUBWINDOW_V_RESIZEP(i) \
@@ -669,11 +720,17 @@ XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (i)) :  \
 #define IMAGE_INSTANCE_WIDGET_TEXT(i) XGUI_ITEM (IMAGE_INSTANCE_WIDGET_ITEM (i))->name
 
 /* Layout properties */
-#define IMAGE_INSTANCE_LAYOUT_CHILDREN(i) ((i)->u.subwindow.items)
+#define IMAGE_INSTANCE_LAYOUT_CHILDREN(i) ((i)->u.subwindow.children)
 #define IMAGE_INSTANCE_LAYOUT_BORDER(i) ((i)->u.subwindow.props)
 
+#define XIMAGE_INSTANCE_DOMAIN(i) \
+  IMAGE_INSTANCE_DOMAIN (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_DOMAIN_LIVE_P(i) \
+  IMAGE_INSTANCE_DOMAIN_LIVE_P (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_DEVICE(i) \
   IMAGE_INSTANCE_DEVICE (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_FRAME(i) \
+  IMAGE_INSTANCE_FRAME (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_NAME(i) \
   IMAGE_INSTANCE_NAME (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_GLYPH(i) \
@@ -694,8 +751,12 @@ XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (i)) :   \
   IMAGE_INSTANCE_NEEDS_LAYOUT (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_WIDTH(i) \
   IMAGE_INSTANCE_WIDTH (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_MARGIN_WIDTH(i) \
+  IMAGE_INSTANCE_MARGIN_WIDTH (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_HEIGHT(i) \
   IMAGE_INSTANCE_HEIGHT (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_INITIALIZED(i) \
+  IMAGE_INSTANCE_INITIALIZED (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_FACE(i) \
   IMAGE_INSTANCE_FACE (XIMAGE_INSTANCE (i))
 
@@ -767,14 +828,16 @@ XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (i)) :  \
 #define XIMAGE_INSTANCE_LAYOUT_BORDER(i) \
   IMAGE_INSTANCE_LAYOUT_BORDER (XIMAGE_INSTANCE (i))
 
-#define XIMAGE_INSTANCE_SUBWINDOW_WIDTH(i) \
-  IMAGE_INSTANCE_SUBWINDOW_WIDTH (XIMAGE_INSTANCE (i))
-#define XIMAGE_INSTANCE_SUBWINDOW_HEIGHT(i) \
-  IMAGE_INSTANCE_SUBWINDOW_HEIGHT (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_SUBWINDOW_ID(i) \
   IMAGE_INSTANCE_SUBWINDOW_ID (XIMAGE_INSTANCE (i))
-#define XIMAGE_INSTANCE_SUBWINDOW_FRAME(i) \
-  IMAGE_INSTANCE_SUBWINDOW_FRAME (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_DISPLAY_X(i) \
+  IMAGE_INSTANCE_DISPLAY_X (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_DISPLAY_Y(i) \
+  IMAGE_INSTANCE_DISPLAY_Y (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_DISPLAY_WIDTH(i) \
+  IMAGE_INSTANCE_DISPLAY_WIDTH (XIMAGE_INSTANCE (i))
+#define XIMAGE_INSTANCE_DISPLAY_HEIGHT(i) \
+  IMAGE_INSTANCE_DISPLAY_HEIGHT (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP(i) \
   IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (XIMAGE_INSTANCE (i))
 #define XIMAGE_INSTANCE_SUBWINDOW_ORIENT(i) \
@@ -785,6 +848,11 @@ XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (i)) :   \
 #define MARK_IMAGE_INSTANCE_CHANGED(i) \
   (IMAGE_INSTANCE_DIRTYP (i) = 1);
 
+Lisp_Object image_instance_device (Lisp_Object instance);
+Lisp_Object image_instance_frame (Lisp_Object instance);
+Lisp_Object image_instance_window (Lisp_Object instance);
+int image_instance_live_p (Lisp_Object instance);
+
 #ifdef HAVE_XPM
 Lisp_Object evaluate_xpm_color_symbols (void);
 Lisp_Object pixmap_to_lisp_data (Lisp_Object name, int ok_if_data_invalid);
@@ -883,8 +951,7 @@ extern Lisp_Object Q_mask_file, Q_mask_data, Q_hotspot_x, Q_hotspot_y;
 extern Lisp_Object Q_foreground, Q_background, Q_face, Q_descriptor, Q_group;
 extern Lisp_Object Q_width, Q_height, Q_pixel_width, Q_pixel_height, Q_text;
 extern Lisp_Object Q_items, Q_properties, Q_image, Qimage_conversion_error;
-extern Lisp_Object Q_orientation, Qupdate_widget_instances;
-extern Lisp_Object Qwidget_callback_current_channel;
+extern Lisp_Object Q_orientation, Q_margin_width;
 extern Lisp_Object Vcontinuation_glyph, Vcontrol_arrow_glyph, Vhscroll_glyph;
 extern Lisp_Object Vinvisible_text_glyph, Voctal_escape_glyph, Vtruncation_glyph;
 extern Lisp_Object Vxemacs_logo;
@@ -949,18 +1016,55 @@ struct glyph_cachel
 #define OCT_ESC_GLYPH_INDEX    (glyph_index) 4
 #define INVIS_GLYPH_INDEX      (glyph_index) 5
 
-#define GLYPH_CACHEL(window, index)                    \
-  Dynarr_atp (window->glyph_cachels, index)
-#define GLYPH_CACHEL_GLYPH(window, index)              \
-  Dynarr_atp (window->glyph_cachels, index)->glyph
-#define GLYPH_CACHEL_WIDTH(window, index)              \
-  Dynarr_atp (window->glyph_cachels, index)->width
-#define GLYPH_CACHEL_ASCENT(window, index)             \
-  Dynarr_atp (window->glyph_cachels, index)->ascent
-#define GLYPH_CACHEL_DESCENT(window, index)            \
-  Dynarr_atp (window->glyph_cachels, index)->descent
-#define GLYPH_CACHEL_DIRTYP(window, index)             \
-  Dynarr_atp (window->glyph_cachels, index)->dirty
+#ifdef ERROR_CHECK_GLYPHS
+
+#include "window.h"
+
+INLINE_HEADER int
+GLYPH_CACHEL_WIDTH (struct window *window, int ind);
+INLINE_HEADER int
+GLYPH_CACHEL_WIDTH (struct window *window, int ind)
+{
+  int wid = Dynarr_atp (window->glyph_cachels, ind)->width;
+  assert (wid >= 0 && wid < 10000);
+  return wid;
+}
+INLINE_HEADER int
+GLYPH_CACHEL_ASCENT (struct window *window, int ind);
+INLINE_HEADER int
+GLYPH_CACHEL_ASCENT (struct window *window, int ind)
+{
+  int wid = Dynarr_atp (window->glyph_cachels, ind)->ascent;
+  assert (wid >= 0 && wid < 10000);
+  return wid;
+}
+INLINE_HEADER int
+GLYPH_CACHEL_DESCENT (struct window *window, int ind);
+INLINE_HEADER int
+GLYPH_CACHEL_DESCENT (struct window *window, int ind)
+{
+  int wid = Dynarr_atp (window->glyph_cachels, ind)->descent;
+  assert (wid >= 0 && wid < 10000);
+  return wid;
+}
+
+#else /* not ERROR_CHECK_GLYPHS */
+
+#define GLYPH_CACHEL_WIDTH(window, ind)                \
+  Dynarr_atp (window->glyph_cachels, ind)->width
+#define GLYPH_CACHEL_ASCENT(window, ind)               \
+  Dynarr_atp (window->glyph_cachels, ind)->ascent
+#define GLYPH_CACHEL_DESCENT(window, ind)              \
+  Dynarr_atp (window->glyph_cachels, ind)->descent
+
+#endif /* not ERROR_CHECK_GLYPHS */
+
+#define GLYPH_CACHEL(window, ind)                      \
+  Dynarr_atp (window->glyph_cachels, ind)
+#define GLYPH_CACHEL_GLYPH(window, ind)                \
+  Dynarr_atp (window->glyph_cachels, ind)->glyph
+#define GLYPH_CACHEL_DIRTYP(window, ind)               \
+  Dynarr_atp (window->glyph_cachels, ind)->dirty
 
 void mark_glyph_cachels (glyph_cachel_dynarr *elements);
 void mark_glyph_cachels_as_not_updated (struct window *w);
@@ -985,34 +1089,17 @@ void get_display_tables (struct window *, face_index,
  *                            Subwindow Object                              *
  ****************************************************************************/
 
-/* redisplay needs a per-frame cache of subwindows being displayed so
- * that we known when to unmap them */
-typedef struct subwindow_cachel subwindow_cachel;
-struct subwindow_cachel
-{
-  Lisp_Object subwindow;
-  unsigned int x, y;
-  unsigned int width, height;
-  unsigned int being_displayed : 1;
-  unsigned int updated : 1;
-};
-
-typedef struct
-{
-  Dynarr_declare (subwindow_cachel);
-} subwindow_cachel_dynarr;
-
-void mark_subwindow_cachels (subwindow_cachel_dynarr *elements);
-void mark_subwindow_cachels_as_not_updated (struct frame *f);
-void reset_subwindow_cachels (struct frame *f);
 void unmap_subwindow (Lisp_Object subwindow);
 void map_subwindow (Lisp_Object subwindow, int x, int y,
                    struct display_glyph_area *dga);
 int find_matching_subwindow (struct frame* f, int x, int y, int width, int height);
 void update_widget (Lisp_Object widget);
+void update_widget_instances (Lisp_Object frame);
 void update_subwindow (Lisp_Object subwindow);
 Lisp_Object image_instance_parent_glyph (struct Lisp_Image_Instance*);
 int image_instance_changed (Lisp_Object image);
+void free_frame_subwindow_instance_cache (struct frame* f);
+void reset_frame_subwindow_instance_cache (struct frame* f);
 
 struct expose_ignore
 {
index 9fd0b37..503c631 100644 (file)
@@ -22,13 +22,13 @@ Boston, MA 02111-1307, USA.  */
 
 #include <config.h>
 #include "lisp.h"
+#include "console-msw.h"
 #include "redisplay.h"
 #include "gui.h"
 #include "glyphs.h"
 #include "frame.h"
-#include "events.h"
 #include "elhash.h"
-#include "console-msw.h"
+#include "events.h"
 #include "buffer.h"
 
 /*
@@ -84,15 +84,8 @@ mswindows_handle_gui_wm_command (struct frame* f, HWND ctrl, LPARAM id)
 
   mswindows_enqueue_dispatch_event (event);
   /* The result of this evaluation could cause other instances to change so 
-     enqueue an update callback to check this. We also have to make sure that
-     the function does not appear in the command history.
-     #### I'm sure someone can tell me how to optimize this. */
-  mswindows_enqueue_misc_user_event
-    (frame, Qeval, 
-     list3 (Qlet,
-           list2 (Qthis_command,
-                  Qlast_command),
-           list2 (Qupdate_widget_instances, frame)));
+     enqueue an update callback to check this. */
+  enqueue_magic_eval_event (update_widget_instances, frame);
   return Qt;
 }
 
index 2cade75..8aebe30 100644 (file)
@@ -229,10 +229,6 @@ popup_selection_callback (Widget widget, LWLIB_ID ignored_id,
   VOID_TO_LISP (data, client_data);
   XSETFRAME (frame, f);
 
-  image_instance = XCAR (data);
-  callback = XCAR (XCDR (data));
-  callback_ex = XCDR (XCDR (data));
-
 #if 0
   /* #### What the hell?  I can't understand why this call is here,
      and doing it is really courting disaster in the new event
@@ -255,6 +251,9 @@ popup_selection_callback (Widget widget, LWLIB_ID ignored_id,
     }
   else
     {
+      image_instance = XCAR (data);
+      callback = XCAR (XCDR (data));
+      callback_ex = XCDR (XCDR (data));
       update_subwindows_p = 1;
 
       if (!NILP (callback_ex) && !UNBOUNDP (callback_ex))
@@ -294,16 +293,9 @@ popup_selection_callback (Widget widget, LWLIB_ID ignored_id,
   if (!NILP (event))
     enqueue_Xt_dispatch_event (event);
   /* The result of this evaluation could cause other instances to change so 
-     enqueue an update callback to check this. We also have to make sure that
-     the function does not appear in the command history.
-     #### I'm sure someone can tell me how to optimize this. */
+     enqueue an update callback to check this. */
   if (update_subwindows_p && !NILP (event))
-    signal_special_Xt_user_event (frame, Qeval,
-                                 list3 (Qlet,
-                                        list2 (Qthis_command,
-                                               Qlast_command),
-                                        list2 (Qupdate_widget_instances,
-                                               frame)));
+    enqueue_magic_eval_event (update_widget_instances, frame);
 }
 
 #if 1
index 5705cea..47e21a5 100644 (file)
--- a/src/gui.c
+++ b/src/gui.c
@@ -81,10 +81,10 @@ get_gui_callback (Lisp_Object data, Lisp_Object *fn, Lisp_Object *arg)
       Vquit_flag = Qt;
     }
   else if (SYMBOLP (data)
-      || (COMPILED_FUNCTIONP (data)
-         && XCOMPILED_FUNCTION (data)->flags.interactivep)
-      || (CONSP (data) && (EQ (XCAR (data), Qlambda))
-         && !NILP (Fassq (Qinteractive, Fcdr (Fcdr (data))))))
+          || (COMPILED_FUNCTIONP (data)
+              && XCOMPILED_FUNCTION (data)->flags.interactivep)
+          || (CONSP (data) && (EQ (XCAR (data), Qlambda))
+              && !NILP (Fassq (Qinteractive, Fcdr (Fcdr (data))))))
     {
       *fn = Qcall_interactively;
       *arg = data;
index 242a34a..8821c10 100644 (file)
@@ -789,14 +789,9 @@ gutter_validate (Lisp_Object instantiator)
 
 DEFUN ("gutter-specifier-p", Fgutter_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is a gutter specifier.
-Gutter specifiers are used to specify the format of a gutter.
-The values of the variables `default-gutter', `top-gutter',
-`left-gutter', `right-gutter', and `bottom-gutter' are always
-gutter specifiers.
-
-Valid gutter instantiators are called "gutter descriptors" and are
-either strings or property-lists of strings.  See `default-gutter' for
-a description of the exact format.
+
+See `make-gutter-specifier' for a description of possible gutter
+instantiators.
 */
        (object))
 {
@@ -932,15 +927,8 @@ gutter_size_validate (Lisp_Object instantiator)
 DEFUN ("gutter-size-specifier-p", Fgutter_size_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is a gutter-size specifier.
 
-Gutter-size specifiers are used to specify the size of a gutter.  The
-values of the variables `default-gutter-size', `top-gutter-size',
-`left-gutter-size', `right-gutter-size', and `bottom-gutter-size' are
-always gutter-size specifiers.
-
-Valid gutter-size instantiators are either integers or the special
-symbol 'autodetect. If a gutter-size is set to 'autodetect them the
-size of the gutter will be adjusted to just accomodate the gutters
-contents. 'autodetect only works for top and bottom gutters.
+See `make-gutter-size-specifier' for a description of possible gutter-size
+instantiators.
 */
        (object))
 {
@@ -977,17 +965,8 @@ gutter_visible_validate (Lisp_Object instantiator)
 DEFUN ("gutter-visible-specifier-p", Fgutter_visible_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is a gutter-visible specifier.
 
-Gutter-visible specifiers are used to specify the visibility of a
-gutter.  The values of the variables `default-gutter-visible-p',
-`top-gutter-visible-p', `left-gutter-visible-p',
-`right-gutter-visible-p', and `bottom-gutter-visible-p' are always
-gutter-visible specifiers.
-
-Valid gutter-visible instantiators are t, nil or a list of symbols.
-If a gutter-visible instantiator is set to a list of symbols, and the
-correspondong gutter specification is a property-list strings, then
-elements of the gutter specification will only be visible if the
-corresponding symbol occurs in the gutter-visible instantiator.
+See `make-gutter-visible-specifier' for a description of possible
+gutter-visible instantiators.
 */
        (object))
 {
@@ -1009,7 +988,9 @@ Ensure that all gutters are correctly showing their gutter specifier.
       DEVICE_FRAME_LOOP (frmcons, d)
        {
          struct frame *f = XFRAME (XCAR (frmcons));
-         
+
+         MAYBE_DEVMETH (d, frame_output_begin, (f));
+
          /* Sequence is quite important here. We not only want to
           redisplay the gutter area but we also want to flush any
           frame size changes out so that the gutter redisplay happens
@@ -1035,12 +1016,9 @@ Ensure that all gutters are correctly showing their gutter specifier.
              update_frame_gutters (f);
              unhold_one_frame_size_changes (f);
            }
-       }
-      /* We now call the output_end routine for tty frames.  We delay
-        doing so in order to avoid cursor flicker.  So much for 100%
-        encapsulation. */
-      if (DEVICE_TTY_P (d))
-       DEVMETH (d, output_end, (d));
+
+         MAYBE_DEVMETH (d, frame_output_end, (f));
+      }
       
       d->gutter_changed = 0;
     }
index 3e07fd7..9ec0b10 100644 (file)
@@ -63,6 +63,8 @@ void Dynarr_delete_many (void *d, int start, int len);
 void Dynarr_free (void *d);
 
 #define Dynarr_new(type) ((type##_dynarr *) Dynarr_newf (sizeof (type)))
+#define Dynarr_new2(dynarr_type, type) \
+  ((dynarr_type *) Dynarr_newf (sizeof (type)))
 #define Dynarr_at(d, pos) ((d)->base[pos])
 #define Dynarr_atp(d, pos) (&Dynarr_at (d, pos))
 #define Dynarr_length(d) ((d)->cur)
@@ -1543,6 +1545,12 @@ Lisp_Object,Lisp_Object,Lisp_Object
 extern int specpdl_depth_counter;
 #define specpdl_depth() specpdl_depth_counter
 
+
+#define CHECK_FUNCTION(fun) do {               \
+ while (NILP (Ffunctionp (fun)))               \
+   signal_invalid_function_error (fun);                \
+ } while (0)
+
 \f
 /************************************************************************/
 /*                        Checking for QUIT                            */
@@ -2049,6 +2057,9 @@ char *egetenv (const char *);
 /* Defined in console.c */
 void stuff_buffered_input (Lisp_Object);
 
+/* Defined in console-msw.c */
+EXFUN (Fmswindows_message_box, 3);
+
 /* Defined in data.c */
 DECLARE_DOESNT_RETURN (c_write_error (Lisp_Object));
 DECLARE_DOESNT_RETURN (lisp_write_error (Lisp_Object));
@@ -2127,6 +2138,7 @@ Lisp_Object decode_env_path (const char *, const char *);
 Lisp_Object decode_path (const char *);
 /* Nonzero means don't do interactive redisplay and don't change tty modes */
 extern int noninteractive, noninteractive1;
+extern int fatal_error_in_progress;
 extern int preparing_for_armageddon;
 extern int emacs_priority;
 extern int running_asynch_code;
@@ -2252,6 +2264,7 @@ void reset_this_command_keys (Lisp_Object, int);
 Lisp_Object enqueue_misc_user_event (Lisp_Object, Lisp_Object, Lisp_Object);
 Lisp_Object enqueue_misc_user_event_pos (Lisp_Object, Lisp_Object,
                                         Lisp_Object, int, int, int, int);
+extern int modifier_keys_are_sticky;
 
 /* Defined in event-Xt.c */
 void enqueue_Xt_dispatch_event (Lisp_Object event);
@@ -2642,6 +2655,7 @@ EXFUN (Fforward_char, 2);
 EXFUN (Fforward_line, 2);
 EXFUN (Ffset, 2);
 EXFUN (Ffuncall, MANY);
+EXFUN (Ffunctionp, 1);
 EXFUN (Fgeq, MANY);
 EXFUN (Fget, 3);
 EXFUN (Fget_buffer_process, 1);
@@ -2780,7 +2794,8 @@ EXFUN (Fvertical_motion, 3);
 EXFUN (Fwiden, 1);
 
 
-extern Lisp_Object Q_style, Qactually_requested, Qactivate_menubar_hook;
+extern Lisp_Object Q_style, Qabort, Qactually_requested;
+extern Lisp_Object Qactivate_menubar_hook;
 extern Lisp_Object Qafter, Qall, Qand;
 extern Lisp_Object Qarith_error, Qarrayp, Qassoc, Qat, Qautodetect, Qautoload;
 extern Lisp_Object Qbackground, Qbackground_pixmap, Qbad_variable, Qbefore;
@@ -2788,7 +2803,7 @@ extern Lisp_Object Qbeginning_of_buffer, Qbig5, Qbinary;
 extern Lisp_Object Qbitmap, Qbitp, Qblinking;
 extern Lisp_Object Qboolean, Qbottom, Qbottom_margin, Qbuffer;
 extern Lisp_Object Qbuffer_glyph_p, Qbuffer_live_p, Qbuffer_read_only, Qbutton;
-extern Lisp_Object Qbyte_code, Qcall_interactively, Qcategory;
+extern Lisp_Object Qbyte_code, Qcall_interactively, Qcancel, Qcategory;
 extern Lisp_Object Qcategory_designator_p, Qcategory_table_value_p, Qccl, Qcdr;
 extern Lisp_Object Qchannel, Qchar, Qchar_or_string_p, Qcharacter, Qcharacterp;
 extern Lisp_Object Qchars, Qcharset_g0, Qcharset_g1, Qcharset_g2, Qcharset_g3;
@@ -2813,8 +2828,9 @@ extern Lisp_Object Qfont, Qforce_g0_on_output, Qforce_g1_on_output;
 extern Lisp_Object Qforce_g2_on_output, Qforce_g3_on_output, Qforeground;
 extern Lisp_Object Qformat, Qframe, Qframe_live_p, Qfuncall, Qfunction;
 extern Lisp_Object Qgap_overhead, Qgeneric, Qgeometry, Qglobal, Qheight;
-extern Lisp_Object Qhighlight, Qhorizontal, Qicon;
-extern Lisp_Object Qicon_glyph_p, Qid, Qidentity, Qimage, Qinfo, Qinherit;
+extern Lisp_Object Qhelp, Qhighlight, Qhorizontal, Qicon;
+extern Lisp_Object Qicon_glyph_p, Qid, Qidentity, Qignore, Qimage, Qinfo;
+extern Lisp_Object Qinherit;
 extern Lisp_Object Qinhibit_quit, Qinhibit_read_only;
 extern Lisp_Object Qinput_charset_conversion, Qinteger;
 extern Lisp_Object Qinteger_char_or_marker_p, Qinteger_or_char_p;
@@ -2830,12 +2846,13 @@ extern Lisp_Object Qmenubar;
 extern Lisp_Object Qmax, Qmemory, Qmessage, Qminus, Qmnemonic, Qmodifiers;
 extern Lisp_Object Qmono_pixmap_image_instance_p, Qmotion;
 extern Lisp_Object Qmouse_leave_buffer_hook, Qmsprinter, Qmswindows;
-extern Lisp_Object Qname, Qnas, Qnatnump;
-extern Lisp_Object Qno_ascii_cntl, Qno_ascii_eol, Qno_catch;
+extern Lisp_Object Qname, Qnas, Qnatnump, Qnative_layout;
+extern Lisp_Object Qno, Qno_ascii_cntl, Qno_ascii_eol, Qno_catch;
 extern Lisp_Object Qno_conversion, Qno_iso6429, Qnone, Qnot, Qnothing;
 extern Lisp_Object Qnothing_image_instance_p, Qnotice;
 extern Lisp_Object Qnumber_char_or_marker_p, Qnumberp;
-extern Lisp_Object Qobject, Qold_assoc, Qold_delete, Qold_delq, Qold_rassoc;
+extern Lisp_Object Qobject, Qok, Qold_assoc, Qold_delete, Qold_delq;
+extern Lisp_Object Qold_rassoc;
 extern Lisp_Object Qold_rassq, Qonly, Qor, Qother;
 extern Lisp_Object Qorientation, Qoutput_charset_conversion;
 extern Lisp_Object Qoverflow_error, Qpoint, Qpointer, Qpointer_glyph_p;
@@ -2845,7 +2862,7 @@ extern Lisp_Object Qprint_string_length, Qprocess, Qprogn, Qprovide, Qquit;
 extern Lisp_Object Qquote, Qrange_error, Qrassoc, Qrassq, Qread_char;
 extern Lisp_Object Qread_from_minibuffer, Qreally_early_error_handler;
 extern Lisp_Object Qregion_beginning, Qregion_end, Qrequire, Qresource;
-extern Lisp_Object Qreturn, Qreverse, Qright, Qright_margin;
+extern Lisp_Object Qretry, Qreturn, Qreverse, Qright, Qright_margin;
 extern Lisp_Object Qrun_hooks, Qsans_modifiers;
 extern Lisp_Object Qsave_buffers_kill_emacs, Qsearch, Qselected;
 extern Lisp_Object Qself_insert_command, Qself_insert_defer_undo;
@@ -2866,7 +2883,7 @@ extern Lisp_Object Qvariable_documentation, Qvariable_domain, Qvertical;
 extern Lisp_Object Qvoid_function, Qvoid_variable, Qwarning;
 extern Lisp_Object Qwidth, Qwidget, Qwindow;
 extern Lisp_Object Qwindow_live_p, Qwindow_system, Qwrong_number_of_arguments;
-extern Lisp_Object Qwrong_type_argument, Qx, Qy, Qyes_or_no_p;
+extern Lisp_Object Qwrong_type_argument, Qx, Qy, Qyes, Qyes_or_no_p;
 extern Lisp_Object Vactivate_menubar_hook, Vascii_canon_table;
 extern Lisp_Object Vascii_downcase_table, Vascii_eqv_table;
 extern Lisp_Object Vascii_upcase_table, Vautoload_queue, Vblank_menubar;
index bd14ddc..bf46ba2 100644 (file)
--- a/src/nt.c
+++ b/src/nt.c
@@ -47,8 +47,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include <stdlib.h>
 #include <stdio.h>
 
-#include <windows.h>
-#include <mmsystem.h>
+#include "syswindows.h"
 
 #include "nt.h"
 #include <sys/dir.h>
@@ -2004,9 +2003,15 @@ int setitimer (int kind, const struct itimerval* itnew,
     return errno = EINVAL;
 }
 
+\f
+/*--------------------------------------------------------------------*/
+/*                        Memory-mapped files                         */
+/*--------------------------------------------------------------------*/
+
 int
 open_input_file (file_data *p_file, const char *filename)
 {
+  /* Synched with FSF 20.6.  We fixed some warnings. */
   HANDLE file;
   HANDLE file_mapping;
   void  *file_base;
@@ -2036,6 +2041,179 @@ open_input_file (file_data *p_file, const char *filename)
   return TRUE;
 }
 
+int
+open_output_file (file_data *p_file, const char *filename, unsigned long size)
+{
+  /* Synched with FSF 20.6.  We fixed some warnings. */
+  HANDLE file;
+  HANDLE file_mapping;
+  void  *file_base;
+
+  file = CreateFile (filename, GENERIC_READ | GENERIC_WRITE, 0, NULL,
+                    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
+  if (file == INVALID_HANDLE_VALUE) 
+    return FALSE;
+
+  file_mapping = CreateFileMapping (file, NULL, PAGE_READWRITE, 
+                                   0, size, NULL);
+  if (!file_mapping) 
+    return FALSE;
+  
+  file_base = MapViewOfFile (file_mapping, FILE_MAP_WRITE, 0, 0, size);
+  if (file_base == NULL) 
+    return FALSE;
+  
+  p_file->name = filename;
+  p_file->size = size;
+  p_file->file = file;
+  p_file->file_mapping = file_mapping;
+  p_file->file_base = (char*) file_base;
+
+  return TRUE;
+}
+
+#if 1 /* !defined(__MINGW32__) */
+/* Return pointer to section header for section containing the given
+   relative virtual address. */
+static IMAGE_SECTION_HEADER *
+rva_to_section (DWORD rva, IMAGE_NT_HEADERS * nt_header)
+{
+  /* Synched with FSF 20.6.  We added MINGW32 stuff. */
+  PIMAGE_SECTION_HEADER section;
+  int i;
+
+  section = IMAGE_FIRST_SECTION (nt_header);
+
+  for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++)
+    {
+      /* Some linkers (eg. the NT SDK linker I believe) swapped the
+        meaning of these two values - or rather, they ignored
+        VirtualSize entirely and always set it to zero.  This affects
+        some very old exes (eg. gzip dated Dec 1993).  Since
+        mswindows_executable_type relies on this function to work reliably,
+        we need to cope with this.  */
+      DWORD real_size = max (section->SizeOfRawData,
+                            section->Misc.VirtualSize);
+      if (rva >= section->VirtualAddress
+         && rva < section->VirtualAddress + real_size)
+       return section;
+      section++;
+    }
+  return NULL;
+}
+#endif
+
+void
+mswindows_executable_type (const char * filename, int * is_dos_app,
+                          int * is_cygnus_app)
+{
+  /* Synched with FSF 20.6.  We added MINGW32 stuff and casts. */
+  file_data executable;
+  char * p;
+
+  /* Default values in case we can't tell for sure.  */
+  *is_dos_app = FALSE;
+  *is_cygnus_app = FALSE;
+
+  if (!open_input_file (&executable, filename))
+    return;
+
+  p = strrchr (filename, '.');
+
+  /* We can only identify DOS .com programs from the extension. */
+  if (p && stricmp (p, ".com") == 0)
+    *is_dos_app = TRUE;
+  else if (p && (stricmp (p, ".bat") == 0 ||
+                stricmp (p, ".cmd") == 0))
+    {
+      /* A DOS shell script - it appears that CreateProcess is happy to
+        accept this (somewhat surprisingly); presumably it looks at
+        COMSPEC to determine what executable to actually invoke.
+        Therefore, we have to do the same here as well. */
+      /* Actually, I think it uses the program association for that
+        extension, which is defined in the registry.  */
+      p = egetenv ("COMSPEC");
+      if (p)
+       mswindows_executable_type (p, is_dos_app, is_cygnus_app);
+    }
+  else
+    {
+      /* Look for DOS .exe signature - if found, we must also check that
+        it isn't really a 16- or 32-bit Windows exe, since both formats
+        start with a DOS program stub.  Note that 16-bit Windows
+        executables use the OS/2 1.x format. */
+
+#if 0 /* defined( __MINGW32__ ) */
+      /* mingw32 doesn't have enough headers to detect cygwin
+        apps, just do what we can. */
+      FILHDR * exe_header;
+
+      exe_header = (FILHDR*) executable.file_base;
+      if (exe_header->e_magic != DOSMAGIC)
+       goto unwind;
+
+      if ((char*) exe_header->e_lfanew > (char*) executable.size)
+       {
+         /* Some dos headers (pkunzip) have bogus e_lfanew fields.  */
+         *is_dos_app = TRUE;
+       } 
+      else if (exe_header->nt_signature != NT_SIGNATURE)
+       {
+         *is_dos_app = TRUE;
+       }
+#else
+      IMAGE_DOS_HEADER * dos_header;
+      IMAGE_NT_HEADERS * nt_header;
+
+      dos_header = (PIMAGE_DOS_HEADER) executable.file_base;
+      if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
+       goto unwind;
+         
+      nt_header = (PIMAGE_NT_HEADERS) ((char*) dos_header + dos_header->e_lfanew);
+         
+      if ((char*) nt_header > (char*) dos_header + executable.size) 
+       {
+         /* Some dos headers (pkunzip) have bogus e_lfanew fields.  */
+         *is_dos_app = TRUE;
+       } 
+      else if (nt_header->Signature != IMAGE_NT_SIGNATURE &&
+              LOWORD (nt_header->Signature) != IMAGE_OS2_SIGNATURE)
+       {
+         *is_dos_app = TRUE;
+       }
+      else if (nt_header->Signature == IMAGE_NT_SIGNATURE)
+       {
+         /* Look for cygwin.dll in DLL import list. */
+         IMAGE_DATA_DIRECTORY import_dir =
+           nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
+         IMAGE_IMPORT_DESCRIPTOR * imports;
+         IMAGE_SECTION_HEADER * section;
+
+         section = rva_to_section (import_dir.VirtualAddress, nt_header);
+         imports = (IMAGE_IMPORT_DESCRIPTOR *) RVA_TO_PTR (import_dir.VirtualAddress,
+                                                           section, executable);
+             
+         for ( ; imports->Name; imports++)
+           {
+             char *dllname = (char*) RVA_TO_PTR (imports->Name, section, executable);
+
+             /* The exact name of the cygwin dll has changed with
+                various releases, but hopefully this will be reasonably
+                future proof.  */
+             if (strncmp (dllname, "cygwin", 6) == 0)
+               {
+                 *is_cygnus_app = TRUE;
+                 break;
+               }
+           }
+       }
+#endif
+    }
+
+ unwind:
+  close_file_data (&executable);
+}
+
 /* Close the system structures associated with the given file.  */
 void
 close_file_data (file_data *p_file)
index a20a68d..edc1333 100644 (file)
--- a/src/nt.h
+++ b/src/nt.h
@@ -40,41 +40,6 @@ Boston, MA 02111-1307, USA.  */
 #define X_OK 1
 #define F_OK 0
 
-/* File descriptor set emulation.  */
-
-#if 0 /* These are defined in winsock.h.
-        FD_SETSIZE is defined 64. Let's not full the runtime. */
-
-/* The MSVC multithreaded statically-linked runtime library has limit
-   of 256 descriptors by default (the single-threaded static library
-   has a limit of 64 descriptors, and the DLL versions both have a
-   limit of 512).  Beware.  Should this be set to 512?  */
-#define FD_SETSIZE  256
-typedef struct {
-  unsigned int bits[FD_SETSIZE / 32];
-} fd_set;
-
-/* standard access macros */
-#define FD_SET(n, p) \
-  do { \
-    if ((n) < FD_SETSIZE) { \
-      (p)->bits[(n)/32] |= (1 << (n)%32); \
-    } \
-  } while (0)
-#define FD_CLR(n, p) \
-  do { \
-    if ((n) < FD_SETSIZE) { \
-      (p)->bits[(n)/32] &= ~(1 << (n)%32); \
-    } \
-  } while (0)
-#define FD_ISSET(n, p) ((n) < FD_SETSIZE ? ((p)->bits[(n)/32] & (1 << (n)%32)) : 0)
-#define FD_ZERO(p) memset((p), 0, sizeof(fd_set))
-
-#define SELECT_TYPE fd_set
-#define MAXDESC FD_SETSIZE
-
-#endif /* 0 */
-
 /* ------------------------------------------------------------------------- */
 
 /* child_process.status values */
@@ -113,7 +78,7 @@ typedef struct
   child_process *  cp;
 } filedesc;
 
-extern filedesc fd_info [ MAXDESC ];
+extern filedesc fd_info [];
 
 /* fd_info flag definitions */
 #define FILE_READ    0x0001
@@ -147,7 +112,37 @@ extern LPBYTE nt_get_resource (char * key, LPDWORD type);
 void set_process_dir (const char * dir);
 time_t convert_time (FILETIME ft);
 
-extern void init_ntproc ();
+extern void init_ntproc (void);
 extern void term_ntproc (int unused);
 
+/* ----------------------------------------------------------------- */
+/* Useful routines for manipulating memory-mapped files. */
+
+typedef struct file_data
+{
+  const char    *name;
+  unsigned long  size;
+  HANDLE         file;
+  HANDLE         file_mapping;
+  char *file_base;
+} file_data;
+
+#define OFFSET_TO_RVA(var,section) \
+         (section->VirtualAddress + ((DWORD)(var) - section->PointerToRawData))
+
+#define RVA_TO_OFFSET(var,section) \
+         (section->PointerToRawData + ((DWORD)(var) - section->VirtualAddress))
+
+#define RVA_TO_PTR(var,section,filedata) \
+         ((void *)(RVA_TO_OFFSET(var,section) + (filedata).file_base))
+
+int open_input_file (file_data *p_file, const char *name);
+int open_output_file (file_data *p_file, const char *name, unsigned long size);
+void close_file_data (file_data *p_file);
+void mswindows_executable_type (const char * filename, int * is_dos_app,
+                               int * is_cygnus_app);
+
+/* In process-nt.c */
+extern int compare_env (const void *strp1, const void *strp2);
+
 #endif /* INCLUDED_nt_h_ */
index 9372dd1..6695203 100644 (file)
@@ -227,17 +227,44 @@ sbrk (unsigned long increment)
 void
 recreate_heap (char *executable_path)
 {
-  void *tmp;
-
   /* First reserve the upper part of our heap.  (We reserve first
-     because there have been problems in the past where doing the
-     mapping first has loaded DLLs into the VA space of our heap.)  */
-  tmp = VirtualAlloc ((void *) get_heap_end (),
-                     get_reserved_heap_size () - get_committed_heap_size (),
-                     MEM_RESERVE,
-                     PAGE_NOACCESS);
+        because there have been problems in the past where doing the
+        mapping first has loaded DLLs into the VA space of our heap.)  */
+
+  /* Query the region at the end of the committed heap */
+  void *tmp;
+  MEMORY_BASIC_INFORMATION info;
+  DWORD size;
+  unsigned char* base = get_heap_end ();
+  unsigned char* end  = base + get_reserved_heap_size () - get_committed_heap_size ();
+  VirtualQuery (base, &info, sizeof info);
+  if (info.State != MEM_FREE)
+       {
+         /* Oops, something has already reserved or commited it, nothing we can do but exit */
+         char buf[256];
+         wsprintf(buf,
+                          "XEmacs cannot start because the memory region required by the heap is not available.\n"
+                          "(BaseAddress = 0x%lx, AllocationBase = 0x%lx, Size = 0x%lx, State = %s, Type = %s)",
+                          info.BaseAddress, info.AllocationBase, info.RegionSize,
+                          info.State == MEM_COMMIT ? "COMMITED" : "RESERVED",
+                          info.Type == MEM_IMAGE ? "IMAGE" : info.Type == MEM_MAPPED ? "MAPPED" : "PRIVATE");
+         MessageBox(NULL, buf, "XEmacs", MB_OK | MB_ICONSTOP);
+         exit(1);
+       }
+
+  /* Now try and reserve as much as possible */
+  size = min (info.RegionSize, end - base);
+  tmp = VirtualAlloc (base, size, MEM_RESERVE, PAGE_NOACCESS);
   if (!tmp)
-    exit (1);
+       {
+         /* Can't reserve it, nothing we can do but exit */
+         char buf[256];
+         wsprintf(buf,
+                          "XEmacs cannot start because it couldn't reserve space required for the heap.\n"
+                          "(VirtualAlloc at 0x%lx of 0x%lx failed (%d))", base, size, GetLastError());
+         MessageBox(NULL, buf, "XEmacs", MB_OK | MB_ICONSTOP);
+         exit (1);
+       }
 
   /* We read in the data for the .bss section from the executable
      first and map in the heap from the executable second to prevent
index 091cf0c..8760f42 100644 (file)
@@ -76,28 +76,4 @@ extern void cache_system_info (void);
 extern unsigned char *round_to_next (unsigned char *address, 
                                     unsigned long align);
 
-/* ----------------------------------------------------------------- */
-/* Useful routines for manipulating memory-mapped files. */
-
-typedef struct file_data {
-  const char    *name;
-  unsigned long  size;
-  HANDLE         file;
-  HANDLE         file_mapping;
-  char *file_base;
-} file_data;
-
-#define OFFSET_TO_RVA(var,section) \
-         (section->VirtualAddress + ((DWORD)(var) - section->PointerToRawData))
-
-#define RVA_TO_OFFSET(var,section) \
-         (section->PointerToRawData + ((DWORD)(var) - section->VirtualAddress))
-
-#define RVA_TO_PTR(var,section,filedata) \
-         ((void *)(RVA_TO_OFFSET(var,section) + (filedata).file_base))
-
-int open_input_file (file_data *p_file, const char *name);
-int open_output_file (file_data *p_file, const char *name, unsigned long size);
-void close_file_data (file_data *p_file);
-
 #endif /* INCLUDED_ntheap_h_ */
index bbfa228..c19870d 100644 (file)
@@ -18,19 +18,13 @@ along with XEmacs; see the file COPYING.  If not, write to the Free
 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.*/
 
-#include <windows.h>
 #include <config.h>
 #include <stdio.h>
 #include "sysfile.h"
+#include "syswindows.h"
 #include "lisp.h"
 #include "nativesound.h"
 
-#if (defined (__CYGWIN32__) || defined(__MINGW32__)) && \
-       CYGWIN_VERSION_DLL_MAJOR < 21
-extern BOOL WINAPI PlaySound(LPCSTR,HMODULE,DWORD);
-#else
-#include <mmsystem.h>
-#endif
 static int play_sound_data_1 (unsigned char *data, int length,
                               int volume, int convert);
 
index a6159f4..eebf13f 100644 (file)
@@ -458,156 +458,6 @@ create_child (const char *exe, char *cmdline, char *env,
   return FALSE;
 }
 
-#ifndef __MINGW32__
-/* Return pointer to section header for section containing the given
-   relative virtual address. */
-static IMAGE_SECTION_HEADER *
-rva_to_section (DWORD rva, IMAGE_NT_HEADERS * nt_header)
-{
-  PIMAGE_SECTION_HEADER section;
-  int i;
-
-  section = IMAGE_FIRST_SECTION (nt_header);
-
-  for (i = 0; i < nt_header->FileHeader.NumberOfSections; i++)
-    {
-      if (rva >= section->VirtualAddress
-         && rva < section->VirtualAddress + section->SizeOfRawData)
-       return section;
-      section++;
-    }
-  return NULL;
-}
-#endif
-
-void
-win32_executable_type (const char * filename, int * is_dos_app, int * is_cygnus_app)
-{
-  file_data executable;
-  char * p;
-
-  /* Default values in case we can't tell for sure.  */
-  *is_dos_app = FALSE;
-  *is_cygnus_app = FALSE;
-
-  if (!open_input_file (&executable, filename))
-    return;
-
-  p = strrchr (filename, '.');
-
-      /* We can only identify DOS .com programs from the extension. */
-      if (p && stricmp (p, ".com") == 0)
-    *is_dos_app = TRUE;
-  else if (p && (stricmp (p, ".bat") == 0 ||
-                stricmp (p, ".cmd") == 0))
-    {
-      /* A DOS shell script - it appears that CreateProcess is happy to
-        accept this (somewhat surprisingly); presumably it looks at
-        COMSPEC to determine what executable to actually invoke.
-            Therefore, we have to do the same here as well. */
-      /* Actually, I think it uses the program association for that
-        extension, which is defined in the registry.  */
-      p = egetenv ("COMSPEC");
-      if (p)
-       win32_executable_type (p, is_dos_app, is_cygnus_app);
-    }
-      else
-       {
-      /* Look for DOS .exe signature - if found, we must also check that
-        it isn't really a 16- or 32-bit Windows exe, since both formats
-        start with a DOS program stub.  Note that 16-bit Windows
-        executables use the OS/2 1.x format. */
-
-#ifdef __MINGW32__
-         /* mingw32 doesn't have enough headers to detect cygwin
-             apps, just do what we can. */
-         FILHDR * exe_header;
-
-         exe_header = (FILHDR*) executable.file_base;
-         if (exe_header->e_magic != DOSMAGIC)
-           goto unwind;
-
-         if ((char*) exe_header->e_lfanew > (char*) executable.size)
-           {
-             /* Some dos headers (pkunzip) have bogus e_lfanew fields.  */
-             *is_dos_app = TRUE;
-           } 
-         else if (exe_header->nt_signature != NT_SIGNATURE)
-           {
-             *is_dos_app = TRUE;
-           }
-#else
-         IMAGE_DOS_HEADER * dos_header;
-         IMAGE_NT_HEADERS * nt_header;
-
-         dos_header = (PIMAGE_DOS_HEADER) executable.file_base;
-         if (dos_header->e_magic != IMAGE_DOS_SIGNATURE)
-           goto unwind;
-         
-         nt_header = (PIMAGE_NT_HEADERS) ((char*) dos_header + dos_header->e_lfanew);
-         
-         if ((char*) nt_header > (char*) dos_header + executable.size) 
-           {
-             /* Some dos headers (pkunzip) have bogus e_lfanew fields.  */
-             *is_dos_app = TRUE;
-           } 
-         else if (nt_header->Signature != IMAGE_NT_SIGNATURE &&
-                  LOWORD (nt_header->Signature) != IMAGE_OS2_SIGNATURE)
-           {
-             *is_dos_app = TRUE;
-           }
-         else if (nt_header->Signature == IMAGE_NT_SIGNATURE)
-           {
-             /* Look for cygwin.dll in DLL import list. */
-             IMAGE_DATA_DIRECTORY import_dir =
-               nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
-             IMAGE_IMPORT_DESCRIPTOR * imports;
-             IMAGE_SECTION_HEADER * section;
-
-             section = rva_to_section (import_dir.VirtualAddress, nt_header);
-             imports = (IMAGE_IMPORT_DESCRIPTOR *) RVA_TO_PTR (import_dir.VirtualAddress,
-                                                               section, executable);
-             
-             for ( ; imports->Name; imports++)
-               {
-                 char *dllname = (char*) RVA_TO_PTR (imports->Name, section, executable);
-
-                 if (strcmp (dllname, "cygwin.dll") == 0)
-                   {
-                     *is_cygnus_app = TRUE;
-                     break;
-                   }
-               }
-           }
-#endif
-       }
-
- unwind:
-      close_file_data (&executable);
-}
-
-int
-compare_env (const void *strp1, const void *strp2)
-{
-  const char *str1 = *(const char**)strp1, *str2 = *(const char**)strp2;
-
-  while (*str1 && *str2 && *str1 != '=' && *str2 != '=')
-    {
-      if ((*str1) > (*str2))
-       return 1;
-      else if ((*str1) < (*str2))
-       return -1;
-      str1++, str2++;
-    }
-
-  if (*str1 == '=' && *str2 == '=')
-    return 0;
-  else if (*str1 == '=')
-    return -1;
-  else
-    return 1;
-}
-
 void
 merge_and_sort_env (char **envp1, char **envp2, char **new_envp)
 {
@@ -691,7 +541,7 @@ sys_spawnve (int mode, const char *cmdname,
      was compiled with the Cygnus GNU toolchain and hence relies on
      cygwin.dll to parse the command line - we use this to decide how to
      escape quote chars in command line args that must be quoted). */
-  win32_executable_type (cmdname, &is_dos_app, &is_cygnus_app);
+  mswindows_executable_type (cmdname, &is_dos_app, &is_cygnus_app);
 
   /* On Windows 95, if cmdname is a DOS app, we invoke a helper
      application to start it by specifying the helper app as cmdname,
index 421bb51..cb3a864 100644 (file)
@@ -49,13 +49,6 @@ Boston, MA 02111-1307, USA.  */
 #include "device.h"
 #include "insdel.h"
 
-#if (defined(__CYGWIN32__) || defined(__MINGW32__)) && \
-       CYGWIN_VERSION_DLL_MAJOR < 21
-#define stricmp strcasecmp
-#define FONTENUMPROC FONTENUMEXPROC
-#define ntmTm ntmentm
-#endif
-
 typedef struct colormap_t 
 {
   const char *name;
index e91dbed..2c27ff2 100644 (file)
@@ -507,7 +507,7 @@ color_instantiate (Lisp_Object specifier, Lisp_Object matchspec,
 {
   /* When called, we're inside of call_with_suspended_errors(),
      so we can freely error. */
-  Lisp_Object device = DFW_DEVICE (domain);
+  Lisp_Object device = DOMAIN_DEVICE (domain);
   struct device *d = XDEVICE (device);
 
   if (COLOR_INSTANCEP (instantiator))
@@ -631,19 +631,7 @@ set_color_attached_to (Lisp_Object obj, Lisp_Object face, Lisp_Object property)
 DEFUN ("color-specifier-p", Fcolor_specifier_p, 1, 1, 0, /*
 Return t if OBJECT is a color specifier.
 
-Valid instantiators for color specifiers are:
-
--- a string naming a color (e.g. under X this might be "lightseagreen2"
-   or "#F534B2")
--- a color instance (use that instance directly if the device matches,
-   or use the string that generated it)
--- a vector of no elements (only on TTY's; this means to set no color
-   at all, thus using the "natural" color of the terminal's text)
--- a vector of one or two elements: a face to inherit from, and
-   optionally a symbol naming which property of that face to inherit,
-   either `foreground' or `background' (if omitted, defaults to the same
-   property that this color specifier is used for; if this specifier is
-   not part of a face, the instantiator would not be valid)
+See `make-color-specifier' for a description of possible color instantiators.
 */
        (object))
 {
@@ -706,7 +694,7 @@ font_instantiate (Lisp_Object specifier, Lisp_Object matchspec,
 {
   /* When called, we're inside of call_with_suspended_errors(),
      so we can freely error. */
-  Lisp_Object device = DFW_DEVICE (domain);
+  Lisp_Object device = DOMAIN_DEVICE (domain);
   struct device *d = XDEVICE (device);
   Lisp_Object instance;
 
@@ -841,16 +829,7 @@ set_font_attached_to (Lisp_Object obj, Lisp_Object face, Lisp_Object property)
 DEFUN ("font-specifier-p", Ffont_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is a font specifier.
 
-Valid instantiators for font specifiers are:
-
--- a string naming a font (e.g. under X this might be
-   "-*-courier-medium-r-*-*-*-140-*-*-*-*-iso8859-*" for a 14-point
-   upright medium-weight Courier font)
--- a font instance (use that instance directly if the device matches,
-   or use the string that generated it)
--- a vector of no elements (only on TTY's; this means to set no font
-   at all, thus using the "natural" font of the terminal's text)
--- a vector of one element (a face to inherit from)
+See `make-font-specifier' for a description of possible font instantiators.
 */
        (object))
 {
@@ -986,15 +965,8 @@ set_face_boolean_attached_to (Lisp_Object obj, Lisp_Object face,
 DEFUN ("face-boolean-specifier-p", Fface_boolean_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is a face-boolean specifier.
 
-Valid instantiators for face-boolean specifiers are
-
--- t or nil
--- a vector of two or three elements: a face to inherit from,
-   optionally a symbol naming the property of that face to inherit from
-   (if omitted, defaults to the same property that this face-boolean
-   specifier is used for; if this specifier is not part of a face,
-   the instantiator would not be valid), and optionally a value which,
-   if non-nil, means to invert the sense of the inherited property.
+See `make-face-boolean-specifier' for a description of possible
+face-boolean instantiators.
 */
        (object))
 {
index 1a6b627..c1ca13d 100644 (file)
                        is where architecture-independent files are
                        searched for.
 
-   PATH_LOCK           The name of the directory that contains lock files
-                       with which we record what files are being modified in 
-                       Emacs.  This directory should be writable by everyone.
-                       If this is specified, the string must end with a slash!
-
    PATH_INFO           This is where the info documentation is installed.
 
    PATH_INFOPATH       The default value of `Info-directory-list'.
 #define PATH_DATA "@ETCDIR@"
 #endif
 
-#ifdef LOCKDIR_USER_DEFINED
-#define PATH_LOCK "@LOCKDIR@"
-#endif
-
 #ifdef DOCDIR_USER_DEFINED
 #define PATH_DOC "@DOCDIR@"
 #endif
index 9ed4e8e..d2e92a8 100644 (file)
@@ -540,15 +540,15 @@ Poll an asynchronous connection for completion
        (conn))
 {
   PGconn *P;
-  PostgresPollingStatusType PS;
+  PostgresPollingStatusType polling_status;
 
   CHECK_PGCONN (conn);
 
   P = (XPGCONN (conn))->pgconn;
   CHECK_LIVE_CONNECTION (P);
 
-  PS = PQconnectPoll (P);
-  switch (PS)
+  polling_status = PQconnectPoll (P);
+  switch (polling_status)
     {
     case PGRES_POLLING_FAILED:
       /* Something Bad has happened */
@@ -566,7 +566,7 @@ Poll an asynchronous connection for completion
       return Qpgres_polling_active;
     default:
       /* they've added a new field we don't know about */
-      error ("Help!  Unknown status code %08x from backend!", PS);
+      error ("Help!  Unknown status code %08x from backend!", polling_status);
     }
 }
 
@@ -730,15 +730,15 @@ Poll an asynchronous reset for completion
        (conn))
 {
   PGconn *P;
-  PostgresPollingStatusType PS;
+  PostgresPollingStatusType polling_status;
 
   CHECK_PGCONN (conn);
 
   P = (XPGCONN (conn))->pgconn;
   CHECK_LIVE_CONNECTION (P);
 
-  PS = PQresetPoll (P);
-  switch (PS)
+  polling_status = PQresetPoll (P);
+  switch (polling_status)
     {
     case PGRES_POLLING_FAILED:
       /* Something Bad has happened */
@@ -756,7 +756,7 @@ Poll an asynchronous reset for completion
       return Qpgres_polling_active;
     default:
       /* they've added a new field we don't know about */
-      error ("Help!  Unknown status code %08x from backend!", PS);
+      error ("Help!  Unknown status code %08x from backend!", polling_status);
     }
 }
 #endif
index dfe2e1c..4d1664f 100644 (file)
@@ -106,6 +106,10 @@ FILE *termscript;  /* Stdio stream being used for copy of all output.  */
 
 int stdout_needs_newline;
 
+#ifdef WINDOWSNT
+static int no_useful_stderr;
+#endif
+
 static void
 std_handle_out_external (FILE *stream, Lisp_Object lstream,
                         const Extbyte *extptr, Extcount extlen,
@@ -117,9 +121,12 @@ std_handle_out_external (FILE *stream, Lisp_Object lstream,
   if (stream)
     {
 #ifdef WINDOWSNT
+      if (!no_useful_stderr)
+       no_useful_stderr = GetStdHandle (STD_ERROR_HANDLE) == 0 ? 1 : -1;
+
       /* we typically have no useful stdout/stderr under windows if we're
         being invoked graphically. */
-      if (!noninteractive)
+      if (!noninteractive || no_useful_stderr > 0)
        msw_output_console_string (extptr, extlen);
       else
 #endif
@@ -174,9 +181,16 @@ std_handle_out_va (FILE *stream, const char *fmt, va_list args)
   int retval;
 
   retval = vsprintf ((char *) kludge, fmt, args);
-  TO_EXTERNAL_FORMAT (DATA, (kludge, strlen ((char *) kludge)),
-                     ALLOCA, (extptr, extlen),
-                     Qnative);
+  if (initialized && !fatal_error_in_progress)
+    TO_EXTERNAL_FORMAT (DATA, (kludge, strlen ((char *) kludge)),
+                       ALLOCA, (extptr, extlen),
+                       Qnative);
+  else
+    {
+      extptr = (Extbyte *) kludge;
+      extlen = (Extcount) strlen ((char *) kludge);
+    }
+  
   std_handle_out_external (stream, Qnil, extptr, extlen, 1, 1);
   return retval;
 }
@@ -190,7 +204,10 @@ stderr_out (const char *fmt, ...)
   int retval;
   va_list args;
   va_start (args, fmt);
-  retval = std_handle_out_va (stderr, GETTEXT (fmt), args);
+  retval =
+    std_handle_out_va
+    (stderr, initialized && !fatal_error_in_progress ? GETTEXT (fmt) : fmt,
+     args);
   va_end (args);
   return retval;
 }
@@ -204,7 +221,10 @@ stdout_out (const char *fmt, ...)
   int retval;
   va_list args;
   va_start (args, fmt);
-  retval = std_handle_out_va (stdout, GETTEXT (fmt), args);
+  retval =
+    std_handle_out_va
+    (stdout, initialized && !fatal_error_in_progress ? GETTEXT (fmt) : fmt,
+     args);
   va_end (args);
   return retval;
 }
index 9839bdf..5518ccb 100644 (file)
@@ -26,9 +26,11 @@ Boston, MA 02111-1307, USA.  */
 #include <config.h>
 #include "lisp.h"
 
+#include "buffer.h"
 #include "console-msw.h"
 #include "hash.h"
 #include "lstream.h"
+#include "nt.h"
 #include "process.h"
 #include "procimpl.h"
 #include "sysdep.h"
@@ -45,9 +47,6 @@ Boston, MA 02111-1307, USA.  */
 /* Arbitrary size limit for code fragments passed to run_in_other_process */
 #define FRAGMENT_CODE_SIZE 32
 
-/* Bound by winnt.el */
-Lisp_Object Qnt_quote_process_args;
-
 /* Implementation-specific data. Pointed to by Lisp_Process->process_data */
 struct nt_process_data
 {
@@ -57,6 +56,10 @@ struct nt_process_data
   int need_enable_child_signals;
 };
 
+/* Control how args are quoted to ensure correct parsing by child
+   process. */
+Lisp_Object Vmswindows_quote_process_args;
+
 /* Control whether create_child causes the process to inherit Emacs'
    console window, or be given a new one of its own.  The default is
    nil, to allow multiple DOS programs to run on Win95.  Having separate
@@ -676,22 +679,49 @@ signal_cannot_launch (Lisp_Object image_file, DWORD err)
 }
 
 static void
-ensure_console_window_exists ()
+ensure_console_window_exists (void)
 {
   if (msw_windows9x_p ())
     msw_hide_console ();
 }
 
+int
+compare_env (const void *strp1, const void *strp2)
+{
+  const char *str1 = *(const char**)strp1, *str2 = *(const char**)strp2;
+
+  while (*str1 && *str2 && *str1 != '=' && *str2 != '=')
+    {
+      if ((*str1) > (*str2))
+       return 1;
+      else if ((*str1) < (*str2))
+       return -1;
+      str1++, str2++;
+    }
+
+  if (*str1 == '=' && *str2 == '=')
+    return 0;
+  else if (*str1 == '=')
+    return -1;
+  else
+    return 1;
+}
+
 static int
 nt_create_process (Lisp_Process *p,
                   Lisp_Object *argv, int nargv,
                   Lisp_Object program, Lisp_Object cur_dir)
 {
+  /* Synched up with sys_spawnve in FSF 20.6.  Significantly different
+     but still synchable. */
   HANDLE hmyshove, hmyslurp, hprocin, hprocout, hprocerr;
-  LPTSTR command_line;
+  Extbyte *command_line;
   BOOL do_io, windowed;
   char *proc_env;
 
+  /* No need to DOS-ize the filename; expand-file-name (called prior)
+     already does this. */
+
   /* Find out whether the application is windowed or not */
   {
     /* SHGetFileInfo tends to return ERROR_FILE_NOT_FOUND on most
@@ -739,54 +769,258 @@ nt_create_process (Lisp_Process *p,
       CreatePipe (&hmyslurp, &hprocout, &sa, 0);
 
       /* Duplicate the stdout handle for use as stderr */
-      DuplicateHandle(GetCurrentProcess(), hprocout, GetCurrentProcess(), &hprocerr,
-       0, TRUE, DUPLICATE_SAME_ACCESS);
+      DuplicateHandle(GetCurrentProcess(), hprocout, GetCurrentProcess(),
+                     &hprocerr, 0, TRUE, DUPLICATE_SAME_ACCESS);
 
       /* Stupid Win32 allows to create a pipe with *both* ends either
         inheritable or not. We need process ends inheritable, and local
         ends not inheritable. */
-      DuplicateHandle (GetCurrentProcess(), hmyshove, GetCurrentProcess(), &htmp,
-                      0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
+      DuplicateHandle (GetCurrentProcess(), hmyshove, GetCurrentProcess(),
+                      &htmp, 0, FALSE,
+                      DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
       hmyshove = htmp;
-      DuplicateHandle (GetCurrentProcess(), hmyslurp, GetCurrentProcess(), &htmp,
-                      0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
+      DuplicateHandle (GetCurrentProcess(), hmyslurp, GetCurrentProcess(),
+                      &htmp, 0, FALSE,
+                      DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS);
       hmyslurp = htmp;
     }
 
-  /* Convert an argv vector into Win32 style command line by a call to
-     lisp function `nt-quote-process-args' which see (in winnt.el)*/
+  /* Convert an argv vector into Win32 style command line. */
   {
     int i;
-    Lisp_Object args_or_ret = Qnil;
-    struct gcpro gcpro1;
+    Bufbyte **quoted_args;
+    int is_dos_app, is_cygnus_app;
+    int do_quoting = 0;
+    char escape_char = 0;
+
+    nargv++; /* include program; we access argv offset by 1 below */
+    quoted_args = alloca_array (Bufbyte *, nargv);
+
+    /* Determine whether program is a 16-bit DOS executable, or a Win32
+       executable that is implicitly linked to the Cygnus dll (implying it
+       was compiled with the Cygnus GNU toolchain and hence relies on
+       cygwin.dll to parse the command line - we use this to decide how to
+       escape quote chars in command line args that must be quoted). */
+    mswindows_executable_type (XSTRING_DATA (program),
+                              &is_dos_app, &is_cygnus_app);
 
-    GCPRO1 (args_or_ret);
+#if 0
+    /* #### we need to port this. */
+    /* On Windows 95, if cmdname is a DOS app, we invoke a helper
+       application to start it by specifying the helper app as cmdname,
+       while leaving the real app name as argv[0].  */
+    if (is_dos_app)
+      {
+       cmdname = (char*) alloca (MAXPATHLEN);
+       if (egetenv ("CMDPROXY"))
+         strcpy ((char*)cmdname, egetenv ("CMDPROXY"));
+       else
+         {
+           strcpy ((char*)cmdname, XSTRING_DATA (Vinvocation_directory));
+           strcat ((char*)cmdname, "cmdproxy.exe");
+         }
+      }
+#endif
+  
+    /* we have to do some conjuring here to put argv and envp into the
+       form CreateProcess wants...  argv needs to be a space separated/null
+       terminated list of parameters, and envp is a null
+       separated/double-null terminated list of parameters.
+
+       Additionally, zero-length args and args containing whitespace or
+       quote chars need to be wrapped in double quotes - for this to work,
+       embedded quotes need to be escaped as well.  The aim is to ensure
+       the child process reconstructs the argv array we start with
+       exactly, so we treat quotes at the beginning and end of arguments
+       as embedded quotes.
+
+       The Win32 GNU-based library from Cygnus doubles quotes to escape
+       them, while MSVC uses backslash for escaping.  (Actually the MSVC
+       startup code does attempt to recognize doubled quotes and accept
+       them, but gets it wrong and ends up requiring three quotes to get a
+       single embedded quote!)  So by default we decide whether to use
+       quote or backslash as the escape character based on whether the
+       binary is apparently a Cygnus compiled app.
+
+       Note that using backslash to escape embedded quotes requires
+       additional special handling if an embedded quote is already
+       preceded by backslash, or if an arg requiring quoting ends with
+       backslash.  In such cases, the run of escape characters needs to be
+       doubled.  For consistency, we apply this special handling as long
+       as the escape character is not quote.
+   
+       Since we have no idea how large argv and envp are likely to be we
+       figure out list lengths on the fly and allocate them.  */
+  
+    if (!NILP (Vmswindows_quote_process_args))
+      {
+       do_quoting = 1;
+       /* Override escape char by binding mswindows-quote-process-args to
+          desired character, or use t for auto-selection.  */
+       if (INTP (Vmswindows_quote_process_args))
+         escape_char = (char) XINT (Vmswindows_quote_process_args);
+       else
+         escape_char = is_cygnus_app ? '"' : '\\';
+      }
+  
+    /* do argv...  */
+    for (i = 0; i < nargv; ++i)
+      {
+       Bufbyte *targ = XSTRING_DATA (i == 0 ? program : argv[i - 1]);
+       Bufbyte *p = targ;
+       int need_quotes = 0;
+       int escape_char_run = 0;
+       int arglen = 0;
+
+       if (*p == 0)
+         need_quotes = 1;
+       for ( ; *p; p++)
+         {
+           if (*p == '"')
+             {
+               /* allow for embedded quotes to be escaped */
+               arglen++;
+               need_quotes = 1;
+               /* handle the case where the embedded quote is already escaped */
+               if (escape_char_run > 0)
+                 {
+                   /* To preserve the arg exactly, we need to double the
+                      preceding escape characters (plus adding one to
+                      escape the quote character itself).  */
+                   arglen += escape_char_run;
+                 }
+             }
+           else if (*p == ' ' || *p == '\t')
+             {
+               need_quotes = 1;
+             }
+
+           if (*p == escape_char && escape_char != '"')
+             escape_char_run++;
+           else
+             escape_char_run = 0;
+         }
+       if (need_quotes)
+         {
+           arglen += 2;
+           /* handle the case where the arg ends with an escape char - we
+              must not let the enclosing quote be escaped.  */
+           if (escape_char_run > 0)
+             arglen += escape_char_run;
+         }
+       arglen += strlen (targ) + 1;
+
+       quoted_args[i] = alloca_array (Bufbyte, arglen); 
+      }
 
     for (i = 0; i < nargv; ++i)
-      args_or_ret = Fcons (*argv++, args_or_ret);
-    args_or_ret = Fnreverse (args_or_ret);
-    args_or_ret = Fcons (program, args_or_ret);
+      {
+       Bufbyte *targ = XSTRING_DATA (i == 0 ? program : argv[i - 1]);
+       Bufbyte *p = targ;
+       int need_quotes = 0;
+       Bufbyte *parg = quoted_args[i];
+
+       if (*p == 0)
+         need_quotes = 1;
 
-    args_or_ret = call1 (Qnt_quote_process_args, args_or_ret);
+       if (do_quoting)
+         {
+           for ( ; *p; p++)
+             if (*p == ' ' || *p == '\t' || *p == '"')
+               need_quotes = 1;
+         }
+       if (need_quotes)
+         {
+           int escape_char_run = 0;
+           Bufbyte * first;
+           Bufbyte * last;
+
+           p = targ;
+           first = p;
+           last = p + strlen (p) - 1;
+           *parg++ = '"';
+#if 0
+           /* This version does not escape quotes if they occur at the
+              beginning or end of the arg - this could lead to incorrect
+              behavior when the arg itself represents a command line
+              containing quoted args.  I believe this was originally done
+              as a hack to make some things work, before
+              `mswindows-quote-process-args' was added.  */
+           while (*p)
+             {
+               if (*p == '"' && p > first && p < last)
+                 *parg++ = escape_char;        /* escape embedded quotes */
+               *parg++ = *p++;
+             }
+#else
+           for ( ; *p; p++)
+             {
+               if (*p == '"')
+                 {
+                   /* double preceding escape chars if any */
+                   while (escape_char_run > 0)
+                     {
+                       *parg++ = escape_char;
+                       escape_char_run--;
+                     }
+                   /* escape all quote chars, even at beginning or end */
+                   *parg++ = escape_char;
+                 }
+               *parg++ = *p;
+
+               if (*p == escape_char && escape_char != '"')
+                 escape_char_run++;
+               else
+                 escape_char_run = 0;
+             }
+           /* double escape chars before enclosing quote */
+           while (escape_char_run > 0)
+             {
+               *parg++ = escape_char;
+               escape_char_run--;
+             }
+#endif
+           *parg++ = '"';
+         }
+       else
+         {
+           strcpy (parg, targ);
+           parg += strlen (targ);
+         }
+       *parg = '\0';
+      }
 
-    if (!STRINGP (args_or_ret))
-      /* Luser wrote his/her own clever version */
-      error ("Bogus return value from `nt-quote-process-args'");
+    {
+      int total_cmdline_len = 0;
+      Extcount *extargcount = (Extcount *) alloca_array (Extcount, nargv);
+      Extbyte **extarg = (Extbyte **) alloca_array (Extbyte *, nargv);
+      Extbyte *command_ptr;
 
-    command_line = alloca_array (char, (XSTRING_LENGTH (program)
-                                       + XSTRING_LENGTH (args_or_ret) + 2));
-    strcpy (command_line, XSTRING_DATA (program));
-    strcat (command_line, " ");
-    strcat (command_line, XSTRING_DATA (args_or_ret));
+      for (i = 0; i < nargv; ++i)
+       {
+         TO_EXTERNAL_FORMAT (C_STRING, quoted_args[i], ALLOCA,
+                             (extarg[i], extargcount[i]), Qmswindows_tstr);
+         /* account for space and terminating null */
+         total_cmdline_len += extargcount[i] + EITCHAR_SIZE;
+       }
 
-    UNGCPRO; /* args_or_ret */
+      command_line = alloca_array (char, total_cmdline_len);
+      command_ptr = command_line;
+      for (i = 0; i < nargv; ++i)
+       {
+         memcpy (command_ptr, extarg[i], extargcount[i]);
+         command_ptr += extargcount[i];
+         EICOPY_TCHAR (command_ptr, ' ');
+         command_ptr += EITCHAR_SIZE;
+       }
+      EICOPY_TCHAR (command_ptr, '\0');
+      command_ptr += EITCHAR_SIZE;
+    }
   }
-
   /* Set `proc_env' to a nul-separated array of the strings in
      Vprocess_environment terminated by 2 nuls.  */
  
   {
-    extern int compare_env (const char **strp1, const char **strp2);
     char **env;
     REGISTER Lisp_Object tem;
     REGISTER char **new_env;
@@ -798,6 +1032,17 @@ nt_create_process (Lisp_Process *p,
          && STRINGP (XCAR (tem)));
         tem = XCDR (tem))
       new_length++;
+
+    /* FSF adds an extra env var to hold the current process ID of the
+       Emacs process.  Apparently this is used only by emacsserver.c,
+       which we have superseded to gnuserv.c. (#### Does it work under
+       MS Windows?)
+
+       sprintf (ppid_env_var_buffer, "EM_PARENT_PROCESS_ID=%d", 
+         GetCurrentProcessId ());
+       arglen += strlen (ppid_env_var_buffer) + 1;
+       numenv++;
+    */
     
     /* new_length + 1 to include terminating 0.  */
     env = new_env = alloca_array (char *, new_length + 1);
@@ -1082,7 +1327,7 @@ nt_kill_child_process (Lisp_Object proc, int signo,
 }
 
 /*
- * Kill any process in the system given its PID.
+ * Kill any process in the system given its PID
  *
  * Returns zero if a signal successfully sent, or
  * negative number upon failure
@@ -1339,12 +1584,25 @@ process_type_create_nt (void)
 void
 syms_of_process_nt (void)
 {
-  defsymbol (&Qnt_quote_process_args, "nt-quote-process-args");
 }
 
 void
 vars_of_process_nt (void)
 {
+  DEFVAR_LISP ("mswindows-quote-process-args",
+              &Vmswindows_quote_process_args /*
+Non-nil enables quoting of process arguments to ensure correct parsing.
+Because Windows does not directly pass argv arrays to child processes,
+programs have to reconstruct the argv array by parsing the command
+line string.  For an argument to contain a space, it must be enclosed
+in double quotes or it will be parsed as multiple arguments.
+
+If the value is a character, that character will be used to escape any
+quote characters that appear, otherwise a suitable escape character
+will be chosen based on the type of the program (normal or Cygwin).
+*/ );                                                            
+  Vmswindows_quote_process_args = Qt;
+
   DEFVAR_LISP ("mswindows-start-process-share-console",
               &Vmswindows_start_process_share_console /*
 When nil, new child processes are given a new console.
index f5e5dae..774f53a 100644 (file)
@@ -1073,24 +1073,25 @@ See `set-process-filter' for more info on filter functions.
   return XPROCESS (proc)->filter;
 }
 
-DEFUN ("process-send-region", Fprocess_send_region, 3, 3, 0, /*
-Send current contents of region as input to PROCESS.
+DEFUN ("process-send-region", Fprocess_send_region, 3, 4, 0, /*
+Send current contents of the region between START and END as input to PROCESS.
 PROCESS may be a process name or an actual process.
-Called from program, takes three arguments, PROCESS, START and END.
+BUFFER specifies the buffer to look in; if nil, the current buffer is used.
 If the region is more than 500 or so characters long,
 it is sent in several bunches.  This may happen even for shorter regions.
 Output from processes can arrive in between bunches.
 */
-       (process, start, end))
+       (process, start, end, buffer))
 {
   /* This function can GC */
   Lisp_Object proc = get_process (process);
   Bufpos st, en;
+  struct buffer *buf = decode_buffer (buffer, 0);
 
-  get_buffer_range_char (current_buffer, start, end, &st, &en, 0);
+  XSETBUFFER (buffer, buf);
+  get_buffer_range_char (buf, start, end, &st, &en, 0);
 
-  send_process (proc, Fcurrent_buffer (), 0,
-                st, en - st);
+  send_process (proc, buffer, 0, st, en - st);
   return Qnil;
 }
 
index fc29885..a8556d2 100644 (file)
@@ -443,10 +443,47 @@ Flush TABLE.
 DEFUN ("map-range-table", Fmap_range_table, 2, 2, 0, /*
 Map FUNCTION over entries in TABLE, calling it with three args,
 the beginning and end of the range and the corresponding value.
+
+Results are guaranteed to be correct (i.e. each entry processed
+exactly once) if FUNCTION modifies or deletes the current entry
+(i.e. passes the current range to `put-range-table' or
+`remove-range-table'), but not otherwise.
 */
        (function, table))
 {
-  error ("not yet implemented");
+  Lisp_Range_Table *rt;
+  int i;
+
+  CHECK_RANGE_TABLE (table);
+  CHECK_FUNCTION (function);
+
+  rt = XRANGE_TABLE (table);
+
+  /* Do not "optimize" by pulling out the length computation below!
+     FUNCTION may have changed the table. */
+  for (i = 0; i < Dynarr_length (rt->entries); i++)
+    {
+      struct range_table_entry *entry = Dynarr_atp (rt->entries, i);
+      EMACS_INT first, last;
+      Lisp_Object args[4];
+      int oldlen;
+      
+    again:
+      first = entry->first;
+      last = entry->last;
+      oldlen = Dynarr_length (rt->entries);
+      args[0] = function;
+      args[1] = make_int (first);
+      args[2] = make_int (last);
+      args[3] = entry->val;
+      Ffuncall (countof (args), args);
+      /* Has FUNCTION removed the entry? */
+      if (oldlen > Dynarr_length (rt->entries)
+         && i < Dynarr_length (rt->entries)
+         && (first != entry->first || last != entry->last))
+       goto again;
+      }
+
   return Qnil;
 }
 
index 9af4b5e..dc0ea8b 100644 (file)
@@ -957,23 +957,31 @@ mswindows_eol_cursor_width (void)
 }
 
 /*****************************************************************************
- mswindows_output_begin
+ mswindows_frame_output_begin
 
  Perform any necessary initialization prior to an update.
  ****************************************************************************/
 static void
-mswindows_output_begin (struct device *d)
+mswindows_frame_output_begin (struct frame *f)
 {
 }
 
 /*****************************************************************************
- mswindows_output_end
+ mswindows_frame_output_end
 
  Perform any necessary flushing of queues when an update has completed.
  ****************************************************************************/
 static void
-mswindows_output_end (struct device *d)
+mswindows_frame_output_end (struct frame *f)
 {
+  HDWP hdwp = FRAME_MSWINDOWS_DATA (f)->hdwp;
+
+  if (hdwp != 0)
+    {
+      EndDeferWindowPos (hdwp);
+      FRAME_MSWINDOWS_DATA (f)->hdwp = 0;
+    }
+
   GdiFlush();
 }
 
@@ -1157,8 +1165,19 @@ mswindows_output_display_block (struct window *w, struct display_line *dl, int b
                                                 findex, 0, 1);
                      break;
                      
-                   case IMAGE_SUBWINDOW:
                    case IMAGE_WIDGET:
+                     if (EQ (XIMAGE_INSTANCE_WIDGET_TYPE (instance),
+                             Qlayout))
+                       {
+                         redisplay_output_layout (w, instance, &dbox, &dga, findex,
+                                                  cursor_start, cursor_width,
+                                                  cursor_height);
+                         if (rb->cursor_type == CURSOR_ON)
+                           mswindows_output_cursor (w, dl, xpos, cursor_width,
+                                                    findex, 0, 1);
+                         break;
+                       }
+                   case IMAGE_SUBWINDOW:
                      redisplay_output_subwindow (w, instance, &dbox, &dga, findex,
                                                  cursor_start, cursor_width,
                                                  cursor_height);
@@ -1167,15 +1186,6 @@ mswindows_output_display_block (struct window *w, struct display_line *dl, int b
                                                 findex, 0, 1);
                      break;
                      
-                   case IMAGE_LAYOUT:
-                     redisplay_output_layout (w, instance, &dbox, &dga, findex,
-                                              cursor_start, cursor_width,
-                                              cursor_height);
-                     if (rb->cursor_type == CURSOR_ON)
-                       mswindows_output_cursor (w, dl, xpos, cursor_width,
-                                                findex, 0, 1);
-                     break;
-                     
                    case IMAGE_NOTHING:
                      /* nothing is as nothing does */
                      break;
@@ -1358,8 +1368,8 @@ console_type_create_redisplay_mswindows (void)
   CONSOLE_HAS_METHOD (mswindows, output_vertical_divider);
   CONSOLE_HAS_METHOD (mswindows, clear_region);
   CONSOLE_HAS_METHOD (mswindows, clear_frame);
-  CONSOLE_HAS_METHOD (mswindows, output_begin);
-  CONSOLE_HAS_METHOD (mswindows, output_end);
+  CONSOLE_HAS_METHOD (mswindows, frame_output_begin);
+  CONSOLE_HAS_METHOD (mswindows, frame_output_end);
   CONSOLE_HAS_METHOD (mswindows, flash);
   CONSOLE_HAS_METHOD (mswindows, ring_bell);
   CONSOLE_HAS_METHOD (mswindows, bevel_area);
@@ -1374,8 +1384,8 @@ console_type_create_redisplay_mswindows (void)
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_vertical_divider);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, clear_region);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, clear_frame);
-  CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_begin);
-  CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_end);
+  CONSOLE_INHERITS_METHOD (msprinter, mswindows, frame_output_begin);
+  CONSOLE_INHERITS_METHOD (msprinter, mswindows, frame_output_end);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, bevel_area);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_string);
   CONSOLE_INHERITS_METHOD (msprinter, mswindows, output_pixmap);
index ae45602..0994fb8 100644 (file)
@@ -250,6 +250,9 @@ compare_runes (struct window *w, struct rune *crb, struct rune *drb)
       XSETWINDOW (window, w);
       image = glyph_image_instance (crb->object.dglyph.glyph,
                                    window, ERROR_ME_NOT, 1);
+
+      if (!IMAGE_INSTANCEP (image))
+       return 0;
       ii = XIMAGE_INSTANCE (image);
 
       if (TEXT_IMAGE_INSTANCEP (image) && 
@@ -281,13 +284,7 @@ compare_runes (struct window *w, struct rune *crb, struct rune *drb)
          return 0;
        }
       else
-       {
-#ifdef DEBUG_WIDGET_OUTPUT
-         if (XIMAGE_INSTANCE_TYPE (image) == IMAGE_LAYOUT)
-           printf ("glyph layout %p considered unchanged\n", ii);
-#endif
-         return 1;
-       }
+       return 1;
     }
   /* We now do this last so that glyph checks can do their own thing
      for face changes. Face changes quite often happen when we are
@@ -901,7 +898,10 @@ redisplay_move_cursor (struct window *w, Bufpos new_point, int no_output_end)
     }
   else
     {
-      DEVMETH (d, output_begin, (d));
+      {
+       MAYBE_DEVMETH (d, frame_output_begin, (f));
+       MAYBE_DEVMETH (d, window_output_begin, (w));
+      }
       rb->cursor_type = CURSOR_OFF;
       dl->cursor_elt = -1;
       output_display_line (w, 0, cla, y, rb->xpos, rb->xpos + rb->width);
@@ -916,7 +916,10 @@ redisplay_move_cursor (struct window *w, Bufpos new_point, int no_output_end)
   if (w != XWINDOW (FRAME_SELECTED_WINDOW (device_selected_frame (d))))
     {
       if (!no_output_end)
-       DEVMETH (d, output_end, (d));
+       {
+         MAYBE_DEVMETH (d, window_output_end, (w));
+         MAYBE_DEVMETH (d, frame_output_end, (f));
+       }
 
       return 1;
     }
@@ -935,7 +938,10 @@ redisplay_move_cursor (struct window *w, Bufpos new_point, int no_output_end)
       output_display_line (w, 0, cla, y, rb->xpos, rb->xpos + rb->width);
 
       if (!no_output_end)
-       DEVMETH (d, output_end, (d));
+       {
+         MAYBE_DEVMETH (d, window_output_end, (w));
+         MAYBE_DEVMETH (d, frame_output_end, (f));
+       }
       return 1;
     }
   else
@@ -999,7 +1005,10 @@ redisplay_move_cursor (struct window *w, Bufpos new_point, int no_output_end)
                               make_int (ADJ_BUFPOS), w->buffer);
 
                  if (!no_output_end)
-                   DEVMETH (d, output_end, (d));
+                   {
+                     MAYBE_DEVMETH (d, window_output_end, (w));
+                     MAYBE_DEVMETH (d, frame_output_end, (f));
+                   }
                  return 1;
                }
 
@@ -1012,7 +1021,10 @@ redisplay_move_cursor (struct window *w, Bufpos new_point, int no_output_end)
     }
 
   if (!no_output_end)
-    DEVMETH (d, output_end, (d));
+    {
+      MAYBE_DEVMETH (d, window_output_end, (w));
+      MAYBE_DEVMETH (d, frame_output_end, (f));
+    }
   return 0;
 }
 #undef ADJ_BUFPOS
@@ -1067,12 +1079,18 @@ redraw_cursor_in_window (struct window *w, int run_end_begin_meths)
                     (f, dl->ypos - 1, rb->xpos));
 
       if (run_end_begin_meths)
-       DEVMETH (d, output_begin, (d));
+       {
+         MAYBE_DEVMETH (d, frame_output_begin, (f));
+         MAYBE_DEVMETH (d, window_output_begin, (w));
+       }
 
       output_display_line (w, 0, dla, y, rb->xpos, rb->xpos + rb->width);
 
       if (run_end_begin_meths)
-       DEVMETH (d, output_end, (d));
+       {
+         MAYBE_DEVMETH (d, window_output_end, (w));
+         MAYBE_DEVMETH (d, frame_output_end, (f));
+       }
     }
 }
 
@@ -1146,22 +1164,27 @@ redisplay_output_display_block (struct window *w, struct display_line *dl, int b
 static void redisplay_unmap_subwindows (struct frame* f, int x, int y, int width, int height,
                                        Lisp_Object ignored_window)
 {
-  int elt;
+  Lisp_Object rest;
 
-  for (elt = 0; elt < Dynarr_length (f->subwindow_cachels); elt++)
+  LIST_LOOP (rest, XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f)))
     {
-      struct subwindow_cachel *cachel =
-       Dynarr_atp (f->subwindow_cachels, elt);
+      Lisp_Image_Instance *ii = XIMAGE_INSTANCE (XCAR (rest));
 
-      if (cachel->being_displayed
+      if (IMAGE_INSTANCE_SUBWINDOW_DISPLAYEDP (ii)
          &&
-         cachel->x + cachel->width > x && cachel->x < x + width
+         IMAGE_INSTANCE_DISPLAY_X (ii)
+         + IMAGE_INSTANCE_DISPLAY_WIDTH (ii) > x 
+         && 
+         IMAGE_INSTANCE_DISPLAY_X (ii) < x + width
          &&
-         cachel->y + cachel->height > y && cachel->y < y + height
+         IMAGE_INSTANCE_DISPLAY_Y (ii)
+         + IMAGE_INSTANCE_DISPLAY_HEIGHT (ii) > y 
+         && 
+         IMAGE_INSTANCE_DISPLAY_Y (ii) < y + height
          &&
-         !EQ (cachel->subwindow, ignored_window))
+         !EQ (XCAR (rest), ignored_window))
        {
-         unmap_subwindow (cachel->subwindow);
+         unmap_subwindow (XCAR (rest));
        }
     }
 }
@@ -1174,7 +1197,7 @@ static void redisplay_unmap_subwindows (struct frame* f, int x, int y, int width
  ****************************************************************************/
 void redisplay_unmap_subwindows_maybe (struct frame* f, int x, int y, int width, int height)
 {
-  if (Dynarr_length (FRAME_SUBWINDOW_CACHE (f)))
+  if (!NILP (XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f))))
     {
       redisplay_unmap_subwindows (f, x, y, width, height, Qnil);
     }
@@ -1183,7 +1206,7 @@ void redisplay_unmap_subwindows_maybe (struct frame* f, int x, int y, int width,
 static void redisplay_unmap_subwindows_except_us (struct frame* f, int x, int y, int width,
                                                  int height, Lisp_Object subwindow)
 {
-  if (Dynarr_length (FRAME_SUBWINDOW_CACHE (f)))
+  if (!NILP (XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f))))
     {
       redisplay_unmap_subwindows (f, x, y, width, height, subwindow);
     }
@@ -1466,6 +1489,12 @@ redisplay_output_layout (struct window *w,
                  break;
 
                case IMAGE_WIDGET:
+                 if (EQ (IMAGE_INSTANCE_WIDGET_TYPE (childii), Qlayout))
+                   {
+                     redisplay_output_layout (w, child, &cdb, &cdga, findex,
+                                              0, 0, 0);
+                     break;
+                   }
                case IMAGE_SUBWINDOW:
                  if (!IMAGE_INSTANCE_OPTIMIZE_OUTPUT (childii) ||
                      IMAGE_INSTANCE_DIRTYP (childii))
@@ -1473,11 +1502,6 @@ redisplay_output_layout (struct window *w,
                                                0, 0, 0);
                  break;
 
-               case IMAGE_LAYOUT:
-                 redisplay_output_layout (w, child, &cdb, &cdga, findex,
-                                          0, 0, 0);
-                 break;
-
                case IMAGE_NOTHING:
                  /* nothing is as nothing does */
                  break;
@@ -2037,7 +2061,7 @@ redisplay_update_line (struct window *w, int first_line, int last_line,
   display_line_dynarr *cdla = window_display_lines (w, CURRENT_DISP);
   display_line_dynarr *ddla = window_display_lines (w, DESIRED_DISP);
 
-  DEVMETH (d, output_begin, (d));
+  MAYBE_DEVMETH (d, window_output_begin, (w));
 
   while (first_line <= last_line)
     {
@@ -2122,14 +2146,8 @@ redisplay_update_line (struct window *w, int first_line, int last_line,
   }
 #endif
 
-  /* This has to be done after we've updated the values.  We don't
-     call output_end for tty frames.  Redisplay will do this after all
-     tty windows have been updated.  This cuts down on cursor
-     flicker. */
-  if (FRAME_TTY_P (f))
-    redisplay_redraw_cursor (f, 0);
-  else
-    DEVMETH (d, output_end, (d));
+  redisplay_redraw_cursor (f, 0);
+  MAYBE_DEVMETH (d, window_output_end, (w));
 }
 
 /*****************************************************************************
@@ -2243,7 +2261,7 @@ redisplay_output_window (struct window *w)
     }
 
   /* Perform any output initialization. */
-  DEVMETH (d, output_begin, (d));
+  MAYBE_DEVMETH (d, window_output_begin, (w));
 
   /* If the window's structure has changed clear the internal border
      above it if it is topmost (the function will check). */
@@ -2266,7 +2284,7 @@ redisplay_output_window (struct window *w)
   if (window_needs_vertical_divider (w)
       && (f->windows_structure_changed || f->clear))
     {
-      DEVMETH (d, output_vertical_divider, (w, f->windows_structure_changed));
+      MAYBE_DEVMETH (d, output_vertical_divider, (w, f->windows_structure_changed));
     }
 
   /* Clear the rest of the window, if necessary. */
@@ -2300,13 +2318,8 @@ redisplay_output_window (struct window *w)
      get invalidated when it should be. */
   INVALIDATE_DEVICE_PIXEL_TO_GLYPH_CACHE (d);
 
-  /* We don't call output_end for tty frames.  Redisplay will do this
-     after all tty windows have been updated.  This cuts down on
-     cursor flicker. */
-  if (FRAME_TTY_P (f))
-    redisplay_redraw_cursor (f, 0);
-  else
-    DEVMETH (d, output_end, (d));
+  redisplay_redraw_cursor (f, 0);
+  MAYBE_DEVMETH (d, window_output_end, (w));
 
 #ifdef HAVE_SCROLLBARS
   update_window_scrollbars (w, NULL, !MINI_WINDOW_P (w), 0);
index 42d18b9..6794bdb 100644 (file)
@@ -138,39 +138,40 @@ tty_eol_cursor_width (void)
 }
 
 /*****************************************************************************
- tty_output_begin
+ tty_frame_output_begin
 
  Perform any necessary initialization prior to an update.
  ****************************************************************************/
 #ifdef DEBUG_XEMACS
-void tty_output_begin (struct device *d);
+void tty_frame_output_begin (struct frame *f);
 void
 #else
 static void
 #endif
-tty_output_begin (struct device *d)
+tty_frame_output_begin (struct frame *f)
 {
 #ifndef HAVE_TERMIOS
   /* Termcap requires `ospeed' to be a global variable so we have to
      always set it for whatever tty console we are actually currently
      working with. */
-  ospeed = DEVICE_TTY_DATA (d)->ospeed;
+  ospeed = DEVICE_TTY_DATA (XDEVICE (FRAME_DEVICE (f)))->ospeed;
 #endif
 }
 
 /*****************************************************************************
- tty_output_end
+ tty_frame_output_end
 
  Perform any necessary flushing of queues when an update has completed.
  ****************************************************************************/
 #ifdef DEBUG_XEMACS
-void tty_output_end (struct device *d);
+void tty_frame_output_end (struct frame *f);
 void
 #else
 static void
 #endif
-tty_output_end (struct device *d)
+tty_frame_output_end (struct frame *f)
 {
+  struct device *d = XDEVICE (FRAME_DEVICE (f));
   struct console *c = XCONSOLE (DEVICE_CONSOLE (d));
 
   CONSOLE_TTY_CURSOR_X (c) = CONSOLE_TTY_FINAL_CURSOR_X (c);
@@ -340,20 +341,19 @@ tty_output_display_block (struct window *w, struct display_line *dl, int block,
                    case IMAGE_COLOR_PIXMAP:
                    case IMAGE_SUBWINDOW:
                    case IMAGE_WIDGET:
-                   case IMAGE_LAYOUT:
                      /* just do nothing here */
                      break;
-                     
+
                    case IMAGE_NOTHING:
                      /* nothing is as nothing does */
                      break;
-                     
+
                    case IMAGE_TEXT:
                    case IMAGE_POINTER:
                    default:
                      abort ();
                    }
-                 IMAGE_INSTANCE_OPTIMIZE_OUTPUT 
+                 IMAGE_INSTANCE_OPTIMIZE_OUTPUT
                    (XIMAGE_INSTANCE (instance)) = 0;
                }
 
@@ -887,7 +887,7 @@ reset_tty_modes (struct console *c)
   OUTPUT1_IF (c, TTY_SD (c).keypad_off);
   OUTPUT1_IF (c, TTY_SD (c).cursor_normal);
   OUTPUT1_IF (c, TTY_SD (c).end_motion);
-  tty_output_end (XDEVICE (CONSOLE_SELECTED_DEVICE (c)));
+  tty_frame_output_end (XFRAME (CONSOLE_SELECTED_FRAME (c)));
 }
 
 /*****************************************************************************
@@ -914,7 +914,7 @@ tty_redisplay_shutdown (struct console *c)
 
          /* And then stick the cursor there. */
          tty_set_final_cursor_coords (f, f->height, 0);
-         tty_output_end (XDEVICE (dev));
+         tty_frame_output_end (f);
        }
     }
 }
@@ -925,7 +925,7 @@ tty_redisplay_shutdown (struct console *c)
 
 
 /* FLAGS - these don't need to be console local since only one console
-          can be being updated at a time. */
+          can be being updated at a time. */
 static int insert_mode_on;             /* nonzero if in insert mode */
 static int standout_mode_on;           /* nonzero if in standout mode */
 static int underline_mode_on;          /* nonzero if in underline mode */
@@ -1491,8 +1491,8 @@ console_type_create_redisplay_tty (void)
   CONSOLE_HAS_METHOD (tty, clear_to_window_end);
   CONSOLE_HAS_METHOD (tty, clear_region);
   CONSOLE_HAS_METHOD (tty, clear_frame);
-  CONSOLE_HAS_METHOD (tty, output_begin);
-  CONSOLE_HAS_METHOD (tty, output_end);
+  CONSOLE_HAS_METHOD (tty, frame_output_begin);
+  CONSOLE_HAS_METHOD (tty, frame_output_end);
   CONSOLE_HAS_METHOD (tty, flash);
   CONSOLE_HAS_METHOD (tty, ring_bell);
   CONSOLE_HAS_METHOD (tty, set_final_cursor_coords);
index 39a94aa..afccf66 100644 (file)
@@ -286,24 +286,24 @@ x_eol_cursor_width (void)
 }
 
 /*****************************************************************************
- x_output_begin
+ x_window_output_begin
 
  Perform any necessary initialization prior to an update.
  ****************************************************************************/
 static void
-x_output_begin (struct device *d)
+x_window_output_begin (struct window *w)
 {
 }
 
 /*****************************************************************************
- x_output_end
+ x_window_output_end
 
  Perform any necessary flushing of queues when an update has completed.
  ****************************************************************************/
 static void
-x_output_end (struct device *d)
+x_window_output_end (struct window *w)
 {
-  XFlush (DEVICE_X_DISPLAY (d));
+  XFlush (DEVICE_X_DISPLAY (WINDOW_XDEVICE (w)));
 }
 
 /*****************************************************************************
@@ -460,18 +460,20 @@ x_output_display_block (struct window *w, struct display_line *dl, int block,
                      break;
                      
                    case IMAGE_WIDGET:
+                     if (EQ (XIMAGE_INSTANCE_WIDGET_TYPE (instance),
+                             Qlayout))
+                       {
+                         redisplay_output_layout (w, instance, &dbox, &dga, findex,
+                                                  cursor_start, cursor_width,
+                                                  cursor_height);
+                         break;
+                       }
                    case IMAGE_SUBWINDOW:
                      redisplay_output_subwindow (w, instance, &dbox, &dga, findex,
                                                  cursor_start, cursor_width,
                                                  cursor_height);
                      break;
                      
-                   case IMAGE_LAYOUT:
-                     redisplay_output_layout (w, instance, &dbox, &dga, findex,
-                                              cursor_start, cursor_width,
-                                              cursor_height);
-                     break;
-                     
                    case IMAGE_NOTHING:
                      /* nothing is as nothing does */
                      break;
@@ -2093,8 +2095,8 @@ console_type_create_redisplay_x (void)
   CONSOLE_HAS_METHOD (x, output_vertical_divider);
   CONSOLE_HAS_METHOD (x, clear_region);
   CONSOLE_HAS_METHOD (x, clear_frame);
-  CONSOLE_HAS_METHOD (x, output_begin);
-  CONSOLE_HAS_METHOD (x, output_end);
+  CONSOLE_HAS_METHOD (x, window_output_begin);
+  CONSOLE_HAS_METHOD (x, window_output_end);
   CONSOLE_HAS_METHOD (x, flash);
   CONSOLE_HAS_METHOD (x, ring_bell);
   CONSOLE_HAS_METHOD (x, bevel_area);
index b842b94..95e171e 100644 (file)
@@ -87,16 +87,10 @@ Boston, MA 02111-1307, USA.  */
 #define LEFT_GLYPHS    2
 #define RIGHT_GLYPHS   3
 
-/* Set the vertical clip to 0 if we are currently updating the line
-   start cache.  Otherwise for buffers of line height 1 it may fail to
-   be able to work properly because regenerate_window will not layout
-   a single line.  */
 #define VERTICAL_CLIP(w, display)                                      \
-  (updating_line_start_cache                                           \
-   ? 0                                                                 \
-   : ((WINDOW_TTY_P (w) | (!display && scroll_on_clipped_lines))       \
+    ((WINDOW_TTY_P (w) | (!display && scroll_on_clipped_lines))                \
       ? INT_MAX                                                                \
-      : vertical_clip))
+      : vertical_clip)
 
 /* The following structures are completely private to redisplay.c so
    we put them here instead of in a header file, for modularity. */
@@ -328,9 +322,6 @@ int vertical_clip;
 /* Minimum visible pixel width of clipped glyphs at right margin. */
 int horizontal_clip;
 
-/* Set if currently inside update_line_start_cache. */
-static int updating_line_start_cache;
-
 /* Nonzero means reading single-character input with prompt
    so put cursor on minibuffer after the prompt.  */
 int cursor_in_echo_area;
@@ -1322,6 +1313,7 @@ add_disp_table_entry_runes_1 (pos_data *data, Lisp_Object entry)
                    case '%':
                      dst += set_charptr_emchar (dst, '%');
                      break;
+                     /* #### unimplemented */
                    }
                }
            }
@@ -3980,8 +3972,8 @@ tail_recurse:
        * - If first element is another symbol, process the cadr or caddr
        *   recursively according to whether the symbol's value is non-nil or
        *   nil.
-       * - If first element is a face, process the cdr recursively
-       *   without altering the depth.
+       * - If first element is an extent, process the cdr recursively
+       *   and handle the extent's face.
        */
 
       Lisp_Object car, tem;
@@ -5097,6 +5089,7 @@ regenerate_window (struct window *w, Bufpos start_pos, Bufpos point, int type)
   int ypos = WINDOW_TEXT_TOP (w);
   int yend;    /* set farther down */
   int yclip = WINDOW_TEXT_TOP_CLIP (w);
+  int force;
 
   prop_block_dynarr *prop;
   layout_bounds bounds;
@@ -5150,10 +5143,14 @@ regenerate_window (struct window *w, Bufpos start_pos, Bufpos point, int type)
   else
     prop = 0;
 
+  /* When we are computing things for scrolling purposes, make
+     sure at least one line is always generated */
+  force = (type == CMOTION_DISP);
+
   /* Make sure this is set always */
   /* Note the conversion at end */
   w->window_end_pos[type] = start_pos;
-  while (ypos < yend)
+  while (ypos < yend || force)
     {
       struct display_line dl;
       struct display_line *dlp;
@@ -5206,7 +5203,7 @@ regenerate_window (struct window *w, Bufpos start_pos, Bufpos point, int type)
             the top clip and the bottom clip. */
          visible_height -= (dlp->clip + dlp->top_clip);
 
-         if (visible_height < VERTICAL_CLIP (w, 1))
+         if (visible_height < VERTICAL_CLIP (w, 1) && !force)
            {
              if (local)
                free_display_line (dlp);
@@ -5250,6 +5247,8 @@ regenerate_window (struct window *w, Bufpos start_pos, Bufpos point, int type)
         generate_display_line call. */
       if (start_pos > BUF_ZV (b))
        break;
+
+      force = 0;
     }
 
   if (prop)
@@ -6342,12 +6341,9 @@ redisplay_frame (struct frame *f, int preemption_check)
      process.*/
   if (f->frame_changed || f->subwindows_changed)
     {
-      reset_subwindow_cachels (f);
       /* we have to do this so the gutter gets regenerated. */
       reset_gutter_display_lines (f);
     }
-  else
-    mark_subwindow_cachels_as_not_updated (f);
 
   hold_frame_size_changes ();
 
@@ -6375,6 +6371,8 @@ redisplay_frame (struct frame *f, int preemption_check)
      #### If a frame-size change does occur we should probably
      actually be preempting redisplay. */
 
+  MAYBE_DEVMETH (d, frame_output_begin, (f));
+
   /* We can now update the gutters, safe in the knowledge that our
      efforts won't get undone. */
 
@@ -6388,7 +6386,7 @@ redisplay_frame (struct frame *f, int preemption_check)
   /* Erase the frame before outputting its contents. */
   if (f->clear)
     {
-      DEVMETH (d, clear_frame, (f));
+      MAYBE_DEVMETH (d, clear_frame, (f));
     }
 
   /* Do the selected window first. */
@@ -6397,11 +6395,7 @@ redisplay_frame (struct frame *f, int preemption_check)
   /* Then do the rest. */
   redisplay_windows (f->root_window, 1);
 
-  /* We now call the output_end routine for tty frames.  We delay
-     doing so in order to avoid cursor flicker.  So much for 100%
-     encapsulation. */
-  if (FRAME_TTY_P (f))
-    DEVMETH (d, output_end, (d));
+  MAYBE_DEVMETH (d, frame_output_end, (f));
 
   update_frame_title (f);
 
@@ -7836,7 +7830,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
 
   validate_line_start_cache (w);
   w->line_cache_validation_override++;
-  updating_line_start_cache = 1;
 
   if (from < BUF_BEGV (b))
     from = BUF_BEGV (b);
@@ -7845,7 +7838,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
 
   if (from > to)
     {
-      updating_line_start_cache = 0;
       w->line_cache_validation_override--;
       return;
     }
@@ -7858,7 +7850,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
       /* Check to see if the desired range is already in the cache. */
       if (from >= low_bound && to <= high_bound)
        {
-         updating_line_start_cache = 0;
          w->line_cache_validation_override--;
          return;
        }
@@ -7887,7 +7878,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
       update_internal_cache_list (w, DESIRED_DISP);
       if (!Dynarr_length (internal_cache))
        {
-         updating_line_start_cache = 0;
          w->line_cache_validation_override--;
          return;
        }
@@ -7915,7 +7905,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
        {
          Dynarr_add_many (cache, Dynarr_atp (internal_cache, 0),
                           Dynarr_length (internal_cache));
-         updating_line_start_cache = 0;
          w->line_cache_validation_override--;
          return;
        }
@@ -7924,7 +7913,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
          the bounds of the DESIRED structs in the first place. */
       if (start >= low_bound && end <= high_bound)
        {
-         updating_line_start_cache = 0;
          w->line_cache_validation_override--;
          return;
        }
@@ -7947,7 +7935,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
              Dynarr_reset (cache);
              Dynarr_add_many (cache, Dynarr_atp (internal_cache, 0),
                               Dynarr_length (internal_cache));
-             updating_line_start_cache = 0;
              w->line_cache_validation_override--;
              return;
            }
@@ -7973,7 +7960,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
              Dynarr_reset (cache);
              Dynarr_add_many (cache, Dynarr_atp (internal_cache, 0),
                               Dynarr_length (internal_cache));
-             updating_line_start_cache = 0;
              w->line_cache_validation_override--;
              return;
            }
@@ -7982,7 +7968,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
                           Dynarr_length (internal_cache) - ic_elt);
        }
 
-      updating_line_start_cache = 0;
       w->line_cache_validation_override--;
       return;
     }
@@ -8002,23 +7987,9 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
          update_internal_cache_list (w, CMOTION_DISP);
 
          /* If this assert is triggered then regenerate_window failed
-             to layout a single line.  That is not supposed to be
-             possible because we impose a minimum height on the buffer
-             and override vertical clip when we are in here. */
-         /* #### Ah, but it is because the window may temporarily
-             exist but not have any lines at all if the minibuffer is
-             real big.  Look into that situation better. */
-         if (!Dynarr_length (internal_cache))
-           {
-             if (old_lb == -1 && low_bound == -1)
-               {
-                 updating_line_start_cache = 0;
-                 w->line_cache_validation_override--;
-                 return;
-               }
-
-             assert (Dynarr_length (internal_cache));
-           }
+             to layout a single line. This is not possible since we
+            force at least a single line to be layout for CMOTION_DISP */
+         assert (Dynarr_length (internal_cache));
          assert (startp == Dynarr_atp (internal_cache, 0)->start);
 
          ic_elt = Dynarr_length (internal_cache) - 1;
@@ -8064,7 +8035,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
          startp = new_startp;
          if (startp > BUF_ZV (b))
            {
-             updating_line_start_cache = 0;
              w->line_cache_validation_override--;
              return;
            }
@@ -8098,7 +8068,6 @@ update_line_start_cache (struct window *w, Bufpos from, Bufpos to,
       while (to > high_bound);
     }
 
-  updating_line_start_cache = 0;
   w->line_cache_validation_override--;
   assert (to <= high_bound);
 }
@@ -8839,6 +8808,9 @@ Ensure that all minibuffers are correctly showing the echo area.
          if (FRAME_REPAINT_P (f) && FRAME_HAS_MINIBUF_P (f))
            {
              Lisp_Object window = FRAME_MINIBUF_WINDOW (f);
+
+             MAYBE_DEVMETH (d, frame_output_begin, (f));
+
              /*
               * If the frame size has changed, there may be random
               * chud on the screen left from previous messages
@@ -8847,19 +8819,15 @@ Ensure that all minibuffers are correctly showing the echo area.
               */
              if (f->echo_area_garbaged)
                {
-                 DEVMETH (d, clear_frame, (f));
+                 MAYBE_DEVMETH (d, clear_frame, (f));
                  f->echo_area_garbaged = 0;
                }
              redisplay_window (window, 0);
+             MAYBE_DEVMETH (d, frame_output_end, (f));
+
              call_redisplay_end_triggers (XWINDOW (window), 0);
            }
        }
-
-      /* We now call the output_end routine for tty frames.  We delay
-        doing so in order to avoid cursor flicker.  So much for 100%
-        encapsulation. */
-      if (DEVICE_TTY_P (d))
-       DEVMETH (d, output_end, (d));
     }
 
   return Qnil;
@@ -9270,15 +9238,8 @@ syms_of_redisplay (void)
 }
 
 void
-reinit_vars_of_redisplay (void)
-{
-  updating_line_start_cache = 0;
-}
-
-void
 vars_of_redisplay (void)
 {
-  reinit_vars_of_redisplay ();
 
 #if 0
   staticpro (&last_arrow_position);
@@ -9323,7 +9284,9 @@ See also `overlay-arrow-string'.
   Voverlay_arrow_position = Qnil;
 
   DEFVAR_LISP_MAGIC ("overlay-arrow-string", &Voverlay_arrow_string /*
-String to display as an arrow.  See also `overlay-arrow-position'.
+String or glyph to display as an arrow.  See also `overlay-arrow-position'.
+(Note that despite the name of this variable, it can be set to a glyph as
+well as a string.)
 */ ,
                     redisplay_variable_changed);
   Voverlay_arrow_string = Qnil;
index 937adab..dd7e7da 100644 (file)
@@ -85,63 +85,9 @@ extern int utimes(char *file, struct timeval *tvp);
 extern int srandom( unsigned seed);
 extern long random();
 
-# define SND_ASYNC             1
-# define SND_NODEFAULT         2
-# define SND_MEMORY            4
-# define SND_FILENAME          0x2000L
-# define VK_APPS                       0x5D
-# define SIF_TRACKPOS  0x0010
-# define ICC_BAR_CLASSES 4
-# define FW_BLACK      FW_HEAVY
-# define FW_ULTRABOLD  FW_EXTRABOLD
-# define FW_DEMIBOLD   FW_SEMIBOLD
-# define FW_ULTRALIGHT FW_EXTRALIGHT
-# define APPCMD_FILTERINITS    0x20L
-# define CBF_FAIL_SELFCONNECTIONS 0x1000
-# define CBF_SKIP_ALLNOTIFICATIONS     0x3C0000
-# define CBF_FAIL_ADVISES      0x4000
-# define CBF_FAIL_POKES                0x10000
-# define CBF_FAIL_REQUESTS     0x20000
-# define SZDDESYS_TOPIC                "System"
-# define JOHAB_CHARSET                 130
-# define MAC_CHARSET           77
 # endif
 #endif
 
-#ifndef SPI_GETWHEELSCROLLLINES
-#define SPI_GETWHEELSCROLLLINES 104
-#endif
-#ifndef WHEEL_PAGESCROLL
-#define WHEEL_PAGESCROLL (UINT_MAX)
-#endif
-#ifndef WHEEL_DELTA
-#define WHEEL_DELTA 120
-#endif
-#ifndef WM_MOUSEWHEEL
-#define WM_MOUSEWHEEL 0x20A
-#endif
-#ifndef TCS_BOTTOM
-#define TCS_BOTTOM 0x0002
-#endif
-#ifndef TCS_VERTICAL
-#define TCS_VERTICAL 0x0080
-#endif
-#ifndef PHYSICALWIDTH
-#define PHYSICALWIDTH 110
-#endif
-#ifndef PHYSICALHEIGHT
-#define PHYSICALHEIGHT 111
-#endif
-#ifndef PHYSICALOFFSETX
-#define PHYSICALOFFSETX 112
-#endif
-#ifndef PHYSICALOFFSETY
-#define PHYSICALOFFSETY 113
-#endif
-
-
-#define PBS_SMOOTH              0x01
-
 #ifdef HAVE_MS_WINDOWS
 #define HAVE_NTGUI
 #define HAVE_FACES
@@ -153,7 +99,7 @@ extern long random();
 
 #define C_SWITCH_SYSTEM -Wno-sign-compare -fno-caller-saves
 #define LIBS_SYSTEM -lwinmm
-
+#define WIN32_LEAN_AND_MEAN
 
 #define TEXT_START -1
 #define TEXT_END -1
index 9cb42bf..1454e05 100644 (file)
@@ -39,6 +39,7 @@ Boston, MA 02111-1307, USA.  */
 
 #define C_SWITCH_SYSTEM "-mno-cygwin -Wno-sign-compare -fno-caller-saves -Int/inc -I../nt/inc -DWINDOWSNT"
 #define LIBS_SYSTEM "-mno-cygwin -lwinmm -lwsock32"
+#define WIN32_LEAN_AND_MEAN
 
 #define TEXT_START -1
 #define TEXT_END -1
@@ -51,44 +52,9 @@ Boston, MA 02111-1307, USA.  */
 #define LOCALE_USE_CP_ACP 0x40000000
 #define NSIG 23
 
-#ifndef SPI_GETWHEELSCROLLLINES
-#define SPI_GETWHEELSCROLLLINES 104
-#endif
-#ifndef WHEEL_PAGESCROLL
-#define WHEEL_PAGESCROLL (UINT_MAX)
-#endif
-#ifndef WHEEL_DELTA
-#define WHEEL_DELTA 120
-#endif
-
 /* this is necessary to get the TCS_* definitions in <commctrl.h> */
 #define _WIN32_IE 0x0400
 
-#ifndef WM_MOUSEWHEEL
-#define WM_MOUSEWHEEL 0x20A
-#endif
-#ifndef TCS_BOTTOM
-#define TCS_BOTTOM 0x0002
-#endif
-#ifndef TCS_VERTICAL
-#define TCS_VERTICAL 0x0080
-#endif
-#ifndef PHYSICALWIDTH
-#define PHYSICALWIDTH 110
-#endif
-#ifndef PHYSICALHEIGHT
-#define PHYSICALHEIGHT 111
-#endif
-#ifndef PHYSICALOFFSETX
-#define PHYSICALOFFSETX 112
-#endif
-#ifndef PHYSICALOFFSETY
-#define PHYSICALOFFSETY 113
-#endif
-#ifndef PBS_SMOOTH
-#define PBS_SMOOTH              0x01
-#endif
-
 /* translate NT world unexec stuff to our a.out definitions */
 
 #define strnicmp strncasecmp
@@ -263,6 +229,7 @@ gid_t getegid (void);
 #undef HAVE_SYS_WAIT_H
 #undef HAVE_TERMIOS
 #undef SYSV_SYSTEM_DIR
+#undef CLASH_DETECTION
 
 /* We now have emulation for some signals */
 #define HAVE_SIGHOLD
index 18360c0..ffa3c12 100644 (file)
@@ -735,26 +735,26 @@ behavior.
      with their standard behaviors.  It is not possible to hide the
      differences down in lwlib because knowledge of XEmacs buffer and
      cursor motion routines is necessary. */
-#if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID) || \
-    defined (LWLIB_SCROLLBARS_ATHENA3D) || defined(HAVE_MS_WINDOWS)
-  window_scroll (window, Qnil, -1, ERROR_ME_NOT);
-#else /* Athena */
-  {
-    Bufpos bufpos;
-    Lisp_Object value = Fcdr (object);
 
-    CHECK_INT (value);
-    Fmove_to_window_line (Qzero, window);
-    /* can't use Fvertical_motion() because it moves the buffer point
-       rather than the window's point.
-
-       #### It does?  Why does it take a window argument then? */
-    bufpos = vmotion (XWINDOW (window), XINT (Fwindow_point (window)),
-                     XINT (value), 0);
-    Fset_window_point (window, make_int (bufpos));
-    Fcenter_to_window_line (Qzero, window);
-  }
-#endif /* Athena */
+  if (NILP (XCDR (object)))
+    window_scroll (window, Qnil, -1, ERROR_ME_NOT);
+  else
+    {
+      Bufpos bufpos;
+      Lisp_Object value = Fcdr (object);
+
+      CHECK_INT (value);
+      Fmove_to_window_line (Qzero, window);
+      /* can't use Fvertical_motion() because it moves the buffer point
+        rather than the window's point.
+
+        #### It does?  Why does it take a window argument then? */
+      bufpos = vmotion (XWINDOW (window), XINT (Fwindow_point (window)),
+                       XINT (value), 0);
+      Fset_window_point (window, make_int (bufpos));
+      Fcenter_to_window_line (Qzero, window);
+    }
+
   zmacs_region_stays = 1;
   return Qnil;
 }
@@ -776,17 +776,17 @@ behavior.
      with their standard behaviors.  It is not possible to hide the
      differences down in lwlib because knowledge of XEmacs buffer and
      cursor motion routines is necessary. */
-#if defined (LWLIB_SCROLLBARS_MOTIF) || defined (LWLIB_SCROLLBARS_LUCID) || \
-    defined (LWLIB_SCROLLBARS_ATHENA3D) || defined (HAVE_MS_WINDOWS)
-  window_scroll (window, Qnil, 1, ERROR_ME_NOT);
-#else /* Athena */
-  {
-    Lisp_Object value = Fcdr (object);
-    CHECK_INT (value);
-    Fmove_to_window_line (value, window);
-    Fcenter_to_window_line (Qzero, window);
-  }
-#endif /* Athena */
+
+  if (NILP (XCDR (object)))
+    window_scroll (window, Qnil, 1, ERROR_ME_NOT);
+  else
+    {
+      Lisp_Object value = Fcdr (object);
+      CHECK_INT (value);
+      Fmove_to_window_line (value, window);
+      Fcenter_to_window_line (Qzero, window);
+    }
+
   zmacs_region_stays = 1;
   return Qnil;
 }
index 4318bf8..5338b03 100644 (file)
@@ -532,31 +532,52 @@ Return a new specifier object of type TYPE.
 
 A specifier is an object that can be used to keep track of a property
 whose value can be per-buffer, per-window, per-frame, or per-device,
-and can further be restricted to a particular console-type or device-class.
-Specifiers are used, for example, for the various built-in properties of a
-face; this allows a face to have different values in different frames,
-buffers, etc.  For more information, see `specifier-instance',
+and can further be restricted to a particular console-type or
+device-class.  Specifiers are used, for example, for the various
+built-in properties of a face; this allows a face to have different
+values in different frames, buffers, etc.
+
+When speaking of the value of a specifier, it is important to
+distinguish between the *setting* of a specifier, called an
+\"instantiator\", and the *actual value*, called an \"instance\".  You
+put various possible instantiators (i.e. settings) into a specifier
+and associate them with particular locales (buffer, window, frame,
+device, global), and then the instance (i.e. actual value) is
+retrieved in a specific domain (window, frame, device) by looking
+through the possible instantiators (i.e. settings).  This process is
+called \"instantiation\".
+To put settings into a specifier, use `set-specifier', or the
+lower-level functions `add-spec-to-specifier' and
+`add-spec-list-to-specifier'.  You can also temporarily bind a setting
+to a specifier using `let-specifier'.  To retrieve settings, use
+`specifier-specs', or its lower-level counterpart
+`specifier-spec-list'.  To determine the actual value, use
+`specifier-instance'.
+
+For more information, see `set-specifier', `specifier-instance',
 `specifier-specs', and `add-spec-to-specifier'; or, for a detailed
-description of specifiers, including how they are instantiated over a
-particular domain (i.e. how their value in that domain is determined),
-see the chapter on specifiers in the XEmacs Lisp Reference Manual.
+description of specifiers, including how exactly the instantiation
+process works, see the chapter on specifiers in the XEmacs Lisp
+Reference Manual.
 
 TYPE specifies the particular type of specifier, and should be one of
-the symbols 'generic, 'integer, 'boolean, 'color, 'font, 'image,
-'face-boolean, 'gutter, 'gutter-size, 'gutter-visible or 'toolbar.
+the symbols 'generic, 'integer, 'natnum, 'boolean, 'color, 'font,
+'image, 'face-boolean, 'display-table, 'gutter, 'gutter-size,
+'gutter-visible or 'toolbar.
 
 For more information on particular types of specifiers, see the
-functions `generic-specifier-p', `integer-specifier-p',
-`boolean-specifier-p', `color-specifier-p', `font-specifier-p',
-`image-specifier-p', `face-boolean-specifier-p', `gutter-specifier-p,
-`gutter-size-specifier-p, `gutter-visible-specifier-p and
-`toolbar-specifier-p'.
+functions `make-generic-specifier', `make-integer-specifier',
+`make-natnum-specifier', `make-boolean-specifier',
+`make-color-specifier', `make-font-specifier', `make-image-specifier',
+`make-face-boolean-specifier', `make-gutter-size-specifier',
+`make-gutter-visible-specifier', `default-toolbar', `default-gutter',
+and `current-display-table'.
 */
        (type))
 {
   /* This function can GC */
-  struct specifier_methods *meths = decode_specifier_type (type,
-                                                          ERROR_ME);
+  struct specifier_methods *meths = decode_specifier_type (type, ERROR_ME);
 
   return make_specifier (meths);
 }
@@ -609,15 +630,19 @@ Valid locales are devices, frames, windows, buffers, and 'global.
 DEFUN ("valid-specifier-domain-p", Fvalid_specifier_domain_p, 1, 1, 0, /*
 Return t if DOMAIN is a valid specifier domain.
 A domain is used to instance a specifier (i.e. determine the specifier's
-value in that domain).  Valid domains are windows, frames, and devices.
-\(nil is not valid.)
+value in that domain).  Valid domains are image instances, windows, frames,
+and devices. \(nil is not valid.) image instances are pseudo-domains since
+instantiation will actually occur in the window the image instance itself is
+instantiated in.
 */
      (domain))
 {
   /* This cannot GC. */
   return ((DEVICEP (domain) && DEVICE_LIVE_P (XDEVICE (domain))) ||
          (FRAMEP  (domain) && FRAME_LIVE_P  (XFRAME  (domain))) ||
-         (WINDOWP (domain) && WINDOW_LIVE_P (XWINDOW (domain))))
+         (WINDOWP (domain) && WINDOW_LIVE_P (XWINDOW (domain))) ||
+         /* #### get image instances out of domains! */
+         IMAGE_INSTANCEP (domain))
     ? Qt : Qnil;
 }
 
@@ -729,7 +754,7 @@ check_valid_domain (Lisp_Object domain)
     signal_simple_error ("Invalid specifier domain", domain);
 }
 
-static Lisp_Object
+Lisp_Object
 decode_domain (Lisp_Object domain)
 {
   if (NILP (domain))
@@ -2435,7 +2460,7 @@ specifier_instance_from_inst_list (Lisp_Object specifier,
   GCPRO2 (specifier, inst_list);
 
   sp = XSPECIFIER (specifier);
-  device = DFW_DEVICE (domain);
+  device = DOMAIN_DEVICE (domain);
 
   if (no_quit)
   /* The instantiate method is allowed to call eval.  Since it
@@ -2515,16 +2540,20 @@ specifier_instance (Lisp_Object specifier, Lisp_Object matchspec,
 
   /* Attempt to determine buffer, window, frame, and device from the
      domain. */
-  if (WINDOWP (domain))
+  /* #### get image instances out of domains! */
+  if (IMAGE_INSTANCEP (domain))
+    window = DOMAIN_WINDOW (domain);
+  else if (WINDOWP (domain))
     window = domain;
   else if (FRAMEP (domain))
     frame = domain;
   else if (DEVICEP (domain))
     device = domain;
   else
-    /* #### dmoore - dammit, this should just signal an error or something
-       shouldn't it?
-       #### No. Errors are handled in Lisp primitives implementation.
+    /* dmoore writes: [dammit, this should just signal an error or something
+       shouldn't it?]
+
+       No. Errors are handled in Lisp primitives implementation.
        Invalid domain is a design error here - kkm. */
     abort ();
 
@@ -2959,8 +2988,9 @@ DEFINE_SPECIFIER_TYPE (generic);
 
    What really needs to be done is to write a function
    `make-specifier-type' that creates new specifier types.
-   #### I'll look into this for 19.14.
- */
+
+   #### [I'll look into this for 19.14.]  Well, sometime. (Currently
+   May 2000, 21.2 is in development.  19.14 was released in June 1996.) */
 
 "A generic specifier is a generalized kind of specifier with user-defined\n"
 "semantics.  The instantiator can be any kind of Lisp object, and the\n"
@@ -2997,8 +3027,8 @@ DEFINE_SPECIFIER_TYPE (generic);
 DEFUN ("generic-specifier-p", Fgeneric_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is a generic specifier.
 
-A generic specifier allows any kind of Lisp object as an instantiator,
-and returns back the Lisp object unchanged when it is instantiated.
+See `make-generic-specifier' for a description of possible generic
+instantiators.
 */
        (object))
 {
@@ -3020,6 +3050,9 @@ integer_validate (Lisp_Object instantiator)
 
 DEFUN ("integer-specifier-p", Finteger_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is an integer specifier.
+
+See `make-integer-specifier' for a description of possible integer
+instantiators.
 */
        (object))
 {
@@ -3040,6 +3073,9 @@ natnum_validate (Lisp_Object instantiator)
 
 DEFUN ("natnum-specifier-p", Fnatnum_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is a natnum (non-negative-integer) specifier.
+
+See `make-natnum-specifier' for a description of possible natnum
+instantiators.
 */
        (object))
 {
@@ -3061,6 +3097,9 @@ boolean_validate (Lisp_Object instantiator)
 
 DEFUN ("boolean-specifier-p", Fboolean_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is a boolean specifier.
+
+See `make-boolean-specifier' for a description of possible boolean
+instantiators.
 */
        (object))
 {
@@ -3073,11 +3112,11 @@ Return non-nil if OBJECT is a boolean specifier.
 
 DEFINE_SPECIFIER_TYPE (display_table);
 
-#define VALID_SINGLE_DISPTABLE_INSTANTIATOR_P(instantiator)                    \
-  (VECTORP (instantiator)                                                      \
-   || (CHAR_TABLEP (instantiator)                                              \
-       && (XCHAR_TABLE_TYPE (instantiator) == CHAR_TABLE_TYPE_CHAR             \
-          || XCHAR_TABLE_TYPE (instantiator) == CHAR_TABLE_TYPE_GENERIC))      \
+#define VALID_SINGLE_DISPTABLE_INSTANTIATOR_P(instantiator)               \
+  (VECTORP (instantiator)                                                 \
+   || (CHAR_TABLEP (instantiator)                                         \
+       && (XCHAR_TABLE_TYPE (instantiator) == CHAR_TABLE_TYPE_CHAR        \
+          || XCHAR_TABLE_TYPE (instantiator) == CHAR_TABLE_TYPE_GENERIC)) \
    || RANGE_TABLEP (instantiator))
 
 static void
@@ -3109,6 +3148,9 @@ display_table_validate (Lisp_Object instantiator)
 
 DEFUN ("display-table-specifier-p", Fdisplay_table_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is a display-table specifier.
+
+See `current-display-table' for a description of possible display-table
+instantiators.
 */
        (object))
 {
index 17461cb..5758637 100644 (file)
@@ -413,6 +413,48 @@ struct specifier_caching
                                  Lisp_Object oldval);
 };
 
+/* #### get image instances out of domains! */
+
+/* #### I think the following should abort() rather than return nil
+   when an invalid domain is given; much more likely we'll catch design
+   errors early. --ben */
+
+/* This turns out to be used heavily so we make it a macro to make it
+   inline.  Also, the majority of the time the object will turn out to
+   be a window so we move it from being checked last to being checked
+   first. */
+#define DOMAIN_DEVICE(obj)                                     \
+   (WINDOWP (obj) ? WINDOW_DEVICE (XWINDOW (obj))              \
+  : (FRAMEP  (obj) ? FRAME_DEVICE (XFRAME (obj))               \
+  : (DEVICEP (obj) ? obj                                       \
+  : (IMAGE_INSTANCEP (obj) ? image_instance_device (obj)       \
+  : Qnil))))
+
+#define DOMAIN_FRAME(obj)                              \
+   (WINDOWP (obj) ? WINDOW_FRAME (XWINDOW (obj))       \
+  : (FRAMEP  (obj) ? obj                               \
+  : (IMAGE_INSTANCEP (obj) ? image_instance_frame (obj)        \
+  : Qnil)))
+
+#define DOMAIN_WINDOW(obj)                                     \
+   (WINDOWP (obj) ? obj                                                \
+  : (IMAGE_INSTANCEP (obj) ? image_instance_window (obj)       \
+  : Qnil))
+
+#define DOMAIN_LIVE_P(obj)                                     \
+   (WINDOWP (obj) ? WINDOW_LIVE_P (XWINDOW (obj))              \
+  : (FRAMEP  (obj) ? FRAME_LIVE_P (XFRAME (obj))               \
+  : (DEVICEP (obj) ? DEVICE_LIVE_P (XDEVICE (obj))             \
+  : (IMAGE_INSTANCEP (obj) ? image_instance_live_p (obj)       \
+  : 0))))
+
+#define DOMAIN_XDEVICE(obj)                    \
+  (XDEVICE (DOMAIN_DEVICE (obj)))
+#define DOMAIN_XFRAME(obj)                     \
+  (XFRAME (DOMAIN_FRAME (obj)))
+#define DOMAIN_XWINDOW(obj)                    \
+  (XWINDOW (DOMAIN_WINDOW (obj)))
+
 EXFUN (Fcopy_specifier, 6);
 EXFUN (Fmake_specifier, 1);
 EXFUN (Fset_specifier_dirty_flag, 1);
@@ -426,6 +468,7 @@ Lisp_Object decode_locale_list (Lisp_Object locale);
 extern enum spec_add_meth
 decode_how_to_add_specification (Lisp_Object how_to_add);
 Lisp_Object decode_specifier_tag_set (Lisp_Object tag_set);
+Lisp_Object decode_domain (Lisp_Object domain);
 
 void add_entry_to_specifier_type_list (Lisp_Object symbol,
                                       struct specifier_methods *meths);
index 7c2179c..07baead 100644 (file)
@@ -46,18 +46,7 @@ Boston, MA 02111-1307, USA.  */
 #define TOOLBAR_ID_BIAS 16
 #define TOOLBAR_HANDLE(f,p) \
 GetDlgItem(FRAME_MSWINDOWS_HANDLE(f), TOOLBAR_ID_BIAS + p)
-#ifndef TB_SETIMAGELIST
-#define TB_SETIMAGELIST (WM_USER + 48)
-#define TB_GETIMAGELIST (WM_USER + 49)
-#define TB_SETDISABLEDIMAGELIST (WM_USER + 54)
-#define TB_GETDISABLEDIMAGELIST (WM_USER + 55)
-#endif
-#ifndef TB_SETPADDING
-#define TB_SETPADDING   (WM_USER + 87)
-#endif
-#ifndef TBSTYLE_FLAT
-#define TBSTYLE_FLAT 0x800
-#endif
+
 #define MSWINDOWS_BUTTON_SHADOW_THICKNESS 2
 #define MSWINDOWS_BLANK_SIZE 5
 #define MSWINDOWS_MINIMUM_TOOLBAR_SIZE 8
index 963d373..b93fcd6 100644 (file)
@@ -1160,14 +1160,9 @@ toolbar_after_change (Lisp_Object specifier, Lisp_Object locale)
 
 DEFUN ("toolbar-specifier-p", Ftoolbar_specifier_p, 1, 1, 0, /*
 Return non-nil if OBJECT is a toolbar specifier.
-Toolbar specifiers are used to specify the format of a toolbar.
-The values of the variables `default-toolbar', `top-toolbar',
-`left-toolbar', `right-toolbar', and `bottom-toolbar' are always
-toolbar specifiers.
-
-Valid toolbar instantiators are called "toolbar descriptors"
-and are lists of vectors.  See `default-toolbar' for a description
-of the exact format.
+
+See `make-toolbar-specifier' for a description of possible toolbar
+instantiators.
 */
        (object))
 {
index d91ae33..f1da87a 100644 (file)
@@ -494,16 +494,6 @@ typedef struct {
 # define SHN_ABS       Elf_eshn_absolute
 # define SHN_COMMON    Elf_eshn_common
 
-/*
- * The magic of picking the right size types is handled by the ELFSIZE
- * definition above.
- */
-# ifdef __STDC__
-#  define ElfW(type)    Elf_##type
-# else
-#  define ElfW(type)    Elf_/**/type
-# endif
-
 # ifdef __alpha__
 #  include <sys/exec_ecoff.h>
 #  define HDRR         struct ecoff_symhdr
@@ -685,7 +675,6 @@ unexec (char *new_name, char *old_name, unsigned int data_start,
       old_sbss_index = -1;
       old_bss_addr = OLD_SECTION_H(old_bss_index).sh_addr;
       old_bss_size = OLD_SECTION_H(old_bss_index).sh_size;
-      new_data2_offset = OLD_SECTION_H(old_bss_index).sh_offset;
       new_data2_index = old_bss_index;
     }
   else
@@ -693,7 +682,6 @@ unexec (char *new_name, char *old_name, unsigned int data_start,
       old_bss_addr = OLD_SECTION_H(old_sbss_index).sh_addr;
       old_bss_size = OLD_SECTION_H(old_bss_index).sh_size
        + OLD_SECTION_H(old_sbss_index).sh_size;
-      new_data2_offset = OLD_SECTION_H(old_sbss_index).sh_offset;
       new_data2_index = old_sbss_index;
     }
 
@@ -711,6 +699,20 @@ unexec (char *new_name, char *old_name, unsigned int data_start,
     if (old_mdebug_index == old_file_h->e_shnum)
        old_mdebug_index = 0;
 
+  for (old_data_index = 1; old_data_index < (int) old_file_h->e_shnum;
+       old_data_index++)
+    {
+#ifdef DEBUG
+      fprintf (stderr, "Looking for .data - found %s\n",
+              old_section_names + OLD_SECTION_H (old_data_index).sh_name);
+#endif
+      if (!strcmp (old_section_names + OLD_SECTION_H (old_data_index).sh_name,
+                  ".data"))
+       break;
+    }
+    if (old_data_index == old_file_h->e_shnum)
+       old_data_index = 0;
+
 #if defined (emacs) || !defined (DEBUG)
   new_bss_addr = (ElfW(Addr)) sbrk (0);
 #else
@@ -718,6 +720,8 @@ unexec (char *new_name, char *old_name, unsigned int data_start,
 #endif
   new_data2_addr = old_bss_addr;
   new_data2_size = new_bss_addr - old_bss_addr;
+  new_data2_offset  = OLD_SECTION_H (old_data_index).sh_offset +
+    (new_data2_addr - OLD_SECTION_H (old_data_index).sh_addr);
 
 #ifdef DEBUG
   fprintf (stderr, "old_bss_index %d\n", old_bss_index);
index 53abecf..d10f745 100644 (file)
@@ -61,6 +61,9 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 #include <fcntl.h>
 #include <windows.h>
 
+#include "nt.h"
+#include "ntheap.h"
+
 /* From IMAGEHLP.H which is not installed by default by MSVC < 5 */
 /* The IMAGEHLP.DLL library is not distributed by default with Windows95 */
 typedef PIMAGE_NT_HEADERS
@@ -72,9 +75,8 @@ typedef PIMAGE_NT_HEADERS
 extern BOOL ctrl_c_handler (unsigned long type);
 #endif
 
-#include "ntheap.h"
-
-/* Sync with FSF Emacs 19.34.6 note: struct file_data is now defined in ntheap.h */
+/* Sync with FSF Emacs 19.34.6
+   note: struct file_data is now defined in nt.h */
 
 enum {
   HEAP_UNINITIALIZED = 1,
@@ -282,40 +284,6 @@ unexec (char *new_name, char *old_name, void *start_data, void *start_bss,
   close_file_data (&out_file);
 }
 
-
-/* File handling.  */
-
-
-int
-open_output_file (file_data *p_file, const char *filename, unsigned long size)
-{
-  HANDLE file;
-  HANDLE file_mapping;
-  void  *file_base;
-
-  file = CreateFile (filename, GENERIC_READ | GENERIC_WRITE, 0, NULL,
-                    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
-  if (file == INVALID_HANDLE_VALUE) 
-    return FALSE;
-
-  file_mapping = CreateFileMapping (file, NULL, PAGE_READWRITE, 
-                                   0, size, NULL);
-  if (!file_mapping) 
-    return FALSE;
-  
-  file_base = MapViewOfFile (file_mapping, FILE_MAP_WRITE, 0, 0, size);
-  if (file_base == NULL) 
-    return FALSE;
-  
-  p_file->name = filename;
-  p_file->size = size;
-  p_file->file = file;
-  p_file->file_mapping = file_mapping;
-  p_file->file_base = (char*) file_base;
-
-  return TRUE;
-}
-
 /* Routines to manipulate NT executable file sections.  */
 
 #ifndef DUMP_SEPARATE_SECTION
index 473c778..c3e511f 100644 (file)
@@ -281,9 +281,9 @@ allocate_window (void)
   p->face_cachels     = Dynarr_new (face_cachel);
   p->glyph_cachels    = Dynarr_new (glyph_cachel);
   p->line_start_cache = Dynarr_new (line_start_cache);
-  p->subwindow_instance_cache = make_lisp_hash_table (10,
+  p->subwindow_instance_cache = make_lisp_hash_table (30,
                                                      HASH_TABLE_KEY_WEAK,
-                                                     HASH_TABLE_EQ);
+                                                     HASH_TABLE_EQUAL);
   p->line_cache_last_updated = Qzero;
   INIT_DISP_VARIABLE (last_point_x, 0);
   INIT_DISP_VARIABLE (last_point_y, 0);
@@ -1867,6 +1867,34 @@ replace_window (Lisp_Object old, Lisp_Object replacement)
   /* #### Here, if replacement is a vertical combination
      and so is its new parent, we should make replacement's
      children be children of that parent instead. */
+
+  ERROR_CHECK_SUBWINDOW_CACHE (p);
+}
+
+static int
+window_unmap_subwindows_cache_mapper (Lisp_Object key, Lisp_Object value,
+                                     void *flag_closure)
+{
+  /* value can be nil; we cache failures as well as successes */
+  if (!NILP (value))
+    {
+      struct frame* f = XFRAME (XIMAGE_INSTANCE_FRAME (value));
+      unmap_subwindow (value);
+      /* In case GC doesn't catch up fast enough, remove from the frame
+        cache also. Otherwise code that checks the sanity of the instance
+        will fail. */
+      XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f))
+       = delq_no_quit (value, XWEAK_LIST_LIST (FRAME_SUBWINDOW_CACHE (f)));
+    }
+  return 0;
+}
+
+static void
+window_unmap_subwindows (struct window* w)
+{
+  assert (!NILP (w->subwindow_instance_cache));
+  elisp_maphash (window_unmap_subwindows_cache_mapper,
+                w->subwindow_instance_cache, 0);
 }
 
 /* we're deleting W; set the structure of W to indicate this. */
@@ -1874,6 +1902,20 @@ replace_window (Lisp_Object old, Lisp_Object replacement)
 static void
 mark_window_as_deleted (struct window *w)
 {
+  /* The window instance cache is going away now, so need to get the
+     cachels reset by redisplay. */
+  MARK_FRAME_SUBWINDOWS_CHANGED (XFRAME (WINDOW_FRAME (w)));
+
+  /* The cache is going away. If we leave unmapping to
+     reset_subwindow_cachels then we get in a situation where the
+     domain (the window) has been deleted but we still need access to
+     its attributes in order to unmap windows properly. Since the
+     subwindows are going to get GC'd anyway as a result of the domain
+     going away, it is safer to just unmap them all while we know the
+     domain is still valid. */
+  ERROR_CHECK_SUBWINDOW_CACHE (w);
+  window_unmap_subwindows (w);
+
   /* In the loop
      (while t (split-window) (delete-window))
      we end up with a tree of deleted windows which are all connected
@@ -1885,13 +1927,13 @@ mark_window_as_deleted (struct window *w)
      Since the window-configuration code doesn't need any of the
      pointers to other windows (they are all recreated from the
      window-config data), we set them all to nil so that we
-     are able to collect more actual garbage.
-   */
+     are able to collect more actual garbage. */
   w->next = Qnil;
   w->prev = Qnil;
   w->hchild = Qnil;
   w->vchild = Qnil;
   w->parent = Qnil;
+  w->subwindow_instance_cache = Qnil;
 
   w->dead = 1;
 
@@ -1928,6 +1970,7 @@ will automatically call `save-buffers-kill-emacs'.)
     window = Fselected_window (Qnil);
   else
     CHECK_WINDOW (window);
+
   w = XWINDOW (window);
 
   /* It's okay to delete an already-deleted window.  */
@@ -3475,9 +3518,9 @@ make_dummy_parent (Lisp_Object window)
   p->face_cachels     = Dynarr_new (face_cachel);
   p->glyph_cachels    = Dynarr_new (glyph_cachel);
   p->subwindow_instance_cache = 
-    make_lisp_hash_table (10,
+    make_lisp_hash_table (30,
                          HASH_TABLE_KEY_WEAK,
-                         HASH_TABLE_EQ);
+                         HASH_TABLE_EQUAL);
 
   /* Put new into window structure in place of window */
   replace_window (window, new);
@@ -5173,6 +5216,11 @@ by `current-window-configuration' (which see).
 
       mark_windows_in_use (f, 1);
 
+      /* Force subwindows to be reinstantiated. They are all going
+         anyway and if we don't do this GC may not happen between now
+         and the next time we check their integrity. */
+      reset_frame_subwindow_instance_cache (f);
+
 #if 0
       /* JV: This is bogus,
         First of all, the units are inconsistent. The frame sizes are measured
@@ -5315,6 +5363,14 @@ by `current-window-configuration' (which see).
          w->hscroll = p->hscroll;
          w->modeline_hscroll = p->modeline_hscroll;
          w->line_cache_last_updated = Qzero;
+         /* The subwindow instance cache isn't preserved across
+            window configurations, and in fact doing so would be
+            wrong. We just reset to zero and then redisplay will fill
+            it up as needed. */
+         w->subwindow_instance_cache =
+           make_lisp_hash_table (30,
+                                 HASH_TABLE_KEY_WEAK,
+                                 HASH_TABLE_EQUAL);
          SET_LAST_MODIFIED (w, 1);
          SET_LAST_FACECHANGE (w);
          w->config_mark = 0;
index 8144a47..15ce2b3 100644 (file)
@@ -387,9 +387,13 @@ int invalidate_vertical_divider_cache_in_window (struct window *w,
 int window_divider_width (struct window *w);
 
 #define WINDOW_FRAME(w) ((w)->frame)
+#define WINDOW_XFRAME(w) XFRAME (WINDOW_FRAME (w))
 #define WINDOW_BUFFER(w) ((w)->buffer)
+#define WINDOW_XBUFFER(w) XBUFFER (WINDOW_BUFFER (w))
 #define WINDOW_DEVICE(w) FRAME_DEVICE (XFRAME (WINDOW_FRAME (w)))
+#define WINDOW_XDEVICE(w) XDEVICE (WINDOW_DEVICE (w))
 #define WINDOW_CONSOLE(w) DEVICE_CONSOLE (XDEVICE (WINDOW_DEVICE (w)))
+#define WINDOW_XCONSOLE(w) XCONSOLE (WINDOW_CONSOLE (w))
 
 /* XEmacs window size and positioning macros. */
 #define WINDOW_TOP(w) ((w)->pixel_top)
index 36e7a61..821a5a1 100644 (file)
@@ -1,3 +1,7 @@
+2000-05-28  Martin Buchholz <martin@xemacs.org>
+
+       * XEmacs 21.2.34 is released.
+
 2000-05-01  Martin Buchholz <martin@xemacs.org>
 
        * XEmacs 21.2.33 is released.
index c325e36..b5d1727 100644 (file)
 ;; layout
 (setq layout 
       (make-glyph
-       [layout :pixel-width 200 :pixel-height 250
+       [layout :descriptor "The Layout"
               :orientation vertical
               :justify left
               :border [string :data "Hello There Mrs"]
-              :items ([layout :orientation horizontal
-                              :items (radio-button1 radio-button2)]
+              :items ([native-layout :orientation horizontal
+                                     :items (radio-button1 radio-button2)]
                       edit-field toggle-button label str)]))
 (set-glyph-face layout 'gui-element)
 (set-extent-begin-glyph
index ea26a94..44b7645 100644 (file)
@@ -2,8 +2,8 @@
 emacs_is_beta=t
 emacs_major_version=21
 emacs_minor_version=2
-emacs_beta_version=33
-xemacs_codename="Melpomene"
+emacs_beta_version=34
+xemacs_codename="Molpe"
 infodock_major_version=4
 infodock_minor_version=0
 infodock_build_version=8