From d440edee3b15c40ec98176258e24be6c80176add Mon Sep 17 00:00:00 2001 From: Mid Favila Date: Sat, 15 May 2021 18:52:30 +0000 Subject: [PATCH] Update build instructions for XClock, remove hard Xaw dependency, package neXtaw, etc. --- mbase/ROX-Filer | 0 mbase/alsa-lib | 0 mbase/alsa-plugins | 0 mbase/alsa-utils | 0 mbase/epic | 0 mbase/fbv-git | 0 mbase/gnugrep/build | 11 + mbase/gnugrep/checksums | 1 + mbase/gnugrep/sources | 1 + mbase/gnugrep/version | 1 + mbase/liberation-fonts | 0 mbase/neXtaw | 1 + mbase/norm.txt | 1 + mbase/psmisc-git | 1 - mbase/scrot | 0 mbase/sxiv | 0 mbase/tzdata | 0 mbase/xf86-input-libinput | 0 mbase/xorg-server | 0 mbase/xwallpaper | 0 ports/ffmpeg/diffutils/build | 9 + ports/ffmpeg/diffutils/checksums | 1 + ports/ffmpeg/diffutils/sources | 1 + ports/ffmpeg/diffutils/version | 1 + ports/gtk2-engines-clearlooks/depends | 1 + ports/gtk2-engines-murrine/depends | 1 + ports/gv/depends | 1 + ports/libXaw3d-git/build | 4 + ports/{links2 => links2-mod}/build | 0 ports/{links2 => links2-mod}/checksums | 0 ports/{links2 => links2-mod}/depends | 0 ports/{links2 => links2-mod}/manifest | 0 .../patches/01-links-tabbed.patch | 0 ports/{links2 => links2-mod}/sources | 0 ports/{links2 => links2-mod}/version | 0 ports/neXtaw/build | 8 + ports/neXtaw/checksums | 1 + ports/neXtaw/files/nextaw.pc | 12 + ports/neXtaw/sources | 2 + ports/neXtaw/version | 1 + ports/neXtaw/xaw7.pc | 12 + ports/xclock/build | 3 + ports/xclock/depends | 1 - ports/xedit/depends | 2 +- ports/xsm/depends | 1 - ports/xterm/xterm-359.tgz | Bin 0 -> 1424523 bytes ports/xterm/xterm-359/256colres.h | 250 + ports/xterm/xterm-359/256colres.pl | 93 + ports/xterm/xterm-359/88colres.h | 82 + ports/xterm/xterm-359/88colres.pl | 96 + ports/xterm/xterm-359/AAA_README_VMS.txt | 48 + ports/xterm/xterm-359/COPYING | 75 + ports/xterm/xterm-359/INSTALL | 875 + ports/xterm/xterm-359/Imakefile | 338 + ports/xterm/xterm-359/KOI8RXTerm.ad | 50 + ports/xterm/xterm-359/MANIFEST | 228 + ports/xterm/xterm-359/Makefile | 634 + ports/xterm/xterm-359/Makefile.in | 634 + ports/xterm/xterm-359/NEWS | 27 + ports/xterm/xterm-359/README | 19 + ports/xterm/xterm-359/README.i18n | 199 + ports/xterm/xterm-359/README.os390 | 74 + ports/xterm/xterm-359/THANKS | 241 + ports/xterm/xterm-359/TekPrsTbl.c | 2648 ++ ports/xterm/xterm-359/TekPrsTbl.o | Bin 0 -> 11584 bytes ports/xterm/xterm-359/Tekparse.def | 74 + ports/xterm/xterm-359/Tekparse.h | 55 + ports/xterm/xterm-359/Tekparse.hin | 35 + ports/xterm/xterm-359/Tekproc.c | 2103 ++ ports/xterm/xterm-359/Tekproc.o | Bin 0 -> 155240 bytes ports/xterm/xterm-359/Tests | 42 + ports/xterm/xterm-359/UXTerm.ad | 76 + ports/xterm/xterm-359/VTPrsTbl.c | 9507 ++++++ ports/xterm/xterm-359/VTPrsTbl.o | Bin 0 -> 18072 bytes ports/xterm/xterm-359/VTparse.def | 219 + ports/xterm/xterm-359/VTparse.h | 95 + ports/xterm/xterm-359/VTparse.hin | 180 + ports/xterm/xterm-359/XTerm-col.ad | 163 + ports/xterm/xterm-359/XTerm.ad | 261 + ports/xterm/xterm-359/aclocal.m4 | 5159 ++++ ports/xterm/xterm-359/builtin_icons.h | 271 + ports/xterm/xterm-359/button.c | 5658 ++++ ports/xterm/xterm-359/button.o | Bin 0 -> 258136 bytes ports/xterm/xterm-359/cachedGCs.c | 888 + ports/xterm/xterm-359/cachedGCs.o | Bin 0 -> 89784 bytes ports/xterm/xterm-359/charclass.c | 514 + ports/xterm/xterm-359/charclass.h | 23 + ports/xterm/xterm-359/charclass.o | Bin 0 -> 20696 bytes ports/xterm/xterm-359/charproc.c | 13071 ++++++++ ports/xterm/xterm-359/charproc.o | Bin 0 -> 660592 bytes ports/xterm/xterm-359/charsets.c | 1681 ++ ports/xterm/xterm-359/charsets.o | Bin 0 -> 291328 bytes ports/xterm/xterm-359/config.guess | 1687 ++ ports/xterm/xterm-359/config.log | 2218 ++ ports/xterm/xterm-359/config.status | 1180 + ports/xterm/xterm-359/config.sub | 1851 ++ ports/xterm/xterm-359/configure | 24825 ++++++++++++++++ ports/xterm/xterm-359/configure.in | 1179 + ports/xterm/xterm-359/ctlseqs.ms | 4057 +++ ports/xterm/xterm-359/ctlseqs.txt | 3032 ++ ports/xterm/xterm-359/cursor.c | 468 + ports/xterm/xterm-359/cursor.o | Bin 0 -> 69824 bytes ports/xterm/xterm-359/data.c | 128 + ports/xterm/xterm-359/data.h | 260 + ports/xterm/xterm-359/data.o | Bin 0 -> 65344 bytes ports/xterm/xterm-359/df-install | 162 + ports/xterm/xterm-359/df-install.in | 162 + ports/xterm/xterm-359/doublechr.c | 379 + ports/xterm/xterm-359/doublechr.o | Bin 0 -> 68824 bytes ports/xterm/xterm-359/error.h | 105 + ports/xterm/xterm-359/fontutils.c | 5525 ++++ ports/xterm/xterm-359/fontutils.h | 178 + ports/xterm/xterm-359/fontutils.o | Bin 0 -> 349096 bytes ports/xterm/xterm-359/gen-charsets.pl | 105 + ports/xterm/xterm-359/gen-pc-fkeys.pl | 364 + ports/xterm/xterm-359/graphics.c | 1815 ++ ports/xterm/xterm-359/graphics.h | 127 + ports/xterm/xterm-359/graphics.o | Bin 0 -> 121648 bytes ports/xterm/xterm-359/graphics_regis.c | 7520 +++++ ports/xterm/xterm-359/graphics_regis.h | 48 + ports/xterm/xterm-359/graphics_sixel.c | 656 + ports/xterm/xterm-359/graphics_sixel.h | 48 + ports/xterm/xterm-359/graphics_sixel.o | Bin 0 -> 73552 bytes ports/xterm/xterm-359/html.c | 298 + ports/xterm/xterm-359/html.o | Bin 0 -> 71560 bytes ports/xterm/xterm-359/icons/filled-xterm.png | Bin 0 -> 2341 bytes ports/xterm/xterm-359/icons/filled-xterm.svg | 680 + ports/xterm/xterm-359/icons/filled-xterm.xpms | 694 + .../xterm-359/icons/filled-xterm_16x16.xpm | 129 + .../xterm-359/icons/filled-xterm_32x32.xpm | 260 + .../xterm-359/icons/filled-xterm_48x48.xpm | 297 + ports/xterm/xterm-359/icons/make-xpms | 26 + ports/xterm/xterm-359/icons/mini.xterm.svg | 128 + ports/xterm/xterm-359/icons/mini.xterm.xpms | 553 + .../xterm-359/icons/mini.xterm_16x16.png | Bin 0 -> 732 bytes .../xterm-359/icons/mini.xterm_16x16.xpm | 103 + .../xterm-359/icons/mini.xterm_256x256.png | Bin 0 -> 11587 bytes .../xterm-359/icons/mini.xterm_32x32.png | Bin 0 -> 1434 bytes .../xterm-359/icons/mini.xterm_32x32.xpm | 178 + .../xterm-359/icons/mini.xterm_48x48.png | Bin 0 -> 2194 bytes .../xterm-359/icons/mini.xterm_48x48.xpm | 264 + .../xterm/xterm-359/icons/terminal_48x48.svg | 636 + .../xterm/xterm-359/icons/terminal_48x48.xpm | 53 + ports/xterm/xterm-359/icons/xterm-color.png | Bin 0 -> 1860 bytes ports/xterm/xterm-359/icons/xterm-color.svg | 792 + ports/xterm/xterm-359/icons/xterm-color.xpms | 263 + .../xterm-359/icons/xterm-color_16x16.xpm | 99 + .../xterm-359/icons/xterm-color_32x32.xpm | 95 + .../xterm-359/icons/xterm-color_48x48.xpm | 61 + ports/xterm/xterm-359/icons/xterm.png | Bin 0 -> 843 bytes ports/xterm/xterm-359/icons/xterm.svg | 652 + ports/xterm/xterm-359/icons/xterm.xpms | 119 + ports/xterm/xterm-359/icons/xterm_16x16.xpm | 21 + ports/xterm/xterm-359/icons/xterm_32x32.xpm | 37 + ports/xterm/xterm-359/icons/xterm_48x48.xpm | 53 + ports/xterm/xterm-359/input.c | 2086 ++ ports/xterm/xterm-359/input.o | Bin 0 -> 116024 bytes ports/xterm/xterm-359/install-sh | 294 + ports/xterm/xterm-359/keysym2ucs.c | 871 + ports/xterm/xterm-359/keysym2ucs.h | 9 + ports/xterm/xterm-359/koi8rxterm | 115 + ports/xterm/xterm-359/koi8rxterm.man | 109 + ports/xterm/xterm-359/linedata.c | 292 + ports/xterm/xterm-359/linedata.o | Bin 0 -> 61040 bytes ports/xterm/xterm-359/link_axp.com | 107 + ports/xterm/xterm-359/main.c | 5769 ++++ ports/xterm/xterm-359/main.h | 263 + ports/xterm/xterm-359/main.o | Bin 0 -> 241008 bytes ports/xterm/xterm-359/make.com | 90 + ports/xterm/xterm-359/man2html.tmp | 21 + ports/xterm/xterm-359/menu.c | 4155 +++ ports/xterm/xterm-359/menu.h | 590 + ports/xterm/xterm-359/menu.o | Bin 0 -> 319064 bytes ports/xterm/xterm-359/minstall | 173 + ports/xterm/xterm-359/minstall.in | 173 + ports/xterm/xterm-359/misc.c | 7379 +++++ ports/xterm/xterm-359/misc.o | Bin 0 -> 375784 bytes .../xterm/xterm-359/package/debian/changelog | 569 + .../xterm/xterm-359/package/debian/color.sed | 4 + ports/xterm/xterm-359/package/debian/compat | 1 + ports/xterm/xterm-359/package/debian/control | 23 + .../xterm/xterm-359/package/debian/copyright | 223 + ports/xterm/xterm-359/package/debian/postinst | 25 + ports/xterm/xterm-359/package/debian/prerm | 12 + ports/xterm/xterm-359/package/debian/rules | 197 + .../xterm-359/package/debian/source/format | 1 + ports/xterm/xterm-359/package/debian/watch | 4 + .../xterm-359/package/debian/xterm-dev.docs | 7 + .../debian/xterm-dev.lintian-overrides | 25 + .../xterm-359/package/debian/xterm-dev.menu | 14 + .../xterm-359/package/debian/xterm-xres.sed | 7 + .../xterm/xterm-359/package/freebsd/Makefile | 109 + .../xterm/xterm-359/package/freebsd/distinfo | 3 + .../xterm/xterm-359/package/freebsd/pkg-descr | 10 + .../xterm-359/package/freebsd/pkg-message | 10 + .../package/freebsd/pkg-message.wchar | 10 + .../xterm/xterm-359/package/freebsd/pkg-plist | 23 + ports/xterm/xterm-359/package/pkgsrc/DESCR | 7 + ports/xterm/xterm-359/package/pkgsrc/Makefile | 65 + ports/xterm/xterm-359/package/pkgsrc/PLIST | 25 + ports/xterm/xterm-359/package/pkgsrc/distinfo | 6 + .../xterm/xterm-359/package/pkgsrc/options.mk | 51 + ports/xterm/xterm-359/package/xterm.spec | 274 + ports/xterm/xterm-359/plink.sh | 80 + ports/xterm/xterm-359/precompose.c | 1064 + ports/xterm/xterm-359/precompose.h | 11 + ports/xterm/xterm-359/precompose.o | Bin 0 -> 16872 bytes ports/xterm/xterm-359/print.c | 847 + ports/xterm/xterm-359/print.o | Bin 0 -> 95664 bytes ports/xterm/xterm-359/ptydata.c | 1004 + ports/xterm/xterm-359/ptydata.o | Bin 0 -> 70696 bytes ports/xterm/xterm-359/ptyx.h | 3551 +++ ports/xterm/xterm-359/resize | Bin 0 -> 62976 bytes ports/xterm/xterm-359/resize.c | 606 + ports/xterm/xterm-359/resize.man | 235 + ports/xterm/xterm-359/resize.o | Bin 0 -> 33600 bytes ports/xterm/xterm-359/run-tic.sh | 136 + ports/xterm/xterm-359/screen.c | 3192 ++ ports/xterm/xterm-359/screen.o | Bin 0 -> 185376 bytes ports/xterm/xterm-359/scrollback.c | 129 + ports/xterm/xterm-359/scrollback.o | Bin 0 -> 50712 bytes ports/xterm/xterm-359/scrollbar.c | 1030 + ports/xterm/xterm-359/scrollbar.o | Bin 0 -> 105856 bytes ports/xterm/xterm-359/sinstall.sh | 198 + ports/xterm/xterm-359/svg.c | 285 + ports/xterm/xterm-359/svg.o | Bin 0 -> 74336 bytes ports/xterm/xterm-359/tabs.c | 198 + ports/xterm/xterm-359/tabs.o | Bin 0 -> 59184 bytes ports/xterm/xterm-359/tektests/aitest.tek | 1 + ports/xterm/xterm-359/tektests/dmerc.tek | 1 + ports/xterm/xterm-359/tektests/fotest.tek | Bin 0 -> 16231 bytes ports/xterm/xterm-359/tektests/imtest.tek | 1 + ports/xterm/xterm-359/tektests/imtesth.tek | 1 + ports/xterm/xterm-359/tektests/ocpred.tek | 3 + ports/xterm/xterm-359/tektests/usmap.tek | Bin 0 -> 6939 bytes ports/xterm/xterm-359/termcap | 248 + ports/xterm/xterm-359/terminfo | 2650 ++ ports/xterm/xterm-359/testxmc.c | 232 + ports/xterm/xterm-359/trace.c | 1464 + ports/xterm/xterm-359/trace.h | 235 + ports/xterm/xterm-359/unicode/README | 23 + ports/xterm/xterm-359/unicode/convmap.pl | 205 + ports/xterm/xterm-359/unicode/keysym.map | 1053 + .../xterm-359/unicode/make-precompose.sh | 18 + .../xterm/xterm-359/unicode/precompose.c.head | 15 + .../xterm/xterm-359/unicode/precompose.c.tail | 24 + ports/xterm/xterm-359/util.c | 5513 ++++ ports/xterm/xterm-359/util.o | Bin 0 -> 326400 bytes ports/xterm/xterm-359/uxterm | 149 + ports/xterm/xterm-359/uxterm.desktop | 43 + ports/xterm/xterm-359/uxterm.man | 103 + ports/xterm/xterm-359/version.c | 80 + ports/xterm/xterm-359/version.h | 50 + ports/xterm/xterm-359/version.o | Bin 0 -> 7608 bytes ports/xterm/xterm-359/vms.c | 724 + ports/xterm/xterm-359/vms.h | 41 + ports/xterm/xterm-359/vttests/16colors.sh | 119 + ports/xterm/xterm-359/vttests/256colors.pl | 52 + ports/xterm/xterm-359/vttests/256colors2.pl | 226 + ports/xterm/xterm-359/vttests/88colors.pl | 49 + ports/xterm/xterm-359/vttests/88colors2.pl | 228 + ports/xterm/xterm-359/vttests/8colors.sh | 107 + ports/xterm/xterm-359/vttests/acolors.sh | 93 + ports/xterm/xterm-359/vttests/closest-rgb.pl | 237 + ports/xterm/xterm-359/vttests/doublechars.sh | 116 + ports/xterm/xterm-359/vttests/dynamic.pl | 136 + ports/xterm/xterm-359/vttests/dynamic.sh | 89 + ports/xterm/xterm-359/vttests/dynamic2.sh | 114 + ports/xterm/xterm-359/vttests/fonts.sh | 87 + ports/xterm/xterm-359/vttests/modify-keys.pl | 1531 + ports/xterm/xterm-359/vttests/mouse-codes | 160 + ports/xterm/xterm-359/vttests/other-sgr.sh | 125 + ports/xterm/xterm-359/vttests/paste64.pl | 190 + .../xterm/xterm-359/vttests/print-vt-chars.pl | 389 + ports/xterm/xterm-359/vttests/query-color.pl | 256 + .../xterm/xterm-359/vttests/query-dynamic.pl | 229 + ports/xterm/xterm-359/vttests/query-fonts.pl | 158 + ports/xterm/xterm-359/vttests/query-status.pl | 164 + ports/xterm/xterm-359/vttests/query-xres.pl | 226 + ports/xterm/xterm-359/vttests/report-sgr.pl | 669 + ports/xterm/xterm-359/vttests/resize.pl | 147 + ports/xterm/xterm-359/vttests/resize.sh | 111 + ports/xterm/xterm-359/vttests/sgrPushPop.pl | 87 + ports/xterm/xterm-359/vttests/sgrPushPop2.pl | 223 + ports/xterm/xterm-359/vttests/tcapquery.pl | 374 + ports/xterm/xterm-359/vttests/title.sh | 84 + ports/xterm/xterm-359/wcwidth.c | 887 + ports/xterm/xterm-359/wcwidth.h | 47 + ports/xterm/xterm-359/wcwidth.o | Bin 0 -> 29296 bytes ports/xterm/xterm-359/xcharmouse.h | 93 + ports/xterm/xterm-359/xstrings.c | 579 + ports/xterm/xterm-359/xstrings.h | 68 + ports/xterm/xterm-359/xstrings.o | Bin 0 -> 37920 bytes ports/xterm/xterm-359/xterm | Bin 0 -> 2934208 bytes ports/xterm/xterm-359/xterm.appdata.xml | 47 + ports/xterm/xterm-359/xterm.dat | 162 + ports/xterm/xterm-359/xterm.desktop | 43 + ports/xterm/xterm-359/xterm.h | 1742 ++ ports/xterm/xterm-359/xterm.log.html | 15830 ++++++++++ ports/xterm/xterm-359/xterm.man | 8552 ++++++ ports/xterm/xterm-359/xterm_axp.opt | 28 + ports/xterm/xterm-359/xterm_io.h | 287 + ports/xterm/xterm-359/xtermcap.c | 653 + ports/xterm/xterm-359/xtermcap.h | 120 + ports/xterm/xterm-359/xtermcap.o | Bin 0 -> 89368 bytes ports/xterm/xterm-359/xtermcfg.h | 252 + ports/xterm/xterm-359/xtermcfg.hin | 251 + ports/xterm/xterm-359/xutf8.c | 381 + ports/xterm/xterm-359/xutf8.h | 61 + 309 files changed, 197834 insertions(+), 4 deletions(-) create mode 100644 mbase/ROX-Filer create mode 100644 mbase/alsa-lib create mode 100644 mbase/alsa-plugins create mode 100644 mbase/alsa-utils create mode 100644 mbase/epic create mode 100644 mbase/fbv-git create mode 100755 mbase/gnugrep/build create mode 100644 mbase/gnugrep/checksums create mode 100644 mbase/gnugrep/sources create mode 100644 mbase/gnugrep/version create mode 100644 mbase/liberation-fonts create mode 120000 mbase/neXtaw create mode 100644 mbase/norm.txt delete mode 120000 mbase/psmisc-git create mode 100644 mbase/scrot create mode 100644 mbase/sxiv create mode 100644 mbase/tzdata create mode 100644 mbase/xf86-input-libinput create mode 100644 mbase/xorg-server create mode 100644 mbase/xwallpaper create mode 100755 ports/ffmpeg/diffutils/build create mode 100644 ports/ffmpeg/diffutils/checksums create mode 100644 ports/ffmpeg/diffutils/sources create mode 100644 ports/ffmpeg/diffutils/version rename ports/{links2 => links2-mod}/build (100%) rename ports/{links2 => links2-mod}/checksums (100%) rename ports/{links2 => links2-mod}/depends (100%) rename ports/{links2 => links2-mod}/manifest (100%) rename ports/{links2 => links2-mod}/patches/01-links-tabbed.patch (100%) rename ports/{links2 => links2-mod}/sources (100%) rename ports/{links2 => links2-mod}/version (100%) create mode 100755 ports/neXtaw/build create mode 100644 ports/neXtaw/checksums create mode 100644 ports/neXtaw/files/nextaw.pc create mode 100644 ports/neXtaw/sources create mode 100644 ports/neXtaw/version create mode 100644 ports/neXtaw/xaw7.pc create mode 100644 ports/xterm/xterm-359.tgz create mode 100644 ports/xterm/xterm-359/256colres.h create mode 100755 ports/xterm/xterm-359/256colres.pl create mode 100644 ports/xterm/xterm-359/88colres.h create mode 100755 ports/xterm/xterm-359/88colres.pl create mode 100644 ports/xterm/xterm-359/AAA_README_VMS.txt create mode 100644 ports/xterm/xterm-359/COPYING create mode 100644 ports/xterm/xterm-359/INSTALL create mode 100644 ports/xterm/xterm-359/Imakefile create mode 100644 ports/xterm/xterm-359/KOI8RXTerm.ad create mode 100644 ports/xterm/xterm-359/MANIFEST create mode 100644 ports/xterm/xterm-359/Makefile create mode 100644 ports/xterm/xterm-359/Makefile.in create mode 100644 ports/xterm/xterm-359/NEWS create mode 100644 ports/xterm/xterm-359/README create mode 100644 ports/xterm/xterm-359/README.i18n create mode 100644 ports/xterm/xterm-359/README.os390 create mode 100644 ports/xterm/xterm-359/THANKS create mode 100644 ports/xterm/xterm-359/TekPrsTbl.c create mode 100644 ports/xterm/xterm-359/TekPrsTbl.o create mode 100644 ports/xterm/xterm-359/Tekparse.def create mode 100644 ports/xterm/xterm-359/Tekparse.h create mode 100644 ports/xterm/xterm-359/Tekparse.hin create mode 100644 ports/xterm/xterm-359/Tekproc.c create mode 100644 ports/xterm/xterm-359/Tekproc.o create mode 100644 ports/xterm/xterm-359/Tests create mode 100644 ports/xterm/xterm-359/UXTerm.ad create mode 100644 ports/xterm/xterm-359/VTPrsTbl.c create mode 100644 ports/xterm/xterm-359/VTPrsTbl.o create mode 100644 ports/xterm/xterm-359/VTparse.def create mode 100644 ports/xterm/xterm-359/VTparse.h create mode 100644 ports/xterm/xterm-359/VTparse.hin create mode 100644 ports/xterm/xterm-359/XTerm-col.ad create mode 100644 ports/xterm/xterm-359/XTerm.ad create mode 100644 ports/xterm/xterm-359/aclocal.m4 create mode 100644 ports/xterm/xterm-359/builtin_icons.h create mode 100644 ports/xterm/xterm-359/button.c create mode 100644 ports/xterm/xterm-359/button.o create mode 100644 ports/xterm/xterm-359/cachedGCs.c create mode 100644 ports/xterm/xterm-359/cachedGCs.o create mode 100644 ports/xterm/xterm-359/charclass.c create mode 100644 ports/xterm/xterm-359/charclass.h create mode 100644 ports/xterm/xterm-359/charclass.o create mode 100644 ports/xterm/xterm-359/charproc.c create mode 100644 ports/xterm/xterm-359/charproc.o create mode 100644 ports/xterm/xterm-359/charsets.c create mode 100644 ports/xterm/xterm-359/charsets.o create mode 100755 ports/xterm/xterm-359/config.guess create mode 100644 ports/xterm/xterm-359/config.log create mode 100755 ports/xterm/xterm-359/config.status create mode 100755 ports/xterm/xterm-359/config.sub create mode 100755 ports/xterm/xterm-359/configure create mode 100644 ports/xterm/xterm-359/configure.in create mode 100644 ports/xterm/xterm-359/ctlseqs.ms create mode 100644 ports/xterm/xterm-359/ctlseqs.txt create mode 100644 ports/xterm/xterm-359/cursor.c create mode 100644 ports/xterm/xterm-359/cursor.o create mode 100644 ports/xterm/xterm-359/data.c create mode 100644 ports/xterm/xterm-359/data.h create mode 100644 ports/xterm/xterm-359/data.o create mode 100644 ports/xterm/xterm-359/df-install create mode 100644 ports/xterm/xterm-359/df-install.in create mode 100644 ports/xterm/xterm-359/doublechr.c create mode 100644 ports/xterm/xterm-359/doublechr.o create mode 100644 ports/xterm/xterm-359/error.h create mode 100644 ports/xterm/xterm-359/fontutils.c create mode 100644 ports/xterm/xterm-359/fontutils.h create mode 100644 ports/xterm/xterm-359/fontutils.o create mode 100755 ports/xterm/xterm-359/gen-charsets.pl create mode 100755 ports/xterm/xterm-359/gen-pc-fkeys.pl create mode 100644 ports/xterm/xterm-359/graphics.c create mode 100644 ports/xterm/xterm-359/graphics.h create mode 100644 ports/xterm/xterm-359/graphics.o create mode 100644 ports/xterm/xterm-359/graphics_regis.c create mode 100644 ports/xterm/xterm-359/graphics_regis.h create mode 100644 ports/xterm/xterm-359/graphics_sixel.c create mode 100644 ports/xterm/xterm-359/graphics_sixel.h create mode 100644 ports/xterm/xterm-359/graphics_sixel.o create mode 100644 ports/xterm/xterm-359/html.c create mode 100644 ports/xterm/xterm-359/html.o create mode 100644 ports/xterm/xterm-359/icons/filled-xterm.png create mode 100644 ports/xterm/xterm-359/icons/filled-xterm.svg create mode 100644 ports/xterm/xterm-359/icons/filled-xterm.xpms create mode 100644 ports/xterm/xterm-359/icons/filled-xterm_16x16.xpm create mode 100644 ports/xterm/xterm-359/icons/filled-xterm_32x32.xpm create mode 100644 ports/xterm/xterm-359/icons/filled-xterm_48x48.xpm create mode 100755 ports/xterm/xterm-359/icons/make-xpms create mode 100644 ports/xterm/xterm-359/icons/mini.xterm.svg create mode 100644 ports/xterm/xterm-359/icons/mini.xterm.xpms create mode 100644 ports/xterm/xterm-359/icons/mini.xterm_16x16.png create mode 100644 ports/xterm/xterm-359/icons/mini.xterm_16x16.xpm create mode 100644 ports/xterm/xterm-359/icons/mini.xterm_256x256.png create mode 100644 ports/xterm/xterm-359/icons/mini.xterm_32x32.png create mode 100644 ports/xterm/xterm-359/icons/mini.xterm_32x32.xpm create mode 100644 ports/xterm/xterm-359/icons/mini.xterm_48x48.png create mode 100644 ports/xterm/xterm-359/icons/mini.xterm_48x48.xpm create mode 100644 ports/xterm/xterm-359/icons/terminal_48x48.svg create mode 100644 ports/xterm/xterm-359/icons/terminal_48x48.xpm create mode 100644 ports/xterm/xterm-359/icons/xterm-color.png create mode 100644 ports/xterm/xterm-359/icons/xterm-color.svg create mode 100644 ports/xterm/xterm-359/icons/xterm-color.xpms create mode 100644 ports/xterm/xterm-359/icons/xterm-color_16x16.xpm create mode 100644 ports/xterm/xterm-359/icons/xterm-color_32x32.xpm create mode 100644 ports/xterm/xterm-359/icons/xterm-color_48x48.xpm create mode 100644 ports/xterm/xterm-359/icons/xterm.png create mode 100644 ports/xterm/xterm-359/icons/xterm.svg create mode 100644 ports/xterm/xterm-359/icons/xterm.xpms create mode 100644 ports/xterm/xterm-359/icons/xterm_16x16.xpm create mode 100644 ports/xterm/xterm-359/icons/xterm_32x32.xpm create mode 100644 ports/xterm/xterm-359/icons/xterm_48x48.xpm create mode 100644 ports/xterm/xterm-359/input.c create mode 100644 ports/xterm/xterm-359/input.o create mode 100755 ports/xterm/xterm-359/install-sh create mode 100644 ports/xterm/xterm-359/keysym2ucs.c create mode 100644 ports/xterm/xterm-359/keysym2ucs.h create mode 100755 ports/xterm/xterm-359/koi8rxterm create mode 100644 ports/xterm/xterm-359/koi8rxterm.man create mode 100644 ports/xterm/xterm-359/linedata.c create mode 100644 ports/xterm/xterm-359/linedata.o create mode 100644 ports/xterm/xterm-359/link_axp.com create mode 100644 ports/xterm/xterm-359/main.c create mode 100644 ports/xterm/xterm-359/main.h create mode 100644 ports/xterm/xterm-359/main.o create mode 100644 ports/xterm/xterm-359/make.com create mode 100755 ports/xterm/xterm-359/man2html.tmp create mode 100644 ports/xterm/xterm-359/menu.c create mode 100644 ports/xterm/xterm-359/menu.h create mode 100644 ports/xterm/xterm-359/menu.o create mode 100644 ports/xterm/xterm-359/minstall create mode 100644 ports/xterm/xterm-359/minstall.in create mode 100644 ports/xterm/xterm-359/misc.c create mode 100644 ports/xterm/xterm-359/misc.o create mode 100644 ports/xterm/xterm-359/package/debian/changelog create mode 100644 ports/xterm/xterm-359/package/debian/color.sed create mode 100644 ports/xterm/xterm-359/package/debian/compat create mode 100644 ports/xterm/xterm-359/package/debian/control create mode 100644 ports/xterm/xterm-359/package/debian/copyright create mode 100644 ports/xterm/xterm-359/package/debian/postinst create mode 100644 ports/xterm/xterm-359/package/debian/prerm create mode 100755 ports/xterm/xterm-359/package/debian/rules create mode 100644 ports/xterm/xterm-359/package/debian/source/format create mode 100644 ports/xterm/xterm-359/package/debian/watch create mode 100644 ports/xterm/xterm-359/package/debian/xterm-dev.docs create mode 100644 ports/xterm/xterm-359/package/debian/xterm-dev.lintian-overrides create mode 100644 ports/xterm/xterm-359/package/debian/xterm-dev.menu create mode 100644 ports/xterm/xterm-359/package/debian/xterm-xres.sed create mode 100644 ports/xterm/xterm-359/package/freebsd/Makefile create mode 100644 ports/xterm/xterm-359/package/freebsd/distinfo create mode 100644 ports/xterm/xterm-359/package/freebsd/pkg-descr create mode 100644 ports/xterm/xterm-359/package/freebsd/pkg-message create mode 100644 ports/xterm/xterm-359/package/freebsd/pkg-message.wchar create mode 100644 ports/xterm/xterm-359/package/freebsd/pkg-plist create mode 100644 ports/xterm/xterm-359/package/pkgsrc/DESCR create mode 100644 ports/xterm/xterm-359/package/pkgsrc/Makefile create mode 100644 ports/xterm/xterm-359/package/pkgsrc/PLIST create mode 100644 ports/xterm/xterm-359/package/pkgsrc/distinfo create mode 100644 ports/xterm/xterm-359/package/pkgsrc/options.mk create mode 100644 ports/xterm/xterm-359/package/xterm.spec create mode 100755 ports/xterm/xterm-359/plink.sh create mode 100644 ports/xterm/xterm-359/precompose.c create mode 100644 ports/xterm/xterm-359/precompose.h create mode 100644 ports/xterm/xterm-359/precompose.o create mode 100644 ports/xterm/xterm-359/print.c create mode 100644 ports/xterm/xterm-359/print.o create mode 100644 ports/xterm/xterm-359/ptydata.c create mode 100644 ports/xterm/xterm-359/ptydata.o create mode 100644 ports/xterm/xterm-359/ptyx.h create mode 100755 ports/xterm/xterm-359/resize create mode 100644 ports/xterm/xterm-359/resize.c create mode 100644 ports/xterm/xterm-359/resize.man create mode 100644 ports/xterm/xterm-359/resize.o create mode 100755 ports/xterm/xterm-359/run-tic.sh create mode 100644 ports/xterm/xterm-359/screen.c create mode 100644 ports/xterm/xterm-359/screen.o create mode 100644 ports/xterm/xterm-359/scrollback.c create mode 100644 ports/xterm/xterm-359/scrollback.o create mode 100644 ports/xterm/xterm-359/scrollbar.c create mode 100644 ports/xterm/xterm-359/scrollbar.o create mode 100755 ports/xterm/xterm-359/sinstall.sh create mode 100644 ports/xterm/xterm-359/svg.c create mode 100644 ports/xterm/xterm-359/svg.o create mode 100644 ports/xterm/xterm-359/tabs.c create mode 100644 ports/xterm/xterm-359/tabs.o create mode 100644 ports/xterm/xterm-359/tektests/aitest.tek create mode 100644 ports/xterm/xterm-359/tektests/dmerc.tek create mode 100644 ports/xterm/xterm-359/tektests/fotest.tek create mode 100644 ports/xterm/xterm-359/tektests/imtest.tek create mode 100644 ports/xterm/xterm-359/tektests/imtesth.tek create mode 100644 ports/xterm/xterm-359/tektests/ocpred.tek create mode 100644 ports/xterm/xterm-359/tektests/usmap.tek create mode 100644 ports/xterm/xterm-359/termcap create mode 100644 ports/xterm/xterm-359/terminfo create mode 100644 ports/xterm/xterm-359/testxmc.c create mode 100644 ports/xterm/xterm-359/trace.c create mode 100644 ports/xterm/xterm-359/trace.h create mode 100644 ports/xterm/xterm-359/unicode/README create mode 100755 ports/xterm/xterm-359/unicode/convmap.pl create mode 100644 ports/xterm/xterm-359/unicode/keysym.map create mode 100755 ports/xterm/xterm-359/unicode/make-precompose.sh create mode 100644 ports/xterm/xterm-359/unicode/precompose.c.head create mode 100644 ports/xterm/xterm-359/unicode/precompose.c.tail create mode 100644 ports/xterm/xterm-359/util.c create mode 100644 ports/xterm/xterm-359/util.o create mode 100755 ports/xterm/xterm-359/uxterm create mode 100644 ports/xterm/xterm-359/uxterm.desktop create mode 100644 ports/xterm/xterm-359/uxterm.man create mode 100644 ports/xterm/xterm-359/version.c create mode 100644 ports/xterm/xterm-359/version.h create mode 100644 ports/xterm/xterm-359/version.o create mode 100644 ports/xterm/xterm-359/vms.c create mode 100644 ports/xterm/xterm-359/vms.h create mode 100755 ports/xterm/xterm-359/vttests/16colors.sh create mode 100755 ports/xterm/xterm-359/vttests/256colors.pl create mode 100755 ports/xterm/xterm-359/vttests/256colors2.pl create mode 100755 ports/xterm/xterm-359/vttests/88colors.pl create mode 100755 ports/xterm/xterm-359/vttests/88colors2.pl create mode 100755 ports/xterm/xterm-359/vttests/8colors.sh create mode 100755 ports/xterm/xterm-359/vttests/acolors.sh create mode 100755 ports/xterm/xterm-359/vttests/closest-rgb.pl create mode 100755 ports/xterm/xterm-359/vttests/doublechars.sh create mode 100755 ports/xterm/xterm-359/vttests/dynamic.pl create mode 100755 ports/xterm/xterm-359/vttests/dynamic.sh create mode 100755 ports/xterm/xterm-359/vttests/dynamic2.sh create mode 100755 ports/xterm/xterm-359/vttests/fonts.sh create mode 100755 ports/xterm/xterm-359/vttests/modify-keys.pl create mode 100755 ports/xterm/xterm-359/vttests/mouse-codes create mode 100755 ports/xterm/xterm-359/vttests/other-sgr.sh create mode 100755 ports/xterm/xterm-359/vttests/paste64.pl create mode 100755 ports/xterm/xterm-359/vttests/print-vt-chars.pl create mode 100755 ports/xterm/xterm-359/vttests/query-color.pl create mode 100755 ports/xterm/xterm-359/vttests/query-dynamic.pl create mode 100755 ports/xterm/xterm-359/vttests/query-fonts.pl create mode 100755 ports/xterm/xterm-359/vttests/query-status.pl create mode 100755 ports/xterm/xterm-359/vttests/query-xres.pl create mode 100755 ports/xterm/xterm-359/vttests/report-sgr.pl create mode 100755 ports/xterm/xterm-359/vttests/resize.pl create mode 100755 ports/xterm/xterm-359/vttests/resize.sh create mode 100755 ports/xterm/xterm-359/vttests/sgrPushPop.pl create mode 100755 ports/xterm/xterm-359/vttests/sgrPushPop2.pl create mode 100755 ports/xterm/xterm-359/vttests/tcapquery.pl create mode 100755 ports/xterm/xterm-359/vttests/title.sh create mode 100644 ports/xterm/xterm-359/wcwidth.c create mode 100644 ports/xterm/xterm-359/wcwidth.h create mode 100644 ports/xterm/xterm-359/wcwidth.o create mode 100644 ports/xterm/xterm-359/xcharmouse.h create mode 100644 ports/xterm/xterm-359/xstrings.c create mode 100644 ports/xterm/xterm-359/xstrings.h create mode 100644 ports/xterm/xterm-359/xstrings.o create mode 100755 ports/xterm/xterm-359/xterm create mode 100644 ports/xterm/xterm-359/xterm.appdata.xml create mode 100644 ports/xterm/xterm-359/xterm.dat create mode 100644 ports/xterm/xterm-359/xterm.desktop create mode 100644 ports/xterm/xterm-359/xterm.h create mode 100644 ports/xterm/xterm-359/xterm.log.html create mode 100644 ports/xterm/xterm-359/xterm.man create mode 100644 ports/xterm/xterm-359/xterm_axp.opt create mode 100644 ports/xterm/xterm-359/xterm_io.h create mode 100644 ports/xterm/xterm-359/xtermcap.c create mode 100644 ports/xterm/xterm-359/xtermcap.h create mode 100644 ports/xterm/xterm-359/xtermcap.o create mode 100644 ports/xterm/xterm-359/xtermcfg.h create mode 100644 ports/xterm/xterm-359/xtermcfg.hin create mode 100644 ports/xterm/xterm-359/xutf8.c create mode 100644 ports/xterm/xterm-359/xutf8.h diff --git a/mbase/ROX-Filer b/mbase/ROX-Filer new file mode 100644 index 0000000..e69de29 diff --git a/mbase/alsa-lib b/mbase/alsa-lib new file mode 100644 index 0000000..e69de29 diff --git a/mbase/alsa-plugins b/mbase/alsa-plugins new file mode 100644 index 0000000..e69de29 diff --git a/mbase/alsa-utils b/mbase/alsa-utils new file mode 100644 index 0000000..e69de29 diff --git a/mbase/epic b/mbase/epic new file mode 100644 index 0000000..e69de29 diff --git a/mbase/fbv-git b/mbase/fbv-git new file mode 100644 index 0000000..e69de29 diff --git a/mbase/gnugrep/build b/mbase/gnugrep/build new file mode 100755 index 0000000..bfe5990 --- /dev/null +++ b/mbase/gnugrep/build @@ -0,0 +1,11 @@ +#!/bin/sh -e + +export CFLAGS="$CFLAGS -Wno-error -static" + +./configure \ + --prefix=/usr + +make +make DESTDIR="$1" install + +install -Dm755 src/grep "$1/usr/bin/ggrep" diff --git a/mbase/gnugrep/checksums b/mbase/gnugrep/checksums new file mode 100644 index 0000000..8ca1835 --- /dev/null +++ b/mbase/gnugrep/checksums @@ -0,0 +1 @@ +667e15e8afe189e93f9f21a7cd3a7b3f776202f417330b248c2ad4f997d9373e diff --git a/mbase/gnugrep/sources b/mbase/gnugrep/sources new file mode 100644 index 0000000..35d5bb3 --- /dev/null +++ b/mbase/gnugrep/sources @@ -0,0 +1 @@ +https://ftp.gnu.org/gnu/grep/grep-3.6.tar.xz diff --git a/mbase/gnugrep/version b/mbase/gnugrep/version new file mode 100644 index 0000000..8c2b20b --- /dev/null +++ b/mbase/gnugrep/version @@ -0,0 +1 @@ +3.6 1 diff --git a/mbase/liberation-fonts b/mbase/liberation-fonts new file mode 100644 index 0000000..e69de29 diff --git a/mbase/neXtaw b/mbase/neXtaw new file mode 120000 index 0000000..4ffc8e5 --- /dev/null +++ b/mbase/neXtaw @@ -0,0 +1 @@ +../ports/neXtaw \ No newline at end of file diff --git a/mbase/norm.txt b/mbase/norm.txt new file mode 100644 index 0000000..7d94a02 --- /dev/null +++ b/mbase/norm.txt @@ -0,0 +1 @@ +9base-mod 9wm ROX-Filer alsa-lib alsa-plugins alsa-utils atk autoconf automake axel baselayout bash binutils bison bzip2 cairo cmake curl cyrus-sasl diffutils dropbear dtach-git epic eudev expat fbv-git ffmpeg file flex fontconfig freetype-harfbuzz fribidi fvwm3-git gavin-bc-git gcc gccmakedep-git gdk-pixbuf gettext-tiny giblib giflib git glib gmp gnugrep gnutls gperf gtk+2 gtk2-engines-clearlooks gv gzip hicolor hummingbird-git iana-etc imake-git imlib2 inetutils intltool kiss-mod lame leafpad less libICE libSM libX11 libXScrnSaver libXau libXaw3d-git libXcomposite libXcursor libXdamage libXdmcp libXext libXfixes libXfont2 libXft libXi libXinerama libXmu libXpm libXrandr libXrender libXt libXtst libXxf86vm libarchive libass libbson-git libdrm libelf libepoxy liberation-fonts libevdev libevent libexif libffi libfontenc libgcrypt libgpg-error libinput libjpeg-turbo libmbim libmpc libnl libogg libpcap libpciaccess libpng libressl libtheora libtool libusb libvorbis libvpx libxcb libxkbfile libxml2 libxshmfence links2 linux-headers llvm lxtask lz4 m4 make man-pages-posix mandoc mesa meson mpfr mtdev mtm-git mtpaint-git nasm ncurses net-tools nettle nilfs-utils nmap oksh opus otawk-git pango patch pciutils pcre perl perl-xml pidgin pixman pkgconf procps-ng purple-discord-git python ruby samurai sbase-git-mod scrot sdl2 sed shadow shared-mime-info shellcheck-bin slock sqlite ssu stalonetray sxiv sysklogd-git syslinux sysmgr tabbed tcpdump tine-git tt++ tzdata ubase-git-mod usbutils util-linux x265 xbitmaps xcalc xcb-proto xcb-util xcb-util-image xcb-util-keysyms xcb-util-wm xcompmgr xdm xev xf86-input-libinput xf86-video-amdgpu xfsprogs xinit xinput xkbcomp xkeyboard-config xless xmessage xorg-cf xorg-fontutil xorg-server xorg-util-macros xorgproto xosview xrdb xset xsetroot xssstart xterm xtrans xvidcore xvkbd xwallpaper xz zlib zstd diff --git a/mbase/psmisc-git b/mbase/psmisc-git deleted file mode 120000 index 996aa7d..0000000 --- a/mbase/psmisc-git +++ /dev/null @@ -1 +0,0 @@ -../ports/psmisc-git \ No newline at end of file diff --git a/mbase/scrot b/mbase/scrot new file mode 100644 index 0000000..e69de29 diff --git a/mbase/sxiv b/mbase/sxiv new file mode 100644 index 0000000..e69de29 diff --git a/mbase/tzdata b/mbase/tzdata new file mode 100644 index 0000000..e69de29 diff --git a/mbase/xf86-input-libinput b/mbase/xf86-input-libinput new file mode 100644 index 0000000..e69de29 diff --git a/mbase/xorg-server b/mbase/xorg-server new file mode 100644 index 0000000..e69de29 diff --git a/mbase/xwallpaper b/mbase/xwallpaper new file mode 100644 index 0000000..e69de29 diff --git a/ports/ffmpeg/diffutils/build b/ports/ffmpeg/diffutils/build new file mode 100755 index 0000000..206a476 --- /dev/null +++ b/ports/ffmpeg/diffutils/build @@ -0,0 +1,9 @@ +#!/bin/sh -e + +export CFLAGS="$CFLAGS -static" + +./configure \ + --prefix=/usr + +make +make DESTDIR="$1" install diff --git a/ports/ffmpeg/diffutils/checksums b/ports/ffmpeg/diffutils/checksums new file mode 100644 index 0000000..785fdb3 --- /dev/null +++ b/ports/ffmpeg/diffutils/checksums @@ -0,0 +1 @@ +b3a7a6221c3dc916085f0d205abf6b8e1ba443d4dd965118da364a1dc1cb3a26 diffutils-3.7.tar.xz diff --git a/ports/ffmpeg/diffutils/sources b/ports/ffmpeg/diffutils/sources new file mode 100644 index 0000000..f0af8e7 --- /dev/null +++ b/ports/ffmpeg/diffutils/sources @@ -0,0 +1 @@ +https://ftp.gnu.org/gnu/diffutils/diffutils-3.7.tar.xz diff --git a/ports/ffmpeg/diffutils/version b/ports/ffmpeg/diffutils/version new file mode 100644 index 0000000..fa0ebc7 --- /dev/null +++ b/ports/ffmpeg/diffutils/version @@ -0,0 +1 @@ +3.7 1 diff --git a/ports/gtk2-engines-clearlooks/depends b/ports/gtk2-engines-clearlooks/depends index 203fd04..b6aadd6 100644 --- a/ports/gtk2-engines-clearlooks/depends +++ b/ports/gtk2-engines-clearlooks/depends @@ -1,2 +1,3 @@ +perl-xml make gtk+2 intltool make diff --git a/ports/gtk2-engines-murrine/depends b/ports/gtk2-engines-murrine/depends index 5109d24..007b953 100644 --- a/ports/gtk2-engines-murrine/depends +++ b/ports/gtk2-engines-murrine/depends @@ -1,3 +1,4 @@ +perl-xml make gettext-tiny make gtk+2 intltool make diff --git a/ports/gv/depends b/ports/gv/depends index 7fa336c..538506b 100644 --- a/ports/gv/depends +++ b/ports/gv/depends @@ -1,3 +1,4 @@ +ghostscript freetype-harfbuzz libICE libSM diff --git a/ports/libXaw3d-git/build b/ports/libXaw3d-git/build index b2f475e..dbd376c 100755 --- a/ports/libXaw3d-git/build +++ b/ports/libXaw3d-git/build @@ -5,3 +5,7 @@ make make DESTDIR="$1" install + +#ln -s "/usr/include/X11/Xaw3d" "$1/usr/include/X11/Xaw" +#ln -s "/usr/lib/pkgconfig/xaw3d.pc" "/usr/lib/pkgconfig/xaw7.pc" +#ln -s "/usr/lib/libXaw3d.so" "$1/usr/lib/libXaw7.so" diff --git a/ports/links2/build b/ports/links2-mod/build similarity index 100% rename from ports/links2/build rename to ports/links2-mod/build diff --git a/ports/links2/checksums b/ports/links2-mod/checksums similarity index 100% rename from ports/links2/checksums rename to ports/links2-mod/checksums diff --git a/ports/links2/depends b/ports/links2-mod/depends similarity index 100% rename from ports/links2/depends rename to ports/links2-mod/depends diff --git a/ports/links2/manifest b/ports/links2-mod/manifest similarity index 100% rename from ports/links2/manifest rename to ports/links2-mod/manifest diff --git a/ports/links2/patches/01-links-tabbed.patch b/ports/links2-mod/patches/01-links-tabbed.patch similarity index 100% rename from ports/links2/patches/01-links-tabbed.patch rename to ports/links2-mod/patches/01-links-tabbed.patch diff --git a/ports/links2/sources b/ports/links2-mod/sources similarity index 100% rename from ports/links2/sources rename to ports/links2-mod/sources diff --git a/ports/links2/version b/ports/links2-mod/version similarity index 100% rename from ports/links2/version rename to ports/links2-mod/version diff --git a/ports/neXtaw/build b/ports/neXtaw/build new file mode 100755 index 0000000..1295fe8 --- /dev/null +++ b/ports/neXtaw/build @@ -0,0 +1,8 @@ +#!/bin/sh -e + +./configure \ + --prefix=/usr \ + +make +make DESTDIR="$1" install +install -Dm644 nextaw.pc "$1/usr/lib/pkgconfig/nextaw.pc" diff --git a/ports/neXtaw/checksums b/ports/neXtaw/checksums new file mode 100644 index 0000000..e0c86a6 --- /dev/null +++ b/ports/neXtaw/checksums @@ -0,0 +1 @@ +7cfe6706b9a76620389e04a7a87f06786c8a6606829c3157c3e9e45a805bb584 diff --git a/ports/neXtaw/files/nextaw.pc b/ports/neXtaw/files/nextaw.pc new file mode 100644 index 0000000..7051f0e --- /dev/null +++ b/ports/neXtaw/files/nextaw.pc @@ -0,0 +1,12 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: neXtaw +Description: Xaw with N*XTSTEP look and feel +Version: 1.0.13 +Requires: xproto xt +Requires.private: x11 xext xt xmu xpm +Cflags: -I${includedir} +Libs: -L${libdir} -lneXtaw diff --git a/ports/neXtaw/sources b/ports/neXtaw/sources new file mode 100644 index 0000000..356a9c1 --- /dev/null +++ b/ports/neXtaw/sources @@ -0,0 +1,2 @@ +http://siag.nu/pub/neXtaw/neXtaw-0.15.1.tar.gz +files/nextaw.pc diff --git a/ports/neXtaw/version b/ports/neXtaw/version new file mode 100644 index 0000000..a506fde --- /dev/null +++ b/ports/neXtaw/version @@ -0,0 +1 @@ +0.15.1 1 diff --git a/ports/neXtaw/xaw7.pc b/ports/neXtaw/xaw7.pc new file mode 100644 index 0000000..7470c4e --- /dev/null +++ b/ports/neXtaw/xaw7.pc @@ -0,0 +1,12 @@ +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: Xaw +Description: X Athena Widgets Library, version 7 +Version: 1.0.13 +Requires: xproto xt +Requires.private: x11 xext xt xmu xpm +Cflags: -I${includedir} +Libs: -L${libdir} -lneXtaw diff --git a/ports/xclock/build b/ports/xclock/build index 036cfd3..27440f2 100755 --- a/ports/xclock/build +++ b/ports/xclock/build @@ -1,5 +1,8 @@ #!/bin/sh -e +# Patch Clock.c to compile with other Xaws +sed -e 's/XpmReadFileToPixmap(dpy, RootWindowOfScreen(screen), name, &pmap,//g' clock.c.new | sed -e 's/&shapemask, NULL);//g' > Clock.c.new ; mv Clock.c.new Clock.c + ./configure \ --prefix=/usr diff --git a/ports/xclock/depends b/ports/xclock/depends index 6fba80d..7787467 100644 --- a/ports/xclock/depends +++ b/ports/xclock/depends @@ -2,7 +2,6 @@ libICE libSM libX11 libXau -libXaw make libXext libXft libXmu diff --git a/ports/xedit/depends b/ports/xedit/depends index f42b144..131dbe9 100644 --- a/ports/xedit/depends +++ b/ports/xedit/depends @@ -1,4 +1,4 @@ libX11 -libXaw make libXmu +libXaw libXt diff --git a/ports/xsm/depends b/ports/xsm/depends index 3bf14c3..922ac30 100644 --- a/ports/xsm/depends +++ b/ports/xsm/depends @@ -3,6 +3,5 @@ automake make libICE libSM libX11 -libXaw libXt xorg-server diff --git a/ports/xterm/xterm-359.tgz b/ports/xterm/xterm-359.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f15e133ad739b0b9cdfef730bdc0f283c09915e8 GIT binary patch literal 1424523 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

&_4 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%0D@rz0 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�SHMLWCifdjYSntX|=A0jVtxG@;%TU;hu|N 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%0ALrS)kKndQ5zvsJ&oJ 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�sXaqfO`Ap;v8V0(b-fC0+kP{w)*{(r)pz;V|{J?`?cD4 zYGY$_zPT z9VG4d@f6CFkF0_}yMS3vv8fc84p{LIaYt&rLg)A?YaFBsRR*ASKo9*f27e_#`M`VN z-2&`B$?eeHKI|E~Luieogj^0qixe4rIAul!l^zD&@eNY0s5%g(>7boZ?3B)+J-Nm> z-Q@V7o1hv%Nt_!jok^voa)n*@M?KVoK+Z>Jk^TibQyn3LpHM7WWck{?Nr$vFmQ9Hs zDm-vM*useC5A9CK#{i7BqKNm!e`A{8aMJ1}DNr~R2Q`(5vK5tLdOPl?tP`>}7^xJa zD?=j*27B##V`RON@c>&H;`)wd#i;ii*gAhos4s%Po5+VO>AAr2QK$dFK%m?Z1)Ce7 zlLuUIxVt)uj-yK(c@FteYw#hanK9h-2V)FuK%>D;8QRU3tn@14Akn;n1QxjDku$jw zjs%V~kj$_j;tL})=~X?B7j<=Za(Mn`_q48ny?u3h@=N2OexR0i&)^&Q;Wv%*7bmaJ z6_hyLJwE?cogAv&<6qU!jpKugs$aZ1t)HD?QzxgY@$%JCqYlZ9>Vzw0nL+eM)PM`Wdu`wO`gxG2FoU?q1`lasF!s*s1elXc=!cwX0t3o}M@M zUmxwBs#mX1U!9!QVGsw<@^Rz%@Dw_#zpNjhNLKY<;9H%&*gZO;4tMuXeyPJK z&TtU>C$D}zZ9IQ*u3nrR9n?=tXJxgAxx0Hub?))_S31;3yN#C>b+G$#_c;#rRGmO$ zr&LnL`Q}BPlAzmN_;3HbadM1nw10ApG{ZST=lRL$xvBl8aaOOW-P6VyF3{oW3G{#~ z43$o(9jJO-=Z0|gas1eb*(WH4Q+jvbo~8y zh=dQ4%LJXX*Z(<5hKSUl%m~g$#7OC7H0?*D4*p2fsC_j-Ixk)Q5~w;KiQzf7SStq) zCu8!Y7~o(Go{dO-0%K3PpkADA9OqmMgx5xc4@n2{)s;xAijdE6i0p`uQy3#fwEL|A z#_7gZ?t{2Yv$XM(A)zGz5pQl4(~*Hh1jEd}@%Eany8{I2l4vJmx(D?Q$Vl3(zIY2F zHwYobVR+}Hi~O-boxq@-qyu#ajpvQ?-6Qz-j8Mm!Lj2<(J37y&_2;{%f(ilW>Z9tQ zO>7Hm3PSbKWr!;Y6AHSlWYM2Ht_+e>XRqq}jol-xchEQmtb-^85YSou|GtJM8aNq) z{b*QFNvFJdv3q`Y0)3sroX%b!ooj@qj!w>KsIL*#9qgX(VzY3$z%b7UBJV_->bU;= zsPVjhyzgK+#G{Rq*Jo0JTGEL0E)=Tq<*WKBO#bCAHGD{0;9^(ywuD|Ym=L6|ujRs3 z&xlo6z1nfp@G%3EY)U*D4Mu(vK<>m(=>j6gK2ksV7J(9wV9-fA?j!@hBp3A4+88*_ zPXc@fkT1=3)yb=KjPp}(0t}s=dHxGu?EX@3zQOe7i!xa&_!$%)sO&U-gQO<)ro9*1 z95QQi@-&Z2ZC%uA&HBZ8{rC*F=&X6sIIf=pP&HpTO+cBo7}lG^+pk@~NJi0hWSc}= zq1mkko2MCRS_|vnNYrARW5AeckK+7jU6i~xA(4Y{0G;-@d7GO$%}uo-QNtVwOtR&= zUs3xgQ8|jcEWWm99g-(7xmw#+M}%+k0#_G3k%>xk-Us!AUznbqBpUF zh*X^RabiZirzOT#uGJSeR_}X5{cAKd?}g&8YS7d2uzl1UJiuq=xCM>li;dHhH)j6pPI2J89QR`gob=evbzQ7R zDjeg%Fq0NWq~keyB{?Z9NJ_S3au4P@j_z}7Pe6@YaCp!JA) zCYquZE3HPLmL|icRV=W!xZrKC10znSaH8F_+48+5b7kqX-2~q!t$HR z)IoPO45SN5J_u)5fxBXl!=}3(Wna|1Q6xssn%1l#Vr}@3BnfPZU!qv;Jvg+elc5zc zwA2AbR6})5Pzx2Q9ih@NLyHHb&KUKpZ-mz4(~FRyTzG~&pqENt1WMc4IoI8xdZT19V^&%6SZFZR8( zO1Yir`4!a6>sfb9b~V`{$?7gJD%%4ZV-($-UrnxCq_bzp!;G&xcdIi%vEuJCYW%{P zsainH!4?jdVNaCdhUD)teq!U#GLUhf9fTf}tz0@O1YasPA4ntxOOx%LBkeF8F9Z_| zkdz)mc3v93T_@=NWbU{MP?NpzGN}G%+y*%S<-(o2EFp2SFcVq$Yn(w-Reco{?P0L; z&h}+n&fO)CF3yp3h)-PpW9OU)J(+?gjzy@klUqj%Jmgc$I`B6mg|oO9(~GMiC#yO1 zM!CZLuT;$ea^vna@5FC=p0xcX(~C(`ETG5sqV{_>DlAzckc9=E;!1L|e(3BX1^GfT zuF#%h8|9or8TBp1PDHaxyiB`){=hJ0y^?o+bz-O>Ey?cUGVqWH`8>IfI|r@U)xBoD z(~p`@Ii-Zuh*Zc$0I@540}Q%dIozrB#ZA*vs7fO4xS5V0Cz! zU>XyhP4arF7rM&7w)~0Z-v($ia`&vN)lZn!Gt%ZX?Gt8~DeX{JMyBDp93gHY0DZ$4 z$f48sZ57TPpTLUhA~#7?zO=dd@5tzYJ4SgaL989FE1{*vIYY40%1%c zx-dr_*C9!@c8)pQsDD~Y##*S`BD+3%qUCco7{>g@3Un&HNcY>oS>p==`bMF-Teb#P z2HI!TL<>O50_e!4AK&z*^WlMCIQMh#fOCWc*)FbmC}9b(Kp7z^U{Fo8kgq&c1s#?% zz^FmhLH9-bMV@XRjvTHK?SXK;XifFyjTkFxk8$wBL2A|xtD^-l5rZhOB35$Hk2S9u z-;PJ|wN-a=ILr#dNT19(QLL|<3%X?|)Ueyh2z@47wGkBi3nVeSoQlU8dYLyB;8diE zTscy%BHGS*F>Rs_I`?^z^pbIW(m%ZEdL52wvXENe`C$Bsui`Xz2lLlTGf{Y=vm6hzxoNY(m(A;(yvMRFwp2UykoIC8Q zW)z4q%##B;T`!fgtAV$ffGrluTQGaC11ggNkQX@%)q1T8TQdc6+A6!!NpfY?*0)D; zjfzI-zPpDLL!^)1w&Y2Y5e%x+L_H3#d4rcLwUfa;@OPxh3ztxm8lB+st?|0a25QdN zY)L2Pri=r4+p>iIO8M>5u+SpRCG@Cu`SG+JBq{LLmXR{Y(xLWdZIZE>aIg5hos#mh zv@U*jM{gb4rxI)IhL-*sb-7Sk32?ng7PSOXws*zZ$8eKnZ#%4&UliZU#BrlXKo*0GkDOS75u>Ya0!)F! zEcW<}>E|G^Tr8&3tNtxjq;t6LH%R7%?lsQE@Op^4=t1E>_vZU(-#+cLNQw%U=)bXm@+z|* z!%>V*4&x4r3PddzkvHky4f?&Q$5QmnlWNrM!rExPk77!1FM59`rT6KSU3j6-MVief zsrGh%{!>V*|1soK=JC@dM|fKn7xE6Wxx_rQ^F^;qfeLdm?`-F+>A%B;84R@e!ZfS5 z9oES!_}}re{B!ThTv|GhT=8hU``&e#8@Hen?_~T}zNlW3c>?J^CVizf`5qEu;7YdS zCP3kLay{wM88lMx*3?AerC7dls0Sjy%U(@fwb5q=JKtG}7CwkH^j>$9)lp1G?J%j6 z`ZDS-tAE4o^e@L~qaHq$7^K|vwWf@iOeA2kfM2<~0~~jk5DW^3wHP^bt*Vt34VVkA zuBLuEEzMHfw36d;5W|9)9AT+Noi3w#hxz$>f7ArMPt{QK463nH9<5o!>Wt?(IXToxWE5ESQ#=20vj^C*l&xc~sQRlgLK{2iBsc z$h$lY+n-tF?6I+L7|tSBtN*r(j3V&DHI~Pi&s$cS{8s2cAzvTgNZCg*yJe0i?kQJD6$j@D;tI%~yae79-dj3W1Cx-+1ZKS$F! zmABk{eP=^0d#asm7?!WxY4Sogn-vpsJ2#r3*!jIxthLg#v!9Akn79@)cZ!tP?T9*d zYm!oI^x9Tl?lrv>=qJ-pQ0XpE6w9p6iXMPR-k`p!(PHo%!i7sGDj&XD-MY)Fnd|3l z|McYOsCjg<|8r(S=tB2~7x8G&exLK|--G0$&K82QM)%5OWVEsf$5yS*m-u}`yA`7p z=qsYSyQE#pZRZpY1?}3|BgaTGZ{Re5m6eiPzazaB>B4&Ly4tRJgZSv}0b^H8k=qGR z=nE(wD#B^Mbwz?tL{pl}3lDKw>+tCDptT4W^2o8A?ebJ#&H2U-71Iq7mO`ly?m>9AloMW}f&euyzU3jOwXLc9o!6 zdrNz}JS$YK6kHf^8NT{hBE&S(m3+tP1-TrME1ABH9xZ2KhGh^HxWg<+A1F^PKNJCm z3#c<4?&6b;KH#Xs^h)`LADLR@!!$JQ2yG6W)99#rTk8cDCwPn zC>N{#n`KJuIm*Xz#QYbj`WGTUqd9&yL*2hn3I0yq?Ch+4#p|-K)$XlZ)fru;8K*Bt zF;BN?m`iuZwVr%|5r`anE5pd5T(V;3G2$g_PoKoH&)jg^9GWqgtn#avW!cWx67z0` zq)$G!p82h7vR`7gGaIb!_XQaQWu1^J{BNP&xmGu@`|iG|`?qg;P!+cGqt{h0tIT{L8)B5?;MMw9YGUC1}F|v{TL{e=4t*qvdNk1 zKEJzo+KQh8Ld1hk_sPOxVR7zZQA#umoPlLty4*_P+EStx@c7RZS-h-AcL0~=IHs^Z z7D`<-2i#3F>38DWFw+@g24Cv3>p5Ef#w|ra2HZKC4@ugZbc==&rh7|OI06?&45gfL zb85G`e5XCd*_`$Yu7yah$wJ=tV!Cg$0RJFivgt8#!a3ua(0p|+mq$Ec)$o8BBL}UJ zKprX@XD90EL_uxLEv8w zW&|T>V0vaoIkUJ^h+^g{^;{;Yky2M0?Pwa)*-91*{lk<%D zLn4ORe!NNUFm22$n6Y8_@>33kK(pqIsIvfe@@IX>U^3UlGi5){1jvJZ1jxp|Ds>1Y zuE9D0T_F&e1B+*KDrD;;LK)+xaT^?^?S?7ss zbQwHx5#x)vyudulFT{!>LHkZ2*_+@-kZKGS4u|aEB=<2)Z@Kc9g1&XQqOb?9$s-Of z{r#(GM5iP7qRwHT{*0kC=#f_>|w6e1#U*eu(t^?(;5z zw8kerN=$}d{z>9==92`>?oRx5{|AYCOQ8RpCx$O0{z_1#NDvyJT%4^v)-43q);MaMsEOiwiTQY<457f!r)lx>ogz zxMDRcQY&WoiN>GhM8VlI$B}|kSqa`<4i$nj#ZDE1g1G`V*9`Vg5|35??d4;R?1^c= zzh3rKbZ_U%W%OJ2|7+}@9PicZub61XQ~RB+LuC@i(D0|_1{D(w!vm74K)OSMQ0NjYN8t<`auuh-R>%B?-PmpCK{o8 z)zVU=`jhJxly1f28>Hc|KQdFsf0I-zu&~!Z)AgzXNF--~K=Mj2X!hfXc0@UgBVsQC z5s7t=(QCfDCSIuoN;J`(`Ieiv3!nuXnEv)oZR=O--!I0;iL?j2!NnK~{Su))s4|Vn zrfQ-^Co3II6H_n7&*L%221j2E6#KS9y;UIZn3kr5pIT}qM(WN;?NnJaI(Byd6Rq>b z?}9q)MVHhS`*cNRmV#9!Gt@6zSkMtnj7RGfr|-iyoS_D-=++s+ozwChh@K%I z1{X={EtD!03D`-4CImY9_}POaC=YWzFDmJHz#%*>ibC(!I_w*XBIv;RH-{B9P}who zEM5BcQxVoIlq4ti4y49?v@rf?aKtRq(oBvXb&I2wns#Om!@-OW$jpZW7Uny03&#H} zy((E`#b+gR*n(3CQ{fho+ya{BD>_csL%Ra@L=~S*9n4&hLFR2v2hxAejlPo80u|RM zZCh>7Hx6{!PT}F(^@onxh~N#_ujVx`5N;h8x8@^Gsg^ATBeF%9UdL9RaXETur%M&a z4~v1Dz9LOjxkHT>^wbxi%x_)^jJ%E`Hr*h~@$FTt;APgj`*^O9^ZxmCn~D3Pp1*aQBnI5 zg+K1$IPN7{rBHmR;DmlTqU)4XLkIt&foq(MN8|B`a0)6+-QHAp=(p4bI%*%ogsSdk zvvr9D9YZ*(f~ ze_1_v)Y*KH8e_^pLgFWCKj)c5W7*L|@tBy6)5@oIgr21}PiDpC5;M<8Zf4-ikZ&4U z5LY@7lylf*`<%;=f48ibY`*zv_H=O5=x22-@ABPMp2zA{v$u`2lji=((aGtVW=j%$ zP5^+|J9vo{1BT;@$Ls|z?nf=80UgG}bna9^5te1#dmVzWl#;)?iqeAwBfT6xFIi9} zPe0N>c7(MMp~WoX;Q=96L>Vn3`;iP}e1X$5;0b+e`o$>$QA_2{A1S1xImSicKI2oJ|;0LRY5Mt*CF`_wcU~ zsR@%rw9(h%v<%)#7>YJ>uxeR<5?$aft z`f!eDcxd|CFEdB;Tc5}p^-yHV*=wO4@ndEO?m4I>bvMrE%YlIp4*>3?Mh#ungytncY=D~Yq@cJP(MDe*8lI( z*)lcA1kLL0jWU05f?FoXfkeD(X`jAT2dBGlE}AcQ&wei3q6j&*=(^27A3e?X)d;RH z$S8muTYMDb8;35we^x(lp1nD;`9LtEk*o|B-90aOKwJ8j3tDH?X4z~Kje>B|g)@q* z!j-MTrGG8NjJBjhm61F-9v5v=MzN9Q@|K<@Jc7;TY^|mHvieqR=B*NQxyiTly?f&J#coe~5wmk#wgOED0kZxN*cAr1YE=9QbZBM*HDpbP>Y zyI|MaSH9?5y^DC(w|d7CBNJ7z4@!0F%&N4pQVA)_tSml z6AKAh-IIA@WqgvNialp}dMaOD^~6r{6E#l?R53gyjDE!%Ohr}u+B1o9l=I(T!=mpg zSL6b^CVIZ0GJ@qfLS2M@_K7Ub)8fcM+jr}4xZTdHzTwuHt-X;^p1(JxrdY8a$uxE@ zZbOP?Xtau^;W{0XW#*7)MCv*8nPbWHUx7aR^ZZ~Kz34y54aR+GL-MvQ73Q-tDWD4N z4*w@nh4&_A@Q^#?%*VfizMPlNvjgojiTNeSz0W7sb^@(P2bwb!bRJRkWl6M^*(BP^ zmm<-OoSD?KEqqP7uI#n{MRf)9FPVQ|GuE8T^Ui^M*^4{aEb&t2MZ%19fNw9dP3{56 zUgau(EG}84@)xq;PA4+0z^YYlcAAp=qMU`?KZ74&$0M^C1Vhc{6ZYt}!-Nk1On)3i zTHeDYhfn<~OXnA!7?*|7Hga>gZ921PI`iXyXI9fPL~JiCGU#IQGg|X2bPy2H zOhW-Py`Y8+j13)sFD}N@5eXDJC`?Zn1n@4J@(aglx*rAZ3x`RwrhpCjOvMUz_Iful zjDP3Q!jw+S8>ol4@D}ns0hdA5MHVVMmA7J!m|e|~vTHVEJ#*b>-{S@RkrSN%Ro*_z zz_9(Qee>U_6PNS*sjyF`Z?b|^pJaS@_O&6UV1Jt-RkY10hE`mR|E##P>*X( zZMZ;epU^cl4>2kXEP{iY$b$<3m{ya9Dh%ZuzzYZns+$lbCn*3Vd1D?9p&)9t3=9AQ zP8jr?1m{Fo79GSqeun(-h6-$EzE^`$@-GZ!m_x^SO|US5K_ovi%ehF3Pd@s~p>OyAcw#_x0Are;%ezt{*u{mW| zOS%d@gMJZ&{-24&1FttZNSvm~H+Sf@g(9~DO6s$ftrDMg6%HkzCLiK#umWms7nO{@ znAOv8G#FDHxh5*^;>=GD51X$}PtNQ6=jPn9D;$gKsp(>Uc8Xx0;tglr83;YN!*58g z>z{RT`V;Q4_Wk3q^vGRtg-9&4XlS zqKJY+pCyQ9p@2^~@GC3WaY3Vh#lb9vIHRgqTFu1F=N{G>&HqIwI0u?4nbj`1`jIeY zrvL;>T6`o)XyV9T){v@AwSo&$1U1~;{$P=00dk<6*hfGjk7Bl@1OQb7XmoUwr2f$d z2wij_IuqcC?G9K6Th1i^AQs;}o1e=iQtKE#s}`_V?tz2ufxD_;@ANP9yN%`=AN;tM zP@4uygX|ILI*ff7H8DsJ)lU8b#?2ZDI#e^_yPXVyPR(UdVU87G#`14XN8`X?iT!we64pLh%C2vM#p)t@%oBSwxHuj%$|&w&MDhu^_%5%Myb5&L z*lp0S=I-nL#9dgpNHFvX5*%M@b5Ab)PR_g+e;RLYW`iqlU_A(LC|6leMpDV5N!cch z4GSs3{g`__exW`vX_Pk3Y$N9WnCF0KLI-q(eey7&(#K zSwg$9{*pr{tSa?}Fg-<*2c*@WjMwml#dslP%U5($>3|!*ir7v9MwE!&@4 zdc9SML`7$E4teq%j=ZxR>(=MUqY3{RiL`zk-8QeI*wF1QbjkyvYwbP0`rqDK8YFY7 z*5yQn!fR*=h1bmMAu*tv_Re>e?-i{ETw_H! z#UW*Y9@8i|2x_psXT7{LNW)4mF(rTCrmezvrBDWyj8dytk%t~<2%bo?^@(z)*(fjj zC{fEtaYli~qPWjH)?fbE)@B~sxzFPaRff3_NP)y_o+IH`wO~|74l;YU7C}sw9Q#5L zla(vZcOl+;>0st|K0LzDnUR$?QWaNx!iCXY;-@{8&y-)xFwMCCGe@C(6PwJ6IPWRE zw6aTAbXg?1yi;&FlkssBNAoNT?h;z6J7t#YPLZWW-?QEvtbEe*TuOo>bWbw|fD0Jy zgZh3o9Z!2P`(`5dK507P$nMCrLIG@tghCalb3GiuJ|)0lkaGy1d1p=#T%M303k zv+f+KEM4}sQ%E})qT?OHx-)1}t!6tZ(QlP%tSE|Izrg%ne1ifl) zlR1oo`r+>DqjODlQRe!lod4jlYe6JhreIAMw6AxWG8?80-x@)gkN4V3KEnS8RT6s1 z`&d2n_qF`6qT<_jJRIwzhT-4(u-llHs`>$t=KV1sSriQrCZLcqh9$na8uUUb@ui$; zX1J>#(C;;~`p$Jo$O7ByCKy$Y7`{==?-UqdF837!^^AEO{lU0m(TD%+VKGSJ3b9oO z8RJqi23jKR4WOrT9=4EcZ> zwSams8RtrFL??Lwgx58RVqo;`I7RRABY7qwp(N1?EbDPjIi%_aV;k)PZVadeO(#;LwUG|vb`td%@+oiz!mxf8V9H4_ zyCQu9%tAUzyM&%Vd!s5DSG5PDz7>q~GW*m^yVJadxir(fuzL4b_(U&{*Gbx5ZFlSv zG2xMOxo0vgNnkSU@z9bpCr+>@9Vt|j;j(r^V1JNG!gWi=W!M%Sz8Eh7Kqa*3odGSm z#3^QXeSmkOUh=Pq10s%-GF~z9ZDO{7$>GvC4rs)2^5?9w3yAk!8&4dj<7s^c3c9G1 zEzu|*_NHFS@`$1VeJeSnbN>3QF6!mYz1N3_^;0u96Cj{9>2~4X?>IISu47=rBU@WE z>x(xOZHBrtnBQnD{=&J|F1UU>9H8&emr?q@BI82Tu4!9JSRGG?%ns5)q&o4YXyXz! zpqrtEwyn5WhpHYAOlA6hE^;NWN%zjuG0?Uh6LB|V+dgyna;{WI{PS)&&Z<_enAWbf zo+!C|_Qr+H%$ld8uj@CXr^^m>7D}ZH{uW?BBj;fmoz6<6xpj-@a~2>k3fvu&%v~7U zkz36y==zqqL>Sa0W=dGDTJu*?Z*<12T8E#?+S{|Z3;xfuhR6u2t(`=`Sz`ah9FE$} zTkmU1Uxs=lpZ9)}QBCGboj4skZP4fR{#c1RqPrhAO_aD@BZnKnFih8v;t$DSk}AYI zySOGmVz&nv*Ln=-x!;S^l-Ab`PYC!~J8-8JY*WD5klvG>DvljURHq+4Fn5<}#7MvK z#XO4oDaN=3M9<)?$aFIG)VXN0XhV?p!+*DOGN+O`4KsNGw|U3HOrtz++$VV1yoZp@ zKXS9DIvcU@!i8S^4929R@C(wuxZD9HBevMW-?{1(D!v5W()^aWesKVX+qkX{9Vk+AzH{+LYnk8!(xf z6lzct-5Gey@xzh}jRqF!5gY-B&9LW!LxMu%pvr^6iVuT4XbpZyAot_TZJ?U^Wv?~I z6O*y0z28lt9~E;h#;Tp^_JfX$9DiZ2_%C&bKX?w?j2!&Nl>gLj!5VecqD4JHJ@FXu>Oz?!Xc3_x<@N;WPm{~#p8!epx=Lh)%Y z2gadWEY1y3Z8zY5!nYmG-_j`V$t$}o5%EuWjzdm~8fK2U--)~G_@ueJf8O||-ozkc z4$BPnt2+{M)p*=O{$z zF_^_dhHnA*p_d4jA4LHVU6B_H%{|1ScSV=&_~Q?rV0DK$X~0FAkN#atK;#*sY1->F zW0yHM6L%Mc)ll3ihl$4M)!$E~dx0mLjAMS=O<8M)93|k~+3^dEJs~c0d_`;PWYO5* zJTa5Tjux+)w>4JFweMtxYqB%YcNNu`7S@>BnR+#DH?W3*M2|Dm3Zq%pOH^X?d9p=A zcyWeS*wHk#+9DyfqyCg549W&Xq&gpWel#qxUWpyE?!Xo6 zQSa!bHJ2}{K@TL74!4LqsqJC(5Q-rXWj!tsIuwx0p;lGSzT<`DtVJH{np1D;))VeB z1Zljd!xh7GT)1jx_|MF;QS@^e+%vsyyeu~BmK@{Tp_pag2un_FN#j&dwxvApV&8S# zl?u>Yc4Z7wq23Av!|0jXhHuN&ZlLH<_qzRFCAV=;wV4#7CikAxgiO50inQu@C?Q4J z-Scya^rtU{V1Q`J`QYo`t>W;E+zkA~c)wIKJ*aQh?)ho+pmAE?KX2|mmzDofEp;fq z-x7asswHv;9Cwz=d{f|q_#6Z9dbf8B-~MOum}SzA)?Zd^eRdV2D|M1x!`fjxTlc9S zioJDpe8<=$o+lF_bpm3qpQ52U0;Tf55-Dv*Y7J zS{g;c*PvKNJjKPH@2ktUD-XFu$it>JYu3DM2cnM;$d}X{)d<7GncNN2h;g#ZwWQFM zZsG(OyQF_%2W7Ku8;mkmq?T9#BDUc+Jq~G#w4%K-e0QqYH1=AWlKfm(|B(`^YFY-6 zF3I%pQ|etDCcWM%zCpYUMh zSI){%aoRX&6NYtVH;!yyZfRIodgF*dTDb47DYJ9VGT->NFIN=zec=`jTyN-|31(51 z-?9VdC_&ba4!~e$v{81Zv=K~cBX>$0GNt^d!G(qVhe5-s&$SNPM+25MsLzoNI&kf- z&PLwqh+>rXYsG_L4XHeVdIlHI+>fwF8}LqV%Z9Tp8`*8qyYl-N1Cg7YMF={zXMLmK ztheN_Z`^U%H*ya9@ApJgK7w+oL665NfVX0B!`gIza>xTji$qk0 zmc?eElfjJ`=ua(Io%C4^FiuG`U!9Y(pe!hw?x!UEM3#HVw507W8x}Ff-7&jTV9(}#_(*NB+jW5Nn*E-__tg0|icsr;%)NLi zP*TW(l{EQRoRO~3)b*mcQ>-|vV1(

xlHZG#u)H0FwFM@@2P9%#dk9TA11vrly5o zgBGSt=a?2OXJhUsX#N>R8i9FCo!`*;j`9TSQU=olsX3bj_*A}C)eo?o(IU{`qwM<0 zm*?)?g`m7lUo=C1Gms#Gv#!>1<@0*_Qt}zSdz)$+CPb7*?eL91ck1LtoJP2^EmgPt<*;k( zR9%s2gPyuuihG?}=QTbe6-u?oApqVw{r=Q1T32q&7)3|?}g-Y!F>)tnr zc0M5WCE%I`^U!I~F~dCJ-uz|v=ykm$4Uzv@$uW;+j)9=DL%l+8V{^^$ zI5zr)jxzqAxye{0rP%+dUkTkS3$T6 zZUKBcb{8+xg7f?VFzRM)TCvfr9*8!^$GU-8Fh6jU!yT7q4|O}gqr>OrvN@D^B^9m; zmNXW(GyD3ga9yZ3IoF@Ive1GM-d|v4H6&!!x%?3-Vtyp1(MP|7D40?wl>Fw=WOXc%|}jO}3#tgyT1K zXFEA)$IYJs4*qaH4e`vkZijQN+u_~oHVaYv4c*z!%ypZI%>3be+Pb+$1V!uj@&u(q zIGI2Gm{nrWy#Z%7RJeAwtGsnHxjAd5^Jc7n?ER?sm6-u^`9TF z*B;A3<&Wmsi<39U#_oyMHGZ!t;&J>Q8b8=ez~vhV zqB+nry2`n1qfTMjwNwb<{EmxMgUsxC{CvkWem19`IU|53Vc!faX#sbInYOJtfb^6H z@5AHAkU=RLk-Kd3kIF;udQoH*%Oa`M-68@go348 zaTh0L^me_G>N$L|u}XuvqqSUiC|}|k1R}8FD4bthoT9C$lk|YSHzM^aBx!rlPsePv zvD}ZYjmr%!^*s>Bbxj;84S53NR{aeRr^Fn|m{BxrG_ZrUV-E|tl$ zDoJmKBLuKAhK2rDJQ`G4J%Lh5zhHsVUVz~8z$_93HxEfL6`u&EQIFcj!C$<2XzZ+57c)Xj%#}J%R)cuh@wg` zz|y2WmSxit23O4rnbnW#d~kLX4IOo=kPG{|Lzk|)YB$NXi>i=N?kede*DO2AN>{AZmTFf% z`Y{)qLR)h7IflWJCP}Y@8txe0FdbXF{RE>Q@X0|hNEmhVhCF0Sli1SpeE^~MRgQZ> zEPFISbMk44mtHMX2dpi%+-Bu>y3$U`T%&vGeYP&m!s(-9a>v(0-{}LpZ#OV$_L#5N z)B2eQ9K1^;OseiUx_=s6On%GeTeY`LE6X9c*&GBty^VKq|0UDpSKFo$V!ys}fvfD^ z@1m?lVcqH%fF6&Z*GtQ|lF)Sp*NGlD0+BZ_zLj{J5#av()_=E(61r_WMIg|0PK$EP z=zvy5_Rz1_Dy*kl6!jRrYua0dHYGM>EKylsQ86=6YLREa9hz3Rate@?tK}D17Q<`( z!^U1R8jTisQCf*i8%lpzud=$MABM^5O4_cNUMkXV7;M@-9WYU78&5^SLqX1w;YQ^s zV8TBt>U}`WgzY*64FSPF7zq9WKwx0tAM64g2yzTa(L~pTK$@4{J7joguz$(+KeV|2 zz=gNJ5zSwfu5*O=9g2LMSPwR&!HqG zzHMy1oS!D!w1c3N&w94+@cyMMtT#Vu-58XV}Scmr1 z@Y(ZI=OQ4y9$p6Md1Y^k#1Yz8P&8A(;3*jd>9$yDh2Ey3RLB;%AC_7@XlzN9u$!;f znLt{Ci(wq=#P869$Zjtk7_at}{5=(=pS36C-V(cL!Dgru0Aou+T;t?mL@C}p+y{HO z{W(rxFRI3tSRcl)LAdxP_S&RxE)RC z%0=&ffN|;K9gYT_NgF1S{0o?F?X5qxe)sjAj-%P_Pw5mgi5pc~W#!(A7GNssTLUKW z+c5lC@3-h(Ig{3US2k2b+3%BkG@Y3-?6&0<6K?)iSuP#&zuY)G;hV_wzw9&yJkEFQ z9K;gFDWgKp^K?yC!@g#jh?*_Di+;{LG`4lnxtF6S!tP5IX^fsdfZNWB|Syu+jpfZZXsfF2Fp^^d7gh;Sr zjF$>Nj3^JS&56$RJ2uuWHPVlE9iBP_X=3X+yyXA+4 zvO>jwGNM9BpD8JvSw;kfpC~7kB@12wd`%*mKPlC)CphoE%q=|kUKTx{74Ibp)SUiF zy~o+5K;|_ED0y2(Zx(AXs-3l*>GL*UTj=7=kPpb3{VC+`!e z2Tl3}02`1w6{GmTfF)+aWNv+-ZH5~M#E8Z=UX*hEH4e}n*d?d0rfnl(u$eWR*^&-K+Z{Irtg(>DBN5)!a)fJQKU<+}k_=QzC8^_ehF0iNxw?bIV3mEW6cuZ6v9jyw z(oAl75l#K%E5rP-=zsvoa6f(n+zU1uf z`YTf*UG71*xyxe0ADzFD-h>i}f=jVq1J>dAqoP z2>*)M(sj~uk&oKOca)8`(ChqTQ%TupFz~06i+_I989P|-doly$amVmxITJKY4bw*&`9jw&61UO(7D>r3R3gDAAij zS@CU%)(-4RKdtVN=niu+fOCJ0;zYZzR!m`;5jA%TyKdigHSkuydM@MR9PkXEvUH8$ELyZ?EFn|4PW&3f4r zhtR%``;#UnH`#O2mZs-;pf@y8mU|XBF`#D$J2vr2&^X^cYV4Qu_8#3L8^1BM!Hsj= zV59P4Zc4vd++gh1u{y#2p|zY{HhBhUyKnZ!QO_!P=&6MTwmjo(C%17|^@gq<+?QO` z*ye9>go*Th!Y_av)E94p)YpI43zD~n+2whSFnrWFuG_i$tNi+iR#|5nVH1oxX$P6P z(=MKJcFcdu{teJeV!=o#GxYwGQ!eRPLs93>rIPlgy8sgwV+ZtY{w1*kzK(n%cCeZB z`n}vqI?YM%ufrJ*%D{992gjq>GQf;6UG`s`p4HE-?ibqauobfz3QA_1?W<85k0sD8 zw@w0}<^kd4!*eMvF`xWu6&G=ac5=BVQ%4e?a3FL+{3$7$P=%SN)IpCqhu|*Un0s>n z8vN*^$IQu@i5wfV>lR_g|H_EbPPuTpa`X(p_LrbZizTyLn1>@Xr4aSxp-7D(^T;Mm zZw-_7dyTflM!(+$lCX=i8F3B0tu}DPH(lBJAMxiVlnaTsS&eaNSGxv>*BrJw zMUA*_p)ox=djmp!Kon}6G#|5;`*~OR``Cc_LSXl4$w&^D)ykuNbVfiKlIQ}Ojx6zj$tg+Bq|Bx zaLD60#wi+1Mrv@=htkN9Ne9RZoDJhPRo?~7i7%`=Y8Y~l=`a~3aLFNC3F(m}FPB;S z!=&2#%yAcd>-^UC@GMPi?33mss$WR@encJ}dK74ylf+CE-y1*qO75c!AkE&fc4n^e zcHdywoP)c7lNU&U0kkG4(8!Sg0lT7aTkm3BFq2J3ZE~9Hw$zJK{>7p{laAKfPP%P_ zT)=W7sm^G|Rld90&wP%_e-4SUUWaKnW1xk-$@TCYCF6VK zXr<(=Y6Z~UvJNwa3k=owx=_w7gb!~lw@fK~R!79ExRzu@-lw0A;PSAIbsuf08!S&i zx3Z$04x80N#O{k1Tu!}og9TCOdee5TC~S51mau>-xk(?dFfpEkY5WFbe78Djr;nkN zoAy?igI=XdaEwPNmq+(fvSrHxzU54fsawN_=Wsy8y%EeHS=3Nr5?;3|M`UH&g&aFW z1CDSsbo(}hhnLNsq2$C`Z%sZDHLt0R>JMCBP0C;u{?v`z6oQHshIyMRPZ|gcRnD`K z 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

fRX%?K4${F7nZo*<`VcQ8_W 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⋘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

    axm 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â~NgVZvbybs`Z?6Qorj&Lw&s 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�f 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 z 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Ξ8D&N&O}rj5RUx(DN>l}5rE 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 z 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

    tV^!cn3B#)&{`azTFqdj2@KNOpou7Z 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 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/256colres.h b/ports/xterm/xterm-359/256colres.h new file mode 100644 index 0000000..4b98391 --- /dev/null +++ b/ports/xterm/xterm-359/256colres.h @@ -0,0 +1,250 @@ +/* + * This header file was generated by ./256colres.pl + */ +/* $XTermId: 256colres.h,v 1.11 2007/06/12 00:44:23 tom Exp $ */ + +#ifndef included_256colres_h +#define included_256colres_h + +COLOR_RES("16", screen.Acolors[16], DFT_COLOR("rgb:00/00/00")), +COLOR_RES("17", screen.Acolors[17], DFT_COLOR("rgb:00/00/5f")), +COLOR_RES("18", screen.Acolors[18], DFT_COLOR("rgb:00/00/87")), +COLOR_RES("19", screen.Acolors[19], DFT_COLOR("rgb:00/00/af")), +COLOR_RES("20", screen.Acolors[20], DFT_COLOR("rgb:00/00/d7")), +COLOR_RES("21", screen.Acolors[21], DFT_COLOR("rgb:00/00/ff")), +COLOR_RES("22", screen.Acolors[22], DFT_COLOR("rgb:00/5f/00")), +COLOR_RES("23", screen.Acolors[23], DFT_COLOR("rgb:00/5f/5f")), +COLOR_RES("24", screen.Acolors[24], DFT_COLOR("rgb:00/5f/87")), +COLOR_RES("25", screen.Acolors[25], DFT_COLOR("rgb:00/5f/af")), +COLOR_RES("26", screen.Acolors[26], DFT_COLOR("rgb:00/5f/d7")), +COLOR_RES("27", screen.Acolors[27], DFT_COLOR("rgb:00/5f/ff")), +COLOR_RES("28", screen.Acolors[28], DFT_COLOR("rgb:00/87/00")), +COLOR_RES("29", screen.Acolors[29], DFT_COLOR("rgb:00/87/5f")), +COLOR_RES("30", screen.Acolors[30], DFT_COLOR("rgb:00/87/87")), +COLOR_RES("31", screen.Acolors[31], DFT_COLOR("rgb:00/87/af")), +COLOR_RES("32", screen.Acolors[32], DFT_COLOR("rgb:00/87/d7")), +COLOR_RES("33", screen.Acolors[33], DFT_COLOR("rgb:00/87/ff")), +COLOR_RES("34", screen.Acolors[34], DFT_COLOR("rgb:00/af/00")), +COLOR_RES("35", screen.Acolors[35], DFT_COLOR("rgb:00/af/5f")), +COLOR_RES("36", screen.Acolors[36], DFT_COLOR("rgb:00/af/87")), +COLOR_RES("37", screen.Acolors[37], DFT_COLOR("rgb:00/af/af")), +COLOR_RES("38", screen.Acolors[38], DFT_COLOR("rgb:00/af/d7")), +COLOR_RES("39", screen.Acolors[39], DFT_COLOR("rgb:00/af/ff")), +COLOR_RES("40", screen.Acolors[40], DFT_COLOR("rgb:00/d7/00")), +COLOR_RES("41", screen.Acolors[41], DFT_COLOR("rgb:00/d7/5f")), +COLOR_RES("42", screen.Acolors[42], DFT_COLOR("rgb:00/d7/87")), +COLOR_RES("43", screen.Acolors[43], DFT_COLOR("rgb:00/d7/af")), +COLOR_RES("44", screen.Acolors[44], DFT_COLOR("rgb:00/d7/d7")), +COLOR_RES("45", screen.Acolors[45], DFT_COLOR("rgb:00/d7/ff")), +COLOR_RES("46", screen.Acolors[46], DFT_COLOR("rgb:00/ff/00")), +COLOR_RES("47", screen.Acolors[47], DFT_COLOR("rgb:00/ff/5f")), +COLOR_RES("48", screen.Acolors[48], DFT_COLOR("rgb:00/ff/87")), +COLOR_RES("49", screen.Acolors[49], DFT_COLOR("rgb:00/ff/af")), +COLOR_RES("50", screen.Acolors[50], DFT_COLOR("rgb:00/ff/d7")), +COLOR_RES("51", screen.Acolors[51], DFT_COLOR("rgb:00/ff/ff")), +COLOR_RES("52", screen.Acolors[52], DFT_COLOR("rgb:5f/00/00")), +COLOR_RES("53", screen.Acolors[53], DFT_COLOR("rgb:5f/00/5f")), +COLOR_RES("54", screen.Acolors[54], DFT_COLOR("rgb:5f/00/87")), +COLOR_RES("55", screen.Acolors[55], DFT_COLOR("rgb:5f/00/af")), +COLOR_RES("56", screen.Acolors[56], DFT_COLOR("rgb:5f/00/d7")), +COLOR_RES("57", screen.Acolors[57], DFT_COLOR("rgb:5f/00/ff")), +COLOR_RES("58", screen.Acolors[58], DFT_COLOR("rgb:5f/5f/00")), +COLOR_RES("59", screen.Acolors[59], DFT_COLOR("rgb:5f/5f/5f")), +COLOR_RES("60", screen.Acolors[60], DFT_COLOR("rgb:5f/5f/87")), +COLOR_RES("61", screen.Acolors[61], DFT_COLOR("rgb:5f/5f/af")), +COLOR_RES("62", screen.Acolors[62], DFT_COLOR("rgb:5f/5f/d7")), +COLOR_RES("63", screen.Acolors[63], DFT_COLOR("rgb:5f/5f/ff")), +COLOR_RES("64", screen.Acolors[64], DFT_COLOR("rgb:5f/87/00")), +COLOR_RES("65", screen.Acolors[65], DFT_COLOR("rgb:5f/87/5f")), +COLOR_RES("66", screen.Acolors[66], DFT_COLOR("rgb:5f/87/87")), +COLOR_RES("67", screen.Acolors[67], DFT_COLOR("rgb:5f/87/af")), +COLOR_RES("68", screen.Acolors[68], DFT_COLOR("rgb:5f/87/d7")), +COLOR_RES("69", screen.Acolors[69], DFT_COLOR("rgb:5f/87/ff")), +COLOR_RES("70", screen.Acolors[70], DFT_COLOR("rgb:5f/af/00")), +COLOR_RES("71", screen.Acolors[71], DFT_COLOR("rgb:5f/af/5f")), +COLOR_RES("72", screen.Acolors[72], DFT_COLOR("rgb:5f/af/87")), +COLOR_RES("73", screen.Acolors[73], DFT_COLOR("rgb:5f/af/af")), +COLOR_RES("74", screen.Acolors[74], DFT_COLOR("rgb:5f/af/d7")), +COLOR_RES("75", screen.Acolors[75], DFT_COLOR("rgb:5f/af/ff")), +COLOR_RES("76", screen.Acolors[76], DFT_COLOR("rgb:5f/d7/00")), +COLOR_RES("77", screen.Acolors[77], DFT_COLOR("rgb:5f/d7/5f")), +COLOR_RES("78", screen.Acolors[78], DFT_COLOR("rgb:5f/d7/87")), +COLOR_RES("79", screen.Acolors[79], DFT_COLOR("rgb:5f/d7/af")), +COLOR_RES("80", screen.Acolors[80], DFT_COLOR("rgb:5f/d7/d7")), +COLOR_RES("81", screen.Acolors[81], DFT_COLOR("rgb:5f/d7/ff")), +COLOR_RES("82", screen.Acolors[82], DFT_COLOR("rgb:5f/ff/00")), +COLOR_RES("83", screen.Acolors[83], DFT_COLOR("rgb:5f/ff/5f")), +COLOR_RES("84", screen.Acolors[84], DFT_COLOR("rgb:5f/ff/87")), +COLOR_RES("85", screen.Acolors[85], DFT_COLOR("rgb:5f/ff/af")), +COLOR_RES("86", screen.Acolors[86], DFT_COLOR("rgb:5f/ff/d7")), +COLOR_RES("87", screen.Acolors[87], DFT_COLOR("rgb:5f/ff/ff")), +COLOR_RES("88", screen.Acolors[88], DFT_COLOR("rgb:87/00/00")), +COLOR_RES("89", screen.Acolors[89], DFT_COLOR("rgb:87/00/5f")), +COLOR_RES("90", screen.Acolors[90], DFT_COLOR("rgb:87/00/87")), +COLOR_RES("91", screen.Acolors[91], DFT_COLOR("rgb:87/00/af")), +COLOR_RES("92", screen.Acolors[92], DFT_COLOR("rgb:87/00/d7")), +COLOR_RES("93", screen.Acolors[93], DFT_COLOR("rgb:87/00/ff")), +COLOR_RES("94", screen.Acolors[94], DFT_COLOR("rgb:87/5f/00")), +COLOR_RES("95", screen.Acolors[95], DFT_COLOR("rgb:87/5f/5f")), +COLOR_RES("96", screen.Acolors[96], DFT_COLOR("rgb:87/5f/87")), +COLOR_RES("97", screen.Acolors[97], DFT_COLOR("rgb:87/5f/af")), +COLOR_RES("98", screen.Acolors[98], DFT_COLOR("rgb:87/5f/d7")), +COLOR_RES("99", screen.Acolors[99], DFT_COLOR("rgb:87/5f/ff")), +COLOR_RES("100", screen.Acolors[100], DFT_COLOR("rgb:87/87/00")), +COLOR_RES("101", screen.Acolors[101], DFT_COLOR("rgb:87/87/5f")), +COLOR_RES("102", screen.Acolors[102], DFT_COLOR("rgb:87/87/87")), +COLOR_RES("103", screen.Acolors[103], DFT_COLOR("rgb:87/87/af")), +COLOR_RES("104", screen.Acolors[104], DFT_COLOR("rgb:87/87/d7")), +COLOR_RES("105", screen.Acolors[105], DFT_COLOR("rgb:87/87/ff")), +COLOR_RES("106", screen.Acolors[106], DFT_COLOR("rgb:87/af/00")), +COLOR_RES("107", screen.Acolors[107], DFT_COLOR("rgb:87/af/5f")), +COLOR_RES("108", screen.Acolors[108], DFT_COLOR("rgb:87/af/87")), +COLOR_RES("109", screen.Acolors[109], DFT_COLOR("rgb:87/af/af")), +COLOR_RES("110", screen.Acolors[110], DFT_COLOR("rgb:87/af/d7")), +COLOR_RES("111", screen.Acolors[111], DFT_COLOR("rgb:87/af/ff")), +COLOR_RES("112", screen.Acolors[112], DFT_COLOR("rgb:87/d7/00")), +COLOR_RES("113", screen.Acolors[113], DFT_COLOR("rgb:87/d7/5f")), +COLOR_RES("114", screen.Acolors[114], DFT_COLOR("rgb:87/d7/87")), +COLOR_RES("115", screen.Acolors[115], DFT_COLOR("rgb:87/d7/af")), +COLOR_RES("116", screen.Acolors[116], DFT_COLOR("rgb:87/d7/d7")), +COLOR_RES("117", screen.Acolors[117], DFT_COLOR("rgb:87/d7/ff")), +COLOR_RES("118", screen.Acolors[118], DFT_COLOR("rgb:87/ff/00")), +COLOR_RES("119", screen.Acolors[119], DFT_COLOR("rgb:87/ff/5f")), +COLOR_RES("120", screen.Acolors[120], DFT_COLOR("rgb:87/ff/87")), +COLOR_RES("121", screen.Acolors[121], DFT_COLOR("rgb:87/ff/af")), +COLOR_RES("122", screen.Acolors[122], DFT_COLOR("rgb:87/ff/d7")), +COLOR_RES("123", screen.Acolors[123], DFT_COLOR("rgb:87/ff/ff")), +COLOR_RES("124", screen.Acolors[124], DFT_COLOR("rgb:af/00/00")), +COLOR_RES("125", screen.Acolors[125], DFT_COLOR("rgb:af/00/5f")), +COLOR_RES("126", screen.Acolors[126], DFT_COLOR("rgb:af/00/87")), +COLOR_RES("127", screen.Acolors[127], DFT_COLOR("rgb:af/00/af")), +COLOR_RES("128", screen.Acolors[128], DFT_COLOR("rgb:af/00/d7")), +COLOR_RES("129", screen.Acolors[129], DFT_COLOR("rgb:af/00/ff")), +COLOR_RES("130", screen.Acolors[130], DFT_COLOR("rgb:af/5f/00")), +COLOR_RES("131", screen.Acolors[131], DFT_COLOR("rgb:af/5f/5f")), +COLOR_RES("132", screen.Acolors[132], DFT_COLOR("rgb:af/5f/87")), +COLOR_RES("133", screen.Acolors[133], DFT_COLOR("rgb:af/5f/af")), +COLOR_RES("134", screen.Acolors[134], DFT_COLOR("rgb:af/5f/d7")), +COLOR_RES("135", screen.Acolors[135], DFT_COLOR("rgb:af/5f/ff")), +COLOR_RES("136", screen.Acolors[136], DFT_COLOR("rgb:af/87/00")), +COLOR_RES("137", screen.Acolors[137], DFT_COLOR("rgb:af/87/5f")), +COLOR_RES("138", screen.Acolors[138], DFT_COLOR("rgb:af/87/87")), +COLOR_RES("139", screen.Acolors[139], DFT_COLOR("rgb:af/87/af")), +COLOR_RES("140", screen.Acolors[140], DFT_COLOR("rgb:af/87/d7")), +COLOR_RES("141", screen.Acolors[141], DFT_COLOR("rgb:af/87/ff")), +COLOR_RES("142", screen.Acolors[142], DFT_COLOR("rgb:af/af/00")), +COLOR_RES("143", screen.Acolors[143], DFT_COLOR("rgb:af/af/5f")), +COLOR_RES("144", screen.Acolors[144], DFT_COLOR("rgb:af/af/87")), +COLOR_RES("145", screen.Acolors[145], DFT_COLOR("rgb:af/af/af")), +COLOR_RES("146", screen.Acolors[146], DFT_COLOR("rgb:af/af/d7")), +COLOR_RES("147", screen.Acolors[147], DFT_COLOR("rgb:af/af/ff")), +COLOR_RES("148", screen.Acolors[148], DFT_COLOR("rgb:af/d7/00")), +COLOR_RES("149", screen.Acolors[149], DFT_COLOR("rgb:af/d7/5f")), +COLOR_RES("150", screen.Acolors[150], DFT_COLOR("rgb:af/d7/87")), +COLOR_RES("151", screen.Acolors[151], DFT_COLOR("rgb:af/d7/af")), +COLOR_RES("152", screen.Acolors[152], DFT_COLOR("rgb:af/d7/d7")), +COLOR_RES("153", screen.Acolors[153], DFT_COLOR("rgb:af/d7/ff")), +COLOR_RES("154", screen.Acolors[154], DFT_COLOR("rgb:af/ff/00")), +COLOR_RES("155", screen.Acolors[155], DFT_COLOR("rgb:af/ff/5f")), +COLOR_RES("156", screen.Acolors[156], DFT_COLOR("rgb:af/ff/87")), +COLOR_RES("157", screen.Acolors[157], DFT_COLOR("rgb:af/ff/af")), +COLOR_RES("158", screen.Acolors[158], DFT_COLOR("rgb:af/ff/d7")), +COLOR_RES("159", screen.Acolors[159], DFT_COLOR("rgb:af/ff/ff")), +COLOR_RES("160", screen.Acolors[160], DFT_COLOR("rgb:d7/00/00")), +COLOR_RES("161", screen.Acolors[161], DFT_COLOR("rgb:d7/00/5f")), +COLOR_RES("162", screen.Acolors[162], DFT_COLOR("rgb:d7/00/87")), +COLOR_RES("163", screen.Acolors[163], DFT_COLOR("rgb:d7/00/af")), +COLOR_RES("164", screen.Acolors[164], DFT_COLOR("rgb:d7/00/d7")), +COLOR_RES("165", screen.Acolors[165], DFT_COLOR("rgb:d7/00/ff")), +COLOR_RES("166", screen.Acolors[166], DFT_COLOR("rgb:d7/5f/00")), +COLOR_RES("167", screen.Acolors[167], DFT_COLOR("rgb:d7/5f/5f")), +COLOR_RES("168", screen.Acolors[168], DFT_COLOR("rgb:d7/5f/87")), +COLOR_RES("169", screen.Acolors[169], DFT_COLOR("rgb:d7/5f/af")), +COLOR_RES("170", screen.Acolors[170], DFT_COLOR("rgb:d7/5f/d7")), +COLOR_RES("171", screen.Acolors[171], DFT_COLOR("rgb:d7/5f/ff")), +COLOR_RES("172", screen.Acolors[172], DFT_COLOR("rgb:d7/87/00")), +COLOR_RES("173", screen.Acolors[173], DFT_COLOR("rgb:d7/87/5f")), +COLOR_RES("174", screen.Acolors[174], DFT_COLOR("rgb:d7/87/87")), +COLOR_RES("175", screen.Acolors[175], DFT_COLOR("rgb:d7/87/af")), +COLOR_RES("176", screen.Acolors[176], DFT_COLOR("rgb:d7/87/d7")), +COLOR_RES("177", screen.Acolors[177], DFT_COLOR("rgb:d7/87/ff")), +COLOR_RES("178", screen.Acolors[178], DFT_COLOR("rgb:d7/af/00")), +COLOR_RES("179", screen.Acolors[179], DFT_COLOR("rgb:d7/af/5f")), +COLOR_RES("180", screen.Acolors[180], DFT_COLOR("rgb:d7/af/87")), +COLOR_RES("181", screen.Acolors[181], DFT_COLOR("rgb:d7/af/af")), +COLOR_RES("182", screen.Acolors[182], DFT_COLOR("rgb:d7/af/d7")), +COLOR_RES("183", screen.Acolors[183], DFT_COLOR("rgb:d7/af/ff")), +COLOR_RES("184", screen.Acolors[184], DFT_COLOR("rgb:d7/d7/00")), +COLOR_RES("185", screen.Acolors[185], DFT_COLOR("rgb:d7/d7/5f")), +COLOR_RES("186", screen.Acolors[186], DFT_COLOR("rgb:d7/d7/87")), +COLOR_RES("187", screen.Acolors[187], DFT_COLOR("rgb:d7/d7/af")), +COLOR_RES("188", screen.Acolors[188], DFT_COLOR("rgb:d7/d7/d7")), +COLOR_RES("189", screen.Acolors[189], DFT_COLOR("rgb:d7/d7/ff")), +COLOR_RES("190", screen.Acolors[190], DFT_COLOR("rgb:d7/ff/00")), +COLOR_RES("191", screen.Acolors[191], DFT_COLOR("rgb:d7/ff/5f")), +COLOR_RES("192", screen.Acolors[192], DFT_COLOR("rgb:d7/ff/87")), +COLOR_RES("193", screen.Acolors[193], DFT_COLOR("rgb:d7/ff/af")), +COLOR_RES("194", screen.Acolors[194], DFT_COLOR("rgb:d7/ff/d7")), +COLOR_RES("195", screen.Acolors[195], DFT_COLOR("rgb:d7/ff/ff")), +COLOR_RES("196", screen.Acolors[196], DFT_COLOR("rgb:ff/00/00")), +COLOR_RES("197", screen.Acolors[197], DFT_COLOR("rgb:ff/00/5f")), +COLOR_RES("198", screen.Acolors[198], DFT_COLOR("rgb:ff/00/87")), +COLOR_RES("199", screen.Acolors[199], DFT_COLOR("rgb:ff/00/af")), +COLOR_RES("200", screen.Acolors[200], DFT_COLOR("rgb:ff/00/d7")), +COLOR_RES("201", screen.Acolors[201], DFT_COLOR("rgb:ff/00/ff")), +COLOR_RES("202", screen.Acolors[202], DFT_COLOR("rgb:ff/5f/00")), +COLOR_RES("203", screen.Acolors[203], DFT_COLOR("rgb:ff/5f/5f")), +COLOR_RES("204", screen.Acolors[204], DFT_COLOR("rgb:ff/5f/87")), +COLOR_RES("205", screen.Acolors[205], DFT_COLOR("rgb:ff/5f/af")), +COLOR_RES("206", screen.Acolors[206], DFT_COLOR("rgb:ff/5f/d7")), +COLOR_RES("207", screen.Acolors[207], DFT_COLOR("rgb:ff/5f/ff")), +COLOR_RES("208", screen.Acolors[208], DFT_COLOR("rgb:ff/87/00")), +COLOR_RES("209", screen.Acolors[209], DFT_COLOR("rgb:ff/87/5f")), +COLOR_RES("210", screen.Acolors[210], DFT_COLOR("rgb:ff/87/87")), +COLOR_RES("211", screen.Acolors[211], DFT_COLOR("rgb:ff/87/af")), +COLOR_RES("212", screen.Acolors[212], DFT_COLOR("rgb:ff/87/d7")), +COLOR_RES("213", screen.Acolors[213], DFT_COLOR("rgb:ff/87/ff")), +COLOR_RES("214", screen.Acolors[214], DFT_COLOR("rgb:ff/af/00")), +COLOR_RES("215", screen.Acolors[215], DFT_COLOR("rgb:ff/af/5f")), +COLOR_RES("216", screen.Acolors[216], DFT_COLOR("rgb:ff/af/87")), +COLOR_RES("217", screen.Acolors[217], DFT_COLOR("rgb:ff/af/af")), +COLOR_RES("218", screen.Acolors[218], DFT_COLOR("rgb:ff/af/d7")), +COLOR_RES("219", screen.Acolors[219], DFT_COLOR("rgb:ff/af/ff")), +COLOR_RES("220", screen.Acolors[220], DFT_COLOR("rgb:ff/d7/00")), +COLOR_RES("221", screen.Acolors[221], DFT_COLOR("rgb:ff/d7/5f")), +COLOR_RES("222", screen.Acolors[222], DFT_COLOR("rgb:ff/d7/87")), +COLOR_RES("223", screen.Acolors[223], DFT_COLOR("rgb:ff/d7/af")), +COLOR_RES("224", screen.Acolors[224], DFT_COLOR("rgb:ff/d7/d7")), +COLOR_RES("225", screen.Acolors[225], DFT_COLOR("rgb:ff/d7/ff")), +COLOR_RES("226", screen.Acolors[226], DFT_COLOR("rgb:ff/ff/00")), +COLOR_RES("227", screen.Acolors[227], DFT_COLOR("rgb:ff/ff/5f")), +COLOR_RES("228", screen.Acolors[228], DFT_COLOR("rgb:ff/ff/87")), +COLOR_RES("229", screen.Acolors[229], DFT_COLOR("rgb:ff/ff/af")), +COLOR_RES("230", screen.Acolors[230], DFT_COLOR("rgb:ff/ff/d7")), +COLOR_RES("231", screen.Acolors[231], DFT_COLOR("rgb:ff/ff/ff")), +COLOR_RES("232", screen.Acolors[232], DFT_COLOR("rgb:08/08/08")), +COLOR_RES("233", screen.Acolors[233], DFT_COLOR("rgb:12/12/12")), +COLOR_RES("234", screen.Acolors[234], DFT_COLOR("rgb:1c/1c/1c")), +COLOR_RES("235", screen.Acolors[235], DFT_COLOR("rgb:26/26/26")), +COLOR_RES("236", screen.Acolors[236], DFT_COLOR("rgb:30/30/30")), +COLOR_RES("237", screen.Acolors[237], DFT_COLOR("rgb:3a/3a/3a")), +COLOR_RES("238", screen.Acolors[238], DFT_COLOR("rgb:44/44/44")), +COLOR_RES("239", screen.Acolors[239], DFT_COLOR("rgb:4e/4e/4e")), +COLOR_RES("240", screen.Acolors[240], DFT_COLOR("rgb:58/58/58")), +COLOR_RES("241", screen.Acolors[241], DFT_COLOR("rgb:62/62/62")), +COLOR_RES("242", screen.Acolors[242], DFT_COLOR("rgb:6c/6c/6c")), +COLOR_RES("243", screen.Acolors[243], DFT_COLOR("rgb:76/76/76")), +COLOR_RES("244", screen.Acolors[244], DFT_COLOR("rgb:80/80/80")), +COLOR_RES("245", screen.Acolors[245], DFT_COLOR("rgb:8a/8a/8a")), +COLOR_RES("246", screen.Acolors[246], DFT_COLOR("rgb:94/94/94")), +COLOR_RES("247", screen.Acolors[247], DFT_COLOR("rgb:9e/9e/9e")), +COLOR_RES("248", screen.Acolors[248], DFT_COLOR("rgb:a8/a8/a8")), +COLOR_RES("249", screen.Acolors[249], DFT_COLOR("rgb:b2/b2/b2")), +COLOR_RES("250", screen.Acolors[250], DFT_COLOR("rgb:bc/bc/bc")), +COLOR_RES("251", screen.Acolors[251], DFT_COLOR("rgb:c6/c6/c6")), +COLOR_RES("252", screen.Acolors[252], DFT_COLOR("rgb:d0/d0/d0")), +COLOR_RES("253", screen.Acolors[253], DFT_COLOR("rgb:da/da/da")), +COLOR_RES("254", screen.Acolors[254], DFT_COLOR("rgb:e4/e4/e4")), +COLOR_RES("255", screen.Acolors[255], DFT_COLOR("rgb:ee/ee/ee")), + +#endif /* included_256colres_h */ diff --git a/ports/xterm/xterm-359/256colres.pl b/ports/xterm/xterm-359/256colres.pl new file mode 100755 index 0000000..cf9673c --- /dev/null +++ b/ports/xterm/xterm-359/256colres.pl @@ -0,0 +1,93 @@ +#! /usr/bin/perl +# $XTermId: 256colres.pl,v 1.16 2007/06/08 23:58:37 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2002,2007 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- + +# Construct a header file defining default resources for the 256-color model +# of xterm. This is modeled after the 256colors2.pl script. + +# use the resources for colors 0-15 - usually more-or-less a +# reproduction of the standard ANSI colors, but possibly more +# pleasing shades + +use strict; + +our ( $line1, $line2, $line3 ); +our ( $red, $green, $blue, $gray ); +our ( $level, $code, @steps ); + +print < 0 ) { $level += 23.18181818; } + $code = 80 + $gray; + printf($line1, $code); + printf($line2, $code); + printf($line3, + int($level), int($level), int($level)); +} + +print < at the end of each line. + +27-JAN-2000. Discovered a bug when doing an X11 paste into an EDT session, +had to add a tt_start_read() in button.c after the paste to reenable the +read AST. Rearranged code in VMS.C to make the compiler happy and +eliminate warnings. + +David Mathog +mathog@seqaxp.bio.caltech.edu +Manager, sequence analysis facility, biology division, Caltech + + +$XFree86: xc/programs/xterm/AAA_README_VMS.txt,v 1.2 2000/06/13 02:28:37 dawes Exp $ diff --git a/ports/xterm/xterm-359/COPYING b/ports/xterm/xterm-359/COPYING new file mode 100644 index 0000000..0656380 --- /dev/null +++ b/ports/xterm/xterm-359/COPYING @@ -0,0 +1,75 @@ +--- $XTermId: COPYING,v 1.3 2020/01/12 22:53:35 tom Exp $ +------------------------------------------------------------------------------- + +Copyright 1996-2019,2020 by Thomas E. Dickey + + All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name(s) of the above copyright +holders shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization. + +Copyright 1987, 1988 X Consortium + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + +Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital Equipment +Corporation not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +-- vile: txtmode +------------------------------------------------------------------------------- diff --git a/ports/xterm/xterm-359/INSTALL b/ports/xterm/xterm-359/INSTALL new file mode 100644 index 0000000..be35e3a --- /dev/null +++ b/ports/xterm/xterm-359/INSTALL @@ -0,0 +1,875 @@ +-- $XTermId: INSTALL,v 1.184 2020/07/25 17:58:05 tom Exp $ +------------------------------------------------------------------------------- +-- Copyright 1997-2019,2020 by Thomas E. Dickey +-- +-- All Rights Reserved +-- +-- Permission is hereby granted, free of charge, to any person obtaining a +-- copy of this software and associated documentation files (the +-- "Software"), to deal in the Software without restriction, including +-- without limitation the rights to use, copy, modify, merge, publish, +-- distribute, sublicense, and/or sell copies of the Software, and to +-- permit persons to whom the Software is furnished to do so, subject to +-- the following conditions: +-- +-- The above copyright notice and this permission notice shall be included +-- in all copies or substantial portions of the Software. +-- +-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +-- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +-- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +-- IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +-- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +-- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +-- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-- +-- Except as contained in this notice, the name(s) of the above copyright +-- holders shall not be used in advertising or otherwise to promote the +-- sale, use or other dealings in this Software without prior written +-- authorization. +------------------------------------------------------------------------------- + +Xterm was originally built as part of the X Window System source tree, using +imake to generate a Makefile from Imakefile. + +An example Imakefile is provided for legacy use. + +The preferred method uses the configure script to generate a Makefile from +Makefile.in + +Options: +------- + +Autoconf configure scripts recognize two types of application-defined +options, enable/disable and with/without. The latter, by convention, are +used for denoting inclusion of external packages, while the former denote +enabling/disabling of internal features. The configure --help option lists +the available options. This script uses "enable" and "disable" to indicate +the sense of the default behavior. + +The options (in alphabetic order): + + --disable-256-color disable 256-color support + + Do not compile-in code that interprets SGR 38 and 48 for 256-colors. + If this feature is disabled, the 88-color feature will be used. + + --disable-88-color disable 88-color support + + Do not compile-in code that interprets SGR 38 and 48 for 88-colors. + The 256-color option overrides this. + + --disable-16-color disable 16-color support + + Do not compile-in code to recognize aixterm-style control sequences + that support color values 8-15. + + Most color applications know only about 8 ANSI colors, but some + (e.g., ones built with ncurses) do. + + --disable-active-icon disable X11R6.3 active-icon feature + + Do not compile-in code to support the active-icon feature. This is + not configured on systems (e.g., X11R5) which lack the library + support needed. + + Xterms with an active icon continue to respond to input and update + their display when iconified. Not all window managers support + active icons. Those that do include fvwm, olvwm and mwm. + + --disable-ansi-color disable ANSI color + + Do not compile-in code for ANSI colors. + + --disable-blink-cursor disable support for blinking cursor + + Do not compile-in code that implements a blinking cursor. The blinking + cursor is enabled either by resource setting or by popup menu entry. + + --disable-bold-color disable PC-style mapping of bold colors + + Do not compile-in code that maps colors 8-15 to bold versions of + colors 0-7. + + Some applications have hardcoded logic that assumes this. It does + not interfere with the 16-color support. + + --disable-boxchars disable fallback-support for box chars + + Do not compile-in code to generate approximations for box/graphic + characters. + + Most fonts do not contain the vt100-style graphic characters in + positions 0-31. Many applications use the line-drawing characters, + e.g., to make boxes. When xterm loads a font, it checks if those + characters are present, and draws its own if they are missing. + + --disable-broken-st disallow broken string-terminators, + + Do not compile-in code that works around a bug in some ISDN routers + (and possibly other applications written by the same people): they + send an unterminated control string in their banner text, making xterm + freeze. + + The workaround tells xterm to stop processing the control string when + it receives one of the whitespace control characters such as newline. + That was the behavior before patch #171. + + See also --enable-broken-osc + + --disable-c1-print disallow -k8 option for printable 128-159, + + Use this option to suppress support for nonstandard use of codes + 128-159, which normally are considered control characters. Some users + have fonts which use those positions. The default value for the + allowC1Printable resource is false, so this feature does not impact + normal users. + + --disable-color-class disable color class resources + + Use this option to change most of the color resources to use Foreground + as the color class. This is the older (before patch #157) behavior + which has the drawback that setting the Foreground resource on most + platforms prevents use of color since the class is evaluated before + the instance. + + --disable-color-mode disable default colorMode resource + + Do not compile-in code that sets the default value of the colorMode + resource to ``true''. + + --disable-desktop disable install of xterm desktop files + + Do not install the xterm desktop files, used in menus. + These use the icons installed in the --with-icondir option. + Use the environment variable $DESKTOP_FLAGS to supply options + required by desktop-file-install. + + Note: If desktop-utils is not found they will not be installed anyway. + + --disable-direct-color disable direct color support + + Do not compile-in code that interprets SGR 38 and 48 for direct colors. + This feature extends the 256-color feature. + + --disable-doublechars disable support for double-size chars + + Do not compile-in code that supports font-manipulation needed to + implement vt100-style double-sized characters. + + --disable-echo test: display "compiling" commands + + Modify the generated Makefile so that most compiler options are + not shown. This makes it simpler to read a build log and see the + actual warning messages. + + --disable-fifo-lines enable FIFO-storage for saved-lines + + With patch #244, xterm by default stores saved-lines in a FIFO + (circular buffer), which improves performance when the number of saved + lines is large. Disable this option to revert to the pre-244 layout. + + --disable-freetype disable freetype library-support + + Do not use freetype libraries if they are found. Normally they will + be used automatically. + + --disable-full-tgetent disable check for termcap library + + Do not look for the tgetent() function specifically in the termcap + library, accept the first library (from termlib, ncurses and curses) + which contains this function rather than continuing to search for + a termcap implementation rather than terminfo. The former would + supply the complete $TERMCAP data needed for some legacy programs. + + --disable-highlighting disable support for color highlighting + + Do not compile-in code that allows the selected region to be a + different color than the reverse of foreground/background colors. + + See the discussion of highlightColor in the manual. + + --disable-i18n disable internationalization + + Do not compile-in code to handle multi-byte characters. This is + related to, but not identical with the input method logic. + + --disable-imake disable use of imake for definitions + + Do not attempt to use imake to determine compiler options. + + The main.c file has many ifdef's which rely on obscure combinations + known only to imake. The configure script implements only a + portion of the tests needed to supplant imake. + + --disable-initial-erase disable setup for stty erase + + Do not compile-in code which aligns the stty erase and the backarrow + key. When compiled-in, xterm will optionally use the pty's sense + of stty erase and apply that to the backarrow mode (sending 8 or 127), + or go the other way, setting stty erase to match xterm's configuration. + + --disable-input-method disable input-method + + Do not compile-in code for "input method". This is an X11R6 + feature which deals with translation of composite characters. + + Some users report problems with their configuration, e.g., messages + stating that there is no input method defined for the given preedit + type. If you do not need input method (and are troubled by the + warning messages), it is safe to disable this option. + + --disable-leaks test: free permanent memory, analyze leaks + + Compile-in code which frees memory which might confuse a leak-testing + tool. Normally these chunks of memory are retained as long as xterm + is running. + + --disable-luit disable support for luit filter (Unicode translation) + + Luit is a filter that can be run between an arbitrary application and a + UTF-8 terminal emulator. It will convert application output from the + locale's encoding into UTF-8, and convert terminal input from UTF-8 + into the locale's encoding. + + This is normally enabled, relying upon "--enable-wide-chars". + + --disable-maximize disable actions for iconify/deiconify/maximize/restore + + Do not compile-in code that implements runtime 'actions' for + iconifying, maximizing, etc. + + Most users will find that the window manager is more suitable for + this sort of manipulation than putting the capabilities into xterm. + + --disable-num-lock disable NumLock keypad support + + Do not compile-in code that looks for the actual NumLock key to + support vt100/vt220 keypad translation. + + This is used in xterm to simplify logic, and to workaround some + quirks of the keyboard tables. Use the ``numLock'' resource to + disable this feature if you must customize xterm in some other way. + + (The same ifdef controls the metaSendsEscape support). + + --disable-openpty disable openpty, prefer other interfaces + + Do not check for, or use openpty(). Instead, use other interfaces such + as posix_openpt(). Modern (sic) BSD systems should have a workable + openpty() interface. Older systems may not. + + --disable-paste64 disable support for bracketed paste mode + + Do not compile-in code to support bracketed paste mode, along with + functions for setting/getting the selection data, termed "paste64". + + (see ctlseqs.ms description of OSC 52, and DECSET 2004). + + --disable-pty-handshake disable support for pty handshakes + + This feature is used to ensure that the child process's terminal modes + match the parent's. In particular, it addresses a problem where the + terminal size is not defined in the stty settings. + + --disable-rectangles disable VT420 rectangle support + + Do not compile-in code to support VT420 rectangle control-sequences. + + --disable-regex disable regular-expression selections + + Do not compile-in code to support the "regex" option for multiple + mouse clicks. + + --disable-rightbar disable right-scrollbar support + + Do not compile-in code that supports a scrollbar on the right. + + Left/right scrollbars are a matter of taste. Some older libraries + (e.g., X11R5) do not perform the geometry computation correctly, + leaving the right scrollbar incorrectly positioned after changing + the font size. + + --disable-rpath-hack don't add rpath options for additional libraries + + By default, the configure script looks for libraries in unusual places + and adds an rpath linker option to help. + + --disable-samename disable check for redundant name-change + + Do not compile-in code that suppresses redundant updates to the + titlebar when the text has not changed. + + --disable-screen-dumps disable XHTML and SVG screen dumps + + Do not compile-in code that provides XHTML and SVG screen dumps. + + --disable-selection-ops disable selection operations + + Do not compile-in code to support the actions which allow users + to bind keys that use the selection or extract data from the screen. + + --disable-session-mgt enable support for session management + + Do not compile-in code which adds simple session management hooks + which are used when closing an xterm. Normally the code is + compiled-in, except for systems which do not support it. + + --disable-setgid disable setgid + + Do not install xterm using setuid/setgid permissions. Drop setgid + permissions on startup. + + --disable-setuid disable setuid + + Do not install xterm using setuid/setgid permissions. Drop setuid + permissions on startup. + + --disable-sixel-graphics disable support for sixel-graphics + + Do not compile-in code to support sixel-graphics + + --disable-sun-fkeys + + Do not compile-in code to support Sun-style function keys. + + --disable-tcap-fkeys disable termcap function-keys + + Do not compile-in code to support feature which allows xterm to use the + function-key definitions from the termcap/terminfo entry which it used + to set the $TERM variable on startup. + + --disable-tcap-query disable termcap query/report + + Do not compile-in code to support DCS '+' control sequence, which + allows an application to ask xterm what control sequences it would + transmit for specified function keys, given the termcap or terminfo + names. + + --disable-tek4014 disable tek4014 emulation + + Do not compile-in code to support Tektronix 4014 emulation. + + This reduces the executable size by 17% (checked 1999/3/13). + + Some people use the Tektronix emulation (which has been in xterm + for many years) as an example of code bloat, though this is not an + accurate impression. + + --disable-vt52 disable VT52 emulation + + Do not compile-in code to support vt52 emulation. + + A genuine vt100 emulates a vt52. + + --disable-wide-attrs disable wide-attribute support + + Xterm's base attributes include all of those used in DEC terminals. + ISO 6429 defines a few more which historically have found little use. + Some people find these amusing. + + This is normally enabled. The direct-colors feature relies upon it. + + --disable-wide-chars disable wide-character support + + The wide-character code supports Unicode and UTF-8. + + This is normally enabled. + + --disable-ziconbeep disable -ziconbeep option + + Do not compile-in code that modifies the icon's title and sounds a + beep when they receive output. + + --enable-16bit-chars enable 16-bit characters support + + Enable wide-character support, but store only 16-bits for each wide + character. Unicode values can be larger than 16-bits, up to 21-bits. + This uses less memory, but is less complete. However, most languages + are covered by the 16-bit encoding. + + --enable-alt-sends-esc set default altSendsEscape resource (default: no) + + This sets the default resource value, which is shown in the manpage. + + --enable-backarrow-key set default backarrowKey resource (default: true) + + This sets the default resource value, which is shown in the manpage. + + --enable-backarrow-is-erase set default backarrowKeyIsErase resource (default: false) + + This sets the default resource value, which is shown in the manpage. + + --enable-broken-osc allow broken Linux OSC-strings + + Compile-in code to accommodate scripts that write Linux's malformed + palette control strings without checking. The result makes xterm + appear to freeze. This workaround makes xterm ignore the strings, + and is compiled-in by default for Linux. + + --enable-builtin-xpms compile-in icon data + + Compile-in X pixmap data for these icons: + filled-xterm + mini.xterm + xterm-color + xterm + at these sizes + 16x16 + 32x32 + 48x48 + + --enable-dabbrev enable dynamic-abbreviation support + + Compile-in support for "dabbrev-expand()" action and related key + translation. + + --enable-dec-locator enable DECterm Locator support + Add support for DEC Locator control sequences for xterm: + + DECEFR - Enable Filter Rectangle + DECELR - Enable Locator Reports + DECSLE - Select Locator Events + DECRQLP - Request Locator Position + + This allows the xterm mouse to be used with applications that use the + DEC Locator sequences, such as VAX Tpu, or SMG$ based applications. + + --enable-delete-is-del set default deleteIsDEL resource (default: maybe) + + This sets the default resource value, which is shown in the manpage. + + --enable-double-buffer enable double-buffering + + Set the initial value of the "buffered" resource, which tells + xterm to use double-buffering for display to reduce flicker. + + --enable-env-terminfo setenv $TERMINFO if --with-own-terminfo gives value + + Use the custom terminfo directory specified in "--with-own-terminfo" + as the $TERMINFO variable for the shells spawned by xterm. Setting + this variable makes most curses (and termcap) applications look in + that directory for terminal descriptions. + + --enable-exec-xterm enable "spawn-new-terminal" action + + If your platform supports the process filesystem "cwd" link, + compile-in support for the "spawn-new-terminal" action, which + allows you to define a key translation that runs a new xterm + using the same working directory as the current process within + xterm. + + --enable-hp-fkeys enable support for HP-style function keys + + Compile-in code to support HP-style function keys. + + --enable-load-vt-fonts enable load-vt-fonts() action + + Compile-in code that allows user to define load different VT-font + definitions at runtime. + + --enable-logfile-exec enable exec'd logfile filter + + Compile-in code that allows logging piped via an external filter. + + --enable-logging enable logging + + Compile-in code that allows logging. + + Logging was disabled in X11R5 xterm because of security problems. + They were addressed in X11R6, but the feature was not reinstated + because of concerns (long past) about xterm running as root-setuid. + + --enable-meta-sends-esc set default metaSendsEscape resource (default: no) + + This sets the default resource value, which is shown in the manpage. + + --enable-mini-luit enable support for poor man's luit filter (Latin-9) + + Provide built-in support for Latin-9, relying on having specified + Unicode (ISO10646) fonts and setting the locale resource to "checkfont". + + This sets "--enable-luit" as a side-effect. + + --enable-narrowproto enable narrow prototypes for X libraries + + Originally xterm was built using imake rather than a configure script. + One feature of imake that is not possible to guess within the + configure script is the wide-prototype compile-time definition + NARROWPROTO. When this is not set properly, the Athena widget + scrollbars do not work properly. xterm's configure script has a + fallback case which allows disabling imake. However, this is moot + with the X.org "modular" build, whose compiler options are unrelated to + imake or older versions of any libraries that it may distribute. In + this case, the configure script needs some help. Use this option to + enable or disable NARROW proto (and disable imake with the + --disable-imake option) to match the whims of X.org hackers. + + For instance + + configure --disable-imake --disable-narrowproto + + --enable-pty-erase set default ptyInitialErase resource (default: false) + + This sets the default resource value, which is shown in the manpage. + + --enable-readline-mouse enable support for mouse in readline applications + + Compile-in code to support predecessor to bracketed paste mode, i.e., + provide functions for setting/getting the selection data. Essentially + this puts xterm into a mode that sends special function-key strings to + bracket the data. + + (The "paste64" feature, which fits xterm's protocol better, is + configured by default). + + --enable-sco-fkeys enable support for SCO-style function keys + + Compile-in code to support SCO-style function keys. + + --enable-regis-graphics enable support for ReGIS graphics + + Compile-in code to support experimental ReGIS graphics + + --enable-toolbar enable pulldown menus on toolbar + + Compile-in code that builds a toolbar with pulldown menus. The + normal popup menus are still available. + + This is an experimental option. As of patch #206, it is known to + work well with fvwm, but not as well with some other window managers, + e.g., KDE's Kwin and IceWM. + + In addition to isolated layout problems, it is reported that some + flavors of the Athena widget library perform badly with ISO-10646 + fonts. You can work around those by setting the menu fonts to + an ISO-8859 variant in your X resources. + + --enable-trace test: set to enable debugging traces + + Compile-in code to trace xterm's internal states. + + This is a debugging feature. It causes xterm to produce two files + (Trace-parent.out and Trace-child.out). + + --enable-warnings test: turn on GCC compiler warnings + + Modify the generate Makefile to turn on gcc compiler warnings. + + I use this option regularly, and correct all but a few (difficult) + problems. + + --enable-xmc-glitch test: enable xmc magic-cookie emulation + + Compile-in code that simulates the terminfo "magic cookie" glitch. + + This is for testing ncurses. + + --with-Xaw3d link with Xaw 3d library + + Look for, compile and link with the Xaw 3d widget library. + + --with-Xaw3dxft link with Xaw 3d xft library + + Look for, compile and link with the Xaw 3d xft widget library. + + --with-XawPlus link with Athena-Plus library + + Look for, compile and link with the Xaw Plus widget library. + + --with-app-class=XXX X resource class (default: XTerm) + + Rename the X resource class, e.g., for packaging a development version + of xterm with different result names. + + --with-app-defaults=DIR directory in which to install resource files (default: EPREFIX/lib/X11/app-defaults) + + autoconf scripts assume that all of the files should be installed + under the same top-level directory. But X applications defaults + must be installed into a special directory, e.g., + + /usr/X11/lib/app-defaults + + However, there is no standard for this pathname. The manual page + for X notes that the environment variable $XUSERFILESEARCHPATH can + specify a list of places where X searches for applications defaults. + Also, it may look in $XAPPLRESDIR, but that usually is not related + to where xterm might be installed. To keep it simple, the configure + script uses + + EPREFIX/lib/X11/app-defaults + + as the default (EPREFIX is --prefix). That makes it work normally + for most systems if --prefix is /usr. For other installs, e.g., to + /usr/local, you should use this option to customize the location to + match your system configuration. + + Use --with-app-defaults=auto to ask the configure script to look in + a list of well-known locations for an existing directory. + + Use --without-app-defaults or --with-app-defaults=no to disable the + feature. + + --with-dmalloc test: use Gray Watson's dmalloc library + + Check for and link with dmalloc. + + --with-dbmalloc test: use Conor Cahill's dbmalloc library + + Check for and link with dbmalloc. + + --with-desktop-category=XXX one or more desktop categories or auto + This is a list of names. The configure script maps blanks and commas + to semicolons (";") which are used by the desktop utilities as a + separator. + + The default value "auto" tells the configure script to look + at existing ".desktop" files for xterm and common terminal + emulators, to use those. If none are found, the script uses this + default: + System;TerminalEmulator; + + --with-freetype-config configure script to use for FreeType + + Use a specific option value to tell the configure script to try + just one of the variations: + + "pkg*", e.g., pkg-config or pkgconfig uses whatever pkg-config + script was found. + + otherwise, the parameter value is used as the name of the script + to try, using --cflags and --libs options. + + Use --without-freetype-config to enable the --with-freetype-cflags + and --with-freetype-libs options. + + The default value "auto" tells the configure script to try the + pkg-config script first, then freetype-config and finally xft-config. + + --with-freetype-cflags -D/-I options for compiling with FreeType library + + Override options provided by xft-config or freetype-config. + + --with-freetype-libs -L/-l options for linking with FreeType library + + Override options provided by xft-config or freetype-config. + + --with-icon-name=NAME override icon name (default: xterm-color) + + xterm comes with a choice of icons: + + xterm-color: depicts a conventional terminal image, and is the default + icon used for icon-themes. + + mini.xterm: a more iconic choice which is readily identifiable at + small sizes. This is used for window decoration, e.g., the + icon at the upper left corner in many window managers. + + --with-icon-symlink=NAME create symbolic links to icon name (default: NONE) + + This is a workaround for certain systems which translate icon names + containing "xterm", e.g., "xterm-color" into the single icon "xterm". + The option should also be harmless on a properly configured system. + + If the option is used, its default value is "xterm". For each icon, + the makefile will strip the suffix (e.g., ".png"), as well as the part + of the filename which denotes the size (e.g., "_32x32" in an xpm file), + and constructs a link with that name to the icon. + + If the option is unused, its default value is "NONE" (no link is made). + + --with-icondir=DIR directory in which to install icon files (default: no) + + The X libraries may automatically search these locations: + + $HOME/.icons + $XDG_DATA_DIRS/icons + /usr/share/pixmaps + + Alternatively, the last may be actually + /usr/X11R6/share/pixmaps + + Use --with-icondir=auto to tell the configure script to search for + an existing directory from its list of well-known system locations. + + See also + http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html + http://www.freedesktop.org/software/icon-theme/ + + By default, the option is disabled; it is useful only for the + --with-icon-theme option. + + --with-icon-theme=XXX install icons into desktop theme (hicolor) + + Install png and svg icons into the given desktop theme and customize + the .desktop files to use that theme. If no theme name is given, + the default is "hicolor". If this option is not given, the desktop + file will use the pixmap files. + + --with-man2html[=XXX] use XXX rather than groff + + Specify an alternative program to use for converting manpages and + control sequences document to html. The default value for the option + is "man2html". If the "man2html" script is not found, then "groff" is + used with groff's special options. + + The "man2html" script reads formatted nroff output from its standard + input, and writes html to its standard output. Other input/output + conventions are not currently supported. + + See + http://invisible-island.net/scripts + http://invisible-island.net/scripts/man2html.html + + for an up-to-date version of "man2html". + + --with-neXtaw link with neXT Athena library + + Look for, compile and link with the neXT Athena widget library. + + --with-own-terminfo=P set default $TERMINFO (default: from environment) + + Modify the generated Makefile to set the target for the 'install-ti' + rule to point to the given directory. + + If you have the $TERMINFO variable defined in your environment, the + configure script may use that value, if it matches an existing + directory. If no option and no variable are are given, the configure + script uses /usr/lib/terminfo, if it exists. + + You do not have to run "make install-ti", if there is already a + workable terminfo description. Be advised, however, that the + common variety of "xterm-color" is not suited for xterm, but is + directed to other variations (such as nxterm) which do not + support the background-color erase capability. + + --with-pixmapdir=DIR directory in which to install pixmaps (DATADIR/pixmaps) + + Specify directory in which to install ".xpm" files. + + --with-pcre use PCRE for regular-expressions + + If regular expressions are not disabled (--disable-regex), use PCRE + rather than the POSIX regular expressions. + + --with-pcre2 use PCRE2 for regular-expressions + + If regular expressions are not disabled (--disable-regex), use PCRE2 + rather than the POSIX regular expressions. + + --with-pkg-config{=path} enable/disable use of pkg-config + + The configure script looks for certain libraries which have well + established pkg-config scripts, and will use those settings if + available. Not all pkg-config scripts work; this option suppresses + the check and relies on normal library search paths. + + --with-reference=XXX program to use as permissions-reference + + To install xterm with setuid permissions, the scripts usually compare + it with a previous install. That works well for individual + maintainers, but can be a problem for packagers who may be + cross-compiling, etc. This option lets the package builder specify + the file used for permissions reference. + + --with-setuid=XXX use the given setuid user + + Install xterm setuid'd to the given user. If no parameter value + is given, assume it is root. + + See also --with-utmp-setgid and --with-utempter, which manipulate + the setgid group. + + --with-tty-group=XXX use XXX for the tty-group + + If xterm is installed setuid'd to root, change the group of the tty + device to the given value on startup. Three cases are possible: + + a) If this option is not given, the configure script will attempt to + find a suitable value (usually "tty"), and verify that it exists in + the group database. + + b) If the option value is given, it will use the value even if it does + not exist in the group database (allowing packagers to work about + deficient environments). + + c) If the option is disabled, e.g., --without-tty-group, the + permissions change will use the group-id of the process. + + If xterm is not installed setuid'd to root, this option is not needed, + since it cannot change the tty device's ownership. + + --with-valgrind test: use valgrind + + Activate the --disable-leaks option, and ensure that "-g" is added to + CFLAGS. + + --without-xinerama do not use Xinerama extension for multiple screens + + Xinerama is an X server extension that allows multiple physical + screens to behave as a single screen. If you do not need the feature + (or do not want the extra library dependency), use this option to + suppress it. + + --with-xpm=DIR use Xpm library for colored icon, may specify path + + Use Xpm library to show colored icon in window decoration, e.g., + title area. + + Use --without-xpm to suppress this feature. + + --with-xterm-symlink=XXX make symbolic link to installed xterm + + If any of the configure options to modify the program name i.e., + --program-prefix, --program-suffix or --program-transform-name + are given, this option allows the makefile to create a symbolic link, + e.g., to "xterm" on install. The option value gives the name for + the link, which defaults to "xterm". + + Use --without-xterm-symlink to disable a link to "xterm" if none + is wanted. + + Corresponding links are also made for "resize", "uxterm" and + "koi8rxterm", as well as the xterm manpage. + + --with-terminal-id[=V] set default decTerminalID (default: vt100) + + Set the default emulation level. + + DEC terminals vt52/vt100/vt220/etc form a series where succeeding + models emulate features of the older terminals. While most + features of these terminals are recognized by xterm at all levels, + a few behave differently according to the emulation level. + + You can always override this with the command-line option "-ti". + + --with-terminal-type=T set default $TERM (default: xterm) + + Set the default value for $TERM. Xterm supports legacy termcap + applications by constructing a modified version of the $TERMCAP + variable at initialization, which supplies the resulting screen + size. It also sets $TERM, if not already set, for use by programs + running within xterm. + + The default value "xterm", can be overridden to avoid conflict + with older versions of xterm, e.g., those that do not implement + vt220 emulation. + + You can always override this with the command-line option "-tn". + + --with-utempter use utempter library for access to utmp + + The utempter library is a set-uid wrapper for the utmp facility. + On systems with Unix98 pty's, xterm can use this library when + available so it need not be installed set-uid. + + --with-utmp-setgid=XXX use setgid for access to utmp + + The option value specifies a group to use when installing. + xterm will be installed with setgid privilege to this group. + At runtime, xterm will drop the setuid privilege immediately + after opening the pseudo-terminal, and will have only the + group privilege needed to access the utmp file. This relies + on having POSIX setuid behavior. + +-- vile:txtmode diff --git a/ports/xterm/xterm-359/Imakefile b/ports/xterm/xterm-359/Imakefile new file mode 100644 index 0000000..cb2297c --- /dev/null +++ b/ports/xterm/xterm-359/Imakefile @@ -0,0 +1,338 @@ +XCOMM $XTermId: Imakefile,v 1.123 2019/11/02 21:50:51 tom Exp $ +XCOMM +XCOMM Attention xterm porters +XCOMM +XCOMM +XCOMM Xterm assumes that bcopy can handle overlapping arguments. If your +XCOMM bcopy (or memcpy) cannot, write a routine called bcopy and link it in +XCOMM or add -Dbcopy=mybcopy to the DEFINES list below. +XCOMM + +/* Uncomment SCROLLBAR_RIGHT if you want the scroll bar to be on the right */ +SCROLLBAR_RIGHT = -DSCROLLBAR_RIGHT + +/* Define UTF8support to compile-in support for UTF-8 */ +#define UTF8support + +/* + * setgid mode works for systems that do not require setuid to open pty. + * + * This feature could also be applied to FreeBSD, but requires the installer + * to define a "utmp" group as well as chgrp the utmp file to match. + * + * Note: InstallXtermSetUID is always defined; InstallXtermSetGID is defined + * in newer imake configurations. + */ +#if !defined(InstallXtermSetGID) && !InstallXtermSetUID +#if defined(OpenBSDArchitecture) || \ + (defined(LinuxArchitecture) && \ + (LinuxCLibMajorVersion == 6)) +#define InstallXtermSetGID YES +#endif +#endif + +/* + * Override the set uid/gid flags to use the utempter library. + */ +#if defined(UseUtempter) +#undef InstallXtermSetUID /* imake sets this */ +#undef InstallXtermSetGID /* we set this */ +#define InstallXtermSetUID NO +#define InstallXtermSetGID NO + UTMPLIB = -lutempter +#endif + +/* + * Fixes to allow compile with X11R5, etc. + */ +#ifndef InstGidFlags +#define InstGidFlags -m 2755 -g utmp +#endif + +#ifndef InstUidFlags +#define InstUidFlags -m 4711 +#endif + +#ifndef XkbClientDefines +#define XkbClientDefines /**/ +#endif + +#ifndef InstallXtermSetUID +#define InstallXtermSetUID NO +#endif + +#ifndef InstallXtermSetGID +#define InstallXtermSetGID NO +#endif + +#ifndef XkbClientDepLibs +#define XkbClientDepLibs /**/ +#endif + +#ifndef XkbClientLibs +#define XkbClientLibs /**/ +#endif + +/* This must come before setting DEFINES */ +#if InstallXtermSetGID +CSGIDFLAGS = -DUSE_UTMP_SETGID +INSTSETIDFLAGS = InstGidFlags +#elif InstallXtermSetUID +INSTSETIDFLAGS = InstUidFlags +#else +INSTSETIDFLAGS = NullParameter +#endif + +/* + * Compensate for broken imake configuration. + */ +#ifdef LinuxGnuSourceDefines +# ifdef UseInstalled + IMAKEDEFINES = -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 +# endif +#endif + +#ifndef SpecialCObjectRule +#define SpecialCObjectRule(module,ignore,defines) \ +module.o: ; $(CC) -c defines $(CFLAGS) module.c +#endif + +#ifndef ProgramTargetName +#define ProgramTargetName(program) program +#endif + +/* + * add -DWTMP and -DLASTLOG if you want them; make sure that bcopy can + * handle overlapping copies before using it. + */ +#if SetTtyGroup /* turn on in config/machine.cf */ + TTYGROUPDEF = -DUSE_TTY_GROUP +#endif +#ifdef UsePUCCPtyd /* turn on in config/site.def */ + PUCCPTYDDEF = -DPUCC_PTYD /* does not need to be setuid */ + PTYLIB = -lpucc +#endif + +#if defined(NetBSDArchitecture) || \ + defined(OpenBSDArchitecture) || \ + defined(FreeBSDArchitecture) || \ + (defined(LinuxArchitecture) && \ + (LinuxCLibMajorVersion == 6) && (LinuxCLibMinorVersion < 1)) + PTYLIB = -lutil +#endif + +#ifdef DarwinArchitecture +/* dyld can deadlock if a signal comes in when it is looking up a symbol */ + LOCAL_LDFLAGS = -Wl,-bind_at_load +#endif + + OSMAJORVERSION = OSMajorVersion + OSMINORVERSION = OSMinorVersion + +/* none of these can be expected to use termcap unless emulated by terminfo */ +#if defined(NTOArchitecture) || \ + defined(OpenBSDArchitecture) || \ + defined(SGIArchitecture) || \ + defined(SunArchitecture) || \ + defined(NetBSDArchitecture) || \ + defined(OpenBSDArchitecture) || \ + defined(FreeBSDArchitecture) || \ + defined(LinuxArchitecture) +TERMCAPDEFINES=-DUSE_TERMINFO -DHAVE_TIGETSTR -DHAVE_TERM_H +#endif + +#if !defined(OS2Architecture) && !defined(__GNU__) && !defined(Minix3Architecture) +#if defined(UseUtempter) + UTMPDEF = -DUSE_UTEMPTER +#else + UTMPDEF = -DUTMP +#endif +#endif + +#ifdef UTF8support + UTF8_OPTION = -DOPT_WIDE_CHARS -DOPT_LUIT_PROG + UTF8SRC = charclass.c precompose.c wcwidth.c xutf8.c + UTF8OBJ = charclass.o precompose.o wcwidth.o xutf8.o +#endif +#if BuildXftLibrary +#define XRenderSupport +#endif +#ifdef XRenderSupport + XRFDEF = -DXRENDERFONT -DXFREE86_FT2 + XRFLIBS = XftClientLibs + XRFDEPLIBS = XftClientDepLibs + XRFINCLUDES = $(XFTINCLUDES) +#endif +#if !HasPutenv + PUTENVDEF = -DNOPUTENV +#endif +#ifdef RegisXTerm + SIXELDEF = -DOPT_REGIS_GRAPHICS=1 +#endif +#ifdef SixelXTerm + SIXELDEF = -DOPT_SIXEL_GRAPHICS=1 +#endif +#ifdef TraceXTerm + TRACEDEF = -DOPT_TRACE=1 +#endif + MAIN_DEFINES = $(UTMPDEF) $(TTYGROUPDEF) $(PUCCPTYDDEF) $(CSGIDFLAGS) \ + -DOSMAJORVERSION=$(OSMAJORVERSION) \ + -DOSMINORVERSION=$(OSMINORVERSION) + MISC_DEFINES = /* -DALLOWLOGGING -DALLOWLOGFILEEXEC */ + XKB_DEFINES = XkbClientDefines + PATH_DEFINES = -DPROJECTROOT=$(PROJECTROOT) + DEFINES = $(XKB_DEFINES) $(TERMCAPDEFINES) $(FEATURE_DEFINES) $(SCROLLBAR_RIGHT) $(UTF8_OPTION) $(XRFDEF) $(PATH_DEFINES) $(PUTENVDEF) $(IMAKEDEFINES) $(SIXELDEF) $(TRACEDEF) + INCLUDES = -I. $(XRFINCLUDES) + + MAINSRC = main.c + MAINOBJ = main.o + DUMPSSRC = html.c svg.c + DUMPSOBJ = html.o svg.o +#ifdef RegisXTerm + SIXELSRC = graphics_regis.c + SIXELOBJ = graphics_regis.o +#endif +#ifdef SixelXTerm + SIXELSRC = graphics_sixel.c + SIXELOBJ = graphics_sixel.o +#endif +#ifdef TraceXTerm + TRACESRC = trace.c + TRACEOBJ = trace.o +#endif + SRCS1 = button.c cachedGCs.c charproc.c charsets.c cursor.c \ + data.c doublechr.c fontutils.c input.c \ + linedata.c menu.c misc.c print.c ptydata.c scrollback.c \ + screen.c scrollbar.c tabs.c util.c version.c xstrings.c \ + xtermcap.c TekPrsTbl.c Tekproc.c VTPrsTbl.c \ + $(MAINSRC) $(EXTRASRC) $(UTF8SRC) $(SIXELSRC) $(TRACESRC) $(DUMPSSRC) + OBJS1 = button.o cachedGCs.o charproc.o charsets.o cursor.o \ + data.o doublechr.o fontutils.o input.o \ + linedata.o menu.o misc.o print.o ptydata.o scrollback.o \ + screen.o scrollbar.o tabs.o util.o version.o xstrings.o \ + xtermcap.o TekPrsTbl.o Tekproc.o VTPrsTbl.o \ + $(MAINOBJ) $(EXTRAOBJ) $(UTF8OBJ) $(SIXELOBJ) $(TRACEOBJ) $(DUMPSOBJ) + SRCS2 = resize.c version.c xstrings.c + OBJS2 = resize.o version.o xstrings.o + SRCS = $(SRCS1) $(SRCS2) + OBJS = $(OBJS1) $(OBJS2) + PROGRAMS = ProgramTargetName(resize) ProgramTargetName(xterm) + DEPLIBS1 = XkbClientDepLibs XawClientDepLibs $(XRFDEPLIBS) + DEPLIBS2 = + +#ifndef TermcapLibrary +#if SystemV && !defined(MacIIArchitecture) +#if defined(CrayArchitecture) || \ + (defined(HPArchitecture) && (OSMajorVersion < 10)) || \ + defined(RsArchitecture) || \ + defined(SCOArchitecture) || \ + defined(USLArchitecture) +#define TermcapLibrary -lcurses /* special cases of System V */ +#else +#define TermcapLibrary -ltermlib /* usually in here */ +#endif +#else +#define TermcapLibrary -ltermcap /* bsd puts it here */ +#endif +#endif + + TERMCAPLIB = TermcapLibrary + +AllTarget($(PROGRAMS)) + +VTPARSE_H = VTparse.h VTparse.hin +TEKPARSE_H = Tekparse.h Tekparse.hin + +VTPARSE_C = VTparse.h VTparse.cin +TEKPARSE_C = Tekparse.h Tekparse.cin + +.SUFFIXES : .def .cin .hin +.def.cin : + awk '/^CASE_/{printf "{ %d, \"%s\" },\n", n++, $$1; }' < $< >$@ +.def.hin : + awk '/^CASE_/{printf "#define %s %d\n", $$1, n++}' < $< >$@ + +SpecialCObjectRule(main,$(_NOOP_),$(MAIN_DEFINES)) +SpecialCObjectRule(menu,$(_NOOP_),$(MISC_DEFINES)) +SpecialCObjectRule(misc,$(VTPARSE_H),$(MISC_DEFINES)) +SpecialCObjectRule(VTPrsTbl,$(VTPARSE_H),$(MISC_DEFINES)) +SpecialCObjectRule(charproc,$(VTPARSE_H),$(MISC_DEFINES)) +SpecialCObjectRule(data,$(_NOOP_),$(MISC_DEFINES)) +SpecialCObjectRule(TekPrsTbl,$(TEKPARSE_H),$(MISC_DEFINES)) +SpecialCObjectRule(TekProc,$(TEKPARSE_H),$(MISC_DEFINES)) +SpecialCObjectRule(trace,$(VTPARSE_C) $(TEKPARSE_C),$(MISC_DEFINES)) + +#if InstallXtermSetUID +SetUIDProgramTarget(xterm,$(OBJS1),$(DEPLIBS1),$(XRFLIBS) XkbClientLibs XawClientLibs,$(TERMCAPLIB) $(PTYLIB)) +#else +NormalProgramTarget(xterm,$(OBJS1),$(DEPLIBS1),$(XRFLIBS) XkbClientLibs XawClientLibs,$(TERMCAPLIB) $(UTMPLIB) $(PTYLIB)) +#endif + +#if defined(OpenBSDArchitecture) || defined(MirBSDArchitecture) +/* On OpenBSD xterm is now setgid utmp */ +INSTUIDFLAGS= -m 2555 -g utmp +#endif + +#if InstallXtermSetUID && defined(SunArchitecture) && HasSharedLibraries && (OSMajorVersion < 5) +#if AlternateUsrLibDir +#if ((OSMajorVersion == 4) && (OSMinorVersion >= 1)) +LDOVERRIDE = -L$(DESTDIR)$(USRLIBDIR) +#else +#if HasGcc +LDOVERRIDE = -static -L$(DESTDIR)$(USRLIBDIR) +#else +LDOVERRIDE = -Bstatic -L$(DESTDIR)$(USRLIBDIR) +LDRESUME = -Bdynamic +#endif +#endif +#endif +install:: + MakeDir($(DESTDIR)$(BINDIR)) + RemoveFile(ProgramTargetName(xterm.inst)) + LinkRule(ProgramTargetName(xterm.inst),$(CDEBUGFLAGS) $(CCOPTIONS) + $(EXTRA_LDOPTIONS) $(LOCAL_LDFLAGS),$(OBJS1),$(LDOVERRIDE) + $(XRFLIBS) XawClientLibs $(LDRESUME) $(LDLIBS) $(TERMCAPLIB) + $(PTYLIB)) + $(INSTALL) -c $(INSTPGMFLAGS) $(INSTSETIDFLAGS) ProgramTargetName(xterm.inst) $(DESTDIR)$(BINDIR)/ProgramTargetName(xterm) + RemoveFile(ProgramTargetName(xterm.inst)) +#else +InstallProgramWithFlags(xterm,$(BINDIR),$(INSTSETIDFLAGS)) +#endif + +InstallNamedProg(uxterm,uxterm,$(BINDIR)) + +/* + * Link with the termcap library if USE_TERMCAP is defined in resize.c + */ +#if defined(NTOArchitecture) || \ + defined(LinuxArchitecture) || \ + defined(OpenBSDArchitecture) || \ + defined(SGIArchitecture) || \ + defined(SunArchitecture) +NormalProgramTarget(resize,$(OBJS2),$(DEPLIBS2),NullParameter,NullParameter) +#else +NormalProgramTarget(resize,$(OBJS2),$(DEPLIBS2),NullParameter,$(TERMCAPLIB)) +#endif + +InstallProgramWithFlags(resize,$(BINDIR),NullParameter) + +/* + * termcap is a special name that does not install correctly with + * InstallNamedNonExec() + */ +install:: + MakeDir($(DESTDIR)$(LIBDIR)/etc) + $(INSTALL) $(INSTALLFLAGS) $(INSTDATFLAGS) termcap \ + $(DESTDIR)$(LIBDIR)/etc/xterm.termcap +InstallNamedNonExec(terminfo,xterm.terminfo,$(LIBDIR)/etc) + +InstallAppDefaults(XTerm) +InstallAppDefaults(UXTerm) +InstallAppDefaultsLong(XTerm-col,XTerm-color) +InstallManPage(xterm,$(MANDIR)) +InstallManPage(resize,$(MANDIR)) + +cleandir:: + $(RM) *parse.hin *parse.cin + +DependTarget() diff --git a/ports/xterm/xterm-359/KOI8RXTerm.ad b/ports/xterm/xterm-359/KOI8RXTerm.ad new file mode 100644 index 0000000..acc82d2 --- /dev/null +++ b/ports/xterm/xterm-359/KOI8RXTerm.ad @@ -0,0 +1,50 @@ +! $XTermId: KOI8RXTerm.ad,v 1.4 2010/03/04 01:17:49 tom Exp $ +! ----------------------------------------------------------------------------- +! this file is part of xterm +! +! Copyright 2007,2010 by Thomas E. Dickey +! +! All Rights Reserved +! +! Permission is hereby granted, free of charge, to any person obtaining a +! copy of this software and associated documentation files (the +! "Software"), to deal in the Software without restriction, including +! without limitation the rights to use, copy, modify, merge, publish, +! distribute, sublicense, and/or sell copies of the Software, and to +! permit persons to whom the Software is furnished to do so, subject to +! the following conditions: +! +! The above copyright notice and this permission notice shall be included +! in all copies or substantial portions of the Software. +! +! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +! OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +! MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +! IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +! CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +! TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +! SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +! +! Except as contained in this notice, the name(s) of the above copyright +! holders shall not be used in advertising or otherwise to promote the +! sale, use or other dealings in this Software without prior written +! authorization. +! ----------------------------------------------------------------------------- +! This is based on the UXTerm app-defaults file. +! ----------------------------------------------------------------------------- +! Use +! xterm -class KOI8RXTerm +! to set resources for KOI8-R mode with corresponding fonts. + +#include "XTerm" + +*fontMenu.Label: KOI8-R Fonts +*VT100*allowC1Printable: true + +! Use Cyrillic instead of Latin fonts. +*VT100.font: -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-koi8-r +*VT100.font2: -misc-fixed-medium-r-normal--8-80-75-75-c-50-koi8-r +*VT100.font3: -misc-fixed-medium-r-normal--14-130-75-75-c-70-koi8-r +*VT100.font4: -misc-fixed-medium-r-normal--13-120-75-75-c-80-koi8-r +*VT100.font5: -misc-fixed-medium-r-normal--18-120-100-100-c-90-koi8-r +*VT100.font6: -misc-fixed-medium-r-normal--20-200-75-75-c-100-koi8-r diff --git a/ports/xterm/xterm-359/MANIFEST b/ports/xterm/xterm-359/MANIFEST new file mode 100644 index 0000000..75d9382 --- /dev/null +++ b/ports/xterm/xterm-359/MANIFEST @@ -0,0 +1,228 @@ +MANIFEST for xterm-359, version xterm-359 +-------------------------------------------------------------------------------- +MANIFEST this file +256colres.h resource-definitions for 256-color mode +256colres.pl script to generate 256colres.h +88colres.h resource definitions for 88-color mode +88colres.pl script to generate 88colres.h +AAA_README_VMS.txt note for VMS port of 'xterm' +COPYING license for this program +INSTALL configure script: options and related install instructions +Imakefile imake template for Makefile +KOI8RXTerm.ad resources for koi8rxterm +Makefile.in configure script template for Makefile +README overview & caveats for 'xterm' +README.i18n i18n readme: +README.os390 overview for os390 (EBCDIC) port of 'xterm' +THANKS list of direct contributors +TekPrsTbl.c Tek4014 parser state tables +Tekparse.def template for generating Tekparse.h +Tekparse.h Tek4014 parser-state definitions +Tekproc.c Tek4014 parser-state functions +Tests Useful tests for xterm-developers +UXTerm.ad alternate resources for UTF-8 +VTPrsTbl.c VT100 parser state tables +VTparse.def template for generating VTparse.h +VTparse.h VT100 parser-state definitions +XTerm-col.ad color resource definitions for XTerm class +XTerm.ad resource definitions for XTerm class +aclocal.m4 configure script: custom macros +button.c mouse button and selection processing +cachedGCs.c maintain cache of GC's +charclass.c compact character-class module +charclass.h interface of charclass.c +charproc.c VT100 parser functions +charsets.c module to translate character-sets +config.guess configure script: guess the system type +config.sub configure script: validate system type +configure generated +configure.in template for generating configure script +ctlseqs.ms documentation: Xterm Control Sequences +ctlseqs.txt generated rendition of ctlseqs.ms +cursor.c VT100 low-level cursor movement +data.c global data declarations +data.h global data external-definitions +df-install.in utility script for desktop-files +doublechr.c VT100 double-size character support +error.h error-code definitions for 'xterm' +fontutils.c xterm functions for (re)loading fonts +fontutils.h interface of fontutils.c +gen-charsets.pl script to convert codepages into code +gen-pc-fkeys.pl script to generate extended function-key terminfo +graphics.c graphics support functions for 'xterm' +graphics.h interface of graphics.c +graphics_regis.c support for ReGIS +graphics_regis.h interface of graphics_regis.c +graphics_sixel.c support for Sixels +graphics_sixel.h interface of graphics_sixel.c +html.c format HTML-screendumps +input.c VT100 key-symbol and function-key translation +install-sh install-script (needed by configure) +keysym2ucs.c lookup-table for UTF-8 to keysyms +keysym2ucs.h interface of keysym2ucs.c +koi8rxterm KOI-8 wrapper from Debian (originally me) +koi8rxterm.man manpage for koi8rxterm +linedata.c manage all line-data for VT100 widget +link_axp.com build-script for VMS port of xterm +main.c main program of 'xterm' +main.h default definitions for 'xterm' +make.com build-script for VMS port of 'xterm' +menu.c popup/pulldown menus for 'xterm' +menu.h interface of menu.c +minstall.in script for installing manpages +misc.c miscellaneous utility functions for 'xterm' +plink.sh script to prune unneeded libraries from link +precompose.c table of precompose sequences +precompose.h interface of precompose.c +print.c VT100+ print support functions +ptydata.c functions to manipulate data read from pty +ptyx.h structure-definitions for 'xterm' +resize.c program to compute/modify xterm's window size +resize.man manual page for 'resize' +run-tic.sh run tic, filtering out harmless messages +screen.c VT100 screen update functions +scrollback.c manage scrollback (a big FIFO) +scrollbar.c VT100 scrollbar support functions +sinstall.sh install setuid if existing program was +svg.c format SVG-screendumps +tabs.c VT100 tabstop support-functions +termcap termcap entries for 'xterm' +terminfo terminfo entries for 'xterm' +testxmc.c testing: xmc/magic-cookies +trace.c debugging trace functions for 'xterm' +trace.h interface of trace.c +util.c miscellaneous utility functions for 'xterm' +uxterm wrapper script to make unicode-xterm +uxterm.desktop sample desktop file for uxterm +uxterm.man manpage for uxterm, from Debian +version.c xterm package version, used also in resize +version.h version of xterm +vms.c VMS version of xterm's spawn(), etc. +vms.h system headers and definitions for vms.c +wcwidth.c wide-character utility functions +wcwidth.h interface of wcwidth.c +xcharmouse.h Jason Bacon's mouse-defs, cleaned up a little +xstrings.c a few common string functions +xstrings.h interface of xstrings.c +xterm.appdata.xml sample "appdata.xml" file +xterm.dat application defaults for VMS port of 'xterm' +xterm.desktop sample desktop file for xterm. +xterm.h common includes, definitions and prototypes for 'xterm' +xterm.log.html changelog for xterm +xterm.man manual page for 'xterm' +xterm_axp.opt linker options file for VMS port of 'xterm' +xterm_io.h split-out definitions of termio/termios/sgtty and winsize from main.c, os2main.c, screen.c and resize.c +xtermcap.c termcap-related functions. +xtermcap.h interface of xtermcap.c +xtermcfg.hin configure script: template for xtermcfg.h +xutf8.c JC's cleanup of UTF8 +xutf8.h JC's cleanup of UTF8 +icons subdirectory +icons/filled-xterm.png filled-xterm variants +icons/filled-xterm.svg filled-xterm variants +icons/filled-xterm.xpms filled-xterm variants +icons/filled-xterm_16x16.xpm filled-xterm variants +icons/filled-xterm_32x32.xpm filled-xterm variants +icons/filled-xterm_48x48.xpm filled-xterm variants +icons/make-xpms script to make combined xpm-icons +icons/mini.xterm.svg svg format for mini-icon +icons/mini.xterm.xpms collection of mini-icons +icons/mini.xterm_16x16.png mini-icon 16x16 png +icons/mini.xterm_16x16.xpm mini-icon 16x16 pixmap +icons/mini.xterm_256x256.png mini-icon 256x256 png +icons/mini.xterm_32x32.png mini-icon 32x32 png +icons/mini.xterm_32x32.xpm mini-icon 32x32 pixmap +icons/mini.xterm_48x48.png mini-icon 48x48 png +icons/mini.xterm_48x48.xpm mini-icon 48x48 pixmap +icons/terminal_48x48.svg svg-format of "terminal" +icons/terminal_48x48.xpm xpm-format of "terminal" +icons/xterm-color.png xterm-color 48x48, in png-format +icons/xterm-color.svg xterm-color icon +icons/xterm-color.xpms collection of color icons +icons/xterm-color_16x16.xpm 16x16 color icon +icons/xterm-color_32x32.xpm 32x32 color icon +icons/xterm-color_48x48.xpm 48x48 color icon +icons/xterm.png xterm 48x48, in png-format +icons/xterm.svg xterm icon +icons/xterm.xpms collection of icons +icons/xterm_16x16.xpm normal icon 16x16 pixmap +icons/xterm_32x32.xpm 32x32 monochrome icon +icons/xterm_48x48.xpm 48x48 monochrome icon +package/debian subdirectory +package/debian/changelog build-script +package/debian/color.sed build-script +package/debian/compat build-script +package/debian/control build-script +package/debian/copyright build-script +package/debian/postinst post-install script for update-alternatives +package/debian/prerm pre-remove script for update-alternatives +package/debian/rules build-script +package/debian/source subdirectory +package/debian/source/format build-script +package/debian subdirectory +package/debian/watch build-script +package/debian/xterm-dev.docs build-script +package/debian/xterm-dev.lintian-overrides ignore useless warnings from lintian +package/debian/xterm-dev.menu Debian menu-file for xterm-dev package. +package/debian/xterm-xres.sed build-script +package/freebsd subdirectory +package/freebsd/Makefile build-script +package/freebsd/distinfo generated sums +package/freebsd/pkg-descr build-script +package/freebsd/pkg-message build-script +package/freebsd/pkg-message.wchar build-script +package/freebsd/pkg-plist build-script +package/pkgsrc subdirectory +package/pkgsrc/DESCR build-script +package/pkgsrc/Makefile build-script +package/pkgsrc/PLIST build-script +package/pkgsrc/distinfo build-script +package/pkgsrc/options.mk build-script +package subdirectory +package/xterm.spec build-script +tektests subdirectory +tektests/aitest.tek tek4014 demo: draw a globe +tektests/dmerc.tek tek4014 demo: draws a Mercator projection with orbit +tektests/fotest.tek tek4014 demo: draw a scatterplot on log scale +tektests/imtest.tek tek4014 demo: draw a test pattern +tektests/imtesth.tek tek4014 demo: draw a test pattern +tektests/ocpred.tek tek4014 demo: an occultation prediction +tektests/usmap.tek tek4014 demo: a US map +unicode subdirectory +unicode/README description of files in ./unicode +unicode/convmap.pl perl script for generating the lookup table for UTF-8 to keysym +unicode/keysym.map keysym mapping from UTF-8 +unicode/make-precompose.sh make precompose.c +unicode/precompose.c.head header of precompose.c +unicode/precompose.c.tail tail of precompose.c +vttests subdirectory +vttests/16colors.sh test-script to show 16-colors +vttests/256colors.pl script to illustrate 256-colors +vttests/256colors2.pl fancy test-script for 256-colors +vttests/88colors.pl sample script showing 88-colors +vttests/88colors2.pl sample script showing 88-colors +vttests/8colors.sh test-script to illustrate 8-colors +vttests/acolors.sh demonstrate changing the ANSI colors +vttests/closest-rgb.pl demo of color-distances +vttests/doublechars.sh test script to demonstrate doublesize chars +vttests/dynamic.pl demo for dynamic colors +vttests/dynamic.sh script to illustrate the dynamic colors control sequence +vttests/dynamic2.sh complete example of dynamic colors +vttests/fonts.sh script to demonstrate font-switching sequences +vttests/modify-keys.pl illustrate modifyOtherKeys with a table +vttests/mouse-codes demo script for mouse-codes +vttests/other-sgr.sh demonstrate non-VTxx SGRs +vttests/paste64.pl script to test base64-selection option +vttests/print-vt-chars.pl demo-script +vttests/query-color.pl demonstrate OSC 4 +vttests/query-dynamic.pl demonstrate OSC 10 to OSC 19 +vttests/query-fonts.pl script to demo/test font-querying +vttests/query-status.pl query DECRQSS status +vttests/query-xres.pl test/demo for DCS+Q +vttests/report-sgr.pl demonstrate report-sgr +vttests/resize.pl translated resize.sh to perl since it is easy to test, and I needed +vttests/resize.sh script to demonstrate resizing +vttests/sgrPushPop.pl demonstrate xterm SGR push/pop +vttests/sgrPushPop2.pl demonstrate xterm SGR push/pop for colors +vttests/tcapquery.pl script to test tcap-query option +vttests/title.sh test-script to show title of xterm in action diff --git a/ports/xterm/xterm-359/Makefile b/ports/xterm/xterm-359/Makefile new file mode 100644 index 0000000..172d7bf --- /dev/null +++ b/ports/xterm/xterm-359/Makefile @@ -0,0 +1,634 @@ +## $XTermId: Makefile.in,v 1.253 2020/08/02 19:12:41 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1997-2019,2020 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- + +SHELL = /bin/sh + +#### Start of system configuration section. #### + +srcdir = . + + +x = +o = .o + +CC = gcc +CPP = gcc -E +AWK = awk +LINK = $(CC) $(CFLAGS) + +CTAGS = +ETAGS = + +LN_S = ln -s +RM = rm -f +LINT = +LINT_OPTS = + +INSTALL = /bin/install -c +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_DATA = ${INSTALL} -m 644 +transform = s,x,x, + +EXTRA_CFLAGS = +EXTRA_CPPFLAGS = -DPROJECTROOT='"/usr"' -D__vendorversion__='"Version 7.7.0 X.Org"' +EXTRA_LOADFLAGS = + +CPPFLAGS = -I. -I$(srcdir) -DHAVE_CONFIG_H -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 -DDEFCLASS=\"XTerm\" $(EXTRA_CPPFLAGS) +CFLAGS = -g -O2 $(EXTRA_CFLAGS) +LDFLAGS = +LIBS = -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses + +prefix = /usr/local +exec_prefix = ${prefix} +datarootdir = ${prefix}/share +datadir = ${datarootdir} + +manext = 1 +bindir = ${exec_prefix}/bin +libdir = ${exec_prefix}/lib +mandir = ${datarootdir}/man/man$(manext) +appsdir = ${exec_prefix}/lib/X11/app-defaults +icondir = no +pixmapdir = ${datadir}/pixmaps + +#### End of system configuration section. #### + +ICON_NAME = mini.xterm +ICON_SYMLINK = NONE + +DESTDIR = +BINDIR = $(DESTDIR)$(bindir) +LIBDIR = $(DESTDIR)$(libdir) +MANDIR = $(DESTDIR)$(mandir) +APPSDIR = $(DESTDIR)$(appsdir) + +#ICONDIR = $(DESTDIR)$(icondir) +PIXMAPDIR = $(DESTDIR)$(pixmapdir) + +INSTALL_DIRS = $(BINDIR) $(APPSDIR) $(ICONDIR) $(PIXMAPDIR) $(MANDIR) + +CLASS = XTerm +EXTRAHDR = 256colres.h Tekparse.h charclass.h precompose.h wcwidth.h graphics_sixel.h graphics.h +EXTRASRC = TekPrsTbl.c Tekproc.c charclass.c precompose.c wcwidth.c html.c svg.c graphics_sixel.c graphics.c +EXTRAOBJ = TekPrsTbl.o Tekproc.o charclass.o precompose.o wcwidth.o html.o svg.o graphics_sixel.o graphics.o + +AUTO_SOURCE = \ + builtin_icons.h \ + VTparse.cin \ + Tekparse.cin \ + VTparse.hin \ + Tekparse.hin + + SRCS1 = button.c cachedGCs.c charproc.c charsets.c cursor.c \ + data.c doublechr.c fontutils.c input.c \ + linedata.c main.c menu.c misc.c \ + print.c ptydata.c scrollback.c \ + screen.c scrollbar.c tabs.c util.c version.c xstrings.c \ + xtermcap.c VTPrsTbl.c $(EXTRASRC) + OBJS1 = button$o cachedGCs$o charproc$o charsets$o cursor$o \ + data$o doublechr$o fontutils$o input$o \ + linedata$o main$o menu$o misc$o \ + print$o ptydata$o scrollback$o \ + screen$o scrollbar$o tabs$o util$o version$o xstrings$o \ + xtermcap$o VTPrsTbl$o $(EXTRAOBJ) + SRCS2 = resize.c version.c xstrings.c + OBJS2 = resize$o version$o xstrings$o + SRCS = $(SRCS1) $(SRCS2) + OBJS = $(OBJS1) $(OBJS2) + HDRS = VTparse.h data.h error.h fontutils.h main.h menu.h \ + ptyx.h version.h xstrings.h xterm.h xtermcap.h $(EXTRAHDR) + PROGRAMS = xterm$x resize$x + TEST_PROGRAMS = test_charclass$x test_ptydata$x test_wcwidth$x + +all : $(PROGRAMS) +################################################################################ +.SUFFIXES : .i .def .cin .hin .$(manext) .ms .man .txt .html .ps .pdf + +.c$o : + + $(CC) $(CPPFLAGS) $(CFLAGS) -c $(srcdir)/$*.c + +.c.i : + + $(CPP) -C $(CPPFLAGS) $*.c >$@ + +.def.cin : + @echo "making $@ from $<" + @$(AWK) 'BEGIN{printf "/* vile:cmode */\n";}/^CASE_/{printf "{ %d, \"%s\" },\n", n++, $$1; }' < $< >$@ + +.def.hin : + @echo "making $@ from $<" + @$(AWK) 'BEGIN{printf "/* vile:cmode */\n";}/^CASE_/{printf "#define %s %d\n", $$1, n++}' < $< >$@ + +.man.$(manext) : + $(SHELL) ./minstall "$(INSTALL_DATA)" $< $@ $(appsdir) $(CLASS) $* $* $(pixmapdir) + +#.$(manext).txt : +# $(SHELL) -c "tbl $*.$(manext) | nroff -man | col -bx" >$@ +# +#.ms.txt : +# $(SHELL) -c "tbl $*.$(manext) | nroff -ms | col -bx" >$@ +# + +.$(manext).html : + ./man2html.tmp $* $(manext) man >$@ + +.$(manext).ps : + $(SHELL) -c "tbl $*.$(manext) | groff -man" >$@ + +.$(manext).txt : + GROFF_NO_SGR=stupid $(SHELL) -c "tbl $*.$(manext) | groff -Tascii -man | col -bx" >$@ + +.ms.html : + ./man2html.tmp $* ms ms >$@ + +.ms.ps : + $(SHELL) -c "tbl $< | groff -ms" >$@ + +.ms.txt : + GROFF_NO_SGR=stupid $(SHELL) -c "tbl $< | groff -Tascii -ms | col -bx" >$@ + +.ps.pdf : + ps2pdf $*.ps +################################################################################ + +VTPARSE_H = VTparse.h VTparse.hin +TEKPARSE_H = Tekparse.h Tekparse.hin + +main$o : main.h +misc$o : version.h + +$(OBJS1) : xterm.h ptyx.h xtermcfg.h +main$o resize$o screen$o : xterm_io.h + +xterm$x : $(OBJS1) + $(SHELL) $(srcdir)/plink.sh $(LINK) $(LDFLAGS) -o $@ $(OBJS1) $(LIBS) $(EXTRA_LOADFLAGS) + +resize$x : $(OBJS2) + $(SHELL) $(srcdir)/plink.sh $(LINK) $(LDFLAGS) -o $@ $(OBJS2) $(LIBS) + +256colres.h : + -$(RM) $@ + perl $(srcdir)/256colres.pl > $@ + +88colres.h : + -$(RM) $@ + perl $(srcdir)/88colres.pl > $@ + +charproc$o : $(VTPARSE_H) main.h 256colres.h +graphics_regis$o : $(VTPARSE_H) +graphics_sixel$o : $(VTPARSE_H) +misc$o : $(VTPARSE_H) +VTPrsTbl$o : $(VTPARSE_H) + +TekPrsTbl$o : $(TEKPARSE_H) +Tekproc$o : $(TEKPARSE_H) + +misc$o : builtin_icons.h + +trace$o : VTparse.cin Tekparse.cin + +# do this to quiet gcc -Wcast-qual warnings +builtin_icons.h : + @echo "#if OPT_BUILTIN_XPMS" >$@ + @echo "#include " >>$@ + @echo "#include " >>$@ + @echo "#include " >>$@ + @echo "#include " >>$@ + @echo "#else" >>$@ + @sed -e 's/static char \* /static const char * /' $(srcdir)/icons/mini.xterm_48x48.xpm >>$@ + @echo "#endif" >>$@ + @echo "made $@" + +################################################################################ +test_charclass$x : $(srcdir)/charclass.c + $(SHELL) $(srcdir)/plink.sh $(CC) -o $@ $(CFLAGS) $(CPPFLAGS) -DTEST_DRIVER $(srcdir)/charclass.c $(LDFLAGS) $(LIBS) + +################################################################################ +test_ptydata$x : $(srcdir)/ptydata.c + $(SHELL) $(srcdir)/plink.sh $(CC) -o $@ $(CFLAGS) $(CPPFLAGS) -DTEST_DRIVER $(srcdir)/ptydata.c $(LDFLAGS) $(LIBS) + +################################################################################ +test_wcwidth$x : $(srcdir)/wcwidth.c + $(SHELL) $(srcdir)/plink.sh $(CC) -o $@ $(CFLAGS) $(CPPFLAGS) -DTEST_DRIVER $(srcdir)/wcwidth.c $(LDFLAGS) $(LIBS) + +################################################################################ +actual_xterm = `echo xterm| sed '$(transform)'` +actual_resize = `echo resize| sed '$(transform)'` +actual_uxterm = `echo uxterm| sed '$(transform)'` +actual_k8term = `echo koi8rxterm| sed '$(transform)'` + +binary_xterm = $(actual_xterm)$x +binary_resize = $(actual_resize)$x +binary_uxterm = $(actual_uxterm) +binary_k8term = $(actual_k8term) + +install \ +install-bin \ +install-full :: xterm$x resize$x $(BINDIR) + $(SHELL) $(srcdir)/sinstall.sh "$(INSTALL_PROGRAM)" xterm$x /bin/xterm $(BINDIR)/$(binary_xterm) +# $(INSTALL_PROGRAM) xterm$x $(BINDIR)/$(binary_xterm) + $(INSTALL_PROGRAM) -m 755 resize$x $(BINDIR)/$(binary_resize) + +EDIT_SCRIPT = sed -e s,=xterm,=\$$name, -e s,XTerm,$(CLASS), + +InstallLink = \ + if test NONE != NONE \ + && test \$$source != NONE \ + && test \$$source != \$$target ; then \ + cd \$$TARGET && ( \ + $(RM) \$$source ; \ + $(LN_S) \$$target \$$source ; \ + echo \"... created symbolic link:\" ; \ + ls -l \$$target \$$source ) ; \ + fi + +InstallBinLink = TARGET=$(BINDIR); $(InstallLink) +InstallManLink = TARGET=$(MANDIR); $(InstallLink) + +InstallScript = \ + echo \"... installing $(BINDIR)/\$$target\"; \ + name=$(binary_xterm); \ + $(EDIT_SCRIPT) $(srcdir)/\$$source >\$$source.tmp; \ + $(INSTALL_SCRIPT) -m 755 \$$source.tmp $(BINDIR)/\$$target; \ + $(RM) \$$source.tmp + +install \ +install-bin \ +install-scripts \ +install-full :: $(BINDIR) + @$(SHELL) -c "source=\"NONE\"; \ + target=\"$(binary_xterm)\"; \ + $(InstallBinLink)" + @$(SHELL) -c "source=\"resize\"; \ + target=\"$(binary_resize)\"; \ + $(InstallBinLink)" + @$(SHELL) -c "source=\"uxterm\"; \ + target=\"$(binary_uxterm)\"; \ + $(InstallScript); \ + $(InstallBinLink)" + @$(SHELL) -c "source=\"koi8rxterm\"; \ + target=\"$(binary_k8term)\"; \ + $(InstallScript); \ + $(InstallBinLink)" + +install \ +install-man \ +install-full :: $(MANDIR) + @-$(SHELL) -c "for source in xterm resize uxterm koi8rxterm ; \ + do \ + target=\`echo \"\$$source\" | sed 's,x,x,'\`; \ + $(SHELL) ./minstall \"$(INSTALL_DATA)\" \ + $(srcdir)/\$$source.man \ + $(MANDIR)/\$$target.$(manext) \ + $(appsdir) \ + $(CLASS) \ + \$$source \ + \$$target \ + $(pixmapdir); \ + done" + @-$(SHELL) -c "if test NONE != NONE ; then \ + source=$(actual_xterm).$(manext); \ + target=NONE.$(manext); \ + cd $(MANDIR) && ( \ + $(RM) \$$target ; \ + $(LN_S) \$$source \$$target ; \ + echo '... created symbolic link:' ; \ + ls -l \$$source \$$target ; \ + ) \ + fi" + +APP_NAMES = XTerm UXTerm KOI8RXTerm + +install \ +install-app \ +install-full :: $(APPSDIR) + @-$(SHELL) -c 'for s in $(APP_NAMES); \ + do \ + echo "** $$s"; \ + d=`echo $$s | sed -e s/XTerm/$(CLASS)/`; \ + echo installing $(APPSDIR)/$$d; \ + sed -e s/XTerm/$(CLASS)/ $(srcdir)/$$s.ad >XTerm.tmp; \ + $(INSTALL_DATA) XTerm.tmp $(APPSDIR)/$$d; \ + echo installing $(APPSDIR)/$$d-color; \ + sed -e s/XTerm/$$d/ $(srcdir)/XTerm-col.ad >XTerm.tmp; \ + $(INSTALL_DATA) XTerm.tmp $(APPSDIR)/$$d-color; \ + done' + @$(RM) XTerm.tmp +# @echo "... installed app-defaults" + +#ICON_LIST = icons/mini.xterm_48x48.png icons/mini.xterm_48x48.xpm +#ICON_THEME = no +#install \ +#install-icon \ +#install-full :: $(ICONDIR) +# ACTUAL_XTERM=$(actual_xterm) $(SHELL) -c '\ +# h=$(ICONDIR)/$(ICON_THEME); \ +# for n in $(ICON_LIST); \ +# do \ +# x=$$ACTUAL_XTERM; \ +# l=`echo "$$n" | cut -f1 -d:`; \ +# r=`echo "$$n" | cut -f2 -d: |sed -e "s,xterm,$$ACTUAL_XTERM,"`; \ +# test -z "$$r" && continue; \ +# d=$$h/`echo "$$r" | sed -e "s,/[^/]*$$,,"`; \ +# test -d "$$d" || mkdir -p "$$d"; \ +# echo "installing icon $$h/$$r"; \ +# $(INSTALL_DATA) $$l $$h/$$r; \ +# s=`echo "$$r" | sed -e '"'s,^.*\.,.,'"'`; \ +# t=$(ICON_SYMLINK)$$s; \ +# b=`basename $$n $$s | sed -e "s,_[1-9][0-9]*x.*,,"`; \ +# if test "$(ICON_SYMLINK)" != NONE ; then \ +# if test "$$r" != "$$t" ; then \ +# if test "x$$b" = "x$(ICON_NAME)" ; then \ +# echo "linking $$r -> $$t"; \ +# ( cd $$h; $(RM) $$t; $(LN_S) $$r $$t; ) \ +# fi \ +# fi \ +# fi \ +# done' +# @echo "... installed icons" + +install \ +install-icon \ +install-full :: $(PIXMAPDIR) + ACTUAL_XTERM=$(actual_xterm) $(SHELL) -c '\ + h=$(PIXMAPDIR); \ + for n in $(srcdir)/icons/*xterm*_32x32.xpm $(srcdir)/icons/*xterm*_48x48.xpm; \ + do \ + l=`basename $$n`; \ + r=`echo "$$l" | sed -e "s,xterm,$$ACTUAL_XTERM,"`; \ + echo "installing pixmap $$h/$$r"; \ + $(INSTALL_DATA) $(srcdir)/icons/$$l $$h/$$r; \ + s=`echo "$$r" | sed -e '"'s,^.*\.,.,'"'`; \ + t=$(ICON_SYMLINK)$$s; \ + b=`basename $$n $$s | sed -e "s,_[1-9][0-9]*x.*,,"`; \ + if test "$(ICON_SYMLINK)" != NONE ; then \ + if test "x$$r" != "$$t" ; then \ + if test "x$$b" = "x$(ICON_NAME)" ; then \ + echo "linking $$r -> $$t"; \ + ( cd $$h; $(RM) $$t; $(LN_S) $$r $$t; ) \ + fi \ + fi \ + fi \ + done' + @echo "... installed icons" + +install :: + @echo 'Completed installation of executables and documentation.' + @echo 'Use "make install-ti" to install terminfo description.' + +TERMINFO_DIR = $(DESTDIR)/usr/lib/terminfo +SET_TERMINFO = TERMINFO=$(TERMINFO_DIR) + +install-full \ +install-ti :: $(TERMINFO_DIR) + @$(SHELL) -c "$(SET_TERMINFO) $(srcdir)/run-tic.sh $(srcdir)/terminfo" + @echo 'Completed installation of terminfo description.' + +install-full \ +install-tc :: + @-$(SHELL) -c "if test -f /etc/termcap ; then echo 'You must install the termcap entry manually by editing /etc/termcap'; fi" + +installdirs : $(INSTALL_DIRS) +################################################################################ + +UninstallLink = \ + if test NONE != NONE \ + && test \$$source != NONE \ + && test \$$source != \$$target \ + && test -h \$$TARGET/\$$source ; then \ + echo \"... removing \$$TARGET/\$$source\"; \ + cd \$$TARGET && \ + $(RM) \$$source; \ + fi + +UninstallBinLink = TARGET=$(BINDIR); $(UninstallLink) +UninstallManLink = TARGET=$(MANDIR); $(UninstallLink) + +UninstallBinary = \ + echo \"... removing $(BINDIR)/\$$target\"; \ + $(RM) $(BINDIR)/\$$target + +uninstall \ +uninstall-bin \ +uninstall-full :: + @-$(SHELL) -c "source=\"NONE\"; \ + target=\"$(binary_xterm)\"; \ + $(UninstallBinLink); \ + $(UninstallBinary)" + @-$(SHELL) -c "source=\"resize\"; \ + target=\"$(binary_resize)\"; \ + $(UninstallBinLink); \ + $(UninstallBinary)" + +uninstall \ +uninstall-bin \ +uninstall-scripts \ +uninstall-full :: + @-$(SHELL) -c "source=\"uxterm\"; \ + target=\"$(binary_uxterm)\"; \ + $(UninstallBinLink); \ + $(UninstallBinary)" + @-$(SHELL) -c "source=\"koi8rxterm\"; \ + target=\"$(binary_k8term)\"; \ + $(UninstallBinLink); \ + $(UninstallBinary)" + +uninstall \ +uninstall-man \ +uninstall-full :: + @-$(SHELL) -c "\ + source=NONE.$(manext); \ + target=$(actual_xterm).$(manext); \ + $(UninstallManLink)" + @-$(SHELL) -c "for source in \ + $(actual_xterm).$(manext) \ + $(actual_resize).$(manext) \ + $(actual_uxterm).$(manext) \ + $(actual_k8term).$(manext); \ + do \ + echo \"... removing $(MANDIR)/\$$source\"; \ + $(RM) $(MANDIR)/\$$source; \ + done" + +uninstall \ +uninstall-app \ +uninstall-full :: + -$(SHELL) -c 'for s in $(APP_NAMES); \ + do \ + echo "** $$s"; \ + d=`echo $$s | sed -e s/XTerm/$(CLASS)/`; \ + echo uninstalling $(APPSDIR)/$$d; \ + $(RM) $(APPSDIR)/$$d; \ + echo uninstalling $(APPSDIR)/$$d-color; \ + $(RM) $(APPSDIR)/$$d-color; \ + done' + +#uninstall \ +#uninstall-icon \ +#uninstall-full :: +# -$(SHELL) -c 'ACTUAL_XTERM=$(actual_xterm) ; \ +# for n in $(ICON_LIST); \ +# do \ +# r=`echo "$$n" | sed -e s,\^.\*:,, -e s,xterm,$$ACTUAL_XTERM,`; \ +# test -z "$$r" && continue; \ +# h=$(ICONDIR)/$(ICON_THEME); \ +# test -f $$h/$$r || continue; \ +# echo removing $$h/$$r; \ +# $(RM) $$h/$$r; \ +# done' +# @echo "... removed icons" + +uninstall \ +uninstall-icon \ +uninstall-full :: + -@$(SHELL) -c 'ACTUAL_XTERM=$(actual_xterm) ; \ + for n in $(srcdir)/icons/*xterm*_32x32.xpm $(srcdir)/icons/*xterm*_48x48.xpm; \ + do \ + l=`basename $$n`; \ + r=`echo "$$l" | sed -e "s,xterm,$$ACTUAL_XTERM,"`; \ + echo removing $(PIXMAPDIR)/$$r; \ + $(RM) $(PIXMAPDIR)/$$r; \ + done' + @echo "... removed icons" +################################################################################ +# Desktop-utils does not provide an uninstall, and is not uniformly available. +#DESKTOP_FILES = $(srcdir)/xterm.desktop $(srcdir)/uxterm.desktop +#DESKTOP_FLAGS = +#install-desktop \ +#install-full :: +# ACTUAL_XTERM=$(actual_xterm) \ +# $(SHELL) -c 'for n in $(DESKTOP_FILES); \ +# do $(SHELL) df-install $$ACTUAL_XTERM $(ICON_NAME) DESTDIR="$(DESTDIR)" $(DESKTOP_FLAGS) $$n; \ +# done' +################################################################################ +check : $(TEST_PROGRAMS) + @ echo "See demos in vttests/* (use vttest for system-level testing)" + @ $(SHELL) -c 'echo "** executing test_charclass"; \ + ./test_charclass' + @ $(SHELL) -c 'echo "** executing test_wcwidth"; \ + for range in 32-126 160-0xff00 0x10000-0x11000; \ + do echo ".. range $$range"; \ + ./test_wcwidth -s $$range; \ + ./test_wcwidth -s $$range -w; \ + done' +################################################################################ +mostlyclean : + -$(RM) *$o *.[is] XTerm[1-9]*.* Xterm.log.* XtermLog.* .pure core *~ *.bak *.BAK *.out *.tmp + +clean : mostlyclean + -$(RM) $(PROGRAMS) $(TEST_PROGRAMS) $(AUTO_SOURCE) + +sources : $(AUTO_SOURCE) + +distclean :: clean + -$(RM) Makefile config.status config.cache config.log xtermcfg.h + -$(RM) df-install minstall + +distclean \ +docs-clean :: + -$(RM) *.ps *.pdf *.png + -$(SHELL) -c 'for p in xterm resize uxterm koi8rxterm; \ + do \ + $(RM) $$p.html $$p.$(manext) $$p.txt; \ + done' + -$(RM) ctlseqs.html ctlseqs.$(manext) + +distclean :: + -$(RM) man2html.tmp + +realclean : distclean + -$(RM) tags TAGS + +maintainer-clean : realclean + -$(RM) 256colres.h 88colres.h +################################################################################ +terminfo.out : terminfo ; tic -a -I -1 terminfo >$@ +termcap.out : termcap ; tic -a -C -U termcap >$@ +################################################################################ +docs-ctlseqs \ +docs :: $(srcdir)/ctlseqs.txt ctlseqs.html ctlseqs.pdf ctlseqs.ps + +ctlseqs.html : $(srcdir)/ctlseqs.ms +ctlseqs.pdf : ctlseqs.ps +ctlseqs.ps : $(srcdir)/ctlseqs.ms +ctlseqs.txt : $(srcdir)/ctlseqs.ms +################################################################################ +docs-resize \ +docs :: resize.txt resize.html resize.pdf resize.ps +resize.html : resize.$(manext) +resize.pdf : resize.ps +resize.ps : resize.$(manext) +resize.txt : resize.$(manext) +################################################################################ +docs-xterm \ +docs :: xterm.txt xterm.html xterm.pdf xterm.ps +xterm.html : xterm.$(manext) +xterm.pdf : xterm.ps +xterm.ps : xterm.$(manext) +xterm.txt : xterm.$(manext) +################################################################################ +docs-uxterm \ +docs :: uxterm.txt uxterm.html uxterm.pdf uxterm.ps +uxterm.html : uxterm.$(manext) +uxterm.pdf : uxterm.ps +uxterm.ps : uxterm.$(manext) +uxterm.txt : uxterm.$(manext) +################################################################################ +docs-koi8rxterm \ +docs :: koi8rxterm.txt koi8rxterm.html koi8rxterm.pdf koi8rxterm.ps +koi8rxterm.html : koi8rxterm.$(manext) +koi8rxterm.pdf : koi8rxterm.ps +koi8rxterm.ps : koi8rxterm.$(manext) +koi8rxterm.txt : koi8rxterm.$(manext) +################################################################################ +lint : + $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(SRCS1) + $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(SRCS2) + +tags : + $(CTAGS) $(SRCS) $(HDRS) + +TAGS : + $(ETAGS) $(SRCS) $(HDRS) + +$(TERMINFO_DIR) $(INSTALL_DIRS) : + mkdir -p $@ + +ALWAYS : + +depend : $(TABLES) + makedepend -- $(CPPFLAGS) -- $(SRCS) + +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/ports/xterm/xterm-359/Makefile.in b/ports/xterm/xterm-359/Makefile.in new file mode 100644 index 0000000..faef657 --- /dev/null +++ b/ports/xterm/xterm-359/Makefile.in @@ -0,0 +1,634 @@ +## $XTermId: Makefile.in,v 1.253 2020/08/02 19:12:41 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1997-2019,2020 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- + +SHELL = /bin/sh + +#### Start of system configuration section. #### + +srcdir = @srcdir@ +VPATH = @srcdir@ + +x = @EXEEXT@ +o = .@OBJEXT@ + +CC = @CC@ +CPP = @CPP@ +AWK = @AWK@ +LINK = $(CC) $(CFLAGS) + +CTAGS = @CTAGS@ +ETAGS = @ETAGS@ + +LN_S = @LN_S@ +RM = rm -f +LINT = @LINT@ +LINT_OPTS = @LINT_OPTS@ + +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_DATA = @INSTALL_DATA@ +transform = @program_transform_name@ + +EXTRA_CFLAGS = @EXTRA_CFLAGS@ +EXTRA_CPPFLAGS = @EXTRA_CPPFLAGS@ +EXTRA_LOADFLAGS = @IMAKE_LOADFLAGS@ + +CPPFLAGS = -I. -I$(srcdir) -DHAVE_CONFIG_H @CPPFLAGS@ -DDEFCLASS=\"@APP_CLASS@\" $(EXTRA_CPPFLAGS) +CFLAGS = @CFLAGS@ $(EXTRA_CFLAGS) +LDFLAGS = @LDFLAGS@ @EXTRA_LDFLAGS@ +LIBS = @LIBS@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datarootdir = @datarootdir@ +datadir = @datadir@ + +manext = 1 +bindir = @bindir@ +libdir = @libdir@ +mandir = @mandir@/man$(manext) +appsdir = @APPSDIR@ +icondir = @ICONDIR@ +pixmapdir = @PIXMAPDIR@ + +#### End of system configuration section. #### + +ICON_NAME = @ICON_NAME@ +ICON_SYMLINK = @ICON_SYMLINK@ + +DESTDIR = +BINDIR = $(DESTDIR)$(bindir) +LIBDIR = $(DESTDIR)$(libdir) +MANDIR = $(DESTDIR)$(mandir) +APPSDIR = $(DESTDIR)$(appsdir) + +@no_icondir@ICONDIR = $(DESTDIR)$(icondir) +@no_pixmapdir@PIXMAPDIR = $(DESTDIR)$(pixmapdir) + +INSTALL_DIRS = $(BINDIR) $(APPSDIR) $(ICONDIR) $(PIXMAPDIR) $(MANDIR) + +CLASS = @APP_CLASS@ +EXTRAHDR = @EXTRAHDRS@ +EXTRASRC = @EXTRASRCS@ +EXTRAOBJ = @EXTRAOBJS@ + +AUTO_SOURCE = \ + builtin_icons.h \ + VTparse.cin \ + Tekparse.cin \ + VTparse.hin \ + Tekparse.hin + + SRCS1 = button.c cachedGCs.c charproc.c charsets.c cursor.c \ + data.c doublechr.c fontutils.c input.c \ + linedata.c main.c menu.c misc.c \ + print.c ptydata.c scrollback.c \ + screen.c scrollbar.c tabs.c util.c version.c xstrings.c \ + xtermcap.c VTPrsTbl.c $(EXTRASRC) + OBJS1 = button$o cachedGCs$o charproc$o charsets$o cursor$o \ + data$o doublechr$o fontutils$o input$o \ + linedata$o main$o menu$o misc$o \ + print$o ptydata$o scrollback$o \ + screen$o scrollbar$o tabs$o util$o version$o xstrings$o \ + xtermcap$o VTPrsTbl$o $(EXTRAOBJ) + SRCS2 = resize.c version.c xstrings.c + OBJS2 = resize$o version$o xstrings$o + SRCS = $(SRCS1) $(SRCS2) + OBJS = $(OBJS1) $(OBJS2) + HDRS = VTparse.h data.h error.h fontutils.h main.h menu.h \ + ptyx.h version.h xstrings.h xterm.h xtermcap.h $(EXTRAHDR) + PROGRAMS = xterm$x resize$x + TEST_PROGRAMS = test_charclass$x test_ptydata$x test_wcwidth$x + +all : $(PROGRAMS) +################################################################################ +.SUFFIXES : .i .def .cin .hin .$(manext) .ms .man .txt @MAN2HTML_NOTE@ .html @GROFF_NOTE@ .ps .pdf + +.c$o : + @RULE_CC@ + @ECHO_CC@$(CC) $(CPPFLAGS) $(CFLAGS) -c $(srcdir)/$*.c + +.c.i : + @RULE_CC@ + @ECHO_CC@$(CPP) -C $(CPPFLAGS) $*.c >$@ + +.def.cin : + @echo "making $@ from $<" + @$(AWK) 'BEGIN{printf "/* vile:cmode */\n";}/^CASE_/{printf "{ %d, \"%s\" },\n", n++, $$1; }' < $< >$@ + +.def.hin : + @echo "making $@ from $<" + @$(AWK) 'BEGIN{printf "/* vile:cmode */\n";}/^CASE_/{printf "#define %s %d\n", $$1, n++}' < $< >$@ + +.man.$(manext) : + $(SHELL) ./minstall "$(INSTALL_DATA)" $< $@ $(appsdir) $(CLASS) $* $* $(pixmapdir) + +@NROFF_NOTE@.$(manext).txt : +@NROFF_NOTE@ $(SHELL) -c "tbl $*.$(manext) | nroff -man | col -bx" >$@ +@NROFF_NOTE@ +@NROFF_NOTE@.ms.txt : +@NROFF_NOTE@ $(SHELL) -c "tbl $*.$(manext) | nroff -ms | col -bx" >$@ +@NROFF_NOTE@ + +@MAN2HTML_NOTE@.$(manext).html : +@MAN2HTML_NOTE@ ./@MAN2HTML_TEMP@ $* $(manext) man >$@ +@MAN2HTML_NOTE@ +@GROFF_NOTE@.$(manext).ps : +@GROFF_NOTE@ $(SHELL) -c "tbl $*.$(manext) | groff -man" >$@ +@GROFF_NOTE@ +@GROFF_NOTE@.$(manext).txt : +@GROFF_NOTE@ GROFF_NO_SGR=stupid $(SHELL) -c "tbl $*.$(manext) | groff -Tascii -man | col -bx" >$@ +@GROFF_NOTE@ +@MAN2HTML_NOTE@.ms.html : +@MAN2HTML_NOTE@ ./@MAN2HTML_TEMP@ $* ms ms >$@ +@MAN2HTML_NOTE@ +@GROFF_NOTE@.ms.ps : +@GROFF_NOTE@ $(SHELL) -c "tbl $< | groff -ms" >$@ +@GROFF_NOTE@ +@GROFF_NOTE@.ms.txt : +@GROFF_NOTE@ GROFF_NO_SGR=stupid $(SHELL) -c "tbl $< | groff -Tascii -ms | col -bx" >$@ +@GROFF_NOTE@ +@GROFF_NOTE@.ps.pdf : +@GROFF_NOTE@ ps2pdf $*.ps +################################################################################ + +VTPARSE_H = VTparse.h VTparse.hin +TEKPARSE_H = Tekparse.h Tekparse.hin + +main$o : main.h +misc$o : version.h + +$(OBJS1) : xterm.h ptyx.h xtermcfg.h +main$o resize$o screen$o : xterm_io.h + +xterm$x : $(OBJS1) + @ECHO_LD@$(SHELL) $(srcdir)/plink.sh $(LINK) $(LDFLAGS) -o $@ $(OBJS1) $(LIBS) $(EXTRA_LOADFLAGS) + +resize$x : $(OBJS2) + @ECHO_LD@$(SHELL) $(srcdir)/plink.sh $(LINK) $(LDFLAGS) -o $@ $(OBJS2) $(LIBS) + +256colres.h : + -$(RM) $@ + perl $(srcdir)/256colres.pl > $@ + +88colres.h : + -$(RM) $@ + perl $(srcdir)/88colres.pl > $@ + +charproc$o : $(VTPARSE_H) main.h @CHARPROC_DEPS@ +graphics_regis$o : $(VTPARSE_H) +graphics_sixel$o : $(VTPARSE_H) +misc$o : $(VTPARSE_H) +VTPrsTbl$o : $(VTPARSE_H) + +TekPrsTbl$o : $(TEKPARSE_H) +Tekproc$o : $(TEKPARSE_H) + +misc$o : builtin_icons.h + +trace$o : VTparse.cin Tekparse.cin + +# do this to quiet gcc -Wcast-qual warnings +builtin_icons.h : + @echo "#if OPT_BUILTIN_XPMS" >$@ + @echo "#include " >>$@ + @echo "#include " >>$@ + @echo "#include " >>$@ + @echo "#include " >>$@ + @echo "#else" >>$@ + @sed -e 's/static char \* /static const char * /' $(srcdir)/icons/mini.xterm_48x48.xpm >>$@ + @echo "#endif" >>$@ + @echo "made $@" + +################################################################################ +test_charclass$x : $(srcdir)/charclass.c + @ECHO_LD@$(SHELL) $(srcdir)/plink.sh $(CC) -o $@ $(CFLAGS) $(CPPFLAGS) -DTEST_DRIVER $(srcdir)/charclass.c $(LDFLAGS) $(LIBS) + +################################################################################ +test_ptydata$x : $(srcdir)/ptydata.c + @ECHO_LD@$(SHELL) $(srcdir)/plink.sh $(CC) -o $@ $(CFLAGS) $(CPPFLAGS) -DTEST_DRIVER $(srcdir)/ptydata.c $(LDFLAGS) $(LIBS) + +################################################################################ +test_wcwidth$x : $(srcdir)/wcwidth.c + @ECHO_LD@$(SHELL) $(srcdir)/plink.sh $(CC) -o $@ $(CFLAGS) $(CPPFLAGS) -DTEST_DRIVER $(srcdir)/wcwidth.c $(LDFLAGS) $(LIBS) + +################################################################################ +actual_xterm = `echo xterm| sed '$(transform)'` +actual_resize = `echo resize| sed '$(transform)'` +actual_uxterm = `echo uxterm| sed '$(transform)'` +actual_k8term = `echo koi8rxterm| sed '$(transform)'` + +binary_xterm = $(actual_xterm)$x +binary_resize = $(actual_resize)$x +binary_uxterm = $(actual_uxterm) +binary_k8term = $(actual_k8term) + +install \ +install-bin \ +install-full :: xterm$x resize$x $(BINDIR) +@MAY_SETUID@ $(SHELL) $(srcdir)/sinstall.sh @SINSTALL_OPTS@ "$(INSTALL_PROGRAM)" xterm$x @XTERM_PATH@ $(BINDIR)/$(binary_xterm) +@NOT_SETUID@ $(INSTALL_PROGRAM) xterm$x $(BINDIR)/$(binary_xterm) + $(INSTALL_PROGRAM) -m 755 resize$x $(BINDIR)/$(binary_resize) + +EDIT_SCRIPT = sed -e s,=xterm,=\$$name, -e s,XTerm,$(CLASS), + +InstallLink = \ + if test @XTERM_SYMLINK@ != NONE \ + && test \$$source != NONE \ + && test \$$source != \$$target ; then \ + cd \$$TARGET && ( \ + $(RM) \$$source ; \ + $(LN_S) \$$target \$$source ; \ + echo \"... created symbolic link:\" ; \ + ls -l \$$target \$$source ) ; \ + fi + +InstallBinLink = TARGET=$(BINDIR); $(InstallLink) +InstallManLink = TARGET=$(MANDIR); $(InstallLink) + +InstallScript = \ + echo \"... installing $(BINDIR)/\$$target\"; \ + name=$(binary_xterm); \ + $(EDIT_SCRIPT) $(srcdir)/\$$source >\$$source.tmp; \ + $(INSTALL_SCRIPT) -m 755 \$$source.tmp $(BINDIR)/\$$target; \ + $(RM) \$$source.tmp + +install \ +install-bin \ +install-scripts \ +install-full :: $(BINDIR) + @$(SHELL) -c "source=\"@XTERM_SYMLINK@\"; \ + target=\"$(binary_xterm)\"; \ + $(InstallBinLink)" + @$(SHELL) -c "source=\"resize\"; \ + target=\"$(binary_resize)\"; \ + $(InstallBinLink)" + @$(SHELL) -c "source=\"uxterm\"; \ + target=\"$(binary_uxterm)\"; \ + $(InstallScript); \ + $(InstallBinLink)" + @$(SHELL) -c "source=\"koi8rxterm\"; \ + target=\"$(binary_k8term)\"; \ + $(InstallScript); \ + $(InstallBinLink)" + +install \ +install-man \ +install-full :: $(MANDIR) + @-$(SHELL) -c "for source in xterm resize uxterm koi8rxterm ; \ + do \ + target=\`echo \"\$$source\" | sed '@program_transform_name@'\`; \ + $(SHELL) ./minstall \"$(INSTALL_DATA)\" \ + $(srcdir)/\$$source.man \ + $(MANDIR)/\$$target.$(manext) \ + $(appsdir) \ + $(CLASS) \ + \$$source \ + \$$target \ + $(pixmapdir); \ + done" + @-$(SHELL) -c "if test @XTERM_SYMLINK@ != NONE ; then \ + source=$(actual_xterm).$(manext); \ + target=@XTERM_SYMLINK@.$(manext); \ + cd $(MANDIR) && ( \ + $(RM) \$$target ; \ + $(LN_S) \$$source \$$target ; \ + echo '... created symbolic link:' ; \ + ls -l \$$source \$$target ; \ + ) \ + fi" + +APP_NAMES = XTerm UXTerm KOI8RXTerm + +@no_appsdir@install \ +@no_appsdir@install-app \ +@no_appsdir@install-full :: $(APPSDIR) +@no_appsdir@ @-$(SHELL) -c 'for s in $(APP_NAMES); \ +@no_appsdir@ do \ +@no_appsdir@ echo "** $$s"; \ +@no_appsdir@ d=`echo $$s | sed -e s/XTerm/$(CLASS)/`; \ +@no_appsdir@ echo installing $(APPSDIR)/$$d; \ +@no_appsdir@ sed -e s/XTerm/$(CLASS)/ $(srcdir)/$$s.ad >XTerm.tmp; \ +@no_appsdir@ $(INSTALL_DATA) XTerm.tmp $(APPSDIR)/$$d; \ +@no_appsdir@ echo installing $(APPSDIR)/$$d-color; \ +@no_appsdir@ sed -e s/XTerm/$$d/ $(srcdir)/XTerm-col.ad >XTerm.tmp; \ +@no_appsdir@ $(INSTALL_DATA) XTerm.tmp $(APPSDIR)/$$d-color; \ +@no_appsdir@ done' +@no_appsdir@ @$(RM) XTerm.tmp +@no_icondir@ @echo "... installed app-defaults" + +@no_icondir@ICON_LIST = @ICON_LIST@ +@no_icondir@ICON_THEME = @ICON_THEME@ +@no_icondir@install \ +@no_icondir@install-icon \ +@no_icondir@install-full :: $(ICONDIR) +@no_icondir@ @ECHO_CC@ACTUAL_XTERM=$(actual_xterm) $(SHELL) -c '\ +@no_icondir@ h=$(ICONDIR)/$(ICON_THEME); \ +@no_icondir@ for n in $(ICON_LIST); \ +@no_icondir@ do \ +@no_icondir@ x=$$ACTUAL_XTERM; \ +@no_icondir@ l=`echo "$$n" | cut -f1 -d:`; \ +@no_icondir@ r=`echo "$$n" | cut -f2 -d: |sed -e "s,xterm,$$ACTUAL_XTERM,"`; \ +@no_icondir@ test -z "$$r" && continue; \ +@no_icondir@ d=$$h/`echo "$$r" | sed -e "s,/[^/]*$$,,"`; \ +@no_icondir@ test -d "$$d" || mkdir -p "$$d"; \ +@no_icondir@ echo "installing icon $$h/$$r"; \ +@no_icondir@ $(INSTALL_DATA) $$l $$h/$$r; \ +@no_icondir@ s=`echo "$$r" | sed -e '"'s,^.*\.,.,'"'`; \ +@no_icondir@ t=$(ICON_SYMLINK)$$s; \ +@no_icondir@ b=`basename $$n $$s | sed -e "s,_[1-9][0-9]*x.*,,"`; \ +@no_icondir@ if test "$(ICON_SYMLINK)" != NONE ; then \ +@no_icondir@ if test "$$r" != "$$t" ; then \ +@no_icondir@ if test "x$$b" = "x$(ICON_NAME)" ; then \ +@no_icondir@ echo "linking $$r -> $$t"; \ +@no_icondir@ ( cd $$h; $(RM) $$t; $(LN_S) $$r $$t; ) \ +@no_icondir@ fi \ +@no_icondir@ fi \ +@no_icondir@ fi \ +@no_icondir@ done' +@no_icondir@ @echo "... installed icons" + +@no_pixmapdir@install \ +@no_pixmapdir@install-icon \ +@no_pixmapdir@install-full :: $(PIXMAPDIR) +@no_pixmapdir@ @ECHO_CC@ACTUAL_XTERM=$(actual_xterm) $(SHELL) -c '\ +@no_pixmapdir@ h=$(PIXMAPDIR); \ +@no_pixmapdir@ for n in $(srcdir)/icons/*xterm*_32x32.xpm $(srcdir)/icons/*xterm*_48x48.xpm; \ +@no_pixmapdir@ do \ +@no_pixmapdir@ l=`basename $$n`; \ +@no_pixmapdir@ r=`echo "$$l" | sed -e "s,xterm,$$ACTUAL_XTERM,"`; \ +@no_pixmapdir@ echo "installing pixmap $$h/$$r"; \ +@no_pixmapdir@ $(INSTALL_DATA) $(srcdir)/icons/$$l $$h/$$r; \ +@no_pixmapdir@ s=`echo "$$r" | sed -e '"'s,^.*\.,.,'"'`; \ +@no_pixmapdir@ t=$(ICON_SYMLINK)$$s; \ +@no_pixmapdir@ b=`basename $$n $$s | sed -e "s,_[1-9][0-9]*x.*,,"`; \ +@no_pixmapdir@ if test "$(ICON_SYMLINK)" != NONE ; then \ +@no_pixmapdir@ if test "x$$r" != "$$t" ; then \ +@no_pixmapdir@ if test "x$$b" = "x$(ICON_NAME)" ; then \ +@no_pixmapdir@ echo "linking $$r -> $$t"; \ +@no_pixmapdir@ ( cd $$h; $(RM) $$t; $(LN_S) $$r $$t; ) \ +@no_pixmapdir@ fi \ +@no_pixmapdir@ fi \ +@no_pixmapdir@ fi \ +@no_pixmapdir@ done' +@no_pixmapdir@ @echo "... installed icons" + +install :: + @echo 'Completed installation of executables and documentation.' + @echo 'Use "make install-ti" to install terminfo description.' + +TERMINFO_DIR = @TERMINFO_DIR@ +SET_TERMINFO = @SET_TERMINFO@ + +@no_ticprog@install-full \ +@no_ticprog@install-ti :: $(TERMINFO_DIR) +@no_ticprog@ @$(SHELL) -c "$(SET_TERMINFO) $(srcdir)/run-tic.sh $(srcdir)/terminfo" +@no_ticprog@ @echo 'Completed installation of terminfo description.' + +install-full \ +install-tc :: + @-$(SHELL) -c "if test -f /etc/termcap ; then echo 'You must install the termcap entry manually by editing /etc/termcap'; fi" + +installdirs : $(INSTALL_DIRS) +################################################################################ + +UninstallLink = \ + if test @XTERM_SYMLINK@ != NONE \ + && test \$$source != NONE \ + && test \$$source != \$$target \ + && test -h \$$TARGET/\$$source ; then \ + echo \"... removing \$$TARGET/\$$source\"; \ + cd \$$TARGET && \ + $(RM) \$$source; \ + fi + +UninstallBinLink = TARGET=$(BINDIR); $(UninstallLink) +UninstallManLink = TARGET=$(MANDIR); $(UninstallLink) + +UninstallBinary = \ + echo \"... removing $(BINDIR)/\$$target\"; \ + $(RM) $(BINDIR)/\$$target + +uninstall \ +uninstall-bin \ +uninstall-full :: + @-$(SHELL) -c "source=\"@XTERM_SYMLINK@\"; \ + target=\"$(binary_xterm)\"; \ + $(UninstallBinLink); \ + $(UninstallBinary)" + @-$(SHELL) -c "source=\"resize\"; \ + target=\"$(binary_resize)\"; \ + $(UninstallBinLink); \ + $(UninstallBinary)" + +uninstall \ +uninstall-bin \ +uninstall-scripts \ +uninstall-full :: + @-$(SHELL) -c "source=\"uxterm\"; \ + target=\"$(binary_uxterm)\"; \ + $(UninstallBinLink); \ + $(UninstallBinary)" + @-$(SHELL) -c "source=\"koi8rxterm\"; \ + target=\"$(binary_k8term)\"; \ + $(UninstallBinLink); \ + $(UninstallBinary)" + +uninstall \ +uninstall-man \ +uninstall-full :: + @-$(SHELL) -c "\ + source=@XTERM_SYMLINK@.$(manext); \ + target=$(actual_xterm).$(manext); \ + $(UninstallManLink)" + @-$(SHELL) -c "for source in \ + $(actual_xterm).$(manext) \ + $(actual_resize).$(manext) \ + $(actual_uxterm).$(manext) \ + $(actual_k8term).$(manext); \ + do \ + echo \"... removing $(MANDIR)/\$$source\"; \ + $(RM) $(MANDIR)/\$$source; \ + done" + +@no_appsdir@uninstall \ +@no_appsdir@uninstall-app \ +@no_appsdir@uninstall-full :: +@no_appsdir@ -@ECHO_CC@$(SHELL) -c 'for s in $(APP_NAMES); \ +@no_appsdir@ do \ +@no_appsdir@ echo "** $$s"; \ +@no_appsdir@ d=`echo $$s | sed -e s/XTerm/$(CLASS)/`; \ +@no_appsdir@ echo uninstalling $(APPSDIR)/$$d; \ +@no_appsdir@ $(RM) $(APPSDIR)/$$d; \ +@no_appsdir@ echo uninstalling $(APPSDIR)/$$d-color; \ +@no_appsdir@ $(RM) $(APPSDIR)/$$d-color; \ +@no_appsdir@ done' + +@no_icondir@uninstall \ +@no_icondir@uninstall-icon \ +@no_icondir@uninstall-full :: +@no_icondir@ -@ECHO_CC@$(SHELL) -c 'ACTUAL_XTERM=$(actual_xterm) ; \ +@no_icondir@ for n in $(ICON_LIST); \ +@no_icondir@ do \ +@no_icondir@ r=`echo "$$n" | sed -e s,\^.\*:,, -e s,xterm,$$ACTUAL_XTERM,`; \ +@no_icondir@ test -z "$$r" && continue; \ +@no_icondir@ h=$(ICONDIR)/$(ICON_THEME); \ +@no_icondir@ test -f $$h/$$r || continue; \ +@no_icondir@ echo removing $$h/$$r; \ +@no_icondir@ $(RM) $$h/$$r; \ +@no_icondir@ done' +@no_icondir@ @echo "... removed icons" + +@no_pixmapdir@uninstall \ +@no_pixmapdir@uninstall-icon \ +@no_pixmapdir@uninstall-full :: +@no_pixmapdir@ -@$(SHELL) -c 'ACTUAL_XTERM=$(actual_xterm) ; \ +@no_pixmapdir@ for n in $(srcdir)/icons/*xterm*_32x32.xpm $(srcdir)/icons/*xterm*_48x48.xpm; \ +@no_pixmapdir@ do \ +@no_pixmapdir@ l=`basename $$n`; \ +@no_pixmapdir@ r=`echo "$$l" | sed -e "s,xterm,$$ACTUAL_XTERM,"`; \ +@no_pixmapdir@ echo removing $(PIXMAPDIR)/$$r; \ +@no_pixmapdir@ $(RM) $(PIXMAPDIR)/$$r; \ +@no_pixmapdir@ done' +@no_pixmapdir@ @echo "... removed icons" +################################################################################ +# Desktop-utils does not provide an uninstall, and is not uniformly available. +@desktop_utils@DESKTOP_FILES = $(srcdir)/xterm.desktop $(srcdir)/uxterm.desktop +@desktop_utils@DESKTOP_FLAGS = @DESKTOP_FLAGS@ +@desktop_utils@install-desktop \ +@desktop_utils@install-full :: +@desktop_utils@ ACTUAL_XTERM=$(actual_xterm) \ +@desktop_utils@ $(SHELL) -c 'for n in $(DESKTOP_FILES); \ +@desktop_utils@ do $(SHELL) df-install $$ACTUAL_XTERM $(ICON_NAME) DESTDIR="$(DESTDIR)" $(DESKTOP_FLAGS) $$n; \ +@desktop_utils@ done' +################################################################################ +check : $(TEST_PROGRAMS) + @ echo "See demos in vttests/* (use vttest for system-level testing)" + @ $(SHELL) -c 'echo "** executing test_charclass"; \ + ./test_charclass' + @ $(SHELL) -c 'echo "** executing test_wcwidth"; \ + for range in 32-126 160-0xff00 0x10000-0x11000; \ + do echo ".. range $$range"; \ + ./test_wcwidth -s $$range; \ + ./test_wcwidth -s $$range -w; \ + done' +################################################################################ +mostlyclean : + -$(RM) *$o *.[is] XTerm[1-9]*.* Xterm.log.* XtermLog.* .pure core *~ *.bak *.BAK *.out *.tmp + +clean : mostlyclean + -$(RM) $(PROGRAMS) $(TEST_PROGRAMS) $(AUTO_SOURCE) + +sources : $(AUTO_SOURCE) + +distclean :: clean + -$(RM) Makefile config.status config.cache config.log xtermcfg.h + -$(RM) df-install minstall + +distclean \ +docs-clean :: + -$(RM) *.ps *.pdf *.png + -$(SHELL) -c 'for p in xterm resize uxterm koi8rxterm; \ + do \ + $(RM) $$p.html $$p.$(manext) $$p.txt; \ + done' + -$(RM) ctlseqs.html ctlseqs.$(manext) + +distclean :: + -$(RM) man2html.tmp + +realclean : distclean + -$(RM) tags TAGS + +maintainer-clean : realclean + -$(RM) 256colres.h 88colres.h +################################################################################ +terminfo.out : terminfo ; tic -a -I -1 terminfo >$@ +termcap.out : termcap ; tic -a -C -U termcap >$@ +################################################################################ +docs-ctlseqs \ +docs :: $(srcdir)/ctlseqs.txt @MAN2HTML_NOTE@ ctlseqs.html @GROFF_NOTE@ ctlseqs.pdf ctlseqs.ps + +ctlseqs.html : $(srcdir)/ctlseqs.ms +ctlseqs.pdf : ctlseqs.ps +ctlseqs.ps : $(srcdir)/ctlseqs.ms +ctlseqs.txt : $(srcdir)/ctlseqs.ms +################################################################################ +docs-resize \ +docs :: resize.txt @MAN2HTML_NOTE@ resize.html @GROFF_NOTE@ resize.pdf resize.ps +resize.html : resize.$(manext) +resize.pdf : resize.ps +resize.ps : resize.$(manext) +resize.txt : resize.$(manext) +################################################################################ +docs-xterm \ +docs :: xterm.txt @MAN2HTML_NOTE@ xterm.html @GROFF_NOTE@ xterm.pdf xterm.ps +xterm.html : xterm.$(manext) +xterm.pdf : xterm.ps +xterm.ps : xterm.$(manext) +xterm.txt : xterm.$(manext) +################################################################################ +docs-uxterm \ +docs :: uxterm.txt @MAN2HTML_NOTE@ uxterm.html @GROFF_NOTE@ uxterm.pdf uxterm.ps +uxterm.html : uxterm.$(manext) +uxterm.pdf : uxterm.ps +uxterm.ps : uxterm.$(manext) +uxterm.txt : uxterm.$(manext) +################################################################################ +docs-koi8rxterm \ +docs :: koi8rxterm.txt @MAN2HTML_NOTE@ koi8rxterm.html @GROFF_NOTE@ koi8rxterm.pdf koi8rxterm.ps +koi8rxterm.html : koi8rxterm.$(manext) +koi8rxterm.pdf : koi8rxterm.ps +koi8rxterm.ps : koi8rxterm.$(manext) +koi8rxterm.txt : koi8rxterm.$(manext) +################################################################################ +lint : + $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(SRCS1) + $(LINT) $(LINT_OPTS) $(CPPFLAGS) $(SRCS2) + +tags : + $(CTAGS) $(SRCS) $(HDRS) + +TAGS : + $(ETAGS) $(SRCS) $(HDRS) + +$(TERMINFO_DIR) $(INSTALL_DIRS) : + mkdir -p $@ + +ALWAYS : + +depend : $(TABLES) + makedepend -- $(CPPFLAGS) -- $(SRCS) + +# DO NOT DELETE THIS LINE -- make depend depends on it. diff --git a/ports/xterm/xterm-359/NEWS b/ports/xterm/xterm-359/NEWS new file mode 100644 index 0000000..6331d77 --- /dev/null +++ b/ports/xterm/xterm-359/NEWS @@ -0,0 +1,27 @@ +The NEWS file was generated from xterm.log.html, which serves as the changelog +for xterm. +-------------------------------------------------------------------------------- + Patch #359 - 2020/08/17 + + * add special case in WriteText to allow colors 8-15 to override + colorBDMode (patch by Ingo Brückl). + * add utf8Weblike resource, to provide an alternate scheme for + handling ill-formed UTF-8 sequences (adapted from patch by Dan + Gohman). + * improve computation for the number of lines needed to scroll-up a + SIXEL graphic (report/patch by Ben Wong). + * correct manpage description for default value of disallowWindowOps + from changes in xterm #331 (patch by Ben Wong). + * correct a loop starting-point in refresh_graphics from optimization + in patch #358 changes (report by Ben Wong). + * add a new mouse mode 1016, which uses the same format as mode 1006, + but sends the mouse's position in pixels (suggested by Igor van den + Hoven). + * fix an issue from patch #338 changes where only the first selection + buffer specified in the request would be updated using OSC 52 + (patch by Michael Gulick). + * modify makefile/scripts to allow DESTDIR to prefix the target + directory for desktop-file-install (report by Fred Heitkamp). + * enable SIXEL feature by default. + * update config.guess, config.sub + diff --git a/ports/xterm/xterm-359/README b/ports/xterm/xterm-359/README new file mode 100644 index 0000000..76328f4 --- /dev/null +++ b/ports/xterm/xterm-359/README @@ -0,0 +1,19 @@ +-- $XTermId: README,v 1.3 2007/05/24 19:49:19 tom Exp $ +-- Below is the original README for xterm from 1991, for your amusement. +-- For a better overview, see http://invisible-island.net/xterm/ +------------------------------------------------------------------------------- + Abandon All Hope, Ye Who Enter Here + + +This is undoubtedly the most ugly program in the distribution. It was one of +the first "serious" programs ported, and still has a lot of historical baggage. +Ideally, there would be a general tty widget and then vt102 and tek4014 +subwidgets so that they could be used in other programs. We are trying to +clean things up as we go, but there is still a lot of work to do. + +If you are porting this to a machine that has problems with overlapping +bcopy's, watch out! + +There are two documents on xterm: the man page, xterm.man, which describes +how to use it, and ctlseqs.ms, which describes the control sequences it +understands. diff --git a/ports/xterm/xterm-359/README.i18n b/ports/xterm/xterm-359/README.i18n new file mode 100644 index 0000000..511ee60 --- /dev/null +++ b/ports/xterm/xterm-359/README.i18n @@ -0,0 +1,199 @@ +-- $XFree86: xc/programs/xterm/README.i18n,v 1.1 2003/11/13 01:16:37 dickey Exp $ + +Using xterm in your language +============================ + +Since XFree86 version 4.0, the internationalization (i18n) feature of +xterm is gradually improved. Xterm is being improved even now. You +need only set the standard locale environment variables such as +LC_CTYPE, LC_ALL, LC_CTYPE, or LANG. Once the locale is set up you can +use xterm in your favorite character encoding. + +This document explains how the i18n feature is realized and how to +configure xterm for your character encoding. + +Refer to locale(7) for details of the locale mechanism. + + +Basic i18n-related settings and resources +========================================= + +These settings apply to XFree86 xterm patch #181, and the program luit +which is distributed with XFree86 4.4 + +1. Usage of "locale mode" + + On startup, xterm must be in "locale mode" to make it follow the + current locale. You can invoke xterm in locale mode in these ways: + + a. Set "vt100.locale" resource "true". This resource was + introduced since XFree86 4.3. The default value of the "locale" + resource is "medium", which means xterm follows the locale only + in Chinese, Japanese, Korean, or Thai locales. For example, + + XTerm*locale: true + + in your ~/.Xresources file. + + or + + b. Invoke xterm with the "-lc" option. + +2. Converter program "luit" + + The "luit" must be available in the standard XFree86 binary + directory. It is usually available because it is part of the + XFree86 distribution. The standard binary directory may differ from + system to system. /usr/X11R6/bin/luit is an example. + + "luit" is used to convert between Unicode and the character encoding + for your locale. When built for XFree86, xterm includes logic for + invoking luit. + +3. Locale setting + + Finally, you will need to configure your locale. We expect that you + have already configured your locale for other software. For example, + + LANG=de_DE@euro + export LANG + + in your ~/.xsession file. There are many ways to configure locale. + For example, your display manager may have a mechanism to invoke a + window manager in your favorite locale, or you may have system-wide + locale setting in /etc/environment. You may also have set the + LC_ALL variable instead of the LANG variable. + + +How to use xterm in different locale temporarily +================================================ + +You may sometimes need to invoke xterm in a different character encoding +than your current locale. For example, use xterm to login remote systems +in different locale. + +Do this by invoking xterm in the target locale. For example, + + $ LANG=ru_RU.KOI8-R xterm & + +Previously, font setting has been used in such cases. + + $ xterm -fn -misc-fixed-medium-r-normal--10-*-*-*-*-*-koi8-r & + +This does not work well in conjunction with the "locale" resource, +because luit and xterm combined rely upon Unicode fonts. + + +How to set fonts for UTF-8/locale modes +======================================= + +Since xterm patch #181, xterm can automatically use Unicode fonts in +UTF-8 mode and locale mode. Few of you will need to modify the default +setting to display your language. In particular, Unicode fonts in +combination with locale mode will satisfy the needs of not only +ISO-8859-1 users but also East Asian and other non-ISO-8859-1 users. + +If you want to set your favorite Unicode font for UTF-8 and locale +modes, you should add a line such as the following in your ~/.Xresources +file: + + XTerm*VT100.utf8Fonts.font: \ + -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1 + +The leading "XTerm*" pattern is more specific than the system's +app-defaults file, therefore it overrides the corresponding line +beginning with + + *VT100.utf8Fonts.font: + +Here is an additional note. If you want to display East Asian +doublewidth characters (CJK Ideogram, Hiragana, Katakana, Hangul, +and so on), we recommend using + + -misc-fixed-medium-r-semicondensed--13-*-*-*-*-*-iso10646-1 + +or + + -misc-fixed-medium-r-normal--18-*-*-*-*-*-iso10646-1 + +because these two fonts have corresponding doublewidth fonts. These +fonts are used as default font and default "Large" font, respectively. + + +The internals of xterm i18n +=========================== + +You do not need to read this section if you only want to configure your +xterm. Here we describe how xterm is implemented to support i18n. + +The original version of xterm does not support locale or character +encoding. Its I/O stream is interpreted as a mere 8-bit index for a +font. + +Beginning with XFree86 4.0, xterm supported UTF-8. It was implemented +as a separate UTF-8 mode from the conventional 8-bit mode. Character +encodings had no effect on the 8-bit mode. The UTF-8 mode has been +extended to support doublewidth characters (for East Asian characters) +and combining characters (such as accents for Latin alphabets and Thai +vowels/tone marks). + +Doublewidth characters are characters that occupy two continuing +columns on the terminal. Xterm uses separate fonts for normal +(singlewidth) characters and doublewidth characters. Though xterm has +configuration items for specifying doublewidth fonts, it will +automatically search for a font with exactly twice as wide and the same +name as the specified normal font. + +The default behavior of xterm was modified to use this UTF-8 mode in +UTF-8 locales. A command line option of "-u8" and a resource of "utf8" +were introduced to choose UTF-8 mode. + +"luit" was introduced to XFree86 at version 4.2. It converts between +UTF-8 and other encodings. When luit is invoked in a UTF-8 terminal, +the terminal acts as if it is really running in the other encoding. + +Since XFree86 version 4.3, xterm provides a new mode to invoke luit +automatically to support various encodings. The mode where xterm +invokes luit is called "locale mode". It is the third mode following +conventional 8-bit mode and UTF-8 mode. In the locale mode, xterm is +aware of the current locale and character encoding. Since locale mode +uses luit, it is based on the UTF-8 mode. That is, xterm works in UTF-8 +mode and luit works as a converter between UTF-8 and the character +encoding for your locale. This is why the locale mode always needs +Unicode fonts. The default behavior of xterm is modified so that the +"locale mode" will be adopted in Chinese (Big5 and GB2312), Japanese +(EUC-JP), Korean (EUC-KR), and Thai (ISO-8859-11, as known as TIS-620) +locales. Locale mode is chosen for these character encodings because +these encodings are not supported by conventional 8-bit mode even by +changing fonts (ISO-8859-11 needs combining characters and others need +doublewidth characters). + +To control the locale mode, command line options of "-lc" and "-en" and +a resource of "locale" were introduced. The command line option of +"-u8" and a resource of "utf8" were made obsolete by them, though +retained for compatibility. + +Since XFree86 version 4.4, xterm can have two sets of default fonts, +one for conventional 8-bit mode and another for UTF-8 and locale modes, +by introducing the "utf8Fonts" subresource. + + +Future TODO Items +================= + +We anticipate that xterm's locale mode will be used increasingly in the +future. Since the UTF-8 and locale modes use more resources than +conventional 8-bit mode (because it needs larger fonts and another +process "luit"), faster hardware may be needed to gain complete +acceptance by users. However, the locale mechanism allows users +to manipulate data in a standard form. Its usefulness compensates +in part for reduced performance. + +Xterm supports antialiased fonts ("-fa" and "-fs" command line options). +Currently UTF-8 nor locale modes do not work with antialiased fonts. + +Xterm does not support bi-directional or RTL languages such as Hebrew +and Arab. A simple standard how terminal should behave for these +languages is needed. + +Xterm does not support Unicode characters above U+10000. diff --git a/ports/xterm/xterm-359/README.os390 b/ports/xterm/xterm-359/README.os390 new file mode 100644 index 0000000..2fe50b6 --- /dev/null +++ b/ports/xterm/xterm-359/README.os390 @@ -0,0 +1,74 @@ +-- $XFree86: xc/programs/xterm/README.os390,v 1.3 2000/09/22 10:42:05 alanh Exp $ + +Below are install instructions for os/390 2.5 & below and +for os/390 2.6 & above. The basic reasons for exporting +the LIBS and CFLAGS variables is to get the configure +script to run properly under os/390. configure, when +checking for X, attempts to compile a program something like + + int main() { + XtMalloc() + ; return 0; } + +using 'cc -o conftest conftest.c -lXt'. However this results +in a number of linkedit messages such as: + + IEW2456E 9207 SYMBOL xcatd UNRESOLVED. MEMBER COULD NOT BE INCLUDED FROM THE + DESIGNATED CALL LIBRARY. NAME SPACE = 3 + IEW2456E 9207 SYMBOL XrmQGetResource UNRESOLVED. MEMBER COULD NOT BE INCLUDED + FROM THE DESIGNATED CALL LIBRARY. + IEW2456E 9207 SYMBOL XrmGetDatabase UNRESOLVED. MEMBER COULD NOT BE INCLUDED + FROM THE DESIGNATED CALL LIBRARY. + +The only way I can get this program to compile and link is to +use 'cc -o conftest conftest.c -lXt -lX11 -lSM -lICE'. +With os/390 2.6 and above, IBM has provided X functions in dlls; +this is the reason for the separate install steps. In fact, +trying to use the X archive files (eg -lX11) when linking xterm +results in an abend0C1 in low storage when X tries to call the +initialize function (at least on my system). This has something +to do with the calling X routine thinking it has a function pointer +descriptor (c++) when it actually has just a function pointer (c). +Unfortunately, I have been unable to recreate the problem in a +simple testcase, so I haven't reported it to IBM. Anyway, for os/390 +2.6 and above, configure will build a Makefile with the following line: + + LIBS = -lXaw -lXext -lXmu -lXt -lSM -lICE -lX11 /usr/lib/Xaw.x /usr/lib/SM.x /usr/lib/ICE.x /usr/lib/X11.x -lcurses + +The '-lXaw -lXext -lXmu -lXt -lSM -lICE -lX11' should be manually removed; +this isn't strictly necessary, but will reduce the size of the executable +by about 4M. + +The '-Wl,EDIT=NO' causes the Binder to produce a non-editable executable, +dramatically reducing the size of the executable file. + +Good Luck!! +Greg Smith +rys@trex.rtpnc.epa.gov + + + +Install instructions for os/390 2.5 and *below*: +------------------------------------------------ + gunzip xterm.tar.gz + pax -o from=ISO8859-1,to=IBM-1047 -rf xterm.tar + cd xterm + export LIBS='-lXt -lX11 -lSM -lICE' + export CFLAGS='-D_ALL_SOURCE -Wl,EDIT=NO' + ./configure + make + export DISPLAY=my.xserver.name:0 + ./xterm + + +Install instructions for os/390 2.6 and *above*: +------------------------------------------------ + gunzip xterm.tar.gz + pax -o from=ISO8859-1,to=IBM-1047 -rf xterm.tar + cd xterm + ./configure # LIBS, CFLAGS, and CC are defined by configure for os/390 2.6. + [optional: edit the Makefile and remove '-lXaw -lXext -lXmu -lXt -lSM -lICE -lX11' + from the LIBS assignment] + make + export DISPLAY=my.xserver.name:0 + ./xterm diff --git a/ports/xterm/xterm-359/THANKS b/ports/xterm/xterm-359/THANKS new file mode 100644 index 0000000..fd24256 --- /dev/null +++ b/ports/xterm/xterm-359/THANKS @@ -0,0 +1,241 @@ +-- $XTermId: THANKS,v 1.26 2020/07/03 17:42:57 tom Exp $ +-- vile:txtmode fk=utf-8 +There's no AUTHORS file in this distribution; it would be redundant since +I (Thomas E. Dickey) have done more than 80% of the work on xterm since 1996. + +There is no reliable history before that point. +For some insight, see + + https://invisible-island.net/xterm/xterm.faq.html#who_did_it + https://invisible-island.net/personal/changelogs.html#categories + +Here is a list from xterm.log.html of people who have contributed changes, +or whose suggested change could be adapted: + +Adam M Costello +Adam Sulmicki +Ailin Nemui +Al Poole +Alan Coopersmith +Alex Hornung +Alexander Pohoyda +Alexander V Lukyanov +Andrea Odetti +Andreas Jaeger +Andreas Schwab +Andres Perera +Andrew Sumner +Andrew Tipton +Andrey Panov +Andries E Brouwer +Anton Kovalenko +Balazs Kezes +Ben Wiley Sittler +Ben Wong +Ben Yoshino +Bernhard R Link +Bernhard Rosenkraenzer +Bertram Felgenhauer +Bill Nottingham +Bjarni Ingi Gislason +Bob Maynard +Brad Town +Bradd W Szonye +Bram Moolenaar +Branden Robinson +Bruno Haible +Cade Foster +Caetano Jimenez Carezzato +Chris Adams +Chris Clayton +Christian Biere +Christian Weisgerber +Chuck Blake +Chuck Silvers +Colum Paget +D Roland Walker +Dan Church +Dan Gohman +Dan Thompson +Daniel Colascione +Daniel Drake +Daniel Jacobowitz +Dave Coffin +Dave Simmons +David Dawes +David Krause +David Madore +David Martínez Moreno +David Mathog +David Michael +David Wolfskill +David Wood +David Yeo +Denis Zaitsev +Dennis Preiser +Dennis Schneider +Dimitrios Christidis +Ed Schouten +Eddy De Greef +Edward S Arthur +Egbert Eich +Egmont Koblinger +Emanuele Giaquinta +Eugene Konev +Fabrice Bellard +Frank Giessler +Frank Guangxin Liu +Frank Liu +Gael Roualland +George Kouryachy +George Nachman +George Peter Staplin +Gertjan Halkes +Greg Badros +Greg Klanderman +Greg Smith +H Merijn Brand +Hasso Tepper +Holger Veit +Ilya Zakharevich +Ingo Brückl +Iwamoto Kouichi +James Armstrong +Jan Engelhardt +Jason Bacon +Jason Vas Dias +Jeff Chua +Jeff Uphoff +Jens Schweikhardt +Jeremy Buhler +Jeremy Huddleston +Jeroen Ruigrok +Jess Thrysoee +Jim Paris +Jimmy Aguilar Mena +Jochen Voss +Joe Allen +Joe Peterson +Johnny Billquist +Jonathan Irwin +Julien Cristau +Juliusz Chroboczek +Jungshik Shin +Jürgen Keil +KUGA Tsutomu +Kean Johnston +Keith Packard +Ken Martin +Kevin Buhr +Kevin Ryde +Kevin Schoedel +Kiyokazu Suto +Larry Hynes +Larry Riedel +Lauri Tirkkonen +Lee Olsen +Loïc Minier +Marc Bevand +Marc La France +Marco Peereboom +Marius Tolzmann +Mark Waggoner +Markus Kuhn +Martin Hostettler +Martin Pirker +Martin Tournoij +Matthew Green +Matthias Baake +Matthias Scheler +Matthieu Herrb +Matthieu Lagouge +Mattias Engdegård +Max Mikhanosha +Michael Riepe +Michael Rohleder +Michael Schroeder +Mike Castle +Mike Fabian +Mike Frysinger +Mike Hopkirk +Mike Thornburg +Mikulas Patocka +Milan Mehner +Min Sik Kim +Miroslav Lichvar +Nam SungHyun +Nelson Beebe +Nicholas Marriott +Nicolas George +Németh Márton +Olaf Rogalsky +Ovidiu Gheorghioiu +Paul Bolle +Paul Gilmartin +Paul Giordano +Paul Lampert +Paul Maier +Paul Szabo +Paul Vojta +Paul Williams +Pavel Roskin +Peder Stray +Per Hedeland +Peter Berg Larsen +Phil Sidler +Pierre Lombard +Pierre Pronchery +Quinn Strahl +Rajesh Mandalemula +Richard Braakman +Richard Griswold +Richard Tollerton +Rob Braun +Robert Brady +Robert Earl +Robert Ross +Robin Cutshaw +Romain Francoise +Ross Combs +Ross Paterson +Ryan Johnson +Sam Stephenson +Samuel Thibault +Scott Sewall +Semen A Ustimenko +Sergei Laskavy +Sergey Vlasov +Slava Semushin +Stefan Assmann +Stefan Dirsch +Stephen P Wall +Stuart Lissaman +Sven Joachim +Sven Verdoolaege +Taketo Kabe +Taneli Huuskonen +Ted Phelps +Thierry Reding +Thomas Wolff +Thorsten Glaser +Tim Adye +Tim Pope +Tobias Stoeckmann +Todd Eigenschink +Todd Larason +Todd Miller +Tomas Vanhala +Tomasz Cholewo +Tomohiro Kubota +Tor Lillqvist +Torrey Lyons +Victor Stinner +Victor Vaile +Vincent Lefèvre +Walter Harms +Werner Fink +Werner Lemberg +Will Day +YOKOTA Hiroshi +Zarick Lau +Zdenek Sekera diff --git a/ports/xterm/xterm-359/TekPrsTbl.c b/ports/xterm/xterm-359/TekPrsTbl.c new file mode 100644 index 0000000..a16d18d --- /dev/null +++ b/ports/xterm/xterm-359/TekPrsTbl.c @@ -0,0 +1,2648 @@ +/* $XTermId: TekPrsTbl.c,v 1.9 2006/02/13 01:14:57 tom Exp $ */ + +/* + * Copyright 1998-2001,2006 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ +/* $XFree86: xc/programs/xterm/TekPrsTbl.c,v 3.5 2006/02/13 01:14:57 dickey Exp $ */ + +#include + +Const int Talptable[] = /* US (^_) normal alpha mode */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_BEL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_LF, +CASE_UP, +/* NP CR SO SI */ +CASE_IGNORE, +CASE_CR, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_ESC_STATE, +/* FS GS RS US */ +CASE_PT_STATE, +CASE_PLT_STATE, +CASE_IPL_STATE, +CASE_ALP_STATE, +/* SP ! " # */ +CASE_SP, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* $ % & ' */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* ( ) * + */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* , - . / */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 0 1 2 3 */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 4 5 6 7 */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 8 9 : ; */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* < = > ? */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* @ A B C */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* D E F G */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* H I J K */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* L M N O */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* P Q R S */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* T U V W */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* X Y Z [ */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* \ ] ^ _ */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* ` a b c */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* d e f g */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* h i j k */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* l m n o */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* p q r s */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* t u v w */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* x y z { */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* | } ~ DEL */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x99 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* currency yen brokenbar section */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* notsign hyphen registered macron */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* degree plusminus twosuperior threesuperior */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* acute mu paragraph periodcentered */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* cedilla onesuperior masculine guillemotright */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* onequarter onehalf threequarters questiondown */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Agrave Aacute Acircumflex Atilde */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Adiaeresis Aring AE Ccedilla */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Eth Ntilde Ograve Oacute */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* agrave aacute acircumflex atilde */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* adiaeresis aring ae ccedilla */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* egrave eacute ecircumflex ediaeresis */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* igrave iacute icircumflex idiaeresis */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* eth ntilde ograve oacute */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* ocircumflex otilde odiaeresis division */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* oslash ugrave uacute ucircumflex */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +}; + +Const int Tbestable[] = /* ESC while in bypass state */ +{ +/* NUL SOH STX ETX */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_VT_MODE, +/* EOT ENQ ACK BEL */ +CASE_BYP_STATE, +CASE_REPORT, +CASE_BYP_STATE, +CASE_BEL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_IGNORE, +CASE_UP, +/* NP CR SO SI */ +CASE_PAGE, +CASE_IGNORE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* DLE DC1 DC2 DC3 */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* DC4 NAK SYN ETB */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_COPY, +/* CAN EM SUB ESC */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_GIN, +CASE_IGNORE, +/* FS GS RS US */ +CASE_SPT_STATE, +CASE_PLT_STATE, +CASE_IPL_STATE, +CASE_ALP_STATE, +/* SP ! " # */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* $ % & ' */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* ( ) * + */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* , - . / */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* 0 1 2 3 */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* 4 5 6 7 */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* 8 9 : ; */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* < = > ? */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* @ A B C */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* D E F G */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* H I J K */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* L M N O */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* P Q R S */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* T U V W */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* X Y Z [ */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* \ ] ^ _ */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* ` a b c */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* d e f g */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* h i j k */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* l m n o */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* p q r s */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* t u v w */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* x y z { */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* | } ~ DEL */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_IGNORE, +CASE_BYP_STATE, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x99 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* currency yen brokenbar section */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* notsign hyphen registered macron */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* degree plusminus twosuperior threesuperior */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* acute mu paragraph periodcentered */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* cedilla onesuperior masculine guillemotright */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* agrave aacute acircumflex atilde */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* eth ntilde ograve oacute */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +CASE_BYP_STATE, +}; + +Const int Tbyptable[] = /* ESC CAN (^X) bypass state */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_BEL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_LF, +CASE_UP, +/* NP CR SO SI */ +CASE_IGNORE, +CASE_CR, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_BES_STATE, +/* FS GS RS US */ +CASE_PT_STATE, +CASE_PLT_STATE, +CASE_IPL_STATE, +CASE_ALP_STATE, +/* SP ! " # */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* $ % & ' */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ( ) * + */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* , - . / */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0 1 2 3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 4 5 6 7 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 8 9 : ; */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* < = > ? */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* @ A B C */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* D E F G */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* H I J K */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* L M N O */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* P Q R S */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* T U V W */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* X Y Z [ */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* \ ] ^ _ */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ` a b c */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* d e f g */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* h i j k */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* l m n o */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* p q r s */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* t u v w */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* x y z { */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* | } ~ DEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x99 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; + +Const int Tesctable[] = /* ESC */ +{ +/* NUL SOH STX ETX */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_VT_MODE, +/* EOT ENQ ACK BEL */ +CASE_CURSTATE, +CASE_REPORT, +CASE_CURSTATE, +CASE_BEL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_IGNORE, +CASE_UP, +/* NP CR SO SI */ +CASE_PAGE, +CASE_IGNORE, +CASE_APL, +CASE_ASCII, +/* DLE DC1 DC2 DC3 */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* DC4 NAK SYN ETB */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_COPY, +/* CAN EM SUB ESC */ +CASE_BYP_STATE, +CASE_CURSTATE, +CASE_GIN, +CASE_IGNORE, +/* FS GS RS US */ +CASE_SPT_STATE, +CASE_PLT_STATE, +CASE_IPL_STATE, +CASE_ALP_STATE, +/* SP ! " # */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* $ % & ' */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* ( ) * + */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* , - . / */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* 0 1 2 3 */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* 4 5 6 7 */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* 8 9 : ; */ +CASE_CHAR_SIZE, +CASE_CHAR_SIZE, +CASE_CHAR_SIZE, +CASE_CHAR_SIZE, +/* < = > ? */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* @ A B C */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* D E F G */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* H I J K */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* L M N O */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* P Q R S */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* T U V W */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* X Y Z [ */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* \ ] ^ _ */ +CASE_CURSTATE, +CASE_OSC, +CASE_CURSTATE, +CASE_CURSTATE, +/* ` a b c */ +CASE_BEAM_VEC, +CASE_BEAM_VEC, +CASE_BEAM_VEC, +CASE_BEAM_VEC, +/* d e f g */ +CASE_BEAM_VEC, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_BEAM_VEC, +/* h i j k */ +CASE_BEAM_VEC, +CASE_BEAM_VEC, +CASE_BEAM_VEC, +CASE_BEAM_VEC, +/* l m n o */ +CASE_BEAM_VEC, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_BEAM_VEC, +/* p q r s */ +CASE_BEAM_VEC, +CASE_BEAM_VEC, +CASE_BEAM_VEC, +CASE_BEAM_VEC, +/* t u v w */ +CASE_BEAM_VEC, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_BEAM_VEC, +/* x y z { */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +CASE_CURSTATE, +/* | } ~ DEL */ +CASE_CURSTATE, +CASE_CURSTATE, +CASE_IGNORE, +CASE_CURSTATE, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x99 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; + +Const int Tipltable[] = /* RS (^^) incremental plot */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_BEL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_LF, +CASE_UP, +/* NP CR SO SI */ +CASE_IGNORE, +CASE_CR, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_ESC_STATE, +/* FS GS RS US */ +CASE_PT_STATE, +CASE_PLT_STATE, +CASE_IPL_STATE, +CASE_ALP_STATE, +/* SP ! " # */ +CASE_PENUP, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* $ % & ' */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ( ) * + */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* , - . / */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0 1 2 3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 4 5 6 7 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 8 9 : ; */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* < = > ? */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* @ A B C */ +CASE_IGNORE, +CASE_IPL_POINT, +CASE_IPL_POINT, +CASE_IGNORE, +/* D E F G */ +CASE_IPL_POINT, +CASE_IPL_POINT, +CASE_IPL_POINT, +CASE_IGNORE, +/* H I J K */ +CASE_IPL_POINT, +CASE_IPL_POINT, +CASE_IPL_POINT, +CASE_IGNORE, +/* L M N O */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* P Q R S */ +CASE_PENDOWN, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* T U V W */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* X Y Z [ */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* \ ] ^ _ */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ` a b c */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* d e f g */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* h i j k */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* l m n o */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* p q r s */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* t u v w */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* x y z { */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* | } ~ DEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x99 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; + +Const int Tplttable[] = /* GS (^]) graph (plot) mode */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_BEL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_LF, +CASE_UP, +/* NP CR SO SI */ +CASE_IGNORE, +CASE_CR, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_ESC_STATE, +/* FS GS RS US */ +CASE_PT_STATE, +CASE_PLT_STATE, +CASE_IPL_STATE, +CASE_ALP_STATE, +/* SP ! " # */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* $ % & ' */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* ( ) * + */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* , - . / */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* 0 1 2 3 */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* 4 5 6 7 */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* 8 9 : ; */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* < = > ? */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* @ A B C */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* D E F G */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* H I J K */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* L M N O */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* P Q R S */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* T U V W */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* X Y Z [ */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* \ ] ^ _ */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* ` a b c */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* d e f g */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* h i j k */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* l m n o */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* p q r s */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* t u v w */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* x y z { */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* | } ~ DEL */ +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +CASE_PLT_VEC, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x99 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; + +Const int Tpttable[] = /* FS (^\) point plot mode */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_BEL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_LF, +CASE_UP, +/* NP CR SO SI */ +CASE_IGNORE, +CASE_CR, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_ESC_STATE, +/* FS GS RS US */ +CASE_PT_STATE, +CASE_PLT_STATE, +CASE_IPL_STATE, +CASE_ALP_STATE, +/* SP ! " # */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* $ % & ' */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* ( ) * + */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* , - . / */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* 0 1 2 3 */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* 4 5 6 7 */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* 8 9 : ; */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* < = > ? */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* @ A B C */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* D E F G */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* H I J K */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* L M N O */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* P Q R S */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* T U V W */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* X Y Z [ */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* \ ] ^ _ */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* ` a b c */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* d e f g */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* h i j k */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* l m n o */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* p q r s */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* t u v w */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* x y z { */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* | } ~ DEL */ +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +CASE_PT_POINT, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x99 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; + +Const int Tspttable[] = /* ESC FS (^\) special point plot */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_BEL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_LF, +CASE_UP, +/* NP CR SO SI */ +CASE_IGNORE, +CASE_CR, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_ESC_STATE, +/* FS GS RS US */ +CASE_PT_STATE, +CASE_PLT_STATE, +CASE_IPL_STATE, +CASE_ALP_STATE, +/* SP ! " # */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* $ % & ' */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* ( ) * + */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* , - . / */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* 0 1 2 3 */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* 4 5 6 7 */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* 8 9 : ; */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* < = > ? */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* @ A B C */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* D E F G */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* H I J K */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* L M N O */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* P Q R S */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* T U V W */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* X Y Z [ */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* \ ] ^ _ */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* ` a b c */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* d e f g */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* h i j k */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* l m n o */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* p q r s */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* t u v w */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* x y z { */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* | } ~ DEL */ +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +CASE_SPT_POINT, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x99 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; diff --git a/ports/xterm/xterm-359/TekPrsTbl.o b/ports/xterm/xterm-359/TekPrsTbl.o new file mode 100644 index 0000000000000000000000000000000000000000..0b52ceb63ffd2da1e02df4afa36b81c5e4dfbce4 GIT binary patch literal 11584 zcmeHN3v5$m6#nnpjctYQQ68IsyM<8)j*g8Hx1po*8s#Ccnal)aT`7aC>z1~_FcJ$4 zFdO0sm`ors$c!NnAB-qb6f^{sA+IHfi3ln&_#i8|9}72z5RP%nlX1~j3hB4i50W3MJQvAERC+H4mOxsSTg9{u@QW+!12J30-Jy_ zb_AE*<#mUTguFQ50l*2siNM2kj%putH&!~{{knKq`ldhD|0A&eb&g&iJS=lrzt7(9 zXZ^AM(_#JV9KAl!*G2Ew#lzBP{jvUs!upSPf2Khjkg*-4cV~-j9rhn+zt|?-j{cnb zzl^~Un7_n$Zh$%xO6~f``@!G;gMd*_1x^8`+(>dD_>*{y0VL+d0Be8$N6PC<%mVdk zxi8Cp(6X%1CdwTQy2w5GFt#^-iWMb}1!5?5*83pR9MG=+zBvCg!(0>3|030^WBPp5 z=Rp6=0en6a_z{!>m*lAiw<)7|sGr+nQP9-F@I3mi`@GurE{ukTAQ zuXl5%r}5XW|Gs$sNBaLS1LmNtb5#1Er?KxZpFZ}{o&WgEM_RxYvg`KVaV;+|_mtl# zFJ~7Wa$Cq)Hg`k4Ex9#!LYp*p&CttdkEO<~cuL-r(&8wwoVv8Rwc~pB`hqrgF0a0I z+x2Ysyym5?p=Nh+)1T*0d>h+RP+$)-YU zs?#zh{Ym)uASR!cSc(-={wb$-VZ#z(Sx}|Oh+jAqWzBu`OgyH zTV5dbuIZ1)*$sCepS`HjZ*6(!{R3lO|EMFaW5I86hfS%C4U6yQr8RAq5{(7PtYq4> zA~~z%nP!v{jvwV9aeN%8N<3A~ z@qEH@Lr3CxF{nyB9w;Gkd={t*jtAgK9A5;gg5$?ONE~OSo~i}@Kxu{7?q;Qd+F;OC z;q|c6u;L|XRjrphJpnh@D%RDK<_U1k<>eSwL$`@N9bPZ$IVAcK$5ESx1`wW0A|Z}v z4Mg}q0}|nQ7J-D{9v~r3w}dt>Wh5$JwHTYh6~d`I<_oxu+s_F&O=!1(hqzrW;0@ef zE8s=k-XP#>xc#PpV|$T~s6zQhjQRkfFEu#MNuuw#g6oE+7D9J4IQ}jqisuUu1=WeZ zks2Jo{UXZK;563gE79P1UQ9$|ie-21rl61F0f=MFbZ*l)5dH$kX&eZDk>iuNB)oy! z)Zc`^#&Kp3tgD8J3o__e5x zw<~?C?X~`zT8}@tj&9^N2VNqOnEx2W;JkUz z{A|d@GPQFF%y9iOT49pIs-hLbRcVuU@&e|N6*qfN6`fZhjN$%_`;MbCLRGG3sxp~3 z4F7AveU9>Jd&d1p>=VqqE#sB3^{VK+im_$j5ity|wyG(zDmt%X>|*dlYX5D%@Ti^G zer&tgelK8RnEPn*(2y8g3BE}6$K%8Rs#66#yVU(itRMYY<^*!^_zS%L?c63o zVbqRI;E0r8K1$8-Q6iUO{!Ypl;?D7Wi-1$TB=_=sA&h;`^F^HU2tNc0?yr2B5zKD# zeA*|;LG33S%M)|amo{3BSjj8I=Q7qq`7|%^Ss<=m%nb4QzXS~piS5U6jhN5J|F|X> HRWbixy;9y$ literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/Tekparse.def b/ports/xterm/xterm-359/Tekparse.def new file mode 100644 index 0000000..d4a0b8e --- /dev/null +++ b/ports/xterm/xterm-359/Tekparse.def @@ -0,0 +1,74 @@ +# $XTermId: Tekparse.def,v 1.4 2006/02/12 22:43:56 tom Exp $ +# +# vile:confmode rs=lf +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2002,2006 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# List of symbols that need to be defined for Tekparse.h. If you need to +# change any of the CASE_ macros, make the change here and rerun the command +# shown in Tekparse.h. +# + +CASE_REPORT +CASE_VT_MODE +CASE_SPT_STATE +CASE_GIN +CASE_BEL +CASE_BS +CASE_PT_STATE +CASE_PLT_STATE +CASE_TAB +CASE_IPL_STATE +CASE_ALP_STATE +CASE_UP +CASE_COPY +CASE_PAGE +CASE_BES_STATE +CASE_BYP_STATE +CASE_IGNORE +CASE_ASCII +CASE_APL +CASE_CHAR_SIZE +CASE_BEAM_VEC +CASE_CURSTATE +CASE_PENUP +CASE_PENDOWN +CASE_IPL_POINT +CASE_PLT_VEC +CASE_PT_POINT +CASE_SPT_POINT +CASE_CR +CASE_ESC_STATE +CASE_LF +CASE_SP +CASE_PRINT +CASE_OSC diff --git a/ports/xterm/xterm-359/Tekparse.h b/ports/xterm/xterm-359/Tekparse.h new file mode 100644 index 0000000..aac9851 --- /dev/null +++ b/ports/xterm/xterm-359/Tekparse.h @@ -0,0 +1,55 @@ +/* $XTermId: Tekparse.h,v 1.8 2016/10/06 00:32:30 tom Exp $ */ + +/* + * Copyright 1998-2006,2016 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +#ifndef included_Tekparse_h +#define included_Tekparse_h 1 + +#ifndef Const +# if defined(__STDC__) && !defined(__cplusplus) +# define Const const +# else +# define Const /**/ +# endif +#endif + +extern Const int Talptable[]; +extern Const int Tbestable[]; +extern Const int Tbyptable[]; +extern Const int Tesctable[]; +extern Const int Tipltable[]; +extern Const int Tplttable[]; +extern Const int Tpttable[]; +extern Const int Tspttable[]; + +#include + +#endif /* included_Tekparse_h */ diff --git a/ports/xterm/xterm-359/Tekparse.hin b/ports/xterm/xterm-359/Tekparse.hin new file mode 100644 index 0000000..b793e15 --- /dev/null +++ b/ports/xterm/xterm-359/Tekparse.hin @@ -0,0 +1,35 @@ +/* vile:cmode */ +#define CASE_REPORT 0 +#define CASE_VT_MODE 1 +#define CASE_SPT_STATE 2 +#define CASE_GIN 3 +#define CASE_BEL 4 +#define CASE_BS 5 +#define CASE_PT_STATE 6 +#define CASE_PLT_STATE 7 +#define CASE_TAB 8 +#define CASE_IPL_STATE 9 +#define CASE_ALP_STATE 10 +#define CASE_UP 11 +#define CASE_COPY 12 +#define CASE_PAGE 13 +#define CASE_BES_STATE 14 +#define CASE_BYP_STATE 15 +#define CASE_IGNORE 16 +#define CASE_ASCII 17 +#define CASE_APL 18 +#define CASE_CHAR_SIZE 19 +#define CASE_BEAM_VEC 20 +#define CASE_CURSTATE 21 +#define CASE_PENUP 22 +#define CASE_PENDOWN 23 +#define CASE_IPL_POINT 24 +#define CASE_PLT_VEC 25 +#define CASE_PT_POINT 26 +#define CASE_SPT_POINT 27 +#define CASE_CR 28 +#define CASE_ESC_STATE 29 +#define CASE_LF 30 +#define CASE_SP 31 +#define CASE_PRINT 32 +#define CASE_OSC 33 diff --git a/ports/xterm/xterm-359/Tekproc.c b/ports/xterm/xterm-359/Tekproc.c new file mode 100644 index 0000000..d83970c --- /dev/null +++ b/ports/xterm/xterm-359/Tekproc.c @@ -0,0 +1,2103 @@ +/* $XTermId: Tekproc.c,v 1.239 2020/06/02 23:12:04 tom Exp $ */ + +/* + * Copyright 2001-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * Copyright 1988 X Consortium + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of the X Consortium shall not be + * used in advertising or otherwise to promote the sale, use or other dealings + * in this Software without prior written authorization from the X Consortium. + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* Tekproc.c */ + +#define RES_OFFSET(field) XtOffsetOf(TekWidgetRec, field) + +#include + +#include +#include +#include +#include + +#if OPT_TOOLBAR + +#if defined(HAVE_LIB_XAW) +#include +#elif defined(HAVE_LIB_XAW3D) +#include +#elif defined(HAVE_LIB_XAW3DXFT) +#include +#elif defined(HAVE_LIB_NEXTAW) +#include +#elif defined(HAVE_LIB_XAWPLUS) +#include +#endif + +#endif /* OPT_TOOLBAR */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define DefaultGCID(tw) \ + XGContextFromGC(DefaultGC(XtDisplay(tw), \ + DefaultScreen(XtDisplay(tw)))) + +/* Tek defines */ + +#define MY_CLASS "Tek4014" +#define MY_NAME "tek4014" + +#define SOLIDLINE 0 +#define DOTTEDLINE 1 +#define DOTDASHEDLINE 2 +#define SHORTDASHEDLINE 3 +#define LONGDASHEDLINE 4 + +#define EAST 001 +#define WEST 002 +#define NORTH 004 +#define SOUTH 010 + +#define LINEMASK 07 +#define MARGIN1 0 +#define MARGIN2 1 +#define MAX_PTS 150 +#define MAX_VTX 300 +#define PENDOWN 1 +#define PENUP 0 +#define TEKBOTTOMPAD 23 +#define TEKDEFHEIGHT 565 +#define TEKDEFWIDTH 750 +#define TEKHEIGHT 3072 +#define TEKHOME ( (TekChar[tekscr->page.fontsize].nlines - 1) \ + * TekChar[tekscr->page.fontsize].vsize) +#define TEKMINHEIGHT 452 +#define TEKMINWIDTH 600 +#define TEKTOPPAD 34 +#define TEKWIDTH 4096 + +#define FULL_HEIGHT (TEKHEIGHT + TEKTOPPAD + TEKBOTTOMPAD) + +#define BottomY(y) (TEKHEIGHT + TEKTOPPAD - (y)) +#define BorderOf(tw) (TScreenOf((tw)->vt)->border) +#define ScaleOf(tw) TekScale(TekScreenOf(tw)) +#define ScaledX(tw,x) (((x) * ScaleOf(tw)) + BorderOf(tw)) +#define ScaledY(tw,y) ((BottomY(y) * ScaleOf(tw)) + BorderOf(tw)) + +#define TekMove(tw,x,y) do { tekscr->cur_X = x; tekscr->cur_Y = y; } while (0) +#define input() Tinput(tw) +#define unput(c) *Tpushback++ = (Char) c +/* *INDENT-OFF* */ +static const struct Tek_Char { + int hsize; /* in Tek units */ + int vsize; /* in Tek units */ + int charsperline; + int nlines; +} TekChar[TEKNUMFONTS] = { + {56, 88, 74, 35}, /* large */ + {51, 82, 81, 38}, /* #2 */ + {34, 53, 121, 58}, /* #3 */ + {31, 48, 133, 64}, /* small */ +}; +/* *INDENT-ON* */ + +static Cursor GINcursor; +static XSegment *line_pt; +static int nplot; +static TekLink Tek0; +static jmp_buf Tekjump; +static TekLink *TekRecord; +static XSegment *Tline; + +static Const int *curstate = Talptable; +static Const int *Tparsestate = Talptable; + +static char defaultTranslations[] = "\ + ~Meta: insert-seven-bit() \n\ + Meta: insert-eight-bit() \n\ + !Ctrl : popup-menu(mainMenu) \n\ + !Lock Ctrl : popup-menu(mainMenu) \n\ +!Lock Ctrl @Num_Lock : popup-menu(mainMenu) \n\ + !Ctrl @Num_Lock : popup-menu(mainMenu) \n\ + !Ctrl : popup-menu(tekMenu) \n\ + !Lock Ctrl : popup-menu(tekMenu) \n\ +!Lock Ctrl @Num_Lock : popup-menu(tekMenu) \n\ + !Ctrl @Num_Lock : popup-menu(tekMenu) \n\ + Shift ~Meta: gin-press(L) \n\ + ~Meta: gin-press(l) \n\ + Shift ~Meta: gin-press(M) \n\ + ~Meta: gin-press(m) \n\ + Shift ~Meta: gin-press(R) \n\ + ~Meta: gin-press(r)"; +/* *INDENT-OFF* */ +static XtActionsRec actionsList[] = { + { "string", HandleStringEvent }, + { "insert", HandleKeyPressed }, /* alias for insert-seven-bit */ + { "insert-seven-bit", HandleKeyPressed }, + { "insert-eight-bit", HandleEightBitKeyPressed }, + { "gin-press", HandleGINInput }, + { "secure", HandleSecure }, + { "create-menu", HandleCreateMenu }, + { "popup-menu", HandlePopupMenu }, + /* menu actions */ + { "allow-send-events", HandleAllowSends }, + { "set-visual-bell", HandleSetVisualBell }, +#ifdef ALLOWLOGGING + { "set-logging", HandleLogging }, +#endif + { "redraw", HandleRedraw }, + { "send-signal", HandleSendSignal }, + { "quit", HandleQuit }, + { "set-scrollbar", HandleScrollbar }, + { "set-jumpscroll", HandleJumpscroll }, + { "set-reverse-video", HandleReverseVideo }, + { "set-autowrap", HandleAutoWrap }, + { "set-reversewrap", HandleReverseWrap }, + { "set-autolinefeed", HandleAutoLineFeed }, + { "set-appcursor", HandleAppCursor }, + { "set-appkeypad", HandleAppKeypad }, + { "set-scroll-on-key", HandleScrollKey }, + { "set-scroll-on-tty-output", HandleScrollTtyOutput }, + { "set-allow132", HandleAllow132 }, + { "set-cursesemul", HandleCursesEmul }, + { "set-marginbell", HandleMarginBell }, + { "set-altscreen", HandleAltScreen }, + { "soft-reset", HandleSoftReset }, + { "hard-reset", HandleHardReset }, + { "set-terminal-type", HandleSetTerminalType }, + { "set-visibility", HandleVisibility }, + { "set-tek-text", HandleSetTekText }, + { "tek-page", HandleTekPage }, + { "tek-reset", HandleTekReset }, + { "tek-copy", HandleTekCopy }, +#if OPT_TOOLBAR + { "set-toolbar", HandleToolbar }, +#endif +}; +/* *INDENT-ON* */ + +static Dimension defOne = 1; + +#define GIN_TERM_NONE_STR "none" +#define GIN_TERM_CR_STR "CRonly" +#define GIN_TERM_EOT_STR "CR&EOT" + +#define GIN_TERM_NONE 0 +#define GIN_TERM_CR 1 +#define GIN_TERM_EOT 2 + +#ifdef VMS +#define DFT_FONT_SMALL "FIXED" +#else +#define DFT_FONT_SMALL "6x10" +#endif + +static XtResource resources[] = +{ + {XtNwidth, XtCWidth, XtRDimension, sizeof(Dimension), + XtOffsetOf(CoreRec, core.width), XtRDimension, (caddr_t) & defOne}, + {XtNheight, XtCHeight, XtRDimension, sizeof(Dimension), + XtOffsetOf(CoreRec, core.height), XtRDimension, (caddr_t) & defOne}, + Fres("fontLarge", XtCFont, tek.Tfont[TEK_FONT_LARGE], "9x15"), + Fres("font2", XtCFont, tek.Tfont[TEK_FONT_2], "6x13"), + Fres("font3", XtCFont, tek.Tfont[TEK_FONT_3], "8x13"), + Fres("fontSmall", XtCFont, tek.Tfont[TEK_FONT_SMALL], DFT_FONT_SMALL), + Sres(XtNinitialFont, XtCInitialFont, tek.initial_font, "large"), + Sres("ginTerminator", "GinTerminator", tek.gin_terminator_str, GIN_TERM_NONE_STR), +#if OPT_TOOLBAR + Wres(XtNmenuBar, XtCMenuBar, tek.tb_info.menu_bar, 0), + Ires(XtNmenuHeight, XtCMenuHeight, tek.tb_info.menu_height, 25), +#endif +}; + +static IChar Tinput(TekWidget /* tw */ ); +static int getpoint(TekWidget /* tw */ ); +static void TCursorBack(TekWidget /* tw */ ); +static void TCursorDown(TekWidget /* tw */ ); +static void TCursorForward(TekWidget /* tw */ ); +static void TCursorUp(TekWidget /* tw */ ); +static void TekBackground(TekWidget /* tw */ , + TScreen * /* screen */ ); +static void TekResize(Widget /* w */ ); +static void TekDraw(TekWidget /* tw */ , + int /* x */ , + int /* y */ ); +static void TekEnq(TekWidget /* tw */ , + unsigned /* status */ , + int /* x */ , + int /* y */ ); +static void TekFlush(TekWidget /* tw */ ); +static void TekInitialize(Widget /* request */ , + Widget /* wnew */ , + ArgList /* args */ , + Cardinal * /* num_args */ ); +static void TekPage(TekWidget /* tw */ ); +static void TekRealize(Widget /* gw */ , + XtValueMask * /* valuemaskp */ , + XSetWindowAttributes * /* values */ ); + +static WidgetClassRec tekClassRec = +{ + { +/* core_class fields */ + (WidgetClass) & widgetClassRec, /* superclass */ + MY_CLASS, /* class_name */ + sizeof(TekWidgetRec), /* widget_size */ + NULL, /* class_initialize */ + NULL, /* class_part_initialize */ + False, /* class_inited */ + TekInitialize, /* initialize */ + NULL, /* initialize_hook */ + TekRealize, /* realize */ + actionsList, /* actions */ + XtNumber(actionsList), /* num_actions */ + resources, /* resources */ + XtNumber(resources), /* num_resources */ + NULLQUARK, /* xrm_class */ + True, /* compress_motion */ + True, /* compress_exposure */ + True, /* compress_enterleave */ + False, /* visible_interest */ + NULL, /* destroy */ + TekResize, /* resize */ + TekExpose, /* expose */ + NULL, /* set_values */ + NULL, /* set_values_hook */ + XtInheritSetValuesAlmost, /* set_values_almost */ + NULL, /* get_values_hook */ + NULL, /* accept_focus */ + XtVersion, /* version */ + NULL, /* callback_offsets */ + defaultTranslations, /* tm_table */ + XtInheritQueryGeometry, /* query_geometry */ + XtInheritDisplayAccelerator, /* display_accelerator */ + NULL /* extension */ + } +}; +WidgetClass tekWidgetClass = (WidgetClass) & tekClassRec; + +static Bool Tfailed = False; + +/* + * TekInit/TekRun are called after the VT100 widget has been initialized, but + * may be before VT100 is realized, depending upon whether Tek4014 is the + * first window to be shown. + */ +int +TekInit(void) +{ + Widget form_top, menu_top; + Dimension menu_high; + + if (!Tfailed + && tekWidget == 0) { + Cardinal nargs = 0; + Arg myArgs[3]; + Boolean iconic = 0; + + TRACE(("TekInit\n")); + XtSetArg(myArgs[nargs], XtNiconic, &iconic); + ++nargs; + XtGetValues(toplevel, myArgs, nargs); + + nargs = 0; + XtSetArg(myArgs[nargs], XtNiconic, iconic); + ++nargs; + XtSetArg(myArgs[nargs], XtNallowShellResize, True); + ++nargs; + XtSetArg(myArgs[nargs], XtNinput, True); + ++nargs; + + /* this causes the Initialize method to be called */ + tekshellwidget = + XtCreatePopupShell("tektronix", topLevelShellWidgetClass, + toplevel, myArgs, nargs); + + SetupMenus(tekshellwidget, &form_top, &menu_top, &menu_high); + + /* this causes the Realize method to be called */ + tekWidget = (TekWidget) + XtVaCreateManagedWidget(MY_NAME, + tekWidgetClass, form_top, +#if OPT_TOOLBAR + XtNmenuBar, menu_top, + XtNresizable, True, + XtNfromVert, menu_top, + XtNtop, XawChainTop, + XtNleft, XawChainLeft, + XtNright, XawChainRight, + XtNbottom, XawChainBottom, + XtNmenuHeight, menu_high, +#endif + (XtPointer) 0); +#if OPT_TOOLBAR + ShowToolbar(resource.toolBar); +#endif + } + return (!Tfailed); +} + +/* + * If we haven't allocated the PtyData struct, do so. + */ +static int +TekPtyData(void) +{ + if (Tpushb == 0 && !Tfailed) { + if ((Tpushb = TypeMallocN(Char, 10)) == NULL + || (Tline = TypeMallocN(XSegment, MAX_VTX)) == NULL) { + xtermWarning("Not enough core for Tek mode\n"); + free(Tpushb); + Tfailed = True; + } + } + return (Tfailed ? 0 : 1); +} + +static void +Tekparse(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + TScreen *screen = TScreenOf(tw->vt); + int x, y; + IChar ch; + int nextstate; + + for (;;) { + IChar c = input(); + /* + * The parsing tables all have 256 entries. If we're supporting + * wide characters, we handle them by treating them the same as + * printing characters. + */ +#if OPT_WIDE_CHARS + if (c > 255) { + nextstate = (Tparsestate == Talptable) + ? CASE_PRINT + : CASE_IGNORE; + } else +#endif + nextstate = Tparsestate[c]; + TRACE(("Tekparse %04X -> %d\n", c, nextstate)); + + switch (nextstate) { + case CASE_REPORT: + TRACE(("case: report address\n")); + if (tekscr->TekGIN) { + TekGINoff(tw); + TekEnqMouse(tw, 0); + } else { + c = 064; /* has hard copy unit */ + if (tekscr->margin == MARGIN2) + c |= 02; + TekEnq(tw, c, tekscr->cur_X, tekscr->cur_Y); + } + TekRecord->ptr[-1] = ANSI_NAK; /* remove from recording */ + Tparsestate = curstate; + break; + + case CASE_VT_MODE: + TRACE(("case: special return to vt102 mode\n")); + Tparsestate = curstate; + TekRecord->ptr[-1] = ANSI_NAK; /* remove from recording */ + FlushLog(tw->vt); + return; + + case CASE_SPT_STATE: + TRACE(("case: Enter Special Point Plot mode\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + Tparsestate = curstate = Tspttable; + break; + + case CASE_GIN: + TRACE(("case: Do Tek GIN mode\n")); + tekscr->TekGIN = &TekRecord->ptr[-1]; + /* Set cross-hair cursor raster array */ + if ((GINcursor = + make_colored_cursor(XC_tcross, + T_COLOR(screen, MOUSE_FG), + T_COLOR(screen, MOUSE_BG))) != 0) { + XDefineCursor(XtDisplay(tw), TWindow(tekscr), + GINcursor); + } + Tparsestate = Tbyptable; /* Bypass mode */ + break; + + case CASE_BEL: + TRACE(("case: BEL\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + if (!tekRefreshList) + Bell(tw->vt, XkbBI_TerminalBell, 0); + Tparsestate = curstate; /* clear bypass condition */ + break; + + case CASE_BS: + TRACE(("case: BS\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + Tparsestate = curstate; /* clear bypass condition */ + TCursorBack(tw); + break; + + case CASE_PT_STATE: + TRACE(("case: Enter Tek Point Plot mode\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + Tparsestate = curstate = Tpttable; + break; + + case CASE_PLT_STATE: + TRACE(("case: Enter Tek Plot mode\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + Tparsestate = curstate = Tplttable; + if ((c = input()) == ANSI_BEL) + tekscr->pen = PENDOWN; + else { + unput(c); + tekscr->pen = PENUP; + } + break; + + case CASE_TAB: + TRACE(("case: HT\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + Tparsestate = curstate; /* clear bypass condition */ + TCursorForward(tw); + break; + + case CASE_IPL_STATE: + TRACE(("case: Enter Tek Incremental Plot mode\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + Tparsestate = curstate = Tipltable; + break; + + case CASE_ALP_STATE: + TRACE(("case: Enter Tek Alpha mode from any other mode\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + /* if in one of graphics states, move alpha cursor */ + if (nplot > 0) /* flush line VTbuffer */ + TekFlush(tw); + Tparsestate = curstate = Talptable; + break; + + case CASE_UP: + TRACE(("case: cursor up\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + Tparsestate = curstate; /* clear bypass condition */ + TCursorUp(tw); + break; + + case CASE_COPY: + TRACE(("case: make copy\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + TekCopy(tw); + TekRecord->ptr[-1] = ANSI_NAK; /* remove from recording */ + Tparsestate = curstate; /* clear bypass condition */ + break; + + case CASE_PAGE: + TRACE(("case: Page Function\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + TekPage(tw); /* clear bypass condition */ + break; + + case CASE_BES_STATE: + TRACE(("case: Byp: an escape char\n")); + Tparsestate = Tbestable; + break; + + case CASE_BYP_STATE: + TRACE(("case: set bypass condition\n")); + Tparsestate = Tbyptable; + break; + + case CASE_IGNORE: + TRACE(("case: Esc: totally ignore CR, ESC, LF, ~\n")); + break; + + case CASE_ASCII: + TRACE(("case: Select ASCII char set\n")); + /* ignore for now */ + Tparsestate = curstate; + break; + + case CASE_APL: + TRACE(("case: Select APL char set\n")); + /* ignore for now */ + Tparsestate = curstate; + break; + + case CASE_CHAR_SIZE: + TRACE(("case: character size selector\n")); + TekSetFontSize(tw, False, (int) (c & 03)); + Tparsestate = curstate; + break; + + case CASE_BEAM_VEC: + TRACE(("case: beam and vector selector\n")); + /* only line types */ + c = (IChar) (c & LINEMASK); + if (c != tekscr->cur.linetype) { + if (nplot > 0) + TekFlush(tw); + if (c <= TEKNUMLINES) + tekscr->cur.linetype = c; + } + Tparsestate = curstate; + break; + + case CASE_CURSTATE: + Tparsestate = curstate; + break; + + case CASE_PENUP: + TRACE(("case: Ipl: penup\n")); + tekscr->pen = PENUP; + break; + + case CASE_PENDOWN: + TRACE(("case: Ipl: pendown\n")); + tekscr->pen = PENDOWN; + break; + + case CASE_IPL_POINT: + TRACE(("case: Ipl: point\n")); + x = tekscr->cur_X; + y = tekscr->cur_Y; + if (c & NORTH) + y++; + else if (c & SOUTH) + y--; + if (c & EAST) + x++; + else if (c & WEST) + x--; + if (tekscr->pen == PENDOWN) + TekDraw(tw, x, y); + else + TekMove(tw, x, y); + break; + + case CASE_PLT_VEC: + TRACE(("case: Plt: vector\n")); + unput(c); + if (getpoint(tw)) { + if (tekscr->pen == PENDOWN) { + TekDraw(tw, tekscr->cur.x, tekscr->cur.y); + } else { + TekMove(tw, tekscr->cur.x, tekscr->cur.y); + } + tekscr->pen = PENDOWN; + } + break; + + case CASE_PT_POINT: + TRACE(("case: Pt: point\n")); + unput(c); + if (getpoint(tw)) { + TekMove(tw, tekscr->cur.x, tekscr->cur.y); + TekDraw(tw, tekscr->cur.x, tekscr->cur.y); + } + break; + + case CASE_SPT_POINT: + TRACE(("case: Spt: point\n")); + /* ignore intensity character in c */ + if (getpoint(tw)) { + TekMove(tw, tekscr->cur.x, tekscr->cur.y); + TekDraw(tw, tekscr->cur.x, tekscr->cur.y); + } + break; + + case CASE_CR: + TRACE(("case: CR\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + if (nplot > 0) /* flush line VTbuffer */ + TekFlush(tw); + tekscr->cur_X = tekscr->margin == MARGIN1 ? 0 : + TEKWIDTH / 2; + Tparsestate = curstate = Talptable; + break; + + case CASE_ESC_STATE: + TRACE(("case: ESC\n")); + Tparsestate = Tesctable; + break; + + case CASE_LF: + TRACE(("case: LF\n")); + if (tekscr->TekGIN) + TekGINoff(tw); + TCursorDown(tw); + if (!tekRefreshList) + do_xevents(tw->vt); + break; + + case CASE_SP: + TRACE(("case: SP\n")); + TCursorForward(tw); + break; + + case CASE_PRINT: + TRACE(("case: printable character\n")); + ch = c; + x = (int) ScaledX(tw, tekscr->cur_X); + y = (int) ScaledY(tw, tekscr->cur_Y); + +#if OPT_WIDE_CHARS + if (screen->wide_chars + && (ch > 255)) { + XChar2b sbuf; + sbuf.byte2 = LO_BYTE(ch); + sbuf.byte1 = HI_BYTE(ch); + XDrawImageString16(XtDisplay(tw), + TWindow(tekscr), + tekscr->TnormalGC, + x, + y, + &sbuf, + 1); + } else +#endif + { + char ch2 = (char) ch; + XDrawString(XtDisplay(tw), + TWindow(tekscr), + tekscr->TnormalGC, + x, + y, + &ch2, + 1); + } + TCursorForward(tw); + break; + case CASE_OSC: + /* FIXME: someone should disentangle the input queues + * of this code so that it can be state-driven. + */ + TRACE(("case: do osc escape\n")); + { + /* + * do_osc() can call TekExpose(), which calls TekRefresh(), + * and sends us recurring here - don't do that... + */ + static int nested; + + Char buf2[512]; + IChar c2; + size_t len = 0; + while ((c2 = input()) != ANSI_BEL) { + if (!isprint((int) (c2 & 0x7f)) + || len + 2 >= (int) sizeof(buf2)) + break; + buf2[len++] = (Char) c2; + } + buf2[len] = 0; + if (!nested++) { + if (c2 == ANSI_BEL) + do_osc(tw->vt, buf2, len, ANSI_BEL); + } + --nested; + } + Tparsestate = curstate; + break; + } + } +} + +static int rcnt; +static char *rptr; +static PtySelect Tselect_mask; + +static IChar +Tinput(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + TScreen *screen = TScreenOf(tw->vt); + TekLink *tek; + + if (Tpushback > Tpushb) + return (*--Tpushback); + if (tekRefreshList) { + if (rcnt-- > 0) + return (IChar) (*rptr++); + if ((tek = tekRefreshList->next) != 0) { + tekRefreshList = tek; + rptr = tek->data; + rcnt = tek->count - 1; + TekSetFontSize(tw, False, tek->fontsize); + return (IChar) (*rptr++); + } + tekRefreshList = (TekLink *) 0; + longjmp(Tekjump, 1); + } + again: + if (VTbuffer->next >= VTbuffer->last) { + int update = VTbuffer->update; + + if (nplot > 0) /* flush line */ + TekFlush(tw); +#ifdef VMS + Tselect_mask = pty_mask; /* force a read */ +#else /* VMS */ + XFD_COPYSET(&pty_mask, &Tselect_mask); +#endif /* VMS */ + for (;;) { +#ifdef CRAY + struct timeval crocktimeout; + crocktimeout.tv_sec = 0; + crocktimeout.tv_usec = 0; + (void) Select(max_plus1, + &Tselect_mask, NULL, NULL, + &crocktimeout); +#endif + if (readPtyData(tw->vt, &Tselect_mask, VTbuffer)) { + break; + } + if (Ttoggled && curstate == Talptable) { + TCursorToggle(tw, TOGGLE); + Ttoggled = False; + } + if (xtermAppPending() & XtIMXEvent) { +#ifdef VMS + Tselect_mask = X_mask; +#else /* VMS */ + XFD_COPYSET(&X_mask, &Tselect_mask); +#endif /* VMS */ + } else { + XFlush(XtDisplay(tw)); +#ifdef VMS + Tselect_mask = Select_mask; + +#else /* VMS */ + XFD_COPYSET(&Select_mask, &Tselect_mask); + if (Select(max_plus1, &Tselect_mask, NULL, NULL, NULL) < 0) { + if (errno != EINTR) + SysError(ERROR_TSELECT); + continue; + } +#endif /* VMS */ + } +#ifdef VMS + if (Tselect_mask & X_mask) { + xevents(tw->vt); + if (VTbuffer->update != update) + goto again; + } +#else /* VMS */ + if (FD_ISSET(ConnectionNumber(XtDisplay(tw)), &Tselect_mask)) { + xevents(tw->vt); + if (VTbuffer->update != update) + goto again; + } +#endif /* VMS */ + } + if (!Ttoggled && curstate == Talptable) { + TCursorToggle(tw, TOGGLE); + Ttoggled = True; + } + } + tek = TekRecord; + if (tek->count >= TEK_LINK_BLOCK_SIZE + || tek->fontsize != tekscr->cur.fontsize) { + if ((TekRecord = tek->next = CastMalloc(TekLink)) == 0) { + Panic("Tinput: malloc error (%d)\n", errno); + } else { + tek = tek->next; + tek->next = (TekLink *) 0; + tek->fontsize = (unsigned short) tekscr->cur.fontsize; + tek->count = 0; + tek->ptr = tek->data; + } + } + tek->count++; + + (void) morePtyData(screen, VTbuffer); + return (IChar) (*tek->ptr++ = (char) nextPtyData(screen, VTbuffer)); +} + +static void +TekClear(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + + TRACE(("TekClear\n")); + nplot = 0; + line_pt = Tline; + if (TWindow(tekscr)) + XClearWindow(XtDisplay(tw), TWindow(tekscr)); +} + +void +TekSetWinSize(TekWidget tw) +{ + if (TEK4014_ACTIVE(tw->vt)) { + TekScreen *tekscr = TekScreenOf(tw); + const struct Tek_Char *t = &TekChar[tekscr->cur.fontsize]; + int rows = THeight(tekscr) / (int) (ScaleOf(tw) * t->vsize); + int cols = TWidth(tekscr) / (int) (ScaleOf(tw) * t->hsize); + + update_winsize(TScreenOf(tw->vt)->respond, + rows, cols, + TFullHeight(tekscr), + TFullWidth(tekscr)); + } +} + +static void +compute_sizes(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + int border = 2 * BorderOf(tw); + double d; +#if OPT_TRACE + const struct Tek_Char *t = &TekChar[tekscr->cur.fontsize]; + const XFontStruct *fs = tw->tek.Tfont[tekscr->cur.fontsize]; +#endif + + /* *INDENT-EQLS* */ + TWidth(tekscr) = tw->core.width - border; + THeight(tekscr) = tw->core.height - border; + ScaleOf(tw) = (double) TWidth(tekscr) / TEKWIDTH; + + if ((d = (double) THeight(tekscr) / FULL_HEIGHT) < ScaleOf(tw)) + ScaleOf(tw) = d; + + TFullWidth(tekscr) = tw->core.width; + TFullHeight(tekscr) = tw->core.height; + + TRACE(("%s size %dx%d full %dx%d scale %.2f\n", MY_NAME, + THeight(tekscr), TWidth(tekscr), + TFullHeight(tekscr), TFullWidth(tekscr), + ScaleOf(tw))); + + /* The tek4014 fonts always look odd since their spacing is overridden to + * get the "same" size as a real Tektronix terminal. TrueType fonts for + * these small sizes would be no better... + */ + TRACE(("unscaled font %dx%d\n", t->vsize, t->hsize)); + TRACE(("scaled font %.1fx%.1f\n", d * t->vsize, d * t->hsize)); + TRACE(("actual font %dx%d\n", + fs->max_bounds.ascent + fs->max_bounds.descent, + fs->max_bounds.width)); + + TekSetWinSize(tw); +} + +static void +TekResize(Widget w) +{ + TekWidget tw = getTekWidget(w); + if (tw != 0) { + + TRACE(("TekResize {{\n")); + TekClear(tw); + + compute_sizes(tw); + + TRACE(("}} TekResize\n")); + } +} + +/*ARGSUSED*/ +void +TekExpose(Widget w, + XEvent *event GCC_UNUSED, + Region region GCC_UNUSED) +{ + TekWidget tw = getTekWidget(w); + if (tw != 0) { + TekScreen *tekscr = TekScreenOf(tw); + + TRACE(("TekExpose {{\n")); + +#ifdef lint + region = region; +#endif + if (!Ttoggled) + TCursorToggle(tw, CLEAR); + Ttoggled = True; + Tpushback = Tpushb; + tekscr->cur_X = 0; + tekscr->cur_Y = TEKHOME; + tekscr->cur = tekscr->page; + TekSetFontSize(tw, False, tekscr->cur.fontsize); + tekscr->margin = MARGIN1; + if (tekscr->TekGIN) { + tekscr->TekGIN = NULL; + TekGINoff(tw); + } + tekRefreshList = &Tek0; + rptr = tekRefreshList->data; + rcnt = tekRefreshList->count; + Tparsestate = curstate = Talptable; + TRACE(("TekExpose resets data to replay %d bytes\n", rcnt)); + first_map_occurred(); + if (!tekscr->waitrefresh) + TekRefresh(tw); + TRACE(("}} TekExpose\n")); + } +} + +void +TekRefresh(TekWidget tw) +{ + if (tw != 0) { + TScreen *screen = TScreenOf(tw->vt); + TekScreen *tekscr = TekScreenOf(tw); + static Cursor wait_cursor = None; + + if (wait_cursor == None) + wait_cursor = make_colored_cursor(XC_watch, + T_COLOR(screen, MOUSE_FG), + T_COLOR(screen, MOUSE_BG)); + XDefineCursor(XtDisplay(tw), TWindow(tekscr), wait_cursor); + XFlush(XtDisplay(tw)); + if (!setjmp(Tekjump)) + Tekparse(tw); + XDefineCursor(XtDisplay(tw), TWindow(tekscr), + (tekscr->TekGIN && GINcursor) ? GINcursor : tekscr->arrow); + } +} + +void +TekRepaint(TekWidget tw) +{ + TRACE(("TekRepaint\n")); + TekClear(tw); + TekExpose((Widget) tw, (XEvent *) NULL, (Region) NULL); +} + +static void +TekPage(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + TekLink *tek; + + TRACE(("TekPage\n")); + TekClear(tw); + tekscr->cur_X = 0; + tekscr->cur_Y = TEKHOME; + tekscr->margin = MARGIN1; + tekscr->page = tekscr->cur; + if (tekscr->TekGIN) + TekGINoff(tw); + tek = TekRecord = &Tek0; + tek->fontsize = (unsigned short) tekscr->cur.fontsize; + tek->count = 0; + tek->ptr = tek->data; + tek = tek->next; + if (tek) + do { + TekLink *tek2 = tek->next; + + free(tek); + tek = tek2; + } while (tek); + TekRecord->next = (TekLink *) 0; + tekRefreshList = (TekLink *) 0; + Ttoggled = True; + Tparsestate = curstate = Talptable; /* Tek Alpha mode */ +} + +#define EXTRABITS 017 +#define FIVEBITS 037 +#define HIBITS (FIVEBITS << SHIFTHI) +#define LOBITS (FIVEBITS << SHIFTLO) +#define SHIFTHI 7 +#define SHIFTLO 2 +#define TWOBITS 03 + +static int +getpoint(TekWidget tw) +{ + int x, y, e, lo_y = 0; + TekScreen *tekscr = TekScreenOf(tw); + + x = tekscr->cur.x; + y = tekscr->cur.y; + + for (;;) { + int c; + + if ((c = (int) input()) < ' ') { /* control character */ + unput(c); + return (0); + } + if (c < '@') { /* Hi X or Hi Y */ + if (lo_y) { /* seen a Lo Y, so this must be Hi X */ + x &= ~HIBITS; + x |= (c & FIVEBITS) << SHIFTHI; + continue; + } + /* else Hi Y */ + y &= ~HIBITS; + y |= (c & FIVEBITS) << SHIFTHI; + continue; + } + if (c < '`') { /* Lo X */ + x &= ~LOBITS; + x |= (c & FIVEBITS) << SHIFTLO; + tekscr->cur.x = x; + tekscr->cur.y = y; + return (1); /* OK */ + } + /* else Lo Y */ + if (lo_y) { /* seen a Lo Y, so other must be extra bits */ + e = (y >> SHIFTLO) & EXTRABITS; + x &= ~TWOBITS; + x |= e & TWOBITS; + y &= ~TWOBITS; + y |= (e >> SHIFTLO) & TWOBITS; + } + y &= ~LOBITS; + y |= (c & FIVEBITS) << SHIFTLO; + lo_y++; + } +} + +static void +TCursorBack(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + const struct Tek_Char *t; + int x = (tekscr->cur_X -= (t = &TekChar[tekscr->cur.fontsize])->hsize); + + if (((tekscr->margin == MARGIN1) && (x < 0)) + || ((tekscr->margin == MARGIN2) && (x < TEKWIDTH / 2))) { + int l = ((tekscr->cur_Y + (t->vsize - 1)) / t->vsize + 1); + if (l >= t->nlines) { + tekscr->margin = !tekscr->margin; + l = 0; + } + tekscr->cur_Y = l * t->vsize; + tekscr->cur_X = (t->charsperline - 1) * t->hsize; + } +} + +static void +TCursorForward(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + const struct Tek_Char *t = &TekChar[tekscr->cur.fontsize]; + + if ((tekscr->cur_X += t->hsize) > TEKWIDTH) { + int l = (tekscr->cur_Y / t->vsize - 1); + if (l < 0) { + tekscr->margin = !tekscr->margin; + l = t->nlines - 1; + } + tekscr->cur_Y = l * t->vsize; + tekscr->cur_X = tekscr->margin == MARGIN1 ? 0 : TEKWIDTH / 2; + } +} + +static void +TCursorUp(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + const struct Tek_Char *t; + int l; + + t = &TekChar[tekscr->cur.fontsize]; + + if ((l = (tekscr->cur_Y + (t->vsize - 1)) / t->vsize + 1) >= t->nlines) { + l = 0; + if ((tekscr->margin = !tekscr->margin) != MARGIN1) { + if (tekscr->cur_X < TEKWIDTH / 2) + tekscr->cur_X += TEKWIDTH / 2; + } else if (tekscr->cur_X >= TEKWIDTH / 2) + tekscr->cur_X -= TEKWIDTH / 2; + } + tekscr->cur_Y = l * t->vsize; +} + +static void +TCursorDown(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + const struct Tek_Char *t; + int l; + + t = &TekChar[tekscr->cur.fontsize]; + + if ((l = tekscr->cur_Y / t->vsize - 1) < 0) { + l = t->nlines - 1; + if ((tekscr->margin = !tekscr->margin) != MARGIN1) { + if (tekscr->cur_X < TEKWIDTH / 2) + tekscr->cur_X += TEKWIDTH / 2; + } else if (tekscr->cur_X >= TEKWIDTH / 2) + tekscr->cur_X -= TEKWIDTH / 2; + } + tekscr->cur_Y = l * t->vsize; +} + +static void +AddToDraw(TekWidget tw, int x1, int y1, int x2, int y2) +{ + XSegment *lp; + + TRACE(("AddToDraw (%d,%d) (%d,%d)\n", x1, y1, x2, y2)); + if (nplot >= MAX_PTS) { + TekFlush(tw); + } + lp = line_pt++; + lp->x1 = (short) ScaledX(tw, x1); + lp->y1 = (short) ScaledY(tw, y1); + lp->x2 = (short) ScaledX(tw, x2); + lp->y2 = (short) ScaledY(tw, y2); + nplot++; + TRACE(("...AddToDraw %d points\n", nplot)); +} + +static void +TekDraw(TekWidget tw, int x, int y) +{ + TekScreen *tekscr = TekScreenOf(tw); + + if (nplot == 0 || T_lastx != tekscr->cur_X || T_lasty != tekscr->cur_Y) { + /* + * We flush on each unconnected line segment if the line + * type is not solid. This solves a bug in X when drawing + * points while the line type is not solid. + */ + if (nplot > 0 && tekscr->cur.linetype != SOLIDLINE) + TekFlush(tw); + } + AddToDraw(tw, tekscr->cur_X, tekscr->cur_Y, x, y); + T_lastx = tekscr->cur_X = x; + T_lasty = tekscr->cur_Y = y; +} + +static void +TekFlush(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + + TRACE(("TekFlush\n")); + XDrawSegments(XtDisplay(tw), TWindow(tekscr), + ((tekscr->cur.linetype == SOLIDLINE) + ? tekscr->TnormalGC + : tekscr->linepat[tekscr->cur.linetype - 1]), + Tline, nplot); + nplot = 0; + line_pt = Tline; +} + +void +TekGINoff(TekWidget tw) +{ + TekScreen *tekscr = TekScreenOf(tw); + + TRACE(("TekGINoff\n")); + XDefineCursor(XtDisplay(tw), TWindow(tekscr), tekscr->arrow); + if (GINcursor) + XFreeCursor(XtDisplay(tw), GINcursor); + if (tekscr->TekGIN) { + *tekscr->TekGIN = ANSI_CAN; /* modify recording */ + tekscr->TekGIN = NULL; + } +} + +void +TekEnqMouse(TekWidget tw, int c) /* character pressed */ +{ + TekScreen *tekscr = TekScreenOf(tw); + int mousex, mousey, rootx, rooty; + unsigned int mask; /* XQueryPointer */ + Window root, subw; + + TRACE(("TekEnqMouse\n")); + XQueryPointer( + XtDisplay(tw), TWindow(tekscr), + &root, &subw, + &rootx, &rooty, + &mousex, &mousey, + &mask); + if ((mousex = (int) ((mousex - BorderOf(tw)) / ScaleOf(tw))) < 0) + mousex = 0; + else if (mousex >= TEKWIDTH) + mousex = TEKWIDTH - 1; + if ((mousey = (int) BottomY((mousey - BorderOf(tw)) / ScaleOf(tw))) < 0) + mousey = 0; + else if (mousey >= TEKHEIGHT) + mousey = TEKHEIGHT - 1; + TekEnq(tw, (unsigned) c, mousex, mousey); +} + +static void +TekEnq(TekWidget tw, + unsigned status, + int x, + int y) +{ + TScreen *screen = TScreenOf(tw->vt); + TekScreen *tekscr = TekScreenOf(tw); + Char cplot[7]; + int len = 5; + int adj = (status != 0) ? 0 : 1; + + TRACE(("TekEnq\n")); + cplot[0] = (Char) status; + /* Translate x and y to Tektronix code */ + cplot[1] = (Char) (040 | ((x >> SHIFTHI) & FIVEBITS)); + cplot[2] = (Char) (040 | ((x >> SHIFTLO) & FIVEBITS)); + cplot[3] = (Char) (040 | ((y >> SHIFTHI) & FIVEBITS)); + cplot[4] = (Char) (040 | ((y >> SHIFTLO) & FIVEBITS)); + + if (tekscr->gin_terminator != GIN_TERM_NONE) + cplot[len++] = '\r'; + if (tekscr->gin_terminator == GIN_TERM_EOT) + cplot[len++] = '\004'; +#ifdef VMS + tt_write(cplot + adj, len - adj); +#else /* VMS */ + v_write(screen->respond, cplot + adj, (unsigned) (len - adj)); +#endif /* VMS */ +} + +void +TekRun(void) +{ + XtermWidget xw = term; + + assert(xw != 0); + if (tekWidget == 0) { + TekInit(); + } + if (tekWidget != 0) { + TRACE(("TekRun ...\n")); + + if (!TEK4014_SHOWN(xw)) { + set_tek_visibility(True); + } + update_vttekmode(); + update_vtshow(); + update_tekshow(); + set_tekhide_sensitivity(); + + Tpushback = Tpushb; + Ttoggled = True; + if (!setjmp(Tekend)) + Tekparse(tekWidget); + if (!Ttoggled) { + TCursorToggle(tekWidget, TOGGLE); + Ttoggled = True; + } + TEK4014_ACTIVE(xw) = False; + xtermSetWinSize(xw); + } else { + TEK4014_ACTIVE(xw) = False; + if (VWindow(TScreenOf(xw)) == 0) { + Exit(ERROR_TINIT); + } + } +} + +#define DOTTED_LENGTH 2 +#define DOT_DASHED_LENGTH 4 +#define SHORT_DASHED_LENGTH 2 +#define LONG_DASHED_LENGTH 2 + +static const int dash_length[TEKNUMLINES] = +{ + DOTTED_LENGTH, + DOT_DASHED_LENGTH, + SHORT_DASHED_LENGTH, + LONG_DASHED_LENGTH, +}; + +static _Xconst char dotted[DOTTED_LENGTH] = +{3, 1}; +static _Xconst char dot_dashed[DOT_DASHED_LENGTH] = +{3, 4, 3, 1}; +static _Xconst char short_dashed[SHORT_DASHED_LENGTH] = +{4, 4}; +static _Xconst char long_dashed[LONG_DASHED_LENGTH] = +{4, 7}; + +static _Xconst char *dashes[TEKNUMLINES] = +{ + dotted, + dot_dashed, + short_dashed, + long_dashed, +}; + +/* + * The following functions are called to initialize and realize the tekWidget + */ +static void +TekInitialize(Widget wrequest, + Widget new_arg, + ArgList args, + Cardinal *num_args) +{ + XtermWidget xw = term; + TScreen *vtscr = TScreenOf(xw); + + TekWidget request = (TekWidget) wrequest; + TekWidget wnew = (TekWidget) new_arg; + + Widget tekparent = SHELL_OF(wnew); + TekScreen *tekscr = TekScreenOf((TekWidget) wnew); + + int i; + int border; + int pr; + int winX, winY; + unsigned min_width, min_height; + unsigned width, height; + char Tdefault[32]; + + (void) args; + (void) num_args; + + TRACE(("TekInitialize {{\n")); + memset(tekscr, 0, sizeof(*tekscr)); + + /* + * Eliminate 'term' as global from other functions. + */ + wnew->vt = xw; + border = 2 * BorderOf(wnew); + TRACE(("... border*2: %d\n", border)); + + /* look for focus related events on the shell, because we need + * to care about the shell's border being part of our focus. + */ + XtAddEventHandler(tekparent, EnterWindowMask, False, + HandleEnterWindow, (Opaque) 0); + XtAddEventHandler(tekparent, LeaveWindowMask, False, + HandleLeaveWindow, (Opaque) 0); + XtAddEventHandler(tekparent, FocusChangeMask, False, + HandleFocusChange, (Opaque) 0); + XtAddEventHandler(new_arg, PropertyChangeMask, False, + HandleBellPropertyChange, (Opaque) 0); + +#ifndef NO_ACTIVE_ICON + tekscr->whichTwin = &(tekscr->fullTwin); +#endif /* NO_ACTIVE_ICON */ + + init_Sres(tek.initial_font); + init_Sres(tek.gin_terminator_str); +#if OPT_TOOLBAR + init_Ires(tek.tb_info.menu_height); + wnew->tek.tb_info.menu_bar = request->tek.tb_info.menu_bar; +#endif + + BorderPixel(wnew) = BorderPixel(xw); + + tekscr->arrow = make_colored_cursor(XC_left_ptr, + T_COLOR(vtscr, MOUSE_FG), + T_COLOR(vtscr, MOUSE_BG)); + + for (i = 0; i < TEKNUMFONTS; i++) { + if (!wnew->tek.Tfont[i]) { + wnew->tek.Tfont[i] = XQueryFont(XtDisplay(wnew), DefaultGCID(wnew)); + } + if (wnew->tek.Tfont[i]) { + TRACE(("Tfont[%d] %dx%d\n", + i, + wnew->tek.Tfont[i]->max_bounds.width, + wnew->tek.Tfont[i]->ascent + + wnew->tek.Tfont[i]->descent)); + wnew->tek.tobaseline[i] = wnew->tek.Tfont[i]->ascent; + } else { + TRACE(("Tfont[%d] disabled\n", i)); + SetItemSensitivity(tekMenuEntries[i].widget, False); + } + } + + if (xw->misc.T_geometry == NULL) { + int def_width, def_height; + + if (xw->misc.tekSmall) { + def_width = TEKMINWIDTH; + def_height = TEKMINHEIGHT; + } else { + def_width = TEKDEFWIDTH; + def_height = TEKDEFHEIGHT; + } + sprintf(Tdefault, "=%dx%d", def_width + border, def_height + border); + xw->misc.T_geometry = Tdefault; + } + + winX = 1; + winY = 1; + width = (unsigned) (TEKDEFWIDTH + border); + height = (unsigned) (TEKDEFHEIGHT + border); + min_width = (unsigned) (TEKMINWIDTH + border); + min_height = (unsigned) (TEKMINHEIGHT + border); + + TRACE(("parsing T_geometry %s\n", NonNull(xw->misc.T_geometry))); + pr = XParseGeometry(xw->misc.T_geometry, + &winX, + &winY, + &width, + &height); + + /* window-manager hints will do this anyway... */ + if (height < min_height) { + TRACE(("... override height from %d to %d\n", height, min_height)); + height = min_height; + } + if (width < min_width) { + TRACE(("... override width from %d to %d\n", width, min_width)); + width = min_width; + } + + TRACE(("... position %d,%d size %dx%d\n", winY, winX, height, width)); + if ((pr & XValue) && (pr & XNegative)) { + winX += DisplayWidth(XtDisplay(wnew), DefaultScreen(XtDisplay(wnew))) + - (int) width - (BorderWidth(SHELL_OF(xw)) * 2); + } + if ((pr & YValue) && (pr & YNegative)) { + winY += DisplayHeight(XtDisplay(wnew), DefaultScreen(XtDisplay(wnew))) + - (int) height - (BorderWidth(SHELL_OF(xw)) * 2); + } + + /* set up size hints */ + + /* *INDENT-EQLS* */ + wnew->hints.min_width = (int) min_width; + wnew->hints.min_height = (int) min_height; + wnew->hints.width_inc = 1; + wnew->hints.height_inc = 1; + wnew->hints.flags = PMinSize | PResizeInc; + wnew->hints.x = winX; + wnew->hints.y = winY; + + if ((XValue & pr) || (YValue & pr)) { + wnew->hints.flags |= USSize | USPosition; + wnew->hints.flags |= PWinGravity; + switch (pr & (XNegative | YNegative)) { + case 0: + wnew->hints.win_gravity = NorthWestGravity; + break; + case XNegative: + wnew->hints.win_gravity = NorthEastGravity; + break; + case YNegative: + wnew->hints.win_gravity = SouthWestGravity; + break; + default: + wnew->hints.win_gravity = SouthEastGravity; + break; + } + } else { + /* set a default size, but do *not* set position */ + wnew->hints.flags |= PSize; + } + wnew->hints.width = (int) width; + wnew->hints.height = (int) height; + if ((WidthValue & pr) || (HeightValue & pr)) + wnew->hints.flags |= USSize; + else + wnew->hints.flags |= PSize; + + tekscr->cur.fontsize = TEK_FONT_LARGE; + if (wnew->tek.initial_font) { + int result = TekGetFontSize(wnew->tek.initial_font); + if (result >= 0) + tekscr->cur.fontsize = result; + } + TRACE(("Tek cur.fontsize=%d\n", tekscr->cur.fontsize)); + +#define TestGIN(s) XmuCompareISOLatin1(wnew->tek.gin_terminator_str, s) + + if (TestGIN(GIN_TERM_NONE_STR) == 0) + tekscr->gin_terminator = GIN_TERM_NONE; + else if (TestGIN(GIN_TERM_CR_STR) == 0) + tekscr->gin_terminator = GIN_TERM_CR; + else if (TestGIN(GIN_TERM_EOT_STR) == 0) + tekscr->gin_terminator = GIN_TERM_EOT; + else + xtermWarning("illegal GIN terminator setting \"%s\"\n", + wnew->tek.gin_terminator_str); + TRACE(("Tek gin_terminator=%d\n", tekscr->gin_terminator)); + + TRACE(("}} TekInitialize\n")); +} + +static void +TekRealize(Widget gw, + XtValueMask * valuemaskp, + XSetWindowAttributes * values) +{ + TekWidget tw = (TekWidget) gw; + TekScreen *tekscr = TekScreenOf(tw); + TScreen *vtscr = TScreenOf(tw->vt); + + int i; + TekLink *tek; + XGCValues gcv; + unsigned width, height; + unsigned long TEKgcFontMask; + + TRACE(("TekRealize {{\n")); + + if (!TekPtyData()) + return; + + /* use values from TekInitialize... */ + height = (unsigned) tw->hints.height; + width = (unsigned) tw->hints.width; + + (void) REQ_RESIZE((Widget) tw, + (Dimension) width, (Dimension) height, + &tw->core.width, &tw->core.height); + + /* XXX This is bogus. We are parsing geometries too late. This + * is information that the shell widget ought to have before we get + * realized, so that it can do the right thing. + */ + if (tw->hints.flags & USPosition) + XMoveWindow(XtDisplay(tw), TShellWindow, tw->hints.x, tw->hints.y); + + XSetWMNormalHints(XtDisplay(tw), TShellWindow, &tw->hints); + XFlush(XtDisplay(tw)); /* get it out to window manager */ + + values->win_gravity = NorthWestGravity; + values->background_pixel = T_COLOR(vtscr, TEK_BG); + + XtWindow(tw) = TWindow(tekscr) = + XCreateWindow(XtDisplay(tw), + VShellWindow(tw), + tw->core.x, tw->core.y, + tw->core.width, tw->core.height, + BorderWidth(tw), + (int) tw->core.depth, + InputOutput, CopyFromParent, + ((*valuemaskp) | CWBackPixel | CWWinGravity), + values); + + compute_sizes(tw); + + gcv.graphics_exposures = True; /* default */ + gcv.font = tw->tek.Tfont[tekscr->cur.fontsize]->fid; + gcv.foreground = T_COLOR(vtscr, TEK_FG); + gcv.background = T_COLOR(vtscr, TEK_BG); + + /* if font wasn't successfully opened, then gcv.font will contain + the Default GC's ID, meaning that we must use the server default font. + */ + TEKgcFontMask = (unsigned long) ((gcv.font == DefaultGCID(tw)) + ? 0 + : GCFont); + tekscr->TnormalGC = XCreateGC(XtDisplay(tw), TWindow(tekscr), + (TEKgcFontMask | GCGraphicsExposures | + GCForeground | GCBackground), + &gcv); + + gcv.function = GXinvert; + gcv.plane_mask = (T_COLOR(vtscr, TEK_BG) ^ + T_COLOR(vtscr, TEK_CURSOR)); + gcv.join_style = JoinMiter; /* default */ + gcv.line_width = 1; + tekscr->TcursorGC = XCreateGC(XtDisplay(tw), TWindow(tekscr), + (GCFunction | GCPlaneMask), &gcv); + + gcv.foreground = T_COLOR(vtscr, TEK_FG); + gcv.line_style = LineOnOffDash; + gcv.line_width = 0; + for (i = 0; i < TEKNUMLINES; i++) { + tekscr->linepat[i] = XCreateGC(XtDisplay(tw), TWindow(tekscr), + (GCForeground | GCLineStyle), &gcv); + XSetDashes(XtDisplay(tw), tekscr->linepat[i], 0, + dashes[i], dash_length[i]); + } + + TekBackground(tw, vtscr); + + tekscr->margin = MARGIN1; /* Margin 1 */ + tekscr->TekGIN = False; /* GIN off */ + + XDefineCursor(XtDisplay(tw), TWindow(tekscr), tekscr->arrow); + + { /* there's gotta be a better way... */ + static char empty_string[1]; + static Arg args[] = + { + {XtNtitle, (XtArgVal) NULL}, + {XtNiconName, (XtArgVal) NULL}, + }; + char *icon_name = NULL; + char *title = NULL; + char *tek_icon_name = NULL; + char *tek_title = NULL; + + args[0].value = (XtArgVal) & icon_name; + args[1].value = (XtArgVal) & title; + XtGetValues(SHELL_OF(tw), args, 2); + + if (IsEmpty(title)) { + title = empty_string; + } + + if (IsEmpty(icon_name)) { + icon_name = empty_string; + } + + TRACE(("TekShell title='%s', iconName='%s'\n", title, icon_name)); + tek_icon_name = XtMalloc((Cardinal) strlen(icon_name) + 7); + strcpy(tek_icon_name, icon_name); + strcat(tek_icon_name, "(Tek)"); + tek_title = XtMalloc((Cardinal) strlen(title) + 7); + strcpy(tek_title, title); + strcat(tek_title, "(Tek)"); + args[0].value = (XtArgVal) tek_icon_name; + args[1].value = (XtArgVal) tek_title; + TRACE(("Tek title='%s', iconName='%s'\n", tek_title, tek_icon_name)); + XtSetValues(SHELL_OF(tw), args, 2); + XtFree(tek_icon_name); + XtFree(tek_title); + } + + /* *INDENT-EQLS* */ + tek = TekRecord = &Tek0; + tek->next = (TekLink *) 0; + tek->fontsize = (unsigned short) tekscr->cur.fontsize; + tek->count = 0; + tek->ptr = tek->data; + Tpushback = Tpushb; + tekscr->cur_X = 0; + tekscr->cur_Y = TEKHOME; + line_pt = Tline; + Ttoggled = True; + tekscr->page = tekscr->cur; + + TRACE(("}} TekRealize\n")); +} + +int +TekGetFontSize(const char *param) +{ + int result; + + if (XmuCompareISOLatin1(param, "l") == 0 || + XmuCompareISOLatin1(param, "large") == 0) + result = TEK_FONT_LARGE; + else if (XmuCompareISOLatin1(param, "2") == 0 || + XmuCompareISOLatin1(param, "two") == 0) + result = TEK_FONT_2; + else if (XmuCompareISOLatin1(param, "3") == 0 || + XmuCompareISOLatin1(param, "three") == 0) + result = TEK_FONT_3; + else if (XmuCompareISOLatin1(param, "s") == 0 || + XmuCompareISOLatin1(param, "small") == 0) + result = TEK_FONT_SMALL; + else + result = -1; + + return result; +} + +void +TekSetFontSize(TekWidget tw, Bool fromMenu, int newitem) +{ + if (tw != 0) { + TekScreen *tekscr = TekScreenOf(tw); + int oldsize = tekscr->cur.fontsize; + int newsize = MI2FS(newitem); + Font fid; + + TRACE(("TekSetFontSize(%d) size %d ->%d\n", newitem, oldsize, newsize)); + if (newsize < 0 || newsize >= TEKNUMFONTS) { + Bell(tw->vt, XkbBI_MinorError, 0); + } else if (oldsize != newsize) { + if (!Ttoggled) + TCursorToggle(tw, TOGGLE); + set_tekfont_menu_item(oldsize, False); + + tekscr->cur.fontsize = newsize; + TekSetWinSize(tw); + if (fromMenu) + tekscr->page.fontsize = newsize; + + fid = tw->tek.Tfont[newsize]->fid; + if (fid == DefaultGCID(tw)) { + /* we didn't succeed in opening a real font + for this size. Instead, use server default. */ + XCopyGC(XtDisplay(tw), + DefaultGC(XtDisplay(tw), DefaultScreen(XtDisplay(tw))), + GCFont, tekscr->TnormalGC); + } else { + XSetFont(XtDisplay(tw), tekscr->TnormalGC, fid); + } + + set_tekfont_menu_item(newsize, True); + if (!Ttoggled) + TCursorToggle(tw, TOGGLE); + + if (fromMenu) { + /* we'll get an exposure event after changing fontsize, so we + * have to clear the screen to avoid painting over the previous + * text. + */ + TekClear(tw); + } + } + } +} + +void +ChangeTekColors(TekWidget tw, TScreen *screen, ScrnColors * pNew) +{ + if (tw && screen) { + TekScreen *tekscr = TekScreenOf(tw); + XGCValues gcv; + int i; + + if (COLOR_DEFINED(pNew, TEK_FG)) { + T_COLOR(screen, TEK_FG) = COLOR_VALUE(pNew, TEK_FG); + TRACE(("... TEK_FG: %#lx\n", T_COLOR(screen, TEK_FG))); + } + if (COLOR_DEFINED(pNew, TEK_BG)) { + T_COLOR(screen, TEK_BG) = COLOR_VALUE(pNew, TEK_BG); + TRACE(("... TEK_BG: %#lx\n", T_COLOR(screen, TEK_BG))); + } + if (COLOR_DEFINED(pNew, TEK_CURSOR)) { + T_COLOR(screen, TEK_CURSOR) = COLOR_VALUE(pNew, TEK_CURSOR); + TRACE(("... TEK_CURSOR: %#lx\n", T_COLOR(screen, TEK_CURSOR))); + } else { + T_COLOR(screen, TEK_CURSOR) = T_COLOR(screen, TEK_FG); + TRACE(("... TEK_CURSOR: %#lx\n", T_COLOR(screen, TEK_CURSOR))); + } + + XSetForeground(XtDisplay(tw), tekscr->TnormalGC, + T_COLOR(screen, TEK_FG)); + XSetBackground(XtDisplay(tw), tekscr->TnormalGC, + T_COLOR(screen, TEK_BG)); + if (BorderPixel(tw) == T_COLOR(screen, TEK_BG)) { + BorderPixel(tw) = T_COLOR(screen, TEK_FG); + BorderPixel(XtParent(tw)) = T_COLOR(screen, TEK_FG); + if (XtWindow(XtParent(tw))) + XSetWindowBorder(XtDisplay(tw), + XtWindow(XtParent(tw)), + BorderPixel(tw)); + } + + for (i = 0; i < TEKNUMLINES; i++) { + XSetForeground(XtDisplay(tw), tekscr->linepat[i], + T_COLOR(screen, TEK_FG)); + } + + gcv.plane_mask = (T_COLOR(screen, TEK_BG) ^ + T_COLOR(screen, TEK_CURSOR)); + XChangeGC(XtDisplay(tw), tekscr->TcursorGC, GCPlaneMask, &gcv); + TekBackground(tw, screen); + } + return; +} + +void +TekReverseVideo(XtermWidget xw, TekWidget tw) +{ + if (tw) { + TScreen *screen = TScreenOf(xw); + TekScreen *tekscr = TekScreenOf(tw); + Pixel tmp; + XGCValues gcv; + int i; + + EXCHANGE(T_COLOR(screen, TEK_FG), T_COLOR(screen, TEK_BG), tmp); + + T_COLOR(screen, TEK_CURSOR) = T_COLOR(screen, TEK_FG); + + XSetForeground(XtDisplay(tw), tekscr->TnormalGC, T_COLOR(screen, TEK_FG)); + XSetBackground(XtDisplay(tw), tekscr->TnormalGC, T_COLOR(screen, TEK_BG)); + + if (BorderPixel(tw) == T_COLOR(screen, TEK_BG)) { + BorderPixel(tw) = T_COLOR(screen, TEK_FG); + BorderPixel(XtParent(tw)) = T_COLOR(screen, TEK_FG); + if (XtWindow(XtParent(tw))) + XSetWindowBorder(XtDisplay(tw), + XtWindow(XtParent(tw)), + BorderPixel(tw)); + } + + for (i = 0; i < TEKNUMLINES; i++) { + XSetForeground(XtDisplay(tw), tekscr->linepat[i], + T_COLOR(screen, TEK_FG)); + } + + gcv.plane_mask = (T_COLOR(screen, TEK_BG) ^ + T_COLOR(screen, TEK_CURSOR)); + XChangeGC(XtDisplay(tw), tekscr->TcursorGC, GCPlaneMask, &gcv); + TekBackground(tw, screen); + } +} + +static void +TekBackground(TekWidget tw, TScreen *screen) +{ + TekScreen *tekscr = TekScreenOf(tw); + + if (TWindow(tekscr)) + XSetWindowBackground(XtDisplay(tw), TWindow(tekscr), + T_COLOR(screen, TEK_BG)); +} + +/* + * Toggles cursor on or off at cursor position in screen. + */ +void +TCursorToggle(TekWidget tw, int toggle) /* TOGGLE or CLEAR */ +{ + TekScreen *tekscr; + XtermWidget xw; + int c, x, y; + unsigned cellwidth, cellheight; + + if (tw == 0) + return; + if ((tekscr = TekScreenOf(tw)) == 0) + return; + if ((xw = tw->vt) == 0) + return; + if (!TEK4014_SHOWN(xw)) + return; + + TRACE(("TCursorToggle %s\n", (toggle == TOGGLE) ? "toggle" : "clear")); + c = tekscr->cur.fontsize; + cellwidth = (unsigned) tw->tek.Tfont[c]->max_bounds.width; + cellheight = (unsigned) (tw->tek.Tfont[c]->ascent + + tw->tek.Tfont[c]->descent); + + x = (int) ScaledX(tw, tekscr->cur_X); + y = (int) ScaledY(tw, tekscr->cur_Y) - tw->tek.tobaseline[c]; + + if (toggle == TOGGLE) { + TScreen *screen = TScreenOf(xw); + if (screen->select || screen->always_highlight) + XFillRectangle(XtDisplay(tw), TWindow(tekscr), + tekscr->TcursorGC, x, y, + cellwidth, cellheight); + else { /* fix to use different GC! */ + XDrawRectangle(XtDisplay(tw), TWindow(tekscr), + tekscr->TcursorGC, x, y, + cellwidth - 1, cellheight - 1); + } + } else { + /* Clear the entire rectangle, even though we may only + * have drawn an outline. This fits with our refresh + * scheme of redrawing the entire window on any expose + * event and is easier than trying to figure out exactly + * which part of the cursor needs to be erased. + */ + XClearArea(XtDisplay(tw), TWindow(tekscr), x, y, + cellwidth, cellheight, False); + } +} + +/* + * The Tektronix manual describes the PAGE/RESET button. For PAGE: + * Erases the display, resets to Alpha Mode and home position; + * resets to Margin 1 and cancels Bypass condition. + * For the RESET function: + * Entered with SHIFT held down; creates a "home" function, + * resetting the Terminal to initial status; does not erase. + * + * The reset done here is different, changing the modes (which changes + * the line-type and font to default values) as well as erasing the screen + * (like PAGE). + */ +void +TekSimulatePageButton(TekWidget tw, Bool reset) +{ + if (tw != 0) { + TekScreen *tekscr = TekScreenOf(tw); + + if (reset) { + memset(&tekscr->cur, 0, sizeof tekscr->cur); + } + tekRefreshList = (TekLink *) 0; + TekPage(tw); + tekscr->cur_X = 0; + tekscr->cur_Y = TEKHOME; + } +} + +/* write copy of screen to a file */ + +void +TekCopy(TekWidget tw) +{ + if (tw != 0) { + TekScreen *tekscr = TekScreenOf(tw); + TScreen *screen = TScreenOf(tw->vt); + + TekLink *Tp; + char buf[TIMESTAMP_LEN + 10]; + int tekcopyfd; + + timestamp_filename(buf, "COPY"); + if (access(buf, F_OK) >= 0 + && access(buf, W_OK) < 0) { + Bell(tw->vt, XkbBI_MinorError, 0); + return; + } +#ifndef VMS + if (access(".", W_OK) < 0) { /* can't write in directory */ + Bell(tw->vt, XkbBI_MinorError, 0); + return; + } +#endif + + tekcopyfd = open_userfile(screen->uid, screen->gid, buf, False); + if (tekcopyfd >= 0) { + char initbuf[5]; + + sprintf(initbuf, "%c%c%c%c", + ANSI_ESC, (char) (tekscr->page.fontsize + '8'), + ANSI_ESC, (char) (tekscr->page.linetype + '`')); + IGNORE_RC(write(tekcopyfd, initbuf, (size_t) 4)); + Tp = &Tek0; + do { + IGNORE_RC(write(tekcopyfd, Tp->data, (size_t) Tp->count)); + Tp = Tp->next; + } while (Tp); + close(tekcopyfd); + } + } +} + +/*ARGSUSED*/ +void +HandleGINInput(Widget w, + XEvent *event GCC_UNUSED, + String *param_list, + Cardinal *nparamsp) +{ + TekWidget tw = getTekWidget(w); + + if (tw != 0) { + TekScreen *tekscr = TekScreenOf(tw); + + if (tekscr->TekGIN && *nparamsp == 1) { + int c = param_list[0][0]; + switch (c) { + case 'l': + case 'm': + case 'r': + case 'L': + case 'M': + case 'R': + break; + default: + Bell(tw->vt, XkbBI_MinorError, 0); /* let them know they goofed */ + c = 'l'; /* provide a default */ + } + TekEnqMouse(tw, c | 0x80); + TekGINoff(tw); + } else { + Bell(tw->vt, XkbBI_MinorError, 0); + } + } +} + +/* + * Check if the current widget, or any parent, is the "tek4014" widget. + */ +TekWidget +getTekWidget(Widget w) +{ + TekWidget tw; + + if (w == 0) { + tw = (TekWidget) CURRENT_EMU(); + if (!IsTekWidget(tw)) { + tw = 0; + } + } else if (IsTekWidget(w)) { + tw = (TekWidget) w; + } else { + tw = getTekWidget(XtParent(w)); + } + TRACE2(("getTekWidget %p -> %p\n", w, tw)); + return tw; +} diff --git a/ports/xterm/xterm-359/Tekproc.o b/ports/xterm/xterm-359/Tekproc.o new file mode 100644 index 0000000000000000000000000000000000000000..495b5678c3ebe496aedd0a2999217a081126d756 GIT binary patch literal 155240 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 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/Tests b/ports/xterm/xterm-359/Tests new file mode 100644 index 0000000..0c6c889 --- /dev/null +++ b/ports/xterm/xterm-359/Tests @@ -0,0 +1,42 @@ +Tests for xterm: + +If system supports window size (i.e., some combination of SIGWINCH, +TIOCSSIZE, TIOCSWINSZ), start a full-screen program (e.g., Emacs, +Jove, vi) and resize the xterm window. The program must immediately +update its screen image for the new size. + +If compiled with -DUTMP, starting a new xterm should create a new utmp +entry. ("who" will show this info.) Exiting xterm should remove the +entry. Killing the xterm window (or other unnatural exit) should also +remove the entry. When should entries be made in the wtmp file? + +Process group stuff should be correct. + +Should work without access to /dev/tty, say started from an xdm +started from a boot-time script. + +If "xterm -help" offers the -C option, it should work. + +echo "test" > /dev/tty + +vi with lines that wrap. + +Exec'ing things other than shells. + +Another thing that has caused problems in the past is process groups, +especially w.r.t. signal propagation to the child. + +Popup menu signals: running only a shell, click on "Send INT Signal." +Do you get a new prompt from the shell? (Same as typing ^C at it.) + +Should scroll *fast* with jumpScroll enabled. + +While a mouse button is down tracing out a selection, output to the +screen should be suspended. + +Selections more than one screen long. + +start xterm running only Tek widget: "xterm -t" + + +Please add to this list if you find xterm failing in some way. diff --git a/ports/xterm/xterm-359/UXTerm.ad b/ports/xterm/xterm-359/UXTerm.ad new file mode 100644 index 0000000..a2cca85 --- /dev/null +++ b/ports/xterm/xterm-359/UXTerm.ad @@ -0,0 +1,76 @@ +! $XTermId: UXTerm.ad,v 1.13 2010/03/04 01:17:07 tom Exp $ +! ----------------------------------------------------------------------------- +! this file is part of xterm +! +! Copyright 2000-2006,2010 by Thomas E. Dickey +! +! All Rights Reserved +! +! Permission is hereby granted, free of charge, to any person obtaining a +! copy of this software and associated documentation files (the +! "Software"), to deal in the Software without restriction, including +! without limitation the rights to use, copy, modify, merge, publish, +! distribute, sublicense, and/or sell copies of the Software, and to +! permit persons to whom the Software is furnished to do so, subject to +! the following conditions: +! +! The above copyright notice and this permission notice shall be included +! in all copies or substantial portions of the Software. +! +! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +! OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +! MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +! IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +! CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +! TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +! SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +! +! Except as contained in this notice, the name(s) of the above copyright +! holders shall not be used in advertising or otherwise to promote the +! sale, use or other dealings in this Software without prior written +! authorization. +! ----------------------------------------------------------------------------- +! Use +! xterm -class UXTerm +! to set resources for UTF-8 mode with corresponding fonts. +! See the uxterm script for an example. + +#include "XTerm" + +*fontMenu.Label: Unicode Fonts +*VT100.utf8: 1 + +! This includes "XTerm-color" which includes "XTerm", which defines fonts. +! Why set them here? +! +! Here is a simple description. A technically precise one would be very long. +! When xterm starts up, it uses the +! +! *VT100.font +! +! resource, and if it is told to switch to wide-character (UTF-8) mode, it +! checks if the given font is "wide", and if not looks for the +! +! *VT100.utf8Fonts.font +! +! to obtain a wide font. A "wide" font has more than 256 glyphs. Typical +! wide fonts have 10,000 glyphs. If the original "*VT100.font" is not wide, +! and xterm can load the *VT100.utf8Fonts.font, it will use that. +! +! Making the wide fonts associated with *VT100.font in this file allows uxterm +! to skip that step. It will use the fonts that the XTerm file gives for the +! *VT100.uft8Fonts.font pattern. +*VT100.font2: -misc-fixed-medium-r-normal--8-80-75-75-c-50-iso10646-1 +*VT100.font: -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1 +*VT100.font3: -misc-fixed-medium-r-normal--14-130-75-75-c-70-iso10646-1 +*VT100.font4: -misc-fixed-medium-r-normal--13-120-75-75-c-80-iso10646-1 +*VT100.font5: -misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1 +*VT100.font6: -misc-fixed-medium-r-normal--20-200-75-75-c-100-iso10646-1 + +! Here is an alternate set of fonts with better support for bold: +!*VT100.font2: -efont-biwidth-medium-r-normal--10-100-75-75-p-50-iso10646-1 +!*VT100.font: -efont-biwidth-medium-r-normal--10-100-75-75-p-50-iso10646-1 +!*VT100.font3: -efont-biwidth-medium-r-normal--12-120-75-75-p-60-iso10646-1 +!*VT100.font4: -efont-biwidth-medium-r-normal--14-140-75-75-p-70-iso10646-1 +!*VT100.font5: -efont-biwidth-medium-r-normal--16-160-75-75-p-80-iso10646-1 +!*VT100.font6: -efont-biwidth-medium-r-normal--24-240-75-75-p-120-iso10646-1 diff --git a/ports/xterm/xterm-359/VTPrsTbl.c b/ports/xterm/xterm-359/VTPrsTbl.c new file mode 100644 index 0000000..f78b26f --- /dev/null +++ b/ports/xterm/xterm-359/VTPrsTbl.c @@ -0,0 +1,9507 @@ +/* $XTermId: VTPrsTbl.c,v 1.101 2020/06/28 23:48:39 tom Exp $ */ + +/* + * Copyright 1999-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +#include +/* *INDENT-OFF* */ + +#if !OPT_BLINK_CURS +#undef CASE_CSI_SPACE_STATE +#define CASE_CSI_SPACE_STATE CASE_CSI_IGNORE +#endif + +#if !OPT_DEC_LOCATOR +#undef CASE_DECEFR +#define CASE_DECEFR CASE_CSI_IGNORE +#undef CASE_DECELR +#define CASE_DECELR CASE_CSI_IGNORE +#undef CASE_DECSLE +#define CASE_DECSLE CASE_CSI_IGNORE +#undef CASE_DECRQLP +#define CASE_DECRQLP CASE_CSI_IGNORE +#endif + +#if !OPT_WIDE_CHARS +#undef CASE_ESC_PERCENT +#define CASE_ESC_PERCENT CASE_ESC_IGNORE +#endif + +#if !OPT_MOD_FKEYS +#undef CASE_SET_MOD_FKEYS +#define CASE_SET_MOD_FKEYS CASE_GROUND_STATE +#undef CASE_SET_MOD_FKEYS0 +#define CASE_SET_MOD_FKEYS0 CASE_GROUND_STATE +#endif + +#if !OPT_XTERM_SGR +#undef CASE_CSI_HASH_STATE +#define CASE_CSI_HASH_STATE CASE_CSI_IGNORE +#endif + +/* + * Stupid Apollo C preprocessor can't handle long lines. So... To keep + * it happy, we put each onto a separate line.... Sigh... + */ + +Const PARSE_T ansi_table[] = +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* $ % & ' */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* ( ) * + */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* , - . / */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 0 1 2 3 */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 4 5 6 7 */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 8 9 : ; */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* < = > ? */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* @ A B C */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* D E F G */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* H I J K */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* L M N O */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* P Q R S */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* T U V W */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* X Y Z [ */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* \ ] ^ _ */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* ` a b c */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* d e f g */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* h i j k */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* l m n o */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* p q r s */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* t u v w */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* x y z { */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* | } ~ DEL */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* currency yen brokenbar section */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* notsign hyphen registered macron */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* degree plusminus twosuperior threesuperior */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* acute mu paragraph periodcentered */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* cedilla onesuperior masculine guillemotright */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* onequarter onehalf threequarters questiondown */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Agrave Aacute Acircumflex Atilde */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Adiaeresis Aring AE Ccedilla */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Eth Ntilde Ograve Oacute */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* agrave aacute acircumflex atilde */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* adiaeresis aring ae ccedilla */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* egrave eacute ecircumflex ediaeresis */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* igrave iacute icircumflex idiaeresis */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* eth ntilde ograve oacute */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* ocircumflex otilde odiaeresis division */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* oslash ugrave uacute ucircumflex */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +}; + +Const PARSE_T csi_table[] = /* CSI */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_SPACE_STATE, +CASE_CSI_EX_STATE, +CASE_CSI_QUOTE_STATE, +CASE_CSI_HASH_STATE, +/* $ % & ' */ +CASE_CSI_DOLLAR_STATE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_TICK_STATE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 4 5 6 7 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 8 9 : ; */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_COLON, +CASE_ESC_SEMI, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_DEC3_STATE, +CASE_DEC2_STATE, +CASE_DEC_STATE, +/* @ A B C */ +CASE_ICH, +CASE_CUU, +CASE_CUD, +CASE_CUF, +/* D E F G */ +CASE_CUB, +CASE_CNL, +CASE_CPL, +CASE_HPA, +/* H I J K */ +CASE_CUP, +CASE_CHT, +CASE_ED, +CASE_EL, +/* L M N O */ +CASE_IL, +CASE_DL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_DCH, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SU, +/* T U V W */ +CASE_TRACK_MOUSE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_ECH, +CASE_GROUND_STATE, +CASE_CBT, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SD, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_HPA, +CASE_HPR, +CASE_REP, +CASE_DA1, +/* d e f g */ +CASE_VPA, +CASE_VPR, +CASE_CUP, +CASE_TBC, +/* h i j k */ +CASE_SET, +CASE_MC, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_RST, +CASE_SGR, +CASE_CPR, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_DECLL, +CASE_DECSTBM, +CASE_ANSI_SC, +/* t u v w */ +CASE_XTERM_WINOPS, +CASE_ANSI_RC, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_DECREQTPARM, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_SPACE_STATE, +CASE_CSI_EX_STATE, +CASE_CSI_QUOTE_STATE, +CASE_CSI_HASH_STATE, +/* currency yen brokenbar section */ +CASE_CSI_DOLLAR_STATE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_TICK_STATE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* acute mu paragraph periodcentered */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* cedilla onesuperior masculine guillemotright */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_COLON, +CASE_ESC_SEMI, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_DEC3_STATE, +CASE_DEC2_STATE, +CASE_DEC_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_ICH, +CASE_CUU, +CASE_CUD, +CASE_CUF, +/* Adiaeresis Aring AE Ccedilla */ +CASE_CUB, +CASE_CNL, +CASE_CPL, +CASE_HPA, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_CUP, +CASE_CHT, +CASE_ED, +CASE_EL, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IL, +CASE_DL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_DCH, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SU, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_TRACK_MOUSE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_ECH, +CASE_GROUND_STATE, +CASE_CBT, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SD, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_HPA, +CASE_HPR, +CASE_REP, +CASE_DA1, +/* adiaeresis aring ae ccedilla */ +CASE_VPA, +CASE_VPR, +CASE_CUP, +CASE_TBC, +/* egrave eacute ecircumflex ediaeresis */ +CASE_SET, +CASE_MC, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_RST, +CASE_SGR, +CASE_CPR, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_DECLL, +CASE_DECSTBM, +CASE_ANSI_SC, +/* ocircumflex otilde odiaeresis division */ +CASE_XTERM_WINOPS, +CASE_ANSI_RC, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_DECREQTPARM, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T csi2_table[] = /* CSI */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_SPACE_STATE, +CASE_CSI_EX_STATE, +CASE_CSI_QUOTE_STATE, +CASE_CSI_HASH_STATE, +/* $ % & ' */ +CASE_CSI_DOLLAR_STATE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_TICK_STATE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_STAR_STATE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 4 5 6 7 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 8 9 : ; */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_COLON, +CASE_ESC_SEMI, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_ICH, +CASE_CUU, +CASE_CUD, +CASE_CUF, +/* D E F G */ +CASE_CUB, +CASE_CNL, +CASE_CPL, +CASE_HPA, +/* H I J K */ +CASE_CUP, +CASE_CHT, +CASE_ED, +CASE_EL, +/* L M N O */ +CASE_IL, +CASE_DL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_DCH, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SU, +/* T U V W */ +CASE_TRACK_MOUSE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_ECH, +CASE_GROUND_STATE, +CASE_CBT, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SD, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_HPA, +CASE_HPR, +CASE_REP, +CASE_DA1, +/* d e f g */ +CASE_VPA, +CASE_VPR, +CASE_CUP, +CASE_TBC, +/* h i j k */ +CASE_SET, +CASE_MC, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_RST, +CASE_SGR, +CASE_CPR, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_DECLL, +CASE_DECSTBM, +CASE_ANSI_SC, +/* t u v w */ +CASE_XTERM_WINOPS, +CASE_ANSI_RC, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_DECREQTPARM, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_SPACE_STATE, +CASE_CSI_EX_STATE, +CASE_CSI_QUOTE_STATE, +CASE_CSI_HASH_STATE, +/* currency yen brokenbar section */ +CASE_CSI_DOLLAR_STATE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_TICK_STATE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_STAR_STATE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* acute mu paragraph periodcentered */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* cedilla onesuperior masculine guillemotright */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_COLON, +CASE_ESC_SEMI, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_ICH, +CASE_CUU, +CASE_CUD, +CASE_CUF, +/* Adiaeresis Aring AE Ccedilla */ +CASE_CUB, +CASE_CNL, +CASE_CPL, +CASE_HPA, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_CUP, +CASE_CHT, +CASE_ED, +CASE_EL, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IL, +CASE_DL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_DCH, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SU, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_TRACK_MOUSE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_ECH, +CASE_GROUND_STATE, +CASE_CBT, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SD, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_HPA, +CASE_HPR, +CASE_REP, +CASE_DA1, +/* adiaeresis aring ae ccedilla */ +CASE_VPA, +CASE_VPR, +CASE_CUP, +CASE_TBC, +/* egrave eacute ecircumflex ediaeresis */ +CASE_SET, +CASE_MC, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_RST, +CASE_SGR, +CASE_CPR, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_DECLL, +CASE_DECSTBM, +CASE_ANSI_SC, +/* ocircumflex otilde odiaeresis division */ +CASE_XTERM_WINOPS, +CASE_ANSI_RC, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_DECREQTPARM, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T csi_ex_table[] = /* CSI ! */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 4 5 6 7 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 8 9 : ; */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_DECSTR, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_DECSTR, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T csi_quo_table[] = /* CSI ... " */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 4 5 6 7 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 8 9 : ; */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_DECSCL, +CASE_DECSCA, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_DECSCL, +CASE_DECSCA, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +#if OPT_BLINK_CURS +Const PARSE_T csi_sp_table[] = /* CSI ... SP */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 4 5 6 7 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 8 9 : ; */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_SL, +CASE_SR, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_DECSCUSR, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_DECSWBV, +CASE_DECSMBV, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_SL, +CASE_SR, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_DECSCUSR, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_DECSWBV, +CASE_DECSMBV, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; +#endif + +Const PARSE_T csi_tick_table[] = /* CSI ... ' */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 4 5 6 7 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 8 9 : ; */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECEFR, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECELR, +CASE_DECSLE, +/* | } ~ DEL */ +CASE_DECRQLP, +CASE_DECIC, +CASE_DECDC, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECEFR, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECELR, +CASE_DECSLE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_DECRQLP, +CASE_DECIC, +CASE_DECDC, +CASE_IGNORE, +}; + +#if OPT_XTERM_SGR +Const PARSE_T csi_hash_table[] = /* CSI ... # */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 4 5 6 7 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 8 9 : ; */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_XTERM_PUSH_COLORS, +CASE_XTERM_POP_COLORS, +CASE_XTERM_REPORT_COLORS, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_XTERM_PUSH_SGR, +CASE_XTERM_POP_SGR, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_XTERM_CHECKSUM, +CASE_GROUND_STATE, +CASE_XTERM_PUSH_SGR, +/* | } ~ DEL */ +CASE_XTERM_REPORT_SGR, +CASE_XTERM_POP_SGR, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* acute mu paragraph periodcentered */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* cedilla onesuperior masculine guillemotright */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_XTERM_PUSH_COLORS, +CASE_XTERM_POP_COLORS, +CASE_XTERM_REPORT_COLORS, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_XTERM_PUSH_SGR, +CASE_XTERM_POP_SGR, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_XTERM_CHECKSUM, +CASE_GROUND_STATE, +CASE_XTERM_PUSH_SGR, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_XTERM_REPORT_SGR, +CASE_XTERM_POP_SGR, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +}; +#endif + +#if OPT_DEC_RECTOPS +Const PARSE_T csi_dollar_table[] = /* CSI ... $ */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 4 5 6 7 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 8 9 : ; */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_RQM, +CASE_GROUND_STATE, +CASE_DECCARA, +CASE_GROUND_STATE, +/* t u v w */ +CASE_DECRARA, +CASE_GROUND_STATE, +CASE_DECCRA, +CASE_DECRQPSR, +/* x y z { */ +CASE_DECFRA, +CASE_GROUND_STATE, +CASE_DECERA, +CASE_DECSERA, +/* | } ~ DEL */ +CASE_DECSCPP, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_RQM, +CASE_GROUND_STATE, +CASE_DECCARA, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_DECRARA, +CASE_GROUND_STATE, +CASE_DECCRA, +CASE_DECRQPSR, +/* oslash ugrave uacute ucircumflex */ +CASE_DECFRA, +CASE_GROUND_STATE, +CASE_DECERA, +CASE_DECSERA, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_DECSCPP, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +}; + +Const PARSE_T csi_star_table[] = /* CSI ... * */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 4 5 6 7 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 8 9 : ; */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_DECSACE, +CASE_DECRQCRA, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_DECSNLS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_DECSACE, +CASE_DECRQCRA, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_DECSNLS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +}; +#endif /* OPT_DEC_RECTOPS */ + +Const PARSE_T dec_table[] = /* CSI ? */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_DEC_DOLLAR_STATE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 4 5 6 7 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 8 9 : ; */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_COLON, +CASE_ESC_SEMI, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECSED, +CASE_DECSEL, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GRAPHICS_ATTRIBUTES, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_DECSET, +CASE_DEC_MC, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_DECRST, +CASE_GROUND_STATE, +CASE_DSR, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_XTERM_RESTORE, +CASE_XTERM_SAVE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_DEC_DOLLAR_STATE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* acute mu paragraph periodcentered */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* cedilla onesuperior masculine guillemotright */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_COLON, +CASE_ESC_SEMI, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECSED, +CASE_DECSEL, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GRAPHICS_ATTRIBUTES, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_DECSET, +CASE_DEC_MC, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_DECRST, +CASE_GROUND_STATE, +CASE_DSR, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_XTERM_RESTORE, +CASE_XTERM_SAVE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +#if OPT_DEC_RECTOPS +Const PARSE_T csi_dec_dollar_table[] = /* CSI ?... $ */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 4 5 6 7 */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 8 9 : ; */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_DECRQM, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_DECRQM, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +}; +#endif /* OPT_DEC_RECTOPS */ + +Const PARSE_T dec2_table[] = /* CSI > */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 4 5 6 7 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 8 9 : ; */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_COLON, +CASE_ESC_SEMI, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_XTERM_RM_TITLE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DA2, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_SET_MOD_FKEYS, +CASE_SET_MOD_FKEYS0, +CASE_GROUND_STATE, +/* p q r s */ +CASE_HIDE_POINTER, +CASE_REPORT_VERSION, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_XTERM_SM_TITLE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* acute mu paragraph periodcentered */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* cedilla onesuperior masculine guillemotright */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_COLON, +CASE_ESC_SEMI, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_XTERM_RM_TITLE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DA2, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_SET_MOD_FKEYS, +CASE_SET_MOD_FKEYS0, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_HIDE_POINTER, +CASE_REPORT_VERSION, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_XTERM_SM_TITLE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T dec3_table[] = /* CSI = */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* $ % & ' */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* ( ) * + */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* , - . / */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* 0 1 2 3 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 4 5 6 7 */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* 8 9 : ; */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_COLON, +CASE_ESC_SEMI, +/* < = > ? */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECRPTUI, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* currency yen brokenbar section */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* notsign hyphen registered macron */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* acute mu paragraph periodcentered */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +/* cedilla onesuperior masculine guillemotright */ +CASE_ESC_DIGIT, +CASE_ESC_DIGIT, +CASE_ESC_COLON, +CASE_ESC_SEMI, +/* onequarter onehalf threequarters questiondown */ +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +CASE_CSI_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECRPTUI, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T cigtable[] = /* CASE_CSI_IGNORE */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* $ % & ' */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ( ) * + */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* , - . / */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0 1 2 3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 4 5 6 7 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 8 9 : ; */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* < = > ? */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T eigtable[] = /* CASE_ESC_IGNORE */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* $ % & ' */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ( ) * + */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* , - . / */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0 1 2 3 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 4 5 6 7 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 8 9 : ; */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* acute mu paragraph periodcentered */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* cedilla onesuperior masculine guillemotright */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T esc_table[] = /* ESC */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_ESC_SP_STATE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_SCR_STATE, +/* $ % & ' */ +CASE_ESC_IGNORE, +CASE_ESC_PERCENT, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* ( ) * + */ +CASE_SCS0_STATE, +CASE_SCS1_STATE, +CASE_SCS2_STATE, +CASE_SCS3_STATE, +/* , - . / */ +CASE_ESC_IGNORE, +CASE_SCS1A_STATE, +CASE_SCS2A_STATE, +CASE_SCS3A_STATE, +/* 0 1 2 3 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 4 5 6 7 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECBI, +CASE_DECSC, +/* 8 9 : ; */ +CASE_DECRC, +CASE_DECFI, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GROUND_STATE, +CASE_DECKPAM, +CASE_DECKPNM, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_IND, +CASE_NEL, +CASE_HP_BUGGY_LL, +CASE_GROUND_STATE, +/* H I J K */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* P Q R S */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* X Y Z [ */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* \ ] ^ _ */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_RIS, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_HP_MEM_LOCK, +CASE_HP_MEM_UNLOCK, +CASE_LS2, +CASE_LS3, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_LS3R, +CASE_LS2R, +CASE_LS1R, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_ESC_SP_STATE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_SCR_STATE, +/* currency yen brokenbar section */ +CASE_ESC_IGNORE, +CASE_ESC_PERCENT, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_SCS0_STATE, +CASE_SCS1_STATE, +CASE_SCS2_STATE, +CASE_SCS3_STATE, +/* notsign hyphen registered macron */ +CASE_ESC_IGNORE, +CASE_SCS1A_STATE, +CASE_SCS2A_STATE, +CASE_SCS3A_STATE, +/* degree plusminus twosuperior threesuperior */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* acute mu paragraph periodcentered */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECBI, +CASE_DECSC, +/* cedilla onesuperior masculine guillemotright */ +CASE_DECRC, +CASE_DECFI, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_GROUND_STATE, +CASE_DECKPAM, +CASE_DECKPNM, +CASE_GROUND_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IND, +CASE_NEL, +CASE_HP_BUGGY_LL, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* Eth Ntilde Ograve Oacute */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_RIS, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_HP_MEM_LOCK, +CASE_HP_MEM_UNLOCK, +CASE_LS2, +CASE_LS3, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_LS3R, +CASE_LS2R, +CASE_LS1R, +CASE_IGNORE, +}; + +Const PARSE_T esc_sp_table[] = /* ESC SP */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* $ % & ' */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* ( ) * + */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* , - . / */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* 0 1 2 3 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 4 5 6 7 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 8 9 : ; */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_S7C1T, +CASE_S8C1T, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_ANSI_LEVEL_1, +CASE_ANSI_LEVEL_2, +CASE_ANSI_LEVEL_3, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* currency yen brokenbar section */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* notsign hyphen registered macron */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* acute mu paragraph periodcentered */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* cedilla onesuperior masculine guillemotright */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_S7C1T, +CASE_S8C1T, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_ANSI_LEVEL_1, +CASE_ANSI_LEVEL_2, +CASE_ANSI_LEVEL_3, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T scrtable[] = /* ESC # */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* $ % & ' */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* ( ) * + */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* , - . / */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* 0 1 2 3 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECDHL, +/* 4 5 6 7 */ +CASE_DECDHL, +CASE_DECSWL, +CASE_DECDWL, +CASE_GROUND_STATE, +/* 8 9 : ; */ +CASE_DECALN, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* currency yen brokenbar section */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* notsign hyphen registered macron */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_DECDHL, +/* acute mu paragraph periodcentered */ +CASE_DECDHL, +CASE_DECSWL, +CASE_DECDWL, +CASE_GROUND_STATE, +/* cedilla onesuperior masculine guillemotright */ +CASE_DECALN, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T scstable[] = /* ESC ( etc. */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_SCS_DQUOTE, +CASE_ESC_IGNORE, +/* $ % & ' */ +CASE_ESC_IGNORE, +CASE_SCS_PERCENT, +CASE_SCS_AMPRSND, +CASE_ESC_IGNORE, +/* ( ) * + */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* , - . / */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* 0 1 2 3 */ +CASE_GSETS, +CASE_GSETS, +CASE_GSETS, +CASE_GROUND_STATE, +/* 4 5 6 7 */ +CASE_GSETS, +CASE_GSETS, +CASE_GSETS, +CASE_GSETS, +/* 8 9 : ; */ +CASE_GROUND_STATE, +CASE_GSETS3, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GSETS, +CASE_GSETS, +CASE_GSETS3, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GSETS, +CASE_GSETS, +CASE_GSETS, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GSETS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GSETS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GSETS, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GSETS, +CASE_GSETS, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GSETS, +CASE_GSETS, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GSETS3, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GSETS, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_SCS_DQUOTE, +CASE_ESC_IGNORE, +/* currency yen brokenbar section */ +CASE_ESC_IGNORE, +CASE_SCS_PERCENT, +CASE_SCS_AMPRSND, +CASE_ESC_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* notsign hyphen registered macron */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_GSETS, +CASE_GSETS, +CASE_GSETS, +CASE_GROUND_STATE, +/* acute mu paragraph periodcentered */ +CASE_GSETS, +CASE_GSETS, +CASE_GSETS, +CASE_GSETS, +/* cedilla onesuperior masculine guillemotright */ +CASE_GROUND_STATE, +CASE_GSETS3, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_GSETS, +CASE_GSETS, +CASE_GSETS3, +CASE_GROUND_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GSETS, +CASE_GSETS, +CASE_GSETS, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GSETS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GSETS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GSETS, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GSETS, +CASE_GSETS, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GSETS, +CASE_GSETS, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GSETS3, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GSETS, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T scs96table[] = /* ESC - etc. */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* $ % & ' */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* ( ) * + */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* , - . / */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* 0 1 2 3 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 4 5 6 7 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 8 9 : ; */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GSETS3, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GSETS5, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GSETS5, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GSETS5, +CASE_GSETS5, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* currency yen brokenbar section */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* notsign hyphen registered macron */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* acute mu paragraph periodcentered */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* cedilla onesuperior masculine guillemotright */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GSETS3, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GSETS5, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GSETS5, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GSETS5, +CASE_GSETS5, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +/* + * This table is treated specially. The CASE_IGNORE entries correspond to the + * characters that can be accumulated for the string function (e.g., OSC). + */ +Const PARSE_T sos_table[] = /* OSC, DCS, etc. */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* FF CR SO SI */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* $ % & ' */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ( ) * + */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* , - . / */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0 1 2 3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 4 5 6 7 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 8 9 : ; */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* < = > ? */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* @ A B C */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* D E F G */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* H I J K */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* L M N O */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* P Q R S */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* T U V W */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* X Y Z [ */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* \ ] ^ _ */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ` a b c */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* d e f g */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* h i j k */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* l m n o */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* p q r s */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* t u v w */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* x y z { */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* | } ~ DEL */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; + +#if OPT_WIDE_CHARS +Const PARSE_T esc_pct_table[] = /* ESC % */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* $ % & ' */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* ( ) * + */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* , - . / */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* 0 1 2 3 */ +CASE_GSETS5, +CASE_GROUND_STATE, +CASE_GSETS5, +CASE_GROUND_STATE, +/* 4 5 6 7 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 8 9 : ; */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_UTF8, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_UTF8, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* currency yen brokenbar section */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* notsign hyphen registered macron */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_GSETS5, +CASE_GROUND_STATE, +CASE_GSETS5, +CASE_GROUND_STATE, +/* acute mu paragraph periodcentered */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* cedilla onesuperior masculine guillemotright */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_UTF8, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_UTF8, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T scs_2qt_table[] = /* SCS " */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* $ % & ' */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* ( ) * + */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* , - . / */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* 0 1 2 3 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 4 5 6 7 */ +CASE_GSETS_DQUOTE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 8 9 : ; */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GSETS_DQUOTE, +CASE_GSETS_DQUOTE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* currency yen brokenbar section */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* notsign hyphen registered macron */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* acute mu paragraph periodcentered */ +CASE_GSETS_DQUOTE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* cedilla onesuperior masculine guillemotright */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GSETS_DQUOTE, +CASE_GSETS_DQUOTE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T scs_amp_table[] = /* SCS & */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* $ % & ' */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* ( ) * + */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* , - . / */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* 0 1 2 3 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 4 5 6 7 */ +CASE_GSETS_AMPRSND, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 8 9 : ; */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* currency yen brokenbar section */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* notsign hyphen registered macron */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* acute mu paragraph periodcentered */ +CASE_GSETS_AMPRSND, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* cedilla onesuperior masculine guillemotright */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; + +Const PARSE_T scs_pct_table[] = /* SCS % */ +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_SO, +CASE_SI, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* $ % & ' */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* ( ) * + */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* , - . / */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* 0 1 2 3 */ +CASE_GSETS_PERCENT, +CASE_GROUND_STATE, +CASE_GSETS_PERCENT, +CASE_GSETS_PERCENT, +/* 4 5 6 7 */ +CASE_GROUND_STATE, +CASE_GSETS_PERCENT, +CASE_GSETS_PERCENT, +CASE_GROUND_STATE, +/* 8 9 : ; */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GROUND_STATE, +CASE_GSETS_PERCENT, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IND, +CASE_NEL, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_HTS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_GROUND_STATE, +CASE_RI, +CASE_SS2, +CASE_SS3, +/* 0x90 0x91 0x92 0x93 */ +CASE_DCS, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 0x94 0x95 0x96 0x97 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_SPA, +CASE_EPA, +/* 0x98 0x99 0x9a 0x9b */ +CASE_SOS, +CASE_GROUND_STATE, +CASE_DECID, +CASE_CSI_STATE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_ST, +CASE_OSC, +CASE_PM, +CASE_APC, +/* nobreakspace exclamdown cent sterling */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* currency yen brokenbar section */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* notsign hyphen registered macron */ +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +CASE_ESC_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_GSETS_PERCENT, +CASE_GROUND_STATE, +CASE_GSETS_PERCENT, +CASE_GSETS_PERCENT, +/* acute mu paragraph periodcentered */ +CASE_GROUND_STATE, +CASE_GSETS_PERCENT, +CASE_GSETS_PERCENT, +CASE_GROUND_STATE, +/* cedilla onesuperior masculine guillemotright */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* onequarter onehalf threequarters questiondown */ +CASE_GROUND_STATE, +CASE_GSETS_PERCENT, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Eth Ntilde Ograve Oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* agrave aacute acircumflex atilde */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* adiaeresis aring ae ccedilla */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* igrave iacute icircumflex idiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* eth ntilde ograve oacute */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ocircumflex otilde odiaeresis division */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* oslash ugrave uacute ucircumflex */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +}; +#endif /* OPT_WIDE_CHARS */ + +#if OPT_VT52_MODE +Const PARSE_T vt52_table[] = +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* $ % & ' */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* ( ) * + */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* , - . / */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 0 1 2 3 */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 4 5 6 7 */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* 8 9 : ; */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* < = > ? */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* @ A B C */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* D E F G */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* H I J K */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* L M N O */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* P Q R S */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* T U V W */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* X Y Z [ */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* \ ] ^ _ */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* ` a b c */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* d e f g */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* h i j k */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* l m n o */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* p q r s */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* t u v w */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* x y z { */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +/* | } ~ DEL */ +CASE_PRINT, +CASE_PRINT, +CASE_PRINT, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x98 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; + +Const PARSE_T vt52_esc_table[] = +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +/* $ % & ' */ +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +/* ( ) * + */ +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +/* , - . / */ +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +CASE_VT52_IGNORE, +/* 0 1 2 3 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 4 5 6 7 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 8 9 : ; */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_VT52_FINISH, +CASE_DECKPAM, +CASE_DECKPNM, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_CUU, +CASE_CUD, +CASE_CUF, +/* D E F G */ +CASE_CUB, +CASE_GROUND_STATE, +CASE_SO, +CASE_SI, +/* H I J K */ +CASE_CUP, +CASE_RI, +CASE_ED, +CASE_EL, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_VT52_CUP, +CASE_DECID, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x98 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; + +Const PARSE_T vt52_ignore_table[] = +{ +/* NUL SOH STX ETX */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* EOT ENQ ACK BEL */ +CASE_IGNORE, +CASE_ENQ, +CASE_IGNORE, +CASE_BELL, +/* BS HT NL VT */ +CASE_BS, +CASE_TAB, +CASE_VMOT, +CASE_VMOT, +/* FF CR SO SI */ +CASE_VMOT, +CASE_CR, +CASE_IGNORE, +CASE_IGNORE, +/* DLE DC1 DC2 DC3 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* DC4 NAK SYN ETB */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* CAN EM SUB ESC */ +CASE_GROUND_STATE, +CASE_IGNORE, +CASE_GROUND_STATE, +CASE_ESC, +/* FS GS RS US */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* SP ! " # */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* $ % & ' */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ( ) * + */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* , - . / */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0 1 2 3 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 4 5 6 7 */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* 8 9 : ; */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* < = > ? */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* @ A B C */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* D E F G */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* H I J K */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* L M N O */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* P Q R S */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* T U V W */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* X Y Z [ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* \ ] ^ _ */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* ` a b c */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* d e f g */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* h i j k */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* l m n o */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* p q r s */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* t u v w */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* x y z { */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +/* | } ~ DEL */ +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_GROUND_STATE, +CASE_IGNORE, +/* 0x80 0x81 0x82 0x83 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x84 0x85 0x86 0x87 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x88 0x89 0x8a 0x8b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x8c 0x8d 0x8e 0x8f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x90 0x91 0x92 0x93 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x94 0x95 0x96 0x97 */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x98 0x99 0x9a 0x9b */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* 0x9c 0x9d 0x9e 0x9f */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* nobreakspace exclamdown cent sterling */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* currency yen brokenbar section */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* diaeresis copyright ordfeminine guillemotleft */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* notsign hyphen registered macron */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* degree plusminus twosuperior threesuperior */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* acute mu paragraph periodcentered */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* cedilla onesuperior masculine guillemotright */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* onequarter onehalf threequarters questiondown */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Agrave Aacute Acircumflex Atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Adiaeresis Aring AE Ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Egrave Eacute Ecircumflex Ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Igrave Iacute Icircumflex Idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Eth Ntilde Ograve Oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ocircumflex Otilde Odiaeresis multiply */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Ooblique Ugrave Uacute Ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* Udiaeresis Yacute Thorn ssharp */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* agrave aacute acircumflex atilde */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* adiaeresis aring ae ccedilla */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* egrave eacute ecircumflex ediaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* igrave iacute icircumflex idiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* eth ntilde ograve oacute */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* ocircumflex otilde odiaeresis division */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* oslash ugrave uacute ucircumflex */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +/* udiaeresis yacute thorn ydiaeresis */ +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +CASE_IGNORE, +}; +#endif /* OPT_VT52_MODE */ +/* *INDENT-ON* */ diff --git a/ports/xterm/xterm-359/VTPrsTbl.o b/ports/xterm/xterm-359/VTPrsTbl.o new file mode 100644 index 0000000000000000000000000000000000000000..4e28eadc16f557abc3ea7bc569715d427830429b GIT binary patch literal 18072 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 + +#ifndef Const +# if defined(__STDC__) && !defined(__cplusplus) +# define Const const +# else +# define Const /**/ +# endif +#endif + +/* + * PARSE_T has to be large enough to handle the number of cases enumerated here. + */ +typedef unsigned char PARSE_T; + +extern Const PARSE_T ansi_table[]; +extern Const PARSE_T cigtable[]; +extern Const PARSE_T csi2_table[]; +extern Const PARSE_T csi_ex_table[]; +extern Const PARSE_T csi_quo_table[]; +extern Const PARSE_T csi_sp_table[]; +extern Const PARSE_T csi_table[]; +extern Const PARSE_T dec2_table[]; +extern Const PARSE_T dec3_table[]; +extern Const PARSE_T dec_table[]; +extern Const PARSE_T eigtable[]; +extern Const PARSE_T esc_sp_table[]; +extern Const PARSE_T esc_table[]; +extern Const PARSE_T scrtable[]; +extern Const PARSE_T scs96table[]; +extern Const PARSE_T scstable[]; +extern Const PARSE_T sos_table[]; +extern Const PARSE_T csi_dec_dollar_table[]; +extern Const PARSE_T csi_tick_table[]; + +#if OPT_DEC_RECTOPS +extern Const PARSE_T csi_dollar_table[]; +extern Const PARSE_T csi_star_table[]; +#endif /* OPT_DEC_LOCATOR */ + +#if OPT_VT52_MODE +extern Const PARSE_T vt52_table[]; +extern Const PARSE_T vt52_esc_table[]; +extern Const PARSE_T vt52_ignore_table[]; +#endif + +#if OPT_WIDE_CHARS +extern Const PARSE_T esc_pct_table[]; +extern Const PARSE_T scs_amp_table[]; +extern Const PARSE_T scs_pct_table[]; +extern Const PARSE_T scs_2qt_table[]; +#endif + +#if OPT_XTERM_SGR +extern Const PARSE_T csi_hash_table[]; +#endif + +#include + +#endif /* included_VTparse_h */ diff --git a/ports/xterm/xterm-359/VTparse.hin b/ports/xterm/xterm-359/VTparse.hin new file mode 100644 index 0000000..8b49c0a --- /dev/null +++ b/ports/xterm/xterm-359/VTparse.hin @@ -0,0 +1,180 @@ +/* vile:cmode */ +#define CASE_GROUND_STATE 0 +#define CASE_IGNORE 1 +#define CASE_BELL 2 +#define CASE_BS 3 +#define CASE_CR 4 +#define CASE_ESC 5 +#define CASE_VMOT 6 +#define CASE_TAB 7 +#define CASE_SI 8 +#define CASE_SO 9 +#define CASE_SCR_STATE 10 +#define CASE_SCS0_STATE 11 +#define CASE_SCS1_STATE 12 +#define CASE_SCS2_STATE 13 +#define CASE_SCS3_STATE 14 +#define CASE_ESC_IGNORE 15 +#define CASE_ESC_DIGIT 16 +#define CASE_ESC_SEMI 17 +#define CASE_DEC_STATE 18 +#define CASE_ICH 19 +#define CASE_CUU 20 +#define CASE_CUD 21 +#define CASE_CUF 22 +#define CASE_CUB 23 +#define CASE_CUP 24 +#define CASE_ED 25 +#define CASE_EL 26 +#define CASE_IL 27 +#define CASE_DL 28 +#define CASE_DCH 29 +#define CASE_DA1 30 +#define CASE_TRACK_MOUSE 31 +#define CASE_TBC 32 +#define CASE_SET 33 +#define CASE_RST 34 +#define CASE_SGR 35 +#define CASE_CPR 36 +#define CASE_DECSTBM 37 +#define CASE_DECREQTPARM 38 +#define CASE_DECSET 39 +#define CASE_DECRST 40 +#define CASE_DECALN 41 +#define CASE_GSETS 42 +#define CASE_DECSC 43 +#define CASE_DECRC 44 +#define CASE_DECKPAM 45 +#define CASE_DECKPNM 46 +#define CASE_IND 47 +#define CASE_NEL 48 +#define CASE_HTS 49 +#define CASE_RI 50 +#define CASE_SS2 51 +#define CASE_SS3 52 +#define CASE_CSI_STATE 53 +#define CASE_OSC 54 +#define CASE_RIS 55 +#define CASE_LS2 56 +#define CASE_LS3 57 +#define CASE_LS3R 58 +#define CASE_LS2R 59 +#define CASE_LS1R 60 +#define CASE_PRINT 61 +#define CASE_XTERM_SAVE 62 +#define CASE_XTERM_RESTORE 63 +#define CASE_DECID 64 +#define CASE_HP_MEM_LOCK 65 +#define CASE_HP_MEM_UNLOCK 66 +#define CASE_HP_BUGGY_LL 67 +#define CASE_HPA 68 +#define CASE_VPA 69 +#define CASE_XTERM_WINOPS 70 +#define CASE_ECH 71 +#define CASE_CHT 72 +#define CASE_CPL 73 +#define CASE_CNL 74 +#define CASE_CBT 75 +#define CASE_SU 76 +#define CASE_SD 77 +#define CASE_S7C1T 78 +#define CASE_S8C1T 79 +#define CASE_ESC_SP_STATE 80 +#define CASE_ENQ 81 +#define CASE_DECSCL 82 +#define CASE_DECSCA 83 +#define CASE_DECSED 84 +#define CASE_DECSEL 85 +#define CASE_DCS 86 +#define CASE_PM 87 +#define CASE_SOS 88 +#define CASE_ST 89 +#define CASE_APC 90 +#define CASE_EPA 91 +#define CASE_SPA 92 +#define CASE_CSI_QUOTE_STATE 93 +#define CASE_DSR 94 +#define CASE_ANSI_LEVEL_1 95 +#define CASE_ANSI_LEVEL_2 96 +#define CASE_ANSI_LEVEL_3 97 +#define CASE_MC 98 +#define CASE_DEC2_STATE 99 +#define CASE_DA2 100 +#define CASE_DEC3_STATE 101 +#define CASE_DECRPTUI 102 +#define CASE_VT52_CUP 103 +#define CASE_REP 104 +#define CASE_CSI_EX_STATE 105 +#define CASE_DECSTR 106 +#define CASE_DECDHL 107 +#define CASE_DECSWL 108 +#define CASE_DECDWL 109 +#define CASE_DEC_MC 110 +#define CASE_ESC_PERCENT 111 +#define CASE_UTF8 112 +#define CASE_CSI_TICK_STATE 113 +#define CASE_DECELR 114 +#define CASE_DECRQLP 115 +#define CASE_DECEFR 116 +#define CASE_DECSLE 117 +#define CASE_CSI_IGNORE 118 +#define CASE_VT52_IGNORE 119 +#define CASE_VT52_FINISH 120 +#define CASE_CSI_DOLLAR_STATE 121 +#define CASE_DECCRA 122 +#define CASE_DECERA 123 +#define CASE_DECFRA 124 +#define CASE_DECSERA 125 +#define CASE_DECSACE 126 +#define CASE_DECCARA 127 +#define CASE_DECRARA 128 +#define CASE_CSI_STAR_STATE 129 +#define CASE_SET_MOD_FKEYS 130 +#define CASE_SET_MOD_FKEYS0 131 +#define CASE_HIDE_POINTER 132 +#define CASE_SCS1A_STATE 133 +#define CASE_SCS2A_STATE 134 +#define CASE_SCS3A_STATE 135 +#define CASE_CSI_SPACE_STATE 136 +#define CASE_DECSCUSR 137 +#define CASE_XTERM_SM_TITLE 138 +#define CASE_XTERM_RM_TITLE 139 +#define CASE_DECSMBV 140 +#define CASE_DECSWBV 141 +#define CASE_DECLL 142 +#define CASE_DECRQM 143 +#define CASE_RQM 144 +#define CASE_CSI_DEC_DOLLAR_STATE 145 +#define CASE_SL 146 +#define CASE_SR 147 +#define CASE_DECDC 148 +#define CASE_DECIC 149 +#define CASE_DECBI 150 +#define CASE_DECFI 151 +#define CASE_DECRQCRA 152 +#define CASE_HPR 153 +#define CASE_VPR 154 +#define CASE_ANSI_SC 155 +#define CASE_ANSI_RC 156 +#define CASE_ESC_COLON 157 +#define CASE_SCS_PERCENT 158 +#define CASE_GSETS_PERCENT 159 +#define CASE_GRAPHICS_ATTRIBUTES 160 +#define CASE_DECRQPSR 161 +#define CASE_DECSCPP 162 +#define CASE_DECSNLS 163 +#define CASE_CSI_HASH_STATE 164 +#define CASE_XTERM_PUSH_SGR 165 +#define CASE_XTERM_REPORT_SGR 166 +#define CASE_XTERM_POP_SGR 167 +#define CASE_XTERM_CHECKSUM 168 +#define CASE_GSETS3 169 +#define CASE_GSETS5 170 +#define CASE_SCS_DQUOTE 171 +#define CASE_GSETS_DQUOTE 172 +#define CASE_SCS_AMPRSND 173 +#define CASE_GSETS_AMPRSND 174 +#define CASE_REPORT_VERSION 175 +#define CASE_XTERM_PUSH_COLORS 176 +#define CASE_XTERM_REPORT_COLORS 177 +#define CASE_XTERM_POP_COLORS 178 diff --git a/ports/xterm/xterm-359/XTerm-col.ad b/ports/xterm/xterm-359/XTerm-col.ad new file mode 100644 index 0000000..c157e9f --- /dev/null +++ b/ports/xterm/xterm-359/XTerm-col.ad @@ -0,0 +1,163 @@ +! $XTermId: XTerm-col.ad,v 1.22 2009/08/15 15:56:29 tom Exp $ +! ----------------------------------------------------------------------------- +! this file is part of xterm +! +! Copyright 2002-2006,2009 by Thomas E. Dickey +! +! All Rights Reserved +! +! Permission is hereby granted, free of charge, to any person obtaining a +! copy of this software and associated documentation files (the +! "Software"), to deal in the Software without restriction, including +! without limitation the rights to use, copy, modify, merge, publish, +! distribute, sublicense, and/or sell copies of the Software, and to +! permit persons to whom the Software is furnished to do so, subject to +! the following conditions: +! +! The above copyright notice and this permission notice shall be included +! in all copies or substantial portions of the Software. +! +! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +! OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +! MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +! IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +! CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +! TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +! SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +! +! Except as contained in this notice, the name(s) of the above copyright +! holders shall not be used in advertising or otherwise to promote the +! sale, use or other dealings in this Software without prior written +! authorization. +! ----------------------------------------------------------------------------- + +#include "XTerm" + +*VT100*colorMode: on +*VT100*boldColors: on +*VT100*dynamicColors: on + +! Uncomment this for "white" text on a dark background. +!*VT100*foreground: gray90 +!*VT100*background: black + +! - OR - +! Uncomment this for black text on a "white" background. +!*VT100*foreground: black +!*VT100*background: gray90 + +! - OR - +! leave the foreground/background colors alone (at the mercy of your desktop +! designer). + +! Color the popup/pulldown menu border to match the text widget foreground. +!*SimpleMenu*borderColor: gray15 + +! Uncomment this to use color for underline attribute +!*VT100*colorULMode: on +*VT100*colorUL: yellow + +!*VT100*italicULMode: on + +! Uncomment this to disable underlining, e.g., if colorULMode is set. +!*VT100*underLine: off + +! Uncomment this to use color for the bold attribute +!*VT100*colorBDMode: on +*VT100*colorBD: white + +! Uncomment this to use the bold/underline colors in preference to other colors +!*VT100*colorAttrMode: on + +! These are the 8 ANSI colors and their bright equivalents. Depending on +! other resource settings, xterm may use the bright colors when displaying +! bold text (see the boldColors resource). +*VT100*color0: black +*VT100*color1: red3 +*VT100*color2: green3 +*VT100*color3: yellow3 +*VT100*color4: blue2 +*VT100*color5: magenta3 +*VT100*color6: cyan3 +*VT100*color7: gray90 +*VT100*color8: gray50 +*VT100*color9: red +*VT100*color10: green +*VT100*color11: yellow +*VT100*color12: rgb:5c/5c/ff +*VT100*color13: magenta +*VT100*color14: cyan +*VT100*color15: white + +! Disclaimer: there are no standard colors used in terminal emulation. +! +! The choice for color4 and color12 is a tradeoff between contrast, depending +! on whether they are used for text or backgrounds. Note that either color4 or +! color12 would be used for text, while only color4 would be used for a +! background. These are treated specially, since the luminosity of blue is +! only about half that of red/green, and is typically not accounted for in the +! RGB scheme. +! +! Blue text on a black background should be readable. +! Blue backgrounds should not be "too" bright. +! +! Originally color4/color12 were set to the names blue3/blue +!*VT100*color4: blue3 +!*VT100*color12: blue +! +! They are from rgb.txt respectively: +! 0 0 205 blue3 +! 0 0 255 blue +! However, blue3 is not readable on a black background. +! +! Another choice was from the Debian settings: +!*VT100*color4: DodgerBlue1 +!*VT100*color12: SteelBlue1 +! +! From rgb.txt: +! 30 144 255 DodgerBlue1 +! 99 184 255 SteelBlue1 +! +! Some users object to this choice because the background (color4) is brighter +! than they are accustomed. Others point out that the different weights for +! the red/green components make it appear to be not really blue. Finally, it +! provides poor contrast against color13 and color14. +! +! The current choice uses equal weights for red/green (effectively adding a +! gray to the result). It is brighter than the original choice, and provides +! more contrast between color12 and color13, color14 than SteelBlue1 did. +! Contrast of color4 against black is slightly improved over the original. +! +! Some refinement is certainly possible (you are welcome to try) -TD + + +#if PLANES > 8 +! Color the popup menus and the menubar to match: +*SimpleMenu*background: AntiqueWhite +*SimpleMenu*foreground: gray15 + +! Color the menubar to match: +*Form.menubar.background: AntiqueWhite +*Form.menubar*background: AntiqueWhite +*Form.menubar.foreground: gray15 +*Form.menubar*foreground: gray15 +*Form.background: AntiqueWhite +*form.background: AntiqueWhite + +! The following two sections take advantage of new features in version 7 +! of the Athena widget library. Comment them out if you have a shallow +! color depth. +!*SimpleMenu*backgroundPixmap: gradient:vertical?dimension=350&start=gray90&end=gray60 +!*SimpleMenu*foreground: gray15 + +!*VT100.scrollbar.thumb: vlines2 +!*VT100.scrollbar.width: 14 +!*VT100.scrollbar.background: gray60 +!*VT100.scrollbar.foreground: rgb:a/5/5 +!*VT100.scrollbar.borderWidth: 0 +!*VT100.scrollbar.displayList:\ +!foreground gray90;\ +!lines 1,-1,-1,-1,-1,1;\ +!foreground gray60;\ +!lines -1,0,0,0,0,-1 +#endif diff --git a/ports/xterm/xterm-359/XTerm.ad b/ports/xterm/xterm-359/XTerm.ad new file mode 100644 index 0000000..78ee0c1 --- /dev/null +++ b/ports/xterm/xterm-359/XTerm.ad @@ -0,0 +1,261 @@ +! $XTermId: XTerm.ad,v 1.102 2016/12/22 02:07:39 tom Exp $ +! ----------------------------------------------------------------------------- +! this file is part of xterm +! +! Copyright 1996-2011,2016 by Thomas E. Dickey +! +! All Rights Reserved +! +! Permission is hereby granted, free of charge, to any person obtaining a +! copy of this software and associated documentation files (the +! "Software"), to deal in the Software without restriction, including +! without limitation the rights to use, copy, modify, merge, publish, +! distribute, sublicense, and/or sell copies of the Software, and to +! permit persons to whom the Software is furnished to do so, subject to +! the following conditions: +! +! The above copyright notice and this permission notice shall be included +! in all copies or substantial portions of the Software. +! +! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +! OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +! MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +! IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +! CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +! TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +! SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +! +! Except as contained in this notice, the name(s) of the above copyright +! holders shall not be used in advertising or otherwise to promote the +! sale, use or other dealings in this Software without prior written +! authorization. +! ----------------------------------------------------------------------------- + +*saveLines: 1024 + +*SimpleMenu*BackingStore: NotUseful +*SimpleMenu*menuLabel.font: -adobe-helvetica-bold-r-normal--*-120-*-*-*-*-iso8859-* +*SimpleMenu*menuLabel.vertSpace: 100 +*SimpleMenu*HorizontalMargins: 16 +*SimpleMenu*Sme.height: 16 + +*SimpleMenu*Cursor: left_ptr + +*mainMenu.Label: Main Options +*mainMenu*toolbar*Label: Toolbar +*mainMenu*fullscreen*Label: Full Screen +*mainMenu*securekbd*Label: Secure Keyboard +*mainMenu*allowsends*Label: Allow SendEvents +*mainMenu*redraw*Label: Redraw Window +*mainMenu*logging*Label: Log to File +*mainMenu*print-immediate*Label: Print-All Immediately +*mainMenu*print-on-error*Label: Print-All on Error +*mainMenu*print*Label: Print Window +*mainMenu*print-redir*Label: Redirect to Printer +*mainMenu*dump-html*Label: XHTML Screen Dump +*mainMenu*dump-svg*Label: SVG Screen Dump +*mainMenu*8-bit control*Label: 8-Bit Controls +*mainMenu*backarrow key*Label: Backarrow Key (BS/DEL) +*mainMenu*num-lock*Label: Alt/NumLock Modifiers +*mainMenu*alt-esc*Label: Alt Sends Escape +*mainMenu*meta-esc*Label: Meta Sends Escape +*mainMenu*delete-is-del*Label: Delete is DEL +*mainMenu*oldFunctionKeys*Label: Old Function-Keys +*mainMenu*sunFunctionKeys*Label: Sun Function-Keys +*mainMenu*sunKeyboard*Label: VT220 Keyboard +*mainMenu*hpFunctionKeys*Label: HP Function-Keys +*mainMenu*scoFunctionKeys*Label: SCO Function-Keys +*mainMenu*tcapFunctionKeys*Label: Termcap Function-Keys +*mainMenu*suspend*Label: Send STOP Signal +*mainMenu*continue*Label: Send CONT Signal +*mainMenu*interrupt*Label: Send INT Signal +*mainMenu*hangup*Label: Send HUP Signal +*mainMenu*terminate*Label: Send TERM Signal +*mainMenu*kill*Label: Send KILL Signal +*mainMenu*quit*Label: Quit + +*vtMenu.Label: VT Options +*vtMenu*scrollbar*Label: Enable Scrollbar +*vtMenu*jumpscroll*Label: Enable Jump Scroll +*vtMenu*reversevideo*Label: Enable Reverse Video +*vtMenu*autowrap*Label: Enable Auto Wraparound +*vtMenu*reversewrap*Label: Enable Reverse Wraparound +*vtMenu*autolinefeed*Label: Enable Auto Linefeed +*vtMenu*appcursor*Label: Enable Application Cursor Keys +*vtMenu*appkeypad*Label: Enable Application Keypad +*vtMenu*scrollkey*Label: Scroll to Bottom on Key Press +*vtMenu*scrollttyoutput*Label: Scroll to Bottom on Tty Output +*vtMenu*allow132*Label: Allow 80/132 Column Switching +*vtMenu*keepSelection*Label: Keep Selection +*vtMenu*selectToClipboard*Label: Select to Clipboard +*vtMenu*cursesemul*Label: Enable Curses Emulation +*vtMenu*visualbell*Label: Enable Visual Bell +*vtMenu*bellIsUrgent*Label: Enable Bell Urgency +*vtMenu*poponbell*Label: Enable Pop on Bell +*vtMenu*cursorblink*Label: Enable Blinking Cursor +*vtMenu*titeInhibit*Label: Enable Alternate Screen Switching +*vtMenu*activeicon*Label: Enable Active Icon +*vtMenu*softreset*Label: Do Soft Reset +*vtMenu*hardreset*Label: Do Full Reset +*vtMenu*clearsavedlines*Label: Reset and Clear Saved Lines +*vtMenu*tekshow*Label: Show Tek Window +*vtMenu*tekmode*Label: Switch to Tek Mode +*vtMenu*vthide*Label: Hide VT Window +*vtMenu*altscreen*Label: Show Alternate Screen +*vtMenu*sixelScrolling*Label: Sixel Scrolling +*vtMenu*privateColorRegisters*Label: Private Color Registers + +*fontMenu.Label: VT Fonts +*fontMenu*fontdefault*Label: Default +*fontMenu*font1*Label: Unreadable +*VT100.font1: nil2 +*IconFont: nil2 +*fontMenu*font2*Label: Tiny +*VT100.font2: 5x7 +*fontMenu*font3*Label: Small +*VT100.font3: 6x10 +*fontMenu*font4*Label: Medium +*VT100.font4: 7x13 +*fontMenu*font5*Label: Large +*VT100.font5: 9x15 +*fontMenu*font6*Label: Huge +*VT100.font6: 10x20 +*fontMenu*fontescape*Label: Escape Sequence +*fontMenu*fontsel*Label: Selection +!fontescape and fontsel overridden by application +*fontMenu*allow-bold-fonts*Label: Bold Fonts +*fontMenu*font-linedrawing*Label: Line-Drawing Characters +*fontMenu*font-doublesize*Label: Doublesized Characters +*fontMenu*font-loadable*Label: VT220 Soft Fonts +*fontMenu*font-packed*Label: Packed Font +*fontMenu*render-font*Label: TrueType Fonts +*fontMenu*utf8-mode*Label: UTF-8 Encoding +*fontMenu*utf8-fonts*Label: UTF-8 Fonts +*fontMenu*utf8-title*Label: UTF-8 Titles + +*fontMenu*allow-color-ops*Label: Allow Color Ops +*fontMenu*allow-font-ops*Label: Allow Font Ops +*fontMenu*allow-mouse-ops*Label: Allow Mouse Ops +*fontMenu*allow-tcap-ops*Label: Allow Termcap Ops +*fontMenu*allow-title-ops*Label: Allow Title Ops +*fontMenu*allow-window-ops*Label: Allow Window Ops + +*VT100.utf8Fonts.font2: -misc-fixed-medium-r-normal--8-80-75-75-c-50-iso10646-1 +*VT100.utf8Fonts.font: -misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-iso10646-1 +*VT100.utf8Fonts.font3: -misc-fixed-medium-r-normal--14-130-75-75-c-70-iso10646-1 +*VT100.utf8Fonts.font4: -misc-fixed-medium-r-normal--13-120-75-75-c-80-iso10646-1 +*VT100.utf8Fonts.font5: -misc-fixed-medium-r-normal--18-120-100-100-c-90-iso10646-1 +*VT100.utf8Fonts.font6: -misc-fixed-medium-r-normal--20-200-75-75-c-100-iso10646-1 + +*tekMenu.Label: Tek Options +*tekMenu*tektextlarge*Label: Large Characters +*tekMenu*tektext2*Label: #2 Size Characters +*tekMenu*tektext3*Label: #3 Size Characters +*tekMenu*tektextsmall*Label: Small Characters +*tekMenu*tekpage*Label: PAGE +*tekMenu*tekreset*Label: RESET +*tekMenu*tekcopy*Label: COPY +*tekMenu*vtshow*Label: Show VT Window +*tekMenu*vtmode*Label: Switch to VT Mode +*tekMenu*tekhide*Label: Hide Tek Window + +*tek4014*fontLarge: 9x15 +*tek4014*font2: 8x13 +*tek4014*font3: 6x13 +*tek4014*fontSmall: 6x10 + +! If xterm is built with a toolbar, the widget hierarchy looks like this, +! showing widget name / class names. The complete menu hierarchy is built +! at startup because it is needed to make the layout work for the menubar: +! +! xterm/XTerm +! form/Form +! menubar/Box +! mainMenuButton/MenuButton +! mainMenu/SimpleMenu +! menuLabel/SmeBSB +! toolbar/SmeBSB +! ... +! vtMenu/SimpleMenu +! menuLabel/SmeBSB +! scrollbar/SmeBSB +! ... +! fontMenu/SimpleMenu +! menuLabel/SmeBSB +! fontdefault/SmeBSB +! ... +! tekMenu/SimpleMenu +! menuLabel/SmeBSB +! fontdefault/SmeBSB +! ... +! vt100/VT100 +! tektronix/TopLevelShell +! shellext/VendorShellExt +! tek4014/Tek4014 +! +! If built without a toolbar, the widget hierarchy is simpler, because there +! is no form, and the popup menu widgets are created only when they are first +! used. +! +! xterm/XTerm +! shellext/VendorShellExt +! mainMenu/SimpleMenu +! menuLabel/SmeBSB +! ... +! ... +! vt100/VT100 +! tektronix/TopLevelShell +! shellext/VendorShellExt +! tek4014/Tek4014 +! +! A more complete list of the widget/class names can be obtained using editres +! to dump a file. Some widget names are not available until the corresponding +! menu has been created. + +! These resources reduce space around the menubar, by eliminating padding in +! the enclosing form (Thickness) and the border of the Box which represents +! the menubar widget. +*form.Thickness: 0 +*menubar.borderWidth: 0 + +! If we wanted to eliminate the border of the popup menus, we could do this +! instead, since they are children of the menubar: +!*menubar*borderWidth: 0 + +! Eliminate the border of the buttons in the menubar, so the only line around +! the text is for the highlighted button: +*MenuButton*borderWidth: 0 + +! Set a border for the menus to make them simpler to distinguish against the +! vt100 widget: +*SimpleMenu*borderWidth: 2 + +! xterm can switch at runtime between bitmap (default) and TrueType fonts. +! The "faceSize" resource controls the size of the latter. However, it was +! originally given with a size that makes the two types of fonts different +! sizes. Uncomment this line to use the same size as "fixed". +!*faceSize: 8 + +! Here is a pattern that is useful for double-clicking on a URL: +!*charClass: 33:48,35:48,37-38:48,43-47:48,58:48,61:48,63-64:48,95:48,126:48 +! +! Alternatively, +!*on2Clicks: regex [[:alpha:]]+://([[:alnum:]!#+,./=?@_~-]|(%[[:xdigit:]][[:xdigit:]]))+ + +! VT100s and similar terminals recognize escape sequences and control +! characters to which they reply to the host with other escape sequences, +! to provide information. The "resize" program uses this feature. +! +! In addition, xterm recognizes several escape sequences which can be used to +! set fonts, window properties, return settings via escape sequences. Some +! find these useful; others are concerned with the possibility of unexpected +! inputs. +! +! All of these features can be enabled or disabled via menus. +! +! Depending on your environment, you may wish to disable those by default by +! uncommenting one or more of the resource settings below: +!*allowFontOps: false +!*allowTcapOps: false +!*allowTitleOps: false +!*allowWindowOps: false diff --git a/ports/xterm/xterm-359/aclocal.m4 b/ports/xterm/xterm-359/aclocal.m4 new file mode 100644 index 0000000..cae7a39 --- /dev/null +++ b/ports/xterm/xterm-359/aclocal.m4 @@ -0,0 +1,5159 @@ +dnl $XTermId: aclocal.m4,v 1.461 2020/07/11 23:09:29 tom Exp $ +dnl +dnl --------------------------------------------------------------------------- +dnl +dnl Copyright 1997-2019,2020 by Thomas E. Dickey +dnl +dnl All Rights Reserved +dnl +dnl Permission is hereby granted, free of charge, to any person obtaining a +dnl copy of this software and associated documentation files (the +dnl "Software"), to deal in the Software without restriction, including +dnl without limitation the rights to use, copy, modify, merge, publish, +dnl distribute, sublicense, and/or sell copies of the Software, and to +dnl permit persons to whom the Software is furnished to do so, subject to +dnl the following conditions: +dnl +dnl The above copyright notice and this permission notice shall be included +dnl in all copies or substantial portions of the Software. +dnl +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +dnl IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +dnl CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +dnl TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +dnl SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +dnl +dnl Except as contained in this notice, the name(s) of the above copyright +dnl holders shall not be used in advertising or otherwise to promote the +dnl sale, use or other dealings in this Software without prior written +dnl authorization. +dnl +dnl --------------------------------------------------------------------------- +dnl See +dnl https://invisible-island.net/autoconf/autoconf.html +dnl https://invisible-island.net/autoconf/my-autoconf.html +dnl --------------------------------------------------------------------------- +dnl --------------------------------------------------------------------------- +dnl AM_LANGINFO_CODESET version: 5 updated: 2020/03/10 18:53:47 +dnl ------------------- +dnl Inserted as requested by gettext 0.10.40 +dnl File from /usr/share/aclocal +dnl codeset.m4 +dnl ==================== +dnl serial AM1 +dnl +dnl From Bruno Haible. +AC_DEFUN([AM_LANGINFO_CODESET], +[ +AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, + [AC_TRY_LINK([#include ], + [char* cs = nl_langinfo(CODESET); (void)cs], + am_cv_langinfo_codeset=yes, + am_cv_langinfo_codeset=no) + ]) + if test $am_cv_langinfo_codeset = yes; then + AC_DEFINE(HAVE_LANGINFO_CODESET, 1, + [Define if you have and nl_langinfo(CODESET).]) + fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ACVERSION_CHECK version: 5 updated: 2014/06/04 19:11:49 +dnl ------------------ +dnl Conditionally generate script according to whether we're using a given autoconf. +dnl +dnl $1 = version to compare against +dnl $2 = code to use if AC_ACVERSION is at least as high as $1. +dnl $3 = code to use if AC_ACVERSION is older than $1. +define([CF_ACVERSION_CHECK], +[ +ifdef([AC_ACVERSION], ,[ifdef([AC_AUTOCONF_VERSION],[m4_copy([AC_AUTOCONF_VERSION],[AC_ACVERSION])],[m4_copy([m4_PACKAGE_VERSION],[AC_ACVERSION])])])dnl +ifdef([m4_version_compare], +[m4_if(m4_version_compare(m4_defn([AC_ACVERSION]), [$1]), -1, [$3], [$2])], +[CF_ACVERSION_COMPARE( +AC_PREREQ_CANON(AC_PREREQ_SPLIT([$1])), +AC_PREREQ_CANON(AC_PREREQ_SPLIT(AC_ACVERSION)), AC_ACVERSION, [$2], [$3])])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ACVERSION_COMPARE version: 3 updated: 2012/10/03 18:39:53 +dnl -------------------- +dnl CF_ACVERSION_COMPARE(MAJOR1, MINOR1, TERNARY1, +dnl MAJOR2, MINOR2, TERNARY2, +dnl PRINTABLE2, not FOUND, FOUND) +define([CF_ACVERSION_COMPARE], +[ifelse(builtin([eval], [$2 < $5]), 1, +[ifelse([$8], , ,[$8])], +[ifelse([$9], , ,[$9])])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_CFLAGS version: 14 updated: 2020/04/04 16:16:13 +dnl ------------- +dnl Copy non-preprocessor flags to $CFLAGS, preprocessor flags to $CPPFLAGS +dnl $1 = flags to add +dnl $2 = if given makes this macro verbose. +dnl +dnl Put any preprocessor definitions that use quoted strings in $EXTRA_CPPFLAGS, +dnl to simplify use of $CPPFLAGS in compiler checks, etc., that are easily +dnl confused by the quotes (which require backslashes to keep them usable). +AC_DEFUN([CF_ADD_CFLAGS], +[ +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $1 +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[[^=]]*='\''\"[[^"]]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,$cf_tst_cppflags) + ;; + esac + CF_APPEND_TEXT(cf_new_cppflags,$cf_add_cflags) + ;; + esac + ;; + (*) + CF_APPEND_TEXT(cf_new_cflags,$cf_add_cflags) + ;; + esac + ;; +(yes) + CF_APPEND_TEXT(cf_new_extra_cppflags,$cf_add_cflags) + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[[^"]]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$CFLAGS $cf_new_cflags)]) + CF_APPEND_TEXT(CFLAGS,$cf_new_cflags) +fi + +if test -n "$cf_new_cppflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$CPPFLAGS $cf_new_cppflags)]) + CF_APPEND_TEXT(CPPFLAGS,$cf_new_cppflags) +fi + +if test -n "$cf_new_extra_cppflags" ; then + ifelse([$2],,,[CF_VERBOSE(add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags)]) + CF_APPEND_TEXT(EXTRA_CPPFLAGS,$cf_new_extra_cppflags) +fi + +AC_SUBST(EXTRA_CPPFLAGS) + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIB version: 2 updated: 2010/06/02 05:03:05 +dnl ---------- +dnl Add a library, used to enforce consistency. +dnl +dnl $1 = library to add, without the "-l" +dnl $2 = variable to update (default $LIBS) +AC_DEFUN([CF_ADD_LIB],[CF_ADD_LIBS(-l$1,ifelse($2,,LIBS,[$2]))])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIBS version: 3 updated: 2019/11/02 16:47:33 +dnl ----------- +dnl Add one or more libraries, used to enforce consistency. Libraries are +dnl prepended to an existing list, since their dependencies are assumed to +dnl already exist in the list. +dnl +dnl $1 = libraries to add, with the "-l", etc. +dnl $2 = variable to update (default $LIBS) +AC_DEFUN([CF_ADD_LIBS],[ +cf_add_libs="[$]ifelse($2,,LIBS,[$2])" +# reverse order +cf_add_0lib= +for cf_add_1lib in $1; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +ifelse($2,,LIBS,[$2])="$cf_add_libs" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ADD_LIB_AFTER version: 3 updated: 2013/07/09 21:27:22 +dnl ---------------- +dnl Add a given library after another, e.g., following the one it satisfies a +dnl dependency for. +dnl +dnl $1 = the first library +dnl $2 = its dependency +AC_DEFUN([CF_ADD_LIB_AFTER],[ +CF_VERBOSE(...before $LIBS) +LIBS=`echo "$LIBS" | sed -e "s/[[ ]][[ ]]*/ /g" -e "s%$1 %$1 $2 %" -e 's% % %g'` +CF_VERBOSE(...after $LIBS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_APPEND_TEXT version: 1 updated: 2017/02/25 18:58:55 +dnl -------------- +dnl use this macro for appending text without introducing an extra blank at +dnl the beginning +define([CF_APPEND_TEXT], +[ + test -n "[$]$1" && $1="[$]$1 " + $1="[$]{$1}$2" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_DISABLE version: 3 updated: 1999/03/30 17:24:31 +dnl -------------- +dnl Allow user to disable a normally-on option. +AC_DEFUN([CF_ARG_DISABLE], +[CF_ARG_OPTION($1,[$2],[$3],[$4],yes)])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_ENABLE version: 3 updated: 1999/03/30 17:24:31 +dnl ------------- +dnl Allow user to enable a normally-off option. +AC_DEFUN([CF_ARG_ENABLE], +[CF_ARG_OPTION($1,[$2],[$3],[$4],no)])dnl +dnl --------------------------------------------------------------------------- +dnl CF_ARG_OPTION version: 5 updated: 2015/05/10 19:52:14 +dnl ------------- +dnl Restricted form of AC_ARG_ENABLE that ensures user doesn't give bogus +dnl values. +dnl +dnl Parameters: +dnl $1 = option name +dnl $2 = help-string +dnl $3 = action to perform if option is not default +dnl $4 = action if perform if option is default +dnl $5 = default option value (either 'yes' or 'no') +AC_DEFUN([CF_ARG_OPTION], +[AC_ARG_ENABLE([$1],[$2],[test "$enableval" != ifelse([$5],no,yes,no) && enableval=ifelse([$5],no,no,yes) + if test "$enableval" != "$5" ; then +ifelse([$3],,[ :]dnl +,[ $3]) ifelse([$4],,,[ + else + $4]) + fi],[enableval=$5 ifelse([$4],,,[ + $4 +])dnl +])])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CC_ENV_FLAGS version: 9 updated: 2018/07/29 18:03:26 +dnl --------------- +dnl Check for user's environment-breakage by stuffing CFLAGS/CPPFLAGS content +dnl into CC. This will not help with broken scripts that wrap the compiler +dnl with options, but eliminates a more common category of user confusion. +dnl +dnl In particular, it addresses the problem of being able to run the C +dnl preprocessor in a consistent manner. +dnl +dnl Caveat: this also disallows blanks in the pathname for the compiler, but +dnl the nuisance of having inconsistent settings for compiler and preprocessor +dnl outweighs that limitation. +AC_DEFUN([CF_CC_ENV_FLAGS], +[ +# This should have been defined by AC_PROG_CC +: ${CC:=cc} + +AC_MSG_CHECKING(\$CFLAGS variable) +case "x$CFLAGS" in +(*-[[IUD]]*) + AC_MSG_RESULT(broken) + AC_MSG_WARN(your environment uses the CFLAGS variable to hold CPPFLAGS options) + cf_flags="$CFLAGS" + CFLAGS= + for cf_arg in $cf_flags + do + CF_ADD_CFLAGS($cf_arg) + done + ;; +(*) + AC_MSG_RESULT(ok) + ;; +esac + +AC_MSG_CHECKING(\$CC variable) +case "$CC" in +(*[[\ \ ]]-*) + AC_MSG_RESULT(broken) + AC_MSG_WARN(your environment uses the CC variable to hold CFLAGS/CPPFLAGS options) + # humor him... + cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[[ ]]* / /g' -e 's/[[ ]]*[[ ]]-[[^ ]].*//'` + cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", [substr]([$]0,1+length(prog))); }'` + CC="$cf_prog" + for cf_arg in $cf_flags + do + case "x$cf_arg" in + (x-[[IUDfgOW]]*) + CF_ADD_CFLAGS($cf_arg) + ;; + (*) + CC="$CC $cf_arg" + ;; + esac + done + CF_VERBOSE(resulting CC: '$CC') + CF_VERBOSE(resulting CFLAGS: '$CFLAGS') + CF_VERBOSE(resulting CPPFLAGS: '$CPPFLAGS') + ;; +(*) + AC_MSG_RESULT(ok) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_CACHE version: 12 updated: 2012/10/02 20:55:03 +dnl -------------- +dnl Check if we're accidentally using a cache from a different machine. +dnl Derive the system name, as a check for reusing the autoconf cache. +dnl +dnl If we've packaged config.guess and config.sub, run that (since it does a +dnl better job than uname). Normally we'll use AC_CANONICAL_HOST, but allow +dnl an extra parameter that we may override, e.g., for AC_CANONICAL_SYSTEM +dnl which is useful in cross-compiles. +dnl +dnl Note: we would use $ac_config_sub, but that is one of the places where +dnl autoconf 2.5x broke compatibility with autoconf 2.13 +AC_DEFUN([CF_CHECK_CACHE], +[ +if test -f $srcdir/config.guess || test -f $ac_aux_dir/config.guess ; then + ifelse([$1],,[AC_CANONICAL_HOST],[$1]) + system_name="$host_os" +else + system_name="`(uname -s -r) 2>/dev/null`" + if test -z "$system_name" ; then + system_name="`(hostname) 2>/dev/null`" + fi +fi +test -n "$system_name" && AC_DEFINE_UNQUOTED(SYSTEM_NAME,"$system_name",[Define to the system name.]) +AC_CACHE_VAL(cf_cv_system_name,[cf_cv_system_name="$system_name"]) + +test -z "$system_name" && system_name="$cf_cv_system_name" +test -n "$cf_cv_system_name" && AC_MSG_RESULT(Configuring for $cf_cv_system_name) + +if test ".$system_name" != ".$cf_cv_system_name" ; then + AC_MSG_RESULT(Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)) + AC_MSG_ERROR("Please remove config.cache and try again.") +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_CFLAGS version: 3 updated: 2014/07/22 05:32:57 +dnl --------------- +dnl Conditionally add to $CFLAGS and $CPPFLAGS values which are derived from +dnl a build-configuration such as imake. These have the pitfall that they +dnl often contain compiler-specific options which we cannot use, mixed with +dnl preprocessor options that we usually can. +AC_DEFUN([CF_CHECK_CFLAGS], +[ +CF_VERBOSE(checking additions to CFLAGS) +cf_check_cflags="$CFLAGS" +cf_check_cppflags="$CPPFLAGS" +CF_ADD_CFLAGS($1,yes) +if test "x$cf_check_cflags" != "x$CFLAGS" ; then +AC_TRY_LINK([#include ],[printf("Hello world");],, + [CF_VERBOSE(test-compile failed. Undoing change to \$CFLAGS) + if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then + CF_VERBOSE(but keeping change to \$CPPFLAGS) + fi + CFLAGS="$cf_check_flags"]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_ERRNO version: 13 updated: 2020/03/10 18:53:47 +dnl -------------- +dnl Check for data that is usually declared in or , e.g., +dnl the 'errno' variable. Define a DECL_xxx symbol if we must declare it +dnl ourselves. +dnl +dnl $1 = the name to check +dnl $2 = the assumed type +AC_DEFUN([CF_CHECK_ERRNO], +[ +AC_CACHE_CHECK(if external $1 is declared, cf_cv_dcl_$1,[ + AC_TRY_COMPILE([ +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include ], + ifelse([$2],,int,[$2]) x = (ifelse([$2],,int,[$2])) $1; (void)x, + [cf_cv_dcl_$1=yes], + [cf_cv_dcl_$1=no]) +]) + +if test "$cf_cv_dcl_$1" = no ; then + CF_UPPER(cf_result,decl_$1) + AC_DEFINE_UNQUOTED($cf_result) +fi + +# It's possible (for near-UNIX clones) that the data doesn't exist +CF_CHECK_EXTERN_DATA($1,ifelse([$2],,int,[$2])) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CHECK_EXTERN_DATA version: 4 updated: 2015/04/18 08:56:57 +dnl -------------------- +dnl Check for existence of external data in the current set of libraries. If +dnl we can modify it, it's real enough. +dnl $1 = the name to check +dnl $2 = its type +AC_DEFUN([CF_CHECK_EXTERN_DATA], +[ +AC_CACHE_CHECK(if external $1 exists, cf_cv_have_$1,[ + AC_TRY_LINK([ +#undef $1 +extern $2 $1; +], + [$1 = 2], + [cf_cv_have_$1=yes], + [cf_cv_have_$1=no]) +]) + +if test "$cf_cv_have_$1" = yes ; then + CF_UPPER(cf_result,have_$1) + AC_DEFINE_UNQUOTED($cf_result) +fi + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_CLANG_COMPILER version: 2 updated: 2013/11/19 19:23:35 +dnl ----------------- +dnl Check if the given compiler is really clang. clang's C driver defines +dnl __GNUC__ (fooling the configure script into setting $GCC to yes) but does +dnl not ignore some gcc options. +dnl +dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to +dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from +dnl the wrappers for gcc and g++ warnings. +dnl +dnl $1 = GCC (default) or GXX +dnl $2 = CLANG_COMPILER (default) +dnl $3 = CFLAGS (default) or CXXFLAGS +AC_DEFUN([CF_CLANG_COMPILER],[ +ifelse([$2],,CLANG_COMPILER,[$2])=no + +if test "$ifelse([$1],,[$1],GCC)" = yes ; then + AC_MSG_CHECKING(if this is really Clang ifelse([$1],GXX,C++,C) compiler) + cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])" + ifelse([$3],,CFLAGS,[$3])="$ifelse([$3],,CFLAGS,[$3]) -Qunused-arguments" + AC_TRY_COMPILE([],[ +#ifdef __clang__ +#else +make an error +#endif +],[ifelse([$2],,CLANG_COMPILER,[$2])=yes +cf_save_CFLAGS="$cf_save_CFLAGS -Qunused-arguments" +],[]) + ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS" + AC_MSG_RESULT($ifelse([$2],,CLANG_COMPILER,[$2])) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_CONST_X_STRING version: 4 updated: 2020/03/10 18:53:47 +dnl ----------------- +dnl The X11R4-X11R6 Xt specification uses an ambiguous String type for most +dnl character-strings. +dnl +dnl It is ambiguous because the specification accommodated the pre-ANSI +dnl compilers bundled by more than one vendor in lieu of providing a standard C +dnl compiler other than by costly add-ons. Because of this, the specification +dnl did not take into account the use of const for telling the compiler that +dnl string literals would be in readonly memory. +dnl +dnl As a workaround, one could (starting with X11R5) define XTSTRINGDEFINES, to +dnl let the compiler decide how to represent Xt's strings which were #define'd. +dnl That does not solve the problem of using the block of Xt's strings which +dnl are compiled into the library (and is less efficient than one might want). +dnl +dnl Xt specification 7 introduces the _CONST_X_STRING symbol which is used both +dnl when compiling the library and compiling using the library, to tell the +dnl compiler that String is const. +AC_DEFUN([CF_CONST_X_STRING], +[ +AC_REQUIRE([AC_PATH_XTRA]) + +CF_SAVE_XTRA_FLAGS([CF_CONST_X_STRING]) + +AC_TRY_COMPILE( +[ +#include +#include +], +[String foo = malloc(1); (void)foo],[ + +AC_CACHE_CHECK(for X11/Xt const-feature,cf_cv_const_x_string,[ + AC_TRY_COMPILE( + [ +#define _CONST_X_STRING /* X11R7.8 (perhaps) */ +#undef XTSTRINGDEFINES /* X11R5 and later */ +#include +#include + ],[String foo = malloc(1); *foo = 0],[ + cf_cv_const_x_string=no + ],[ + cf_cv_const_x_string=yes + ]) +]) + +CF_RESTORE_XTRA_FLAGS([CF_CONST_X_STRING]) + +case $cf_cv_const_x_string in +(no) + CF_APPEND_TEXT(CPPFLAGS,-DXTSTRINGDEFINES) + ;; +(*) + CF_APPEND_TEXT(CPPFLAGS,-D_CONST_X_STRING) + ;; +esac + +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_DESKTOP version: 2 updated: 2011/04/22 05:17:37 +dnl ------------------ +dnl Handle a configure option "--disable-desktop", which sets a shell +dnl variable $desktop_utils to a "#" if the feature is not wanted, or to an +dnl empty string if enabled. The variable is used to substitute in front of +dnl corresponding makefile-rules. +dnl +dnl It also tells the configure script to substitute the environment variable +dnl $DESKTOP_FLAGS, which can be used by external scripts to customize the +dnl invocation of desktop-file-util. +dnl +dnl $1 = program name +AC_DEFUN([CF_DISABLE_DESKTOP],[ +# Comment-out the install-desktop rule if the desktop-utils are not found. +AC_MSG_CHECKING(if you want to install desktop files) +CF_ARG_OPTION(desktop, + [ --disable-desktop disable install of $1 desktop files], + [enable_desktop=$enableval], + [enable_desktop=$enableval],yes) +AC_MSG_RESULT($enable_desktop) + +desktop_utils= +if test "$enable_desktop" = yes ; then +AC_CHECK_PROG(desktop_utils,desktop-file-install,yes,no) +fi + +test "$desktop_utils" = yes && desktop_utils= || desktop_utils="#" +AC_SUBST(DESKTOP_FLAGS) +]) +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_ECHO version: 13 updated: 2015/04/18 08:56:57 +dnl --------------- +dnl You can always use "make -n" to see the actual options, but it's hard to +dnl pick out/analyze warning messages when the compile-line is long. +dnl +dnl Sets: +dnl ECHO_LT - symbol to control if libtool is verbose +dnl ECHO_LD - symbol to prefix "cc -o" lines +dnl RULE_CC - symbol to put before implicit "cc -c" lines (e.g., .c.o) +dnl SHOW_CC - symbol to put before explicit "cc -c" lines +dnl ECHO_CC - symbol to put before any "cc" line +dnl +AC_DEFUN([CF_DISABLE_ECHO],[ +AC_MSG_CHECKING(if you want to see long compiling messages) +CF_ARG_DISABLE(echo, + [ --disable-echo do not display "compiling" commands], + [ + ECHO_LT='--silent' + ECHO_LD='@echo linking [$]@;' + RULE_CC='@echo compiling [$]<' + SHOW_CC='@echo compiling [$]@' + ECHO_CC='@' +],[ + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' +]) +AC_MSG_RESULT($enableval) +AC_SUBST(ECHO_LT) +AC_SUBST(ECHO_LD) +AC_SUBST(RULE_CC) +AC_SUBST(SHOW_CC) +AC_SUBST(ECHO_CC) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_LEAKS version: 7 updated: 2012/10/02 20:55:03 +dnl ---------------- +dnl Combine no-leak checks with the libraries or tools that are used for the +dnl checks. +AC_DEFUN([CF_DISABLE_LEAKS],[ + +AC_REQUIRE([CF_WITH_DMALLOC]) +AC_REQUIRE([CF_WITH_DBMALLOC]) +AC_REQUIRE([CF_WITH_VALGRIND]) + +AC_MSG_CHECKING(if you want to perform memory-leak testing) +AC_ARG_ENABLE(leaks, + [ --disable-leaks test: free permanent memory, analyze leaks], + [if test "x$enableval" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi], + : ${with_no_leaks:=no}) +AC_MSG_RESULT($with_no_leaks) + +if test "$with_no_leaks" = yes ; then + AC_DEFINE(NO_LEAKS,1,[Define to 1 if you want to perform memory-leak testing.]) + AC_DEFINE(YY_NO_LEAKS,1,[Define to 1 if you want to perform memory-leak testing.]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_DISABLE_RPATH_HACK version: 2 updated: 2011/02/13 13:31:33 +dnl --------------------- +dnl The rpath-hack makes it simpler to build programs, particularly with the +dnl *BSD ports which may have essential libraries in unusual places. But it +dnl can interfere with building an executable for the base system. Use this +dnl option in that case. +AC_DEFUN([CF_DISABLE_RPATH_HACK], +[ +AC_MSG_CHECKING(if rpath-hack should be disabled) +CF_ARG_DISABLE(rpath-hack, + [ --disable-rpath-hack don't add rpath options for additional libraries], + [cf_disable_rpath_hack=yes], + [cf_disable_rpath_hack=no]) +AC_MSG_RESULT($cf_disable_rpath_hack) +if test "$cf_disable_rpath_hack" = no ; then + CF_RPATH_HACK +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_ENABLE_NARROWPROTO version: 5 updated: 2015/04/12 15:39:00 +dnl --------------------- +dnl If this is not set properly, Xaw's scrollbars will not work. +dnl The so-called "modular" configuration for X.org omits most of the +dnl configure checks that would be needed to provide compatibility with +dnl older X builds. This one breaks things noticeably. +AC_DEFUN([CF_ENABLE_NARROWPROTO], +[ +AC_MSG_CHECKING(if you want narrow prototypes for X libraries) + +case `$ac_config_guess` in +(*freebsd*|*gnu*|*irix5*|*irix6*|*linux-gnu*|*netbsd*|*openbsd*|*qnx*|*sco*|*sgi*) + cf_default_narrowproto=yes + ;; +(*) + cf_default_narrowproto=no + ;; +esac + +CF_ARG_OPTION(narrowproto, + [ --enable-narrowproto enable narrow prototypes for X libraries], + [enable_narrowproto=$enableval], + [enable_narrowproto=$cf_default_narrowproto], + [$cf_default_narrowproto]) +AC_MSG_RESULT($enable_narrowproto) +]) +dnl --------------------------------------------------------------------------- +dnl CF_ERRNO version: 5 updated: 1997/11/30 12:44:39 +dnl -------- +dnl Check if 'errno' is declared in +AC_DEFUN([CF_ERRNO], +[ +CF_CHECK_ERRNO(errno) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_GRANTPT version: 14 updated: 2018/08/12 04:58:46 +dnl --------------- +dnl Check for grantpt versus openpty, as well as functions that "should" be +dnl available if grantpt is available. +AC_DEFUN([CF_FUNC_GRANTPT],[ + +AC_CHECK_HEADERS( \ +stropts.h \ +) + +cf_func_grantpt="grantpt ptsname" +cf_prefer_openpt=no +case $host_os in +(darwin[[0-9]].*) + ;; +(openbsd[[0-9]].*) + # The POSIX entrypoints exist, but have never worked. + ;; +(linux*) + cf_func_grantpt="$cf_func_grantpt posix_openpt" + cf_prefer_openpt=yes + ;; +(*) + cf_func_grantpt="$cf_func_grantpt posix_openpt" + ;; +esac + +AC_CHECK_FUNCS($cf_func_grantpt) + +cf_grantpt_opts= +if test "x$ac_cv_func_grantpt" = "xyes" ; then + AC_MSG_CHECKING(if grantpt really works) + AC_TRY_LINK(CF__GRANTPT_HEAD,CF__GRANTPT_BODY,[ + AC_TRY_RUN(CF__GRANTPT_HEAD +int main(void) +{ +CF__GRANTPT_BODY +} +, +,ac_cv_func_grantpt=no +,ac_cv_func_grantpt=maybe) + ],ac_cv_func_grantpt=no) + AC_MSG_RESULT($ac_cv_func_grantpt) + + if test "x$ac_cv_func_grantpt" != "xno" ; then + + if test "x$ac_cv_func_grantpt" = "xyes" ; then + AC_MSG_CHECKING(for pty features) +dnl if we have no stropts.h, skip the checks for streams modules + if test "x$ac_cv_header_stropts_h" = xyes + then + cf_pty_this=0 + else + cf_pty_this=3 + fi + + cf_pty_defines= + while test $cf_pty_this != 6 + do + + cf_pty_feature= + cf_pty_next=`expr $cf_pty_this + 1` + CF_MSG_LOG(pty feature test $cf_pty_next:5) + AC_TRY_RUN(#define CONFTEST $cf_pty_this +$cf_pty_defines +CF__GRANTPT_HEAD +int main(void) +{ +CF__GRANTPT_BODY +} +, +[ + case $cf_pty_next in + (1) # - streams + cf_pty_feature=ptem + ;; + (2) # - streams + cf_pty_feature=ldterm + ;; + (3) # - streams + cf_pty_feature=ttcompat + ;; + (4) + cf_pty_feature=pty_isatty + ;; + (5) + cf_pty_feature=pty_tcsetattr + ;; + (6) + cf_pty_feature=tty_tcsetattr + ;; + esac +],[ + case $cf_pty_next in + (1|2|3) + CF_MSG_LOG(skipping remaining streams features $cf_pty_this..2) + cf_pty_next=3 + ;; + esac +]) + if test -n "$cf_pty_feature" + then + cf_pty_defines="$cf_pty_defines +#define CONFTEST_$cf_pty_feature 1 +" + cf_grantpt_opts="$cf_grantpt_opts $cf_pty_feature" + fi + + cf_pty_this=$cf_pty_next + done + AC_MSG_RESULT($cf_grantpt_opts) + cf_grantpt_opts=`echo "$cf_grantpt_opts" | sed -e 's/ isatty//'` + fi + fi +fi + +dnl If we found grantpt, but no features, e.g., for streams or if we are not +dnl able to use tcsetattr, then give openpty a try. In particular, Darwin 10.7 +dnl has a more functional openpty than posix_openpt. +dnl +dnl There is no configure run-test for openpty, since older implementations do +dnl not always run properly as a non-root user. For that reason, we also allow +dnl the configure script to suppress this check entirely with $disable_openpty. +if test "x$cf_prefer_posix_openpt" = "xyes" && test "x$ac_cv_func_posix_openpt" = "xyes" ; then + CF_VERBOSE(prefer posix_openpt over openpty) +elif test "x$disable_openpty" != "xyes" || test -z "$cf_grantpt_opts" ; then + AC_CHECK_LIB(util, openpty, [cf_have_openpty=yes],[cf_have_openpty=no]) + if test "$cf_have_openpty" = yes ; then + ac_cv_func_grantpt=no + LIBS="-lutil $LIBS" + AC_DEFINE(HAVE_OPENPTY,1,[Define to 1 if you have the openpty function]) + AC_CHECK_HEADERS( \ + util.h \ + libutil.h \ + pty.h \ + ) + fi +fi + +dnl If we did not settle on using openpty, fill in the definitions for grantpt. +if test "x$ac_cv_func_grantpt" != xno +then + CF_VERBOSE(will rely upon grantpt) + AC_DEFINE(HAVE_WORKING_GRANTPT,1,[Define to 1 if the grantpt function seems to work]) + for cf_feature in $cf_grantpt_opts + do + cf_feature=`echo "$cf_feature" | sed -e 's/ //g'` + CF_UPPER(cf_FEATURE,$cf_feature) + AC_DEFINE_UNQUOTED(HAVE_GRANTPT_$cf_FEATURE) + done +elif test "x$cf_have_openpty" = xno +then + CF_VERBOSE(will rely upon BSD-pseudoterminals) +else + CF_VERBOSE(will rely upon openpty) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_FUNC_TGETENT version: 23 updated: 2020/06/02 20:17:00 +dnl --------------- +dnl Check for tgetent function in termcap library. If we cannot find this, +dnl we'll use the $LINES and $COLUMNS environment variables to pass screen +dnl size information to subprocesses. (We cannot use terminfo's compatibility +dnl function, since it cannot provide the termcap-format data). +dnl +dnl If the --disable-full-tgetent option is given, we'll settle for the first +dnl tgetent function we find. Since the search list in that case does not +dnl include the termcap library, that allows us to default to terminfo. +AC_DEFUN([CF_FUNC_TGETENT], +[ +# compute a reasonable value for $TERM to give tgetent(), since we may be +# running in 'screen', which sets $TERMCAP to a specific entry that is not +# necessarily in /etc/termcap - unsetenv is not portable, so we cannot simply +# discard $TERMCAP. +cf_TERMVAR=vt100 +if test -n "$TERMCAP" +then + cf_TERMCAP=`echo "$TERMCAP" | tr '\n' ' ' | sed -e 's/^..|//' -e 's/|.*//'` + case "$cf_TERMCAP" in + (screen*.*) + ;; + (*) + cf_TERMVAR="$cf_TERMCAP" + ;; + esac +fi +test -z "$cf_TERMVAR" && cf_TERMVAR=vt100 + +# BSD termcap used no header file +# SVr4 provided termcap prototypes as a legacy feature in term.h +# GNU termcap provided termcap prototypes in termcap.h +# ncurses provides termcap prototypes in both term.h and termcap.h +# +# The terminfo-based termcap interfaces do not provide a full tgetent (i.e., do +# not return the text of the termcap entry in the buffer), but as a special +# case, FreeBSD provides ncurses' termcap.h with a modified termcap reader that +# returns the termcap text. +AC_CHECK_HEADERS(termcap.h) + +AC_MSG_CHECKING(if we want full tgetent function) +CF_ARG_DISABLE(full-tgetent, + [ --disable-full-tgetent disable check for full tgetent function], + cf_full_tgetent=no, + cf_full_tgetent=yes,yes) +AC_MSG_RESULT($cf_full_tgetent) + +if test "$cf_full_tgetent" = yes ; then + cf_test_message="full tgetent" +else + cf_test_message="tgetent" +fi + +AC_CACHE_CHECK(for $cf_test_message function,cf_cv_lib_tgetent,[ +cf_save_LIBS="$LIBS" +cf_cv_lib_tgetent=no +if test "$cf_full_tgetent" = yes ; then + cf_TERMLIB="otermcap termcap termlib ncurses curses" + cf_TERMTST="buffer[[0]] == 0" +else + cf_TERMLIB="termlib ncurses curses" + cf_TERMTST="0" +fi +for cf_termlib in '' $cf_TERMLIB ; do + LIBS="$cf_save_LIBS" + test -n "$cf_termlib" && { CF_ADD_LIB($cf_termlib) } + AC_TRY_RUN([ +#ifdef HAVE_TERMCAP_H +#include +#endif +/* terminfo implementations ignore the buffer argument, making it useless for + * the xterm application, which uses this information to make a new TERMCAP + * environment variable. + */ +int main(void) +{ + char buffer[1024]; + buffer[0] = 0; + tgetent(buffer, "$cf_TERMVAR"); + ${cf_cv_main_return:-return} ($cf_TERMTST); }], + [echo "yes, there is a termcap/tgetent in $cf_termlib" 1>&AC_FD_CC + if test -n "$cf_termlib" ; then + cf_cv_lib_tgetent="-l$cf_termlib" + else + cf_cv_lib_tgetent=yes + fi + break], + [echo "no, there is no termcap/tgetent in $cf_termlib" 1>&AC_FD_CC], + [echo "cross-compiling, cannot verify if a termcap/tgetent is present in $cf_termlib" 1>&AC_FD_CC]) +done +LIBS="$cf_save_LIBS" +]) + +# If we found a working tgetent(), set LIBS and check for termcap.h. +# (LIBS cannot be set inside AC_CACHE_CHECK; the commands there should +# not have side effects other than setting the cache variable, because +# they are not executed when a cached value exists.) +if test "x$cf_cv_lib_tgetent" != xno ; then + test "x$cf_cv_lib_tgetent" != xyes && { CF_ADD_LIBS($cf_cv_lib_tgetent) } + AC_DEFINE(USE_TERMCAP,1,[Define 1 to indicate that working tgetent is found]) + if test "$cf_full_tgetent" = no ; then + AC_TRY_COMPILE([ +#include ],[ +#ifdef NCURSES_VERSION +make an error +#endif],[AC_DEFINE(HAVE_TERMCAP_H)]) + else + AC_CHECK_HEADERS(termcap.h) + fi +else + # If we didn't find a tgetent() that supports the buffer + # argument, look again to see whether we can find even + # a crippled one. A crippled tgetent() is still useful to + # validate values for the TERM environment variable given to + # child processes. + AC_CACHE_CHECK(for partial tgetent function,cf_cv_lib_part_tgetent,[ + cf_cv_lib_part_tgetent=no + for cf_termlib in $cf_TERMLIB ; do + LIBS="$cf_save_LIBS -l$cf_termlib" + AC_TRY_LINK([],[tgetent(0, "$cf_TERMVAR")], + [echo "there is a terminfo/tgetent in $cf_termlib" 1>&AC_FD_CC + cf_cv_lib_part_tgetent="-l$cf_termlib" + break]) + done + LIBS="$cf_save_LIBS" + ]) + + if test "$cf_cv_lib_part_tgetent" != no ; then + CF_ADD_LIBS($cf_cv_lib_part_tgetent) + AC_CHECK_HEADERS(termcap.h) + + # If this is linking against ncurses, we'll trigger the + # ifdef in resize.c that turns the termcap stuff back off. + AC_DEFINE(USE_TERMINFO,1,[Define to 1 to indicate that terminfo provides the tgetent interface]) + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_ATTRIBUTES version: 18 updated: 2020/03/10 18:53:47 +dnl ----------------- +dnl Test for availability of useful gcc __attribute__ directives to quiet +dnl compiler warnings. Though useful, not all are supported -- and contrary +dnl to documentation, unrecognized directives cause older compilers to barf. +AC_DEFUN([CF_GCC_ATTRIBUTES], +[ +if test "$GCC" = yes +then +cat > conftest.i < conftest.$ac_ext <&AC_FD_CC + + case $cf_attribute in + (printf) + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <>confdefs.h + case $cf_attribute in + (noreturn) + AC_DEFINE_UNQUOTED(GCC_NORETURN,$cf_directive,[Define to noreturn-attribute for gcc]) + ;; + (printf) + cf_value='/* nothing */' + if test "$cf_printf_attribute" != no ; then + cf_value='__attribute__((format(printf,fmt,var)))' + AC_DEFINE(GCC_PRINTF,1,[Define to 1 if the compiler supports gcc-like printf attribute.]) + fi + AC_DEFINE_UNQUOTED(GCC_PRINTFLIKE(fmt,var),$cf_value,[Define to printf-attribute for gcc]) + ;; + (scanf) + cf_value='/* nothing */' + if test "$cf_scanf_attribute" != no ; then + cf_value='__attribute__((format(scanf,fmt,var)))' + AC_DEFINE(GCC_SCANF,1,[Define to 1 if the compiler supports gcc-like scanf attribute.]) + fi + AC_DEFINE_UNQUOTED(GCC_SCANFLIKE(fmt,var),$cf_value,[Define to sscanf-attribute for gcc]) + ;; + (unused) + AC_DEFINE_UNQUOTED(GCC_UNUSED,$cf_directive,[Define to unused-attribute for gcc]) + ;; + esac + fi + done +else + fgrep define conftest.i >>confdefs.h +fi +rm -rf conftest* +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_VERSION version: 8 updated: 2019/09/07 13:38:36 +dnl -------------- +dnl Find version of gcc, and (because icc/clang pretend to be gcc without being +dnl compatible), attempt to determine if icc/clang is actually used. +AC_DEFUN([CF_GCC_VERSION],[ +AC_REQUIRE([AC_PROG_CC]) +GCC_VERSION=none +if test "$GCC" = yes ; then + AC_MSG_CHECKING(version of $CC) + GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[[^)]]*) //' -e 's/^.*(Debian[[^)]]*) //' -e 's/^[[^0-9.]]*//' -e 's/[[^0-9.]].*//'`" + test -z "$GCC_VERSION" && GCC_VERSION=unknown + AC_MSG_RESULT($GCC_VERSION) +fi +CF_INTEL_COMPILER(GCC,INTEL_COMPILER,CFLAGS) +CF_CLANG_COMPILER(GCC,CLANG_COMPILER,CFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_GCC_WARNINGS version: 37 updated: 2020/01/05 20:04:12 +dnl --------------- +dnl Check if the compiler supports useful warning options. There's a few that +dnl we don't use, simply because they're too noisy: +dnl +dnl -Wconversion (useful in older versions of gcc, but not in gcc 2.7.x) +dnl -Winline (usually not worthwhile) +dnl -Wredundant-decls (system headers make this too noisy) +dnl -Wtraditional (combines too many unrelated messages, only a few useful) +dnl -Wwrite-strings (too noisy, but should review occasionally). This +dnl is enabled for ncurses using "--enable-const". +dnl -pedantic +dnl +dnl Parameter: +dnl $1 is an optional list of gcc warning flags that a particular +dnl application might want to use, e.g., "no-unused" for +dnl -Wno-unused +dnl Special: +dnl If $with_ext_const is "yes", add a check for -Wwrite-strings +dnl +AC_DEFUN([CF_GCC_WARNINGS], +[ +AC_REQUIRE([CF_GCC_VERSION]) +if test "x$have_x" = xyes; then CF_CONST_X_STRING fi +cat > conftest.$ac_ext <],[ + #if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0 + return 0; + #elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0 + return 0; + #else + # error not GNU C library + #endif], + [cf_cv_gnu_library=yes], + [cf_cv_gnu_library=no]) +]) + +if test x$cf_cv_gnu_library = xyes; then + + # With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE + # was changed to help a little. newlib incorporated the change about 4 + # years later. + AC_CACHE_CHECK(if _DEFAULT_SOURCE can be used as a basis,cf_cv_gnu_library_219,[ + cf_save="$CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE) + AC_TRY_COMPILE([#include ],[ + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2) + return 0; + #elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3) + return 0; + #else + # error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old + #endif], + [cf_cv_gnu_library_219=yes], + [cf_cv_gnu_library_219=no]) + CPPFLAGS="$cf_save" + ]) + + if test "x$cf_cv_gnu_library_219" = xyes; then + cf_save="$CPPFLAGS" + AC_CACHE_CHECK(if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE,cf_cv_gnu_dftsrc_219,[ + CF_ADD_CFLAGS(-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source) + AC_TRY_COMPILE([ + #include + #include + ],[ + #if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1) + return 0; + #else + # error GNU C library is too old + #endif], + [cf_cv_gnu_dftsrc_219=yes], + [cf_cv_gnu_dftsrc_219=no]) + ]) + test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save" + else + cf_cv_gnu_dftsrc_219=maybe + fi + + if test "x$cf_cv_gnu_dftsrc_219" != xyes; then + + AC_CACHE_CHECK(if we must define _GNU_SOURCE,cf_cv_gnu_source,[ + AC_TRY_COMPILE([#include ],[ + #ifndef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be defined + #endif], + [cf_cv_gnu_source=no], + [cf_save="$CPPFLAGS" + CF_ADD_CFLAGS(-D_GNU_SOURCE) + AC_TRY_COMPILE([#include ],[ + #ifdef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be undefined + #endif], + [cf_cv_gnu_source=no], + [cf_cv_gnu_source=yes]) + CPPFLAGS="$cf_save" + ]) + ]) + + if test "$cf_cv_gnu_source" = yes + then + AC_CACHE_CHECK(if we should also define _DEFAULT_SOURCE,cf_cv_default_source,[ + CF_APPEND_TEXT(CPPFLAGS,-D_GNU_SOURCE) + AC_TRY_COMPILE([#include ],[ + #ifdef _DEFAULT_SOURCE + #error expected _DEFAULT_SOURCE to be undefined + #endif], + [cf_cv_default_source=no], + [cf_cv_default_source=yes]) + ]) + if test "$cf_cv_default_source" = yes + then + CF_APPEND_TEXT(CPPFLAGS,-D_DEFAULT_SOURCE) + fi + fi + fi + +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_HELP_MESSAGE version: 4 updated: 2019/12/31 08:53:54 +dnl --------------- +dnl Insert text into the help-message, for readability, from AC_ARG_WITH. +AC_DEFUN([CF_HELP_MESSAGE], +[CF_ACVERSION_CHECK(2.53,[],[ +AC_DIVERT_HELP($1)])dnl +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_IMAKE_CFLAGS version: 32 updated: 2015/04/12 15:39:00 +dnl --------------- +dnl Use imake to obtain compiler flags. We could, in principle, write tests to +dnl get these, but if imake is properly configured there is no point in doing +dnl this. +dnl +dnl Parameters (used in constructing a sample Imakefile): +dnl $1 = optional value to append to $IMAKE_CFLAGS +dnl $2 = optional value to append to $IMAKE_LOADFLAGS +AC_DEFUN([CF_IMAKE_CFLAGS], +[ +AC_PATH_PROGS(IMAKE,xmkmf imake) + +if test -n "$IMAKE" ; then + +case $IMAKE in +(*/imake) + cf_imake_opts="-DUseInstalled=YES" + ;; +(*/util/xmkmf) + # A single parameter tells xmkmf where the config-files are: + cf_imake_opts="`echo $IMAKE|sed -e s,/config/util/xmkmf,,`" + ;; +(*) + cf_imake_opts= + ;; +esac + +# If it's installed properly, imake (or its wrapper, xmkmf) will point to the +# config directory. +if mkdir conftestdir; then + CDPATH=; export CDPATH + cf_makefile=`cd $srcdir;pwd`/Imakefile + cd conftestdir + + cat >fix_cflags.sed <<'CF_EOF' +s/\\//g +s/[[ ]][[ ]]*/ /g +s/"//g +:pack +s/\(=[[^ ]][[^ ]]*\) \([[^-]]\)/\1 \2/g +t pack +s/\(-D[[a-zA-Z0-9_]][[a-zA-Z0-9_]]*\)=\([[^\'0-9 ]][[^ ]]*\)/\1='\\"\2\\"'/g +s/^IMAKE[[ ]]/IMAKE_CFLAGS="/ +s/ / /g +s/$/"/ +CF_EOF + + cat >fix_lflags.sed <<'CF_EOF' +s/^IMAKE[[ ]]*/IMAKE_LOADFLAGS="/ +s/$/"/ +CF_EOF + + echo >./Imakefile + test -f $cf_makefile && cat $cf_makefile >>./Imakefile + + cat >> ./Imakefile <<'CF_EOF' +findstddefs: + @echo IMAKE ${ALLDEFINES}ifelse([$1],,,[ $1]) | sed -f fix_cflags.sed + @echo IMAKE ${EXTRA_LOAD_FLAGS}ifelse([$2],,,[ $2]) | sed -f fix_lflags.sed +CF_EOF + + if ( $IMAKE $cf_imake_opts 1>/dev/null 2>&AC_FD_CC && test -f Makefile) + then + CF_VERBOSE(Using $IMAKE $cf_imake_opts) + else + # sometimes imake doesn't have the config path compiled in. Find it. + cf_config= + for cf_libpath in $X_LIBS $LIBS ; do + case $cf_libpath in + (-L*) + cf_libpath=`echo .$cf_libpath | sed -e 's/^...//'` + cf_libpath=$cf_libpath/X11/config + if test -d $cf_libpath ; then + cf_config=$cf_libpath + break + fi + ;; + esac + done + if test -z "$cf_config" ; then + AC_MSG_WARN(Could not find imake config-directory) + else + cf_imake_opts="$cf_imake_opts -I$cf_config" + if ( $IMAKE -v $cf_imake_opts 2>&AC_FD_CC) + then + CF_VERBOSE(Using $IMAKE $cf_config) + else + AC_MSG_WARN(Cannot run $IMAKE) + fi + fi + fi + + # GNU make sometimes prints "make[1]: Entering...", which + # would confuse us. + eval `make findstddefs 2>/dev/null | grep -v make` + + cd .. + rm -rf conftestdir + + # We use ${ALLDEFINES} rather than ${STD_DEFINES} because the former + # declares XTFUNCPROTO there. However, some vendors (e.g., SGI) have + # modified it to support site.cf, adding a kludge for the /usr/include + # directory. Try to filter that out, otherwise gcc won't find its + # headers. + if test -n "$GCC" ; then + if test -n "$IMAKE_CFLAGS" ; then + cf_nostdinc="" + cf_std_incl="" + cf_cpp_opts="" + for cf_opt in $IMAKE_CFLAGS + do + case "$cf_opt" in + (-nostdinc) + cf_nostdinc="$cf_opt" + ;; + (-I/usr/include) + cf_std_incl="$cf_opt" + ;; + (*) + cf_cpp_opts="$cf_cpp_opts $cf_opt" + ;; + esac + done + if test -z "$cf_nostdinc" ; then + IMAKE_CFLAGS="$cf_cpp_opts $cf_std_incl" + elif test -z "$cf_std_incl" ; then + IMAKE_CFLAGS="$cf_cpp_opts $cf_nostdinc" + else + CF_VERBOSE(suppressed \"$cf_nostdinc\" and \"$cf_std_incl\") + IMAKE_CFLAGS="$cf_cpp_opts" + fi + fi + fi +fi + +# Some imake configurations define PROJECTROOT with an empty value. Remove +# the empty definition. +case $IMAKE_CFLAGS in +(*-DPROJECTROOT=/*) + ;; +(*) + IMAKE_CFLAGS=`echo "$IMAKE_CFLAGS" |sed -e "s,-DPROJECTROOT=[[ ]], ,"` + ;; +esac + +fi + +CF_VERBOSE(IMAKE_CFLAGS $IMAKE_CFLAGS) +CF_VERBOSE(IMAKE_LOADFLAGS $IMAKE_LOADFLAGS) + +AC_SUBST(IMAKE_CFLAGS) +AC_SUBST(IMAKE_LOADFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INPUT_METHOD version: 4 updated: 2020/03/10 18:53:47 +dnl --------------- +dnl Check if the X libraries support input-method +AC_DEFUN([CF_INPUT_METHOD], +[ +AC_CACHE_CHECK([if X libraries support input-method],cf_cv_input_method,[ +AC_TRY_LINK([ +#include +#include +#include +#include +#include +#include +],[ +{ + XIM xim; + XIMStyles *xim_styles = 0; + XIMStyle input_style; + Widget w = 0; + + XSetLocaleModifiers("@im=none"); + xim = XOpenIM(XtDisplay(w), NULL, NULL, NULL); + XGetIMValues(xim, XNQueryInputStyle, &xim_styles, NULL); + XCloseIM(xim); + input_style = (XIMPreeditNothing | XIMStatusNothing); + (void)xim_styles; + (void)input_style; +} +], +[cf_cv_input_method=yes], +[cf_cv_input_method=no])]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_INTEL_COMPILER version: 7 updated: 2015/04/12 15:39:00 +dnl ----------------- +dnl Check if the given compiler is really the Intel compiler for Linux. It +dnl tries to imitate gcc, but does not return an error when it finds a mismatch +dnl between prototypes, e.g., as exercised by CF_MISSING_CHECK. +dnl +dnl This macro should be run "soon" after AC_PROG_CC or AC_PROG_CPLUSPLUS, to +dnl ensure that it is not mistaken for gcc/g++. It is normally invoked from +dnl the wrappers for gcc and g++ warnings. +dnl +dnl $1 = GCC (default) or GXX +dnl $2 = INTEL_COMPILER (default) or INTEL_CPLUSPLUS +dnl $3 = CFLAGS (default) or CXXFLAGS +AC_DEFUN([CF_INTEL_COMPILER],[ +AC_REQUIRE([AC_CANONICAL_HOST]) +ifelse([$2],,INTEL_COMPILER,[$2])=no + +if test "$ifelse([$1],,[$1],GCC)" = yes ; then + case $host_os in + (linux*|gnu*) + AC_MSG_CHECKING(if this is really Intel ifelse([$1],GXX,C++,C) compiler) + cf_save_CFLAGS="$ifelse([$3],,CFLAGS,[$3])" + ifelse([$3],,CFLAGS,[$3])="$ifelse([$3],,CFLAGS,[$3]) -no-gcc" + AC_TRY_COMPILE([],[ +#ifdef __INTEL_COMPILER +#else +make an error +#endif +],[ifelse([$2],,INTEL_COMPILER,[$2])=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147" +],[]) + ifelse([$3],,CFLAGS,[$3])="$cf_save_CFLAGS" + AC_MSG_RESULT($ifelse([$2],,INTEL_COMPILER,[$2])) + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LASTLOG version: 6 updated: 2020/03/10 18:53:47 +dnl ---------- +dnl Check for header defining _PATH_LASTLOG, or failing that, see if the lastlog +dnl file exists. +AC_DEFUN([CF_LASTLOG], +[ +AC_CHECK_HEADERS(lastlog.h paths.h) +AC_CACHE_CHECK(for lastlog path,cf_cv_path_lastlog,[ +AC_TRY_COMPILE([ +#include +#ifdef HAVE_LASTLOG_H +#include +#else +#ifdef HAVE_PATHS_H +#include +#endif +#endif],[char *path = _PATH_LASTLOG; (void)path], + [cf_cv_path_lastlog="_PATH_LASTLOG"], + [if test -f /usr/adm/lastlog ; then + cf_cv_path_lastlog=/usr/adm/lastlog + else + cf_cv_path_lastlog=no + fi]) +]) +test $cf_cv_path_lastlog != no && AC_DEFINE(USE_LASTLOG,1,[Define to 1 if we can define lastlog pathname]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_LD_RPATH_OPT version: 8 updated: 2018/08/18 16:36:35 +dnl --------------- +dnl For the given system and compiler, find the compiler flags to pass to the +dnl loader to use the "rpath" feature. +AC_DEFUN([CF_LD_RPATH_OPT], +[ +AC_REQUIRE([CF_CHECK_CACHE]) + +LD_RPATH_OPT= +if test "x$cf_cv_enable_rpath" != xno +then + AC_MSG_CHECKING(for an rpath option) + case $cf_cv_system_name in + (irix*) + if test "$GCC" = yes; then + LD_RPATH_OPT="-Wl,-rpath," + else + LD_RPATH_OPT="-rpath " + fi + ;; + (linux*|gnu*|k*bsd*-gnu|freebsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (openbsd[[2-9]].*|mirbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (dragonfly*) + LD_RPATH_OPT="-rpath " + ;; + (netbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (osf*|mls+*) + LD_RPATH_OPT="-rpath " + ;; + (solaris2*) + LD_RPATH_OPT="-R" + ;; + (*) + ;; + esac + AC_MSG_RESULT($LD_RPATH_OPT) + + case "x$LD_RPATH_OPT" in + (x-R*) + AC_MSG_CHECKING(if we need a space after rpath option) + cf_save_LIBS="$LIBS" + CF_ADD_LIBS(${LD_RPATH_OPT}$libdir) + AC_TRY_LINK(, , cf_rpath_space=no, cf_rpath_space=yes) + LIBS="$cf_save_LIBS" + AC_MSG_RESULT($cf_rpath_space) + test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT " + ;; + esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MAKE_TAGS version: 6 updated: 2010/10/23 15:52:32 +dnl ------------ +dnl Generate tags/TAGS targets for makefiles. Do not generate TAGS if we have +dnl a monocase filesystem. +AC_DEFUN([CF_MAKE_TAGS],[ +AC_REQUIRE([CF_MIXEDCASE_FILENAMES]) + +AC_CHECK_PROGS(CTAGS, exctags ctags) +AC_CHECK_PROGS(ETAGS, exetags etags) + +AC_CHECK_PROG(MAKE_LOWER_TAGS, ${CTAGS:-ctags}, yes, no) + +if test "$cf_cv_mixedcase" = yes ; then + AC_CHECK_PROG(MAKE_UPPER_TAGS, ${ETAGS:-etags}, yes, no) +else + MAKE_UPPER_TAGS=no +fi + +if test "$MAKE_UPPER_TAGS" = yes ; then + MAKE_UPPER_TAGS= +else + MAKE_UPPER_TAGS="#" +fi + +if test "$MAKE_LOWER_TAGS" = yes ; then + MAKE_LOWER_TAGS= +else + MAKE_LOWER_TAGS="#" +fi + +AC_SUBST(CTAGS) +AC_SUBST(ETAGS) + +AC_SUBST(MAKE_UPPER_TAGS) +AC_SUBST(MAKE_LOWER_TAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MATH_LIB version: 9 updated: 2017/01/21 11:06:25 +dnl ----------- +dnl Checks for libraries. At least one UNIX system, Apple Macintosh +dnl Rhapsody 5.5, does not have -lm. We cannot use the simpler +dnl AC_CHECK_LIB(m,sin), because that fails for C++. +AC_DEFUN([CF_MATH_LIB], +[ +AC_CACHE_CHECK(if -lm needed for math functions, + cf_cv_need_libm,[ + AC_TRY_LINK([ + #include + #include + #include + ], + [double x = rand(); printf("result = %g\n", ]ifelse([$2],,sin(x),$2)[)], + [cf_cv_need_libm=no], + [cf_cv_need_libm=yes])]) +if test "$cf_cv_need_libm" = yes +then +ifelse($1,,[ + CF_ADD_LIB(m) +],[$1=-lm]) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_MIXEDCASE_FILENAMES version: 7 updated: 2015/04/12 15:39:00 +dnl ---------------------- +dnl Check if the file-system supports mixed-case filenames. If we're able to +dnl create a lowercase name and see it as uppercase, it doesn't support that. +AC_DEFUN([CF_MIXEDCASE_FILENAMES], +[ +AC_CACHE_CHECK(if filesystem supports mixed-case filenames,cf_cv_mixedcase,[ +if test "$cross_compiling" = yes ; then + case $target_alias in + (*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*) + cf_cv_mixedcase=no + ;; + (*) + cf_cv_mixedcase=yes + ;; + esac +else + rm -f conftest CONFTEST + echo test >conftest + if test -f CONFTEST ; then + cf_cv_mixedcase=no + else + cf_cv_mixedcase=yes + fi + rm -f conftest CONFTEST +fi +]) +test "$cf_cv_mixedcase" = yes && AC_DEFINE(MIXEDCASE_FILENAMES,1,[Define to 1 if filesystem supports mixed-case filenames.]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_MSG_LOG version: 5 updated: 2010/10/23 15:52:32 +dnl ---------- +dnl Write a debug message to config.log, along with the line number in the +dnl configure script. +AC_DEFUN([CF_MSG_LOG],[ +echo "${as_me:-configure}:__oline__: testing $* ..." 1>&AC_FD_CC +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_NO_LEAKS_OPTION version: 6 updated: 2015/04/12 15:39:00 +dnl ------------------ +dnl see CF_WITH_NO_LEAKS +AC_DEFUN([CF_NO_LEAKS_OPTION],[ +AC_MSG_CHECKING(if you want to use $1 for testing) +AC_ARG_WITH($1, + [$2], + [AC_DEFINE_UNQUOTED($3,1,"Define to 1 if you want to use $1 for testing.")ifelse([$4],,[ + $4 +]) + : ${with_cflags:=-g} + : ${with_no_leaks:=yes} + with_$1=yes], + [with_$1=]) +AC_MSG_RESULT(${with_$1:-no}) + +case .$with_cflags in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + CF_ADD_CFLAGS([-g]) + ;; + esac + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PATHSEP version: 7 updated: 2015/04/12 15:39:00 +dnl ---------- +dnl Provide a value for the $PATH and similar separator (or amend the value +dnl as provided in autoconf 2.5x). +AC_DEFUN([CF_PATHSEP], +[ + AC_MSG_CHECKING(for PATH separator) + case $cf_cv_system_name in + (os2*) PATH_SEPARATOR=';' ;; + (*) ${PATH_SEPARATOR:=':'} ;; + esac +ifelse([$1],,,[$1=$PATH_SEPARATOR]) + AC_SUBST(PATH_SEPARATOR) + AC_MSG_RESULT($PATH_SEPARATOR) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PATH_PROG version: 10 updated: 2019/06/30 19:44:43 +dnl ------------ +dnl Check for a given program, defining corresponding symbol. +dnl $1 = environment variable, which is suffixed by "_PATH" in the #define. +dnl $2 = program name to find. +dnl $3 = optional list of additional program names to test. +dnl $4 = $PATH +dnl +dnl If there is more than one token in the result, #define the remaining tokens +dnl to $1_ARGS. We need this for 'install' in particular. +dnl +dnl FIXME: we should allow this to be overridden by environment variables +dnl +AC_DEFUN([CF_PATH_PROG],[ +AC_REQUIRE([CF_PATHSEP]) +test -z "[$]$1" && $1=$2 +AC_PATH_PROGS($1,[$]$1 $2 ifelse($3,,,$3),[$]$1, ifelse($4,,,$4)) + +cf_path_prog="" +cf_path_args="" +IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR" +for cf_temp in $ac_cv_path_$1 +do + if test -z "$cf_path_prog" ; then + if test "$with_full_paths" = yes ; then + CF_PATH_SYNTAX(cf_temp,break) + cf_path_prog="$cf_temp" + else + cf_path_prog="`basename $cf_temp`" + fi + elif test -z "$cf_path_args" ; then + cf_path_args="$cf_temp" + else + cf_path_args="$cf_path_args $cf_temp" + fi +done +IFS="$cf_save_ifs" + +if test -n "$cf_path_prog" ; then + CF_MSG_LOG(defining path for ${cf_path_prog}) + AC_DEFINE_UNQUOTED($1_PATH,"$cf_path_prog",Define to pathname $1) + test -n "$cf_path_args" && AC_DEFINE_UNQUOTED($1_ARGS,"$cf_path_args",Define to provide args for $1) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PATH_SYNTAX version: 16 updated: 2015/04/18 08:56:57 +dnl -------------- +dnl Check the argument to see that it looks like a pathname. Rewrite it if it +dnl begins with one of the prefix/exec_prefix variables, and then again if the +dnl result begins with 'NONE'. This is necessary to work around autoconf's +dnl delayed evaluation of those symbols. +AC_DEFUN([CF_PATH_SYNTAX],[ +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case ".[$]$1" in +(.\[$]\(*\)*|.\'*\'*) + ;; +(..|./*|.\\*) + ;; +(.[[a-zA-Z]]:[[\\/]]*) # OS/2 EMX + ;; +(.\[$]{*prefix}*|.\[$]{*dir}*) + eval $1="[$]$1" + case ".[$]$1" in + (.NONE/*) + $1=`echo [$]$1 | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(.no|.NONE/*) + $1=`echo [$]$1 | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + ifelse([$2],,[AC_MSG_ERROR([expected a pathname, not \"[$]$1\"])],$2) + ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PKG_CONFIG version: 10 updated: 2015/04/26 18:06:58 +dnl ------------- +dnl Check for the package-config program, unless disabled by command-line. +AC_DEFUN([CF_PKG_CONFIG], +[ +AC_MSG_CHECKING(if you want to use pkg-config) +AC_ARG_WITH(pkg-config, + [ --with-pkg-config{=path} enable/disable use of pkg-config], + [cf_pkg_config=$withval], + [cf_pkg_config=yes]) +AC_MSG_RESULT($cf_pkg_config) + +case $cf_pkg_config in +(no) + PKG_CONFIG=none + ;; +(yes) + CF_ACVERSION_CHECK(2.52, + [AC_PATH_TOOL(PKG_CONFIG, pkg-config, none)], + [AC_PATH_PROG(PKG_CONFIG, pkg-config, none)]) + ;; +(*) + PKG_CONFIG=$withval + ;; +esac + +test -z "$PKG_CONFIG" && PKG_CONFIG=none +if test "$PKG_CONFIG" != none ; then + CF_PATH_SYNTAX(PKG_CONFIG) +elif test "x$cf_pkg_config" != xno ; then + AC_MSG_WARN(pkg-config is not installed) +fi + +AC_SUBST(PKG_CONFIG) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_C_SOURCE version: 11 updated: 2018/12/31 20:46:17 +dnl ----------------- +dnl Define _POSIX_C_SOURCE to the given level, and _POSIX_SOURCE if needed. +dnl +dnl POSIX.1-1990 _POSIX_SOURCE +dnl POSIX.1-1990 and _POSIX_SOURCE and +dnl POSIX.2-1992 C-Language _POSIX_C_SOURCE=2 +dnl Bindings Option +dnl POSIX.1b-1993 _POSIX_C_SOURCE=199309L +dnl POSIX.1c-1996 _POSIX_C_SOURCE=199506L +dnl X/Open 2000 _POSIX_C_SOURCE=200112L +dnl +dnl Parameters: +dnl $1 is the nominal value for _POSIX_C_SOURCE +AC_DEFUN([CF_POSIX_C_SOURCE], +[AC_REQUIRE([CF_POSIX_VISIBLE])dnl + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=ifelse([$1],,199506L,[$1]) + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +CF_REMOVE_DEFINE(cf_trim_CFLAGS,$cf_save_CFLAGS,_POSIX_C_SOURCE) +CF_REMOVE_DEFINE(cf_trim_CPPFLAGS,$cf_save_CPPFLAGS,_POSIX_C_SOURCE) + +AC_CACHE_CHECK(if we should define _POSIX_C_SOURCE,cf_cv_posix_c_source,[ + CF_MSG_LOG(if the symbol is already defined go no further) + AC_TRY_COMPILE([#include ],[ +#ifndef _POSIX_C_SOURCE +make an error +#endif], + [cf_cv_posix_c_source=no], + [cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[[12]]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + AC_TRY_COMPILE([#include ],[ +#ifdef _POSIX_SOURCE +make an error +#endif],[], + cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE") + fi + CF_MSG_LOG(ifdef from value $cf_POSIX_C_SOURCE) + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,$cf_cv_posix_c_source) + CF_MSG_LOG(if the second compile does not leave our definition intact error) + AC_TRY_COMPILE([#include ],[ +#ifndef _POSIX_C_SOURCE +make an error +#endif],, + [cf_cv_posix_c_source=no]) + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + ]) +]) + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + CF_ADD_CFLAGS($cf_cv_posix_c_source) +fi + +fi # cf_cv_posix_visible + +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_SAVED_IDS version: 9 updated: 2020/03/10 18:53:47 +dnl ------------------ +dnl +dnl Check first if saved-ids are always supported. Some systems +dnl may require runtime checks. +AC_DEFUN([CF_POSIX_SAVED_IDS], +[ +AC_CHECK_HEADERS( \ +sys/param.h \ +) + +AC_CACHE_CHECK(if POSIX saved-ids are supported,cf_cv_posix_saved_ids,[ +AC_TRY_LINK( +[ +#include +#ifdef HAVE_SYS_PARAM_H +#include /* this may define "BSD" */ +#endif +],[ +#if defined(_POSIX_SAVED_IDS) && (_POSIX_SAVED_IDS > 0) + void *p = (void *) seteuid; + int x = seteuid(geteuid()); + (void)p; + (void)x; +#elif defined(BSD) && (BSD >= 199103) +/* The BSD's may implement the runtime check - and it fails. + * However, saved-ids work almost like POSIX (close enough for most uses). + */ +#else +make an error +#endif +],[cf_cv_posix_saved_ids=yes +],[ +AC_TRY_RUN([ +#ifdef HAVE_STDLIB_H +#include +#endif +#include +int main(void) +{ + void *p = (void *) seteuid; + long code = sysconf(_SC_SAVED_IDS); + (void)p; + ${cf_cv_main_return:-return} ((code > 0) ? 0 : 1); +}], + cf_cv_posix_saved_ids=yes, + cf_cv_posix_saved_ids=no, + cf_cv_posix_saved_ids=unknown) +]) +]) + +test "$cf_cv_posix_saved_ids" = yes && AC_DEFINE(HAVE_POSIX_SAVED_IDS,1,[Define to 1 if POSIX saved-ids are supported]) +]) +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_VISIBLE version: 1 updated: 2018/12/31 20:46:17 +dnl ---------------- +dnl POSIX documents test-macros which an application may set before any system +dnl headers are included to make features available. +dnl +dnl Some BSD platforms (originally FreeBSD, but copied by a few others) +dnl diverged from POSIX in 2002 by setting symbols which make all of the most +dnl recent features visible in the system header files unless the application +dnl overrides the corresponding test-macros. Doing that introduces portability +dnl problems. +dnl +dnl This macro makes a special check for the symbols used for this, to avoid a +dnl conflicting definition. +AC_DEFUN([CF_POSIX_VISIBLE], +[ +AC_CACHE_CHECK(if the POSIX test-macros are already defined,cf_cv_posix_visible,[ +AC_TRY_COMPILE([#include ],[ +#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \ + && defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \ + && defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \ + && defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0) +#error conflicting symbols found +#endif +],[cf_cv_posix_visible=no],[cf_cv_posix_visible=yes]) +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_POSIX_WAIT version: 4 updated: 2020/03/10 18:53:47 +dnl ------------- +dnl Check for POSIX wait support +AC_DEFUN([CF_POSIX_WAIT], +[ +AC_REQUIRE([AC_HEADER_SYS_WAIT]) +AC_CACHE_CHECK(for POSIX wait functions,cf_cv_posix_wait,[ +AC_TRY_LINK([ +#include +#include +#include +#ifdef HAVE_SYS_WAIT_H +#include +#endif +],[ + int stat_loc; + pid_t pid = waitpid(-1, &stat_loc, WNOHANG|WUNTRACED); + pid_t pid2 = wait(&stat_loc); + (void)pid; + (void)pid2; +], +[cf_cv_posix_wait=yes], +[cf_cv_posix_wait=no]) +]) +test "$cf_cv_posix_wait" = yes && AC_DEFINE(USE_POSIX_WAIT,1,[Define to 1 if we have POSIX wait functions]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROCFS_CWD version: 2 updated: 2007/03/12 20:39:04 +dnl ------------- +dnl Find /proc tree (may be in a different place) which implements the "cwd" +dnl link. +AC_DEFUN([CF_PROCFS_CWD],[ +AC_CACHE_CHECK(for proc tree with cwd-support,cf_cv_procfs_cwd,[ +cf_cv_procfs_cwd=no +for cf_path in /proc /compat/linux/proc /usr/compat/linux/proc +do + if test -d $cf_path && \ + test -d $cf_path/$$ && \ + ( test -d $cf_path/$$/cwd || \ + test -L $cf_path/$$/cwd ); then + cf_cv_procfs_cwd=$cf_path + break + fi +done +]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_CC version: 5 updated: 2019/12/31 08:53:54 +dnl ---------- +dnl standard check for CC, plus followup sanity checks +dnl $1 = optional parameter to pass to AC_PROG_CC to specify compiler name +AC_DEFUN([CF_PROG_CC],[ +CF_ACVERSION_CHECK(2.53, + [AC_MSG_WARN(this will incorrectly handle gnatgcc choice) + AC_REQUIRE([AC_PROG_CC])], + []) +ifelse($1,,[AC_PROG_CC],[AC_PROG_CC($1)]) +CF_GCC_VERSION +CF_ACVERSION_CHECK(2.52, + [AC_PROG_CC_STDC], + [CF_ANSI_CC_REQD]) +CF_CC_ENV_FLAGS +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_GROFF version: 3 updated: 2018/01/07 13:16:19 +dnl ------------- +dnl Check if groff is available, for cases (such as html output) where nroff +dnl is not enough. +AC_DEFUN([CF_PROG_GROFF],[ +AC_PATH_PROG(GROFF_PATH,groff,no) +AC_PATH_PROGS(NROFF_PATH,nroff mandoc,no) +AC_PATH_PROG(TBL_PATH,tbl,cat) +if test "x$GROFF_PATH" = xno +then + NROFF_NOTE= + GROFF_NOTE="#" +else + NROFF_NOTE="#" + GROFF_NOTE= +fi +AC_SUBST(GROFF_NOTE) +AC_SUBST(NROFF_NOTE) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_PROG_LINT version: 4 updated: 2019/11/20 18:55:37 +dnl ------------ +AC_DEFUN([CF_PROG_LINT], +[ +AC_CHECK_PROGS(LINT, lint cppcheck splint) +case "x$LINT" in +(xcppcheck|x*/cppcheck) + test -z "$LINT_OPTS" && LINT_OPTS="--enable=all" + ;; +esac +AC_SUBST(LINT_OPTS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REGEX version: 14 updated: 2020/07/11 19:09:29 +dnl -------- +dnl Attempt to determine if we've got one of the flavors of regular-expression +dnl code that we can support. +AC_DEFUN([CF_REGEX], +[ + +cf_regex_func=no + +cf_regex_libs="regex re" +case $host_os in +(mingw*) + cf_regex_libs="systre gnurx $cf_regex_libs" + ;; +esac + +AC_CHECK_FUNC(regcomp,[cf_regex_func=regcomp],[ + for cf_regex_lib in $cf_regex_libs + do + AC_CHECK_LIB($cf_regex_lib,regcomp,[ + CF_ADD_LIB($cf_regex_lib) + cf_regex_func=regcomp + break]) + done +]) + +if test "$cf_regex_func" = no ; then + AC_CHECK_FUNC(compile,[cf_regex_func=compile],[ + AC_CHECK_LIB(gen,compile,[ + CF_ADD_LIB(gen) + cf_regex_func=compile])]) +fi + +if test "$cf_regex_func" = no ; then + AC_MSG_WARN(cannot find regular expression library) +fi + +AC_CACHE_CHECK(for regular-expression headers,cf_cv_regex_hdrs,[ + +cf_cv_regex_hdrs=no +case $cf_regex_func in +(compile) + for cf_regex_hdr in regexp.h regexpr.h + do + AC_TRY_LINK([#include <$cf_regex_hdr>],[ + char *p = compile("", "", "", 0); + int x = step("", ""); + (void)p; + (void)x; + ],[ + cf_cv_regex_hdrs=$cf_regex_hdr + break + ]) + done + ;; +(*) + for cf_regex_hdr in regex.h + do + AC_TRY_LINK([#include +#include <$cf_regex_hdr>],[ + regex_t *p = 0; + int x = regcomp(p, "", 0); + int y = regexec(p, "", 0, 0, 0); + (void)x; + (void)y; + regfree(p); + ],[ + cf_cv_regex_hdrs=$cf_regex_hdr + break + ]) + done + ;; +esac + +]) + +case $cf_cv_regex_hdrs in + (no) AC_MSG_WARN(no regular expression header found) ;; + (regex.h) AC_DEFINE(HAVE_REGEX_H_FUNCS,1,[Define to 1 to include regex.h for regular expressions]) ;; + (regexp.h) AC_DEFINE(HAVE_REGEXP_H_FUNCS,1,[Define to 1 to include regexp.h for regular expressions]) ;; + (regexpr.h) AC_DEFINE(HAVE_REGEXPR_H_FUNCS,1,[Define to 1 to include regexpr.h for regular expressions]) ;; +esac +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_REMOVE_DEFINE version: 3 updated: 2010/01/09 11:05:50 +dnl ---------------- +dnl Remove all -U and -D options that refer to the given symbol from a list +dnl of C compiler options. This works around the problem that not all +dnl compilers process -U and -D options from left-to-right, so a -U option +dnl cannot be used to cancel the effect of a preceding -D option. +dnl +dnl $1 = target (which could be the same as the source variable) +dnl $2 = source (including '$') +dnl $3 = symbol to remove +define([CF_REMOVE_DEFINE], +[ +$1=`echo "$2" | \ + sed -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[[ ]]/ /g' \ + -e 's/-[[UD]]'"$3"'\(=[[^ ]]*\)\?[$]//g'` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_RESTORE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:47:45 +dnl --------------------- +dnl Restore flags saved in CF_SAVE_XTRA_FLAGS +dnl $1 = name of current macro +define([CF_RESTORE_XTRA_FLAGS], +[ +LIBS="$cf_save_LIBS_$1" +CFLAGS="$cf_save_CFLAGS_$1" +CPPFLAGS="$cf_save_CPPFLAGS_$1" +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_RPATH_HACK version: 11 updated: 2013/09/01 13:02:00 +dnl ------------- +AC_DEFUN([CF_RPATH_HACK], +[ +AC_REQUIRE([CF_LD_RPATH_OPT]) +AC_MSG_CHECKING(for updated LDFLAGS) +if test -n "$LD_RPATH_OPT" ; then + AC_MSG_RESULT(maybe) + + AC_CHECK_PROGS(cf_ldd_prog,ldd,no) + cf_rpath_list="/usr/lib /lib" + if test "$cf_ldd_prog" != no + then + cf_rpath_oops= + +AC_TRY_LINK([#include ], + [printf("Hello");], + [cf_rpath_oops=`$cf_ldd_prog conftest$ac_exeext | fgrep ' not found' | sed -e 's% =>.*$%%' |sort | uniq` + cf_rpath_list=`$cf_ldd_prog conftest$ac_exeext | fgrep / | sed -e 's%^.*[[ ]]/%/%' -e 's%/[[^/]][[^/]]*$%%' |sort | uniq`]) + + # If we passed the link-test, but get a "not found" on a given library, + # this could be due to inept reconfiguration of gcc to make it only + # partly honor /usr/local/lib (or whatever). Sometimes this behavior + # is intentional, e.g., installing gcc in /usr/bin and suppressing the + # /usr/local libraries. + if test -n "$cf_rpath_oops" + then + for cf_rpath_src in $cf_rpath_oops + do + for cf_rpath_dir in \ + /usr/local \ + /usr/pkg \ + /opt/sfw + do + if test -f $cf_rpath_dir/lib/$cf_rpath_src + then + CF_VERBOSE(...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src) + LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib" + break + fi + done + done + fi + fi + + CF_VERBOSE(...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS) + + CF_RPATH_HACK_2(LDFLAGS) + CF_RPATH_HACK_2(LIBS) + + CF_VERBOSE(...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS) +else + AC_MSG_RESULT(no) +fi +AC_SUBST(EXTRA_LDFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_RPATH_HACK_2 version: 7 updated: 2015/04/12 15:39:00 +dnl --------------- +dnl Do one set of substitutions for CF_RPATH_HACK, adding an rpath option to +dnl EXTRA_LDFLAGS for each -L option found. +dnl +dnl $cf_rpath_list contains a list of directories to ignore. +dnl +dnl $1 = variable name to update. The LDFLAGS variable should be the only one, +dnl but LIBS often has misplaced -L options. +AC_DEFUN([CF_RPATH_HACK_2], +[ +CF_VERBOSE(...checking $1 [$]$1) + +cf_rpath_dst= +for cf_rpath_src in [$]$1 +do + case $cf_rpath_src in + (-L*) + + # check if this refers to a directory which we will ignore + cf_rpath_skip=no + if test -n "$cf_rpath_list" + then + for cf_rpath_item in $cf_rpath_list + do + if test "x$cf_rpath_src" = "x-L$cf_rpath_item" + then + cf_rpath_skip=yes + break + fi + done + fi + + if test "$cf_rpath_skip" = no + then + # transform the option + if test "$LD_RPATH_OPT" = "-R " ; then + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"` + else + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"` + fi + + # if we have not already added this, add it now + cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"` + if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS" + then + CF_VERBOSE(...Filter $cf_rpath_src ->$cf_rpath_tmp) + EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS" + fi + fi + ;; + esac + cf_rpath_dst="$cf_rpath_dst $cf_rpath_src" +done +$1=$cf_rpath_dst + +CF_VERBOSE(...checked $1 [$]$1) +AC_SUBST(EXTRA_LDFLAGS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SAVE_XTRA_FLAGS version: 1 updated: 2020/01/11 16:46:44 +dnl ------------------ +dnl Use this macro to save CFLAGS/CPPFLAGS/LIBS before checks against X headers +dnl and libraries which do not update those variables. +dnl +dnl $1 = name of current macro +define([CF_SAVE_XTRA_FLAGS], +[ +cf_save_LIBS_$1="$LIBS" +cf_save_CFLAGS_$1="$CFLAGS" +cf_save_CPPFLAGS_$1="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[[IUD]]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SIGWINCH version: 3 updated: 2020/03/10 18:53:47 +dnl ----------- +dnl Use this macro after CF_XOPEN_SOURCE, but do not require it (not all +dnl programs need this test). +dnl +dnl This is really a Mac OS X 10.4.3 workaround. Defining _POSIX_C_SOURCE +dnl forces SIGWINCH to be undefined (breaks xterm, ncurses). Oddly, the struct +dnl winsize declaration is left alone - we may revisit this if Apple choose to +dnl break that part of the interface as well. +AC_DEFUN([CF_SIGWINCH], +[ +AC_CACHE_CHECK(if SIGWINCH is defined,cf_cv_define_sigwinch,[ + AC_TRY_COMPILE([ +#include +#include +],[int x = SIGWINCH; (void)x], + [cf_cv_define_sigwinch=yes], + [AC_TRY_COMPILE([ +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include +],[int x = SIGWINCH; (void)x], + [cf_cv_define_sigwinch=maybe], + [cf_cv_define_sigwinch=no]) +]) +]) + +if test "$cf_cv_define_sigwinch" = maybe ; then +AC_CACHE_CHECK(for actual SIGWINCH definition,cf_cv_fixup_sigwinch,[ +cf_cv_fixup_sigwinch=unknown +cf_sigwinch=32 +while test $cf_sigwinch != 1 +do + AC_TRY_COMPILE([ +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include +],[ +#if SIGWINCH != $cf_sigwinch +make an error +#endif +int x = SIGWINCH; (void)x], + [cf_cv_fixup_sigwinch=$cf_sigwinch + break]) + +cf_sigwinch=`expr $cf_sigwinch - 1` +done +]) + + if test "$cf_cv_fixup_sigwinch" != unknown ; then + CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch" + fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SIG_ATOMIC_T version: 5 updated: 2020/03/10 18:53:47 +dnl --------------- +dnl signal handler, but there are some gcc dependencies in that recommendation. +dnl Try anyway. +AC_DEFUN([CF_SIG_ATOMIC_T], +[ +AC_MSG_CHECKING(for signal global datatype) +AC_CACHE_VAL(cf_cv_sig_atomic_t,[ + for cf_type in \ + "volatile sig_atomic_t" \ + "sig_atomic_t" \ + "int" + do + AC_TRY_COMPILE([ +#include +#include +#include + +extern $cf_type x; +$cf_type x; +static void handler(int sig) +{ + (void)sig; + x = 5; +}], + [signal(SIGINT, handler); + x = 1], + [cf_cv_sig_atomic_t=$cf_type], + [cf_cv_sig_atomic_t=no]) + test "$cf_cv_sig_atomic_t" != no && break + done + ]) +AC_MSG_RESULT($cf_cv_sig_atomic_t) +test "$cf_cv_sig_atomic_t" != no && AC_DEFINE_UNQUOTED(SIG_ATOMIC_T, $cf_cv_sig_atomic_t,[Define to signal global datatype]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_STRUCT_LASTLOG version: 3 updated: 2020/03/10 18:53:47 +dnl ----------------- +dnl Check for header defining struct lastlog, ensure that its .ll_time member +dnl is compatible with time(). +AC_DEFUN([CF_STRUCT_LASTLOG], +[ +AC_CHECK_HEADERS(lastlog.h) +AC_CACHE_CHECK(for struct lastlog,cf_cv_struct_lastlog,[ +AC_TRY_RUN([ +#include +#include +#include + +int main(void) +{ + struct lastlog data; + return (sizeof(data.ll_time) != sizeof(time_t)); +}],[ +cf_cv_struct_lastlog=yes],[ +cf_cv_struct_lastlog=no],[ +cf_cv_struct_lastlog=unknown])]) + +test $cf_cv_struct_lastlog != no && AC_DEFINE(USE_STRUCT_LASTLOG,1,[Define to 1 if we have struct lastlog]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SVR4 version: 5 updated: 2012/10/04 05:24:07 +dnl ------- +dnl Check if this is an SVR4 system. We need the definition for xterm +AC_DEFUN([CF_SVR4], +[ +AC_CHECK_LIB(elf, elf_begin,[ +AC_CACHE_CHECK(if this is an SVR4 system, cf_cv_svr4,[ +AC_TRY_COMPILE([ +#if defined(__CYGWIN__) +make an error +#endif +#include +#include +],[ +static struct termio d_tio; + d_tio.c_cc[VINTR] = 0; + d_tio.c_cc[VQUIT] = 0; + d_tio.c_cc[VERASE] = 0; + d_tio.c_cc[VKILL] = 0; + d_tio.c_cc[VEOF] = 0; + d_tio.c_cc[VEOL] = 0; + d_tio.c_cc[VMIN] = 0; + d_tio.c_cc[VTIME] = 0; + d_tio.c_cc[VLNEXT] = 0; +], +[cf_cv_svr4=yes], +[cf_cv_svr4=no]) +]) +]) +test "$cf_cv_svr4" = yes && AC_DEFINE(SVR4,1,[Define to 1 if this is an SVR4 system]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SYSV version: 16 updated: 2020/01/11 16:46:44 +dnl ------- +dnl Check if this is a SYSV platform, e.g., as used in , and whether +dnl defining it will be helpful. The following features are used to check: +dnl +dnl a) bona-fide SVSV doesn't use const for sys_errlist[]. Since this is a +dnl legacy (pre-ANSI) feature, const should not apply. Modern systems only +dnl declare strerror(). Xos.h declares the legacy form of str_errlist[], and +dnl a compile-time error will result from trying to assign to a const array. +dnl +dnl b) compile with headers that exist on SYSV hosts. +dnl +dnl c) compile with type definitions that differ on SYSV hosts from standard C. +AC_DEFUN([CF_SYSV], +[ +AC_REQUIRE([AC_PATH_XTRA]) + +CF_SAVE_XTRA_FLAGS([CF_SYSV]) + +AC_CHECK_HEADERS( \ +termios.h \ +stdlib.h \ +X11/Intrinsic.h \ +) + +AC_REQUIRE([CF_SYS_ERRLIST]) + +AC_CACHE_CHECK(if we should define SYSV,cf_cv_sysv,[ +AC_TRY_COMPILE([ +#undef SYSV +#define SYSV 1 /* get Xos.h to declare sys_errlist[] */ +#ifdef HAVE_STDLIB_H +#include /* look for wchar_t */ +#endif +#ifdef HAVE_X11_INTRINSIC_H +#include /* Intrinsic.h has other traps... */ +#endif +#ifdef HAVE_TERMIOS_H /* needed for HPUX 10.20 */ +#include +#define STRUCT_TERMIOS struct termios +#else +#define STRUCT_TERMIOS struct termio +#endif +#include +#include /* eliminate most BSD hacks */ +#include /* declare sys_errlist on older systems */ +#include /* eliminate most of the remaining ones */ +],[ +static STRUCT_TERMIOS d_tio; + d_tio.c_cc[VINTR] = 0; + d_tio.c_cc[VQUIT] = 0; + d_tio.c_cc[VERASE] = 0; + d_tio.c_cc[VKILL] = 0; + d_tio.c_cc[VEOF] = 0; + d_tio.c_cc[VEOL] = 0; + d_tio.c_cc[VMIN] = 0; + d_tio.c_cc[VTIME] = 0; +#if defined(HAVE_SYS_ERRLIST) && !defined(DECL_SYS_ERRLIST) +sys_errlist[0] = ""; /* Cygwin mis-declares this */ +#endif +], +[cf_cv_sysv=yes], +[cf_cv_sysv=no]) +]) +test "$cf_cv_sysv" = yes && AC_DEFINE(SYSV,1,[Define to 1 if this is an SYSV system]) + +CF_RESTORE_XTRA_FLAGS([CF_SYSV]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SYSV_UTMP version: 6 updated: 2012/10/04 20:12:20 +dnl ------------ +dnl Check if this is a SYSV flavor of UTMP +AC_DEFUN([CF_SYSV_UTMP], +[ +AC_CACHE_CHECK(if $cf_cv_have_utmp is SYSV flavor,cf_cv_sysv_utmp,[ +test "$cf_cv_have_utmp" = "utmp" && cf_prefix="ut" || cf_prefix="utx" +AC_TRY_LINK([ +#include +#include <${cf_cv_have_utmp}.h>],[ +struct $cf_cv_have_utmp x; + set${cf_prefix}ent (); + get${cf_prefix}id(&x); + put${cf_prefix}line(&x); + end${cf_prefix}ent();], + [cf_cv_sysv_utmp=yes], + [cf_cv_sysv_utmp=no]) +]) +test $cf_cv_sysv_utmp = yes && AC_DEFINE(USE_SYSV_UTMP,1,[Define to 1 if utmp is SYSV flavor]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_SYS_ERRLIST version: 6 updated: 2001/12/30 13:03:23 +dnl -------------- +dnl Check for declaration of sys_nerr and sys_errlist in one of stdio.h and +dnl errno.h. Declaration of sys_errlist on BSD4.4 interferes with our +dnl declaration. Reported by Keith Bostic. +AC_DEFUN([CF_SYS_ERRLIST], +[ + CF_CHECK_ERRNO(sys_nerr) + CF_CHECK_ERRNO(sys_errlist) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TERMIOS_TYPES version: 2 updated: 2020/03/10 18:53:47 +dnl ---------------- +dnl https://pubs.opengroup.org/onlinepubs/009695399/basedefs/termios.h.html +dnl says that tcflag_t, speed_t and cc_t are typedef'd. If they are not, +dnl fallback to historical values. +AC_DEFUN([CF_TERMIOS_TYPES],[ + +AC_CACHE_CHECK(for termios type tcflag_t, cf_cv_havetype_tcflag_t,[ + AC_TRY_COMPILE([#include ],[ + tcflag_t x = 0; (void)x], + [cf_cv_havetype_tcflag_t=yes], + [cf_cv_havetype_tcflag_t=no]) +]) +test "$cf_cv_havetype_tcflag_t" = no && AC_DEFINE(tcflag_t,unsigned long,[Define usable value of tcflag_t if not declared]) + +AC_CACHE_CHECK(for termios type speed_t, cf_cv_havetype_speed_t,[ + AC_TRY_COMPILE([#include ],[ + speed_t x = 0; (void)x], + [cf_cv_havetype_speed_t=yes], + [cf_cv_havetype_speed_t=no]) +]) +test "$cf_cv_havetype_speed_t" = no && AC_DEFINE(speed_t,unsigned short,[Define usable value of speed_t if not declared]) + +AC_CACHE_CHECK(for termios type cc_t, cf_cv_havetype_cc_t,[ + AC_TRY_COMPILE([#include ],[ + cc_t x = 0; (void)x], + [cf_cv_havetype_cc_t=yes], + [cf_cv_havetype_cc_t=no]) +]) +test "$cf_cv_havetype_cc_t" = no && AC_DEFINE(cc_t,unsigned char,[Define usable value of cc_t if not declared]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TERMIO_C_ISPEED version: 4 updated: 2020/03/10 18:53:47 +dnl ------------------ +dnl Check for SGI's broken redefinition of baud rates introduced in IRIX 6.5 +dnl (there doesn't appear to be a useful predefined symbol). +AC_DEFUN([CF_TERMIO_C_ISPEED], +[ +AC_CACHE_CHECK(for IRIX 6.5 baud-rate redefinitions,cf_cv_termio_c_ispeed,[ +AC_TRY_COMPILE([ +#include +#include ],[ +struct termio foo; +foo.c_ispeed = B38400; +foo.c_ospeed = B9600; +(void)foo; +],[cf_cv_termio_c_ispeed=yes +],[cf_cv_termio_c_ispeed=no]) +]) +test "$cf_cv_termio_c_ispeed" = yes && AC_DEFINE(HAVE_TERMIO_C_ISPEED,1,[define 1 if we have IRIX 6.5 baud-rate redefinitions]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TRIM_X_LIBS version: 3 updated: 2015/04/12 15:39:00 +dnl -------------- +dnl Trim extra base X libraries added as a workaround for inconsistent library +dnl dependencies returned by "new" pkg-config files. +AC_DEFUN([CF_TRIM_X_LIBS],[ + for cf_trim_lib in Xmu Xt X11 + do + case "$LIBS" in + (*-l$cf_trim_lib\ *-l$cf_trim_lib*) + LIBS=`echo "$LIBS " | sed -e 's/ / /g' -e 's%-l'"$cf_trim_lib"' %%' -e 's/ $//'` + CF_VERBOSE(..trimmed $LIBS) + ;; + esac + done +]) +dnl --------------------------------------------------------------------------- +dnl CF_TRY_PKG_CONFIG version: 5 updated: 2013/07/06 21:27:06 +dnl ----------------- +dnl This is a simple wrapper to use for pkg-config, for libraries which may be +dnl available in that form. +dnl +dnl $1 = package name +dnl $2 = extra logic to use, if any, after updating CFLAGS and LIBS +dnl $3 = logic to use if pkg-config does not have the package +AC_DEFUN([CF_TRY_PKG_CONFIG],[ +AC_REQUIRE([CF_PKG_CONFIG]) + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists $1; then + CF_VERBOSE(found package $1) + cf_pkgconfig_incs="`$PKG_CONFIG --cflags $1 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs $1 2>/dev/null`" + CF_VERBOSE(package $1 CFLAGS: $cf_pkgconfig_incs) + CF_VERBOSE(package $1 LIBS: $cf_pkgconfig_libs) + CF_ADD_CFLAGS($cf_pkgconfig_incs) + CF_ADD_LIBS($cf_pkgconfig_libs) + ifelse([$2],,:,[$2]) +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + ifelse([$3],,:,[$3]) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_TRY_XOPEN_SOURCE version: 2 updated: 2018/06/20 20:23:13 +dnl ------------------- +dnl If _XOPEN_SOURCE is not defined in the compile environment, check if we +dnl can define it successfully. +AC_DEFUN([CF_TRY_XOPEN_SOURCE],[ +AC_CACHE_CHECK(if we should define _XOPEN_SOURCE,cf_cv_xopen_source,[ + AC_TRY_COMPILE([ +#include +#include +#include +],[ +#ifndef _XOPEN_SOURCE +make an error +#endif], + [cf_cv_xopen_source=no], + [cf_save="$CPPFLAGS" + CF_APPEND_TEXT(CPPFLAGS,-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE) + AC_TRY_COMPILE([ +#include +#include +#include +],[ +#ifdef _XOPEN_SOURCE +make an error +#endif], + [cf_cv_xopen_source=no], + [cf_cv_xopen_source=$cf_XOPEN_SOURCE]) + CPPFLAGS="$cf_save" + ]) +]) + +if test "$cf_cv_xopen_source" != no ; then + CF_REMOVE_DEFINE(CFLAGS,$CFLAGS,_XOPEN_SOURCE) + CF_REMOVE_DEFINE(CPPFLAGS,$CPPFLAGS,_XOPEN_SOURCE) + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + CF_ADD_CFLAGS($cf_temp_xopen_source) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_TTY_GROUP version: 10 updated: 2020/03/10 18:53:47 +dnl ------------ +dnl Check if the system has a tty-group defined. This is used in xterm when +dnl setting pty ownership. +AC_DEFUN([CF_TTY_GROUP], +[ +AC_MSG_CHECKING(for explicit tty group name) +AC_ARG_WITH(tty-group, + [ --with-tty-group=XXX use XXX for the tty-group], + [cf_tty_group=$withval], + [cf_tty_group=auto...]) +test -z "$cf_tty_group" && cf_tty_group=auto... +test "$cf_tty_group" = yes && cf_tty_group=auto... +AC_MSG_RESULT($cf_tty_group) + +if test "$cf_tty_group" = "auto..." ; then +AC_CACHE_CHECK(for tty group name,cf_cv_tty_group_name,[ + +# If we are configuring as root, it is hard to get a clue about the tty group. +# But we'll guess based on how our connection is set up - assuming it is done +# properly. + +cf_uid=`id | sed -e 's/^[^=]*=//' -e 's/(.*$//'` +# )vi +if test "$cf_uid" != 0 ; then +cf_cv_tty_group_name= +cf_tty_name=`tty` +test "$cf_tty_name" = "not a tty" && cf_tty_name=/dev/tty +test -z "$cf_tty_name" && cf_tty_name=/dev/tty +if test -c "$cf_tty_name" +then + cf_option="-l -L" + + # Expect listing to have fields like this: + #-rwxrwxrwx 1 user group 34293 Jul 18 16:29 pathname + ls $cf_option $cf_tty_name >conftest.out + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest conftest.out + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest /dev/null 1>/dev/null ) then + cf_cv_tty_group_name="tty" + fi + ;; +esac +fi +]) +cf_tty_group="$cf_cv_tty_group_name" +else + # if configure option, always do this + AC_DEFINE(USE_TTY_GROUP,1,[Define to 1 if we have a tty groupname]) +fi + +AC_DEFINE_UNQUOTED(TTY_GROUP_NAME,"$cf_tty_group",[Define to the name use for tty group]) + +# This is only a double-check that the group-name we obtained above really +# does apply to the device. We cannot perform this test if we are in batch +# mode, or if we are cross-compiling. + +AC_CACHE_CHECK(if we may use the $cf_tty_group group,cf_cv_tty_group,[ +cf_tty_name=`tty` +if test "$cf_tty_name" != "not a tty" +then +AC_TRY_RUN([ +#include +#include +#include +#include +int main(void) +{ + struct stat sb; + struct group *ttygrp = getgrnam(TTY_GROUP_NAME); + char *name = ttyname(0); + + endgrent(); + if (ttygrp != 0 + && name != 0 + && stat(name, &sb) == 0 + && sb.st_gid != getgid() + && sb.st_gid == ttygrp->gr_gid) { + ${cf_cv_main_return:-return} (0); + } + ${cf_cv_main_return:-return} (1); +} + ], + [cf_cv_tty_group=yes], + [cf_cv_tty_group=no], + [cf_cv_tty_group=unknown]) +elif test "$cross_compiling" = yes; then + cf_cv_tty_group=unknown +else + cf_cv_tty_group=yes +fi +]) + +if test $cf_cv_tty_group = no ; then + AC_MSG_WARN(Cannot use $cf_tty_group group) +else + AC_DEFINE(USE_TTY_GROUP) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TYPE_CC_T version: 3 updated: 2020/03/10 18:53:47 +dnl ------------ +dnl Check for cc_t type, used in termio. +AC_DEFUN([CF_TYPE_CC_T], +[ +AC_MSG_CHECKING(for cc_t in or ) +AC_CACHE_VAL(cf_cv_type_cc_t,[ + AC_TRY_COMPILE([ +#include +#if defined(HAVE_TERMIOS_H) +#include +#else +#include +#include +#endif +], + [cc_t x; (void)x], + [cf_cv_type_cc_t=yes], + [cf_cv_type_cc_t=no]) + ]) +AC_MSG_RESULT($cf_cv_type_cc_t) +test $cf_cv_type_cc_t = no && AC_DEFINE(cc_t, unsigned char,[Define to cc_t type used in termio]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TYPE_FD_MASK version: 3 updated: 2012/10/04 06:57:36 +dnl --------------- +dnl Check for the declaration of fd_mask, which is like fd_set, associated +dnl with select(). The check for fd_set should have pulled in this as well, +dnl but there is a special case for Mac OS X, possibly other BSD-derived +dnl platforms. +AC_DEFUN([CF_TYPE_FD_MASK], +[ +AC_REQUIRE([CF_TYPE_FD_SET]) + +AC_CACHE_CHECK(for declaration of fd_mask,cf_cv_type_fd_mask,[ + if test x$cf_cv_type_fd_set = xX11/Xpoll.h ; then + AC_TRY_COMPILE([ +#include ],[fd_mask x],, + [CF_MSG_LOG(if we must define CSRG_BASED) +# Xosdefs.h on Mac OS X may not define this (but it should). + AC_TRY_COMPILE([ +#define CSRG_BASED +#include ],[fd_mask x], + cf_cv_type_fd_mask=CSRG_BASED)]) + else + cf_cv_type_fd_mask=$cf_cv_type_fd_set + fi +]) +if test x$cf_cv_type_fd_mask = xCSRG_BASED ; then + AC_DEFINE(CSRG_BASED,1,[Define to 1 if needed for declaring fd_mask()]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_TYPE_FD_SET version: 6 updated: 2020/03/10 18:53:47 +dnl -------------- +dnl Check for the declaration of fd_set. Some platforms declare it in +dnl , and some in , which requires . +dnl Finally, if we are using this for an X application, Xpoll.h may include +dnl , so we don't want to do it twice. +AC_DEFUN([CF_TYPE_FD_SET], +[ +AC_CHECK_HEADERS(X11/Xpoll.h) + +AC_CACHE_CHECK(for declaration of fd_set,cf_cv_type_fd_set, + [CF_MSG_LOG(sys/types alone) +AC_TRY_COMPILE([ +#include ], + [fd_set x; (void)x], + [cf_cv_type_fd_set=sys/types.h], + [CF_MSG_LOG(X11/Xpoll.h) +AC_TRY_COMPILE([ +#ifdef HAVE_X11_XPOLL_H +#include +#endif], + [fd_set x; (void)x], + [cf_cv_type_fd_set=X11/Xpoll.h], + [CF_MSG_LOG(sys/select.h) +AC_TRY_COMPILE([ +#include +#include ], + [fd_set x; (void)x], + [cf_cv_type_fd_set=sys/select.h], + [cf_cv_type_fd_set=unknown])])])]) +if test $cf_cv_type_fd_set = sys/select.h ; then + AC_DEFINE(USE_SYS_SELECT_H,1,[Define to 1 to include sys/select.h to declare fd_set]) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_UNDO_CFLAGS version: 1 updated: 2011/07/02 09:27:51 +dnl -------------- +dnl Remove flags from $CFLAGS or similar shell variable using sed. +dnl $1 = variable +dnl $2 = message +dnl $3 = pattern to remove +AC_DEFUN([CF_UNDO_CFLAGS], +[ + CF_VERBOSE(removing $2 flags from $1) + $1=`echo "[$]$1" | sed -e 's/$3//'` + CF_VERBOSE(...result [$]$1) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UPPER version: 5 updated: 2001/01/29 23:40:59 +dnl -------- +dnl Make an uppercase version of a variable +dnl $1=uppercase($2) +AC_DEFUN([CF_UPPER], +[ +$1=`echo "$2" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTEMPTER version: 4 updated: 2012/10/04 20:12:20 +dnl ----------- +dnl Try to link with utempter library +AC_DEFUN([CF_UTEMPTER], +[ +AC_CACHE_CHECK(if we can link with utempter library,cf_cv_have_utempter,[ +cf_save_LIBS="$LIBS" +CF_ADD_LIB(utempter) +AC_TRY_LINK([ +#include +],[ + addToUtmp("/dev/tty", 0, 1); + removeFromUtmp(); +],[ + cf_cv_have_utempter=yes],[ + cf_cv_have_utempter=no]) +LIBS="$cf_save_LIBS" +]) +if test "$cf_cv_have_utempter" = yes ; then + AC_DEFINE(USE_UTEMPTER,1,[Define to 1 if we can/should link with utempter]) + CF_ADD_LIB(utempter) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTMP version: 11 updated: 2020/03/10 18:53:47 +dnl ------- +dnl Check for UTMP/UTMPX headers +AC_DEFUN([CF_UTMP], +[ +AC_REQUIRE([CF_LASTLOG]) + +AC_CACHE_CHECK(for utmp implementation,cf_cv_have_utmp,[ + cf_cv_have_utmp=no +for cf_header in utmpx utmp ; do +cf_utmp_includes=" +#include +#include <${cf_header}.h> +#define getutent getutxent +#ifdef USE_LASTLOG +#include /* may conflict with utmpx.h on Linux */ +#endif +" + AC_TRY_COMPILE([$cf_utmp_includes], + [struct $cf_header x; + char *name = x.ut_name; /* utmp.h and compatible definitions */ + (void)x; + (void)name; + ], + [cf_cv_have_utmp=$cf_header + break], + [ + AC_TRY_COMPILE([$cf_utmp_includes], + [struct $cf_header x; + char *name = x.ut_user; /* utmpx.h must declare this */ + (void)x; + (void)name; + ], + [cf_cv_have_utmp=$cf_header + break + ])]) +done +]) + +if test $cf_cv_have_utmp != no ; then + AC_DEFINE(HAVE_UTMP,1,[Define to 1 if the utmp interface is available]) + test $cf_cv_have_utmp = utmpx && AC_DEFINE(UTMPX_FOR_UTMP,1,[Define if we have utmpx interface]) + CF_UTMP_UT_HOST + CF_UTMP_UT_SYSLEN + CF_UTMP_UT_NAME + CF_UTMP_UT_XSTATUS + CF_UTMP_UT_XTIME + CF_UTMP_UT_SESSION + CF_SYSV_UTMP +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTMP_GROUP version: 1 updated: 2005/10/06 20:29:29 +dnl ------------- +dnl Find the utmp/utmpx file and determine its group to allow setgid programs +dnl to manipulate it, e.g., when there is no intermediary. +AC_DEFUN([CF_UTMP_GROUP],[ +AC_REQUIRE([CF_UTMP]) +if test $cf_cv_have_utmp != no ; then +AC_CACHE_CHECK(for utmp/utmpx group,cf_cv_utmp_group,[ +for cf_utmp_path in /var/adm /var/run +do + for cf_utmp_file in utmpx utmp + do + if test -f $cf_utmp_path/$cf_utmp_file + then + cf_cv_utmp_group=root + + cf_option="-l -L" + + # Expect listing to have fields like this: + #-r--r--r-- 1 user group 34293 Jul 18 16:29 pathname + ls $cf_option $cf_utmp_path/$cf_utmp_file >conftest + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest conftest + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest +#include <${cf_cv_have_utmp}.h>], + [struct $cf_cv_have_utmp x; + char *y = &x.ut_host[0]; + (void)x; + (void)y], + [cf_cv_have_utmp_ut_host=yes], + [cf_cv_have_utmp_ut_host=no]) + ]) +AC_MSG_RESULT($cf_cv_have_utmp_ut_host) +test $cf_cv_have_utmp_ut_host != no && AC_DEFINE(HAVE_UTMP_UT_HOST,1,[Define to 1 if UTMP/UTMPX struct defines ut_host member]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTMP_UT_NAME version: 7 updated: 2020/03/10 18:53:47 +dnl --------------- +dnl Check if UTMP/UTMPX struct defines ut_name member +AC_DEFUN([CF_UTMP_UT_NAME], +[ +if test $cf_cv_have_utmp != no ; then +AC_CACHE_CHECK(if ${cf_cv_have_utmp}.ut_name is declared,cf_cv_have_utmp_ut_name,[ + cf_cv_have_utmp_ut_name=no +cf_utmp_includes=" +#include +#include <${cf_cv_have_utmp}.h> +#define getutent getutxent +#ifdef USE_LASTLOG +#include /* may conflict with utmpx.h on Linux */ +#endif +" +for cf_header in ut_name ut_user ; do + AC_TRY_COMPILE([$cf_utmp_includes], + [struct $cf_cv_have_utmp x; + char *name = x.$cf_header; + (void)x; + (void)name; + ], + [cf_cv_have_utmp_ut_name=$cf_header + break]) +done +]) + +case $cf_cv_have_utmp_ut_name in +(no) + AC_MSG_ERROR(Cannot find declaration for ut.ut_name) + ;; +(ut_user) + AC_DEFINE(ut_name,ut_user,[Define to rename UTMP/UTMPX struct ut_name member]) + ;; +esac +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTMP_UT_SESSION version: 7 updated: 2020/03/10 18:53:47 +dnl ------------------ +dnl Check if UTMP/UTMPX struct defines ut_session member +AC_DEFUN([CF_UTMP_UT_SESSION], +[ +if test $cf_cv_have_utmp != no ; then +AC_CACHE_CHECK(if ${cf_cv_have_utmp}.ut_session is declared, cf_cv_have_utmp_ut_session,[ + AC_TRY_COMPILE([ +#include +#include <${cf_cv_have_utmp}.h>], + [struct $cf_cv_have_utmp x; + long y = x.ut_session; + (void)x; + (void)y], + [cf_cv_have_utmp_ut_session=yes], + [cf_cv_have_utmp_ut_session=no]) +]) +if test $cf_cv_have_utmp_ut_session != no ; then + AC_DEFINE(HAVE_UTMP_UT_SESSION,1,[Define to 1 if UTMP/UTMPX struct defines ut_session member]) +fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTMP_UT_SYSLEN version: 3 updated: 2020/03/10 18:53:47 +dnl ----------------- +dnl Check if UTMP/UTMPX struct defines ut_syslen member +AC_DEFUN([CF_UTMP_UT_SYSLEN], +[ +if test $cf_cv_have_utmp != no ; then +AC_MSG_CHECKING(if ${cf_cv_have_utmp}.ut_syslen is declared) +AC_CACHE_VAL(cf_cv_have_utmp_ut_syslen,[ + AC_TRY_COMPILE([ +#include +#include <${cf_cv_have_utmp}.h>], + [struct $cf_cv_have_utmp x; + int y = x.ut_syslen; + (void)x; + (void)y], + [cf_cv_have_utmp_ut_syslen=yes], + [cf_cv_have_utmp_ut_syslen=no]) + ]) +AC_MSG_RESULT($cf_cv_have_utmp_ut_syslen) +test $cf_cv_have_utmp_ut_syslen != no && AC_DEFINE(HAVE_UTMP_UT_SYSLEN,1,[Define to 1 if UTMP/UTMPX struct defines ut_syslen member]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTMP_UT_XSTATUS version: 5 updated: 2020/03/10 18:53:47 +dnl ------------------ +dnl Check for known variants on the UTMP/UTMPX struct's exit-status as reported +dnl by various people: +dnl +dnl ut_exit.__e_exit (HPUX 11 - David Ellement, also in glibc2) +dnl ut_exit.e_exit (SVR4) +dnl ut_exit.ut_e_exit (os390 - Greg Smith) +dnl ut_exit.ut_exit (Tru64 4.0f - Jeremie Petit, 4.0e - Tomas Vanhala) +dnl +dnl Note: utmp_xstatus is not a conventional compatibility definition in the +dnl system header files. +AC_DEFUN([CF_UTMP_UT_XSTATUS], +[ +if test $cf_cv_have_utmp != no ; then +AC_CACHE_CHECK(for exit-status in $cf_cv_have_utmp,cf_cv_have_utmp_ut_xstatus,[ +for cf_result in \ + ut_exit.__e_exit \ + ut_exit.e_exit \ + ut_exit.ut_e_exit \ + ut_exit.ut_exit +do +AC_TRY_COMPILE([ +#include +#include <${cf_cv_have_utmp}.h>], + [struct $cf_cv_have_utmp x; + long y = x.$cf_result = 0; + (void)x; + (void)y], + [cf_cv_have_utmp_ut_xstatus=$cf_result + break], + [cf_cv_have_utmp_ut_xstatus=no]) +done +]) +if test $cf_cv_have_utmp_ut_xstatus != no ; then + AC_DEFINE(HAVE_UTMP_UT_XSTATUS,1,[Define to 1 if UTMP/UTMPX has exit-status member]) + AC_DEFINE_UNQUOTED(ut_xstatus,$cf_cv_have_utmp_ut_xstatus,[Define if needed to rename member ut_xstatus of UTMP/UTMPX]) +fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_UTMP_UT_XTIME version: 10 updated: 2020/03/10 18:53:47 +dnl ---------------- +dnl Check if UTMP/UTMPX struct defines ut_xtime member +AC_DEFUN([CF_UTMP_UT_XTIME], +[ +if test $cf_cv_have_utmp != no ; then +AC_CACHE_CHECK(if ${cf_cv_have_utmp}.ut_xtime is declared, cf_cv_have_utmp_ut_xtime,[ + AC_TRY_COMPILE([ +#include +#include <${cf_cv_have_utmp}.h>], + [struct $cf_cv_have_utmp x; + long y = x.ut_xtime = 0; + (void)x; + (void)y], + [cf_cv_have_utmp_ut_xtime=yes], + [AC_TRY_COMPILE([ +#include +#include <${cf_cv_have_utmp}.h>], + [struct $cf_cv_have_utmp x; + long y = x.ut_tv.tv_sec; + (void)x; + (void)y], + [cf_cv_have_utmp_ut_xtime=define], + [cf_cv_have_utmp_ut_xtime=no]) + ]) +]) +if test $cf_cv_have_utmp_ut_xtime != no ; then + AC_DEFINE(HAVE_UTMP_UT_XTIME,1,[Define to 1 if UTMP/UTMPX struct defines ut_xtime member]) + if test $cf_cv_have_utmp_ut_xtime = define ; then + AC_DEFINE(ut_xtime,ut_tv.tv_sec,[Define if needed to alternate name for utmpx.ut_xtime member]) + fi +fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_VERBOSE version: 3 updated: 2007/07/29 09:55:12 +dnl ---------- +dnl Use AC_VERBOSE w/o the warnings +AC_DEFUN([CF_VERBOSE], +[test -n "$verbose" && echo " $1" 1>&AC_FD_MSG +CF_MSG_LOG([$1]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_APP_CLASS version: 3 updated: 2015/04/12 15:39:00 +dnl ----------------- +dnl Handle configure option "--with-app-class", setting the $APP_CLASS +dnl variable, used for X resources. +dnl +dnl $1 = default value. +AC_DEFUN([CF_WITH_APP_CLASS],[ +AC_MSG_CHECKING(for X applications class) +AC_ARG_WITH(app-class, + [ --with-app-class=XXX override X applications class (default $1)], + [APP_CLASS=$withval], + [APP_CLASS=$1]) + +case x$APP_CLASS in +(*[[/@,%]]*) + AC_MSG_WARN(X applications class cannot contain punctuation) + APP_CLASS=$1 + ;; +(x[[A-Z]]*) + ;; +(*) + AC_MSG_WARN([X applications class must start with capital, ignoring $APP_CLASS]) + APP_CLASS=$1 + ;; +esac + +AC_MSG_RESULT($APP_CLASS) + +AC_SUBST(APP_CLASS) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_APP_DEFAULTS version: 6 updated: 2015/01/02 09:05:50 +dnl -------------------- +dnl Handle configure option "--with-app-defaults", setting these shell +dnl variables: +dnl +dnl $APPSDIR is the option value, used for installing app-defaults files. +dnl $no_appsdir is a "#" (comment) if "--without-app-defaults" is given. +dnl +dnl Most Linux's use this: +dnl /usr/share/X11/app-defaults +dnl Debian uses this: +dnl /etc/X11/app-defaults +dnl DragonFlyBSD ports uses this: +dnl /usr/pkg/lib/X11/app-defaults +dnl FreeBSD ports use these: +dnl /usr/local/lib/X11/app-defaults +dnl /usr/local/share/X11/app-defaults +dnl Mandriva has these: +dnl /usr/lib/X11/app-defaults +dnl /usr/lib64/X11/app-defaults +dnl NetBSD has these +dnl /usr/X11R7/lib/X11/app-defaults +dnl OpenSolaris uses +dnl 32-bit: +dnl /usr/X11/etc/X11/app-defaults +dnl /usr/X11/share/X11/app-defaults +dnl /usr/X11/lib/X11/app-defaults +dnl OSX uses +dnl /opt/local/share/X11/app-defaults (MacPorts) +dnl /opt/X11/share/X11/app-defaults (non-ports) +dnl 64-bit: +dnl /usr/X11/etc/X11/app-defaults +dnl /usr/X11/share/X11/app-defaults (I mkdir'd this) +dnl /usr/X11/lib/amd64/X11/app-defaults +dnl Solaris10 uses (in this order): +dnl /usr/openwin/lib/X11/app-defaults +dnl /usr/X11/lib/X11/app-defaults +AC_DEFUN([CF_WITH_APP_DEFAULTS],[ +AC_MSG_CHECKING(for directory to install resource files) +AC_ARG_WITH(app-defaults, + [ --with-app-defaults=DIR directory in which to install resource files (EPREFIX/lib/X11/app-defaults)], + [APPSDIR=$withval], + [APPSDIR='${exec_prefix}/lib/X11/app-defaults']) + +if test "x[$]APPSDIR" = xauto +then + APPSDIR='${exec_prefix}/lib/X11/app-defaults' + for cf_path in \ + /opt/local/share/X11/app-defaults \ + /opt/X11/share/X11/app-defaults \ + /usr/share/X11/app-defaults \ + /usr/X11/share/X11/app-defaults \ + /usr/X11/lib/X11/app-defaults \ + /usr/lib/X11/app-defaults \ + /etc/X11/app-defaults \ + /usr/pkg/lib/X11/app-defaults \ + /usr/X11R7/lib/X11/app-defaults \ + /usr/X11R6/lib/X11/app-defaults \ + /usr/X11R5/lib/X11/app-defaults \ + /usr/X11R4/lib/X11/app-defaults \ + /usr/local/lib/X11/app-defaults \ + /usr/local/share/X11/app-defaults \ + /usr/lib64/X11/app-defaults + do + if test -d "$cf_path" ; then + APPSDIR="$cf_path" + break + fi + done +else + cf_path=$APPSDIR + CF_PATH_SYNTAX(cf_path) +fi + +AC_MSG_RESULT($APPSDIR) +AC_SUBST(APPSDIR) + +no_appsdir= +if test "$APPSDIR" = no +then + no_appsdir="#" +else + EXTRA_INSTALL_DIRS="$EXTRA_INSTALL_DIRS \$(APPSDIR)" +fi +AC_SUBST(no_appsdir) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_DBMALLOC version: 7 updated: 2010/06/21 17:26:47 +dnl ---------------- +dnl Configure-option for dbmalloc. The optional parameter is used to override +dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests. +AC_DEFUN([CF_WITH_DBMALLOC],[ +CF_NO_LEAKS_OPTION(dbmalloc, + [ --with-dbmalloc test: use Conor Cahill's dbmalloc library], + [USE_DBMALLOC]) + +if test "$with_dbmalloc" = yes ; then + AC_CHECK_HEADER(dbmalloc.h, + [AC_CHECK_LIB(dbmalloc,[debug_malloc]ifelse([$1],,[],[,$1]))]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_DESKTOP_CATEGORY version: 5 updated: 2015/04/12 15:39:00 +dnl ------------------------ +dnl Taking into account the absence of standardization of desktop categories +dnl take a look to see whether other applications on the current system are +dnl assigned any/all of a set of suggested categories. +dnl +dnl $1 = program name +dnl $2 = case-pattern to match comparable desktop files to obtain category +dnl This pattern may contain wildcards. +dnl $3 = suggested categories, also a case-pattern but without wildcards, +dnl since it doubles as a default value for a shell case-statement. +dnl $4 = categories to use if no match is found on the build-machine for the +dnl --with-desktop-category "auto" setting. +dnl +dnl The macro tells the configure script to substitute the $DESKTOP_CATEGORY +dnl value. +AC_DEFUN([CF_WITH_DESKTOP_CATEGORY],[ +AC_REQUIRE([CF_DISABLE_DESKTOP]) + +if test -z "$desktop_utils" +then + AC_MSG_CHECKING(for requested desktop-category) + AC_ARG_WITH(desktop-category, + [ --with-desktop-category=XXX one or more desktop catgories or auto], + [cf_desktop_want=$withval], + [cf_desktop_want=auto]) + AC_MSG_RESULT($cf_desktop_want) + + if test "$cf_desktop_want" = auto + then + rm -rf conftest* + cf_desktop_also= + for cf_desktop_dir in \ + /usr/share/app-install \ + /usr/share/applications + do + if test -d $cf_desktop_dir + then + find $cf_desktop_dir -name '*.desktop' | \ + while true + do + read cf_desktop_path + test -z "$cf_desktop_path" && break + cf_desktop_name=`basename $cf_desktop_path .desktop` + case $cf_desktop_name in + ($1|*-$1|$2) + CF_VERBOSE(inspect $cf_desktop_path) + egrep '^Categories=' $cf_desktop_path | \ + tr ';' '\n' | \ + sed -e 's%^.*=%%' -e '/^$/d' >>conftest.1 + ;; + esac + done + fi + done + if test -s conftest.1 + then + cf_desktop_last= + sort conftest.1 | \ + while true + do + read cf_desktop_this + test -z "$cf_desktop_this" && break + case $cf_desktop_this in + (Qt*|GTK*|KDE*|GNOME*|*XFCE*|*Xfce*) + ;; + ($3) + test "x$cf_desktop_last" != "x$cf_desktop_this" && echo $cf_desktop_this >>conftest.2 + ;; + esac + cf_desktop_last=$cf_desktop_this + done + cf_desktop_want=`cat conftest.2 | tr '\n' ';'` + fi + if test -n "$cf_desktop_want" + then + if test "$cf_desktop_want" = auto + then + cf_desktop_want= + else + # do a sanity check on the semicolon-separated list, ignore on failure + cf_desktop_test=`echo "$cf_desktop_want" | sed -e 's/[[^;]]//g'` + test -z "$cf_desktop_test" && cf_desktop_want= + cf_desktop_test=`echo "$cf_desktop_want" | sed -e 's/^.*;$/./g'` + test -z "$cf_desktop_test" && cf_desktop_want= + fi + fi + if test -z "$cf_desktop_want" + then + cf_desktop_want="ifelse([$4],,ifelse([$3],,[Application;],[`echo "$3" | sed -e 's/\*//g' -e 's/|/;/g' -e 's/[[;]]*$/;/g'`]),[$4])" + CF_VERBOSE(no usable value found for desktop category, using $cf_desktop_want) + fi + fi + DESKTOP_CATEGORY=`echo "$cf_desktop_want" | sed -e 's/[[ ,]]/;/g'` + CF_VERBOSE(will use Categories=$DESKTOP_CATEGORY) + AC_SUBST(DESKTOP_CATEGORY) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_WITH_DMALLOC version: 7 updated: 2010/06/21 17:26:47 +dnl --------------- +dnl Configure-option for dmalloc. The optional parameter is used to override +dnl the updating of $LIBS, e.g., to avoid conflict with subsequent tests. +AC_DEFUN([CF_WITH_DMALLOC],[ +CF_NO_LEAKS_OPTION(dmalloc, + [ --with-dmalloc test: use Gray Watson's dmalloc library], + [USE_DMALLOC]) + +if test "$with_dmalloc" = yes ; then + AC_CHECK_HEADER(dmalloc.h, + [AC_CHECK_LIB(dmalloc,[dmalloc_debug]ifelse([$1],,[],[,$1]))]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ICONDIR version: 5 updated: 2012/07/22 09:18:02 +dnl --------------- +dnl Handle configure option "--with-icondir", setting these shell variables: +dnl +dnl $ICONDIR is the option value, used for installing icon files. +dnl $no_icondir is a "#" (comment) if "--without-icondir" is given. +AC_DEFUN([CF_WITH_ICONDIR],[ +AC_MSG_CHECKING(for directory to install icons) +AC_ARG_WITH(icondir, + [ --with-icondir=DIR directory in which to install icons for desktop], + [ICONDIR=$withval], + [test -z "$ICONDIR" && ICONDIR=no]) + +if test "x[$]ICONDIR" = xauto +then + ICONDIR='${datadir}/icons' + for cf_path in \ + /usr/share/icons \ + /usr/X11R6/share/icons + do + if test -d "$cf_path" ; then + ICONDIR="$cf_path" + break + fi + done +else + cf_path=$ICONDIR + CF_PATH_SYNTAX(cf_path) +fi +AC_MSG_RESULT($ICONDIR) +AC_SUBST(ICONDIR) + +no_icondir= +if test "$ICONDIR" = no +then + no_icondir="#" +else + EXTRA_INSTALL_DIRS="$EXTRA_INSTALL_DIRS \$(ICONDIR)" +fi +AC_SUBST(no_icondir) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ICON_NAME version: 3 updated: 2015/04/12 15:39:00 +dnl ----------------- +dnl Allow a default icon-name to be overridden. +dnl $1 = default icon name +AC_DEFUN([CF_WITH_ICON_NAME],[ +AC_MSG_CHECKING(for the icon name) +AC_ARG_WITH(icon-name, + [ --with-icon-name=XXXX override icon name (default: $1)], + [ICON_NAME="$withval"], + [ICON_NAME=$1]) +case "x$ICON_NAME" in +(xyes|xno|x) + ICON_NAME=$1 + ;; +esac +AC_SUBST(ICON_NAME) +AC_MSG_RESULT($ICON_NAME) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ICON_SYMLINK version: 2 updated: 2015/04/12 15:39:00 +dnl -------------------- +dnl Workaround for systems which are (mis)configured to map all icon references +dnl for xterm into "xterm" name. For instance, recent (2013) KDE ignores both +dnl the name given in the .desktop file (xterm-color) and the application name +dnl (xterm-dev). +dnl +dnl $1 = default icon name to use if symlink is wanted +AC_DEFUN([CF_WITH_ICON_SYMLINK],[ +AC_MSG_CHECKING(for icon symlink to use) +AC_ARG_WITH(icon-symlink, + [ --with-icon-symlink=XXX make symbolic link for icon name (default: $1)], + [ICON_SYMLINK="$withval"], + [ICON_SYMLINK=NONE]) +case "x$ICON_SYMLINK" in +(xyes) + ICON_SYMLINK=$1 + ;; +(xno|x) + ICON_SYMLINK=NONE + ;; +esac +AC_SUBST(ICON_SYMLINK) +AC_MSG_RESULT($ICON_SYMLINK) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_ICON_THEME version: 12 updated: 2018/04/30 19:37:35 +dnl ------------------ +dnl If asked, check for prerequisites and setup symbols to permit installing +dnl one or more application icons in the Red Hat icon-theme directory +dnl hierarchy. +dnl +dnl If the prerequisites are missing, give a warning and revert to the long- +dnl standing pixmaps directory. +dnl +dnl Parameters: +dnl +dnl $1 = application icon. This can be a list, and is not optional. +dnl $2 = default theme (defaults to hicolor) +dnl $3 = formats (defaults to list [.svg .png .xpm]) +dnl $4 = alternate icon if no theme is used (defaults to $1). +dnl +dnl Result: +dnl ICON_NAME = basename of first item in $1, unless already set +dnl ICON_LIST = reprocessed $1 +dnl ICON_THEME = reprocessed $2 +dnl ICON_FORMAT = reprocessed $3 +AC_DEFUN([CF_WITH_ICON_THEME], +[ +ifelse([$1],,[ + AC_MSG_ERROR([macro [CF_WITH_ICON_THEME] requires application-icon name]) +],[ + +CF_WITH_PIXMAPDIR +CF_WITH_ICONDIR + +AC_MSG_CHECKING(if icon theme should be used) +AC_ARG_WITH(icon-theme, + [ --with-icon-theme=XXX install icons into desktop theme (hicolor)], + [ICON_THEME=$withval], + [ICON_THEME=no]) + +case "x$ICON_THEME" in +(xno) + ;; +(x|xyes) + ICON_THEME=ifelse([$2],,hicolor,$2) + ;; +esac +AC_MSG_RESULT($ICON_THEME) + +if test "x$ICON_THEME" = xno +then + if test "x$ICONDIR" != xno + then + CF_VERBOSE(ignoring icondir without theme) + no_icondir="#" + fi +else + if test "x$ICONDIR" = xno + then + AC_MSG_ERROR(icondir must be set for icon theme) + fi +fi + +: ${ICON_FORMAT:=ifelse([$3],,[".svg .png .xpm"],[$3])} + +ICON_LIST= + +ifelse([$4],,[cf_icon_list=$1],[ +if test "x$ICON_THEME" != xno +then + cf_icon_list="$1" +else + cf_icon_list="$4" +fi +]) + +AC_MSG_CHECKING([for icon(s) to install]) +for cf_name in $cf_icon_list +do + CF_VERBOSE(using $ICON_FORMAT) + for cf_suffix in $ICON_FORMAT + do + cf_icon="${cf_name}${cf_suffix}" + cf_left=`echo "$cf_icon" | sed -e 's/:.*//'` + if test ! -f "${cf_left}" + then + if test "x$srcdir" != "x." + then + cf_icon="${srcdir}/${cf_left}" + cf_left=`echo "$cf_icon" | sed -e 's/:.*//'` + if test ! -f "${cf_left}" + then + continue + fi + else + continue + fi + fi + if test "x$ICON_THEME" != xno + then + cf_base=`basename $cf_left` + cf_trim=`echo "$cf_base" | sed -e 's/_[[0-9]][[0-9]]x[[0-9]][[0-9]]\././'` + case "x${cf_base}" in + (*:*) + cf_next=$cf_base + # user-defined mapping + ;; + (*.png) + cf_size=`file "$cf_left"|sed -e 's/^[[^:]]*://' -e 's/^.*[[^0-9]]\([[0-9]][[0-9]]* x [[0-9]][[0-9]]*\)[[^0-9]].*$/\1/' -e 's/ //g'` + if test -z "$cf_size" + then + AC_MSG_WARN(cannot determine size of $cf_left) + continue + fi + cf_next="$cf_size/apps/$cf_trim" + ;; + (*.svg) + cf_next="scalable/apps/$cf_trim" + ;; + (*.xpm) + CF_VERBOSE(ignored XPM file in icon theme) + continue + ;; + (*_[[0-9]][[0-9]]*x[[0-9]][[0-9]]*.*) + cf_size=`echo "$cf_left"|sed -e 's/^.*_\([[0-9]][[0-9]]*x[[0-9]][[0-9]]*\)\..*$/\1/'` + cf_left=`echo "$cf_left"|sed -e 's/^\(.*\)_\([[0-9]][[0-9]]*x[[0-9]][[0-9]]*\)\(\..*\)$/\1\3/'` + cf_next="$cf_size/apps/$cf_base" + ;; + esac + CF_VERBOSE(adding $cf_next) + cf_icon="${cf_icon}:${cf_next}" + fi + test -n "$ICON_LIST" && ICON_LIST="$ICON_LIST " + ICON_LIST="$ICON_LIST${cf_icon}" + if test -z "$ICON_NAME" + then + ICON_NAME=`basename $cf_icon | sed -e 's/[[.:]].*//'` + fi + done +done + +if test -n "$verbose" +then + AC_MSG_CHECKING(result) +fi +AC_MSG_RESULT($ICON_LIST) + +if test -z "$ICON_LIST" +then + AC_MSG_ERROR(no icons found) +fi +]) + +AC_MSG_CHECKING(for icon name) +AC_MSG_RESULT($ICON_NAME) + +AC_SUBST(ICON_FORMAT) +AC_SUBST(ICON_THEME) +AC_SUBST(ICON_LIST) +AC_SUBST(ICON_NAME) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_IMAKE_CFLAGS version: 10 updated: 2015/04/12 15:39:00 +dnl -------------------- +dnl xterm and similar programs build more readily when propped up with imake's +dnl hand-tuned definitions. If we do not use imake, provide fallbacks for the +dnl most common definitions that we're not likely to do by autoconf tests. +AC_DEFUN([CF_WITH_IMAKE_CFLAGS],[ +AC_REQUIRE([CF_ENABLE_NARROWPROTO]) + +AC_MSG_CHECKING(if we should use imake to help) +CF_ARG_DISABLE(imake, + [ --disable-imake disable use of imake for definitions], + [enable_imake=no], + [enable_imake=yes]) +AC_MSG_RESULT($enable_imake) + +if test "$enable_imake" = yes ; then + CF_IMAKE_CFLAGS(ifelse([$1],,,[$1])) +fi + +if test -n "$IMAKE" && test -n "$IMAKE_CFLAGS" ; then + CF_ADD_CFLAGS($IMAKE_CFLAGS) +else + IMAKE_CFLAGS= + IMAKE_LOADFLAGS= + CF_VERBOSE(make fallback definitions) + + # We prefer config.guess' values when we can get them, to avoid + # inconsistent results with uname (AIX for instance). However, + # config.guess is not always consistent either. + case $host_os in + (*[[0-9]].[[0-9]]*) + UNAME_RELEASE="$host_os" + ;; + (*) + UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown + ;; + esac + + case .$UNAME_RELEASE in + (*[[0-9]].[[0-9]]*) + OSMAJORVERSION=`echo "$UNAME_RELEASE" |sed -e 's/^[[^0-9]]*//' -e 's/\..*//'` + OSMINORVERSION=`echo "$UNAME_RELEASE" |sed -e 's/^[[^0-9]]*//' -e 's/^[[^.]]*\.//' -e 's/\..*//' -e 's/[[^0-9]].*//' ` + test -z "$OSMAJORVERSION" && OSMAJORVERSION=1 + test -z "$OSMINORVERSION" && OSMINORVERSION=0 + IMAKE_CFLAGS="-DOSMAJORVERSION=$OSMAJORVERSION -DOSMINORVERSION=$OSMINORVERSION $IMAKE_CFLAGS" + ;; + esac + + # FUNCPROTO is standard with X11R6, but XFree86 drops it, leaving some + # fallback/fragments for NeedPrototypes, etc. + IMAKE_CFLAGS="-DFUNCPROTO=15 $IMAKE_CFLAGS" + + # If this is not set properly, Xaw's scrollbars will not work + if test "$enable_narrowproto" = yes ; then + IMAKE_CFLAGS="-DNARROWPROTO=1 $IMAKE_CFLAGS" + fi + + # Other special definitions: + case $host_os in + (aix*) + # imake on AIX 5.1 defines AIXV3. really. + IMAKE_CFLAGS="-DAIXV3 -DAIXV4 $IMAKE_CFLAGS" + ;; + (irix[[56]].*) + # these are needed to make SIGWINCH work in xterm + IMAKE_CFLAGS="-DSYSV -DSVR4 $IMAKE_CFLAGS" + ;; + esac + + CF_ADD_CFLAGS($IMAKE_CFLAGS) + + AC_SUBST(IMAKE_CFLAGS) + AC_SUBST(IMAKE_LOADFLAGS) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_WITH_MAN2HTML version: 8 updated: 2018/06/27 18:44:03 +dnl ---------------- +dnl Check for man2html and groff. Prefer man2html over groff, but use groff +dnl as a fallback. See +dnl +dnl http://invisible-island.net/scripts/man2html.html +dnl +dnl Generate a shell script which hides the differences between the two. +dnl +dnl We name that "man2html.tmp". +dnl +dnl The shell script can be removed later, e.g., using "make distclean". +AC_DEFUN([CF_WITH_MAN2HTML],[ +AC_REQUIRE([CF_PROG_GROFF]) + +case "x${with_man2html}" in +(xno) + cf_man2html=no + ;; +(x|xyes) + AC_PATH_PROG(cf_man2html,man2html,no) + case "x$cf_man2html" in + (x/*) + AC_MSG_CHECKING(for the modified Earl Hood script) + if ( $cf_man2html -help 2>&1 | grep 'Make an index of headers at the end' >/dev/null ) + then + cf_man2html_ok=yes + else + cf_man2html=no + cf_man2html_ok=no + fi + AC_MSG_RESULT($cf_man2html_ok) + ;; + (*) + cf_man2html=no + ;; + esac +esac + +AC_MSG_CHECKING(for program to convert manpage to html) +AC_ARG_WITH(man2html, + [ --with-man2html=XXX use XXX rather than groff], + [cf_man2html=$withval], + [cf_man2html=$cf_man2html]) + +cf_with_groff=no + +case $cf_man2html in +(yes) + AC_MSG_RESULT(man2html) + AC_PATH_PROG(cf_man2html,man2html,no) + ;; +(no|groff|*/groff*) + cf_with_groff=yes + cf_man2html=$GROFF_PATH + AC_MSG_RESULT($cf_man2html) + ;; +(*) + AC_MSG_RESULT($cf_man2html) + ;; +esac + +MAN2HTML_TEMP="man2html.tmp" + cat >$MAN2HTML_TEMP <>$MAN2HTML_TEMP <conftest.in <conftest.out + + cf_man2html_1st=`fgrep -n MARKER conftest.out |sed -e 's/^[[^0-9]]*://' -e 's/:.*//'` + cf_man2html_top=`expr $cf_man2html_1st - 2` + cf_man2html_bot=`wc -l conftest.out |sed -e 's/[[^0-9]]//g'` + cf_man2html_bot=`expr $cf_man2html_bot - 2 - $cf_man2html_top` + cf_man2html_top_bot="-topm=$cf_man2html_top -botm=$cf_man2html_bot" + + AC_MSG_RESULT($cf_man2html_top_bot) + + AC_MSG_CHECKING(for pagesize to use) + for cf_block in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + do + cat >>conftest.in <conftest.out + cf_man2html_page=`fgrep -n HEAD1 conftest.out |sed -n '$p' |sed -e 's/^[[^0-9]]*://' -e 's/:.*//'` + test -z "$cf_man2html_page" && cf_man2html_page=99999 + test "$cf_man2html_page" -gt 100 && cf_man2html_page=99999 + + rm -rf conftest* + AC_MSG_RESULT($cf_man2html_page) + + cat >>$MAN2HTML_TEMP < +#include /* has the prototype */ +#include /* has the XkbBI_xxx definitions */ +],[ + int x = (XkbBI_Info |XkbBI_MinorError |XkbBI_MajorError |XkbBI_TerminalBell |XkbBI_MarginBell); + Atom y = 0; + (void)x; + XkbBell((Display *)0, (Widget)0, 0, y); +],[cf_cv_xkb_bell_ext=yes],[cf_cv_xkb_bell_ext=no]) +]) +test "$cf_cv_xkb_bell_ext" = yes && AC_DEFINE(HAVE_XKB_BELL_EXT,1,[Define 1 if we have XKB Bell extension]) + +CF_RESTORE_XTRA_FLAGS([CF_XKB_BELL_EXT]) +]) +dnl --------------------------------------------------------------------------- +dnl CF_XKB_KEYCODE_TO_KEYSYM version: 3 updated: 2020/03/10 18:53:47 +dnl ------------------------ +dnl Some older vendor-unix systems made a practice of delivering fragments of +dnl Xkb, requiring test-compiles. +AC_DEFUN([CF_XKB_KEYCODE_TO_KEYSYM],[ +AC_CACHE_CHECK(if we can use XkbKeycodeToKeysym, cf_cv_xkb_keycode_to_keysym,[ +AC_TRY_COMPILE([ +#include +#include +],[ + KeySym keysym = XkbKeycodeToKeysym((Display *)0, 0, 0, 0); + (void)keysym; +],[ +cf_cv_xkb_keycode_to_keysym=yes +],[ +cf_cv_xkb_keycode_to_keysym=no +]) +]) + +if test $cf_cv_xkb_keycode_to_keysym = yes +then + AC_CHECK_FUNCS(XkbKeycodeToKeysym) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_XKB_QUERY_EXTENSION version: 2 updated: 2012/09/28 20:23:46 +dnl ---------------------- +dnl see ifdef in scrollbar.c - iron out here +AC_DEFUN([CF_XKB_QUERY_EXTENSION],[ +AC_CACHE_CHECK(if we can use XkbQueryExtension, cf_cv_xkb_query_extension,[ +AC_TRY_COMPILE([ +#include +#include +#include +],[ + int xkbmajor = XkbMajorVersion; + int xkbminor = XkbMinorVersion; + int xkbopcode, xkbevent, xkberror; + + if (XkbLibraryVersion(&xkbmajor, &xkbminor) + && XkbQueryExtension((Display *)0, + &xkbopcode, + &xkbevent, + &xkberror, + &xkbmajor, + &xkbminor)) + return 0; +],[ +cf_cv_xkb_query_extension=yes +],[ +cf_cv_xkb_query_extension=no +]) +]) + +if test $cf_cv_xkb_query_extension = yes +then + AC_CHECK_FUNCS(XkbQueryExtension) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_XOPEN_SOURCE version: 55 updated: 2018/12/31 20:46:17 +dnl --------------- +dnl Try to get _XOPEN_SOURCE defined properly that we can use POSIX functions, +dnl or adapt to the vendor's definitions to get equivalent functionality, +dnl without losing the common non-POSIX features. +dnl +dnl Parameters: +dnl $1 is the nominal value for _XOPEN_SOURCE +dnl $2 is the nominal value for _POSIX_C_SOURCE +AC_DEFUN([CF_XOPEN_SOURCE],[ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([CF_POSIX_VISIBLE]) + +if test "$cf_cv_posix_visible" = no; then + +cf_XOPEN_SOURCE=ifelse([$1],,500,[$1]) +cf_POSIX_C_SOURCE=ifelse([$2],,199506L,[$2]) +cf_xopen_source= + +case $host_os in +(aix[[4-7]]*) + cf_xopen_source="-D_ALL_SOURCE" + ;; +(msys) + cf_XOPEN_SOURCE=600 + ;; +(darwin[[0-8]].*) + cf_xopen_source="-D_APPLE_C_SOURCE" + ;; +(darwin*) + cf_xopen_source="-D_DARWIN_C_SOURCE" + cf_XOPEN_SOURCE= + ;; +(freebsd*|dragonfly*|midnightbsd*) + # 5.x headers associate + # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L + # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L + cf_POSIX_C_SOURCE=200112L + cf_XOPEN_SOURCE=600 + cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + ;; +(hpux11*) + cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500" + ;; +(hpux*) + cf_xopen_source="-D_HPUX_SOURCE" + ;; +(irix[[56]].*) + cf_xopen_source="-D_SGI_SOURCE" + cf_XOPEN_SOURCE= + ;; +(linux*|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin) + CF_GNU_SOURCE($cf_XOPEN_SOURCE) + ;; +(minix*) + cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this... + ;; +(mirbsd*) + # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks and other headers which use u_int / u_short types + cf_XOPEN_SOURCE= + CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE) + ;; +(netbsd*) + cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw + ;; +(openbsd[[4-9]]*) + # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=600 + ;; +(openbsd*) + # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw + ;; +(osf[[45]]*) + cf_xopen_source="-D_OSF_SOURCE" + ;; +(nto-qnx*) + cf_xopen_source="-D_QNX_SOURCE" + ;; +(sco*) + # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer + ;; +(solaris2.*) + cf_xopen_source="-D__EXTENSIONS__" + cf_cv_xopen_source=broken + ;; +(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2) + cf_XOPEN_SOURCE= + cf_POSIX_C_SOURCE= + ;; +(*) + CF_TRY_XOPEN_SOURCE + CF_POSIX_C_SOURCE($cf_POSIX_C_SOURCE) + ;; +esac + +if test -n "$cf_xopen_source" ; then + CF_ADD_CFLAGS($cf_xopen_source,true) +fi + +dnl In anything but the default case, we may have system-specific setting +dnl which is still not guaranteed to provide all of the entrypoints that +dnl _XOPEN_SOURCE would yield. +if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then + AC_MSG_CHECKING(if _XOPEN_SOURCE really is set) + AC_TRY_COMPILE([#include ],[ +#ifndef _XOPEN_SOURCE +make an error +#endif], + [cf_XOPEN_SOURCE_set=yes], + [cf_XOPEN_SOURCE_set=no]) + AC_MSG_RESULT($cf_XOPEN_SOURCE_set) + if test $cf_XOPEN_SOURCE_set = yes + then + AC_TRY_COMPILE([#include ],[ +#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +make an error +#endif], + [cf_XOPEN_SOURCE_set_ok=yes], + [cf_XOPEN_SOURCE_set_ok=no]) + if test $cf_XOPEN_SOURCE_set_ok = no + then + AC_MSG_WARN(_XOPEN_SOURCE is lower than requested) + fi + else + CF_TRY_XOPEN_SOURCE + fi +fi +fi # cf_cv_posix_visible +]) +dnl --------------------------------------------------------------------------- +dnl CF_X_ATHENA version: 24 updated: 2020/03/10 18:53:47 +dnl ----------- +dnl Check for Xaw (Athena) libraries +dnl +dnl Sets $cf_x_athena according to the flavor of Xaw which is used. +AC_DEFUN([CF_X_ATHENA], +[ +cf_x_athena=${cf_x_athena:-Xaw} + +AC_MSG_CHECKING(if you want to link with Xaw 3d library) +withval= +AC_ARG_WITH(Xaw3d, + [ --with-Xaw3d link with Xaw 3d library]) +if test "$withval" = yes ; then + cf_x_athena=Xaw3d + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(if you want to link with Xaw 3d xft library) +withval= +AC_ARG_WITH(Xaw3dxft, + [ --with-Xaw3dxft link with Xaw 3d xft library]) +if test "$withval" = yes ; then + cf_x_athena=Xaw3dxft + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(if you want to link with neXT Athena library) +withval= +AC_ARG_WITH(neXtaw, + [ --with-neXtaw link with neXT Athena library]) +if test "$withval" = yes ; then + cf_x_athena=neXtaw + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(if you want to link with Athena-Plus library) +withval= +AC_ARG_WITH(XawPlus, + [ --with-XawPlus link with Athena-Plus library]) +if test "$withval" = yes ; then + cf_x_athena=XawPlus + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +cf_x_athena_lib="" + +if test "$PKG_CONFIG" != none ; then + cf_athena_list= + test "$cf_x_athena" = Xaw && cf_athena_list="xaw8 xaw7 xaw6" + for cf_athena_pkg in \ + $cf_athena_list \ + ${cf_x_athena} \ + ${cf_x_athena}-devel \ + lib${cf_x_athena} \ + lib${cf_x_athena}-devel + do + CF_TRY_PKG_CONFIG($cf_athena_pkg,[ + cf_x_athena_lib="$cf_pkgconfig_libs" + CF_UPPER(cf_x_athena_LIBS,HAVE_LIB_$cf_x_athena) + AC_DEFINE_UNQUOTED($cf_x_athena_LIBS) + + CF_TRIM_X_LIBS + +AC_CACHE_CHECK(for usable $cf_x_athena/Xmu package,cf_cv_xaw_compat,[ +AC_TRY_LINK([ +#include +],[ +int check = XmuCompareISOLatin1("big", "small"); +(void)check; +],[cf_cv_xaw_compat=yes],[cf_cv_xaw_compat=no])]) + + if test "$cf_cv_xaw_compat" = no + then + # workaround for broken ".pc" files... + case "$cf_x_athena_lib" in + (*-lXmu*) + ;; + (*) + CF_VERBOSE(work around broken package) + cf_save_xmu="$LIBS" + cf_first_lib=`echo "$cf_save_xmu" | sed -e 's/^[ ][ ]*//' -e 's/ .*//'` + CF_TRY_PKG_CONFIG(xmu,[ + LIBS="$cf_save_xmu" + CF_ADD_LIB_AFTER($cf_first_lib,$cf_pkgconfig_libs) + ],[ + CF_ADD_LIB_AFTER($cf_first_lib,-lXmu) + ]) + CF_TRIM_X_LIBS + ;; + esac + fi + + break]) + done +fi + +if test -z "$cf_x_athena_lib" ; then + CF_X_EXT + CF_X_TOOLKIT + CF_X_ATHENA_CPPFLAGS($cf_x_athena) + CF_X_ATHENA_LIBS($cf_x_athena) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_X_ATHENA_CPPFLAGS version: 8 updated: 2020/01/16 05:21:56 +dnl -------------------- +dnl Normally invoked by CF_X_ATHENA, with $1 set to the appropriate flavor of +dnl the Athena widgets, e.g., Xaw, Xaw3d, neXtaw. +AC_DEFUN([CF_X_ATHENA_CPPFLAGS], +[ +AC_REQUIRE([AC_PATH_XTRA]) +cf_x_athena_root=ifelse([$1],,Xaw,[$1]) +cf_x_athena_inc="" + +for cf_path in default \ + /usr/contrib/X11R6 \ + /usr/contrib/X11R5 \ + /usr/lib/X11R5 \ + /usr/local +do + if test -z "$cf_x_athena_inc" ; then + CF_SAVE_XTRA_FLAGS([CF_X_ATHENA_CPPFLAGS]) + cf_test=X11/$cf_x_athena_root/SimpleMenu.h + if test $cf_path != default ; then + CF_APPEND_TEXT(CPPFLAGS,-I$cf_path/include) + AC_MSG_CHECKING(for $cf_test in $cf_path) + else + AC_MSG_CHECKING(for $cf_test) + fi + AC_TRY_COMPILE([ +#include +#include <$cf_test>],[], + [cf_result=yes], + [cf_result=no]) + AC_MSG_RESULT($cf_result) + CF_RESTORE_XTRA_FLAGS([CF_X_ATHENA_CPPFLAGS]) + if test "$cf_result" = yes ; then + test "$cf_path" = default && cf_x_athena_inc=default + test "$cf_path" != default && cf_x_athena_inc=$cf_path/include + break + fi + fi +done + +if test -z "$cf_x_athena_inc" ; then + AC_MSG_WARN([Unable to find Athena header files]) +elif test "$cf_x_athena_inc" != default ; then + CF_APPEND_TEXT(CPPFLAGS,-I$cf_x_athena_inc) +fi +]) +dnl --------------------------------------------------------------------------- +dnl CF_X_ATHENA_LIBS version: 13 updated: 2020/01/11 18:16:10 +dnl ---------------- +dnl Normally invoked by CF_X_ATHENA, with $1 set to the appropriate flavor of +dnl the Athena widgets, e.g., Xaw, Xaw3d, neXtaw. +AC_DEFUN([CF_X_ATHENA_LIBS], +[AC_REQUIRE([CF_X_TOOLKIT]) +cf_x_athena_root=ifelse([$1],,Xaw,[$1]) +cf_x_athena_lib="" + +for cf_path in default \ + /usr/contrib/X11R6 \ + /usr/contrib/X11R5 \ + /usr/lib/X11R5 \ + /usr/local +do + for cf_lib in \ + ${cf_x_athena_root} \ + ${cf_x_athena_root}7 \ + ${cf_x_athena_root}6 + do + for cf_libs in \ + "-l$cf_lib -lXmu" \ + "-l$cf_lib -lXpm -lXmu" \ + "-l${cf_lib}_s -lXmu_s" + do + test -n "$cf_x_athena_lib" && break + + CF_SAVE_XTRA_FLAGS([CF_X_ATHENA_LIBS]) + cf_test=XawSimpleMenuAddGlobalActions + test "$cf_path" != default && cf_libs="-L$cf_path/lib $cf_libs" + CF_ADD_LIBS($cf_libs) + AC_MSG_CHECKING(for $cf_test in $cf_libs) + AC_TRY_LINK([ +#include +#include +],[ +$cf_test((XtAppContext) 0)], + [cf_result=yes], + [cf_result=no]) + AC_MSG_RESULT($cf_result) + CF_RESTORE_XTRA_FLAGS([CF_X_ATHENA_LIBS]) + + if test "$cf_result" = yes ; then + cf_x_athena_lib="$cf_libs" + break + fi + done # cf_libs + test -n "$cf_x_athena_lib" && break + done # cf_lib +done + +if test -z "$cf_x_athena_lib" ; then + AC_MSG_ERROR( +[Unable to successfully link Athena library (-l$cf_x_athena_root) with test program]) +fi + +CF_ADD_LIBS($cf_x_athena_lib) +CF_UPPER(cf_x_athena_LIBS,HAVE_LIB_$cf_x_athena) +AC_DEFINE_UNQUOTED($cf_x_athena_LIBS) +]) +dnl --------------------------------------------------------------------------- +dnl CF_X_EXT version: 3 updated: 2010/06/02 05:03:05 +dnl -------- +AC_DEFUN([CF_X_EXT],[ +CF_TRY_PKG_CONFIG(Xext,,[ + AC_CHECK_LIB(Xext,XextCreateExtension, + [CF_ADD_LIB(Xext)])]) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_X_EXT_DOUBLE_BUFFER version: 1 updated: 2019/07/18 21:09:40 +dnl ---------------------- +AC_DEFUN([CF_X_EXT_DOUBLE_BUFFER],[ +AC_REQUIRE([CF_X_EXT]) +AC_CHECK_HEADER(X11/extensions/Xdbe.h, + AC_DEFINE(HAVE_X11_EXTENSIONS_XDBE_H,1,[Define to 1 if we have X11/extensions/Xdbe.h]) + AC_CHECK_FUNC(XdbeSwapBuffers, + [AC_DEFINE(HAVE_XDBESWAPBUFFERS,1,[Define to 1 if we have XdbeSwapBuffers]) + cf_x_ext_double_buffer=yes])) +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_X_FONTCONFIG version: 7 updated: 2020/03/10 18:53:47 +dnl --------------- +dnl Check for fontconfig library, a dependency of the X FreeType library. +AC_DEFUN([CF_X_FONTCONFIG], +[ +AC_REQUIRE([CF_X_FREETYPE]) + +if test "$cf_cv_found_freetype" = yes ; then +AC_CACHE_CHECK(for usable Xft/fontconfig package,cf_cv_xft_compat,[ +AC_TRY_LINK([ +#include +],[ + XftPattern *pat = 0; + XftPatternBuild(pat, + XFT_FAMILY, XftTypeString, "mono", + (void *) 0); +],[cf_cv_xft_compat=yes],[cf_cv_xft_compat=no]) +]) + +if test "$cf_cv_xft_compat" = no +then + # workaround for broken ".pc" files used for Xft. + case "$cf_cv_x_freetype_libs" in + (*-lfontconfig*) + ;; + (*) + CF_VERBOSE(work around broken package) + cf_save_fontconfig="$LIBS" + CF_TRY_PKG_CONFIG(fontconfig,[ + CF_ADD_CFLAGS($cf_pkgconfig_incs) + LIBS="$cf_save_fontconfig" + CF_ADD_LIB_AFTER(-lXft,$cf_pkgconfig_libs) + ],[ + CF_ADD_LIB_AFTER(-lXft,-lfontconfig) + ]) + ;; + esac +fi +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF_X_FREETYPE version: 28 updated: 2020/03/10 18:53:47 +dnl ------------- +dnl Check for X FreeType headers and libraries (XFree86 4.x, etc). +dnl +dnl First check for the appropriate config program, since the developers for +dnl these libraries change their configuration (and config program) more or +dnl less randomly. If we cannot find the config program, do not bother trying +dnl to guess the latest variation of include/lib directories. +dnl +dnl If either or both of these configure-script options are not given, rely on +dnl the output of the config program to provide the cflags/libs options: +dnl --with-freetype-cflags +dnl --with-freetype-libs +AC_DEFUN([CF_X_FREETYPE], +[ +AC_REQUIRE([CF_PKG_CONFIG]) + +cf_cv_x_freetype_incs=no +cf_cv_x_freetype_libs=no +cf_extra_freetype_libs= +FREETYPE_CONFIG=none +FREETYPE_PARAMS= + +AC_MSG_CHECKING(for FreeType configuration script) +AC_ARG_WITH(freetype-config, + [ --with-freetype-config configure script to use for FreeType], + [cf_cv_x_freetype_cfgs="$withval"], + [cf_cv_x_freetype_cfgs=auto]) +test -z $cf_cv_x_freetype_cfgs && cf_cv_x_freetype_cfgs=auto +test $cf_cv_x_freetype_cfgs = no && cf_cv_x_freetype_cfgs=none +AC_MSG_RESULT($cf_cv_x_freetype_cfgs) + +case $cf_cv_x_freetype_cfgs in +(none) + AC_MSG_CHECKING(if you specified -D/-I options for FreeType) + AC_ARG_WITH(freetype-cflags, + [ --with-freetype-cflags -D/-I options for compiling with FreeType], + [cf_cv_x_freetype_incs="$with_freetype_cflags"], + [cf_cv_x_freetype_incs=no]) + AC_MSG_RESULT($cf_cv_x_freetype_incs) + + AC_MSG_CHECKING(if you specified -L/-l options for FreeType) + AC_ARG_WITH(freetype-libs, + [ --with-freetype-libs -L/-l options to link FreeType], + [cf_cv_x_freetype_libs="$with_freetype_libs"], + [cf_cv_x_freetype_libs=no]) + AC_MSG_RESULT($cf_cv_x_freetype_libs) + ;; +(auto) + if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists xft; then + FREETYPE_CONFIG=$PKG_CONFIG + FREETYPE_PARAMS=xft + else + AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, none) + if test "$FREETYPE_CONFIG" != none; then + FREETYPE_CONFIG=$FREETYPE_CONFIG + cf_extra_freetype_libs="-lXft" + else + AC_PATH_PROG(FREETYPE_OLD_CONFIG, xft-config, none) + if test "$FREETYPE_OLD_CONFIG" != none; then + FREETYPE_CONFIG=$FREETYPE_OLD_CONFIG + fi + fi + fi + ;; +(pkg*) + if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists xft; then + FREETYPE_CONFIG=$cf_cv_x_freetype_cfgs + FREETYPE_PARAMS=xft + else + AC_MSG_WARN(cannot find pkg-config for Xft) + fi + ;; +(*) + AC_PATH_PROG(FREETYPE_XFT_CONFIG, $cf_cv_x_freetype_cfgs, none) + if test "$FREETYPE_XFT_CONFIG" != none; then + FREETYPE_CONFIG=$FREETYPE_XFT_CONFIG + else + AC_MSG_WARN(cannot find config script for Xft) + fi + ;; +esac + +if test "$FREETYPE_CONFIG" != none ; then + AC_MSG_CHECKING(for FreeType config) + AC_MSG_RESULT($FREETYPE_CONFIG $FREETYPE_PARAMS) + + if test "$cf_cv_x_freetype_incs" = no ; then + AC_MSG_CHECKING(for $FREETYPE_CONFIG cflags) + cf_cv_x_freetype_incs="`$FREETYPE_CONFIG $FREETYPE_PARAMS --cflags 2>/dev/null`" + AC_MSG_RESULT($cf_cv_x_freetype_incs) + fi + + if test "$cf_cv_x_freetype_libs" = no ; then + AC_MSG_CHECKING(for $FREETYPE_CONFIG libs) + cf_cv_x_freetype_libs="$cf_extra_freetype_libs `$FREETYPE_CONFIG $FREETYPE_PARAMS --libs 2>/dev/null`" + AC_MSG_RESULT($cf_cv_x_freetype_libs) + fi +fi + +if test "$cf_cv_x_freetype_incs" = no ; then + cf_cv_x_freetype_incs= +fi + +if test "$cf_cv_x_freetype_libs" = no ; then + cf_cv_x_freetype_libs=-lXft +fi + +AC_MSG_CHECKING(if we can link with FreeType libraries) + +cf_save_LIBS="$LIBS" +cf_save_INCS="$CPPFLAGS" + +CF_ADD_LIBS($cf_cv_x_freetype_libs) +CPPFLAGS="$CPPFLAGS $cf_cv_x_freetype_incs" + +AC_TRY_LINK([ +#include +#include +#include ],[ + XftPattern *pat = XftNameParse ("name"); (void)pat], + [cf_cv_found_freetype=yes], + [cf_cv_found_freetype=no]) +AC_MSG_RESULT($cf_cv_found_freetype) + +LIBS="$cf_save_LIBS" +CPPFLAGS="$cf_save_INCS" + +if test "$cf_cv_found_freetype" = yes ; then + CF_ADD_LIBS($cf_cv_x_freetype_libs) + CF_ADD_CFLAGS($cf_cv_x_freetype_incs) + AC_DEFINE(XRENDERFONT,1,[Define to 1 if we can/should link with FreeType libraries]) + +AC_CHECK_FUNCS( \ + XftDrawCharSpec \ + XftDrawSetClip \ + XftDrawSetClipRectangles \ +) + +else + AC_MSG_WARN(No libraries found for FreeType) + CPPFLAGS=`echo "$CPPFLAGS" | sed -e s/-DXRENDERFONT//` +fi + +# FIXME: revisit this if needed +AC_SUBST(HAVE_TYPE_FCCHAR32) +AC_SUBST(HAVE_TYPE_XFTCHARSPEC) +]) +dnl --------------------------------------------------------------------------- +dnl CF_X_TOOLKIT version: 25 updated: 2020/03/10 17:26:15 +dnl ------------ +dnl Check for X Toolkit libraries +AC_DEFUN([CF_X_TOOLKIT], +[ +AC_REQUIRE([AC_PATH_XTRA]) +AC_REQUIRE([CF_CHECK_CACHE]) + +# OSX is schizoid about who owns /usr/X11 (old) versus /opt/X11 (new) (and +# in some cases has installed dummy files in the former, other cases replaced +# it with a link to the new location). This complicates the configure script. +# Check for that pitfall, and recover using pkg-config +# +# If none of these are set, the configuration is almost certainly broken. +if test -z "${X_CFLAGS}${X_PRE_LIBS}${X_LIBS}${X_EXTRA_LIBS}" +then + CF_TRY_PKG_CONFIG(x11,,[AC_MSG_WARN(unable to find X11 library)]) + CF_TRY_PKG_CONFIG(ice,,[AC_MSG_WARN(unable to find ICE library)]) + CF_TRY_PKG_CONFIG(sm,,[AC_MSG_WARN(unable to find SM library)]) + CF_TRY_PKG_CONFIG(xt,,[AC_MSG_WARN(unable to find Xt library)]) +else + LIBS="$X_PRE_LIBS $LIBS $X_EXTRA_LIBS" +fi + +cf_have_X_LIBS=no + +CF_TRY_PKG_CONFIG(xt,[ + + case "x$LIBS" in + (*-lX11*) + ;; + (*) +# we have an "xt" package, but it may omit Xt's dependency on X11 +AC_CACHE_CHECK(for usable X dependency,cf_cv_xt_x11_compat,[ +AC_TRY_LINK([ +#include +],[ + int rc1 = XDrawLine((Display*) 0, (Drawable) 0, (GC) 0, 0, 0, 0, 0); + int rc2 = XClearWindow((Display*) 0, (Window) 0); + int rc3 = XMoveWindow((Display*) 0, (Window) 0, 0, 0); + int rc4 = XMoveResizeWindow((Display*)0, (Window)0, 0, 0, 0, 0); +],[cf_cv_xt_x11_compat=yes],[cf_cv_xt_x11_compat=no])]) + if test "$cf_cv_xt_x11_compat" = no + then + CF_VERBOSE(work around broken X11 dependency) + # 2010/11/19 - good enough until a working Xt on Xcb is delivered. + CF_TRY_PKG_CONFIG(x11,,[CF_ADD_LIB_AFTER(-lXt,-lX11)]) + fi + ;; + esac + +AC_CACHE_CHECK(for usable X Toolkit package,cf_cv_xt_ice_compat,[ +AC_TRY_LINK([ +#include +],[int num = IceConnectionNumber(0); (void) num +],[cf_cv_xt_ice_compat=yes],[cf_cv_xt_ice_compat=no])]) + + if test "$cf_cv_xt_ice_compat" = no + then + # workaround for broken ".pc" files used for X Toolkit. + case "x$X_PRE_LIBS" in + (*-lICE*) + case "x$LIBS" in + (*-lICE*) + ;; + (*) + CF_VERBOSE(work around broken ICE dependency) + CF_TRY_PKG_CONFIG(ice, + [CF_TRY_PKG_CONFIG(sm)], + [CF_ADD_LIB_AFTER(-lXt,$X_PRE_LIBS)]) + ;; + esac + ;; + esac + fi + + cf_have_X_LIBS=yes +],[ + + LDFLAGS="$X_LIBS $LDFLAGS" + CF_CHECK_CFLAGS($X_CFLAGS) + + AC_CHECK_FUNC(XOpenDisplay,,[ + AC_CHECK_LIB(X11,XOpenDisplay, + [CF_ADD_LIB(X11)])]) + + AC_CHECK_FUNC(XtAppInitialize,,[ + AC_CHECK_LIB(Xt, XtAppInitialize, + [AC_DEFINE(HAVE_LIBXT,1,[Define to 1 if we can compile with the Xt library]) + cf_have_X_LIBS=Xt + LIBS="-lXt $LIBS"])]) +]) + +if test $cf_have_X_LIBS = no ; then + AC_MSG_WARN( +[Unable to successfully link X Toolkit library (-lXt) with +test program. You will have to check and add the proper libraries by hand +to makefile.]) +fi +])dnl +dnl --------------------------------------------------------------------------- +dnl CF__GRANTPT_BODY version: 5 updated: 2020/03/10 18:53:47 +dnl ---------------- +dnl Body for workability check of grantpt. +define([CF__GRANTPT_BODY],[ + int code = 0; + int rc; + int pty; + int tty; + char *slave; + struct termios tio; + + (void)tio; + signal(SIGALRM, my_timeout); + + if (alarm(2) == 9) + failed(9); + else if ((pty = posix_openpt(O_RDWR)) < 0) + failed(1); + else if ((rc = grantpt(pty)) < 0) + failed(2); + else if ((rc = unlockpt(pty)) < 0) + failed(3); + else if ((slave = ptsname(pty)) == 0) + failed(4); +#if (CONFTEST == 3) || defined(CONFTEST_isatty) + else if (!isatty(pty)) + failed(4); +#endif +#if CONFTEST >= 4 + else if ((rc = tcgetattr(pty, &tio)) < 0) + failed(20); + else if ((rc = tcsetattr(pty, TCSAFLUSH, &tio)) < 0) + failed(21); +#endif + /* BSD posix_openpt does not treat pty as a terminal until slave is opened. + * Linux does treat it that way. + */ + else if ((tty = open(slave, O_RDWR)) < 0) + failed(5); +#ifdef CONFTEST +#ifdef I_PUSH +#if (CONFTEST == 0) || defined(CONFTEST_ptem) + else if ((rc = ioctl(tty, I_PUSH, "ptem")) < 0) + failed(10); +#endif +#if (CONFTEST == 1) || defined(CONFTEST_ldterm) + else if ((rc = ioctl(tty, I_PUSH, "ldterm")) < 0) + failed(11); +#endif +#if (CONFTEST == 2) || defined(CONFTEST_ttcompat) + else if ((rc = ioctl(tty, I_PUSH, "ttcompat")) < 0) + failed(12); +#endif +#endif /* I_PUSH */ +#if CONFTEST >= 5 + else if ((rc = tcgetattr(tty, &tio)) < 0) + failed(30); + else if ((rc = tcsetattr(tty, TCSAFLUSH, &tio)) < 0) + failed(31); +#endif +#endif /* CONFTEST */ + + ${cf_cv_main_return:-return}(code); +]) +dnl --------------------------------------------------------------------------- +dnl CF__GRANTPT_HEAD version: 4 updated: 2020/03/10 18:53:47 +dnl ---------------- +dnl Headers for workability check of grantpt. +define([CF__GRANTPT_HEAD],[ +#include +#include +#include +#include +#include +#include +#include + +#ifndef HAVE_POSIX_OPENPT +#undef posix_openpt +#define posix_openpt(mode) open("/dev/ptmx", mode) +#endif + +#ifdef HAVE_STROPTS_H +#include +#endif + +static void failed(int code) +{ + perror("conftest"); + exit(code); +} + +static void my_timeout(int sig) +{ + (void)sig; + exit(99); +} +]) diff --git a/ports/xterm/xterm-359/builtin_icons.h b/ports/xterm/xterm-359/builtin_icons.h new file mode 100644 index 0000000..da6751b --- /dev/null +++ b/ports/xterm/xterm-359/builtin_icons.h @@ -0,0 +1,271 @@ +#if OPT_BUILTIN_XPMS +#include +#include +#include +#include +#else +/* XPM */ +static const char * mini_xterm_48x48_xpm[] = { +"48 48 213 2", +" c None", +". c #FF0000", +"+ c #FF5300", +"@ c #FF5E00", +"# c #FF4800", +"$ c #FF4200", +"% c #FF4000", +"& c #FF4B00", +"* c #FF5200", +"= c #FF5400", +"- c #FF3500", +"; c #FF5100", +"> c #FF5C00", +", c #FF3000", +"' c #FF4500", +") c #FF2000", +"! c #FF0300", +"~ c #FF1600", +"{ c #FF5D00", +"] c #FF3800", +"^ c #FF0200", +"/ c #FF0900", +"( c #FF2B00", +"_ c #FF3300", +": c #FF1A00", +"< c #FF1300", +"[ c #FF1200", +"} c #FF5700", +"| c #4577BA", +"1 c #874E78", +"2 c #887577", +"3 c #887E77", +"4 c #887977", +"5 c #875078", +"6 c #566CA9", +"7 c #5E70A1", +"8 c #884E77", +"9 c #887677", +"0 c #7C5B83", +"a c #795686", +"b c #008DFE", +"c c #0012F3", +"d c #000BF2", +"e c #008FFE", +"f c #006CFA", +"g c #0000F1", +"h c #0001F1", +"i c #0020F4", +"j c #0040F6", +"k c #0959F0", +"l c #1158E8", +"m c #1159E8", +"n c #0058F9", +"o c #001DF4", +"p c #0023F4", +"q c #005BFA", +"r c #0060FA", +"s c #0E58EB", +"t c #0651F3", +"u c #0033F5", +"v c #000EF2", +"w c #006EFA", +"x c #0092FF", +"y c #001FF4", +"z c #000FF2", +"A c #0C51EC", +"B c #326AC9", +"C c #7A6583", +"D c #CA6234", +"E c #FC5F03", +"F c #FF5800", +"G c #FF0800", +"H c #F4060B", +"I c #007CFB", +"J c #0013F3", +"K c #007EFB", +"L c #FF1800", +"M c #F3590C", +"N c #AB6152", +"O c #4F4EAD", +"P c #175CE4", +"Q c #0036F5", +"R c #0022F4", +"S c #0095FD", +"T c #0084FD", +"U c #0004F1", +"V c #0051F8", +"W c #345AC7", +"X c #E61519", +"Y c #FF5900", +"Z c #FF4600", +"` c #FF0100", +" . c #446EB9", +".. c #0034F6", +"+. c #0032F5", +"@. c #FF2200", +"#. c #006FFA", +"$. c #002DF5", +"%. c #0086FD", +"&. c #0046F7", +"*. c #0015F3", +"=. c #0076FC", +"-. c #FF0400", +";. c #FF2300", +">. c #FF2900", +",. c #9E3E61", +"'. c #0039F6", +"). c #FF2A00", +"!. c #FF4300", +"~. c #0071FB", +"{. c #005EF9", +"]. c #004DF7", +"^. c #008CFE", +"/. c #0008F2", +"(. c #001DF3", +"_. c #007DFB", +":. c #FF4100", +"<. c #FF5B00", +"[. c #A3425C", +"}. c #994C66", +"|. c #FF1100", +"1. c #0072FB", +"2. c #000AF2", +"3. c #006EFC", +"4. c #0017F3", +"5. c #007FFB", +"6. c #FF0600", +"7. c #FF5600", +"8. c #A56A5A", +"9. c #A53B5A", +"0. c #FF4F00", +"a. c #0076FB", +"b. c #0076FA", +"c. c #0093FF", +"d. c #007DFC", +"e. c #FF1C00", +"f. c #A5765A", +"g. c #A55D5A", +"h. c #006FFB", +"i. c #002CF5", +"j. c #008AFD", +"k. c #006BF9", +"l. c #FF3A00", +"m. c #FF5000", +"n. c #007BFB", +"o. c #008BFD", +"p. c #A5755A", +"q. c #9A5565", +"r. c #A43A5B", +"s. c #FF4D00", +"t. c #80507F", +"u. c #FF0F00", +"v. c #7A5485", +"w. c #A5555A", +"x. c #FF0A00", +"y. c #A53D5A", +"z. c #A4515B", +"A. c #A5685A", +"B. c #A5735A", +"C. c #FF0700", +"D. c #FF2E00", +"E. c #FF1500", +"F. c #A3705C", +"G. c #FF0500", +"H. c #9A4965", +"I. c #FF0E00", +"J. c #FF3B00", +"K. c #FF2D00", +"L. c #A13C5E", +"M. c #FF4C00", +"N. c #62649D", +"O. c #FF0B00", +"P. c #FF4700", +"Q. c #FF1D00", +"R. c #A56D5A", +"S. c #FF2C00", +"T. c #A4465B", +"U. c #FF1400", +"V. c #A03E61", +"W. c #FF3100", +"X. c #FF1B00", +"Y. c #FF1000", +"Z. c #0029F5", +"`. c #0027F4", +" + c #4571BA", +".+ c #FF3900", +"++ c #FF3200", +"@+ c #008EFD", +"#+ c #0019F3", +"$+ c #0090FD", +"%+ c #FF0D00", +"&+ c #FF1E00", +"*+ c #FF4E00", +"=+ c #0088FC", +"-+ c #0087FC", +";+ c #FF1900", +">+ c #0036F6", +",+ c #FF2100", +"'+ c #0073FB", +")+ c #0062FA", +"!+ c #001AF3", +"~+ c #2463D8", +"{+ c #3E58BE", +"]+ c #2A7FD3", +"^+ c #807B7F", +"/+ c #008EFB", +"(+ c #006AFA", +"_+ c #004CF8", +":+ c #717B8D", +"<+ c #EE0B11", +"[+ c #F73E08", +"}+ c #FF1F00", +"|+ c #FF5500", +" ", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ . . # @ @ @ @ @ @ @ @ @ @ @ @ $ . ", +" . % & & & * @ @ @ @ @ = & & & & & . . - & & & & & ; @ > & & & & , . ", +" . . . . . . * @ @ @ @ ; . . . . . . . . . . . . . ' @ ) . . . . . . ", +" ! ~ { @ @ @ @ ] ^ / ( @ $ . ", +" ^ _ @ @ @ @ @ : ! < [ > } ^ . ", +" | 1 2 3 3 3 3 4 5 6 7 8 9 3 0 a ", +" b c d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d c e ", +" f g g g g g g h i j k l m n o g g g g g g p q r s t u v g g g g g g g w ", +" x y g g g g z A B C D E F G H I c g g g g J K L / M N O P Q h g g g g R S ", +" T g g g U V W X Y @ @ @ @ Z ` ...g g g g +. ` ' @ @.. #.$.g g g g %. ", +" &.g g *.=. -.;.@ @ @ @ @ >.,.'.g g g g '. / ).@ !.. ~.{.U g g ]. ", +" ^./.g (._. ` :.@ @ @ @ <.[.'.g g g g '.}.|.<.} ^ . 1.2.g d e ", +" 3.g 4.5. 6.7.@ @ @ @ 8.'.g g g g '.9.0.@ [ . a./.g b. ", +" c.R /.d. -.e.@ @ @ @ f.'.g g g g '.g.@ - . h.h i. ", +" j.k.%. ^ l.@ @ @ f.'.g g g g '.f.m.` n.f o. ", +" ! * @ @ f.'.g g g g '.p.G . ", +" ! ~ { @ f.'.g g g g '.q.. ", +" ^ _ @ f.'.g g g g '.r. ", +" ^ s.f.'.g g g g '.t. ", +" ^ u.p.'.g g g g '.v. ", +" ^ w.'.g g g g '.r. ", +" x.y.'.g g g g '.z.^ ", +" ` A.'.g g g g '.B.x.. ", +" C.D.f.'.g g g g '.f.# ` ", +" < E.{ F.'.g g g g '.f.@ ( ^ ", +" : G.; @ H.'.g g g g '.f.@ <.I.^ ", +" -.J.@ K.L.'.g g g g '.f.@ @ s.` ", +" I.) @ M.. N.'.g g g g '.f.@ @ @ _ ^ ", +" L O.F <.6.. '.g g g g '.f.@ @ @ { E.! ", +" ^ P.@ Q.. '.g g g g '.R.@ @ @ @ * ! ", +" G S.@ % . '.g g g g '.T.{ @ @ @ @ l.^ ", +" < U.> 7.^ ..g g g g u V.W.@ @ @ @ @ e.! ", +" X.-.m.@ Y.. Z.g g g g `. +` M.@ @ @ @ 7.6. ", +" -..+@ ++. @+#+g g g g #+$+^ %+<.@ @ @ @ :.` ", +" I.&+@ *+. =+h g g g g h -+ ! >.@ @ @ @ @ ;.^ ", +" ;+x.} > C.. >+g g g g g g >+ ` Z @ @ @ @ Y / . ", +" ` ' @ ,+. %.1.'+)+!+g g g g g g g g #+)+~+{+]+^+@ @ @ P.` ", +" / ).@ !.. /+(+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+(+:+@ @ @ @ ).^ ", +" I.[ > F . . <+[+@ @ @ @ <.I.` ", +" . . . . . . 0.@ }+. . . . . . . . . . . . . |+@ @ @ @ s.. . . . . . ", +" O.@ @ @ @ @ @ @ @ @ @ @ @ @ ^ ! $ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ $ . ", +" . & & & & & & & & & & & & & . . , & & & & & & & & & & & & & & & , . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" ", +" "}; +#endif diff --git a/ports/xterm/xterm-359/button.c b/ports/xterm/xterm-359/button.c new file mode 100644 index 0000000..33020b4 --- /dev/null +++ b/ports/xterm/xterm-359/button.c @@ -0,0 +1,5658 @@ +/* $XTermId: button.c,v 1.585 2020/08/04 08:10:25 tom Exp $ */ + +/* + * Copyright 1999-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* +button.c Handles button events in the terminal emulator. + does cut/paste operations, change modes via menu, + passes button events through to some applications. + J. Gettys. +*/ + +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#if OPT_SELECT_REGEX +#ifdef HAVE_PCRE2POSIX_H +#include +#else +#ifdef HAVE_PCREPOSIX_H +#include +#else /* POSIX regex.h */ +#include +#include +#endif +#endif +#endif + +#define PRIMARY_NAME "PRIMARY" +#define CLIPBOARD_NAME "CLIPBOARD" +#define SECONDARY_NAME "SECONDARY" + +#define AtomToSelection(d,n) \ + (((n) == XA_CLIPBOARD(d)) \ + ? CLIPBOARD_CODE \ + : (((n) == XA_SECONDARY) \ + ? SECONDARY_CODE \ + : PRIMARY_CODE)) + +#define isSelectionCode(n) ((n) >= PRIMARY_CODE) +#define CutBufferToCode(n) ((n) + MAX_SELECTION_CODES) +#define okSelectionCode(n) (isSelectionCode(n) ? (n) : PRIMARY_CODE) + +#if OPT_WIDE_CHARS +#include +#include +#else +#define CharacterClass(value) \ + charClass[(value) & (int)((sizeof(charClass)/sizeof(charClass[0]))-1)] +#endif + + /* + * We'll generally map rows to indices when doing selection. + * Simplify that with a macro. + * + * Note that ROW2INX() is safe to use with auto increment/decrement for + * the row expression since that is evaluated once. + */ +#define GET_LINEDATA(screen, row) \ + getLineData(screen, ROW2INX(screen, row)) + + /* + * We reserve shift modifier for cut/paste operations. + * + * In principle we can pass through control and meta modifiers, but in + * practice, the popup menu uses control, and the window manager is likely + * to use meta, so those events usually are not delivered to + * SendMousePosition. + */ +#define OurModifiers (ShiftMask) +#define AllModifiers (ShiftMask | LockMask | ControlMask | Mod1Mask | \ + Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask) + +#define BtnModifiers(event) (event->state & OurModifiers) +#define KeyModifiers(event) (event->xbutton.state & OurModifiers) + +#define IsBtnEvent(event) ((event)->type == ButtonPress || (event)->type == ButtonRelease) +#define IsKeyEvent(event) ((event)->type == KeyPress || (event)->type == KeyRelease) + +#define KeyState(x) (((int) ((x) & (ShiftMask|ControlMask))) \ + + (((x) & Mod1Mask) ? 2 : 0)) + /* adds together the bits: + shift key -> 1 + meta key -> 2 + control key -> 4 */ + +#define Coordinate(s,c) ((c)->row * MaxCols(s) + (c)->col) + +static const CELL zeroCELL = +{0, 0}; + +#if OPT_DEC_LOCATOR +static Bool SendLocatorPosition(XtermWidget xw, XButtonEvent *event); +static void CheckLocatorPosition(XtermWidget xw, XButtonEvent *event); +#endif /* OPT_DEC_LOCATOR */ + +/* Multi-click handling */ +#if OPT_READLINE +static Time lastButtonDownTime = 0; +static int ExtendingSelection = 0; +static Time lastButton3UpTime = 0; +static Time lastButton3DoubleDownTime = 0; +static CELL lastButton3; /* At the release time */ +#endif /* OPT_READLINE */ + +static Char *SaveText(TScreen *screen, int row, int scol, int ecol, + Char *lp, int *eol); +static int Length(TScreen *screen, int row, int scol, int ecol); +static void ComputeSelect(XtermWidget xw, CELL *startc, CELL *endc, Bool extend); +static void EditorButton(XtermWidget xw, XButtonEvent *event); +static void EndExtend(XtermWidget w, XEvent *event, String *params, Cardinal + num_params, Bool use_cursor_loc); +static void ExtendExtend(XtermWidget xw, const CELL *cell); +static void PointToCELL(TScreen *screen, int y, int x, CELL *cell); +static void ReHiliteText(XtermWidget xw, CELL *first, CELL *last); +static void SaltTextAway(XtermWidget xw, int which, CELL *cellc, CELL *cell); +static void SelectSet(XtermWidget xw, XEvent *event, String *params, Cardinal num_params); +static void SelectionReceived PROTO_XT_SEL_CB_ARGS; +static void StartSelect(XtermWidget xw, const CELL *cell); +static void TrackDown(XtermWidget xw, XButtonEvent *event); +static void TrackText(XtermWidget xw, const CELL *first, const CELL *last); +static void UnHiliteText(XtermWidget xw); +static void _OwnSelection(XtermWidget xw, String *selections, Cardinal count); +static void do_select_end(XtermWidget xw, XEvent *event, String *params, + Cardinal *num_params, Bool use_cursor_loc); + +#define MOUSE_LIMIT (255 - 32) + +/* Send SET_EXT_SIZE_MOUSE to enable offsets up to EXT_MOUSE_LIMIT */ +#define EXT_MOUSE_LIMIT (2047 - 32) +#define EXT_MOUSE_START (127 - 32) + +static int +MouseLimit(TScreen *screen) +{ + int mouse_limit; + + switch (screen->extend_coords) { + default: + mouse_limit = MOUSE_LIMIT; + break; + case SET_EXT_MODE_MOUSE: + mouse_limit = EXT_MOUSE_LIMIT; + break; + case SET_SGR_EXT_MODE_MOUSE: + case SET_URXVT_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + mouse_limit = -1; + break; + } + return mouse_limit; +} + +static unsigned +EmitMousePosition(TScreen *screen, Char line[], unsigned count, int value) +{ + int mouse_limit = MouseLimit(screen); + + /* + * Add pointer position to key sequence + * + * In extended mode we encode large positions as two-byte UTF-8. + * + * NOTE: historically, it was possible to emit 256, which became + * zero by truncation to 8 bits. While this was arguably a bug, + * it's also somewhat useful as a past-end marker. We preserve + * this behavior for both normal and extended mouse modes. + */ + switch (screen->extend_coords) { + default: + if (value == mouse_limit) { + line[count++] = CharOf(0); + } else { + line[count++] = CharOf(' ' + value + 1); + } + break; + case SET_EXT_MODE_MOUSE: + if (value == mouse_limit) { + line[count++] = CharOf(0); + } else if (value < EXT_MOUSE_START) { + line[count++] = CharOf(' ' + value + 1); + } else { + value += ' ' + 1; + line[count++] = CharOf(0xC0 + (value >> 6)); + line[count++] = CharOf(0x80 + (value & 0x3F)); + } + break; + case SET_SGR_EXT_MODE_MOUSE: + case SET_URXVT_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + count += (unsigned) sprintf((char *) line + count, "%d", value + 1); + break; + } + return count; +} + +static unsigned +EmitMousePositionSeparator(TScreen *screen, Char line[], unsigned count) +{ + switch (screen->extend_coords) { + case SET_SGR_EXT_MODE_MOUSE: + case SET_URXVT_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + line[count++] = ';'; + break; + } + return count; +} + +Bool +SendMousePosition(XtermWidget xw, XEvent *event) +{ + XButtonEvent *my_event = (XButtonEvent *) event; + Bool result = False; + + switch (okSendMousePos(xw)) { + case MOUSE_OFF: + /* If send_mouse_pos mode isn't on, we shouldn't be here */ + break; + + case BTN_EVENT_MOUSE: + case ANY_EVENT_MOUSE: + if (KeyModifiers(event) == 0) { + /* xterm extension for motion reporting. June 1998 */ + /* EditorButton() will distinguish between the modes */ + switch (event->type) { + case MotionNotify: + my_event->button = 0; + /* FALLTHRU */ + case ButtonPress: + /* FALLTHRU */ + case ButtonRelease: + EditorButton(xw, my_event); + result = True; + break; + } + } + break; + + case X10_MOUSE: /* X10 compatibility sequences */ + if (IsBtnEvent(event)) { + if (BtnModifiers(my_event) == 0) { + if (my_event->type == ButtonPress) + EditorButton(xw, my_event); + result = True; + } + } + break; + + case VT200_HIGHLIGHT_MOUSE: /* DEC vt200 hilite tracking */ + if (IsBtnEvent(event)) { + if (my_event->type == ButtonPress && + BtnModifiers(my_event) == 0 && + my_event->button == Button1) { + TrackDown(xw, my_event); + result = True; + } else if (BtnModifiers(my_event) == 0) { + EditorButton(xw, my_event); + result = True; + } + } + break; + + case VT200_MOUSE: /* DEC vt200 compatible */ + if (IsBtnEvent(event)) { + if (BtnModifiers(my_event) == 0) { + EditorButton(xw, my_event); + result = True; + } + } + break; + + case DEC_LOCATOR: +#if OPT_DEC_LOCATOR + if (IsBtnEvent(event) || event->type == MotionNotify) { + result = SendLocatorPosition(xw, my_event); + } +#endif /* OPT_DEC_LOCATOR */ + break; + } + return result; +} + +#if OPT_DEC_LOCATOR + +#define LocatorCoords( row, col, x, y, oor ) \ + if( screen->locator_pixels ) { \ + (oor)=False; (row) = (y)+1; (col) = (x)+1; \ + /* Limit to screen dimensions */ \ + if ((row) < 1) (row) = 1,(oor)=True; \ + else if ((row) > screen->border*2+Height(screen)) \ + (row) = screen->border*2+Height(screen),(oor)=True; \ + if ((col) < 1) (col) = 1,(oor)=True; \ + else if ((col) > OriginX(screen)*2+Width(screen)) \ + (col) = OriginX(screen)*2+Width(screen),(oor)=True; \ + } else { \ + (oor)=False; \ + /* Compute character position of mouse pointer */ \ + (row) = ((y) - screen->border) / FontHeight(screen); \ + (col) = ((x) - OriginX(screen)) / FontWidth(screen); \ + /* Limit to screen dimensions */ \ + if ((row) < 0) (row) = 0,(oor)=True; \ + else if ((row) > screen->max_row) \ + (row) = screen->max_row,(oor)=True; \ + if ((col) < 0) (col) = 0,(oor)=True; \ + else if ((col) > screen->max_col) \ + (col) = screen->max_col,(oor)=True; \ + (row)++; (col)++; \ + } + +static Bool +SendLocatorPosition(XtermWidget xw, XButtonEvent *event) +{ + ANSI reply; + TScreen *screen = TScreenOf(xw); + int row, col; + Bool oor; + int button; + unsigned state; + + /* Make sure the event is an appropriate type */ + if ((!IsBtnEvent(event) && + !screen->loc_filter) || + (BtnModifiers(event) != 0)) + return (False); + + if ((event->type == ButtonPress && + !(screen->locator_events & LOC_BTNS_DN)) || + (event->type == ButtonRelease && + !(screen->locator_events & LOC_BTNS_UP))) + return (True); + + if (event->type == MotionNotify) { + CheckLocatorPosition(xw, event); + return (True); + } + + /* get button # */ + button = (int) event->button - 1; + + LocatorCoords(row, col, event->x, event->y, oor); + + /* + * DECterm mouse: + * + * ESCAPE '[' event ; mask ; row ; column '&' 'w' + */ + memset(&reply, 0, sizeof(reply)); + reply.a_type = ANSI_CSI; + + if (oor) { + reply.a_nparam = 1; + reply.a_param[0] = 0; /* Event - 0 = locator unavailable */ + reply.a_inters = '&'; + reply.a_final = 'w'; + unparseseq(xw, &reply); + + if (screen->locator_reset) { + MotionOff(screen, xw); + screen->send_mouse_pos = MOUSE_OFF; + } + return (True); + } + + /* + * event: + * 1 no buttons + * 2 left button down + * 3 left button up + * 4 middle button down + * 5 middle button up + * 6 right button down + * 7 right button up + * 8 M4 down + * 9 M4 up + */ + reply.a_nparam = 4; + switch (event->type) { + case ButtonPress: + reply.a_param[0] = (ParmType) (2 + (button << 1)); + break; + case ButtonRelease: + reply.a_param[0] = (ParmType) (3 + (button << 1)); + break; + default: + return (True); + } + /* + * mask: + * bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 + * M4 down left down middle down right down + * + * Notice that Button1 (left) and Button3 (right) are swapped in the mask. + * Also, mask should be the state after the button press/release, + * X provides the state not including the button press/release. + */ + state = (event->state + & (Button1Mask | Button2Mask | Button3Mask | Button4Mask)) >> 8; + /* update mask to "after" state */ + state ^= ((unsigned) (1 << button)); + /* swap Button1 & Button3 */ + state = ((state & (unsigned) ~(4 | 1)) + | ((state & 1) ? 4 : 0) + | ((state & 4) ? 1 : 0)); + + reply.a_param[1] = (ParmType) state; + reply.a_param[2] = (ParmType) row; + reply.a_param[3] = (ParmType) col; + reply.a_inters = '&'; + reply.a_final = 'w'; + + unparseseq(xw, &reply); + + if (screen->locator_reset) { + MotionOff(screen, xw); + screen->send_mouse_pos = MOUSE_OFF; + } + + /* + * DECterm turns the Locator off if a button is pressed while a filter + * rectangle is active. This might be a bug, but I don't know, so I'll + * emulate it anyway. + */ + if (screen->loc_filter) { + screen->send_mouse_pos = MOUSE_OFF; + screen->loc_filter = False; + screen->locator_events = 0; + MotionOff(screen, xw); + } + + return (True); +} + +/* + * mask: + * bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 + * M4 down left down middle down right down + * + * Button1 (left) and Button3 (right) are swapped in the mask relative to X. + */ +#define ButtonState(state, mask) \ +{ int stemp = (int) (((mask) & (Button1Mask | Button2Mask | Button3Mask | Button4Mask)) >> 8); \ + /* swap Button1 & Button3 */ \ + (state) = (stemp & ~(4|1)) | ((stemp & 1) ? 4 : 0) | ((stemp & 4) ? 1 : 0); \ +} + +void +GetLocatorPosition(XtermWidget xw) +{ + ANSI reply; + TScreen *screen = TScreenOf(xw); + Window root, child; + int rx, ry, x, y; + unsigned int mask = 0; + int row = 0, col = 0; + Bool oor = False; + Bool ret = False; + int state; + + /* + * DECterm turns the Locator off if the position is requested while a + * filter rectangle is active. This might be a bug, but I don't know, so + * I'll emulate it anyways. + */ + if (screen->loc_filter) { + screen->send_mouse_pos = MOUSE_OFF; + screen->loc_filter = False; + screen->locator_events = 0; + MotionOff(screen, xw); + } + + memset(&reply, 0, sizeof(reply)); + reply.a_type = ANSI_CSI; + + if (okSendMousePos(xw) == DEC_LOCATOR) { + ret = XQueryPointer(screen->display, VWindow(screen), &root, + &child, &rx, &ry, &x, &y, &mask); + if (ret) { + LocatorCoords(row, col, x, y, oor); + } + } + if (ret == False || oor) { + reply.a_nparam = 1; + reply.a_param[0] = 0; /* Event - 0 = locator unavailable */ + reply.a_inters = '&'; + reply.a_final = 'w'; + unparseseq(xw, &reply); + + if (screen->locator_reset) { + MotionOff(screen, xw); + screen->send_mouse_pos = MOUSE_OFF; + } + return; + } + + ButtonState(state, mask); + + reply.a_nparam = 4; + reply.a_param[0] = 1; /* Event - 1 = response to locator request */ + reply.a_param[1] = (ParmType) state; + reply.a_param[2] = (ParmType) row; + reply.a_param[3] = (ParmType) col; + reply.a_inters = '&'; + reply.a_final = 'w'; + unparseseq(xw, &reply); + + if (screen->locator_reset) { + MotionOff(screen, xw); + screen->send_mouse_pos = MOUSE_OFF; + } +} + +void +InitLocatorFilter(XtermWidget xw) +{ + ANSI reply; + TScreen *screen = TScreenOf(xw); + Window root, child; + int rx, ry, x, y; + unsigned int mask; + int row = 0, col = 0; + Bool oor = 0; + Bool ret; + + ret = XQueryPointer(screen->display, VWindow(screen), + &root, &child, &rx, &ry, &x, &y, &mask); + if (ret) { + LocatorCoords(row, col, x, y, oor); + } + if (ret == False || oor) { + /* Locator is unavailable */ + + if (screen->loc_filter_top != LOC_FILTER_POS || + screen->loc_filter_left != LOC_FILTER_POS || + screen->loc_filter_bottom != LOC_FILTER_POS || + screen->loc_filter_right != LOC_FILTER_POS) { + /* + * If any explicit coordinates were received, + * report immediately with no coordinates. + */ + memset(&reply, 0, sizeof(reply)); + reply.a_type = ANSI_CSI; + reply.a_nparam = 1; + reply.a_param[0] = 0; /* Event - 0 = locator unavailable */ + reply.a_inters = '&'; + reply.a_final = 'w'; + unparseseq(xw, &reply); + + if (screen->locator_reset) { + MotionOff(screen, xw); + screen->send_mouse_pos = MOUSE_OFF; + } + } else { + /* + * No explicit coordinates were received, and the pointer is + * unavailable. Report when the pointer re-enters the window. + */ + screen->loc_filter = True; + MotionOn(screen, xw); + } + return; + } + + /* + * Adjust rectangle coordinates: + * 1. Replace "LOC_FILTER_POS" with current coordinates + * 2. Limit coordinates to screen size + * 3. make sure top and left are less than bottom and right, resp. + */ + if (screen->locator_pixels) { + rx = OriginX(screen) * 2 + Width(screen); + ry = screen->border * 2 + Height(screen); + } else { + rx = screen->max_col; + ry = screen->max_row; + } + +#define Adjust( coord, def, max ) \ + if( (coord) == LOC_FILTER_POS ) (coord) = (def); \ + else if ((coord) < 1) (coord) = 1; \ + else if ((coord) > (max)) (coord) = (max) + + Adjust(screen->loc_filter_top, row, ry); + Adjust(screen->loc_filter_left, col, rx); + Adjust(screen->loc_filter_bottom, row, ry); + Adjust(screen->loc_filter_right, col, rx); + + if (screen->loc_filter_top > screen->loc_filter_bottom) { + ry = screen->loc_filter_top; + screen->loc_filter_top = screen->loc_filter_bottom; + screen->loc_filter_bottom = ry; + } + + if (screen->loc_filter_left > screen->loc_filter_right) { + rx = screen->loc_filter_left; + screen->loc_filter_left = screen->loc_filter_right; + screen->loc_filter_right = rx; + } + + if ((col < screen->loc_filter_left) || + (col > screen->loc_filter_right) || + (row < screen->loc_filter_top) || + (row > screen->loc_filter_bottom)) { + int state; + + /* Pointer is already outside the rectangle - report immediately */ + ButtonState(state, mask); + + memset(&reply, 0, sizeof(reply)); + reply.a_type = ANSI_CSI; + reply.a_nparam = 4; + reply.a_param[0] = 10; /* Event - 10 = locator outside filter */ + reply.a_param[1] = (ParmType) state; + reply.a_param[2] = (ParmType) row; + reply.a_param[3] = (ParmType) col; + reply.a_inters = '&'; + reply.a_final = 'w'; + unparseseq(xw, &reply); + + if (screen->locator_reset) { + MotionOff(screen, xw); + screen->send_mouse_pos = MOUSE_OFF; + } + return; + } + + /* + * Rectangle is set up. Allow pointer tracking + * to detect if the mouse leaves the rectangle. + */ + screen->loc_filter = True; + MotionOn(screen, xw); +} + +static void +CheckLocatorPosition(XtermWidget xw, XButtonEvent *event) +{ + ANSI reply; + TScreen *screen = TScreenOf(xw); + int row, col; + Bool oor; + + LocatorCoords(row, col, event->x, event->y, oor); + + /* + * Send report if the pointer left the filter rectangle, if + * the pointer left the window, or if the filter rectangle + * had no coordinates and the pointer re-entered the window. + */ + if (oor || (screen->loc_filter_top == LOC_FILTER_POS) || + (col < screen->loc_filter_left) || + (col > screen->loc_filter_right) || + (row < screen->loc_filter_top) || + (row > screen->loc_filter_bottom)) { + /* Filter triggered - disable it */ + screen->loc_filter = False; + MotionOff(screen, xw); + + memset(&reply, 0, sizeof(reply)); + reply.a_type = ANSI_CSI; + if (oor) { + reply.a_nparam = 1; + reply.a_param[0] = 0; /* Event - 0 = locator unavailable */ + } else { + int state; + + ButtonState(state, event->state); + + reply.a_nparam = 4; + reply.a_param[0] = 10; /* Event - 10 = locator outside filter */ + reply.a_param[1] = (ParmType) state; + reply.a_param[2] = (ParmType) row; + reply.a_param[3] = (ParmType) col; + } + + reply.a_inters = '&'; + reply.a_final = 'w'; + unparseseq(xw, &reply); + + if (screen->locator_reset) { + MotionOff(screen, xw); + screen->send_mouse_pos = MOUSE_OFF; + } + } +} +#endif /* OPT_DEC_LOCATOR */ + +#if OPT_READLINE +static int +isClick1_clean(XtermWidget xw, XButtonEvent *event) +{ + TScreen *screen = TScreenOf(xw); + int delta; + + if (!IsBtnEvent(event) + /* Disable on Shift-Click-1, including the application-mouse modes */ + || (BtnModifiers(event) & ShiftMask) + || (okSendMousePos(xw) != MOUSE_OFF) /* Kinda duplicate... */ + ||ExtendingSelection) /* Was moved */ + return 0; + + if (event->type != ButtonRelease) + return 0; + + if (lastButtonDownTime == (Time) 0) { + /* first time or once in a blue moon */ + delta = screen->multiClickTime + 1; + } else if (event->time > lastButtonDownTime) { + /* most of the time */ + delta = (int) (event->time - lastButtonDownTime); + } else { + /* time has rolled over since lastButtonUpTime */ + delta = (int) ((((Time) ~ 0) - lastButtonDownTime) + event->time); + } + + return delta <= screen->multiClickTime; +} + +static int +isDoubleClick3(TScreen *screen, XButtonEvent *event) +{ + int delta; + + if (event->type != ButtonRelease + || (BtnModifiers(event) & ShiftMask) + || event->button != Button3) { + lastButton3UpTime = 0; /* Disable the cached info */ + return 0; + } + /* Process Btn3Release. */ + if (lastButton3DoubleDownTime == (Time) 0) { + /* No previous click or once in a blue moon */ + delta = screen->multiClickTime + 1; + } else if (event->time > lastButton3DoubleDownTime) { + /* most of the time */ + delta = (int) (event->time - lastButton3DoubleDownTime); + } else { + /* time has rolled over since lastButton3DoubleDownTime */ + delta = (int) ((((Time) ~ 0) - lastButton3DoubleDownTime) + event->time); + } + if (delta <= screen->multiClickTime) { + /* Double click */ + CELL cell; + + /* Cannot check ExtendingSelection, since mouse-3 always sets it */ + PointToCELL(screen, event->y, event->x, &cell); + if (isSameCELL(&cell, &lastButton3)) { + lastButton3DoubleDownTime = 0; /* Disable the third click */ + return 1; + } + } + /* Not a double click, memorize for future check. */ + lastButton3UpTime = event->time; + PointToCELL(screen, event->y, event->x, &lastButton3); + return 0; +} + +static int +CheckSecondPress3(TScreen *screen, XEvent *event) +{ + int delta; + + if (event->type != ButtonPress + || (KeyModifiers(event) & ShiftMask) + || event->xbutton.button != Button3) { + lastButton3DoubleDownTime = 0; /* Disable the cached info */ + return 0; + } + /* Process Btn3Press. */ + if (lastButton3UpTime == (Time) 0) { + /* No previous click or once in a blue moon */ + delta = screen->multiClickTime + 1; + } else if (event->xbutton.time > lastButton3UpTime) { + /* most of the time */ + delta = (int) (event->xbutton.time - lastButton3UpTime); + } else { + /* time has rolled over since lastButton3UpTime */ + delta = (int) ((((Time) ~ 0) - lastButton3UpTime) + event->xbutton.time); + } + if (delta <= screen->multiClickTime) { + CELL cell; + + PointToCELL(screen, event->xbutton.y, event->xbutton.x, &cell); + if (isSameCELL(&cell, &lastButton3)) { + /* A candidate for a double-click */ + lastButton3DoubleDownTime = event->xbutton.time; + PointToCELL(screen, event->xbutton.y, event->xbutton.x, &lastButton3); + return 1; + } + lastButton3UpTime = 0; /* Disable the info about the previous click */ + } + /* Either too long, or moved, disable. */ + lastButton3DoubleDownTime = 0; + return 0; +} + +static int +rowOnCurrentLine(TScreen *screen, + int line, + int *deltap) /* must be XButtonEvent */ +{ + int result = 1; + + *deltap = 0; + + if (line != screen->cur_row) { + int l1, l2; + + if (line < screen->cur_row) { + l1 = line; + l2 = screen->cur_row; + } else { + l2 = line; + l1 = screen->cur_row; + } + l1--; + while (++l1 < l2) { + LineData *ld = GET_LINEDATA(screen, l1); + if (!LineTstWrapped(ld)) { + result = 0; + break; + } + } + if (result) { + /* Everything is on one "wrapped line" now */ + *deltap = line - screen->cur_row; + } + } + return result; +} + +static int +eventRow(TScreen *screen, XEvent *event) /* must be XButtonEvent */ +{ + return (event->xbutton.y - screen->border) / FontHeight(screen); +} + +static int +eventColBetween(TScreen *screen, XEvent *event) /* must be XButtonEvent */ +{ + /* Correct by half a width - we are acting on a boundary, not on a cell. */ + return ((event->xbutton.x - OriginX(screen) + (FontWidth(screen) - 1) / 2) + / FontWidth(screen)); +} + +static int +ReadLineMovePoint(TScreen *screen, int col, int ldelta) +{ + Char line[6]; + unsigned count = 0; + + col += ldelta * MaxCols(screen) - screen->cur_col; + if (col == 0) + return 0; + if (screen->control_eight_bits) { + line[count++] = ANSI_CSI; + } else { + line[count++] = ANSI_ESC; + line[count++] = '['; /* XXX maybe sometimes O is better? */ + } + line[count] = CharOf(col > 0 ? 'C' : 'D'); + if (col < 0) + col = -col; + while (col--) + v_write(screen->respond, line, 3); + return 1; +} + +static int +ReadLineDelete(TScreen *screen, CELL *cell1, CELL *cell2) +{ + int del; + + del = (cell2->col - cell1->col) + ((cell2->row - cell1->row) * MaxCols(screen)); + if (del <= 0) /* Just in case... */ + return 0; + while (del--) + v_write(screen->respond, (const Char *) "\177", 1); + return 1; +} + +static void +readlineExtend(XtermWidget xw, XEvent *event) +{ + TScreen *screen = TScreenOf(xw); + int ldelta1, ldelta2; + + if (IsBtnEvent(event)) { + XButtonEvent *my_event = (XButtonEvent *) event; + if (isClick1_clean(xw, my_event) + && SCREEN_FLAG(screen, click1_moves) + && rowOnCurrentLine(screen, eventRow(screen, event), &ldelta1)) { + ReadLineMovePoint(screen, eventColBetween(screen, event), ldelta1); + } + if (isDoubleClick3(screen, my_event) + && SCREEN_FLAG(screen, dclick3_deletes) + && rowOnCurrentLine(screen, screen->startSel.row, &ldelta1) + && rowOnCurrentLine(screen, screen->endSel.row, &ldelta2)) { + ReadLineMovePoint(screen, screen->endSel.col, ldelta2); + ReadLineDelete(screen, &screen->startSel, &(screen->endSel)); + } + } +} +#endif /* OPT_READLINE */ + +/* ^XM-G */ +void +DiredButton(Widget w, + XEvent *event, /* must be XButtonEvent */ + String *params GCC_UNUSED, /* selections */ + Cardinal *num_params GCC_UNUSED) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TScreen *screen = TScreenOf(xw); + + if (IsBtnEvent(event) + && (event->xbutton.y >= screen->border) + && (event->xbutton.x >= OriginX(screen))) { + Char Line[6]; + unsigned line, col; + + line = (unsigned) ((event->xbutton.y - screen->border) + / FontHeight(screen)); + col = (unsigned) ((event->xbutton.x - OriginX(screen)) + / FontWidth(screen)); + Line[0] = CONTROL('X'); + Line[1] = ANSI_ESC; + Line[2] = 'G'; + Line[3] = CharOf(' ' + col); + Line[4] = CharOf(' ' + line); + v_write(screen->respond, Line, 5); + } + } +} + +#if OPT_READLINE +void +ReadLineButton(Widget w, + XEvent *event, /* must be XButtonEvent */ + String *params, /* selections */ + Cardinal *num_params) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TScreen *screen = TScreenOf(xw); + Char Line[6]; + int line, col, ldelta = 0; + + if (!IsBtnEvent(event) + || (okSendMousePos(xw) != MOUSE_OFF) || ExtendingSelection) + goto finish; + if (event->type == ButtonRelease) { + int delta; + + if (lastButtonDownTime == (Time) 0) { + /* first time and once in a blue moon */ + delta = screen->multiClickTime + 1; + } else if (event->xbutton.time > lastButtonDownTime) { + /* most of the time */ + delta = (int) (event->xbutton.time - lastButtonDownTime); + } else { + /* time has rolled over since lastButtonUpTime */ + delta = (int) ((((Time) ~ 0) - lastButtonDownTime) + event->xbutton.time); + } + if (delta > screen->multiClickTime) + goto finish; /* All this work for this... */ + } + line = (event->xbutton.y - screen->border) / FontHeight(screen); + if (!rowOnCurrentLine(screen, line, &ldelta)) + goto finish; + /* Correct by half a width - we are acting on a boundary, not on a cell. */ + col = (event->xbutton.x - OriginX(screen) + (FontWidth(screen) - 1) + / 2) + / FontWidth(screen) - screen->cur_col + ldelta * MaxCols(screen); + if (col == 0) + goto finish; + Line[0] = ANSI_ESC; + /* XXX: sometimes it is better to send '['? */ + Line[1] = 'O'; + Line[2] = CharOf(col > 0 ? 'C' : 'D'); + if (col < 0) + col = -col; + while (col--) + v_write(screen->respond, Line, 3); + finish: + if (event->type == ButtonRelease) + do_select_end(xw, event, params, num_params, False); + } +} +#endif /* OPT_READLINE */ + +/* repeats n or p */ +void +ViButton(Widget w, + XEvent *event, /* must be XButtonEvent */ + String *params GCC_UNUSED, /* selections */ + Cardinal *num_params GCC_UNUSED) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TScreen *screen = TScreenOf(xw); + int pty = screen->respond; + + if (IsBtnEvent(event)) { + int line; + + line = screen->cur_row - + ((event->xbutton.y - screen->border) / FontHeight(screen)); + + if (line != 0) { + Char Line[6]; + + Line[0] = ANSI_ESC; /* force an exit from insert-mode */ + v_write(pty, Line, 1); + + if (line < 0) { + line = -line; + Line[0] = CONTROL('n'); + } else { + Line[0] = CONTROL('p'); + } + while (--line >= 0) + v_write(pty, Line, 1); + } + } + } +} + +/* + * This function handles button-motion events + */ +/*ARGSUSED*/ +void +HandleSelectExtend(Widget w, + XEvent *event, /* must be XMotionEvent */ + String *params GCC_UNUSED, + Cardinal *num_params GCC_UNUSED) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TScreen *screen = TScreenOf(xw); + CELL cell; + + TRACE_EVENT("HandleSelectExtend", event, params, num_params); + + screen->selection_time = event->xmotion.time; + switch (screen->eventMode) { + /* If not in one of the DEC mouse-reporting modes */ + case LEFTEXTENSION: + case RIGHTEXTENSION: + PointToCELL(screen, event->xmotion.y, event->xmotion.x, &cell); + ExtendExtend(xw, &cell); + break; + + /* If in motion reporting mode, send mouse position to + character process as a key sequence \E[M... */ + case NORMAL: + /* will get here if send_mouse_pos != MOUSE_OFF */ + if (okSendMousePos(xw) == BTN_EVENT_MOUSE + || okSendMousePos(xw) == ANY_EVENT_MOUSE) { + (void) SendMousePosition(xw, event); + } + break; + } + } +} + +void +HandleKeyboardSelectExtend(Widget w, + XEvent *event GCC_UNUSED, /* must be XButtonEvent */ + String *params GCC_UNUSED, + Cardinal *num_params GCC_UNUSED) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TScreen *screen = TScreenOf(xw); + + TRACE_EVENT("HandleKeyboardSelectExtend", event, params, num_params); + ExtendExtend(xw, &screen->cursorp); + } +} + +static void +do_select_end(XtermWidget xw, + XEvent *event, /* must be XButtonEvent */ + String *params, /* selections */ + Cardinal *num_params, + Bool use_cursor_loc) +{ + TScreen *screen = TScreenOf(xw); + + screen->selection_time = event->xbutton.time; + + TRACE(("do_select_end %s @%ld\n", + visibleEventMode(screen->eventMode), + screen->selection_time)); + + switch (screen->eventMode) { + case NORMAL: + (void) SendMousePosition(xw, event); + break; + case LEFTEXTENSION: + case RIGHTEXTENSION: + EndExtend(xw, event, params, *num_params, use_cursor_loc); +#if OPT_READLINE + readlineExtend(xw, event); +#endif /* OPT_READLINE */ + break; + } +} + +void +HandleSelectEnd(Widget w, + XEvent *event, /* must be XButtonEvent */ + String *params, /* selections */ + Cardinal *num_params) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TRACE(("HandleSelectEnd\n")); + do_select_end(xw, event, params, num_params, False); + } +} + +void +HandleKeyboardSelectEnd(Widget w, + XEvent *event, /* must be XButtonEvent */ + String *params, /* selections */ + Cardinal *num_params) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TRACE(("HandleKeyboardSelectEnd\n")); + do_select_end(xw, event, params, num_params, True); + } +} + +/* + * Copy the selection data to the given target(s). + */ +void +HandleCopySelection(Widget w, + XEvent *event, + String *params, /* list of targets */ + Cardinal *num_params) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TRACE_EVENT("HandleCopySelection", event, params, num_params); + SelectSet(xw, event, params, *num_params); + } +} + +struct _SelectionList { + String *params; + Cardinal count; + Atom *targets; + Time time; +}; + +static unsigned +DECtoASCII(unsigned ch) +{ + if (xtermIsDecGraphic(ch)) { + ch = CharOf("###########+++++##-##++++|######"[ch]); + /* 01234567890123456789012345678901 */ + } + return ch; +} + +#if OPT_WIDE_CHARS +static Cardinal +addXtermChar(Char **buffer, Cardinal *used, Cardinal offset, unsigned value) +{ + if (offset + 1 >= *used) { + *used = 1 + (2 * (offset + 1)); + allocXtermChars(buffer, *used); + } + (*buffer)[offset++] = (Char) value; + return offset; +} +#define AddChar(buffer, used, offset, value) \ + offset = addXtermChar(buffer, used, offset, (unsigned) value) + +/* + * Convert a UTF-8 string to Latin-1, replacing non Latin-1 characters by `#', + * or ASCII/Latin-1 equivalents for special cases. + */ +static Char * +UTF8toLatin1(TScreen *screen, Char *s, unsigned long len, unsigned long *result) +{ + static Char *buffer; + static Cardinal used; + + Cardinal offset = 0; + + if (len != 0) { + PtyData data; + + fakePtyData(&data, s, s + len); + while (decodeUtf8(screen, &data)) { + Bool fails = False; + Bool extra = False; + IChar value; + skipPtyData(&data, value); + if (value == UCS_REPL) { + fails = True; + } else if (value < 256) { + AddChar(&buffer, &used, offset, CharOf(value)); + } else { + unsigned eqv = ucs2dec(screen, value); + if (xtermIsDecGraphic(eqv)) { + AddChar(&buffer, &used, offset, DECtoASCII(eqv)); + } else { + eqv = AsciiEquivs(value); + if (eqv == value) { + fails = True; + } else { + AddChar(&buffer, &used, offset, eqv); + } + if (isWide((wchar_t) value)) + extra = True; + } + } + + /* + * If we're not able to plug in a single-byte result, insert the + * defaultString (which normally is a single "#", but could be + * whatever the user wants). + */ + if (fails) { + const Char *p; + + for (p = (const Char *) screen->default_string; *p != '\0'; ++p) { + AddChar(&buffer, &used, offset, *p); + } + } + if (extra) + AddChar(&buffer, &used, offset, ' '); + } + AddChar(&buffer, &used, offset, '\0'); + *result = (unsigned long) (offset - 1); + } else { + *result = 0; + } + return buffer; +} + +int +xtermUtf8ToTextList(XtermWidget xw, + XTextProperty * text_prop, + char ***text_list, + int *text_list_count) +{ + TScreen *screen = TScreenOf(xw); + Display *dpy = screen->display; + int rc = -1; + + if (text_prop->format == 8 + && (rc = Xutf8TextPropertyToTextList(dpy, text_prop, + text_list, + text_list_count)) >= 0) { + if (*text_list != NULL && *text_list_count != 0) { + int i; + Char *data; + char **new_text_list, *tmp; + unsigned long size, new_size; + + TRACE(("xtermUtf8ToTextList size %d\n", *text_list_count)); + + /* + * XLib StringList actually uses only two pointers, one for the + * list itself, and one for the data. Pointer to the data is the + * first element of the list, the rest (if any) list elements point + * to the same memory block as the first element + */ + new_size = 0; + for (i = 0; i < *text_list_count; ++i) { + data = (Char *) (*text_list)[i]; + size = strlen((*text_list)[i]) + 1; + (void) UTF8toLatin1(screen, data, size, &size); + new_size += size + 1; + } + new_text_list = TypeXtMallocN(char *, *text_list_count); + new_text_list[0] = tmp = XtMalloc((Cardinal) new_size); + for (i = 0; i < (*text_list_count); ++i) { + data = (Char *) (*text_list)[i]; + size = strlen((*text_list)[i]) + 1; + if ((data = UTF8toLatin1(screen, data, size, &size)) != 0) { + memcpy(tmp, data, size + 1); + new_text_list[i] = tmp; + tmp += size + 1; + } + } + XFreeStringList((*text_list)); + *text_list = new_text_list; + } else { + rc = -1; + } + } + return rc; +} +#endif /* OPT_WIDE_CHARS */ + +static char * +parseItem(char *value, char *nextc) +{ + char *nextp = value; + while (*nextp != '\0' && *nextp != ',') { + *nextp = x_toupper(*nextp); + ++nextp; + } + *nextc = *nextp; + *nextp = '\0'; + + return nextp; +} + +/* + * All of the wanted strings are unique in the first character, so we can + * use simple abbreviations. + */ +static Bool +sameItem(const char *actual, const char *wanted) +{ + Bool result = False; + size_t have = strlen(actual); + size_t need = strlen(wanted); + + if (have != 0 && have <= need) { + if (!strncmp(actual, wanted, have)) { + TRACE(("...matched \"%s\"\n", wanted)); + result = True; + } + } + + return result; +} + +/* + * Handle the eightBitSelectTypes or utf8SelectTypes resource values. + */ +static Bool +overrideTargets(Widget w, String value, Atom **resultp) +{ + Bool override = False; + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TScreen *screen = TScreenOf(xw); + + if (!IsEmpty(value)) { + char *copied = x_strdup(value); + if (copied != 0) { + Atom *result = 0; + Cardinal count = 1; + int n; + + TRACE(("decoding SelectTypes \"%s\"\n", value)); + for (n = 0; copied[n] != '\0'; ++n) { + if (copied[n] == ',') + ++count; + } + result = TypeXtMallocN(Atom, (2 * count) + 1); + if (result == NULL) { + TRACE(("Couldn't allocate selection types\n")); + } else { + char nextc = '?'; + char *listp = (char *) copied; + count = 0; + do { + char *nextp = parseItem(listp, &nextc); + char *item = x_strtrim(listp); + size_t len = (item ? strlen(item) : 0); + + if (len == 0) { + /* EMPTY */ ; + } +#if OPT_WIDE_CHARS + else if (sameItem(item, "UTF8")) { + result[count++] = XA_UTF8_STRING(XtDisplay(w)); + } +#endif + else if (sameItem(item, "I18N")) { + if (screen->i18nSelections) { + result[count++] = XA_TEXT(XtDisplay(w)); + result[count++] = XA_COMPOUND_TEXT(XtDisplay(w)); + } + } else if (sameItem(item, "TEXT")) { + result[count++] = XA_TEXT(XtDisplay(w)); + } else if (sameItem(item, "COMPOUND_TEXT")) { + result[count++] = XA_COMPOUND_TEXT(XtDisplay(w)); + } else if (sameItem(item, "STRING")) { + result[count++] = XA_STRING; + } + *nextp++ = nextc; + listp = nextp; + free(item); + } while (nextc != '\0'); + if (count) { + result[count] = None; + override = True; + *resultp = result; + } else { + XtFree((char *) result); + } + } + free(copied); + } else { + TRACE(("Couldn't allocate copy of selection types\n")); + } + } + } + return override; +} + +#if OPT_WIDE_CHARS +static Atom * +allocUtf8Targets(Widget w, TScreen *screen) +{ + Atom **resultp = &(screen->selection_targets_utf8); + + if (*resultp == 0) { + Atom *result; + + if (!overrideTargets(w, screen->utf8_select_types, &result)) { + result = TypeXtMallocN(Atom, 5); + if (result == NULL) { + TRACE(("Couldn't allocate utf-8 selection targets\n")); + } else { + int n = 0; + + if (XSupportsLocale()) { + result[n++] = XA_UTF8_STRING(XtDisplay(w)); +#ifdef X_HAVE_UTF8_STRING + if (screen->i18nSelections) { + result[n++] = XA_TEXT(XtDisplay(w)); + result[n++] = XA_COMPOUND_TEXT(XtDisplay(w)); + } +#endif + } + result[n++] = XA_STRING; + result[n] = None; + } + } + + *resultp = result; + } + + return *resultp; +} +#endif + +static Atom * +alloc8bitTargets(Widget w, TScreen *screen) +{ + Atom **resultp = &(screen->selection_targets_8bit); + + if (*resultp == 0) { + Atom *result = 0; + + if (!overrideTargets(w, screen->eightbit_select_types, &result)) { + result = TypeXtMallocN(Atom, 5); + if (result == NULL) { + TRACE(("Couldn't allocate 8bit selection targets\n")); + } else { + int n = 0; + + if (XSupportsLocale()) { +#ifdef X_HAVE_UTF8_STRING + result[n++] = XA_UTF8_STRING(XtDisplay(w)); +#endif + if (screen->i18nSelections) { + result[n++] = XA_TEXT(XtDisplay(w)); + result[n++] = XA_COMPOUND_TEXT(XtDisplay(w)); + } + } + result[n++] = XA_STRING; + result[n] = None; + } + } + + *resultp = result; + } + + return *resultp; +} + +static Atom * +_SelectionTargets(Widget w) +{ + Atom *result; + XtermWidget xw; + + if ((xw = getXtermWidget(w)) == 0) { + result = NULL; + } else { + TScreen *screen = TScreenOf(xw); + +#if OPT_WIDE_CHARS + if (screen->wide_chars) { + result = allocUtf8Targets(w, screen); + } else +#endif + { + /* not screen->wide_chars */ + result = alloc8bitTargets(w, screen); + } + } + + return result; +} + +#define isSELECT(value) (!strcmp(value, "SELECT")) + +static int +DefaultSelection(TScreen *screen) +{ + return (screen->selectToClipboard ? 1 : 0); +} + +static int +TargetToSelection(TScreen *screen, String name) +{ + int result = -1; + int cutb; + + if (isSELECT(name)) { + result = DefaultSelection(screen); + } else if (!strcmp(name, PRIMARY_NAME)) { + result = PRIMARY_CODE; + } else if (!strcmp(name, CLIPBOARD_NAME)) { + result = CLIPBOARD_CODE; + } else if (!strcmp(name, SECONDARY_NAME)) { + result = SECONDARY_CODE; + } else if (sscanf(name, "CUT_BUFFER%d", &cutb) == 1) { + if (cutb >= 0 && cutb < MAX_CUT_BUFFER) { + result = CutBufferToCode(cutb); + } else { + xtermWarning("unexpected cut-buffer code: %d\n", cutb); + } + } else { + xtermWarning("unexpected selection target: %s\n", name); + } + TRACE2(("TargetToSelection(%s) ->%d\n", name, result)); + return result; +} + +static void +UnmapSelections(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Cardinal n; + + if (screen->mappedSelect) { + for (n = 0; screen->mappedSelect[n] != 0; ++n) + free((void *) screen->mappedSelect[n]); + free(screen->mappedSelect); + screen->mappedSelect = 0; + } +} + +/* + * xterm generally uses the primary selection. Some applications prefer + * (or are limited to) the clipboard. Since the translations resource is + * complicated, users seldom change the way it affects selection. But it + * is simple to remap the choice between primary and clipboard before the + * call to XmuInternStrings(). + */ +static String * +MapSelections(XtermWidget xw, String *params, Cardinal num_params) +{ + String *result = params; + + if (params != 0 && num_params > 0) { + Cardinal j; + Boolean map = False; + + for (j = 0; j < num_params; ++j) { + TRACE(("param[%d]:%s\n", j, params[j])); + if (isSELECT(params[j])) { + map = True; + break; + } + } + if (map) { + TScreen *screen = TScreenOf(xw); + const char *mapTo = (screen->selectToClipboard + ? CLIPBOARD_NAME + : PRIMARY_NAME); + + UnmapSelections(xw); + if ((result = TypeMallocN(String, num_params + 1)) != 0) { + result[num_params] = 0; + for (j = 0; j < num_params; ++j) { + result[j] = x_strdup((isSELECT(params[j]) + ? mapTo + : params[j])); + if (result[j] == 0) { + UnmapSelections(xw); + while (j != 0) { + free((void *) result[--j]); + } + free(result); + result = 0; + break; + } + } + screen->mappedSelect = result; + } + } + } + return result; +} + +/* + * Lookup the cut-buffer number, which will be in the range 0-7. + * If it is not a cut-buffer, it is a type of selection, e.g., primary. + */ +static int +CutBuffer(Atom code) +{ + int cutbuffer; + switch ((unsigned) code) { + case XA_CUT_BUFFER0: + cutbuffer = 0; + break; + case XA_CUT_BUFFER1: + cutbuffer = 1; + break; + case XA_CUT_BUFFER2: + cutbuffer = 2; + break; + case XA_CUT_BUFFER3: + cutbuffer = 3; + break; + case XA_CUT_BUFFER4: + cutbuffer = 4; + break; + case XA_CUT_BUFFER5: + cutbuffer = 5; + break; + case XA_CUT_BUFFER6: + cutbuffer = 6; + break; + case XA_CUT_BUFFER7: + cutbuffer = 7; + break; + default: + cutbuffer = -1; + break; + } + TRACE2(("CutBuffer(%d) = %d\n", (int) code, cutbuffer)); + return cutbuffer; +} + +#if OPT_PASTE64 +static void +FinishPaste64(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("FinishPaste64(%d)\n", screen->base64_paste)); + if (screen->base64_paste) { + screen->base64_paste = 0; + unparseputc1(xw, screen->base64_final); + unparse_end(xw); + } +} +#endif + +#if !OPT_PASTE64 +static +#endif +void +xtermGetSelection(Widget w, + Time ev_time, + String *params, /* selections in precedence order */ + Cardinal num_params, + Atom *targets) +{ + Atom selection; + int cutbuffer; + Atom target; + + XtermWidget xw; + + if (num_params == 0) + return; + if ((xw = getXtermWidget(w)) == 0) + return; + + TRACE(("xtermGetSelection num_params %d @%ld\n", num_params, ev_time)); + params = MapSelections(xw, params, num_params); + + XmuInternStrings(XtDisplay(w), params, (Cardinal) 1, &selection); + cutbuffer = CutBuffer(selection); + + TRACE(("Cutbuffer: %d, target: %s\n", cutbuffer, + (targets + ? visibleSelectionTarget(XtDisplay(w), targets[0]) + : "None"))); + + if (cutbuffer >= 0) { + int inbytes; + unsigned long nbytes; + int fmt8 = 8; + Atom type = XA_STRING; + char *line; + + /* 'line' is freed in SelectionReceived */ + line = XFetchBuffer(XtDisplay(w), &inbytes, cutbuffer); + nbytes = (unsigned long) inbytes; + + if (nbytes > 0) { + SelectionReceived(w, NULL, &selection, &type, (XtPointer) line, + &nbytes, &fmt8); + } else if (num_params > 1) { + xtermGetSelection(w, ev_time, params + 1, num_params - 1, NULL); + } +#if OPT_PASTE64 + else { + FinishPaste64(xw); + } +#endif + } else { + + if (targets == NULL || targets[0] == None) { + targets = _SelectionTargets(w); + } + + if (targets != 0) { + struct _SelectionList *list; + + target = targets[0]; + + if (targets[1] == None) { /* last target in list */ + params++; + num_params--; + targets = _SelectionTargets(w); + } else { + targets = &(targets[1]); + } + + if (num_params) { + /* 'list' is freed in SelectionReceived */ + list = TypeXtMalloc(struct _SelectionList); + if (list != 0) { + list->params = params; + list->count = num_params; + list->targets = targets; + list->time = ev_time; + } + } else { + list = NULL; + } + + XtGetSelectionValue(w, selection, + target, + SelectionReceived, + (XtPointer) list, ev_time); + } + } +} + +#if OPT_TRACE && OPT_WIDE_CHARS +static void +GettingSelection(Display *dpy, Atom type, Char *line, unsigned long len) +{ + Char *cp; + const char *name = TraceAtomName(dpy, type); + + TRACE(("Getting %s (type=%ld, length=%ld)\n", name, (long int) type, len)); + for (cp = line; cp < line + len; cp++) { + TRACE(("[%d:%lu]", (int) (cp + 1 - line), len)); + if (isprint(*cp)) { + TRACE(("%c\n", *cp)); + } else { + TRACE(("\\x%02x\n", *cp)); + } + } +} +#else +#define GettingSelection(dpy,type,line,len) /* nothing */ +#endif + +#ifdef VMS +# define tty_vwrite(pty,lag,l) tt_write(lag,l) +#else /* !( VMS ) */ +# define tty_vwrite(pty,lag,l) v_write(pty,lag,l) +#endif /* defined VMS */ + +#if OPT_PASTE64 +/* Return base64 code character given 6-bit number */ +static const char base64_code[] = "\ +ABCDEFGHIJKLMNOPQRSTUVWXYZ\ +abcdefghijklmnopqrstuvwxyz\ +0123456789+/"; +static void +base64_flush(TScreen *screen) +{ + Char x; + + TRACE(("base64_flush count %d, pad %d (%d)\n", + screen->base64_count, + screen->base64_pad, + screen->base64_pad & 3)); + + switch (screen->base64_count) { + case 0: + break; + case 2: + x = CharOf(base64_code[screen->base64_accu << 4]); + tty_vwrite(screen->respond, &x, 1); + break; + case 4: + x = CharOf(base64_code[screen->base64_accu << 2]); + tty_vwrite(screen->respond, &x, 1); + break; + } + if (screen->base64_pad & 3) { + tty_vwrite(screen->respond, + (const Char *) "===", + (unsigned) (3 - (screen->base64_pad & 3))); + } + screen->base64_count = 0; + screen->base64_accu = 0; + screen->base64_pad = 0; +} +#endif /* OPT_PASTE64 */ + +/* + * Translate ISO-8859-1 or UTF-8 data to NRCS. + */ +static void +ToNational(XtermWidget xw, Char *buffer, unsigned *length) +{ + TScreen *screen = TScreenOf(xw); + DECNRCM_codes gsetL = screen->gsets[screen->curgl]; + DECNRCM_codes gsetR = screen->gsets[screen->curgr]; + +#if OPT_WIDE_CHARS + if ((screen->utf8_nrc_mode | screen->utf8_mode) != uFalse) { + Char *p; + PtyData *data = TypeXtMallocX(PtyData, *length); + + memset(data, 0, sizeof(*data)); + data->next = data->buffer; + data->last = data->buffer + *length; + memcpy(data->buffer, buffer, (size_t) *length); + p = buffer; + while (data->next < data->last) { + unsigned chr, out, gl, gr; + + if (!decodeUtf8(screen, data)) { + data->utf_size = 1; + data->utf_data = data->next[0]; + } + data->next += data->utf_size; + chr = data->utf_data; + out = chr; + if ((gl = xtermCharSetIn(xw, chr, gsetL)) != chr) { + out = gl; + } else if ((gr = xtermCharSetIn(xw, chr, gsetR)) != chr) { + out = gr; + } + *p++ = (Char) ((out < 256) ? out : ' '); + } + *length = (unsigned) (p - buffer); + free(data); + } else +#endif + { + Char *p; + + for (p = buffer; (int) (p - buffer) < (int) *length; ++p) { + unsigned gl, gr; + unsigned chr = *p; + unsigned out = chr; + if ((gl = xtermCharSetIn(xw, chr, gsetL)) != chr) { + out = gl; + } else if ((gr = xtermCharSetIn(xw, chr, gsetR)) != chr) { + out = gr; + } + *p = (Char) out; + } + } +} + +static void +_qWriteSelectionData(XtermWidget xw, Char *lag, unsigned length) +{ + TScreen *screen = TScreenOf(xw); + + /* + * If we are pasting into a window which is using NRCS, we want to map + * the text from the normal encoding (ISO-8859-1 or UTF-8) into the coding + * that an application would use to write characters with NRCS. + * + * TODO: handle conversion from UTF-8, and adjust length. This can be done + * in the same buffer because the target is always 8-bit. + */ + if ((xw->flags & NATIONAL) && (length != 0)) { + ToNational(xw, lag, &length); + } +#if OPT_PASTE64 + if (screen->base64_paste) { + /* Send data as base64 */ + Char *p = lag; + Char buf[64]; + unsigned x = 0; + + TRACE(("convert to base64 %d:%s\n", length, visibleChars(p, length))); + + /* + * Handle the case where the selection is from _this_ xterm, which + * puts part of the reply in the buffer before the selection callback + * happens. + */ + if (screen->base64_paste && screen->unparse_len) { + unparse_end(xw); + } + while (length--) { + switch (screen->base64_count) { + case 0: + buf[x++] = CharOf(base64_code[*p >> 2]); + screen->base64_accu = (unsigned) (*p & 0x3); + screen->base64_count = 2; + ++p; + break; + case 2: + buf[x++] = CharOf(base64_code[(screen->base64_accu << 4) + + (*p >> 4)]); + screen->base64_accu = (unsigned) (*p & 0xF); + screen->base64_count = 4; + ++p; + break; + case 4: + buf[x++] = CharOf(base64_code[(screen->base64_accu << 2) + + (*p >> 6)]); + buf[x++] = CharOf(base64_code[*p & 0x3F]); + screen->base64_accu = 0; + screen->base64_count = 0; + ++p; + break; + } + if (x >= 63) { + /* Write 63 or 64 characters */ + screen->base64_pad += x; + TRACE(("writing base64 interim %s\n", visibleChars(buf, x))); + tty_vwrite(screen->respond, buf, x); + x = 0; + } + } + if (x != 0) { + screen->base64_pad += x; + TRACE(("writing base64 finish %s\n", visibleChars(buf, x))); + tty_vwrite(screen->respond, buf, x); + } + } else +#endif /* OPT_PASTE64 */ +#if OPT_READLINE + if (SCREEN_FLAG(screen, paste_quotes)) { + while (length--) { + tty_vwrite(screen->respond, (const Char *) "\026", 1); /* Control-V */ + tty_vwrite(screen->respond, lag++, 1); + } + } else +#endif + { + TRACE(("writing base64 padding %s\n", visibleChars(lag, length))); + tty_vwrite(screen->respond, lag, length); + } +} + +static void +_WriteSelectionData(XtermWidget xw, Char *line, size_t length) +{ + /* Write data to pty a line at a time. */ + /* Doing this one line at a time may no longer be necessary + because v_write has been re-written. */ + +#if OPT_PASTE64 + TScreen *screen = TScreenOf(xw); +#endif + Char *lag, *end; + + /* in the VMS version, if tt_pasting isn't set to True then qio + reads aren't blocked and an infinite loop is entered, where the + pasted text shows up as new input, goes in again, shows up + again, ad nauseum. */ +#ifdef VMS + tt_pasting = True; +#endif + + end = &line[length]; + lag = line; + +#if OPT_PASTE64 + if (screen->base64_paste) { + _qWriteSelectionData(xw, lag, (unsigned) (end - lag)); + base64_flush(screen); + } else +#endif + { + if (!SCREEN_FLAG(screen, paste_literal_nl)) { + Char *cp; + for (cp = line; cp != end; cp++) { + if (*cp == '\n') { + *cp = '\r'; + _qWriteSelectionData(xw, lag, (unsigned) (cp - lag + 1)); + lag = cp + 1; + } + } + } + + if (lag != end) { + _qWriteSelectionData(xw, lag, (unsigned) (end - lag)); + } + } +#ifdef VMS + tt_pasting = False; + tt_start_read(); /* reenable reads or a character may be lost */ +#endif +} + +#if OPT_PASTE64 || OPT_READLINE +static void +_WriteKey(TScreen *screen, const Char *in) +{ + Char line[16]; + unsigned count = 0; + size_t length = strlen((const char *) in); + + if (screen->control_eight_bits) { + line[count++] = ANSI_CSI; + } else { + line[count++] = ANSI_ESC; + line[count++] = '['; + } + while (length--) + line[count++] = *in++; + line[count++] = '~'; + tty_vwrite(screen->respond, line, count); +} +#endif /* OPT_READLINE */ + +/* + * Unless enabled by the user, strip control characters other than formatting. + */ +static size_t +removeControls(XtermWidget xw, char *value) +{ + TScreen *screen = TScreenOf(xw); + size_t dst = 0; + + if (screen->allowPasteControls) { + dst = strlen(value); + } else { + size_t src = 0; + while ((value[dst] = value[src]) != '\0') { + int ch = CharOf(value[src++]); + +#define ReplacePaste(n) \ + if (screen->disallow_paste_controls[n]) \ + value[dst] = ' ' + + if (ch < 32) { + ReplacePaste(epC0); + switch (ch) { + case ANSI_BS: + ReplacePaste(epBS); + break; + case ANSI_CR: + ReplacePaste(epCR); + break; + case ANSI_ESC: + ReplacePaste(epESC); + break; + case ANSI_FF: + ReplacePaste(epFF); + break; + case ANSI_HT: + ReplacePaste(epHT); + break; + case ANSI_LF: + ReplacePaste(epNL); + break; + default: + continue; + } + ++dst; + } else if (ch == ANSI_DEL) { + ReplacePaste(epDEL); + ++dst; + } +#if OPT_WIDE_CHARS + else if (screen->utf8_inparse || screen->utf8_nrc_mode) + ++dst; +#endif +#if OPT_C1_PRINT || OPT_WIDE_CHARS + else if (screen->c1_printable) + ++dst; +#endif + else if (ch >= 128 && ch < 160) + continue; + else + ++dst; + } + } + return dst; +} + +#if OPT_SELECTION_OPS +static void +beginInternalSelect(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + InternalSelect *mydata = &(screen->internal_select); + + (void) mydata; + /* override flags so that SelectionReceived only updates a buffer */ +#if OPT_PASTE64 + mydata->base64_paste = screen->base64_paste; + screen->base64_paste = 0; +#endif +#if OPT_PASTE64 || OPT_READLINE + mydata->paste_brackets = screen->paste_brackets; + SCREEN_FLAG_unset(screen, paste_brackets); +#endif +} + +static void +finishInternalSelect(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + InternalSelect *mydata = &(screen->internal_select); + + (void) mydata; +#if OPT_PASTE64 + screen->base64_paste = mydata->base64_paste; +#endif +#if OPT_PASTE64 || OPT_READLINE + screen->paste_brackets = mydata->paste_brackets; +#endif +} + +#else +#define finishInternalSelect(xw) /* nothing */ +#endif /* OPT_SELECTION_OPS */ + +/* SelectionReceived: stuff received selection text into pty */ + +/* ARGSUSED */ +static void +SelectionReceived(Widget w, + XtPointer client_data, + Atom *selection GCC_UNUSED, + Atom *type, + XtPointer value, + unsigned long *length, + int *format) +{ + char **text_list = NULL; + int text_list_count = 0; + XTextProperty text_prop; + TScreen *screen; + Display *dpy; +#if OPT_TRACE && OPT_WIDE_CHARS + Char *line = (Char *) value; +#endif + + XtermWidget xw; + + if ((xw = getXtermWidget(w)) == 0) + return; + + screen = TScreenOf(xw); + dpy = XtDisplay(w); + + if (*type == 0 /*XT_CONVERT_FAIL */ + || *length == 0 + || value == NULL) { + TRACE(("...no data to convert\n")); + goto fail; + } + + text_prop.value = (unsigned char *) value; + text_prop.encoding = *type; + text_prop.format = *format; + text_prop.nitems = *length; + + TRACE(("SelectionReceived %s %s format %d, nitems %ld\n", + TraceAtomName(screen->display, *selection), + visibleSelectionTarget(dpy, text_prop.encoding), + text_prop.format, + text_prop.nitems)); + +#if OPT_WIDE_CHARS + if (XSupportsLocale() && screen->wide_chars) { + if (*type == XA_UTF8_STRING(dpy) || + *type == XA_STRING || + *type == XA_COMPOUND_TEXT(dpy)) { + GettingSelection(dpy, *type, line, *length); + if (Xutf8TextPropertyToTextList(dpy, &text_prop, + &text_list, + &text_list_count) < 0) { + TRACE(("default Xutf8 Conversion failed\n")); + text_list = NULL; + } + } + } else +#endif /* OPT_WIDE_CHARS */ + { + /* Convert the selection to locale's multibyte encoding. */ + + if (*type == XA_UTF8_STRING(dpy) || + *type == XA_STRING || + *type == XA_COMPOUND_TEXT(dpy)) { + Status rc; + + GettingSelection(dpy, *type, line, *length); + +#if OPT_WIDE_CHARS + if (*type == XA_UTF8_STRING(dpy) && + !(screen->wide_chars || screen->c1_printable)) { + rc = xtermUtf8ToTextList(xw, &text_prop, + &text_list, &text_list_count); + } else +#endif + if (*type == XA_STRING && (!XSupportsLocale() || screen->brokenSelections)) { + rc = XTextPropertyToStringList(&text_prop, + &text_list, &text_list_count); + } else { + rc = XmbTextPropertyToTextList(dpy, &text_prop, + &text_list, + &text_list_count); + } + if (rc < 0) { + TRACE(("Conversion failed\n")); + text_list = NULL; + } + } + } + + if (text_list != NULL && text_list_count != 0) { + int i; + +#if OPT_PASTE64 + if (screen->base64_paste) { + /* EMPTY */ ; + } else +#endif +#if OPT_PASTE64 || OPT_READLINE + if (SCREEN_FLAG(screen, paste_brackets) && !screen->selectToBuffer) { + _WriteKey(screen, (const Char *) "200"); + } +#endif + for (i = 0; i < text_list_count; i++) { + size_t len = removeControls(xw, text_list[i]); + + if (screen->selectToBuffer) { + InternalSelect *mydata = &(screen->internal_select); + if (!mydata->done) { + size_t have = (mydata->buffer + ? strlen(mydata->buffer) + : 0); + size_t need = have + len + 1; + char *buffer = realloc(mydata->buffer, need); + + if (buffer != 0) { + strcpy(buffer + have, text_list[i]); + mydata->buffer = buffer; + } + TRACE(("FormatSelect %d.%d .. %d.%d %s\n", + screen->startSel.row, + screen->startSel.col, + screen->endSel.row, + screen->endSel.col, + mydata->buffer)); + mydata->format_select(w, mydata->format, mydata->buffer, + &(screen->startSel), + &(screen->endSel)); + mydata->done = True; + } + + } else { + _WriteSelectionData(xw, (Char *) text_list[i], len); + } + } +#if OPT_PASTE64 + if (screen->base64_paste) { + FinishPaste64(xw); + } else +#endif +#if OPT_PASTE64 || OPT_READLINE + if (SCREEN_FLAG(screen, paste_brackets) && !screen->selectToBuffer) { + _WriteKey(screen, (const Char *) "201"); + } +#endif + if (screen->selectToBuffer) { + InternalSelect *mydata = &(screen->internal_select); + finishInternalSelect(xw); + if (mydata->done) { + free(mydata->format); + free(mydata->buffer); + memset(mydata, 0, sizeof(*mydata)); + } + screen->selectToBuffer = False; + } + XFreeStringList(text_list); + } else { + TRACE(("...empty text-list\n")); + goto fail; + } + + XtFree((char *) client_data); + XtFree((char *) value); + + return; + + fail: + if (client_data != 0) { + struct _SelectionList *list = (struct _SelectionList *) client_data; + + TRACE(("SelectionReceived ->xtermGetSelection\n")); + xtermGetSelection(w, list->time, + list->params, list->count, list->targets); + XtFree((char *) client_data); +#if OPT_PASTE64 + } else { + FinishPaste64(xw); +#endif + } + return; +} + +void +HandleInsertSelection(Widget w, + XEvent *event, /* assumed to be XButtonEvent* */ + String *params, /* selections in precedence order */ + Cardinal *num_params) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TRACE_EVENT("HandleInsertSelection", event, params, num_params); + if (!SendMousePosition(xw, event)) { +#if OPT_READLINE + int ldelta; + TScreen *screen = TScreenOf(xw); + if (IsBtnEvent(event) + /* Disable on Shift-mouse, including the application-mouse modes */ + && !(KeyModifiers(event) & ShiftMask) + && (okSendMousePos(xw) == MOUSE_OFF) + && SCREEN_FLAG(screen, paste_moves) + && rowOnCurrentLine(screen, eventRow(screen, event), &ldelta)) + ReadLineMovePoint(screen, eventColBetween(screen, event), ldelta); +#endif /* OPT_READLINE */ + + xtermGetSelection(w, event->xbutton.time, params, *num_params, NULL); + } + } +} + +static SelectUnit +EvalSelectUnit(XtermWidget xw, + Time buttonDownTime, + SelectUnit defaultUnit, + unsigned int button) +{ + TScreen *screen = TScreenOf(xw); + SelectUnit result; + int delta; + + if (button != screen->lastButton) { + delta = screen->multiClickTime + 1; + } else if (screen->lastButtonUpTime == (Time) 0) { + /* first time and once in a blue moon */ + delta = screen->multiClickTime + 1; + } else if (buttonDownTime > screen->lastButtonUpTime) { + /* most of the time */ + delta = (int) (buttonDownTime - screen->lastButtonUpTime); + } else { + /* time has rolled over since lastButtonUpTime */ + delta = (int) ((((Time) ~ 0) - screen->lastButtonUpTime) + buttonDownTime); + } + + if (delta > screen->multiClickTime) { + screen->numberOfClicks = 1; + result = defaultUnit; + } else { + result = screen->selectMap[screen->numberOfClicks % screen->maxClicks]; + screen->numberOfClicks += 1; + } + TRACE(("EvalSelectUnit(%d) = %d\n", screen->numberOfClicks, result)); + return result; +} + +static void +do_select_start(XtermWidget xw, + XEvent *event, /* must be XButtonEvent* */ + CELL *cell) +{ + TScreen *screen = TScreenOf(xw); + + if (SendMousePosition(xw, event)) + return; + screen->selectUnit = EvalSelectUnit(xw, + event->xbutton.time, + Select_CHAR, + event->xbutton.button); + screen->replyToEmacs = False; + +#if OPT_READLINE + lastButtonDownTime = event->xbutton.time; +#endif + + StartSelect(xw, cell); +} + +/* ARGSUSED */ +void +HandleSelectStart(Widget w, + XEvent *event, /* must be XButtonEvent* */ + String *params GCC_UNUSED, + Cardinal *num_params GCC_UNUSED) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TScreen *screen = TScreenOf(xw); + CELL cell; + + TRACE_EVENT("HandleSelectStart", event, params, num_params); + screen->firstValidRow = 0; + screen->lastValidRow = screen->max_row; + PointToCELL(screen, event->xbutton.y, event->xbutton.x, &cell); + +#if OPT_READLINE + ExtendingSelection = 0; +#endif + + do_select_start(xw, event, &cell); + } +} + +/* ARGSUSED */ +void +HandleKeyboardSelectStart(Widget w, + XEvent *event, /* must be XButtonEvent* */ + String *params GCC_UNUSED, + Cardinal *num_params GCC_UNUSED) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TScreen *screen = TScreenOf(xw); + + TRACE_EVENT("HandleKeyboardSelectStart", event, params, num_params); + do_select_start(xw, event, &screen->cursorp); + } +} + +static void +TrackDown(XtermWidget xw, XButtonEvent *event) +{ + TScreen *screen = TScreenOf(xw); + CELL cell; + + screen->selectUnit = EvalSelectUnit(xw, + event->time, + Select_CHAR, + event->button); + if (screen->numberOfClicks > 1) { + PointToCELL(screen, event->y, event->x, &cell); + screen->replyToEmacs = True; + StartSelect(xw, &cell); + } else { + screen->waitingForTrackInfo = True; + EditorButton(xw, event); + } +} + +#define boundsCheck(x) if (x < 0) \ + x = 0; \ + else if (x >= screen->max_row) \ + x = screen->max_row + +void +TrackMouse(XtermWidget xw, + int func, + CELL *start, + int firstrow, + int lastrow) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->waitingForTrackInfo) { /* if Timed, ignore */ + screen->waitingForTrackInfo = False; + + if (func != 0) { + CELL first = *start; + + boundsCheck(first.row); + boundsCheck(firstrow); + boundsCheck(lastrow); + screen->firstValidRow = firstrow; + screen->lastValidRow = lastrow; + screen->replyToEmacs = True; + StartSelect(xw, &first); + } + } +} + +static void +StartSelect(XtermWidget xw, const CELL *cell) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("StartSelect row=%d, col=%d\n", cell->row, cell->col)); + if (screen->cursor_state) + HideCursor(); + if (screen->numberOfClicks == 1) { + /* set start of selection */ + screen->rawPos = *cell; + } + /* else use old values in rawPos */ + screen->saveStartR = screen->startExt = screen->rawPos; + screen->saveEndR = screen->endExt = screen->rawPos; + if (Coordinate(screen, cell) < Coordinate(screen, &(screen->rawPos))) { + screen->eventMode = LEFTEXTENSION; + screen->startExt = *cell; + } else { + screen->eventMode = RIGHTEXTENSION; + screen->endExt = *cell; + } + ComputeSelect(xw, &(screen->startExt), &(screen->endExt), False); +} + +static void +EndExtend(XtermWidget xw, + XEvent *event, /* must be XButtonEvent */ + String *params, /* selections */ + Cardinal num_params, + Bool use_cursor_loc) +{ + CELL cell; + TScreen *screen = TScreenOf(xw); + + TRACE_EVENT("EndExtend", event, params, &num_params); + if (use_cursor_loc) { + cell = screen->cursorp; + } else { + PointToCELL(screen, event->xbutton.y, event->xbutton.x, &cell); + } + ExtendExtend(xw, &cell); + + screen->lastButtonUpTime = event->xbutton.time; + screen->lastButton = event->xbutton.button; + + if (!isSameCELL(&(screen->startSel), &(screen->endSel))) { + if (screen->replyToEmacs) { + Char line[64]; + unsigned count = 0; + + if (screen->control_eight_bits) { + line[count++] = ANSI_CSI; + } else { + line[count++] = ANSI_ESC; + line[count++] = '['; + } + if (isSameCELL(&(screen->rawPos), &(screen->startSel)) + && isSameCELL(&cell, &(screen->endSel))) { + /* Use short-form emacs select */ + + switch (screen->extend_coords) { + case 0: + case SET_EXT_MODE_MOUSE: + line[count++] = 't'; + break; + case SET_SGR_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + line[count++] = '<'; + break; + } + + count = EmitMousePosition(screen, line, count, screen->endSel.col); + count = EmitMousePositionSeparator(screen, line, count); + count = EmitMousePosition(screen, line, count, screen->endSel.row); + + switch (screen->extend_coords) { + case SET_SGR_EXT_MODE_MOUSE: + case SET_URXVT_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + line[count++] = 't'; + break; + } + } else { + /* long-form, specify everything */ + + switch (screen->extend_coords) { + case 0: + case SET_EXT_MODE_MOUSE: + line[count++] = 'T'; + break; + case SET_SGR_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + line[count++] = '<'; + break; + } + + count = EmitMousePosition(screen, line, count, screen->startSel.col); + count = EmitMousePositionSeparator(screen, line, count); + count = EmitMousePosition(screen, line, count, screen->startSel.row); + count = EmitMousePositionSeparator(screen, line, count); + count = EmitMousePosition(screen, line, count, screen->endSel.col); + count = EmitMousePositionSeparator(screen, line, count); + count = EmitMousePosition(screen, line, count, screen->endSel.row); + count = EmitMousePositionSeparator(screen, line, count); + count = EmitMousePosition(screen, line, count, cell.col); + count = EmitMousePositionSeparator(screen, line, count); + count = EmitMousePosition(screen, line, count, cell.row); + + switch (screen->extend_coords) { + case SET_SGR_EXT_MODE_MOUSE: + case SET_URXVT_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + line[count++] = 'T'; + break; + } + } + v_write(screen->respond, line, count); + UnHiliteText(xw); + } + } + SelectSet(xw, event, params, num_params); + screen->eventMode = NORMAL; +} + +void +HandleSelectSet(Widget w, + XEvent *event, + String *params, + Cardinal *num_params) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TRACE_EVENT("HandleSelectSet", event, params, num_params); + SelectSet(xw, event, params, *num_params); + } +} + +/* ARGSUSED */ +static void +SelectSet(XtermWidget xw, + XEvent *event GCC_UNUSED, + String *params, + Cardinal num_params) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("SelectSet\n")); + /* Only do select stuff if non-null select */ + if (!isSameCELL(&(screen->startSel), &(screen->endSel))) { + Cardinal n; + for (n = 0; n < num_params; ++n) { + SaltTextAway(xw, + TargetToSelection(screen, params[n]), + &(screen->startSel), &(screen->endSel)); + } + _OwnSelection(xw, params, num_params); + } else { + ScrnDisownSelection(xw); + } +} + +#define Abs(x) ((x) < 0 ? -(x) : (x)) + +/* ARGSUSED */ +static void +do_start_extend(XtermWidget xw, + XEvent *event, /* must be XButtonEvent* */ + String *params GCC_UNUSED, + Cardinal *num_params GCC_UNUSED, + Bool use_cursor_loc) +{ + TScreen *screen = TScreenOf(xw); + int coord; + CELL cell; + + if (SendMousePosition(xw, event)) + return; + + screen->firstValidRow = 0; + screen->lastValidRow = screen->max_row; +#if OPT_READLINE + if ((KeyModifiers(event) & ShiftMask) + || event->xbutton.button != Button3 + || !(SCREEN_FLAG(screen, dclick3_deletes))) +#endif + screen->selectUnit = EvalSelectUnit(xw, + event->xbutton.time, + screen->selectUnit, + event->xbutton.button); + screen->replyToEmacs = False; + +#if OPT_READLINE + CheckSecondPress3(screen, event); +#endif + + if (screen->numberOfClicks == 1 + || (SCREEN_FLAG(screen, dclick3_deletes) /* Dclick special */ + &&!(KeyModifiers(event) & ShiftMask))) { + /* Save existing selection so we can reestablish it if the guy + extends past the other end of the selection */ + screen->saveStartR = screen->startExt = screen->startRaw; + screen->saveEndR = screen->endExt = screen->endRaw; + } else { + /* He just needed the selection mode changed, use old values. */ + screen->startExt = screen->startRaw = screen->saveStartR; + screen->endExt = screen->endRaw = screen->saveEndR; + } + if (use_cursor_loc) { + cell = screen->cursorp; + } else { + PointToCELL(screen, event->xbutton.y, event->xbutton.x, &cell); + } + coord = Coordinate(screen, &cell); + + if (Abs(coord - Coordinate(screen, &(screen->startSel))) + < Abs(coord - Coordinate(screen, &(screen->endSel))) + || coord < Coordinate(screen, &(screen->startSel))) { + /* point is close to left side of selection */ + screen->eventMode = LEFTEXTENSION; + screen->startExt = cell; + } else { + /* point is close to left side of selection */ + screen->eventMode = RIGHTEXTENSION; + screen->endExt = cell; + } + ComputeSelect(xw, &(screen->startExt), &(screen->endExt), True); + +#if OPT_READLINE + if (!isSameCELL(&(screen->startSel), &(screen->endSel))) + ExtendingSelection = 1; +#endif +} + +static void +ExtendExtend(XtermWidget xw, const CELL *cell) +{ + TScreen *screen = TScreenOf(xw); + int coord = Coordinate(screen, cell); + + TRACE(("ExtendExtend row=%d, col=%d\n", cell->row, cell->col)); + if (screen->eventMode == LEFTEXTENSION + && ((coord + (screen->selectUnit != Select_CHAR)) + > Coordinate(screen, &(screen->endSel)))) { + /* Whoops, he's changed his mind. Do RIGHTEXTENSION */ + screen->eventMode = RIGHTEXTENSION; + screen->startExt = screen->saveStartR; + } else if (screen->eventMode == RIGHTEXTENSION + && coord < Coordinate(screen, &(screen->startSel))) { + /* Whoops, he's changed his mind. Do LEFTEXTENSION */ + screen->eventMode = LEFTEXTENSION; + screen->endExt = screen->saveEndR; + } + if (screen->eventMode == LEFTEXTENSION) { + screen->startExt = *cell; + } else { + screen->endExt = *cell; + } + ComputeSelect(xw, &(screen->startExt), &(screen->endExt), False); + +#if OPT_READLINE + if (!isSameCELL(&(screen->startSel), &(screen->endSel))) + ExtendingSelection = 1; +#endif +} + +void +HandleStartExtend(Widget w, + XEvent *event, /* must be XButtonEvent* */ + String *params, /* unused */ + Cardinal *num_params) /* unused */ +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TRACE_EVENT("HandleStartExtend", event, params, num_params); + do_start_extend(xw, event, params, num_params, False); + } +} + +void +HandleKeyboardStartExtend(Widget w, + XEvent *event, /* must be XButtonEvent* */ + String *params, /* unused */ + Cardinal *num_params) /* unused */ +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TRACE_EVENT("HandleKeyboardStartExtend", event, params, num_params); + do_start_extend(xw, event, params, num_params, True); + } +} + +void +ScrollSelection(TScreen *screen, int amount, Bool always) +{ + int minrow = INX2ROW(screen, -screen->savedlines); + int maxrow = INX2ROW(screen, screen->max_row); + int maxcol = screen->max_col; + +#define scroll_update_one(cell) \ + (cell)->row += amount; \ + if ((cell)->row < minrow) { \ + (cell)->row = minrow; \ + (cell)->col = 0; \ + } \ + if ((cell)->row > maxrow) { \ + (cell)->row = maxrow; \ + (cell)->col = maxcol; \ + } + + scroll_update_one(&(screen->startRaw)); + scroll_update_one(&(screen->endRaw)); + scroll_update_one(&(screen->startSel)); + scroll_update_one(&(screen->endSel)); + + scroll_update_one(&(screen->rawPos)); + + /* + * If we are told to scroll the selection but it lies outside the scrolling + * margins, then that could cause the selection to move (bad). It is not + * simple to fix, because this function is called both for the scrollbar + * actions as well as application scrolling. The 'always' flag is set in + * the former case. The rest of the logic handles the latter. + */ + if (ScrnHaveSelection(screen)) { + int adjust; + + adjust = ROW2INX(screen, screen->startH.row); + if (always + || !ScrnHaveRowMargins(screen) + || ScrnIsRowInMargins(screen, adjust)) { + scroll_update_one(&screen->startH); + } + adjust = ROW2INX(screen, screen->endH.row); + if (always + || !ScrnHaveRowMargins(screen) + || ScrnIsRowInMargins(screen, adjust)) { + scroll_update_one(&screen->endH); + } + } + + screen->startHCoord = Coordinate(screen, &screen->startH); + screen->endHCoord = Coordinate(screen, &screen->endH); +} + +/*ARGSUSED*/ +void +ResizeSelection(TScreen *screen, int rows, int cols) +{ + rows--; /* decr to get 0-max */ + cols--; + + if (screen->startRaw.row > rows) + screen->startRaw.row = rows; + if (screen->startSel.row > rows) + screen->startSel.row = rows; + if (screen->endRaw.row > rows) + screen->endRaw.row = rows; + if (screen->endSel.row > rows) + screen->endSel.row = rows; + if (screen->rawPos.row > rows) + screen->rawPos.row = rows; + + if (screen->startRaw.col > cols) + screen->startRaw.col = cols; + if (screen->startSel.col > cols) + screen->startSel.col = cols; + if (screen->endRaw.col > cols) + screen->endRaw.col = cols; + if (screen->endSel.col > cols) + screen->endSel.col = cols; + if (screen->rawPos.col > cols) + screen->rawPos.col = cols; +} + +#if OPT_WIDE_CHARS +#define isWideCell(row, col) isWideFrg((int)XTERM_CELL(row, col)) +#endif + +static void +PointToCELL(TScreen *screen, + int y, + int x, + CELL *cell) +/* Convert pixel coordinates to character coordinates. + Rows are clipped between firstValidRow and lastValidRow. + Columns are clipped between to be 0 or greater, but are not clipped to some + maximum value. */ +{ + cell->row = (y - screen->border) / FontHeight(screen); + if (cell->row < screen->firstValidRow) + cell->row = screen->firstValidRow; + else if (cell->row > screen->lastValidRow) + cell->row = screen->lastValidRow; + cell->col = (x - OriginX(screen)) / FontWidth(screen); + if (cell->col < 0) + cell->col = 0; + else if (cell->col > MaxCols(screen)) { + cell->col = MaxCols(screen); + } +#if OPT_WIDE_CHARS + /* + * If we got a click on the right half of a doublewidth character, + * pretend it happened on the left half. + */ + if (cell->col > 0 + && isWideCell(cell->row, cell->col - 1) + && (XTERM_CELL(cell->row, cell->col) == HIDDEN_CHAR)) { + cell->col -= 1; + } +#endif +} + +/* + * Find the last column at which text was drawn on the given row. + */ +static int +LastTextCol(TScreen *screen, CLineData *ld, int row) +{ + int i = -1; + + if (ld != 0) { + if (okScrnRow(screen, row)) { + const IAttr *ch; + for (i = screen->max_col, + ch = ld->attribs + i; + i >= 0 && !(*ch & CHARDRAWN); + ch--, i--) { + ; + } +#if OPT_DEC_CHRSET + if (CSET_DOUBLE(GetLineDblCS(ld))) { + i *= 2; + } +#endif + } + } + return (i); +} + +#if !OPT_WIDE_CHARS +/* +** double click table for cut and paste in 8 bits +** +** This table is divided in four parts : +** +** - control characters [0,0x1f] U [0x80,0x9f] +** - separators [0x20,0x3f] U [0xa0,0xb9] +** - binding characters [0x40,0x7f] U [0xc0,0xff] +** - exceptions +*/ +/* *INDENT-OFF* */ +static int charClass[256] = +{ +/* NUL SOH STX ETX EOT ENQ ACK BEL */ + 32, 1, 1, 1, 1, 1, 1, 1, +/* BS HT NL VT FF CR SO SI */ + 1, 32, 1, 1, 1, 1, 1, 1, +/* DLE DC1 DC2 DC3 DC4 NAK SYN ETB */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* CAN EM SUB ESC FS GS RS US */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* SP ! " # $ % & ' */ + 32, 33, 34, 35, 36, 37, 38, 39, +/* ( ) * + , - . / */ + 40, 41, 42, 43, 44, 45, 46, 47, +/* 0 1 2 3 4 5 6 7 */ + 48, 48, 48, 48, 48, 48, 48, 48, +/* 8 9 : ; < = > ? */ + 48, 48, 58, 59, 60, 61, 62, 63, +/* @ A B C D E F G */ + 64, 48, 48, 48, 48, 48, 48, 48, +/* H I J K L M N O */ + 48, 48, 48, 48, 48, 48, 48, 48, +/* P Q R S T U V W */ + 48, 48, 48, 48, 48, 48, 48, 48, +/* X Y Z [ \ ] ^ _ */ + 48, 48, 48, 91, 92, 93, 94, 48, +/* ` a b c d e f g */ + 96, 48, 48, 48, 48, 48, 48, 48, +/* h i j k l m n o */ + 48, 48, 48, 48, 48, 48, 48, 48, +/* p q r s t u v w */ + 48, 48, 48, 48, 48, 48, 48, 48, +/* x y z { | } ~ DEL */ + 48, 48, 48, 123, 124, 125, 126, 1, +/* x80 x81 x82 x83 IND NEL SSA ESA */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* HTS HTJ VTS PLD PLU RI SS2 SS3 */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* DCS PU1 PU2 STS CCH MW SPA EPA */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* x98 x99 x9A CSI ST OSC PM APC */ + 1, 1, 1, 1, 1, 1, 1, 1, +/* - i c/ L ox Y- | So */ + 160, 161, 162, 163, 164, 165, 166, 167, +/* .. c0 ip << _ R0 - */ + 168, 169, 170, 171, 172, 173, 174, 175, +/* o +- 2 3 ' u q| . */ + 176, 177, 178, 179, 180, 181, 182, 183, +/* , 1 2 >> 1/4 1/2 3/4 ? */ + 184, 185, 186, 187, 188, 189, 190, 191, +/* A` A' A^ A~ A: Ao AE C, */ + 48, 48, 48, 48, 48, 48, 48, 48, +/* E` E' E^ E: I` I' I^ I: */ + 48, 48, 48, 48, 48, 48, 48, 48, +/* D- N~ O` O' O^ O~ O: X */ + 48, 48, 48, 48, 48, 48, 48, 215, +/* O/ U` U' U^ U: Y' P B */ + 48, 48, 48, 48, 48, 48, 48, 48, +/* a` a' a^ a~ a: ao ae c, */ + 48, 48, 48, 48, 48, 48, 48, 48, +/* e` e' e^ e: i` i' i^ i: */ + 48, 48, 48, 48, 48, 48, 48, 48, +/* d n~ o` o' o^ o~ o: -: */ + 48, 48, 48, 48, 48, 48, 48, 247, +/* o/ u` u' u^ u: y' P y: */ + 48, 48, 48, 48, 48, 48, 48, 48}; +/* *INDENT-ON* */ + +int +SetCharacterClassRange(int low, /* in range of [0..255] */ + int high, + int value) /* arbitrary */ +{ + + if (low < 0 || high > 255 || high < low) + return (-1); + + for (; low <= high; low++) + charClass[low] = value; + + return (0); +} +#endif + +static int +class_of(LineData *ld, CELL *cell) +{ + CELL temp = *cell; + int result = 0; + +#if OPT_DEC_CHRSET + if (CSET_DOUBLE(GetLineDblCS(ld))) { + temp.col /= 2; + } +#endif + if (temp.col < (int) ld->lineSize) + result = CharacterClass((int) (ld->charData[temp.col])); + return result; +} + +#if OPT_WIDE_CHARS +#define CClassSelects(name, cclass) \ + (CClassOf(name) == cclass \ + || XTERM_CELL(screen->name.row, screen->name.col) == HIDDEN_CHAR) +#else +#define CClassSelects(name, cclass) \ + (class_of(ld.name, &((screen->name))) == cclass) +#endif + +#define CClassOf(name) class_of(ld.name, &((screen->name))) + +#if OPT_REPORT_CCLASS +static int +show_cclass_range(int lo, int hi) +{ + int cclass = CharacterClass(lo); + int ident = (cclass == lo); + int more = 0; + if (ident) { + int ch; + for (ch = lo + 1; ch <= hi; ch++) { + if (CharacterClass(ch) != ch) { + ident = 0; + break; + } + } + if (ident && (hi < 255)) { + ch = hi + 1; + if (CharacterClass(ch) == ch) { + if (ch >= 255 || CharacterClass(ch + 1) != ch) { + more = 1; + } + } + } + } + if (!more) { + if (lo == hi) { + printf("\t%d", lo); + } else { + printf("\t%d-%d", lo, hi); + } + if (!ident) + printf(":%d", cclass); + if (hi < 255) + printf(", \\"); + printf("\n"); + } + return !more; +} + +void +report_char_class(XtermWidget xw) +{ + /* simple table, to match documentation */ + static const char charnames[] = + "NUL\0" "SOH\0" "STX\0" "ETX\0" "EOT\0" "ENQ\0" "ACK\0" "BEL\0" + " BS\0" " HT\0" " NL\0" " VT\0" " NP\0" " CR\0" " SO\0" " SI\0" + "DLE\0" "DC1\0" "DC2\0" "DC3\0" "DC4\0" "NAK\0" "SYN\0" "ETB\0" + "CAN\0" " EM\0" "SUB\0" "ESC\0" " FS\0" " GS\0" " RS\0" " US\0" + " SP\0" " !\0" " \"\0" " #\0" " $\0" " %\0" " &\0" " '\0" + " (\0" " )\0" " *\0" " +\0" " ,\0" " -\0" " .\0" " /\0" + " 0\0" " 1\0" " 2\0" " 3\0" " 4\0" " 5\0" " 6\0" " 7\0" + " 8\0" " 9\0" " :\0" " ;\0" " <\0" " =\0" " >\0" " ?\0" + " @\0" " A\0" " B\0" " C\0" " D\0" " E\0" " F\0" " G\0" + " H\0" " I\0" " J\0" " K\0" " L\0" " M\0" " N\0" " O\0" + " P\0" " Q\0" " R\0" " S\0" " T\0" " U\0" " V\0" " W\0" + " X\0" " Y\0" " Z\0" " [\0" " \\\0" " ]\0" " ^\0" " _\0" + " `\0" " a\0" " b\0" " c\0" " d\0" " e\0" " f\0" " g\0" + " h\0" " i\0" " j\0" " k\0" " l\0" " m\0" " n\0" " o\0" + " p\0" " q\0" " r\0" " s\0" " t\0" " u\0" " v\0" " w\0" + " x\0" " y\0" " z\0" " {\0" " |\0" " }\0" " ~\0" "DEL\0" + "x80\0" "x81\0" "x82\0" "x83\0" "IND\0" "NEL\0" "SSA\0" "ESA\0" + "HTS\0" "HTJ\0" "VTS\0" "PLD\0" "PLU\0" " RI\0" "SS2\0" "SS3\0" + "DCS\0" "PU1\0" "PU2\0" "STS\0" "CCH\0" " MW\0" "SPA\0" "EPA\0" + "x98\0" "x99\0" "x9A\0" "CSI\0" " ST\0" "OSC\0" " PM\0" "APC\0" + " -\0" " i\0" " c/\0" " L\0" " ox\0" " Y-\0" " |\0" " So\0" + " ..\0" " c0\0" " ip\0" " <<\0" " _\0" " \0" " R0\0" " -\0" + " o\0" " +-\0" " 2\0" " 3\0" " '\0" " u\0" " q|\0" " .\0" + " ,\0" " 1\0" " 2\0" " >>\0" "1/4\0" "1/2\0" "3/4\0" " ?\0" + " A`\0" " A'\0" " A^\0" " A~\0" " A:\0" " Ao\0" " AE\0" " C,\0" + " E`\0" " E'\0" " E^\0" " E:\0" " I`\0" " I'\0" " I^\0" " I:\0" + " D-\0" " N~\0" " O`\0" " O'\0" " O^\0" " O~\0" " O:\0" " X\0" + " O/\0" " U`\0" " U'\0" " U^\0" " U:\0" " Y'\0" " P\0" " B\0" + " a`\0" " a'\0" " a^\0" " a~\0" " a:\0" " ao\0" " ae\0" " c,\0" + " e`\0" " e'\0" " e^\0" " e:\0" " i`\0" " i'\0" " i^\0" " i:\0" + " d\0" " n~\0" " o`\0" " o'\0" " o^\0" " o~\0" " o:\0" " -:\0" + " o/\0" " u`\0" " u'\0" " u^\0" " u:\0" " y'\0" " P\0" " y:\0"; + int ch, dh; + int class_p; + + (void) xw; + + printf("static int charClass[256] = {\n"); + for (ch = 0; ch < 256; ++ch) { + const char *s = charnames + (ch * 4); + if ((ch & 7) == 0) + printf("/*"); + printf(" %s ", s); + if (((ch + 1) & 7) == 0) { + printf("*/\n "); + for (dh = ch - 7; dh <= ch; ++dh) { + printf(" %3d%s", CharacterClass(dh), dh == 255 ? "};" : ","); + } + printf("\n"); + } + } + + /* print the table as if it were the charClass resource */ + printf("\n"); + printf("The table is equivalent to this \"charClass\" resource:\n"); + class_p = CharacterClass(dh = 0); + for (ch = 0; ch < 256; ++ch) { + int class_c = CharacterClass(ch); + if (class_c != class_p) { + if (show_cclass_range(dh, ch - 1)) { + dh = ch; + class_p = class_c; + } + } + } + if (dh < 255) { + show_cclass_range(dh, 255); + } + + if_OPT_WIDE_CHARS(TScreenOf(xw), { + /* if this is a wide-character configuration, print all intervals */ + report_wide_char_class(); + }); +} +#endif + +/* + * If the given column is past the end of text on the given row, bump to the + * beginning of the next line. + */ +static Boolean +okPosition(TScreen *screen, + LineData **ld, + CELL *cell) +{ + Boolean result = True; + + if (cell->row > screen->max_row) { + result = False; + } else if (cell->col > (LastTextCol(screen, *ld, cell->row) + 1)) { + if (cell->row < screen->max_row) { + cell->col = 0; + *ld = GET_LINEDATA(screen, ++cell->row); + result = False; + } + } + return result; +} + +static void +trimLastLine(TScreen *screen, + LineData **ld, + CELL *last) +{ + if (screen->cutNewline && last->row < screen->max_row) { + last->col = 0; + *ld = GET_LINEDATA(screen, ++last->row); + } else { + last->col = LastTextCol(screen, *ld, last->row) + 1; + } +} + +#if OPT_SELECT_REGEX +/* + * Returns the first row of a wrapped line. + */ +static int +firstRowOfLine(TScreen *screen, int row, Bool visible) +{ + LineData *ld = 0; + int limit = visible ? 0 : -screen->savedlines; + + while (row > limit && + (ld = GET_LINEDATA(screen, row - 1)) != 0 && + LineTstWrapped(ld)) { + --row; + } + return row; +} + +/* + * Returns the last row of a wrapped line. + */ +static int +lastRowOfLine(TScreen *screen, int row) +{ + LineData *ld; + + while (row < screen->max_row && + (ld = GET_LINEDATA(screen, row)) != 0 && + LineTstWrapped(ld)) { + ++row; + } + return row; +} + +/* + * Returns the number of cells on the range of rows. + */ +static unsigned +lengthOfLines(TScreen *screen, int firstRow, int lastRow) +{ + unsigned length = 0; + int n; + + for (n = firstRow; n <= lastRow; ++n) { + LineData *ld = GET_LINEDATA(screen, n); + int value = LastTextCol(screen, ld, n); + if (value >= 0) + length += (unsigned) (value + 1); + } + return length; +} + +/* + * Make a copy of the wrapped-line which corresponds to the given row as a + * string of bytes. Construct an index for the columns from the beginning of + * the line. + */ +static char * +make_indexed_text(TScreen *screen, int row, unsigned length, int *indexed) +{ + Char *result = 0; + size_t need = (length + 1); + + /* + * Get a quick upper bound to the number of bytes needed, if the whole + * string were UTF-8. + */ + if_OPT_WIDE_CHARS(screen, { + need *= ((screen->lineExtra + 1) * 6); + }); + + if ((result = TypeCallocN(Char, need + 1)) != 0) { + LineData *ld = GET_LINEDATA(screen, row); + unsigned used = 0; + Char *last = result; + + do { + int col = 0; + int limit = LastTextCol(screen, ld, row); + + while (col <= limit) { + Char *next = last; + unsigned data = ld->charData[col]; + + assert(col < (int) ld->lineSize); + /* some internal points may not be drawn */ + if (data == 0) + data = ' '; + + if_WIDE_OR_NARROW(screen, { + next = convertToUTF8(last, data); + } + , { + *next++ = CharOf(data); + }); + + if_OPT_WIDE_CHARS(screen, { + size_t off; + for_each_combData(off, ld) { + data = ld->combData[off][col]; + if (data == 0) + break; + next = convertToUTF8(next, data); + } + }); + + indexed[used] = (int) (last - result); + *next = 0; + /* TRACE(("index[%d.%d] %d:%s\n", row, used, indexed[used], last)); */ + last = next; + ++used; + ++col; + indexed[used] = (int) (next - result); + } + } while (used < length && + LineTstWrapped(ld) && + (ld = GET_LINEDATA(screen, ++row)) != 0 && + row < screen->max_row); + } + /* TRACE(("result:%s\n", result)); */ + return (char *) result; +} + +/* + * Find the column given an offset into the character string by using the + * index constructed in make_indexed_text(). + */ +static int +indexToCol(int *indexed, int len, int off) +{ + int col = 0; + while (indexed[col] < len) { + if (indexed[col] >= off) + break; + ++col; + } + return col; +} + +/* + * Given a row number, and a column offset from that (which may be wrapped), + * set the cell to the actual row/column values. + */ +static void +columnToCell(TScreen *screen, int row, int col, CELL *cell) +{ + while (row < screen->max_row) { + CLineData *ld = GET_LINEDATA(screen, row); + int last = LastTextCol(screen, ld, row); + + /* TRACE(("last(%d) = %d, have %d\n", row, last, col)); */ + if (col <= last) { + break; + } + /* + * Stop if the current row does not wrap (does not continue the current + * line). + */ + if (!LineTstWrapped(ld)) { + col = last + 1; + break; + } + col -= (last + 1); + ++row; + } + if (col < 0) + col = 0; + cell->row = row; + cell->col = col; +} + +/* + * Given a cell, find the corresponding column offset. + */ +static int +cellToColumn(TScreen *screen, CELL *cell) +{ + CLineData *ld = 0; + int col = cell->col; + int row = firstRowOfLine(screen, cell->row, False); + while (row < cell->row) { + ld = GET_LINEDATA(screen, row); + col += LastTextCol(screen, ld, row++); + } +#if OPT_DEC_CHRSET + if (ld == 0) + ld = GET_LINEDATA(screen, row); + if (CSET_DOUBLE(GetLineDblCS(ld))) + col /= 2; +#endif + return col; +} + +static void +do_select_regex(TScreen *screen, CELL *startc, CELL *endc) +{ + LineData *ld = GET_LINEDATA(screen, startc->row); + int inx = ((screen->numberOfClicks - 1) % screen->maxClicks); + char *expr = screen->selectExpr[inx]; + regex_t preg; + regmatch_t match; + + TRACE(("Select_REGEX[%d]:%s\n", inx, NonNull(expr))); + if (okPosition(screen, &ld, startc) && expr != 0) { + if (regcomp(&preg, expr, REG_EXTENDED) == 0) { + int firstRow = firstRowOfLine(screen, startc->row, True); + int lastRow = lastRowOfLine(screen, firstRow); + unsigned size = lengthOfLines(screen, firstRow, lastRow); + int actual = cellToColumn(screen, startc); + int *indexed; + + TRACE(("regcomp ok rows %d..%d bytes %d\n", + firstRow, lastRow, size)); + + if ((indexed = TypeCallocN(int, size + 1)) != 0) { + char *search; + if ((search = make_indexed_text(screen, + firstRow, + size, + indexed)) != 0) { + int len = (int) strlen(search); + int col; + int best_col = -1; + int best_len = -1; + + startc->row = 0; + startc->col = 0; + endc->row = 0; + endc->col = 0; + + for (col = 0; indexed[col] < len; ++col) { + if (regexec(&preg, + search + indexed[col], + (size_t) 1, &match, 0) == 0) { + int start_inx = (int) (match.rm_so + indexed[col]); + int finis_inx = (int) (match.rm_eo + indexed[col]); + int start_col = indexToCol(indexed, len, start_inx); + int finis_col = indexToCol(indexed, len, finis_inx); + + if (start_col <= actual && + actual <= finis_col) { + int test = finis_col - start_col; + if (best_len < test) { + best_len = test; + best_col = start_col; + TRACE(("match column %d len %d\n", + best_col, + best_len)); + } + } + } + } + if (best_col >= 0) { + int best_nxt = best_col + best_len; + columnToCell(screen, firstRow, best_col, startc); + columnToCell(screen, firstRow, best_nxt, endc); + TRACE(("search::%s\n", search)); + TRACE(("indexed:%d..%d -> %d..%d\n", + best_col, best_nxt, + indexed[best_col], + indexed[best_nxt])); + TRACE(("matched:%d:%s\n", + indexed[best_nxt] + 1 - + indexed[best_col], + visibleChars((Char *) (search + indexed[best_col]), + (unsigned) (indexed[best_nxt] + + 1 - + indexed[best_col])))); + } + free(search); + } + free(indexed); +#if OPT_DEC_CHRSET + if ((ld = GET_LINEDATA(screen, startc->row)) != 0) { + if (CSET_DOUBLE(GetLineDblCS(ld))) + startc->col *= 2; + } + if ((ld = GET_LINEDATA(screen, endc->row)) != 0) { + if (CSET_DOUBLE(GetLineDblCS(ld))) + endc->col *= 2; + } +#endif + } + regfree(&preg); + } + } +} +#endif /* OPT_SELECT_REGEX */ + +#define InitRow(name) \ + ld.name = GET_LINEDATA(screen, screen->name.row) + +#define NextRow(name) \ + ld.name = GET_LINEDATA(screen, ++screen->name.row) + +#define PrevRow(name) \ + ld.name = GET_LINEDATA(screen, --screen->name.row) + +#define MoreRows(name) \ + (screen->name.row < screen->max_row) + +#define isPrevWrapped(name) \ + (screen->name.row > 0 \ + && (ltmp = GET_LINEDATA(screen, screen->name.row - 1)) != 0 \ + && LineTstWrapped(ltmp)) + +/* + * sets startSel endSel + * ensuring that they have legal values + */ +static void +ComputeSelect(XtermWidget xw, + CELL *startc, + CELL *endc, + Bool extend) +{ + TScreen *screen = TScreenOf(xw); + + int cclass; + CELL first = *startc; + CELL last = *endc; + Boolean ignored = False; + + struct { + LineData *startSel; + LineData *endSel; + } ld; + LineData *ltmp; + + TRACE(("ComputeSelect(startRow=%d, startCol=%d, endRow=%d, endCol=%d, %sextend)\n", + first.row, first.col, + last.row, last.col, + extend ? "" : "no")); + +#if OPT_WIDE_CHARS + if (first.col > 1 + && isWideCell(first.row, first.col - 1) + && XTERM_CELL(first.row, first.col - 0) == HIDDEN_CHAR) { + TRACE(("Adjusting start. Changing downwards from %i.\n", first.col)); + first.col -= 1; + if (last.col == (first.col + 1)) + last.col--; + } + + if (last.col > 1 + && isWideCell(last.row, last.col - 1) + && XTERM_CELL(last.row, last.col) == HIDDEN_CHAR) { + last.col += 1; + } +#endif + + if (Coordinate(screen, &first) <= Coordinate(screen, &last)) { + screen->startSel = screen->startRaw = first; + screen->endSel = screen->endRaw = last; + } else { /* Swap them */ + screen->startSel = screen->startRaw = last; + screen->endSel = screen->endRaw = first; + } + + InitRow(startSel); + InitRow(endSel); + + switch (screen->selectUnit) { + case Select_CHAR: + (void) okPosition(screen, &(ld.startSel), &(screen->startSel)); + (void) okPosition(screen, &(ld.endSel), &(screen->endSel)); + break; + + case Select_WORD: + TRACE(("Select_WORD\n")); + if (okPosition(screen, &(ld.startSel), &(screen->startSel))) { + cclass = CClassOf(startSel); + do { + --screen->startSel.col; + if (screen->startSel.col < 0 + && isPrevWrapped(startSel)) { + PrevRow(startSel); + screen->startSel.col = LastTextCol(screen, ld.startSel, screen->startSel.row); + } + } while (screen->startSel.col >= 0 + && CClassSelects(startSel, cclass)); + ++screen->startSel.col; + } +#if OPT_WIDE_CHARS + if (screen->startSel.col + && XTERM_CELL(screen->startSel.row, + screen->startSel.col) == HIDDEN_CHAR) + screen->startSel.col++; +#endif + + if (okPosition(screen, &(ld.endSel), &(screen->endSel))) { + int length = LastTextCol(screen, ld.endSel, screen->endSel.row); + cclass = CClassOf(endSel); + do { + ++screen->endSel.col; + if (screen->endSel.col > length + && LineTstWrapped(ld.endSel)) { + if (!MoreRows(endSel)) + break; + screen->endSel.col = 0; + NextRow(endSel); + length = LastTextCol(screen, ld.endSel, screen->endSel.row); + } + } while (screen->endSel.col <= length + && CClassSelects(endSel, cclass)); + /* Word-select selects if pointing to any char in "word", + * especially note that it includes the last character in a word. + * So we do no --endSel.col and do special eol handling. + */ + if (screen->endSel.col > length + 1 + && MoreRows(endSel)) { + screen->endSel.col = 0; + NextRow(endSel); + } + } +#if OPT_WIDE_CHARS + if (screen->endSel.col + && XTERM_CELL(screen->endSel.row, + screen->endSel.col) == HIDDEN_CHAR) + screen->endSel.col++; +#endif + + screen->saveStartW = screen->startSel; + break; + + case Select_LINE: + TRACE(("Select_LINE\n")); + while (LineTstWrapped(ld.endSel) + && MoreRows(endSel)) { + NextRow(endSel); + } + if (screen->cutToBeginningOfLine + || screen->startSel.row < screen->saveStartW.row) { + screen->startSel.col = 0; + while (isPrevWrapped(startSel)) { + PrevRow(startSel); + } + } else if (!extend) { + if ((first.row < screen->saveStartW.row) + || (isSameRow(&first, &(screen->saveStartW)) + && first.col < screen->saveStartW.col)) { + screen->startSel.col = 0; + while (isPrevWrapped(startSel)) { + PrevRow(startSel); + } + } else { + screen->startSel = screen->saveStartW; + } + } + trimLastLine(screen, &(ld.endSel), &(screen->endSel)); + break; + + case Select_GROUP: /* paragraph */ + TRACE(("Select_GROUP\n")); + if (okPosition(screen, &(ld.startSel), &(screen->startSel))) { + /* scan backward for beginning of group */ + while (screen->startSel.row > 0 && + (LastTextCol(screen, ld.startSel, screen->startSel.row - + 1) > 0 || + isPrevWrapped(startSel))) { + PrevRow(startSel); + } + screen->startSel.col = 0; + /* scan forward for end of group */ + while (MoreRows(endSel) && + (LastTextCol(screen, ld.endSel, screen->endSel.row + 1) > + 0 || + LineTstWrapped(ld.endSel))) { + NextRow(endSel); + } + trimLastLine(screen, &(ld.endSel), &(screen->endSel)); + } + break; + + case Select_PAGE: /* everything one can see */ + TRACE(("Select_PAGE\n")); + screen->startSel.row = 0; + screen->startSel.col = 0; + screen->endSel.row = MaxRows(screen); + screen->endSel.col = 0; + break; + + case Select_ALL: /* counts scrollback if in normal screen */ + TRACE(("Select_ALL\n")); + screen->startSel.row = -screen->savedlines; + screen->startSel.col = 0; + screen->endSel.row = MaxRows(screen); + screen->endSel.col = 0; + break; + +#if OPT_SELECT_REGEX + case Select_REGEX: + do_select_regex(screen, &(screen->startSel), &(screen->endSel)); + break; +#endif + + case NSELECTUNITS: /* always ignore */ + ignored = True; + break; + } + + if (!ignored) { + /* check boundaries */ + ScrollSelection(screen, 0, False); + TrackText(xw, &(screen->startSel), &(screen->endSel)); + } + + return; +} + +/* Guaranteed (first.row, first.col) <= (last.row, last.col) */ +static void +TrackText(XtermWidget xw, + const CELL *firstp, + const CELL *lastp) +{ + TScreen *screen = TScreenOf(xw); + int from, to; + CELL old_start, old_end; + CELL first = *firstp; + CELL last = *lastp; + + TRACE(("TrackText(first=%d,%d, last=%d,%d)\n", + first.row, first.col, last.row, last.col)); + + old_start = screen->startH; + old_end = screen->endH; + TRACE(("...previous(first=%d,%d, last=%d,%d)\n", + old_start.row, old_start.col, + old_end.row, old_end.col)); + if (isSameCELL(&first, &old_start) && + isSameCELL(&last, &old_end)) { + return; + } + + screen->startH = first; + screen->endH = last; + from = Coordinate(screen, &screen->startH); + to = Coordinate(screen, &screen->endH); + if (to <= screen->startHCoord || from > screen->endHCoord) { + /* No overlap whatsoever between old and new hilite */ + ReHiliteText(xw, &old_start, &old_end); + ReHiliteText(xw, &first, &last); + } else { + if (from < screen->startHCoord) { + /* Extend left end */ + ReHiliteText(xw, &first, &old_start); + } else if (from > screen->startHCoord) { + /* Shorten left end */ + ReHiliteText(xw, &old_start, &first); + } + if (to > screen->endHCoord) { + /* Extend right end */ + ReHiliteText(xw, &old_end, &last); + } else if (to < screen->endHCoord) { + /* Shorten right end */ + ReHiliteText(xw, &last, &old_end); + } + } + screen->startHCoord = from; + screen->endHCoord = to; +} + +static void +UnHiliteText(XtermWidget xw) +{ + TrackText(xw, &zeroCELL, &zeroCELL); +} + +/* Guaranteed that (first->row, first->col) <= (last->row, last->col) */ +static void +ReHiliteText(XtermWidget xw, + CELL *firstp, + CELL *lastp) +{ + TScreen *screen = TScreenOf(xw); + CELL first = *firstp; + CELL last = *lastp; + + TRACE(("ReHiliteText from %d.%d to %d.%d\n", + first.row, first.col, last.row, last.col)); + + if (first.row < 0) + first.row = first.col = 0; + else if (first.row > screen->max_row) + return; /* nothing to do, since last.row >= first.row */ + + if (last.row < 0) + return; /* nothing to do, since first.row <= last.row */ + else if (last.row > screen->max_row) { + last.row = screen->max_row; + last.col = MaxCols(screen); + } + if (isSameCELL(&first, &last)) + return; + + if (!isSameRow(&first, &last)) { /* do multiple rows */ + int i; + if ((i = screen->max_col - first.col + 1) > 0) { /* first row */ + ScrnRefresh(xw, first.row, first.col, 1, i, True); + } + if ((i = last.row - first.row - 1) > 0) { /* middle rows */ + ScrnRefresh(xw, first.row + 1, 0, i, MaxCols(screen), True); + } + if (last.col > 0 && last.row <= screen->max_row) { /* last row */ + ScrnRefresh(xw, last.row, 0, 1, last.col, True); + } + } else { /* do single row */ + ScrnRefresh(xw, first.row, first.col, 1, last.col - first.col, True); + } +} + +/* + * Guaranteed that (cellc->row, cellc->col) <= (cell->row, cell->col), + * and that both points are valid + * (may have cell->row = screen->max_row+1, cell->col = 0). + */ +static void +SaltTextAway(XtermWidget xw, + int which, + CELL *cellc, + CELL *cell) +{ + TScreen *screen = TScreenOf(xw); + SelectedCells *scp; + int i; + int eol; + int need = 0; + Char *line; + Char *lp; + CELL first = *cellc; + CELL last = *cell; + + if (which < 0 || which >= MAX_SELECTIONS) { + TRACE(("SaltTextAway - which selection?\n")); + return; + } + scp = &(screen->selected_cells[which]); + + TRACE(("SaltTextAway which=%d, first=%d,%d, last=%d,%d\n", + which, first.row, first.col, last.row, last.col)); + + if (isSameRow(&first, &last) && first.col > last.col) { + int tmp; + EXCHANGE(first.col, last.col, tmp); + } + + --last.col; + /* first we need to know how long the string is before we can save it */ + + if (isSameRow(&last, &first)) { + need = Length(screen, first.row, first.col, last.col); + } else { /* two cases, cut is on same line, cut spans multiple lines */ + need += Length(screen, first.row, first.col, screen->max_col) + 1; + for (i = first.row + 1; i < last.row; i++) + need += Length(screen, i, 0, screen->max_col) + 1; + if (last.col >= 0) + need += Length(screen, last.row, 0, last.col); + } + + /* UTF-8 may require more space */ + if_OPT_WIDE_CHARS(screen, { + need *= 4; + }); + + /* now get some memory to save it in */ + if (need < 0) + return; + + if (scp->data_limit <= (unsigned) need) { + if ((line = (Char *) malloc((size_t) need + 1)) == 0) + SysError(ERROR_BMALLOC2); + free(scp->data_buffer); + scp->data_buffer = line; + scp->data_limit = (size_t) (need + 1); + } else { + line = scp->data_buffer; + } + + if (line == 0) + return; + + line[need] = '\0'; /* make sure it is null terminated */ + lp = line; /* lp points to where to save the text */ + if (isSameRow(&last, &first)) { + lp = SaveText(screen, last.row, first.col, last.col, lp, &eol); + } else { + lp = SaveText(screen, first.row, first.col, screen->max_col, lp, &eol); + if (eol) + *lp++ = '\n'; /* put in newline at end of line */ + for (i = first.row + 1; i < last.row; i++) { + lp = SaveText(screen, i, 0, screen->max_col, lp, &eol); + if (eol) + *lp++ = '\n'; + } + if (last.col >= 0) + lp = SaveText(screen, last.row, 0, last.col, lp, &eol); + } + *lp = '\0'; /* make sure we have end marked */ + + TRACE(("Salted TEXT:%u:%s\n", (unsigned) (lp - line), + visibleChars(line, (unsigned) (lp - line)))); + + scp->data_length = (size_t) (lp - line); +} + +#if OPT_PASTE64 +void +ClearSelectionBuffer(TScreen *screen, String selection) +{ + int which = TargetToSelection(screen, selection); + SelectedCells *scp = &(screen->selected_cells[okSelectionCode(which)]); + free(scp->data_buffer); + scp->data_buffer = 0; + scp->data_limit = 0; + scp->data_length = 0; + screen->base64_count = 0; +} + +static void +AppendStrToSelectionBuffer(SelectedCells * scp, Char *text, size_t len) +{ + if (len != 0) { + size_t j = (scp->data_length + len); + size_t k = j + (j >> 2) + 80; + if (j + 1 >= scp->data_limit) { + Char *line; + if (!scp->data_length) { + line = (Char *) malloc(k); + } else { + line = (Char *) realloc(scp->data_buffer, k); + } + if (line == 0) + SysError(ERROR_BMALLOC2); + scp->data_buffer = line; + scp->data_limit = k; + } + if (scp->data_buffer != 0) { + memcpy(scp->data_buffer + scp->data_length, text, len); + scp->data_length += len; + scp->data_buffer[scp->data_length] = 0; + } + } +} + +void +AppendToSelectionBuffer(TScreen *screen, unsigned c, String selection) +{ + int which = TargetToSelection(screen, selection); + SelectedCells *scp = &(screen->selected_cells[okSelectionCode(which)]); + unsigned six; + Char ch; + + /* Decode base64 character */ + if (c >= 'A' && c <= 'Z') + six = c - 'A'; + else if (c >= 'a' && c <= 'z') + six = c - 'a' + 26; + else if (c >= '0' && c <= '9') + six = c - '0' + 52; + else if (c == '+') + six = 62; + else if (c == '/') + six = 63; + else + return; + + /* Accumulate bytes */ + switch (screen->base64_count) { + case 0: + screen->base64_accu = six; + screen->base64_count = 6; + break; + + case 2: + ch = CharOf((screen->base64_accu << 6) + six); + screen->base64_count = 0; + AppendStrToSelectionBuffer(scp, &ch, (size_t) 1); + break; + + case 4: + ch = CharOf((screen->base64_accu << 4) + (six >> 2)); + screen->base64_accu = (six & 0x3); + screen->base64_count = 2; + AppendStrToSelectionBuffer(scp, &ch, (size_t) 1); + break; + + case 6: + ch = CharOf((screen->base64_accu << 2) + (six >> 4)); + screen->base64_accu = (six & 0xF); + screen->base64_count = 4; + AppendStrToSelectionBuffer(scp, &ch, (size_t) 1); + break; + } +} + +void +CompleteSelection(XtermWidget xw, String *args, Cardinal len) +{ + TScreen *screen = TScreenOf(xw); + + screen->base64_count = 0; + screen->base64_accu = 0; + _OwnSelection(xw, args, len); +} +#endif /* OPT_PASTE64 */ + +static Bool +_ConvertSelectionHelper(Widget w, + SelectedCells * scp, + Atom *type, + XtPointer *value, + unsigned long *length, + int *format, + int (*conversion_function) (Display *, + char **, int, + XICCEncodingStyle, + XTextProperty *), + XICCEncodingStyle conversion_style) +{ + XtermWidget xw; + + *value = 0; + *length = 0; + *type = 0; + *format = 0; + + if ((xw = getXtermWidget(w)) != 0) { + Display *dpy = XtDisplay(w); + XTextProperty textprop; + int out_n = 0; + char *result = 0; + char *the_data = (char *) scp->data_buffer; + char *the_next; + unsigned long remaining = scp->data_length; + + TRACE(("converting %ld:'%s'\n", + (long) scp->data_length, + visibleChars(scp->data_buffer, (unsigned) scp->data_length))); + /* + * For most selections, we can convert in one pass. It is possible + * that some applications contain embedded nulls, e.g., using xterm's + * paste64 feature. For those cases, we will build up the result in + * parts. + */ + if (memchr(the_data, 0, scp->data_length) != 0) { + TRACE(("selection contains embedded nulls\n")); + result = calloc(scp->data_length + 1, sizeof(char)); + } + + next_try: + memset(&textprop, 0, sizeof(textprop)); + if (conversion_function(dpy, &the_data, 1, + conversion_style, + &textprop) >= Success) { + if ((result != 0) + && (textprop.value != 0) + && (textprop.format == 8)) { + char *text_values = (char *) textprop.value; + unsigned long in_n; + + if (out_n == 0) { + *value = result; + *type = textprop.encoding; + *format = textprop.format; + } + for (in_n = 0; in_n < textprop.nitems; ++in_n) { + result[out_n++] = text_values[in_n]; + } + *length += textprop.nitems; + if ((the_next = memchr(the_data, 0, remaining)) != 0) { + unsigned long this_was = (unsigned long) (the_next - the_data); + this_was++; + the_data += this_was; + remaining -= this_was; + result[out_n++] = 0; + *length += 1; + if (remaining) + goto next_try; + } + return True; + } else { + free(result); + *value = (XtPointer) textprop.value; + *length = textprop.nitems; + *type = textprop.encoding; + *format = textprop.format; + return True; + } + } + free(result); + } + return False; +} + +static Boolean +SaveConvertedLength(XtPointer *target, unsigned long source) +{ + Boolean result = False; + + *target = XtMalloc(4); + if (*target != 0) { + result = True; + if (sizeof(unsigned long) == 4) { + *(unsigned long *) *target = source; + } else if (sizeof(unsigned) == 4) { + *(unsigned *) *target = (unsigned) source; + } else if (sizeof(unsigned short) == 4) { + *(unsigned short *) *target = (unsigned short) source; + } else { + /* FIXME - does this depend on byte-order? */ + unsigned long temp = source; + memcpy((char *) *target, + ((char *) &temp) + sizeof(temp) - 4, + (size_t) 4); + } + } + return result; +} + +#define keepClipboard(d,atom) ((screen->keepClipboard) && \ + (atom == XA_CLIPBOARD(d))) + +static Boolean +ConvertSelection(Widget w, + Atom *selection, + Atom *target, + Atom *type, + XtPointer *value, + unsigned long *length, + int *format) +{ + Display *dpy = XtDisplay(w); + TScreen *screen; + SelectedCells *scp; + Bool result = False; + + Char *data; + unsigned long data_length; + + XtermWidget xw; + + if ((xw = getXtermWidget(w)) == 0) + return False; + + screen = TScreenOf(xw); + + TRACE(("ConvertSelection %s -> %s\n", + TraceAtomName(screen->display, *selection), + visibleSelectionTarget(dpy, *target))); + + if (keepClipboard(dpy, *selection)) { + TRACE(("asked for clipboard\n")); + scp = &(screen->clipboard_data); + } else { + TRACE(("asked for selection\n")); + scp = &(screen->selected_cells[AtomToSelection(dpy, *selection)]); + } + + data = scp->data_buffer; + data_length = scp->data_length; + if (data == NULL) { + TRACE(("...no selection-data\n")); + return False; + } + + if (*target == XA_TARGETS(dpy)) { + Atom *targetP; + XPointer std_return = 0; + unsigned long std_length; + + if (XmuConvertStandardSelection(w, screen->selection_time, selection, + target, type, &std_return, + &std_length, format)) { + Atom *my_targets = _SelectionTargets(w); + Atom *allocP; + Atom *std_targets; + + TRACE(("XmuConvertStandardSelection - success\n")); + std_targets = (Atom *) (void *) (std_return); + *length = std_length + 6; + + targetP = TypeXtMallocN(Atom, *length); + allocP = targetP; + + *value = (XtPointer) targetP; + + if (my_targets != 0) { + while (*my_targets != None) { + *targetP++ = *my_targets++; + } + } + *targetP++ = XA_LENGTH(dpy); + *targetP++ = XA_LIST_LENGTH(dpy); + + *length = std_length + (unsigned long) (targetP - allocP); + + memcpy(targetP, std_targets, sizeof(Atom) * std_length); + XtFree((char *) std_targets); + *type = XA_ATOM; + *format = 32; + result = True; + } else { + TRACE(("XmuConvertStandardSelection - failed\n")); + } + } +#if OPT_WIDE_CHARS + else if (screen->wide_chars && *target == XA_STRING) { + result = + _ConvertSelectionHelper(w, scp, + type, value, length, format, + Xutf8TextListToTextProperty, + XStringStyle); + TRACE(("...Xutf8TextListToTextProperty:%d\n", result)); + } else if (screen->wide_chars && *target == XA_UTF8_STRING(dpy)) { + result = + _ConvertSelectionHelper(w, scp, + type, value, length, format, + Xutf8TextListToTextProperty, + XUTF8StringStyle); + TRACE(("...Xutf8TextListToTextProperty:%d\n", result)); + } else if (screen->wide_chars && *target == XA_TEXT(dpy)) { + result = + _ConvertSelectionHelper(w, scp, + type, value, length, format, + Xutf8TextListToTextProperty, + XStdICCTextStyle); + TRACE(("...Xutf8TextListToTextProperty:%d\n", result)); + } else if (screen->wide_chars && *target == XA_COMPOUND_TEXT(dpy)) { + result = + _ConvertSelectionHelper(w, scp, + type, value, length, format, + Xutf8TextListToTextProperty, + XCompoundTextStyle); + TRACE(("...Xutf8TextListToTextProperty:%d\n", result)); + } +#endif + + else if (*target == XA_STRING) { /* not wide_chars */ + /* We can only reach this point if the selection requestor + requested STRING before any of TEXT, COMPOUND_TEXT or + UTF8_STRING. We therefore assume that the requestor is not + properly internationalised, and dump raw eight-bit data + with no conversion into the selection. Yes, this breaks + the ICCCM in non-Latin-1 locales. */ + *type = XA_STRING; + *value = (XtPointer) data; + *length = data_length; + *format = 8; + result = True; + TRACE(("...raw 8-bit data:%d\n", result)); + } else if (*target == XA_TEXT(dpy)) { /* not wide_chars */ + result = + _ConvertSelectionHelper(w, scp, + type, value, length, format, + XmbTextListToTextProperty, + XStdICCTextStyle); + TRACE(("...XmbTextListToTextProperty(StdICC):%d\n", result)); + } else if (*target == XA_COMPOUND_TEXT(dpy)) { /* not wide_chars */ + result = + _ConvertSelectionHelper(w, scp, + type, value, length, format, + XmbTextListToTextProperty, + XCompoundTextStyle); + TRACE(("...XmbTextListToTextProperty(Compound):%d\n", result)); + } +#ifdef X_HAVE_UTF8_STRING + else if (*target == XA_UTF8_STRING(dpy)) { /* not wide_chars */ + result = + _ConvertSelectionHelper(w, scp, + type, value, length, format, + XmbTextListToTextProperty, + XUTF8StringStyle); + TRACE(("...XmbTextListToTextProperty(UTF8):%d\n", result)); + } +#endif + else if (*target == XA_LIST_LENGTH(dpy)) { + result = SaveConvertedLength(value, (unsigned long) 1); + *type = XA_INTEGER; + *length = 1; + *format = 32; + TRACE(("...list of values:%d\n", result)); + } else if (*target == XA_LENGTH(dpy)) { + /* This value is wrong if we have UTF-8 text */ + result = SaveConvertedLength(value, scp->data_length); + *type = XA_INTEGER; + *length = 1; + *format = 32; + TRACE(("...list of values:%d\n", result)); + } else if (XmuConvertStandardSelection(w, + screen->selection_time, selection, + target, type, (XPointer *) value, + length, format)) { + result = True; + TRACE(("...XmuConvertStandardSelection:%d\n", result)); + } + + /* else */ + return (Boolean) result; +} + +static void +LoseSelection(Widget w, Atom *selection) +{ + TScreen *screen; + Atom *atomP; + Cardinal i; + + XtermWidget xw; + + if ((xw = getXtermWidget(w)) == 0) + return; + + screen = TScreenOf(xw); + TRACE(("LoseSelection %s\n", TraceAtomName(screen->display, *selection))); + + for (i = 0, atomP = screen->selection_atoms; + i < screen->selection_count; i++, atomP++) { + if (*selection == *atomP) + *atomP = (Atom) 0; + if (CutBuffer(*atomP) >= 0) { + *atomP = (Atom) 0; + } + } + + for (i = screen->selection_count; i; i--) { + if (screen->selection_atoms[i - 1] != 0) + break; + } + screen->selection_count = i; + + for (i = 0, atomP = screen->selection_atoms; + i < screen->selection_count; i++, atomP++) { + if (*atomP == (Atom) 0) { + *atomP = screen->selection_atoms[--screen->selection_count]; + } + } + + if (screen->selection_count == 0) + UnHiliteText(xw); +} + +/* ARGSUSED */ +static void +SelectionDone(Widget w GCC_UNUSED, + Atom *selection GCC_UNUSED, + Atom *target GCC_UNUSED) +{ + /* empty proc so Intrinsics know we want to keep storage */ + TRACE(("SelectionDone\n")); +} + +static void +_OwnSelection(XtermWidget xw, + String *selections, + Cardinal count) +{ + TScreen *screen = TScreenOf(xw); + Display *dpy = screen->display; + Atom *atoms = screen->selection_atoms; + Cardinal i; + Bool have_selection = False; + SelectedCells *scp; + + if (count == 0) + return; + + TRACE(("_OwnSelection count %d\n", count)); + selections = MapSelections(xw, selections, count); + + if (count > screen->sel_atoms_size) { + XtFree((char *) atoms); + atoms = TypeXtMallocN(Atom, count); + screen->selection_atoms = atoms; + screen->sel_atoms_size = count; + } + XmuInternStrings(dpy, selections, count, atoms); + for (i = 0; i < count; i++) { + int cutbuffer = CutBuffer(atoms[i]); + if (cutbuffer >= 0) { + unsigned long limit = + (unsigned long) (4 * XMaxRequestSize(dpy) - 32); + scp = &(screen->selected_cells[CutBufferToCode(cutbuffer)]); + if (scp->data_length > limit) { + TRACE(("selection too big (%lu bytes), not storing in CUT_BUFFER%d\n", + scp->data_length, cutbuffer)); + xtermWarning("selection too big (%lu bytes), not storing in CUT_BUFFER%d\n", + (unsigned long) scp->data_length, cutbuffer); + } else { + /* This used to just use the UTF-8 data, which was totally + * broken as not even the corresponding paste code in xterm + * understood this! So now it converts to Latin1 first. + * Robert Brady, 2000-09-05 + */ + unsigned long length = scp->data_length; + Char *data = scp->data_buffer; + if_OPT_WIDE_CHARS((screen), { + data = UTF8toLatin1(screen, data, length, &length); + }); + TRACE(("XStoreBuffer(%d)\n", cutbuffer)); + XStoreBuffer(dpy, + (char *) data, + (int) length, + cutbuffer); + } + } else { + int which = AtomToSelection(dpy, atoms[i]); + if (keepClipboard(dpy, atoms[i])) { + Char *buf; + SelectedCells *tcp = &(screen->clipboard_data); + TRACE(("saving selection to clipboard buffer\n")); + scp = &(screen->selected_cells[CLIPBOARD_CODE]); + if ((buf = (Char *) malloc((size_t) scp->data_length)) == 0) + SysError(ERROR_BMALLOC2); + + free(tcp->data_buffer); + memcpy(buf, scp->data_buffer, scp->data_length); + tcp->data_buffer = buf; + tcp->data_limit = scp->data_length; + tcp->data_length = scp->data_length; + } + scp = &(screen->selected_cells[which]); + if (scp->data_length == 0) { + TRACE(("XtDisownSelection(%s, @%ld)\n", + TraceAtomName(screen->display, atoms[i]), + (long) screen->selection_time)); + XtDisownSelection((Widget) xw, + atoms[i], + screen->selection_time); + } else if (!screen->replyToEmacs && atoms[i] != 0) { + TRACE(("XtOwnSelection(%s, @%ld)\n", + TraceAtomName(screen->display, atoms[i]), + (long) screen->selection_time)); + have_selection |= + XtOwnSelection((Widget) xw, atoms[i], + screen->selection_time, + ConvertSelection, + LoseSelection, + SelectionDone); + } + } + TRACE(("... _OwnSelection used length %ld value %s\n", + scp->data_length, + visibleChars(scp->data_buffer, + (unsigned) scp->data_length))); + } + if (!screen->replyToEmacs) + screen->selection_count = count; + if (!have_selection) + UnHiliteText(xw); +} + +static void +ResetSelectionState(TScreen *screen) +{ + screen->selection_count = 0; + screen->startH = zeroCELL; + screen->endH = zeroCELL; +} + +void +DisownSelection(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Atom *atoms = screen->selection_atoms; + Cardinal count = screen->selection_count; + Cardinal i; + + TRACE(("DisownSelection count %d, start %d.%d, end %d.%d\n", + count, + screen->startH.row, + screen->startH.col, + screen->endH.row, + screen->endH.col)); + + for (i = 0; i < count; i++) { + int cutbuffer = CutBuffer(atoms[i]); + if (cutbuffer < 0) { + XtDisownSelection((Widget) xw, atoms[i], + screen->selection_time); + } + } + /* + * If none of the callbacks via XtDisownSelection() reset highlighting + * do it now. + */ + if (ScrnHaveSelection(screen)) { + /* save data which will be reset */ + CELL first = screen->startH; + CELL last = screen->endH; + + ResetSelectionState(screen); + ReHiliteText(xw, &first, &last); + } else { + ResetSelectionState(screen); + } +} + +void +UnhiliteSelection(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (ScrnHaveSelection(screen)) { + CELL first = screen->startH; + CELL last = screen->endH; + + screen->startH = zeroCELL; + screen->endH = zeroCELL; + ReHiliteText(xw, &first, &last); + } +} + +/* returns number of chars in line from scol to ecol out */ +/* ARGSUSED */ +static int +Length(TScreen *screen, + int row, + int scol, + int ecol) +{ + CLineData *ld = GET_LINEDATA(screen, row); + const int lastcol = LastTextCol(screen, ld, row); + + if (ecol > lastcol) + ecol = lastcol; + return (ecol - scol + 1); +} + +/* copies text into line, preallocated */ +static Char * +SaveText(TScreen *screen, + int row, + int scol, + int ecol, + Char *lp, /* pointer to where to put the text */ + int *eol) +{ + LineData *ld; + int i = 0; + Char *result = lp; +#if OPT_WIDE_CHARS + unsigned previous = 0; +#endif + + ld = GET_LINEDATA(screen, row); + i = Length(screen, row, scol, ecol); + ecol = scol + i; +#if OPT_DEC_CHRSET + if (CSET_DOUBLE(GetLineDblCS(ld))) { + scol = (scol + 0) / 2; + ecol = (ecol + 1) / 2; + } +#endif + *eol = !LineTstWrapped(ld); + for (i = scol; i < ecol; i++) { + unsigned c; + assert(i < (int) ld->lineSize); + c = E2A(ld->charData[i]); +#if OPT_WIDE_CHARS + /* We want to strip out every occurrence of HIDDEN_CHAR AFTER a + * wide character. + */ + if (c == HIDDEN_CHAR) { + if (isWide((int) previous)) { + previous = c; + /* Combining characters attached to double-width characters + are in memory attached to the HIDDEN_CHAR */ + if_OPT_WIDE_CHARS(screen, { + if ((screen->utf8_nrc_mode | screen->utf8_mode) != uFalse) { + size_t off; + for_each_combData(off, ld) { + unsigned ch = ld->combData[off][i]; + if (ch == 0) + break; + lp = convertToUTF8(lp, ch); + } + } + }); + continue; + } else { + c = ' '; /* should not happen, but just in case... */ + } + } + previous = c; + if ((screen->utf8_nrc_mode | screen->utf8_mode) != uFalse) { + lp = convertToUTF8(lp, (c != 0) ? c : ' '); + if_OPT_WIDE_CHARS(screen, { + size_t off; + for_each_combData(off, ld) { + unsigned ch = ld->combData[off][i]; + if (ch == 0) + break; + lp = convertToUTF8(lp, ch); + } + }); + } else +#endif + { + if (c == 0) { + c = E2A(' '); + } else if (c < E2A(' ')) { + c = DECtoASCII(c); + } else if (c == 0x7f) { + c = 0x5f; + } + *lp++ = CharOf(A2E(c)); + } + if (c != E2A(' ')) + result = lp; + } + + /* + * If requested, trim trailing blanks from selected lines. Do not do this + * if the line is wrapped. + */ + if (!*eol || !screen->trim_selection) + result = lp; + + return (result); +} + +/* 32 + following 8-bit word: + + 1:0 Button no: 0, 1, 2. 3=release. + 2 shift + 3 meta + 4 ctrl + 5 set for motion notify + 6 set for wheel (and button 6 and 7) + 7 set for buttons 8 to 11 +*/ + +/* Position: 32 - 255. */ +static int +BtnCode(XButtonEvent *event, int button) +{ + int result = (int) (32 + (KeyState(event->state) << 2)); + + if (event->type == MotionNotify) + result += 32; + + if (button < 0) { + result += 3; + } else { + result += button & 3; + if (button & 4) + result += 64; + if (button & 8) + result += 128; + } + TRACE(("BtnCode button %d, %s state " FMT_MODIFIER_NAMES " ->%#x\n", + button, + visibleEventType(event->type), + ARG_MODIFIER_NAMES(event->state), + result)); + return result; +} + +static unsigned +EmitButtonCode(XtermWidget xw, + Char *line, + unsigned count, + XButtonEvent *event, + int button) +{ + TScreen *screen = TScreenOf(xw); + int value; + + if (okSendMousePos(xw) == X10_MOUSE) { + value = CharOf(' ' + button); + } else { + value = BtnCode(event, button); + } + + switch (screen->extend_coords) { + default: + line[count++] = CharOf(value); + break; + case SET_SGR_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + value -= 32; /* encoding starts at zero */ + /* FALLTHRU */ + case SET_URXVT_EXT_MODE_MOUSE: + count += (unsigned) sprintf((char *) line + count, "%d", value); + break; + case SET_EXT_MODE_MOUSE: + if (value < 128) { + line[count++] = CharOf(value); + } else { + line[count++] = CharOf(0xC0 + (value >> 6)); + line[count++] = CharOf(0x80 + (value & 0x3F)); + } + break; + } + return count; +} + +static int +FirstBitN(int bits) +{ + int result = -1; + if (bits > 0) { + result = 0; + while (!(bits & 1)) { + bits /= 2; + ++result; + } + } + return result; +} + +#define ButtonBit(button) ((button >= 0) ? (1 << (button)) : 0) + +#define EMIT_BUTTON(button) EmitButtonCode(xw, line, count, event, button) + +static void +EditorButton(XtermWidget xw, XButtonEvent *event) +{ + TScreen *screen = TScreenOf(xw); + int pty = screen->respond; + int mouse_limit = MouseLimit(screen); + Char line[32]; + Char final = 'M'; + int row, col; + int button; + unsigned count = 0; + Boolean changed = True; + + /* If button event, get button # adjusted for DEC compatibility */ + button = (int) (event->button - 1); + if (button >= 3) + button++; + + /* Ignore buttons that cannot be encoded */ + if (screen->send_mouse_pos == X10_MOUSE) { + if (button > 3) + return; + } else if (screen->extend_coords == SET_SGR_EXT_MODE_MOUSE + || screen->extend_coords == SET_URXVT_EXT_MODE_MOUSE + || screen->extend_coords == SET_PIXEL_POSITION_MOUSE) { + if (button > 15) { + return; + } + } else { + if (button > 11) { + return; + } + } + + if (screen->extend_coords == SET_PIXEL_POSITION_MOUSE) { + row = event->y; + col = event->x; + } else { + /* Compute character position of mouse pointer */ + row = (event->y - screen->border) / FontHeight(screen); + col = (event->x - OriginX(screen)) / FontWidth(screen); + + /* Limit to screen dimensions */ + if (row < 0) + row = 0; + else if (row > screen->max_row) + row = screen->max_row; + + if (col < 0) + col = 0; + else if (col > screen->max_col) + col = screen->max_col; + + if (mouse_limit > 0) { + /* Limit to representable mouse dimensions */ + if (row > mouse_limit) + row = mouse_limit; + if (col > mouse_limit) + col = mouse_limit; + } + } + + /* Build key sequence starting with \E[M */ + if (screen->control_eight_bits) { + line[count++] = ANSI_CSI; + } else { + line[count++] = ANSI_ESC; + line[count++] = '['; + } + switch (screen->extend_coords) { + case 0: + case SET_EXT_MODE_MOUSE: +#if OPT_SCO_FUNC_KEYS + if (xw->keyboard.type == keyboardIsSCO) { + /* + * SCO function key F1 is \E[M, which would conflict with xterm's + * normal kmous. + */ + line[count++] = '>'; + } +#endif + line[count++] = final; + break; + case SET_SGR_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + line[count++] = '<'; + break; + } + + /* Add event code to key sequence */ + if (okSendMousePos(xw) == X10_MOUSE) { + count = EMIT_BUTTON(button); + } else { + /* Button-Motion events */ + switch (event->type) { + case ButtonPress: + screen->mouse_button |= ButtonBit(button); + count = EMIT_BUTTON(button); + break; + case ButtonRelease: + /* + * The (vertical) wheel mouse interface generates release-events + * for buttons 4 and 5. + * + * The X10/X11 xterm protocol maps the release for buttons 1..3 to + * a -1, which will be later mapped into a "0" (some button was + * released), At this point, buttons 1..3 are encoded 0..2 (the + * code 3 is unused). + * + * The SGR (extended) xterm mouse protocol keeps the button number + * and uses a "m" to indicate button release. + * + * The behavior for mice with more buttons is unclear, and may be + * revised -TD + */ + screen->mouse_button &= ~ButtonBit(button); + if (button < 3 || button > 5) { + switch (screen->extend_coords) { + case SET_SGR_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + final = 'm'; + break; + default: + button = -1; + break; + } + } + count = EMIT_BUTTON(button); + break; + case MotionNotify: + /* BTN_EVENT_MOUSE and ANY_EVENT_MOUSE modes send motion + * events only if character cell has changed. + */ + if ((row == screen->mouse_row) + && (col == screen->mouse_col)) { + changed = False; + } else { + count = EMIT_BUTTON(FirstBitN(screen->mouse_button)); + } + break; + default: + changed = False; + break; + } + } + + if (changed) { + screen->mouse_row = row; + screen->mouse_col = col; + + TRACE(("mouse at %d,%d button+mask = %#x\n", row, col, line[count - 1])); + + /* Add pointer position to key sequence */ + count = EmitMousePositionSeparator(screen, line, count); + count = EmitMousePosition(screen, line, count, col); + count = EmitMousePositionSeparator(screen, line, count); + count = EmitMousePosition(screen, line, count, row); + + switch (screen->extend_coords) { + case SET_SGR_EXT_MODE_MOUSE: + case SET_URXVT_EXT_MODE_MOUSE: + case SET_PIXEL_POSITION_MOUSE: + line[count++] = final; + break; + } + + /* Transmit key sequence to process running under xterm */ + TRACE(("EditorButton -> %s\n", visibleChars(line, count))); + v_write(pty, line, count); + } + return; +} + +/* + * Check the current send_mouse_pos against allowed mouse-operations, returning + * none if it is disallowed. + */ +XtermMouseModes +okSendMousePos(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + XtermMouseModes result = screen->send_mouse_pos; + + switch (result) { + case MOUSE_OFF: + break; + case X10_MOUSE: + if (!AllowMouseOps(xw, emX10)) + result = MOUSE_OFF; + break; + case VT200_MOUSE: + if (!AllowMouseOps(xw, emVT200Click)) + result = MOUSE_OFF; + break; + case VT200_HIGHLIGHT_MOUSE: + if (!AllowMouseOps(xw, emVT200Hilite)) + result = MOUSE_OFF; + break; + case BTN_EVENT_MOUSE: + if (!AllowMouseOps(xw, emAnyButton)) + result = MOUSE_OFF; + break; + case ANY_EVENT_MOUSE: + if (!AllowMouseOps(xw, emAnyEvent)) + result = MOUSE_OFF; + break; + case DEC_LOCATOR: + if (!AllowMouseOps(xw, emLocator)) + result = MOUSE_OFF; + break; + } + return result; +} + +#if OPT_FOCUS_EVENT +/* + * Check the current send_focus_pos against allowed mouse-operations, returning + * none if it is disallowed. + */ +static int +okSendFocusPos(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int result = screen->send_focus_pos; + + if (!AllowMouseOps(xw, emFocusEvent)) { + result = False; + } + return result; +} + +void +SendFocusButton(XtermWidget xw, XFocusChangeEvent *event) +{ + if (okSendFocusPos(xw)) { + ANSI reply; + + memset(&reply, 0, sizeof(reply)); + reply.a_type = ANSI_CSI; + +#if OPT_SCO_FUNC_KEYS + if (xw->keyboard.type == keyboardIsSCO) { + reply.a_pintro = '>'; + } +#endif + reply.a_final = CharOf((event->type == FocusIn) ? 'I' : 'O'); + unparseseq(xw, &reply); + } + return; +} +#endif /* OPT_FOCUS_EVENT */ + +#if OPT_SELECTION_OPS +/* + * Get the event-time, needed to process selections. + */ +static Time +getEventTime(XEvent *event) +{ + Time result; + + if (IsBtnEvent(event)) { + result = ((XButtonEvent *) event)->time; + } else if (IsKeyEvent(event)) { + result = ((XKeyEvent *) event)->time; + } else { + result = 0; + } + + return result; +} + +/* obtain the selection string, passing the endpoints to caller's parameters */ +static void +doSelectionFormat(XtermWidget xw, + Widget w, + XEvent *event, + String *params, + Cardinal *num_params, + FormatSelect format_select) +{ + TScreen *screen = TScreenOf(xw); + InternalSelect *mydata = &(screen->internal_select); + + memset(mydata, 0, sizeof(*mydata)); + mydata->format = x_strdup(params[0]); + mydata->format_select = format_select; + + screen->selectToBuffer = True; + beginInternalSelect(xw); + + xtermGetSelection(w, getEventTime(event), params + 1, *num_params - 1, NULL); + + if (screen->selectToBuffer) + finishInternalSelect(xw); +} + +/* obtain data from the screen, passing the endpoints to caller's parameters */ +static char * +getDataFromScreen(XtermWidget xw, XEvent *event, String method, CELL *start, CELL *finish) +{ + TScreen *screen = TScreenOf(xw); + + CELL save_old_start = screen->startH; + CELL save_old_end = screen->endH; + + CELL save_startSel = screen->startSel; + CELL save_startRaw = screen->startRaw; + CELL save_finishSel = screen->endSel; + CELL save_finishRaw = screen->endRaw; + + int save_firstValidRow = screen->firstValidRow; + int save_lastValidRow = screen->lastValidRow; + + const Cardinal noClick = 0; + int save_numberOfClicks = screen->numberOfClicks; + + SelectUnit saveUnits = screen->selectUnit; + SelectUnit saveMap = screen->selectMap[noClick]; +#if OPT_SELECT_REGEX + char *saveExpr = screen->selectExpr[noClick]; +#endif + SelectedCells *scp = &(screen->selected_cells[PRIMARY_CODE]); + SelectedCells save_selection = *scp; + + char *result = 0; + + TRACE(("getDataFromScreen %s\n", method)); + + memset(scp, 0, sizeof(*scp)); + + screen->numberOfClicks = 1; + lookupSelectUnit(xw, noClick, method); + screen->selectUnit = screen->selectMap[noClick]; + + memset(start, 0, sizeof(*start)); + if (IsBtnEvent(event)) { + XButtonEvent *btn_event = (XButtonEvent *) event; + CELL cell; + screen->firstValidRow = 0; + screen->lastValidRow = screen->max_row; + PointToCELL(screen, btn_event->y, btn_event->x, &cell); + start->row = cell.row; + start->col = cell.col; + finish->row = cell.row; + finish->col = screen->max_col; + } else { + start->row = screen->cur_row; + start->col = screen->cur_col; + finish->row = screen->cur_row; + finish->col = screen->max_col; + } + + ComputeSelect(xw, start, finish, False); + SaltTextAway(xw, + TargetToSelection(screen, PRIMARY_NAME), + &(screen->startSel), &(screen->endSel)); + + if (scp->data_limit && scp->data_buffer) { + TRACE(("...getDataFromScreen selection-data %.*s\n", + (int) scp->data_limit, + scp->data_buffer)); + result = malloc(scp->data_limit + 1); + if (result) { + memcpy(result, scp->data_buffer, scp->data_limit); + result[scp->data_limit] = 0; + } + free(scp->data_buffer); + scp->data_limit = 0; + } + + TRACE(("...getDataFromScreen restoring previous selection\n")); + + screen->startSel = save_startSel; + screen->startRaw = save_startRaw; + screen->endSel = save_finishSel; + screen->endRaw = save_finishRaw; + + screen->firstValidRow = save_firstValidRow; + screen->lastValidRow = save_lastValidRow; + + screen->numberOfClicks = save_numberOfClicks; + screen->selectUnit = saveUnits; + screen->selectMap[noClick] = saveMap; +#if OPT_SELECT_REGEX + screen->selectExpr[noClick] = saveExpr; +#endif + + screen->selected_cells[0] = save_selection; + + TrackText(xw, &save_old_start, &save_old_end); + + TRACE(("...getDataFromScreen done\n")); + return result; +} + +/* + * Split-up the format before substituting data, to avoid quoting issues. + * The resource mechanism has a limited ability to handle escapes. We take + * the result as if it were an sh-type string and parse it into a regular + * argv array. + */ +static char ** +tokenizeFormat(String format) +{ + char **result = 0; + + format = x_skip_blanks(format); + if (*format != '\0') { + char *blob = x_strdup(format); + int pass; + + for (pass = 0; pass < 2; ++pass) { + int used = 0; + int first = 1; + int escaped = 0; + int squoted = 0; + int dquoted = 0; + int n; + int argc = 0; + + for (n = 0; format[n] != '\0'; ++n) { + if (escaped) { + blob[used++] = format[n]; + escaped = 0; + } else if (format[n] == '"') { + if (!squoted) { + if (!dquoted) + blob[used++] = format[n]; + dquoted = !dquoted; + } + } else if (format[n] == '\'') { + if (!dquoted) { + if (!squoted) + blob[used++] = format[n]; + squoted = !squoted; + } + } else if (format[n] == '\\') { + blob[used++] = format[n]; + escaped = 1; + } else { + if (first) { + first = 0; + if (pass) { + result[argc] = &blob[n]; + } + ++argc; + } + if (isspace((Char) format[n])) { + first = !isspace((Char) format[n + 1]); + if (squoted || dquoted) { + blob[used++] = format[n]; + } else if (first) { + blob[used++] = '\0'; + } + } else { + blob[used++] = format[n]; + } + } + } + blob[used] = '\0'; + assert(strlen(blob) <= strlen(format)); + if (!pass) { + result = TypeCallocN(char *, argc + 1); + if (result == 0) { + free(blob); + break; + } + } + } + } +#if OPT_TRACE + if (result) { + int n; + TRACE(("tokenizeFormat %s\n", format)); + for (n = 0; result[n]; ++n) { + TRACE(("argv[%d] = %s\n", n, result[n])); + } + } +#endif + + return result; +} + +static void +formatVideoAttrs(XtermWidget xw, char *buffer, CELL *cell) +{ + TScreen *screen = TScreenOf(xw); + LineData *ld = GET_LINEDATA(screen, cell->row); + + *buffer = '\0'; + if (ld != 0 && cell->col < (int) ld->lineSize) { + IAttr attribs = ld->attribs[cell->col]; + const char *delim = ""; + + if (attribs & INVERSE) { + buffer += sprintf(buffer, "7"); + delim = ";"; + } + if (attribs & UNDERLINE) { + buffer += sprintf(buffer, "%s4", delim); + delim = ";"; + } + if (attribs & BOLD) { + buffer += sprintf(buffer, "%s1", delim); + delim = ";"; + } + if (attribs & BLINK) { + buffer += sprintf(buffer, "%s5", delim); + delim = ";"; + } +#if OPT_ISO_COLORS + if (attribs & FG_COLOR) { + Pixel fg = extract_fg(xw, ld->color[cell->col], attribs); + if (fg < 8) { + fg += 30; + } else if (fg < 16) { + fg += 90; + } else { + buffer += sprintf(buffer, "%s38;5", delim); + delim = ";"; + } + buffer += sprintf(buffer, "%s%lu", delim, fg); + delim = ";"; + } + if (attribs & BG_COLOR) { + Pixel bg = extract_bg(xw, ld->color[cell->col], attribs); + if (bg < 8) { + bg += 40; + } else if (bg < 16) { + bg += 100; + } else { + buffer += sprintf(buffer, "%s48;5", delim); + delim = ";"; + } + (void) sprintf(buffer, "%s%lu", delim, bg); + } +#endif + } +} + +static char * +formatStrlen(char *target, char *source, int freeit) +{ + if (source != 0) { + sprintf(target, "%u", (unsigned) strlen(source)); + if (freeit) { + free(source); + } + } else { + strcpy(target, "0"); + } + return target; +} + +/* substitute data into format, reallocating the result */ +static char * +expandFormat(XtermWidget xw, + const char *format, + char *data, + CELL *start, + CELL *finish) +{ + char *result = 0; + if (!IsEmpty(format)) { + static char empty[1]; + int pass; + int n; + char numbers[80]; + + if (data == 0) + data = empty; + + for (pass = 0; pass < 2; ++pass) { + size_t need = 0; + + for (n = 0; format[n] != '\0'; ++n) { + + if (format[n] == '%') { + char *value = 0; + + switch (format[++n]) { + case '%': + if (pass) { + result[need] = format[n]; + } + ++need; + break; + case 'P': + sprintf(numbers, "%d;%d", + TScreenOf(xw)->topline + start->row + 1, + start->col + 1); + value = numbers; + break; + case 'p': + sprintf(numbers, "%d;%d", + TScreenOf(xw)->topline + finish->row + 1, + finish->col + 1); + value = numbers; + break; + case 'R': + value = formatStrlen(numbers, x_strrtrim(data), 1); + break; + case 'r': + value = x_strrtrim(data); + break; + case 'S': + value = formatStrlen(numbers, data, 0); + break; + case 's': + value = data; + break; + case 'T': + value = formatStrlen(numbers, x_strtrim(data), 1); + break; + case 't': + value = x_strtrim(data); + break; + case 'V': + formatVideoAttrs(xw, numbers, start); + value = numbers; + break; + case 'v': + formatVideoAttrs(xw, numbers, finish); + value = numbers; + break; + default: + if (pass) { + result[need] = format[n]; + } + --n; + ++need; + break; + } + if (value != 0) { + if (pass) { + strcpy(result + need, value); + } + need += strlen(value); + if (value != numbers && value != data) { + free(value); + } + } + } else { + if (pass) { + result[need] = format[n]; + } + ++need; + } + } + if (pass) { + result[need] = '\0'; + } else { + ++need; + result = malloc(need); + if (result == 0) { + break; + } + } + } + } + TRACE(("expandFormat(%s) = %s\n", NonNull(format), NonNull(result))); + return result; +} + +/* execute the command after forking. The main process frees its data */ +static void +executeCommand(pid_t pid, char **argv) +{ + (void) pid; + if (argv != 0 && argv[0] != 0) { + char *child_cwd = ProcGetCWD(pid); + + if (fork() == 0) { + if (child_cwd) { + IGNORE_RC(chdir(child_cwd)); /* We don't care if this fails */ + } + execvp(argv[0], argv); + exit(EXIT_FAILURE); + } + free(child_cwd); + } +} + +static void +freeArgv(char *blob, char **argv) +{ + if (blob) { + free(blob); + if (argv) { + int n; + for (n = 0; argv[n]; ++n) + free(argv[n]); + free(argv); + } + } +} + +static void +reallyExecFormatted(Widget w, char *format, char *data, CELL *start, CELL *finish) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + char **argv; + + if ((argv = tokenizeFormat(format)) != 0) { + char *blob = argv[0]; + int argc; + + for (argc = 0; argv[argc] != 0; ++argc) { + argv[argc] = expandFormat(xw, argv[argc], data, start, finish); + } + executeCommand(TScreenOf(xw)->pid, argv); + freeArgv(blob, argv); + } + } +} + +void +HandleExecFormatted(Widget w, + XEvent *event, + String *params, /* selections */ + Cardinal *num_params) +{ + XtermWidget xw; + + TRACE_EVENT("HandleExecFormatted", event, params, num_params); + if ((xw = getXtermWidget(w)) != 0 && + (*num_params > 1)) { + doSelectionFormat(xw, w, event, params, num_params, reallyExecFormatted); + } +} + +void +HandleExecSelectable(Widget w, + XEvent *event, + String *params, /* selections */ + Cardinal *num_params) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TRACE_EVENT("HandleExecSelectable", event, params, num_params); + + if (*num_params == 2) { + CELL start, finish; + char *data; + char **argv; + + data = getDataFromScreen(xw, event, params[1], &start, &finish); + if (data != 0) { + if ((argv = tokenizeFormat(params[0])) != 0) { + char *blob = argv[0]; + int argc; + + for (argc = 0; argv[argc] != 0; ++argc) { + argv[argc] = expandFormat(xw, argv[argc], data, + &start, &finish); + } + executeCommand(TScreenOf(xw)->pid, argv); + freeArgv(blob, argv); + } + free(data); + } + } + } +} + +static void +reallyInsertFormatted(Widget w, char *format, char *data, CELL *start, CELL *finish) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + char *exps; + + if ((exps = expandFormat(xw, format, data, start, finish)) != 0) { + unparseputs(xw, exps); + unparse_end(xw); + free(exps); + } + } +} + +void +HandleInsertFormatted(Widget w, + XEvent *event, + String *params, /* selections */ + Cardinal *num_params) +{ + XtermWidget xw; + + TRACE_EVENT("HandleInsertFormatted", event, params, num_params); + if ((xw = getXtermWidget(w)) != 0 && + (*num_params > 1)) { + doSelectionFormat(xw, w, event, params, num_params, reallyInsertFormatted); + } +} + +void +HandleInsertSelectable(Widget w, + XEvent *event, + String *params, /* selections */ + Cardinal *num_params) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TRACE_EVENT("HandleInsertSelectable", event, params, num_params); + + if (*num_params == 2) { + CELL start, finish; + char *data; + char *temp = x_strdup(params[0]); + + data = getDataFromScreen(xw, event, params[1], &start, &finish); + if (data != 0) { + char *exps = expandFormat(xw, temp, data, &start, &finish); + if (exps != 0) { + unparseputs(xw, exps); + unparse_end(xw); + free(exps); + } + free(data); + } + free(temp); + } + } +} +#endif /* OPT_SELECTION_OPS */ diff --git a/ports/xterm/xterm-359/button.o b/ports/xterm/xterm-359/button.o new file mode 100644 index 0000000000000000000000000000000000000000..bc4be8882163ea07ad8bad32a18095faf2af7af1 GIT binary patch literal 258136 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�!phFeYm6r0&?O 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 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/cachedGCs.c b/ports/xterm/xterm-359/cachedGCs.c new file mode 100644 index 0000000..9126f17 --- /dev/null +++ b/ports/xterm/xterm-359/cachedGCs.c @@ -0,0 +1,888 @@ +/* $XTermId: cachedGCs.c,v 1.79 2019/11/13 23:07:08 tom Exp $ */ + +/* + * Copyright 2007-2018,2019 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +#include +#include +#include + +#include + +/* + * hide (or eliminate) calls to + * XCreateGC() + * XFreeGC() + * XGetGCValues() + * XSetBackground() + * XSetFont() + * XSetForeground() + * XtGetGC() + * XtReleaseGC() + * by associating an integer with each GC, maintaining a cache which + * reflects frequency of use rather than most recent usage. + * + * FIXME: XTermFonts should hold gc, font, fs. + */ +typedef struct { + GC gc; + unsigned used; + unsigned cset; + XTermFonts *font; + Pixel tile; + Pixel fg; + Pixel bg; +} CgsCacheData; + +#define DEPTH 8 +#define ITEM() (int) (me->data - me->list) +#define LIST(item) me->list[item] +#define LINK(item) me->data = (me->list + (item)) +#define THIS(field) me->data->field +#define NEXT(field) me->next.field + +#define HaveFont(font) (Boolean) ((font) != 0 && (font)->fs != 0) + +#define GC_CSet GCFunction + +typedef struct { + CgsCacheData list[DEPTH]; + CgsCacheData *data; /* points to current list[] entry */ + XtGCMask mask; /* changes since the last getCgsGC() */ + CgsCacheData next; /* updated values, apply in getCgsGC() */ +} CgsCache; + +#if OPT_TRACE +#define CASE(name) case gc##name: result = #name; break +static const char * +traceCgsEnum(CgsEnum value) +{ + const char *result = "?"; + switch (value) { + CASE(Norm); + CASE(Bold); + CASE(NormReverse); + CASE(BoldReverse); + CASE(Border); + CASE(Filler); +#if OPT_BOX_CHARS + CASE(Line); + CASE(Dots); +#endif +#if OPT_DEC_CHRSET + CASE(CNorm); + CASE(CBold); +#endif +#if OPT_WIDE_CHARS + CASE(Wide); + CASE(WBold); + CASE(WideReverse); + CASE(WBoldReverse); +#endif + CASE(VTcursNormal); + CASE(VTcursFilled); + CASE(VTcursReverse); + CASE(VTcursOutline); +#if OPT_TEK4014 + CASE(TKcurs); +#endif + CASE(MAX); + } + return result; +} + +#undef CASE + +static const char * +traceVTwin(XtermWidget xw, VTwin *value) +{ + const char *result = "?"; + if (value == 0) + result = "null"; + else if (value == &(TScreenOf(xw)->fullVwin)) + result = "fullVwin"; +#ifndef NO_ACTIVE_ICON + else if (value == &(TScreenOf(xw)->iconVwin)) + result = "iconVwin"; +#endif + return result; +} + +#if OPT_TRACE > 1 +static String +traceCSet(unsigned cset) +{ + static char result[80]; + switch (cset) { + case CSET_SWL: + strcpy(result, "SWL"); + break; + case CSET_DHL_TOP: + strcpy(result, "DHL_TOP"); + break; + case CSET_DHL_BOT: + strcpy(result, "DHL_BOT"); + break; + case CSET_DWL: + strcpy(result, "DWL"); + break; + default: + sprintf(result, "%#x", cset); + break; + } + return result; +} + +static String +traceFont(XTermFonts * font) +{ + static char result[80]; + + if (HaveFont(font)) { + XFontStruct *fs = font->fs; + sprintf(result, "%p(%dx%d %d %#lx)", + fs, + fs->max_bounds.width, + fs->max_bounds.ascent + fs->max_bounds.descent, + fs->max_bounds.descent, + (unsigned long) (fs->fid)); + } else { + strcpy(result, "null"); + } + return result; +} + +static String +tracePixel(XtermWidget xw, Pixel value) +{ +#define CASE(name) { name, #name } + static struct { + TermColors code; + String name; + } t_colors[] = { + CASE(TEXT_FG), + CASE(TEXT_BG), + CASE(TEXT_CURSOR), + CASE(MOUSE_FG), + CASE(MOUSE_BG), +#if OPT_TEK4014 + CASE(TEK_FG), + CASE(TEK_BG), +#endif +#if OPT_HIGHLIGHT_COLOR + CASE(HIGHLIGHT_BG), + CASE(HIGHLIGHT_FG), +#endif +#if OPT_TEK4014 + CASE(TEK_CURSOR), +#endif + }; + TScreen *screen = TScreenOf(xw); + String result = 0; + int n; + + for (n = 0; n < NCOLORS; ++n) { + if (value == T_COLOR(screen, t_colors[n].code)) { + result = t_colors[n].name; + break; + } + } + + if (result == 0) { + for (n = 0; n < MAXCOLORS; ++n) { +#if OPT_COLOR_RES + if (screen->Acolors[n].mode > 0 + && value == screen->Acolors[n].value) { + result = screen->Acolors[n].resource; + break; + } +#else + if (value == screen->Acolors[n]) { + char temp[80]; + sprintf(temp, "Acolors[%d]", n); + result = x_strdup(temp); + break; + } +#endif + } + } + + if (result == 0) { + char temp[80]; + sprintf(temp, "%#lx", value); + result = x_strdup(temp); + } + + return result; +} + +#undef CASE + +#endif /* OPT_TRACE > 1 */ +#endif /* OPT_TRACE */ + +static CgsCache * +allocCache(void **cache_pointer) +{ + if (*cache_pointer == 0) { + *cache_pointer = TypeCallocN(CgsCache, gcMAX); + TRACE(("allocCache %p\n", *cache_pointer)); + } + return *((CgsCache **) cache_pointer); +} + +#define ALLOC_CACHE(p) ((*(p) == 0) ? allocCache(p) : *(p)) + +static int +dataIndex(CgsCache * me) +{ + return ITEM(); +} + +static void +relinkData(CgsCache * me, int item) +{ + LINK(item); +} + +/* + * Returns the appropriate cache pointer. + */ +static CgsCache * +myCache(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId) +{ + CgsCache *result = 0; + + if ((int) cgsId >= 0 && cgsId < gcMAX) { +#ifdef NO_ACTIVE_ICON + (void) xw; + (void) cgsWin; +#else + if (cgsWin == &(TScreenOf(xw)->iconVwin)) + result = ALLOC_CACHE(&(TScreenOf(xw)->icon_cgs_cache)); + else +#endif + result = ALLOC_CACHE(&(TScreenOf(xw)->main_cgs_cache)); + + result += cgsId; + if (result->data == 0) { + result->data = result->list; + } + } + + return result; +} + +static Display * +myDisplay(XtermWidget xw) +{ + return TScreenOf(xw)->display; +} + +static Drawable +myDrawable(XtermWidget xw, VTwin *cgsWin) +{ + Drawable drawable = 0; + + if (cgsWin != 0 && cgsWin->window != 0) + drawable = cgsWin->window; + if (drawable == 0) + drawable = RootWindowOfScreen(XtScreen(xw)); + return drawable; +} + +static GC +newCache(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, CgsCache * me) +{ + XGCValues xgcv; + XtGCMask mask; + + THIS(font) = NEXT(font); + THIS(cset) = NEXT(cset); + THIS(fg) = NEXT(fg); + THIS(bg) = NEXT(bg); + + memset(&xgcv, 0, sizeof(xgcv)); + xgcv.font = NEXT(font)->fs->fid; + mask = (GCForeground | GCBackground | GCFont); + + switch (cgsId) { + case gcFiller: + case gcBorder: + mask &= (XtGCMask) ~ GCFont; + /* FALLTHRU */ + case gcNorm: + case gcBold: + case gcNormReverse: + case gcBoldReverse: +#if OPT_WIDE_CHARS + case gcWide: + case gcWBold: + case gcWideReverse: + case gcWBoldReverse: +#endif + mask |= (GCGraphicsExposures | GCFunction); + xgcv.graphics_exposures = True; /* default */ + xgcv.function = GXcopy; + break; +#if OPT_BOX_CHARS + case gcLine: + mask |= (GCGraphicsExposures | GCFunction); + xgcv.graphics_exposures = True; /* default */ + xgcv.function = GXcopy; + break; + case gcDots: + xgcv.fill_style = FillTiled; + xgcv.tile = + XmuCreateStippledPixmap(XtScreen((Widget) xw), + THIS(fg), + THIS(bg), + xw->core.depth); + THIS(tile) = xgcv.tile; + mask = (GCForeground | GCBackground); + mask |= (GCGraphicsExposures | GCFunction | GCTile | GCFillStyle); + xgcv.graphics_exposures = True; /* default */ + xgcv.function = GXcopy; + break; +#endif +#if OPT_DEC_CHRSET + case gcCNorm: + case gcCBold: + break; +#endif + case gcVTcursNormal: /* FALLTHRU */ + case gcVTcursFilled: /* FALLTHRU */ + case gcVTcursReverse: /* FALLTHRU */ + case gcVTcursOutline: /* FALLTHRU */ + break; +#if OPT_TEK4014 + case gcTKcurs: /* FALLTHRU */ + /* FIXME */ +#endif + case gcMAX: /* should not happen */ + return 0; + } + xgcv.foreground = NEXT(fg); + xgcv.background = NEXT(bg); + + THIS(gc) = XCreateGC(myDisplay(xw), myDrawable(xw, cgsWin), mask, &xgcv); + TRACE(("getCgsGC(%s) created gc %p(%d)\n", + traceCgsEnum(cgsId), (void *) THIS(gc), ITEM())); + + THIS(used) = 0; + return THIS(gc); +} + +#define SameFont(a, b) \ + (Boolean) (HaveFont(a) \ + && HaveFont(b) \ + && (((a)->fs == (b)->fs) \ + || !memcmp((a)->fs, (b)->fs, sizeof(*((a)->fs))))) + +#define SameColor(a,b) ((a) == (b)) +#define SameCSet(a,b) ((a) == (b)) + +static GC +chgCache(XtermWidget xw, CgsEnum cgsId GCC_UNUSED, CgsCache * me, Bool both) +{ + XGCValues xgcv; + XtGCMask mask = (GCForeground | GCBackground | GCFont); + + memset(&xgcv, 0, sizeof(xgcv)); + + TRACE2(("chgCache(%s) old data fg=%s, bg=%s, font=%s cset %s\n", + traceCgsEnum(cgsId), + tracePixel(xw, THIS(fg)), + tracePixel(xw, THIS(bg)), + traceFont(THIS(font)), + traceCSet(THIS(cset)))); +#if OPT_TRACE > 1 + if (!SameFont(THIS(font), NEXT(font))) + TRACE2(("...chgCache new font=%s\n", traceFont(NEXT(font)))); + if (!SameCSet(THIS(cset), NEXT(cset))) + TRACE2(("...chgCache new cset=%s\n", traceCSet(NEXT(cset)))); + if (!SameColor(THIS(fg), NEXT(fg))) + TRACE2(("...chgCache new fg=%s\n", tracePixel(xw, NEXT(fg)))); + if (!SameColor(THIS(bg), NEXT(bg))) + TRACE2(("...chgCache new bg=%s\n", tracePixel(xw, NEXT(bg)))); +#endif + + if (both) { + THIS(font) = NEXT(font); + THIS(cset) = NEXT(cset); + } + THIS(fg) = NEXT(fg); + THIS(bg) = NEXT(bg); + + xgcv.font = THIS(font)->fs->fid; + xgcv.foreground = THIS(fg); + xgcv.background = THIS(bg); + + XChangeGC(myDisplay(xw), THIS(gc), mask, &xgcv); + TRACE2(("...chgCache(%s) updated gc %p(%d)\n", + traceCgsEnum(cgsId), THIS(gc), ITEM())); + + THIS(used) = 0; + return THIS(gc); +} + +/* + * Use the "setCgsXXXX()" calls to initialize parameters for a new GC. + */ +void +setCgsFore(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, Pixel fg) +{ + CgsCache *me; + + if ((me = myCache(xw, cgsWin, cgsId)) != 0) { + NEXT(fg) = fg; + me->mask |= GCForeground; + TRACE2(("setCgsFore(%s) %s\n", + traceCgsEnum(cgsId), + tracePixel(xw, NEXT(fg)))); + } +} + +void +setCgsBack(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, Pixel bg) +{ + CgsCache *me; + + if ((me = myCache(xw, cgsWin, cgsId)) != 0) { + NEXT(bg) = bg; + me->mask |= GCBackground; + TRACE2(("setCgsBack(%s) %s\n", + traceCgsEnum(cgsId), + tracePixel(xw, NEXT(bg)))); + } +} + +#if OPT_DEC_CHRSET +void +setCgsCSet(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, unsigned cset) +{ + CgsCache *me; + + if ((me = myCache(xw, cgsWin, cgsId)) != 0) { + NEXT(cset) = cset; + me->mask |= GC_CSet; + } +} +#else +#define setCgsCSet(xw, cgsWin, dstCgsId, cset) /* nothing */ +#endif + +void +setCgsFont2(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font, unsigned which) +{ + CgsCache *me; + + if ((me = myCache(xw, cgsWin, cgsId)) != 0) { + TScreen *screen = TScreenOf(xw); + if (!HaveFont(font)) { + if (cgsId != gcNorm) + (void) getCgsGC(xw, cgsWin, gcNorm); +#ifndef NO_ACTIVE_ICON + if (cgsWin == &(TScreenOf(xw)->iconVwin)) + font = getIconicFont(screen); + else +#endif + font = GetNormalFont(screen, which); + } + if (HaveFont(font) && okFont(font->fs)) { + TRACE2(("setCgsFont next: %s for %s slot %p, gc %p\n", + traceFont(font), traceCgsEnum(cgsId), + me, THIS(gc))); + TRACE2(("...next font was %s\n", traceFont(NEXT(font)))); + NEXT(font) = font; + me->mask |= GCFont; + } else { + /* EMPTY */ + TRACE2(("...NOT updated font for %s\n", + traceCgsEnum(cgsId))); + } + } +} + +void +setCgsFont(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId, XTermFonts * font) +{ + setCgsFont2(xw, cgsWin, cgsId, font, fNorm); +} + +/* + * Discard all of the font information, e.g., we are resizing the font. + * Keep the GC's so we can simply change them rather than creating new ones. + */ +void +clrCgsFonts(XtermWidget xw, VTwin *cgsWin, XTermFonts * font) +{ + if (HaveFont(font)) { + int j; + for_each_gc(j) { + CgsCache *me; + if ((me = myCache(xw, cgsWin, (CgsEnum) j)) != 0) { + int k; + for (k = 0; k < DEPTH; ++k) { + if (SameFont(LIST(k).font, font)) { + TRACE2(("clrCgsFonts %s gc %p(%d) %s\n", + traceCgsEnum((CgsEnum) j), + LIST(k).gc, + k, + traceFont(font))); + LIST(k).font = 0; + LIST(k).cset = 0; + } + } + if (SameFont(NEXT(font), font)) { + TRACE2(("clrCgsFonts %s next %s\n", + traceCgsEnum((CgsEnum) j), + traceFont(font))); + NEXT(font) = 0; + NEXT(cset) = 0; + me->mask &= (unsigned) ~(GCFont | GC_CSet); + } + } + } + } +} + +/* + * Return a GC associated with the given id, allocating if needed. + */ +GC +getCgsGC(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId) +{ + CgsCache *me; + GC result = 0; + + if ((me = myCache(xw, cgsWin, cgsId)) != 0) { + TRACE2(("getCgsGC(%s, %s)\n", + traceVTwin(xw, cgsWin), traceCgsEnum(cgsId))); + if (me->mask != 0) { + int j; + unsigned used = 0; + + /* fill in the unchanged fields */ + if (!(me->mask & GC_CSet)) + NEXT(cset) = 0; /* OPT_DEC_CHRSET */ + if (!(me->mask & GCFont)) + NEXT(font) = THIS(font); + if (!(me->mask & GCForeground)) + NEXT(fg) = THIS(fg); + if (!(me->mask & GCBackground)) + NEXT(bg) = THIS(bg); + + if (NEXT(font) == 0) { + setCgsFont(xw, cgsWin, cgsId, 0); + } + + TRACE2(("...Cgs new data fg=%s, bg=%s, font=%s cset %s\n", + tracePixel(xw, NEXT(fg)), + tracePixel(xw, NEXT(bg)), + traceFont(NEXT(font)), + traceCSet(NEXT(cset)))); + + /* try to find the given data in an already-created GC */ + for (j = 0; j < DEPTH; ++j) { + if (LIST(j).gc != 0 + && SameFont(LIST(j).font, NEXT(font)) + && SameCSet(LIST(j).cset, NEXT(cset)) + && SameColor(LIST(j).fg, NEXT(fg)) + && SameColor(LIST(j).bg, NEXT(bg))) { + LINK(j); + result = THIS(gc); + TRACE2(("getCgsGC existing %p(%d)\n", result, ITEM())); + break; + } + } + + if (result == 0) { + /* try to find an empty slot, to create a new GC */ + used = 0; + for (j = 0; j < DEPTH; ++j) { + if (LIST(j).gc == 0) { + LINK(j); + result = newCache(xw, cgsWin, cgsId, me); + break; + } + if (used < LIST(j).used) + used = LIST(j).used; + } + } + + if (result == 0) { + int k; + /* if none were empty, pick the least-used slot, to modify */ + for (j = 0, k = -1; j < DEPTH; ++j) { + if (used >= LIST(j).used) { + used = LIST(j).used; + k = j; + } + } + if (k >= 0) { + LINK(k); + TRACE2(("...getCgsGC least-used(%d) was %d\n", k, THIS(used))); + result = chgCache(xw, cgsId, me, True); + } + } + me->next = *(me->data); + } else { + result = THIS(gc); + } + me->mask = 0; + THIS(used) += 1; + TRACE2(("...getCgsGC(%s, %s) gc %p(%d), used %d\n", + traceVTwin(xw, cgsWin), + traceCgsEnum(cgsId), result, ITEM(), THIS(used))); + } + return result; +} + +/* + * Return the font for the given GC. + */ +CgsEnum +getCgsId(XtermWidget xw, VTwin *cgsWin, GC gc) +{ + int n; + CgsEnum result = gcNorm; + + for_each_gc(n) { + CgsCache *me; + + if ((me = myCache(xw, cgsWin, (CgsEnum) n)) != 0) { + if (THIS(gc) == gc) { + result = (CgsEnum) n; + break; + } + } + } + return result; +} + +/* + * Return the font for the given GC. + */ +XTermFonts * +getCgsFont(XtermWidget xw, VTwin *cgsWin, GC gc) +{ + int n; + XTermFonts *result = 0; + + for_each_gc(n) { + CgsCache *me; + + if ((me = myCache(xw, cgsWin, (CgsEnum) n)) != 0) { + if (THIS(gc) == gc) { + result = THIS(font); + break; + } + } + } + return result; +} + +/* + * Return the foreground color for the given GC. + */ +Pixel +getCgsFore(XtermWidget xw, VTwin *cgsWin, GC gc) +{ + int n; + Pixel result = 0; + + for_each_gc(n) { + CgsCache *me; + + if ((me = myCache(xw, cgsWin, (CgsEnum) n)) != 0) { + if (THIS(gc) == gc) { + result = THIS(fg); + break; + } + } + } + return result; +} + +/* + * Return the background color for the given GC. + */ +Pixel +getCgsBack(XtermWidget xw, VTwin *cgsWin, GC gc) +{ + int n; + Pixel result = 0; + + for_each_gc(n) { + CgsCache *me; + + if ((me = myCache(xw, cgsWin, (CgsEnum) n)) != 0) { + if (THIS(gc) == gc) { + result = THIS(bg); + break; + } + } + } + return result; +} + +/* + * Copy the parameters (except GC of course) from one cache record to another. + */ +void +copyCgs(XtermWidget xw, VTwin *cgsWin, CgsEnum dstCgsId, CgsEnum srcCgsId) +{ + if (dstCgsId != srcCgsId) { + CgsCache *me; + + if ((me = myCache(xw, cgsWin, srcCgsId)) != 0) { + TRACE(("copyCgs from %s to %s\n", + traceCgsEnum(srcCgsId), + traceCgsEnum(dstCgsId))); + TRACE2(("copyCgs from %s (me %p, fg %s, bg %s, cset %s) to %s {{\n", + traceCgsEnum(srcCgsId), + me, + tracePixel(xw, THIS(fg)), + tracePixel(xw, THIS(bg)), + traceCSet(THIS(cset)), + traceCgsEnum(dstCgsId))); + setCgsCSet(xw, cgsWin, dstCgsId, THIS(cset)); + setCgsFore(xw, cgsWin, dstCgsId, THIS(fg)); + setCgsBack(xw, cgsWin, dstCgsId, THIS(bg)); + setCgsFont(xw, cgsWin, dstCgsId, THIS(font)); + TRACE2(("...copyCgs }}\n")); + } + } +} + +/* + * Interchange colors in the cache, e.g., for reverse-video. + */ +void +redoCgs(XtermWidget xw, Pixel fg, Pixel bg, CgsEnum cgsId) +{ + VTwin *cgsWin = WhichVWin(TScreenOf(xw)); + CgsCache *me = myCache(xw, cgsWin, cgsId); + + if (me != 0) { + CgsCacheData *save_data = me->data; + int n; + + for (n = 0; n < DEPTH; ++n) { + if (LIST(n).gc != 0 && HaveFont(LIST(n).font)) { + LINK(n); + + if (LIST(n).fg == fg + && LIST(n).bg == bg) { + setCgsFore(xw, cgsWin, cgsId, bg); + setCgsBack(xw, cgsWin, cgsId, fg); + } else if (LIST(n).fg == bg + && LIST(n).bg == fg) { + setCgsFore(xw, cgsWin, cgsId, fg); + setCgsBack(xw, cgsWin, cgsId, bg); + } else { + continue; + } + + (void) chgCache(xw, cgsId, me, False); + } + } + me->data = save_data; + } +} + +/* + * Swap the cache records, e.g., when doing reverse-video. + */ +void +swapCgs(XtermWidget xw, VTwin *cgsWin, CgsEnum dstCgsId, CgsEnum srcCgsId) +{ + if (dstCgsId != srcCgsId) { + CgsCache *src; + + if ((src = myCache(xw, cgsWin, srcCgsId)) != 0) { + CgsCache *dst; + + if ((dst = myCache(xw, cgsWin, dstCgsId)) != 0) { + CgsCache tmp; + int srcIndex = dataIndex(src); + int dstIndex = dataIndex(dst); + + EXCHANGE(*src, *dst, tmp); + + relinkData(src, dstIndex); + relinkData(dst, srcIndex); + } + } + } +} + +/* + * Free any GC associated with the given id. + */ +GC +freeCgs(XtermWidget xw, VTwin *cgsWin, CgsEnum cgsId) +{ + CgsCache *me; + + if ((me = myCache(xw, cgsWin, cgsId)) != 0) { + int j; + + for (j = 0; j < DEPTH; ++j) { + if (LIST(j).gc != 0) { + TRACE(("freeCgs(%s, %s) gc %p(%d)\n", + traceVTwin(xw, cgsWin), + traceCgsEnum(cgsId), (void *) LIST(j).gc, j)); + clrCgsFonts(xw, cgsWin, LIST(j).font); +#if OPT_BOX_CHARS + if (cgsId == gcDots) { + XmuReleaseStippledPixmap(XtScreen((Widget) xw), LIST(j).tile); + } +#endif + XFreeGC(TScreenOf(xw)->display, LIST(j).gc); + memset(&LIST(j), 0, sizeof(LIST(j))); + } + LINK(0); + } + } + return 0; +} + +#ifdef NO_LEAKS +void +noleaks_cachedCgs(XtermWidget xw) +{ +#ifndef NO_ACTIVE_ICON + free(TScreenOf(xw)->icon_cgs_cache); +#endif + free(TScreenOf(xw)->main_cgs_cache); +} +#endif diff --git a/ports/xterm/xterm-359/cachedGCs.o b/ports/xterm/xterm-359/cachedGCs.o new file mode 100644 index 0000000000000000000000000000000000000000..3b18e445f595e19137e7f21fb572f543fd3fe38a GIT binary patch literal 89784 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 E2lJB;t^fc4 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/charclass.c b/ports/xterm/xterm-359/charclass.c new file mode 100644 index 0000000..9b258c2 --- /dev/null +++ b/ports/xterm/xterm-359/charclass.c @@ -0,0 +1,514 @@ +/* $XTermId: charclass.c,v 1.41 2020/07/06 20:00:12 tom Exp $ */ + +/* + * Copyright 2002-2017,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + *---------------------------------------------------------------------------- + * Compact and efficient reimplementation of the + * xterm character class mechanism for large character sets + * + * Markus Kuhn -- mkuhn@acm.org -- 2000-07-03 + * + * xterm allows users to select entire words with a double-click on the left + * mouse button. Opinions might differ on what type of characters are part of + * separate words, therefore xterm allows users to configure a class code for + * each 8-bit character. Words are maximum length sequences of neighboring + * characters with identical class code. Extending this mechanism to Unicode + * naively would create an at least 2^16 entries (128 kB) long class code + * table. + * + * Instead, we transform the character class table into a list of intervals, + * that will be accessed via a linear search. Changes made to the table by the + * user will be appended. A special class code IDENT (default) marks + * characters who have their code number as the class code. + * + * We could alternatively use a sorted table of non-overlapping intervals that + * can be accessed via binary search, but merging in new intervals is + * significantly more hassle and not worth the effort here. + */ + +#include +#include + +#if OPT_WIDE_CHARS + +#ifdef TEST_DRIVER + +#include +#include +#include + +#if OPT_TRACE +#define Trace if (opt_v) printf +#endif + +#undef OPT_REPORT_CCLASS +#define OPT_REPORT_CCLASS 1 +#endif /* TEST_DRIVER */ + +static struct classentry { + int cclass; + int first; + int last; +} *classtab; + +typedef enum { + IDENT = -1, + OTHER = 0, + CNTRL = 1, + ALNUM = 48, + BLANK = 32, + U_CJK = 0x4e00, + U_SUP = 0x2070, + U_SUB = 0x2080, + U_HIR = 0x3040, + U_KAT = 0x30a0, + U_HAN = 0xac00 +} Classes; + +#ifdef TEST_DRIVER +static int opt_all; +static int opt_check; +static int opt_quiet; +static int opt_v; +#endif + +void +init_classtab(void) +{ + const int size = 50; + + TRACE(("init_classtab {{\n")); + + classtab = TypeMallocN(struct classentry, (unsigned) size); + if (!classtab) + abort(); + classtab[0].cclass = size; + classtab[0].first = 1; + classtab[0].last = 0; + + /* old xterm default classes */ + SetCharacterClassRange(0, 0, BLANK); + SetCharacterClassRange(1, 31, CNTRL); + SetCharacterClassRange('\t', '\t', BLANK); + SetCharacterClassRange('0', '9', ALNUM); + SetCharacterClassRange('A', 'Z', ALNUM); + SetCharacterClassRange('_', '_', ALNUM); + SetCharacterClassRange('a', 'z', ALNUM); + SetCharacterClassRange(127, 159, CNTRL); + SetCharacterClassRange(160, 191, IDENT); + SetCharacterClassRange(192, 255, ALNUM); + SetCharacterClassRange(215, 215, IDENT); + SetCharacterClassRange(247, 247, IDENT); + + /* added Unicode classes */ + SetCharacterClassRange(0x0100, 0xffdf, ALNUM); /* mostly characters */ + SetCharacterClassRange(0x037e, 0x037e, IDENT); /* Greek question mark */ + SetCharacterClassRange(0x0387, 0x0387, IDENT); /* Greek ano teleia */ + SetCharacterClassRange(0x055a, 0x055f, IDENT); /* Armenian punctuation */ + SetCharacterClassRange(0x0589, 0x0589, IDENT); /* Armenian full stop */ + SetCharacterClassRange(0x0700, 0x070d, IDENT); /* Syriac punctuation */ + SetCharacterClassRange(0x104a, 0x104f, IDENT); /* Myanmar punctuation */ + SetCharacterClassRange(0x10fb, 0x10fb, IDENT); /* Georgian punctuation */ + SetCharacterClassRange(0x1361, 0x1368, IDENT); /* Ethiopic punctuation */ + SetCharacterClassRange(0x166d, 0x166e, IDENT); /* Canadian Syl. punctuation */ + SetCharacterClassRange(0x17d4, 0x17dc, IDENT); /* Khmer punctuation */ + SetCharacterClassRange(0x1800, 0x180a, IDENT); /* Mongolian punctuation */ + SetCharacterClassRange(0x2000, 0x200a, BLANK); /* spaces */ + SetCharacterClassRange(0x200b, 0x27ff, IDENT); /* punctuation and symbols */ + SetCharacterClassRange(0x2070, 0x207f, U_SUP); /* superscript */ + SetCharacterClassRange(0x2080, 0x208f, U_SUB); /* subscript */ + SetCharacterClassRange(0x3000, 0x3000, BLANK); /* ideographic space */ + SetCharacterClassRange(0x3001, 0x3020, IDENT); /* ideographic punctuation */ + SetCharacterClassRange(0x3040, 0x309f, U_HIR); /* Hiragana */ + SetCharacterClassRange(0x30a0, 0x30ff, U_KAT); /* Katakana */ + SetCharacterClassRange(0x3300, 0x9fff, U_CJK); /* CJK Ideographs */ + SetCharacterClassRange(0xac00, 0xd7a3, U_HAN); /* Hangul Syllables */ + SetCharacterClassRange(0xf900, 0xfaff, U_CJK); /* CJK Ideographs */ + SetCharacterClassRange(0xfe30, 0xfe6b, IDENT); /* punctuation forms */ + SetCharacterClassRange(0xff00, 0xff0f, IDENT); /* half/fullwidth ASCII */ + SetCharacterClassRange(0xff1a, 0xff20, IDENT); /* half/fullwidth ASCII */ + SetCharacterClassRange(0xff3b, 0xff40, IDENT); /* half/fullwidth ASCII */ + SetCharacterClassRange(0xff5b, 0xff64, IDENT); /* half/fullwidth ASCII */ + + TRACE(("}} init_classtab\n")); + return; +} + +int +CharacterClass(int c) +{ + int i, cclass = IDENT; + + for (i = classtab[0].first; i <= classtab[0].last; i++) + if (classtab[i].first <= c && classtab[i].last >= c) + cclass = classtab[i].cclass; + + if (cclass < 0) + cclass = c; + + return cclass; +} + +#if OPT_REPORT_CCLASS +#define charFormat(code) ((code) > 255 ? "0x%04X" : "%d") +static const char * +class_name(Classes code) +{ + static char buffer[80]; + const char *result = "?"; + switch (code) { + case ALNUM: + result = "ALNUM"; + break; + case BLANK: + result = "BLANK"; + break; + case CNTRL: + result = "CNTRL"; + break; + case OTHER: + result = "OTHER"; + break; + case IDENT: + result = "IDENT"; + break; + case U_SUP: + result = "superscript"; + break; + case U_SUB: + result = "subscript"; + break; + case U_CJK: + result = "CJK Ideographs"; + break; + case U_HIR: + result = "Hiragana"; + break; + case U_KAT: + result = "Katakana"; + break; + case U_HAN: + result = "Hangul Syllables"; + break; + default: + sprintf(buffer, charFormat(code), code); + result = buffer; + break; + } + return result; +} + +/* + * Special convention for classtab[0]: + * - classtab[0].cclass is the allocated number of entries in classtab + * - classtab[0].first = 1 (first used entry in classtab) + * - classtab[0].last is the last used entry in classtab + */ + +int +SetCharacterClassRange(int low, int high, int value) +{ + TRACE(("...SetCharacterClassRange (U+%04X .. U+%04X) = %s\n", + low, high, class_name(value))); + + if (high < low) + return -1; /* nothing to do */ + + /* make sure we have at least one free entry left at table end */ + if (classtab[0].last > classtab[0].cclass - 2) { + classtab[0].cclass += 5 + classtab[0].cclass / 4; + classtab = TypeRealloc(struct classentry, + (unsigned) classtab[0].cclass, classtab); + if (!classtab) + abort(); + } + + /* simply append new interval to end of interval array */ + classtab[0].last++; + classtab[classtab[0].last].first = low; + classtab[classtab[0].last].last = high; + classtab[classtab[0].last].cclass = value; + + return 0; +} + +void +report_wide_char_class(void) +{ + static const Classes known_classes[] = + {IDENT, ALNUM, CNTRL, BLANK, U_SUP, U_SUB, U_HIR, U_KAT, U_CJK, U_HAN}; + int i; + + printf("\n"); + printf("Unicode charClass data uses the last match\n"); + printf("from these overlapping intervals of character codes:\n"); + for (i = classtab[0].first; i <= classtab[0].last; i++) { + printf("\tU+%04X .. U+%04X %s\n", + classtab[i].first, + classtab[i].last, + class_name(classtab[i].cclass)); + } + printf("\n"); + printf("These class-names are used internally (the first character code in a class):\n"); + for (i = 0; i < (int) XtNumber(known_classes); ++i) { + printf("\t"); + printf(charFormat(known_classes[i]), known_classes[i]); + printf(" = %s\n", class_name(known_classes[i])); + } +} +#endif /* OPT_REPORT_CCLASS */ + +#ifdef NO_LEAKS +void +noleaks_CharacterClass(void) +{ + if (classtab != 0) { + free(classtab); + classtab = 0; + } +} +#endif +#endif /* OPT_WIDE_CHARS */ + +#ifdef TEST_DRIVER +#if OPT_WIDE_CHARS +static void +usage(void) +{ + static const char *msg[] = + { + "Usage: test_charclass [options] [c1[-c1b] [c2-[c2b] [...]]]", + "", + "Options:", + " -a show all data", + " -s show only summary", + " -v verbose" + }; + size_t n; + for (n = 0; n < sizeof(msg) / sizeof(msg[0]); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + exit(EXIT_FAILURE); +} + +static int +expected_class(int wch) +{ + int result = wch; + wint_t ch = (wint_t) wch; + if (ch == '\0' || ch == '\t') { + result = BLANK; + } else if (iswcntrl(ch)) { + result = CNTRL; + } else if (iswspace(ch)) { + result = BLANK; + } else if (ch < 127) { + if (isalnum(ch) || ch == '_') { + result = ALNUM; + } + } else if (ch == 170 || ch == 181 || ch == 186) { + ; + } else if (iswalnum(ch)) { + result = ALNUM; + } + return result; +} + +static int +show_cclass_range(int lo, int hi) +{ + int cclass = CharacterClass(lo); + int ident = (cclass == lo); + int more = 0; + if (ident) { + int ch; + for (ch = lo + 1; ch <= hi; ch++) { + if (CharacterClass(ch) != ch) { + ident = 0; + break; + } + } + if (ident && (hi < 255)) { + ch = hi + 1; + if (CharacterClass(ch) == ch) { + if (ch >= 255 || CharacterClass(ch + 1) != ch) { + more = 1; + } + } + } + } + if (!more) { + if (lo == hi) { + printf("\t%d", lo); + } else { + printf("\t%d-%d", lo, hi); + } + if (!ident) + printf(":%d", cclass); + if (hi < 255) + printf(", \\"); + printf("\n"); + } + return !more; +} + +static void +report_resource(int first, int last) +{ + int class_p; + int ch; + int dh; + + class_p = CharacterClass(dh = first); + for (ch = first; ch < last; ++ch) { + int class_c = CharacterClass(ch); + if (class_c != class_p) { + if (show_cclass_range(dh, ch - 1)) { + dh = ch; + class_p = class_c; + } + } + } + if (dh < last - 1) { + show_cclass_range(dh, last - 1); + } +} + +static int +decode_one(const char *source, char **target) +{ + int result = -1; + long check; + int radix = 0; + if ((source[0] == 'u' || source[0] == 'U') && source[1] == '+') { + source += 2; + radix = 16; + } + check = strtol(source, target, radix); + if (*target != NULL && *target != source) + result = (int) check; + return result; +} + +static int +decode_range(const char *source, int *lo, int *hi) +{ + int result = 0; + char *after1; + char *after2; + if ((*lo = decode_one(source, &after1)) >= 0) { + after1 += strspn(after1, ":-.\t "); + if ((*hi = decode_one(after1, &after2)) < 0) { + *hi = *lo; + } + result = 1; + } + return result; +} + +static void +do_range(const char *source) +{ + int lo, hi; + if (decode_range(source, &lo, &hi)) { + if (opt_all) { + while (lo <= hi) { + int other_rc = CharacterClass(lo); + if (!opt_quiet) + printf("U+%04X\t%s\n", lo, class_name(other_rc)); + ++lo; + } + } else if (opt_check) { + while (lo <= hi) { + int expect = expected_class(lo); + int actual = CharacterClass(lo); + if (actual != expect) + printf("U+%04X\t%s ->%s\n", lo, + class_name(expect), + class_name(actual)); + ++lo; + } + } else { + printf("\"charClass\" resource for [%d..%d]:\n", lo, hi); + report_resource(lo, hi + 1); + } + } +} +#endif /* OPT_WIDE_CHARS */ + +/* + * TODO: add option to show do_range in hex + */ +int +main(int argc, char **argv ENVP_ARG) +{ +#if OPT_WIDE_CHARS + int ch; +#endif + + (void) argc; + (void) argv; + +#if OPT_WIDE_CHARS + setlocale(LC_ALL, ""); + while ((ch = getopt(argc, argv, "acsv")) != -1) { + switch (ch) { + case 'a': + opt_all = 1; + break; + case 'c': + opt_check = 1; + break; + case 's': + opt_quiet = 1; + break; + case 'v': + opt_v = 1; + break; + default: + usage(); + } + } + init_classtab(); + + if (optind >= argc) { + do_range("0-255"); + } else { + while (optind < argc) { + do_range(argv[optind++]); + } + } + report_wide_char_class(); +#else + printf("wide-character support is not configured\n"); +#endif /* OPT_WIDE_CHARS */ + return 0; +} +#endif /* TEST_DRIVER */ diff --git a/ports/xterm/xterm-359/charclass.h b/ports/xterm/xterm-359/charclass.h new file mode 100644 index 0000000..34dca08 --- /dev/null +++ b/ports/xterm/xterm-359/charclass.h @@ -0,0 +1,23 @@ +/* $XTermId: charclass.h,v 1.8 2020/01/18 18:29:41 tom Exp $ */ + +/* $XFree86: xc/programs/xterm/charclass.h,v 1.3 2006/02/13 01:14:58 dickey Exp $ */ + +#ifndef CHARCLASS_H +#define CHARCLASS_H + +extern void init_classtab(void); +/* initialise the table. needs calling before either of the + others. */ + +extern int SetCharacterClassRange(int low, int high, int value); +extern int CharacterClass(int c); + +#if OPT_REPORT_CCLASS +extern void report_wide_char_class(void); +#endif + +#ifdef NO_LEAKS +extern void noleaks_CharacterClass(void); +#endif + +#endif diff --git a/ports/xterm/xterm-359/charclass.o b/ports/xterm/xterm-359/charclass.o new file mode 100644 index 0000000000000000000000000000000000000000..bb081dec4a914dc02b9090e076e3ef9c25be66f4 GIT binary patch literal 20696 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 +#include + +#include +#include +#include +#include +#include +#include + +#if OPT_INPUT_METHOD + +#if defined(HAVE_LIB_XAW) +#include +#elif defined(HAVE_LIB_XAW3D) +#include +#elif defined(HAVE_LIB_XAW3DXFT) +#include +#elif defined(HAVE_LIB_NEXTAW) +#include +#elif defined(HAVE_LIB_XAWPLUS) +#include +#endif + +#endif + +#if OPT_WIDE_CHARS +#include +#include +#include +#ifdef HAVE_LANGINFO_CODESET +#include +#endif +#endif + +#if USE_DOUBLE_BUFFER +#include +#endif + +#include +#include +#include + +#if defined(HAVE_SCHED_YIELD) +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef NO_LEAKS +#include +#endif + +typedef int (*BitFunc) (unsigned * /* p */ , + unsigned /* mask */ ); + +static IChar doinput(XtermWidget /* xw */ ); +static int set_character_class(char * /*s */ ); +static void FromAlternate(XtermWidget /* xw */ ); +static void ReallyReset(XtermWidget /* xw */ , + Bool /* full */ , + Bool /* saved */ ); +static void RequestResize(XtermWidget /* xw */ , + int /* rows */ , + int /* cols */ , + Bool /* text */ ); +static void SwitchBufs(XtermWidget /* xw */ , + int /* toBuf */ , + Bool /* clearFirst */ ); +static void ToAlternate(XtermWidget /* xw */ , + Bool /* clearFirst */ ); +static void ansi_modes(XtermWidget /* xw */ , + BitFunc /* func */ ); +static int bitclr(unsigned *p, unsigned mask); +static int bitcpy(unsigned *p, unsigned q, unsigned mask); +static int bitset(unsigned *p, unsigned mask); +static void dpmodes(XtermWidget /* xw */ , + BitFunc /* func */ ); +static void restoremodes(XtermWidget /* xw */ ); +static void savemodes(XtermWidget /* xw */ ); +static void window_ops(XtermWidget /* xw */ ); + +#if OPT_BLINK_CURS || OPT_BLINK_TEXT +#define SettableCursorBlink(screen) \ + (((screen)->cursor_blink != cbAlways) && \ + ((screen)->cursor_blink != cbNever)) +#define UpdateCursorBlink(xw) \ + SetCursorBlink(xw, TScreenOf(xw)->cursor_blink) +static void SetCursorBlink(XtermWidget /* xw */ , + BlinkOps /* enable */ ); +static void HandleBlinking(XtPointer /* closure */ , + XtIntervalId * /* id */ ); +static void StartBlinking(XtermWidget /* xw */ ); +static void StopBlinking(XtermWidget /* xw */ ); +#else +#define StartBlinking(xw) /* nothing */ +#define StopBlinking(xw) /* nothing */ +#endif + +#ifndef NO_ACTIVE_ICON +static Boolean discount_frame_extents(XtermWidget /* xw */ , + int * /* height */ , + int * /* width */ ); +#else +#define discount_frame_extents(xw, height, width) False +#endif + +#if OPT_INPUT_METHOD +static void PreeditPosition(XtermWidget /* xw */ ); +#endif + +#define DEFAULT -1 +#define BELLSUPPRESSMSEC 200 + +static ANSI reply; +static PARAMS parms; + +#define nparam parms.count + +#define InitParams() init_params() +#define GetParam(n) parms.params[(n)] +#define SetParam(n,v) parms.params[(n)] = v +#define ParamPair(n) nparam - (n), parms.params + (n) + +static jmp_buf vtjmpbuf; + +/* event handlers */ +static void HandleBell PROTO_XT_ACTIONS_ARGS; +static void HandleIgnore PROTO_XT_ACTIONS_ARGS; +static void HandleKeymapChange PROTO_XT_ACTIONS_ARGS; +static void HandleVisualBell PROTO_XT_ACTIONS_ARGS; +#if HANDLE_STRUCT_NOTIFY +static void HandleStructNotify PROTO_XT_EV_HANDLER_ARGS; +#endif + +/* + * NOTE: VTInitialize zeros out the entire ".screen" component of the + * XtermWidget, so make sure to add an assignment statement in VTInitialize() + * for each new ".screen" field added to this resource list. + */ + +/* Defaults */ +#if OPT_ISO_COLORS + +/* + * If we default to colorMode enabled, compile-in defaults for the ANSI colors. + */ +#if DFT_COLORMODE +#define DFT_COLOR(name) name +#else +#define DFT_COLOR(name) XtDefaultForeground +#endif +#endif + +static char _Font_Selected_[] = "yes"; /* string is arbitrary */ + +static const char *defaultTranslations; +/* *INDENT-OFF* */ +static XtActionsRec actionsList[] = { + { "allow-bold-fonts", HandleAllowBoldFonts }, + { "allow-send-events", HandleAllowSends }, + { "bell", HandleBell }, + { "clear-saved-lines", HandleClearSavedLines }, + { "copy-selection", HandleCopySelection }, + { "create-menu", HandleCreateMenu }, + { "delete-is-del", HandleDeleteIsDEL }, + { "dired-button", DiredButton }, + { "hard-reset", HandleHardReset }, + { "ignore", HandleIgnore }, + { "insert", HandleKeyPressed }, /* alias for insert-seven-bit */ + { "insert-eight-bit", HandleEightBitKeyPressed }, + { "insert-selection", HandleInsertSelection }, + { "insert-seven-bit", HandleKeyPressed }, + { "interpret", HandleInterpret }, + { "keymap", HandleKeymapChange }, + { "popup-menu", HandlePopupMenu }, + { "print", HandlePrintScreen }, + { "print-everything", HandlePrintEverything }, + { "print-redir", HandlePrintControlMode }, + { "quit", HandleQuit }, + { "redraw", HandleRedraw }, + { "scroll-back", HandleScrollBack }, + { "scroll-forw", HandleScrollForward }, + { "scroll-to", HandleScrollTo }, + { "secure", HandleSecure }, + { "select-cursor-end", HandleKeyboardSelectEnd }, + { "select-cursor-extend", HandleKeyboardSelectExtend }, + { "select-cursor-start", HandleKeyboardSelectStart }, + { "select-end", HandleSelectEnd }, + { "select-extend", HandleSelectExtend }, + { "select-set", HandleSelectSet }, + { "select-start", HandleSelectStart }, + { "send-signal", HandleSendSignal }, + { "set-8-bit-control", Handle8BitControl }, + { "set-allow132", HandleAllow132 }, + { "set-altscreen", HandleAltScreen }, + { "set-appcursor", HandleAppCursor }, + { "set-appkeypad", HandleAppKeypad }, + { "set-autolinefeed", HandleAutoLineFeed }, + { "set-autowrap", HandleAutoWrap }, + { "set-backarrow", HandleBackarrow }, + { "set-bellIsUrgent", HandleBellIsUrgent }, + { "set-cursesemul", HandleCursesEmul }, + { "set-jumpscroll", HandleJumpscroll }, + { "set-keep-clipboard", HandleKeepClipboard }, + { "set-keep-selection", HandleKeepSelection }, + { "set-marginbell", HandleMarginBell }, + { "set-old-function-keys", HandleOldFunctionKeys }, + { "set-pop-on-bell", HandleSetPopOnBell }, + { "set-reverse-video", HandleReverseVideo }, + { "set-reversewrap", HandleReverseWrap }, + { "set-scroll-on-key", HandleScrollKey }, + { "set-scroll-on-tty-output", HandleScrollTtyOutput }, + { "set-scrollbar", HandleScrollbar }, + { "set-select", HandleSetSelect }, + { "set-sun-keyboard", HandleSunKeyboard }, + { "set-titeInhibit", HandleTiteInhibit }, + { "set-visual-bell", HandleSetVisualBell }, + { "set-vt-font", HandleSetFont }, + { "soft-reset", HandleSoftReset }, + { "start-cursor-extend", HandleKeyboardStartExtend }, + { "start-extend", HandleStartExtend }, + { "string", HandleStringEvent }, + { "vi-button", ViButton }, + { "visual-bell", HandleVisualBell }, +#ifdef ALLOWLOGGING + { "set-logging", HandleLogging }, +#endif +#if OPT_ALLOW_XXX_OPS + { "allow-color-ops", HandleAllowColorOps }, + { "allow-font-ops", HandleAllowFontOps }, + { "allow-mouse-ops", HandleAllowMouseOps }, + { "allow-tcap-ops", HandleAllowTcapOps }, + { "allow-title-ops", HandleAllowTitleOps }, + { "allow-window-ops", HandleAllowWindowOps }, +#endif +#if OPT_BLINK_CURS + { "set-cursorblink", HandleCursorBlink }, +#endif +#if OPT_BOX_CHARS + { "set-font-linedrawing", HandleFontBoxChars }, + { "set-font-packed", HandleFontPacked }, +#endif +#if OPT_DABBREV + { "dabbrev-expand", HandleDabbrevExpand }, +#endif +#if OPT_DEC_CHRSET + { "set-font-doublesize", HandleFontDoublesize }, +#endif +#if OPT_DEC_SOFTFONT + { "set-font-loading", HandleFontLoading }, +#endif +#if OPT_SCREEN_DUMPS + { "dump-html", HandleDumpHtml }, + { "dump-svg", HandleDumpSvg }, +#endif +#if OPT_EXEC_XTERM + { "spawn-new-terminal", HandleSpawnTerminal }, +#endif +#if OPT_HP_FUNC_KEYS + { "set-hp-function-keys", HandleHpFunctionKeys }, +#endif +#if OPT_LOAD_VTFONTS + { "load-vt-fonts", HandleLoadVTFonts }, +#endif +#if OPT_MAXIMIZE + { "deiconify", HandleDeIconify }, + { "fullscreen", HandleFullscreen }, + { "iconify", HandleIconify }, + { "maximize", HandleMaximize }, + { "restore", HandleRestoreSize }, +#endif +#if OPT_NUM_LOCK + { "alt-sends-escape", HandleAltEsc }, + { "meta-sends-escape", HandleMetaEsc }, + { "set-num-lock", HandleNumLock }, +#endif +#ifdef OPT_PRINT_ON_EXIT + { "print-immediate", HandlePrintImmediate }, + { "print-on-error", HandlePrintOnError }, +#endif +#if OPT_READLINE + { "readline-button", ReadLineButton }, +#endif +#if OPT_RENDERFONT + { "set-render-font", HandleRenderFont }, +#endif +#if OPT_SCO_FUNC_KEYS + { "set-sco-function-keys", HandleScoFunctionKeys }, +#endif +#if OPT_SCROLL_LOCK + { "scroll-lock", HandleScrollLock }, +#endif +#if OPT_SELECTION_OPS + { "exec-formatted", HandleExecFormatted }, + { "exec-selectable", HandleExecSelectable }, + { "insert-formatted", HandleInsertFormatted }, + { "insert-selectable", HandleInsertSelectable }, +#endif +#if OPT_SHIFT_FONTS + { "larger-vt-font", HandleLargerFont }, + { "smaller-vt-font", HandleSmallerFont }, +#endif +#if OPT_SIXEL_GRAPHICS + { "set-sixel-scrolling", HandleSixelScrolling }, +#endif +#if OPT_GRAPHICS + { "set-private-colors", HandleSetPrivateColorRegisters }, +#endif +#if OPT_SUN_FUNC_KEYS + { "set-sun-function-keys", HandleSunFunctionKeys }, +#endif +#if OPT_TEK4014 + { "set-terminal-type", HandleSetTerminalType }, + { "set-visibility", HandleVisibility }, + { "set-tek-text", HandleSetTekText }, + { "tek-page", HandleTekPage }, + { "tek-reset", HandleTekReset }, + { "tek-copy", HandleTekCopy }, +#endif +#if OPT_TOOLBAR + { "set-toolbar", HandleToolbar }, +#endif +#if OPT_WIDE_CHARS + { "set-utf8-mode", HandleUTF8Mode }, + { "set-utf8-fonts", HandleUTF8Fonts }, + { "set-utf8-title", HandleUTF8Title }, +#endif +}; +/* *INDENT-ON* */ + +#define SPS screen.printer_state + +static XtResource xterm_resources[] = +{ + Bres(XtNallowPasteControls, XtCAllowPasteControls, + screen.allowPasteControl0, False), + Bres(XtNallowSendEvents, XtCAllowSendEvents, screen.allowSendEvent0, False), + Bres(XtNallowColorOps, XtCAllowColorOps, screen.allowColorOp0, DEF_ALLOW_COLOR), + Bres(XtNallowFontOps, XtCAllowFontOps, screen.allowFontOp0, DEF_ALLOW_FONT), + Bres(XtNallowMouseOps, XtCAllowMouseOps, screen.allowMouseOp0, DEF_ALLOW_MOUSE), + Bres(XtNallowTcapOps, XtCAllowTcapOps, screen.allowTcapOp0, DEF_ALLOW_TCAP), + Bres(XtNallowTitleOps, XtCAllowTitleOps, screen.allowTitleOp0, DEF_ALLOW_TITLE), + Bres(XtNallowWindowOps, XtCAllowWindowOps, screen.allowWindowOp0, DEF_ALLOW_WINDOW), + Bres(XtNaltIsNotMeta, XtCAltIsNotMeta, screen.alt_is_not_meta, False), + Bres(XtNaltSendsEscape, XtCAltSendsEscape, screen.alt_sends_esc, DEF_ALT_SENDS_ESC), + Bres(XtNallowBoldFonts, XtCAllowBoldFonts, screen.allowBoldFonts, True), + Bres(XtNalwaysBoldMode, XtCAlwaysBoldMode, screen.always_bold_mode, False), + Bres(XtNalwaysHighlight, XtCAlwaysHighlight, screen.always_highlight, False), + Bres(XtNappcursorDefault, XtCAppcursorDefault, misc.appcursorDefault, False), + Bres(XtNappkeypadDefault, XtCAppkeypadDefault, misc.appkeypadDefault, False), + Bres(XtNalternateScroll, XtCScrollCond, screen.alternateScroll, False), + Bres(XtNautoWrap, XtCAutoWrap, misc.autoWrap, True), + Bres(XtNawaitInput, XtCAwaitInput, screen.awaitInput, False), + Bres(XtNfreeBoldBox, XtCFreeBoldBox, screen.free_bold_box, False), + Bres(XtNbackarrowKey, XtCBackarrowKey, screen.backarrow_key, DEF_BACKARO_BS), + Bres(XtNbellIsUrgent, XtCBellIsUrgent, screen.bellIsUrgent, False), + Bres(XtNbellOnReset, XtCBellOnReset, screen.bellOnReset, True), + Bres(XtNboldMode, XtCBoldMode, screen.bold_mode, True), + Bres(XtNbrokenSelections, XtCBrokenSelections, screen.brokenSelections, False), + Bres(XtNc132, XtCC132, screen.c132, False), + Bres(XtNcdXtraScroll, XtCCdXtraScroll, misc.cdXtraScroll, False), + Bres(XtNcolorInnerBorder, XtCColorInnerBorder, misc.color_inner_border, False), + Bres(XtNcurses, XtCCurses, screen.curses, False), + Bres(XtNcutNewline, XtCCutNewline, screen.cutNewline, True), + Bres(XtNcutToBeginningOfLine, XtCCutToBeginningOfLine, + screen.cutToBeginningOfLine, True), + Bres(XtNdeleteIsDEL, XtCDeleteIsDEL, screen.delete_is_del, DEFDELETE_DEL), + Bres(XtNdynamicColors, XtCDynamicColors, misc.dynamicColors, True), + Bres(XtNeightBitControl, XtCEightBitControl, screen.control_eight_bits, False), + Bres(XtNeightBitInput, XtCEightBitInput, screen.input_eight_bits, True), + Bres(XtNeightBitOutput, XtCEightBitOutput, screen.output_eight_bits, True), + Bres(XtNeraseSavedLines, XtCEraseSavedLines, screen.eraseSavedLines0, True), + Bres(XtNhighlightSelection, XtCHighlightSelection, + screen.highlight_selection, False), + Bres(XtNshowWrapMarks, XtCShowWrapMarks, screen.show_wrap_marks, False), + Bres(XtNhpLowerleftBugCompat, XtCHpLowerleftBugCompat, screen.hp_ll_bc, False), + Bres(XtNi18nSelections, XtCI18nSelections, screen.i18nSelections, True), + Bres(XtNfastScroll, XtCFastScroll, screen.fastscroll, False), + Bres(XtNjumpScroll, XtCJumpScroll, screen.jumpscroll, True), + Bres(XtNkeepClipboard, XtCKeepClipboard, screen.keepClipboard, False), + Bres(XtNkeepSelection, XtCKeepSelection, screen.keepSelection, True), + Bres(XtNloginShell, XtCLoginShell, misc.login_shell, False), + Bres(XtNmarginBell, XtCMarginBell, screen.marginbell, False), + Bres(XtNmetaSendsEscape, XtCMetaSendsEscape, screen.meta_sends_esc, DEF_META_SENDS_ESC), + Bres(XtNmultiScroll, XtCMultiScroll, screen.multiscroll, False), + Bres(XtNoldXtermFKeys, XtCOldXtermFKeys, screen.old_fkeys, False), + Bres(XtNpopOnBell, XtCPopOnBell, screen.poponbell, False), + Bres(XtNprinterAutoClose, XtCPrinterAutoClose, SPS.printer_autoclose, False), + Bres(XtNprinterExtent, XtCPrinterExtent, SPS.printer_extent, False), + Bres(XtNprinterFormFeed, XtCPrinterFormFeed, SPS.printer_formfeed, False), + Bres(XtNprinterNewLine, XtCPrinterNewLine, SPS.printer_newline, True), + Bres(XtNquietGrab, XtCQuietGrab, screen.quiet_grab, False), + Bres(XtNreverseVideo, XtCReverseVideo, misc.re_verse, False), + Bres(XtNreverseWrap, XtCReverseWrap, misc.reverseWrap, False), + Bres(XtNscrollBar, XtCScrollBar, misc.scrollbar, False), + Bres(XtNscrollKey, XtCScrollCond, screen.scrollkey, False), + Bres(XtNscrollTtyOutput, XtCScrollCond, screen.scrollttyoutput, True), + Bres(XtNselectToClipboard, XtCSelectToClipboard, + screen.selectToClipboard, False), + Bres(XtNsignalInhibit, XtCSignalInhibit, misc.signalInhibit, False), + Bres(XtNtiteInhibit, XtCTiteInhibit, misc.titeInhibit, False), + Bres(XtNtiXtraScroll, XtCTiXtraScroll, misc.tiXtraScroll, False), + Bres(XtNtrimSelection, XtCTrimSelection, screen.trim_selection, False), + Bres(XtNunderLine, XtCUnderLine, screen.underline, True), + Bres(XtNvisualBell, XtCVisualBell, screen.visualbell, False), + Bres(XtNvisualBellLine, XtCVisualBellLine, screen.flash_line, False), + + Dres(XtNscaleHeight, XtCScaleHeight, screen.scale_height, "1.0"), + + Ires(XtNbellSuppressTime, XtCBellSuppressTime, screen.bellSuppressTime, BELLSUPPRESSMSEC), + Ires(XtNfontWarnings, XtCFontWarnings, misc.fontWarnings, fwResource), + Ires(XtNinternalBorder, XtCBorderWidth, screen.border, DEFBORDER), + Ires(XtNlimitResize, XtCLimitResize, misc.limit_resize, 1), + Ires(XtNlimitResponse, XtCLimitResponse, screen.unparse_max, DEF_LIMIT_RESPONSE), + Ires(XtNmultiClickTime, XtCMultiClickTime, screen.multiClickTime, MULTICLICKTIME), + Ires(XtNnMarginBell, XtCColumn, screen.nmarginbell, N_MARGINBELL), + Ires(XtNpointerMode, XtCPointerMode, screen.pointer_mode, DEF_POINTER_MODE), + Ires(XtNprinterControlMode, XtCPrinterControlMode, + SPS.printer_controlmode, 0), + Ires(XtNtitleModes, XtCTitleModes, screen.title_modes, DEF_TITLE_MODES), + Ires(XtNnextEventDelay, XtCNextEventDelay, screen.nextEventDelay, 1), + Ires(XtNvisualBellDelay, XtCVisualBellDelay, screen.visualBellDelay, 100), + Ires(XtNsaveLines, XtCSaveLines, screen.savelines, DEF_SAVE_LINES), + Ires(XtNscrollBarBorder, XtCScrollBarBorder, screen.scrollBarBorder, 1), + Ires(XtNscrollLines, XtCScrollLines, screen.scrolllines, DEF_SCROLL_LINES), + + Sres(XtNinitialFont, XtCInitialFont, screen.initial_font, NULL), + Sres(XtNfont1, XtCFont1, screen.MenuFontName(fontMenu_font1), NULL), + Sres(XtNfont2, XtCFont2, screen.MenuFontName(fontMenu_font2), NULL), + Sres(XtNfont3, XtCFont3, screen.MenuFontName(fontMenu_font3), NULL), + Sres(XtNfont4, XtCFont4, screen.MenuFontName(fontMenu_font4), NULL), + Sres(XtNfont5, XtCFont5, screen.MenuFontName(fontMenu_font5), NULL), + Sres(XtNfont6, XtCFont6, screen.MenuFontName(fontMenu_font6), NULL), + + Sres(XtNanswerbackString, XtCAnswerbackString, screen.answer_back, ""), + Sres(XtNboldFont, XtCBoldFont, misc.default_font.f_b, DEFBOLDFONT), + Sres(XtNcharClass, XtCCharClass, screen.charClass, NULL), + Sres(XtNdecTerminalID, XtCDecTerminalID, screen.term_id, DFT_DECID), + Sres(XtNdefaultString, XtCDefaultString, screen.default_string, "#"), + Sres(XtNdisallowedColorOps, XtCDisallowedColorOps, + screen.disallowedColorOps, DEF_DISALLOWED_COLOR), + Sres(XtNdisallowedFontOps, XtCDisallowedFontOps, + screen.disallowedFontOps, DEF_DISALLOWED_FONT), + Sres(XtNdisallowedMouseOps, XtCDisallowedMouseOps, + screen.disallowedMouseOps, DEF_DISALLOWED_MOUSE), + Sres(XtNdisallowedPasteControls, XtCDisallowedPasteControls, + screen.disallowedPasteControls, DEF_DISALLOWED_PASTE_CONTROLS), + Sres(XtNdisallowedTcapOps, XtCDisallowedTcapOps, + screen.disallowedTcapOps, DEF_DISALLOWED_TCAP), + Sres(XtNdisallowedWindowOps, XtCDisallowedWindowOps, + screen.disallowedWinOps, DEF_DISALLOWED_WINDOW), + Sres(XtNeightBitMeta, XtCEightBitMeta, screen.eight_bit_meta_s, DEF_8BIT_META), + Sres(XtNeightBitSelectTypes, XtCEightBitSelectTypes, + screen.eightbit_select_types, NULL), + Sres(XtNfont, XtCFont, misc.default_font.f_n, DEFFONT), + Sres(XtNgeometry, XtCGeometry, misc.geo_metry, NULL), + Sres(XtNkeyboardDialect, XtCKeyboardDialect, screen.keyboard_dialect, DFT_KBD_DIALECT), + Sres(XtNprinterCommand, XtCPrinterCommand, SPS.printer_command, ""), + Sres(XtNtekGeometry, XtCGeometry, misc.T_geometry, NULL), + + Tres(XtNcursorColor, XtCCursorColor, TEXT_CURSOR, XtDefaultForeground), + Tres(XtNforeground, XtCForeground, TEXT_FG, XtDefaultForeground), + Tres(XtNpointerColor, XtCPointerColor, MOUSE_FG, XtDefaultForeground), + Tres(XtNbackground, XtCBackground, TEXT_BG, XtDefaultBackground), + Tres(XtNpointerColorBackground, XtCBackground, MOUSE_BG, XtDefaultBackground), + + {XtNresizeGravity, XtCResizeGravity, XtRGravity, sizeof(XtGravity), + XtOffsetOf(XtermWidgetRec, misc.resizeGravity), + XtRImmediate, (XtPointer) SouthWestGravity}, + + {XtNpointerShape, XtCCursor, XtRCursor, sizeof(Cursor), + XtOffsetOf(XtermWidgetRec, screen.pointer_cursor), + XtRString, (XtPointer) "xterm"}, + +#ifdef ALLOWLOGGING + Bres(XtNlogInhibit, XtCLogInhibit, misc.logInhibit, False), + Bres(XtNlogging, XtCLogging, misc.log_on, False), + Sres(XtNlogFile, XtCLogfile, screen.logfile, NULL), +#endif + +#ifndef NO_ACTIVE_ICON + Sres("activeIcon", "ActiveIcon", misc.active_icon_s, "default"), + Ires("iconBorderWidth", XtCBorderWidth, misc.icon_border_width, 2), + Sres("iconFont", "IconFont", screen.icon_fontname, "nil2"), + Cres("iconBorderColor", XtCBorderColor, misc.icon_border_pixel, XtDefaultBackground), +#endif /* NO_ACTIVE_ICON */ + +#if OPT_BLINK_CURS + Bres(XtNcursorBlinkXOR, XtCCursorBlinkXOR, screen.cursor_blink_xor, True), + Sres(XtNcursorBlink, XtCCursorBlink, screen.cursor_blink_s, "false"), +#endif + Bres(XtNcursorUnderLine, XtCCursorUnderLine, screen.cursor_underline, False), + +#if OPT_BLINK_TEXT + Bres(XtNshowBlinkAsBold, XtCCursorBlink, screen.blink_as_bold, DEFBLINKASBOLD), +#endif + +#if OPT_BLINK_CURS || OPT_BLINK_TEXT + Ires(XtNcursorOnTime, XtCCursorOnTime, screen.blink_on, 600), + Ires(XtNcursorOffTime, XtCCursorOffTime, screen.blink_off, 300), +#endif + +#if OPT_BOX_CHARS + Bres(XtNforceBoxChars, XtCForceBoxChars, screen.force_box_chars, False), + Bres(XtNforcePackedFont, XtCForcePackedFont, screen.force_packed, True), + Bres(XtNshowMissingGlyphs, XtCShowMissingGlyphs, screen.force_all_chars, False), + Bres(XtNassumeAllChars, XtCAssumeAllChars, screen.assume_all_chars, True), +#endif + +#if OPT_BROKEN_OSC + Bres(XtNbrokenLinuxOSC, XtCBrokenLinuxOSC, screen.brokenLinuxOSC, True), +#endif + +#if OPT_BROKEN_ST + Bres(XtNbrokenStringTerm, XtCBrokenStringTerm, screen.brokenStringTerm, False), +#endif + +#if OPT_C1_PRINT + Bres(XtNallowC1Printable, XtCAllowC1Printable, screen.c1_printable, False), +#endif + +#if OPT_CLIP_BOLD + Bres(XtNuseClipping, XtCUseClipping, screen.use_clipping, True), + Bres(XtNuseBorderClipping, XtCUseBorderClipping, + screen.use_border_clipping, False), +#endif + +#if OPT_DEC_CHRSET + Bres(XtNfontDoublesize, XtCFontDoublesize, screen.font_doublesize, True), + Ires(XtNcacheDoublesize, XtCCacheDoublesize, screen.cache_doublesize, NUM_CHRSET), +#endif + +#if OPT_DEC_RECTOPS + Ires(XtNchecksumExtension, XtCChecksumExtension, screen.checksum_ext0, csDEC), +#endif + +#if OPT_HIGHLIGHT_COLOR + Tres(XtNhighlightColor, XtCHighlightColor, HIGHLIGHT_BG, XtDefaultForeground), + Tres(XtNhighlightTextColor, XtCHighlightTextColor, HIGHLIGHT_FG, XtDefaultBackground), + Bres(XtNhighlightReverse, XtCHighlightReverse, screen.hilite_reverse, True), + Bres(XtNhighlightColorMode, XtCHighlightColorMode, screen.hilite_color, Maybe), +#endif /* OPT_HIGHLIGHT_COLOR */ + +#if OPT_INPUT_METHOD + Bres(XtNopenIm, XtCOpenIm, misc.open_im, True), + Sres(XtNinputMethod, XtCInputMethod, misc.input_method, NULL), + Sres(XtNpreeditType, XtCPreeditType, misc.preedit_type, + "OverTheSpot,Root"), + Ires(XtNretryInputMethod, XtCRetryInputMethod, misc.retry_im, 3), +#endif + +#if OPT_ISO_COLORS + Bres(XtNboldColors, XtCColorMode, screen.boldColors, True), + Ires(XtNveryBoldColors, XtCVeryBoldColors, screen.veryBoldColors, 0), + Bres(XtNcolorMode, XtCColorMode, screen.colorMode, DFT_COLORMODE), + + Bres(XtNcolorAttrMode, XtCColorAttrMode, screen.colorAttrMode, False), + Bres(XtNcolorBDMode, XtCColorAttrMode, screen.colorBDMode, False), + Bres(XtNcolorBLMode, XtCColorAttrMode, screen.colorBLMode, False), + Bres(XtNcolorRVMode, XtCColorAttrMode, screen.colorRVMode, False), + Bres(XtNcolorULMode, XtCColorAttrMode, screen.colorULMode, False), + Bres(XtNitalicULMode, XtCColorAttrMode, screen.italicULMode, False), +#if OPT_WIDE_ATTRS + Bres(XtNcolorITMode, XtCColorAttrMode, screen.colorITMode, False), +#endif +#if OPT_DIRECT_COLOR + Bres(XtNdirectColor, XtCDirectColor, screen.direct_color, True), +#endif + + COLOR_RES("0", screen.Acolors[COLOR_0], DFT_COLOR("black")), + COLOR_RES("1", screen.Acolors[COLOR_1], DFT_COLOR("red3")), + COLOR_RES("2", screen.Acolors[COLOR_2], DFT_COLOR("green3")), + COLOR_RES("3", screen.Acolors[COLOR_3], DFT_COLOR("yellow3")), + COLOR_RES("4", screen.Acolors[COLOR_4], DFT_COLOR(DEF_COLOR4)), + COLOR_RES("5", screen.Acolors[COLOR_5], DFT_COLOR("magenta3")), + COLOR_RES("6", screen.Acolors[COLOR_6], DFT_COLOR("cyan3")), + COLOR_RES("7", screen.Acolors[COLOR_7], DFT_COLOR("gray90")), + COLOR_RES("8", screen.Acolors[COLOR_8], DFT_COLOR("gray50")), + COLOR_RES("9", screen.Acolors[COLOR_9], DFT_COLOR("red")), + COLOR_RES("10", screen.Acolors[COLOR_10], DFT_COLOR("green")), + COLOR_RES("11", screen.Acolors[COLOR_11], DFT_COLOR("yellow")), + COLOR_RES("12", screen.Acolors[COLOR_12], DFT_COLOR(DEF_COLOR12)), + COLOR_RES("13", screen.Acolors[COLOR_13], DFT_COLOR("magenta")), + COLOR_RES("14", screen.Acolors[COLOR_14], DFT_COLOR("cyan")), + COLOR_RES("15", screen.Acolors[COLOR_15], DFT_COLOR("white")), + COLOR_RES("BD", screen.Acolors[COLOR_BD], DFT_COLOR(XtDefaultForeground)), + COLOR_RES("BL", screen.Acolors[COLOR_BL], DFT_COLOR(XtDefaultForeground)), + COLOR_RES("UL", screen.Acolors[COLOR_UL], DFT_COLOR(XtDefaultForeground)), + COLOR_RES("RV", screen.Acolors[COLOR_RV], DFT_COLOR(XtDefaultForeground)), + +#if OPT_WIDE_ATTRS + COLOR_RES("IT", screen.Acolors[COLOR_IT], DFT_COLOR(XtDefaultForeground)), +#endif + +#if !OPT_COLOR_RES2 +#if OPT_256_COLORS +# include <256colres.h> +#elif OPT_88_COLORS +# include <88colres.h> +#endif +#endif /* !OPT_COLOR_RES2 */ + +#endif /* OPT_ISO_COLORS */ + + CLICK_RES("2", screen.onClick[1], "word"), + CLICK_RES("3", screen.onClick[2], "line"), + CLICK_RES("4", screen.onClick[3], 0), + CLICK_RES("5", screen.onClick[4], 0), + +#if OPT_MOD_FKEYS + Ires(XtNmodifyKeyboard, XtCModifyKeyboard, + keyboard.modify_1st.allow_keys, 0), + Ires(XtNmodifyCursorKeys, XtCModifyCursorKeys, + keyboard.modify_1st.cursor_keys, 2), + Ires(XtNmodifyFunctionKeys, XtCModifyFunctionKeys, + keyboard.modify_1st.function_keys, 2), + Ires(XtNmodifyKeypadKeys, XtCModifyKeypadKeys, + keyboard.modify_1st.keypad_keys, 0), + Ires(XtNmodifyOtherKeys, XtCModifyOtherKeys, + keyboard.modify_1st.other_keys, 0), + Ires(XtNmodifyStringKeys, XtCModifyStringKeys, + keyboard.modify_1st.string_keys, 0), + Ires(XtNformatOtherKeys, XtCFormatOtherKeys, + keyboard.format_keys, 0), +#endif + +#if OPT_NUM_LOCK + Bres(XtNalwaysUseMods, XtCAlwaysUseMods, misc.alwaysUseMods, False), + Bres(XtNnumLock, XtCNumLock, misc.real_NumLock, True), +#endif + +#if OPT_PRINT_COLORS + Ires(XtNprintAttributes, XtCPrintAttributes, SPS.print_attributes, 1), +#endif + +#if OPT_REGIS_GRAPHICS + Sres(XtNregisDefaultFont, XtCRegisDefaultFont, + screen.graphics_regis_default_font, ""), + Sres(XtNregisScreenSize, XtCRegisScreenSize, + screen.graphics_regis_screensize, "auto"), +#endif + +#if OPT_GRAPHICS + Sres(XtNdecGraphicsID, XtCDecGraphicsID, screen.graph_id, DFT_DECID), + Sres(XtNmaxGraphicSize, XtCMaxGraphicSize, screen.graphics_max_size, + "1000x1000"), +#endif + +#if OPT_SHIFT_FONTS + Bres(XtNshiftFonts, XtCShiftFonts, misc.shift_fonts, True), +#endif + +#if OPT_SIXEL_GRAPHICS + Bres(XtNsixelScrolling, XtCSixelScrolling, screen.sixel_scrolling, True), + Bres(XtNsixelScrollsRight, XtCSixelScrollsRight, + screen.sixel_scrolls_right, False), +#endif + +#if OPT_GRAPHICS + Ires(XtNnumColorRegisters, XtCNumColorRegisters, + screen.numcolorregisters, 0), + Bres(XtNprivateColorRegisters, XtCPrivateColorRegisters, + screen.privatecolorregisters, True), +#endif + +#if OPT_SUNPC_KBD + Ires(XtNctrlFKeys, XtCCtrlFKeys, misc.ctrl_fkeys, 10), +#endif + +#if OPT_TEK4014 + Bres(XtNtekInhibit, XtCTekInhibit, misc.tekInhibit, False), + Bres(XtNtekSmall, XtCTekSmall, misc.tekSmall, False), + Bres(XtNtekStartup, XtCTekStartup, misc.TekEmu, False), +#endif + +#if OPT_TOOLBAR + Wres(XtNmenuBar, XtCMenuBar, VT100_TB_INFO(menu_bar), 0), + Ires(XtNmenuHeight, XtCMenuHeight, VT100_TB_INFO(menu_height), 25), +#endif + +#if OPT_WIDE_CHARS + Bres(XtNcjkWidth, XtCCjkWidth, misc.cjk_width, False), + Bres(XtNmkWidth, XtCMkWidth, misc.mk_width, False), + Bres(XtNprecompose, XtCPrecompose, screen.normalized_c, True), + Bres(XtNutf8Latin1, XtCUtf8Latin1, screen.utf8_latin1, False), + Bres(XtNutf8Weblike, XtCUtf8Weblike, screen.utf8_weblike, False), + Bres(XtNvt100Graphics, XtCVT100Graphics, screen.vt100_graphics, True), + Bres(XtNwideChars, XtCWideChars, screen.wide_chars, False), + Ires(XtNcombiningChars, XtCCombiningChars, screen.max_combining, 2), + Ires(XtNmkSamplePass, XtCMkSamplePass, misc.mk_samplepass, 655), + Ires(XtNmkSampleSize, XtCMkSampleSize, misc.mk_samplesize, 65536), + Sres(XtNutf8, XtCUtf8, screen.utf8_mode_s, "default"), + Sres(XtNutf8Fonts, XtCUtf8Fonts, screen.utf8_fonts_s, "default"), + Sres(XtNutf8Title, XtCUtf8Title, screen.utf8_title_s, "default"), + Sres(XtNwideBoldFont, XtCWideBoldFont, misc.default_font.f_wb, DEFWIDEBOLDFONT), + Sres(XtNwideFont, XtCWideFont, misc.default_font.f_w, DEFWIDEFONT), + Sres(XtNutf8SelectTypes, XtCUtf8SelectTypes, screen.utf8_select_types, NULL), +#endif + +#if OPT_LUIT_PROG + Sres(XtNlocale, XtCLocale, misc.locale_str, "medium"), + Sres(XtNlocaleFilter, XtCLocaleFilter, misc.localefilter, DEFLOCALEFILTER), +#endif + +#if OPT_INPUT_METHOD + Sres(XtNximFont, XtCXimFont, misc.f_x, DEFXIMFONT), +#endif + +#if OPT_SCROLL_LOCK + Bres(XtNallowScrollLock, XtCAllowScrollLock, screen.allowScrollLock0, False), +#endif + + /* these are used only for testing ncurses, not in the manual page */ +#if OPT_XMC_GLITCH + Bres(XtNxmcInline, XtCXmcInline, screen.xmc_inline, False), + Bres(XtNxmcMoveSGR, XtCXmcMoveSGR, screen.move_sgr_ok, True), + Ires(XtNxmcAttributes, XtCXmcAttributes, screen.xmc_attributes, 1), + Ires(XtNxmcGlitch, XtCXmcGlitch, screen.xmc_glitch, 0), +#endif + +#ifdef SCROLLBAR_RIGHT + Bres(XtNrightScrollBar, XtCRightScrollBar, misc.useRight, False), +#endif + +#if OPT_RENDERFONT + Bres(XtNforceXftHeight, XtCForceXftHeight, screen.force_xft_height, False), +#define RES_FACESIZE(n) Dres(XtNfaceSize #n, XtCFaceSize #n, misc.face_size[n], "0.0") + RES_FACESIZE(1), + RES_FACESIZE(2), + RES_FACESIZE(3), + RES_FACESIZE(4), + RES_FACESIZE(5), + RES_FACESIZE(6), + Dres(XtNfaceSize, XtCFaceSize, misc.face_size[0], DEFFACESIZE), + Sres(XtNfaceName, XtCFaceName, misc.default_xft.f_n, DEFFACENAME), + Sres(XtNrenderFont, XtCRenderFont, misc.render_font_s, "default"), + Ires(XtNlimitFontsets, XtCLimitFontsets, misc.limit_fontsets, DEF_XFT_CACHE), +#if OPT_RENDERWIDE + Sres(XtNfaceNameDoublesize, XtCFaceNameDoublesize, misc.default_xft.f_w, DEFFACENAME), +#endif +#endif +}; + +static Boolean VTSetValues(Widget cur, Widget request, Widget new_arg, + ArgList args, Cardinal *num_args); +static void VTClassInit(void); +static void VTDestroy(Widget w); +static void VTExpose(Widget w, XEvent *event, Region region); +static void VTInitialize(Widget wrequest, Widget new_arg, ArgList args, + Cardinal *num_args); +static void VTRealize(Widget w, XtValueMask * valuemask, + XSetWindowAttributes * values); +static void VTResize(Widget w); + +#if OPT_INPUT_METHOD +static void VTInitI18N(XtermWidget); +#endif + +#ifdef VMS +globaldef { + "xtermclassrec" +} noshare + +#else +static +#endif /* VMS */ +WidgetClassRec xtermClassRec = +{ + { + /* core_class fields */ + (WidgetClass) & widgetClassRec, /* superclass */ + "VT100", /* class_name */ + sizeof(XtermWidgetRec), /* widget_size */ + VTClassInit, /* class_initialize */ + NULL, /* class_part_initialize */ + False, /* class_inited */ + VTInitialize, /* initialize */ + NULL, /* initialize_hook */ + VTRealize, /* realize */ + actionsList, /* actions */ + XtNumber(actionsList), /* num_actions */ + xterm_resources, /* resources */ + XtNumber(xterm_resources), /* num_resources */ + NULLQUARK, /* xrm_class */ + True, /* compress_motion */ + False, /* compress_exposure */ + True, /* compress_enterleave */ + False, /* visible_interest */ + VTDestroy, /* destroy */ + VTResize, /* resize */ + VTExpose, /* expose */ + VTSetValues, /* set_values */ + NULL, /* set_values_hook */ + XtInheritSetValuesAlmost, /* set_values_almost */ + NULL, /* get_values_hook */ + NULL, /* accept_focus */ + XtVersion, /* version */ + NULL, /* callback_offsets */ + 0, /* tm_table */ + XtInheritQueryGeometry, /* query_geometry */ + XtInheritDisplayAccelerator, /* display_accelerator */ + NULL /* extension */ + } +}; + +#ifdef VMS +globaldef { + "xtermwidgetclass" +} +noshare +#endif /* VMS */ +WidgetClass xtermWidgetClass = (WidgetClass) & xtermClassRec; + +/* + * Add input-actions for widgets that are overlooked (scrollbar and toolbar): + * + * a) Sometimes the scrollbar passes through translations, sometimes it + * doesn't. We add the KeyPress translations here, just to be sure. + * b) In the normal (non-toolbar) configuration, the xterm widget covers + * almost all of the window. With a toolbar, there's a relatively + * large area that the user would expect to enter keystrokes since the + * program can get the focus. + */ +void +xtermAddInput(Widget w) +{ + /* *INDENT-OFF* */ + XtActionsRec input_actions[] = { + { "insert", HandleKeyPressed }, /* alias */ + { "insert-eight-bit", HandleEightBitKeyPressed }, + { "insert-seven-bit", HandleKeyPressed }, + { "secure", HandleSecure }, + { "string", HandleStringEvent }, + { "scroll-back", HandleScrollBack }, + { "scroll-forw", HandleScrollForward }, + { "scroll-to", HandleScrollTo }, + { "select-cursor-end", HandleKeyboardSelectEnd }, + { "select-cursor-extend", HandleKeyboardSelectExtend }, + { "select-cursor-start", HandleKeyboardSelectStart }, + { "insert-selection", HandleInsertSelection }, + { "select-start", HandleSelectStart }, + { "select-extend", HandleSelectExtend }, + { "start-extend", HandleStartExtend }, + { "select-end", HandleSelectEnd }, + { "clear-saved-lines", HandleClearSavedLines }, + { "popup-menu", HandlePopupMenu }, + { "bell", HandleBell }, + { "ignore", HandleIgnore }, +#if OPT_DABBREV + { "dabbrev-expand", HandleDabbrevExpand }, +#endif +#if OPT_MAXIMIZE + { "fullscreen", HandleFullscreen }, +#endif +#if OPT_SCROLL_LOCK + { "scroll-lock", HandleScrollLock }, +#endif +#if OPT_SHIFT_FONTS + { "larger-vt-font", HandleLargerFont }, + { "smaller-vt-font", HandleSmallerFont }, +#endif + }; + /* *INDENT-ON* */ + + TRACE_TRANS("BEFORE", w); + XtAppAddActions(app_con, input_actions, XtNumber(input_actions)); + XtAugmentTranslations(w, XtParseTranslationTable(defaultTranslations)); + TRACE_TRANS("AFTER:", w); + +#if OPT_EXTRA_PASTE + if (term && term->keyboard.extra_translations) + XtOverrideTranslations((Widget) term, XtParseTranslationTable(term->keyboard.extra_translations)); +#endif +} + +#if OPT_ISO_COLORS +#ifdef EXP_BOGUS_FG +static Bool +CheckBogusForeground(TScreen *screen, const char *tag) +{ + int row = -1, col = -1, pass; + Bool isClear = True; + + (void) tag; + for (pass = 0; pass < 2; ++pass) { + row = screen->cur_row; + for (; isClear && (row <= screen->max_row); ++row) { + CLineData *ld = getLineData(screen, row); + + if (ld != 0) { + IAttr *attribs = ld->attribs; + + col = (row == screen->cur_row) ? screen->cur_col : 0; + for (; isClear && (col <= screen->max_col); ++col) { + unsigned flags = attribs[col]; + if (pass) { + flags &= ~FG_COLOR; + attribs[col] = (IAttr) flags; + } else if ((flags & BG_COLOR)) { + isClear = False; + } else if ((flags & FG_COLOR)) { + unsigned ch = ld->charData[col]; + isClear = ((ch == ' ') || (ch == 0)); + } else { + isClear = False; + } + } + } + } + } + TRACE(("%s checked %d,%d to %d,%d %s pass %d\n", + tag, screen->cur_row, screen->cur_col, + row, col, + isClear && pass ? "cleared" : "unchanged", + pass)); + + return isClear; +} +#endif + +/* + * The terminal's foreground and background colors are set via two mechanisms: + * text (cur_foreground, cur_background values that are passed down to + * XDrawImageString and XDrawString) + * area (X11 graphics context used in XClearArea and XFillRectangle) + */ +void +SGR_Foreground(XtermWidget xw, int color) +{ + TScreen *screen = TScreenOf(xw); + Pixel fg; + + if (color >= 0) { + UIntSet(xw->flags, FG_COLOR); + } else { + UIntClr(xw->flags, FG_COLOR); + } + fg = getXtermFG(xw, xw->flags, color); + xw->cur_foreground = color; + + setCgsFore(xw, WhichVWin(screen), gcNorm, fg); + setCgsBack(xw, WhichVWin(screen), gcNormReverse, fg); + + setCgsFore(xw, WhichVWin(screen), gcBold, fg); + setCgsBack(xw, WhichVWin(screen), gcBoldReverse, fg); + +#ifdef EXP_BOGUS_FG + /* + * If we've just turned off the foreground color, check for blank cells + * which have no background color, but do have foreground color. This + * could happen due to setting the foreground color just before scrolling. + * + * Those cells look uncolored, but will confuse ShowCursor(), which looks + * for the colors in the current cell, and will see the foreground color. + * In that case, remove the foreground color from the blank cells. + */ + if (color < 0) { + CheckBogusForeground(screen, "SGR_Foreground"); + } +#endif +} + +void +SGR_Background(XtermWidget xw, int color) +{ + TScreen *screen = TScreenOf(xw); + Pixel bg; + + /* + * An indexing operation may have set screen->scroll_amt, which would + * normally result in calling FlushScroll() in WriteText(). However, + * if we're changing the background color now, then the new value + * should not apply to the pending blank lines. + */ + if (screen->scroll_amt && (color != xw->cur_background)) + FlushScroll(xw); + + if (color >= 0) { + UIntSet(xw->flags, BG_COLOR); + } else { + UIntClr(xw->flags, BG_COLOR); + } + bg = getXtermBG(xw, xw->flags, color); + xw->cur_background = color; + + setCgsBack(xw, WhichVWin(screen), gcNorm, bg); + setCgsFore(xw, WhichVWin(screen), gcNormReverse, bg); + + setCgsBack(xw, WhichVWin(screen), gcBold, bg); + setCgsFore(xw, WhichVWin(screen), gcBoldReverse, bg); +} + +/* Invoked after updating bold/underline flags, computes the extended color + * index to use for foreground. (See also 'extract_fg()'). + */ +static void +setExtendedFG(XtermWidget xw) +{ + int fg = xw->sgr_foreground; + + if (TScreenOf(xw)->colorAttrMode + || (fg < 0)) { + fg = MapToColorMode(fg, TScreenOf(xw), xw->flags); + } + + /* This implements the IBM PC-style convention of 8-colors, with one + * bit for bold, thus mapping the 0-7 codes to 8-15. It won't make + * much sense for 16-color applications, but we keep it to retain + * compatibility with ANSI-color applications. + */ +#if OPT_PC_COLORS /* XXXJTL should be settable at runtime (resource or OSC?) */ + if (TScreenOf(xw)->boldColors + && (!xw->sgr_38_xcolors) + && (fg >= 0) + && (fg < 8) + && (xw->flags & BOLD)) + fg |= 8; +#endif + + SGR_Foreground(xw, fg); +} + +/* Invoked after updating inverse flag, computes the extended color + * index to use for background. (See also 'extract_bg()'). + */ +static void +setExtendedBG(XtermWidget xw) +{ + int bg = xw->sgr_background; + + if (TScreenOf(xw)->colorAttrMode + || (bg < 0)) { + if (TScreenOf(xw)->colorRVMode && (xw->flags & INVERSE)) + bg = COLOR_RV; + } + + SGR_Background(xw, bg); +} + +void +setExtendedColors(XtermWidget xw) +{ + setExtendedFG(xw); + setExtendedBG(xw); +} + +static void +reset_SGR_Foreground(XtermWidget xw) +{ + xw->sgr_foreground = -1; + xw->sgr_38_xcolors = False; + clrDirectFG(xw->flags); + setExtendedFG(xw); +} + +static void +reset_SGR_Background(XtermWidget xw) +{ + xw->sgr_background = -1; + clrDirectBG(xw->flags); + setExtendedBG(xw); +} + +static void +reset_SGR_Colors(XtermWidget xw) +{ + reset_SGR_Foreground(xw); + reset_SGR_Background(xw); +} +#endif /* OPT_ISO_COLORS */ + +#if OPT_WIDE_ATTRS +/* + * Call this before changing the state of ATR_ITALIC, to update the GC fonts. + */ +static void +setItalicFont(XtermWidget xw, Bool enable) +{ + if (enable) { + if ((xw->flags & ATR_ITALIC) == 0) { + xtermLoadItalics(xw); + TRACE(("setItalicFont: enabling Italics\n")); + xtermUpdateFontGCs(xw, getItalicFont); + } + } else if ((xw->flags & ATR_ITALIC) != 0) { + TRACE(("setItalicFont: disabling Italics\n")); + xtermUpdateFontGCs(xw, getNormalFont); + } +} + +static void +ResetItalics(XtermWidget xw) +{ + setItalicFont(xw, False); + UIntClr(xw->flags, ATR_ITALIC); +} + +#else +#define ResetItalics(xw) /* nothing */ +#endif + +static void +initCharset(TScreen *screen, int which, DECNRCM_codes code) +{ + screen->gsets[which] = code; +} + +void +saveCharsets(TScreen *screen, DECNRCM_codes * target) +{ + int g; + for (g = 0; g < NUM_GSETS; ++g) { + target[g] = screen->gsets[g]; + } +} + +void +restoreCharsets(TScreen *screen, DECNRCM_codes * source) +{ + int g; + for (g = 0; g < NUM_GSETS; ++g) { + screen->gsets[g] = source[g]; + } +} + +void +resetCharsets(TScreen *screen) +{ + TRACE(("resetCharsets\n")); + + initCharset(screen, 0, nrc_ASCII); + initCharset(screen, 1, nrc_ASCII); + initCharset(screen, 2, nrc_ASCII); + initCharset(screen, 3, nrc_ASCII); + + screen->curgl = 0; /* G0 => GL. */ + screen->curgr = 2; /* G2 => GR. */ + screen->curss = 0; /* No single shift. */ + +#if OPT_VT52_MODE + if (screen->vtXX_level == 0) + initCharset(screen, 1, nrc_DEC_Spec_Graphic); /* Graphics */ +#endif +} + +static void +modified_DECNRCM(XtermWidget xw) +{ +#if OPT_WIDE_CHARS + TScreen *screen = TScreenOf(xw); + if (screen->wide_chars && (screen->utf8_mode || screen->utf8_nrc_mode)) { + int enabled = ((xw->flags & NATIONAL) != 0); + int modefix; + EXCHANGE(screen->utf8_nrc_mode, screen->utf8_mode, modefix); + switchPtyData(screen, !enabled); + TRACE(("UTF8 mode temporarily %s\n", enabled ? "ON" : "OFF")); + } +#else + (void) xw; +#endif +} + +/* + * VT300 and up support three ANSI conformance levels, defined according to + * the dpANSI X3.134.1 standard. DEC's manuals equate levels 1 and 2, and + * are unclear. This code is written based on the manuals. + */ +static void +set_ansi_conformance(TScreen *screen, int level) +{ + TRACE(("set_ansi_conformance(%d) dec_level %d:%d, ansi_level %d\n", + level, + screen->vtXX_level * 100, + screen->terminal_id, + screen->ansi_level)); + if (screen->vtXX_level >= 3) { + switch (screen->ansi_level = level) { + case 1: + /* FALLTHRU */ + case 2: + initCharset(screen, 0, nrc_ASCII); /* G0 is ASCII */ + initCharset(screen, 1, nrc_ASCII); /* G1 is ISO Latin-1 */ + screen->curgl = 0; + screen->curgr = 1; + break; + case 3: + initCharset(screen, 0, nrc_ASCII); /* G0 is ASCII */ + screen->curgl = 0; + break; + } + } +} + +/* + * Set scrolling margins. VTxxx terminals require that the top/bottom are + * different, so we have at least two lines in the scrolling region. + */ +static void +set_tb_margins(TScreen *screen, int top, int bottom) +{ + TRACE(("set_tb_margins %d..%d, prior %d..%d\n", + top, bottom, + screen->top_marg, + screen->bot_marg)); + if (bottom > top) { + screen->top_marg = top; + screen->bot_marg = bottom; + } + if (screen->top_marg > screen->max_row) + screen->top_marg = screen->max_row; + if (screen->bot_marg > screen->max_row) + screen->bot_marg = screen->max_row; +} + +static void +set_lr_margins(TScreen *screen, int left, int right) +{ + TRACE(("set_lr_margins %d..%d, prior %d..%d\n", + left, right, + screen->lft_marg, + screen->rgt_marg)); + if (right > left) { + screen->lft_marg = left; + screen->rgt_marg = right; + } + if (screen->lft_marg > screen->max_col) + screen->lft_marg = screen->max_col; + if (screen->rgt_marg > screen->max_col) + screen->rgt_marg = screen->max_col; +} + +#define reset_tb_margins(screen) set_tb_margins(screen, 0, screen->max_row) +#define reset_lr_margins(screen) set_lr_margins(screen, 0, screen->max_col) + +void +resetMargins(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + UIntClr(xw->flags, LEFT_RIGHT); + reset_tb_margins(screen); + reset_lr_margins(screen); +} + +static void +resetRendition(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + (void) screen; + ResetItalics(xw); + UIntClr(xw->flags, + (SGR_MASK | SGR_MASK2 | INVISIBLE)); +} + +void +set_max_col(TScreen *screen, int cols) +{ + TRACE(("set_max_col %d, prior %d\n", cols, screen->max_col)); + if (cols < 0) + cols = 0; + screen->max_col = cols; +} + +void +set_max_row(TScreen *screen, int rows) +{ + TRACE(("set_max_row %d, prior %d\n", rows, screen->max_row)); + if (rows < 0) + rows = 0; + screen->max_row = rows; +} + +#if OPT_MOD_FKEYS +static void +set_mod_fkeys(XtermWidget xw, int which, int what, Bool enabled) +{ +#define SET_MOD_FKEYS(field) \ + xw->keyboard.modify_now.field = ((what == DEFAULT) && enabled) \ + ? xw->keyboard.modify_1st.field \ + : what; \ + TRACE(("set modify_now.%s to %d\n", #field, \ + xw->keyboard.modify_now.field)); + + switch (which) { + case 0: + SET_MOD_FKEYS(allow_keys); + break; + case 1: + SET_MOD_FKEYS(cursor_keys); + break; + case 2: + SET_MOD_FKEYS(function_keys); + break; + case 3: + SET_MOD_FKEYS(keypad_keys); + break; + case 4: + SET_MOD_FKEYS(other_keys); + break; + case 5: + SET_MOD_FKEYS(string_keys); + break; + } +} +#endif /* OPT_MOD_FKEYS */ + +#if OPT_TRACE +#define DATA(name) { name, #name } +static const struct { + Const PARSE_T *table; + const char *name; +} all_tables[] = { + + DATA(ansi_table) + ,DATA(cigtable) + ,DATA(csi2_table) + ,DATA(csi_ex_table) + ,DATA(csi_quo_table) + ,DATA(csi_table) + ,DATA(dec2_table) + ,DATA(dec3_table) + ,DATA(dec_table) + ,DATA(eigtable) + ,DATA(esc_sp_table) + ,DATA(esc_table) + ,DATA(scrtable) + ,DATA(scs96table) + ,DATA(scstable) + ,DATA(sos_table) +#if OPT_BLINK_CURS + ,DATA(csi_sp_table) +#endif +#if OPT_DEC_LOCATOR + ,DATA(csi_tick_table) +#endif +#if OPT_DEC_RECTOPS + ,DATA(csi_dollar_table) + ,DATA(csi_star_table) + ,DATA(csi_dec_dollar_table) +#endif +#if OPT_WIDE_CHARS + ,DATA(esc_pct_table) + ,DATA(scs_amp_table) + ,DATA(scs_pct_table) + ,DATA(scs_2qt_table) +#endif +#if OPT_VT52_MODE + ,DATA(vt52_table) + ,DATA(vt52_esc_table) + ,DATA(vt52_ignore_table) +#endif +#if OPT_XTERM_SGR + ,DATA(csi_hash_table) +#endif +#undef DATA +}; + +#define WHICH_TABLE(name) if (table == name) result = #name +static const char * +which_table(Const PARSE_T * table) +{ + const char *result = "?"; + Cardinal n; + for (n = 0; n < XtNumber(all_tables); ++n) { + if (table == all_tables[n].table) { + result = all_tables[n].name; + break; + } + } + + return result; +} + +static void +check_tables(void) +{ + Cardinal n; + int ch; + int total_codes = 0; + int total_ground = 0; + int total_ignored = 0; + + TRACE(("** check_tables\n")); + for (n = 0; n < XtNumber(all_tables); ++n) { + Const PARSE_T *table = all_tables[n].table; + TRACE(("*** %s\n", all_tables[n].name)); + /* + * Most of the tables should use the same codes in 0..31, 128..159 + * as the "ansi" table. + */ + if (strncmp(all_tables[n].name, "ansi", 4) && + strncmp(all_tables[n].name, "sos_", 4) && + strncmp(all_tables[n].name, "vt52", 4)) { + for (ch = 0; ch < 32; ++ch) { + int c1 = ch + 128; + PARSE_T st_l = table[ch]; + PARSE_T st_r = table[c1]; + if (st_l != ansi_table[ch]) { + TRACE((" %3d: %d vs %d\n", ch, st_l, ansi_table[ch])); + } + if (st_r != ansi_table[c1]) { + TRACE((" %3d: %d vs %d\n", c1, st_r, ansi_table[c1])); + } + } + } + /* + * All of the tables should have their GL/GR parts encoded the same. + */ + for (ch = 32; ch < 127; ++ch) { + PARSE_T st_l = table[ch]; + PARSE_T st_r = table[ch + 128]; + if (st_l != st_r) { + if (st_r == CASE_IGNORE && + !strncmp(all_tables[n].name, "vt52", 4)) { + ; + } else { + TRACE((" %3d: %d vs %d\n", ch, st_l, st_r)); + } + } + } + /* + * Just for amusement, show how sparse the encoding tables are. + */ + for (ch = 0; ch < 256; ++ch) { + ++total_codes; + switch (table[ch]) { + case CASE_GROUND_STATE: + total_ground++; + break; + case CASE_ESC_IGNORE: + /* FALLTHRU */ + case CASE_IGNORE: + /* FALLTHRU */ + case CASE_VT52_IGNORE: + total_ignored++; + break; + } + } + } + TRACE(("VTPrsTbl:\n")); + TRACE(("%d total codes\n", total_codes)); + TRACE(("%d total ignored\n", total_ignored)); + TRACE(("%d total reset/ground\n", total_ground)); +} + +static void +check_bitmasks(void) +{ +#define dMSK 0x100 +#define DATA(mode,name) { mode, name, #name } +#define DMSK(what) (dMSK | (what)) +#define DGRP(offs) (1 << ((offs) - 1)) + static struct { + int mode; + int code; + Const char *name; + } table[] = { + DATA(DGRP(1), INVERSE), + DATA(DGRP(1), UNDERLINE), + DATA(DGRP(1), BOLD), + DATA(DGRP(1), BLINK), + DATA(DMSK(DGRP(1)), SGR_MASK), + DATA(DGRP(2), BG_COLOR), + DATA(DGRP(2), FG_COLOR), + DATA(DGRP(2), PROTECTED), + DATA(DGRP(4), CHARDRAWN), +#if OPT_WIDE_ATTRS + DATA(DGRP(2), ATR_FAINT), + DATA(DGRP(2), ATR_ITALIC), + DATA(DGRP(2), ATR_STRIKEOUT), + DATA(DGRP(2), ATR_DBL_UNDER), + DATA(DGRP(2), ATR_DIRECT_FG), + DATA(DGRP(2), ATR_DIRECT_BG), +#endif + DATA(DMSK(DGRP(2)), SGR_MASK2), + DATA(DGRP(3), WRAPAROUND), + DATA(DGRP(3), REVERSEWRAP), + DATA(DGRP(3), REVERSE_VIDEO), + DATA(DGRP(3), LINEFEED), + DATA(DGRP(3), ORIGIN), + DATA(DGRP(3), INSERT), + DATA(DGRP(3), SMOOTHSCROLL), + DATA(DGRP(3), IN132COLUMNS), + DATA(DGRP(3), INVISIBLE), + DATA(DMSK(DGRP(3)), ATTRIBUTES), + DATA(DGRP(5), NATIONAL), + DATA(DGRP(5), LEFT_RIGHT), + DATA(DGRP(5), NOCLEAR_COLM), + DATA(DGRP(4), NOBACKGROUND), + DATA(DGRP(4), NOTRANSLATION), + DATA(DGRP(4), DOUBLEWFONT), + DATA(DGRP(4), DOUBLEHFONT), + DATA(DGRP(4), CHARBYCHAR), + DATA(DGRP(4), NORESOLUTION), + DATA(DMSK(DGRP(1) | DGRP(2) | DGRP(4)), DRAWX_MASK), + DATA(-1, EOF) + }; +#undef DATA + int j, k; + TRACE(("** check_bitmasks:\n")); + for (j = 0; table[j].mode >= 0; ++j) { + TRACE(("%4X %8X %s\n", table[j].mode, table[j].code, table[j].name)); + if (table[j].mode & dMSK) { + int mask = dMSK; + for (k = 0; table[k].mode >= 0; ++k) { + if (j == k) + continue; + if (table[k].mode & dMSK) + continue; + if ((table[j].mode & table[k].mode) != 0) + mask |= table[k].mode; + } + if (mask != table[j].mode) { + TRACE(("...expected %08X\n", mask)); + } + } else { + for (k = 0; table[k].mode >= 0; ++k) { + if (j == k) + continue; + if (table[k].mode & dMSK) + continue; + if ((table[j].code & table[k].code) != 0) { + TRACE(("...same bits %s\n", table[k].name)); + } + } + } + } +} +#endif + +static int +init_params(void) +{ + while (parms.count-- > 0) { + parms.is_sub[parms.count] = 0; + parms.params[parms.count] = 0; + } + parms.count = 0; + parms.has_subparams = 0; + return 0; +} + +#if OPT_TRACE > 0 +static void +dump_params(void) +{ + int n; + int arg; + TRACE(("params %d (%d)\n", nparam, parms.has_subparams)); + for (arg = 1, n = 0; n < nparam; ++n) { + TRACE(("%3d.%d %d\n", arg, parms.is_sub[n], parms.params[n])); + if (!parms.is_sub[n]) + ++arg; + } +} +#define DumpParams() dump_params() +#else +#define DumpParams() /* nothing */ +#endif + + /* allocate larger buffer if needed/possible */ +#define SafeAlloc(type, area, used, size) \ + type *new_string = area; \ + size_t new_length = size; \ + if (new_length == 0) { \ + new_length = 1024; \ + new_string = TypeMallocN(type, new_length); \ + } else if (used+1 >= new_length) { \ + new_length = size * 2; \ + new_string = TypeMallocN(type, new_length); \ + if (new_string != 0 \ + && area != 0 \ + && used != 0) { \ + memcpy(new_string, area, used * sizeof(type)); \ + } \ + } +#define SafeFree(area, size) \ + if (area != new_string) { \ + free(area); \ + area = new_string; \ + } \ + size = new_length + +#define WriteNow() { \ + unsigned single = 0; \ + \ + if (screen->curss) { \ + dotext(xw, \ + screen->gsets[(int) (screen->curss)], \ + sp->print_area, \ + (Cardinal) 1); \ + screen->curss = 0; \ + single++; \ + } \ + if (sp->print_used > single) { \ + dotext(xw, \ + screen->gsets[(int) (screen->curgl)], \ + sp->print_area + single, \ + (Cardinal) (sp->print_used - single)); \ + } \ + sp->print_used = 0; \ + } \ + +#define PARSE_SRM 1 + +struct ParseState { + unsigned check_recur; +#if OPT_VT52_MODE + Bool vt52_cup; +#endif + Const PARSE_T *groundtable; + Const PARSE_T *parsestate; + int scstype; + int scssize; + Bool private_function; /* distinguish private-mode from standard */ + int string_mode; /* nonzero iff we're processing a string */ + int lastchar; /* positive iff we had a graphic character */ + int nextstate; +#if OPT_WIDE_CHARS + int last_was_wide; +#endif + /* Buffer for processing printable text */ + IChar *print_area; + size_t print_size; + size_t print_used; + /* Buffer for processing strings (e.g., OSC ... ST) */ + Char *string_area; + size_t string_size; + size_t string_used; + /* Buffer for deferring input */ + Char *defer_area; + size_t defer_size; + size_t defer_used; +}; + +static struct ParseState myState; + +static void +init_groundtable(TScreen *screen, struct ParseState *sp) +{ + (void) screen; + +#if OPT_VT52_MODE + if (!(screen->vtXX_level)) { + sp->groundtable = vt52_table; + } else if (screen->terminal_id >= 100) +#endif + { + sp->groundtable = ansi_table; + } +} + +static void +select_charset(struct ParseState *sp, int type, int size) +{ + TRACE(("select_charset %d %d\n", type, size)); + sp->scstype = type; + sp->scssize = size; + if (size == 94) { + sp->parsestate = scstable; + } else { + sp->parsestate = scs96table; + } +} +/* *INDENT-OFF* */ +static struct { + DECNRCM_codes result; + int prefix; + int suffix; + int min_level; + int max_level; + int need_nrc; +} scs_table[] = { + { nrc_ASCII, 0, 'B', 1, 9, 0 }, + { nrc_British, 0, 'A', 1, 9, 0 }, + { nrc_DEC_Spec_Graphic, 0, '0', 1, 9, 0 }, + { nrc_DEC_Alt_Chars, 0, '1', 1, 1, 0 }, + { nrc_DEC_Alt_Graphics, 0, '2', 1, 1, 0 }, + /* VT2xx */ + { nrc_DEC_Supp, 0, '<', 2, 9, 0 }, + { nrc_Dutch, 0, '4', 2, 9, 1 }, + { nrc_Finnish, 0, '5', 2, 9, 1 }, + { nrc_Finnish2, 0, 'C', 2, 9, 1 }, + { nrc_French, 0, 'R', 2, 9, 1 }, + { nrc_French2, 0, 'f', 2, 9, 1 }, + { nrc_French_Canadian, 0, 'Q', 2, 9, 1 }, + { nrc_German, 0, 'K', 2, 9, 1 }, + { nrc_Italian, 0, 'Y', 2, 9, 1 }, + { nrc_Norwegian_Danish2, 0, 'E', 2, 9, 1 }, + { nrc_Norwegian_Danish3, 0, '6', 2, 9, 1 }, + { nrc_Spanish, 0, 'Z', 2, 9, 1 }, + { nrc_Swedish, 0, '7', 2, 9, 1 }, + { nrc_Swedish2, 0, 'H', 2, 9, 1 }, + { nrc_Swiss, 0, '=', 2, 9, 1 }, + /* VT3xx */ + { nrc_British_Latin_1, 0, 'A', 3, 9, 1 }, + { nrc_DEC_Supp_Graphic, '%', '5', 3, 9, 0 }, + { nrc_DEC_Technical, 0, '>', 3, 9, 0 }, + { nrc_French_Canadian2, 0, '9', 3, 9, 1 }, + { nrc_Norwegian_Danish, 0, '`', 3, 9, 1 }, + { nrc_Portugese, '%', '6', 3, 9, 1 }, + /* VT5xx */ + { nrc_Cyrillic, '&', '4', 5, 9, 1 }, + { nrc_Greek, '"', '>', 5, 9, 1 }, + { nrc_Hebrew, '%', '=', 5, 9, 1 }, + { nrc_Turkish, '%', '2', 5, 9, 1 }, + { nrc_DEC_Greek_Supp, '"', '?', 5, 9, 0 }, + { nrc_DEC_Hebrew_Supp, '"', '4', 5, 9, 0 }, + { nrc_DEC_Turkish_Supp, '%', '0', 5, 9, 0 }, + { nrc_ISO_Greek_Supp, 0, 'F', 5, 9, 0 }, + { nrc_ISO_Hebrew_Supp, 0, 'H', 5, 9, 0 }, + { nrc_ISO_Latin_5_Supp, 0, 'M', 5, 9, 0 }, + { nrc_ISO_Latin_Cyrillic,0, 'L', 5, 9, 0 }, + /* VT5xx (not implemented) */ +#if 0 + { nrc_Russian, '&', '5', 5, 9, 1 }, + { nrc_SCS_NRCS, '%', '3', 5, 9, 0 }, +#endif +}; +/* *INDENT-ON* */ + +#if OPT_DEC_RECTOPS +static char * +encode_scs(DECNRCM_codes value) +{ + static char buffer[3]; + Cardinal n; + char *result = buffer; + for (n = 0; n < XtNumber(scs_table); ++n) { + if (scs_table[n].result == value) { + if (scs_table[n].prefix) + *result++ = (char) scs_table[n].prefix; + if (scs_table[n].suffix) + *result++ = (char) scs_table[n].suffix; + break; + } + } + *result = '\0'; + return buffer; +} +#endif + +void +xtermDecodeSCS(XtermWidget xw, int which, int prefix, int suffix) +{ + TScreen *screen = TScreenOf(xw); + Cardinal n; + DECNRCM_codes result = nrc_Unknown; + + suffix &= 0x7f; + for (n = 0; n < XtNumber(scs_table); ++n) { + if (prefix == scs_table[n].prefix + && suffix == scs_table[n].suffix + && screen->vtXX_level >= scs_table[n].min_level + && screen->vtXX_level <= scs_table[n].max_level + && (scs_table[n].need_nrc == 0 || (xw->flags & NATIONAL) != 0)) { + result = scs_table[n].result; + break; + } + } + if (result != nrc_Unknown) { + initCharset(screen, which, result); + TRACE(("setting G%d to %s\n", which, visibleScsCode((int) result))); + } else { + TRACE(("...unknown GSET\n")); + } +} + +/* + * Given a parameter number, and subparameter (starting in each case from zero) + * return the corresponding index into the parameter array. If the combination + * is not found, return -1. + */ +static int +subparam_index(int p, int s) +{ + int result = -1; + int j, p2, s2; + + for (j = p2 = 0; j < nparam; ++j, ++p2) { + if (parms.is_sub[j]) { + s2 = 0; + + do { + if ((p == p2) && (s == s2)) { + result = j; + break; + } + ++s2; + } while ((++j < nparam) && (parms.is_sub[j - 1] < parms.is_sub[j])); + + if (result >= 0) + break; + + --j; /* undo the last "while" */ + } else if (p == p2) { + if (s == 0) { + result = j; + } + break; + } + } + TRACE2(("...subparam_index %d.%d = %d\n", p + 1, s + 1, result)); + return result; +} + +/* + * Check if the given item in the parameter array has subparameters. + * If so, return the number of subparameters to use as a loop limit, etc. + */ +static int +param_has_subparams(int item) +{ + int result = 0; + if (parms.has_subparams) { + int n = subparam_index(item, 0); + if (n >= 0 && parms.is_sub[n]) { + while (++n < nparam && parms.is_sub[n - 1] < parms.is_sub[n]) { + result++; + } + } + } + TRACE(("...param_has_subparams(%d) ->%d\n", item, result)); + return result; +} + +#if OPT_DIRECT_COLOR || OPT_256_COLORS || OPT_88_COLORS || OPT_ISO_COLORS +/* + * Given an index into the parameter array, return the corresponding parameter + * number (starting from zero). + */ +static int +param_number(int item) +{ + int result = -1; + int j, p; + + for (j = p = 0; j < nparam; ++j, ++p) { + if (p >= item) { + result = j; + break; + } + if (parms.is_sub[j]) { + while ((++j < nparam) && (parms.is_sub[j - 1] < parms.is_sub[j])) { + /* EMPTY */ + } + --j; + } + } + + TRACE2(("...param_number(%d) = %d\n", item, result)); + return result; +} + +static int +get_subparam(int p, int s) +{ + int item = subparam_index(p, s); + int result = (item >= 0) ? parms.params[item] : DEFAULT; + TRACE(("...get_subparam[%d] = %d\n", item, result)); + return result; +} + +/* + * Some background - + * + * Todd Larason provided the initial changes to support 256-colors in July 1999. + * I pointed out that the description of SGR 38/48 in ECMA-48 was vague, and + * was unsure if there would be some standard using those codes. His response + * was that this was documented (it turns out, in equally vague terms) in ITU + * T.416 + * + * Discussing this with Todd Larason in mid-1999, my point was that given the + * high cost of obtaining ITU T.416 (ISO-8613-6), the standard was not going + * to be effective (more than $100 then, more than $200 in 2012) + * + * We overlooked the detail about ":" as a subparameter delimiter (documented + * in 5.4.2 in ECMA-48). Some discussion in KDE in mid-2006 led Lars Doelle + * to discuss the issue with me. Lars' initial concern dealt with the fact + * that a sequence such as + * CSI 38 ; 5 ; 1 m + * violated the principle that SGR parameters could be used in any order. + * Further discussion (see KDE #107487) resolved that the standard expected + * that the sequence would look like + * CSI 38 ; 5 : 1 m + * which still violates that principle, since the "5:1" parameter has to + * follow the "38" to be useful. + * + * This function accepts either format (per request by Paul Leonerd Evans). + * It also accepts + * CSI 38 : 5 : 1 m + * according to Lars' original assumption. While implementing that, I added + * support for Konsole's interpretation of "CSI 38 : 2" as a 24-bit RGB value. + * ISO-8613-6 documents that as "direct color". + * + * At the time in 2012, no one noticed (or commented) regarding ISO-8613-6's + * quirk in the description of direct color: it mentions a color space + * identifier parameter which should follow the "2" (as parameter 1). In the + * same section, ISO-8613-6 mentions a parameter 6 which can be ignored, as + * well as parameters 7 and 8. Like parameter 1, parameters 7 and 8 are not + * defined clearly in the standard, and a close reading indicates they are + * optional, saying they "may be used". This implementation ignores parameters + * 6 (and above), and provides for the color space identifier by checking the + * number of parameters: + * 3 after "2" (no color space identifier) + * 4 or more after "2" (color space identifier) + * + * By the way - all of the parameters are decimal integers, and missing + * parameters represent a default value. ISO-8613-6 is clear about that. + * + * Aside from ISO-8613-3, there is no standard use of ":" as a delimiter. + * ECMA-48 says only: + * + * 5.4.2 Parameter string format + * + * A parameter string which does not start with a bit combination in the + * range 03/12 to 03/15 shall have the following format: + * + * a) A parameter string consists of one or more parameter + * sub-strings, each of which represents a number in decimal + * notation. + * + * b) Each parameter sub-string consists of one or more bit + * combinations from 03/00 to 03/10; the bit combinations from + * 03/00 to 03/09 represent the digits ZERO to NINE; bit + * combination 03/10 may be used as a separator in a parameter + * sub-string, for example, to separate the fractional part of a + * decimal number from the integer part of that number. + * + * That is, there is no mention in ECMA-48 of the possibility that a parameter + * string might be a list of parameters, as done in ISO-8613-3 (nor does + * ECMA-48 provide an example where the ":" separator might be used). Because + * of this, xterm treats other cases than those needed for ISO-8613-3 as an + * error, and stops interpreting the sequence. + */ +#define extended_colors_limit(n) ((n) == 5 ? 1 : ((n) == 2 ? 3 : 0)) +static Boolean +parse_extended_colors(XtermWidget xw, int *colorp, int *itemp, Boolean *extended) +{ + Boolean result = False; + int item = *itemp; + int next = item; + int base = param_number(item); + int code = -1; + int values[3]; /* maximum number of subparameters */ + int need = 0; /* number of subparameters needed */ + int have; + int n; + + /* + * On entry, 'item' points to the 38/48 code in the parameter array. + * If that has subparameters, we will expect all of the values to + * be subparameters of that item. + */ + if ((have = param_has_subparams(item)) != 0) { + /* accept CSI 38 : 5 : 1 m */ + /* accept CSI 38 : 2 : 1 : 2 : 3 m */ + code = get_subparam(base, 1); + need = extended_colors_limit(code); + next = item + have; + for (n = 0; n < need && n < 3; ++n) { + values[n] = get_subparam(base, 2 + n + (have > 4)); + } + } else if (++item < nparam) { + ++base; + if ((have = param_has_subparams(item)) != 0) { + /* accept CSI 38 ; 5 : 1 m */ + /* accept CSI 38 ; 2 : 1 : 2 : 3 m */ + code = get_subparam(base, 0); + need = extended_colors_limit(code); + next = base + have; + for (n = 0; n < need && n < 3; ++n) { + values[n] = get_subparam(base, 1 + n + (have > 3)); + } + } else { + /* accept CSI 38 ; 5 ; 1 m */ + /* accept CSI 38 ; 2 ; 1 ; 2 ; 3 m */ + code = GetParam(item); + need = extended_colors_limit(code); + next = item + need; + for (n = 0; n < need && n < 3; ++n) { + values[n] = GetParam(item + 1 + n); + } + } + } + item = next; + + *extended = False; + switch (code) { + case 2: + /* direct color in rgb space */ + if ((values[0] >= 0 && values[0] < 256) && + (values[1] >= 0 && values[1] < 256) && + (values[2] >= 0 && values[2] < 256)) { +#if OPT_DIRECT_COLOR + if (TScreenOf(xw)->direct_color && xw->has_rgb) { + *colorp = getDirectColor(xw, values[0], values[1], values[2]); + result = True; + *extended = True; + } else +#endif + { + *colorp = xtermClosestColor(xw, values[0], values[1], values[2]); + result = okIndexedColor(*colorp); + } + } else { + *colorp = -1; + } + break; + case 5: + /* indexed color */ + *colorp = values[0]; + result = okIndexedColor(*colorp); + break; + default: + *colorp = -1; + break; + } + + TRACE(("...resulting color %d/%d %s\n", + *colorp, NUM_ANSI_COLORS, + result ? "OK" : "ERR")); + + *itemp = item; + return result; +} +#endif /* ...extended_colors */ + +static int +optional_param(int which) +{ + return (nparam > which) ? GetParam(which) : DEFAULT; +} + +static int +zero_if_default(int which) +{ + int result = (nparam > which) ? GetParam(which) : 0; + if (result <= 0) + result = 0; + return result; +} + +static int +one_if_default(int which) +{ + int result = (nparam > which) ? GetParam(which) : 0; + if (result <= 0) + result = 1; + return result; +} + +/* + * Color palette changes using the OSC controls require a repaint of the + * screen - but not immediately. Do the repaint as soon as we detect a + * state which will not lead to another color palette change. + */ +static void +repaintWhenPaletteChanged(XtermWidget xw, struct ParseState *sp) +{ + Boolean ignore = False; + + switch (sp->nextstate) { + case CASE_ESC: + ignore = ((sp->parsestate == ansi_table) || + (sp->parsestate == sos_table)); +#if USE_DOUBLE_BUFFER + if (resource.buffered && TScreenOf(xw)->needSwap) { + ignore = False; + } +#endif + break; + case CASE_OSC: + ignore = ((sp->parsestate == ansi_table) || + (sp->parsestate == esc_table)); + break; + case CASE_IGNORE: + ignore = (sp->parsestate == sos_table); + break; + case CASE_ST: + ignore = ((sp->parsestate == esc_table) || + (sp->parsestate == sos_table)); + break; + case CASE_ESC_DIGIT: + ignore = (sp->parsestate == csi_table); + break; + case CASE_ESC_SEMI: + ignore = (sp->parsestate == csi2_table); + break; + } + + if (!ignore) { + TRACE(("repaintWhenPaletteChanged\n")); + xw->work.palette_changed = False; + xtermRepaint(xw); + xtermFlushDbe(xw); + } +} + +#if OPT_C1_PRINT || OPT_WIDE_CHARS +#define ParseSOS(screen) ((screen)->c1_printable == 0) +#else +#define ParseSOS(screen) 0 +#endif + +#define ResetState(sp) InitParams(), (sp)->parsestate = (sp)->groundtable + +static void +illegal_parse(XtermWidget xw, unsigned c, struct ParseState *sp) +{ + ResetState(sp); + sp->nextstate = sp->parsestate[E2A(c)]; + Bell(xw, XkbBI_MinorError, 0); +} + +static void +init_parser(XtermWidget xw, struct ParseState *sp) +{ + TScreen *screen = TScreenOf(xw); + + memset(sp, 0, sizeof(*sp)); + sp->scssize = 94; /* number of printable/nonspace ASCII */ + sp->lastchar = -1; /* not a legal IChar */ + sp->nextstate = -1; /* not a legal state */ + + init_groundtable(screen, sp); + ResetState(sp); +} + +static void +init_reply(unsigned type) +{ + memset(&reply, 0, sizeof(reply)); + reply.a_type = (Char) type; +} + +static void +deferparsing(unsigned c, struct ParseState *sp) +{ + SafeAlloc(Char, sp->defer_area, sp->defer_used, sp->defer_size); + if (new_string == 0) { + xtermWarning("Cannot allocate %lu bytes for deferred parsing of %u\n", + (unsigned long) new_length, c); + return; + } + SafeFree(sp->defer_area, sp->defer_size); + sp->defer_area[(sp->defer_used)++] = CharOf(c); +} + +#if OPT_VT52_MODE +static void +update_vt52_vt100_settings(void) +{ + update_autowrap(); + update_reversewrap(); + update_autolinefeed(); + update_appcursor(); + update_appkeypad(); + update_allow132(); +} +#endif + +static Boolean +doparsing(XtermWidget xw, unsigned c, struct ParseState *sp) +{ + TScreen *screen = TScreenOf(xw); + int item; + int count; + int value; + int laststate; + int thischar = -1; + XTermRect myRect; +#if OPT_DEC_RECTOPS + int thispage = 1; +#endif + + if (sp->check_recur) { + /* Defer parsing when parser is already running as the parser is not + * safe to reenter. + */ + deferparsing(c, sp); + return True; + } + + do { +#if OPT_WIDE_CHARS + int this_is_wide = 0; + + /* + * Handle zero-width combining characters. Make it faster by noting + * that according to the Unicode charts, the majority of Western + * character sets do not use this feature. There are some unassigned + * codes at 0x242, but no zero-width characters until past 0x300. + */ + if (c >= 0x300 + && screen->wide_chars + && CharWidth(c) == 0 + && !isWideControl(c)) { + int prev, test; + Boolean used = True; + int use_row; + int use_col; + + WriteNow(); + use_row = (screen->char_was_written + ? screen->last_written_row + : screen->cur_row); + use_col = (screen->char_was_written + ? screen->last_written_col + : screen->cur_col); + + /* + * Check if the latest data can be added to the base character. + * If there is already a combining character stored for the cell, + * we cannot, since that would change the order. + */ + if (screen->normalized_c + && !IsCellCombined(screen, use_row, use_col)) { + prev = (int) XTERM_CELL(use_row, use_col); + test = do_precomposition(prev, (int) c); + TRACE(("do_precomposition (U+%04X [%d], U+%04X [%d]) -> U+%04X [%d]\n", + prev, CharWidth(prev), + (int) c, CharWidth(c), + test, CharWidth(test))); + } else { + prev = -1; + test = -1; + } + + /* substitute combined character with precomposed character + * only if it does not change the width of the base character + */ + if (test != -1 + && CharWidth(test) == CharWidth(prev)) { + putXtermCell(screen, use_row, use_col, test); + } else if (screen->char_was_written + || getXtermCell(screen, use_row, use_col) >= ' ') { + addXtermCombining(screen, use_row, use_col, c); + } else { + /* + * none of the above... we will add the combining character as + * a base character. + */ + used = False; + } + + if (used) { + if (!screen->scroll_amt) + ScrnUpdate(xw, use_row, use_col, 1, 1, 1); + continue; + } + } +#endif + + /* Intercept characters for printer controller mode */ + if (PrinterOf(screen).printer_controlmode == 2) { + if ((c = (unsigned) xtermPrinterControl(xw, (int) c)) == 0) + continue; + } + + /* + * VT52 is a little ugly in the one place it has a parameterized + * control sequence, since the parameter falls after the character + * that denotes the type of sequence. + */ +#if OPT_VT52_MODE + if (sp->vt52_cup) { + if (nparam < NPARAM - 1) { + SetParam(nparam++, (int) (c & 0x7f) - 32); + parms.is_sub[nparam] = 0; + } + if (nparam < 2) + continue; + sp->vt52_cup = False; + CursorSet(screen, zero_if_default(0), zero_if_default(1), xw->flags); + sp->parsestate = vt52_table; + SetParam(0, 0); + SetParam(1, 0); + continue; + } +#endif + + laststate = sp->nextstate; + if (c == ANSI_DEL + && sp->parsestate == sp->groundtable + && sp->scssize == 96 + && sp->scstype != 0) { + /* + * Handle special case of shifts for 96-character sets by checking + * if we have a DEL. The other special case for SPACE will always + * be printable. + */ + sp->nextstate = CASE_PRINT; + } else +#if OPT_WIDE_CHARS + if (c > 255) { + /* + * The parsing tables all have 256 entries. If we're supporting + * wide characters, we handle them by treating them the same as + * printing characters. + */ + if (sp->parsestate == sp->groundtable) { + sp->nextstate = CASE_PRINT; + } else if (sp->parsestate == sos_table) { + c &= WIDEST_ICHAR; + if (c > 255) { + TRACE(("Found code > 255 while in SOS state: %04X\n", c)); + c = BAD_ASCII; + } + } else { + sp->nextstate = CASE_GROUND_STATE; + } + } else +#endif + sp->nextstate = sp->parsestate[E2A(c)]; + +#if OPT_BROKEN_OSC + /* + * Linux console palette escape sequences start with an OSC, but do + * not terminate correctly. Some scripts do not check before writing + * them, making xterm appear to hang (it's awaiting a valid string + * terminator). Just ignore these if we see them - there's no point + * in emulating bad code. + */ + if (screen->brokenLinuxOSC + && sp->parsestate == sos_table) { + if (sp->string_used) { + switch (sp->string_area[0]) { + case 'P': + if (sp->string_used <= 7) + break; + /* FALLTHRU */ + case 'R': + illegal_parse(xw, c, sp); + TRACE(("Reset to ground state (brokenLinuxOSC)\n")); + break; + } + } + } +#endif + +#if OPT_BROKEN_ST + /* + * Before patch #171, carriage control embedded within an OSC string + * would terminate it. Some (buggy, of course) applications rely on + * this behavior. Accommodate them by allowing one to compile xterm + * and emulate the old behavior. + */ + if (screen->brokenStringTerm + && sp->parsestate == sos_table + && c < 32) { + switch (c) { + case ANSI_EOT: /* FALLTHRU */ + case ANSI_BS: /* FALLTHRU */ + case ANSI_HT: /* FALLTHRU */ + case ANSI_LF: /* FALLTHRU */ + case ANSI_VT: /* FALLTHRU */ + case ANSI_FF: /* FALLTHRU */ + case ANSI_CR: /* FALLTHRU */ + case ANSI_SO: /* FALLTHRU */ + case ANSI_SI: /* FALLTHRU */ + case ANSI_XON: /* FALLTHRU */ + case ANSI_CAN: + illegal_parse(xw, c, sp); + TRACE(("Reset to ground state (brokenStringTerm)\n")); + break; + } + } +#endif + +#if OPT_C1_PRINT + /* + * This is not completely foolproof, but will allow an application + * with values in the C1 range to use them as printable characters, + * provided that they are not intermixed with an escape sequence. + */ + if (screen->c1_printable + && (c >= 128 && c < 256)) { + sp->nextstate = (sp->parsestate == esc_table + ? CASE_ESC_IGNORE + : sp->parsestate[E2A(160)]); + TRACE(("allowC1Printable %04X %s ->%s\n", + c, which_table(sp->parsestate), + visibleVTparse(sp->nextstate))); + } +#endif + +#if OPT_WIDE_CHARS + /* + * If we have a C1 code and the c1_printable flag is not set, simply + * ignore it when it was translated from UTF-8. That is because the + * value could not have been present as-is in the UTF-8. + * + * To see that CASE_IGNORE is a consistent value, note that it is + * always used for NUL and other uninteresting C0 controls. + */ +#if OPT_C1_PRINT + if (!screen->c1_printable) +#endif + if (screen->wide_chars + && (c >= 128 && c < 160)) { + sp->nextstate = CASE_IGNORE; + } + + /* + * If this character is a different width than the last one, put the + * previous text into the buffer and draw it now. + */ + this_is_wide = isWide((int) c); + if (this_is_wide != sp->last_was_wide) { + WriteNow(); + } +#endif + + /* + * Accumulate string for printable text. This may be 8/16-bit + * characters. + */ + if (sp->nextstate == CASE_PRINT) { + SafeAlloc(IChar, sp->print_area, sp->print_used, sp->print_size); + if (new_string == 0) { + xtermWarning("Cannot allocate %lu bytes for printable text\n", + (unsigned long) new_length); + continue; + } + SafeFree(sp->print_area, sp->print_size); +#if OPT_VT52_MODE + /* + * Strip output text to 7-bits for VT52. We should do this for + * VT100 also (which is a 7-bit device), but xterm has been + * doing this for so long we shouldn't change this behavior. + */ + if (screen->vtXX_level < 1) + c &= 0x7f; +#endif + sp->print_area[sp->print_used++] = (IChar) c; + sp->lastchar = thischar = (int) c; +#if OPT_WIDE_CHARS + sp->last_was_wide = this_is_wide; +#endif + if (morePtyData(screen, VTbuffer)) { + continue; + } + } + + if (sp->nextstate == CASE_PRINT + || (laststate == CASE_PRINT && sp->print_used)) { + WriteNow(); + } + + /* + * Accumulate string for APC, DCS, PM, OSC, SOS controls + * This should always be 8-bit characters. + */ + if (sp->parsestate == sos_table) { + SafeAlloc(Char, sp->string_area, sp->string_used, sp->string_size); + if (new_string == 0) { + xtermWarning("Cannot allocate %lu bytes for string mode %d\n", + (unsigned long) new_length, sp->string_mode); + continue; + } + SafeFree(sp->string_area, sp->string_size); +#if OPT_WIDE_CHARS + /* + * We cannot display codes above 255, but let's try to + * accommodate the application a little by not aborting the + * string. + */ + if ((c & WIDEST_ICHAR) > 255) { + sp->nextstate = CASE_PRINT; + c = BAD_ASCII; + } +#endif + sp->string_area[(sp->string_used)++] = CharOf(c); + } else if (sp->parsestate != esc_table) { + /* if we were accumulating, we're not any more */ + sp->string_mode = 0; + sp->string_used = 0; + } + + DumpParams(); + TRACE(("parse %04X -> %s %s (used=%lu)\n", + c, visibleVTparse(sp->nextstate), + which_table(sp->parsestate), + (unsigned long) sp->string_used)); + + /* + * If the parameter list has subparameters (tokens separated by ":") + * reject any controls that do not accept subparameters. + */ + if (parms.has_subparams) { + switch (sp->nextstate) { + case CASE_GROUND_STATE: + case CASE_CSI_IGNORE: + /* FALLTHRU */ + + case CASE_ESC_DIGIT: + case CASE_ESC_SEMI: + case CASE_ESC_COLON: + /* these states are required to parse parameter lists */ + break; + + case CASE_SGR: + TRACE(("...possible subparam usage\n")); + break; + + case CASE_CSI_DEC_DOLLAR_STATE: + case CASE_CSI_DOLLAR_STATE: + case CASE_CSI_HASH_STATE: + case CASE_CSI_EX_STATE: + case CASE_CSI_QUOTE_STATE: + case CASE_CSI_SPACE_STATE: + case CASE_CSI_STAR_STATE: + case CASE_CSI_TICK_STATE: + case CASE_DEC2_STATE: + case CASE_DEC3_STATE: + case CASE_DEC_STATE: + /* use this branch when we do not yet have the final character */ + TRACE(("...unexpected subparam usage\n")); + InitParams(); + sp->nextstate = CASE_CSI_IGNORE; + break; + + default: + /* use this branch for cases where we have the final character + * in the table that processed the parameter list. + */ + TRACE(("...unexpected subparam usage\n")); + ResetState(sp); + continue; + } + } + + if (xw->work.palette_changed) { + repaintWhenPaletteChanged(xw, sp); + } + + switch (sp->nextstate) { + case CASE_PRINT: + TRACE(("CASE_PRINT - printable characters\n")); + break; + + case CASE_GROUND_STATE: + TRACE(("CASE_GROUND_STATE - exit ignore mode\n")); + ResetState(sp); + break; + + case CASE_IGNORE: + TRACE(("CASE_IGNORE - Ignore character %02X\n", c)); + break; + + case CASE_ENQ: + TRACE(("CASE_ENQ - answerback\n")); + for (count = 0; screen->answer_back[count] != 0; count++) + unparseputc(xw, screen->answer_back[count]); + unparse_end(xw); + break; + + case CASE_BELL: + TRACE(("CASE_BELL - bell\n")); + if (sp->string_mode == ANSI_OSC) { + if (sp->string_used) + sp->string_area[--(sp->string_used)] = '\0'; + do_osc(xw, sp->string_area, sp->string_used, (int) c); + ResetState(sp); + } else { + /* bell */ + Bell(xw, XkbBI_TerminalBell, 0); + } + break; + + case CASE_BS: + TRACE(("CASE_BS - backspace\n")); + CursorBack(xw, 1); + break; + + case CASE_CR: + TRACE(("CASE_CR\n")); + CarriageReturn(xw); + break; + + case CASE_ESC: + if_OPT_VT52_MODE(screen, { + sp->parsestate = vt52_esc_table; + break; + }); + sp->parsestate = esc_table; + break; + +#if OPT_VT52_MODE + case CASE_VT52_CUP: + TRACE(("CASE_VT52_CUP - VT52 cursor addressing\n")); + sp->vt52_cup = True; + ResetState(sp); + break; + + case CASE_VT52_IGNORE: + TRACE(("CASE_VT52_IGNORE - VT52 ignore-character\n")); + sp->parsestate = vt52_ignore_table; + break; +#endif + + case CASE_VMOT: + TRACE(("CASE_VMOT\n")); + /* + * form feed, line feed, vertical tab + */ + xtermAutoPrint(xw, c); + xtermIndex(xw, 1); + if (xw->flags & LINEFEED) + CarriageReturn(xw); + else + do_xevents(xw); + break; + + case CASE_CBT: + TRACE(("CASE_CBT\n")); + /* cursor backward tabulation */ + count = one_if_default(0); + while ((count-- > 0) + && (TabToPrevStop(xw))) ; + ResetState(sp); + break; + + case CASE_CHT: + TRACE(("CASE_CHT\n")); + /* cursor forward tabulation */ + count = one_if_default(0); + while ((count-- > 0) + && (TabToNextStop(xw))) ; + ResetState(sp); + break; + + case CASE_TAB: + /* tab */ + TabToNextStop(xw); + break; + + case CASE_SI: + screen->curgl = 0; + if_OPT_VT52_MODE(screen, { + ResetState(sp); + }); + break; + + case CASE_SO: + screen->curgl = 1; + if_OPT_VT52_MODE(screen, { + ResetState(sp); + }); + break; + + case CASE_DECDHL: + xterm_DECDHL(xw, c == '3'); + ResetState(sp); + break; + + case CASE_DECSWL: + xterm_DECSWL(xw); + ResetState(sp); + break; + + case CASE_DECDWL: + xterm_DECDWL(xw); + ResetState(sp); + break; + + case CASE_SCR_STATE: + /* enter scr state */ + sp->parsestate = scrtable; + break; + + case CASE_SCS0_STATE: + /* enter scs state 0 */ + select_charset(sp, 0, 94); + break; + + case CASE_SCS1_STATE: + /* enter scs state 1 */ + select_charset(sp, 1, 94); + break; + + case CASE_SCS2_STATE: + /* enter scs state 2 */ + select_charset(sp, 2, 94); + break; + + case CASE_SCS3_STATE: + /* enter scs state 3 */ + select_charset(sp, 3, 94); + break; + + case CASE_SCS1A_STATE: + /* enter scs state 1 */ + select_charset(sp, 1, 96); + break; + + case CASE_SCS2A_STATE: + /* enter scs state 2 */ + select_charset(sp, 2, 96); + break; + + case CASE_SCS3A_STATE: + /* enter scs state 3 */ + select_charset(sp, 3, 96); + break; + + case CASE_ESC_IGNORE: + /* unknown escape sequence */ + sp->parsestate = eigtable; + break; + + case CASE_ESC_DIGIT: + /* digit in csi or dec mode */ + if (nparam > 0) { + value = zero_if_default(nparam - 1); + SetParam(nparam - 1, (10 * value) + ((int) c - '0')); + if (GetParam(nparam - 1) > 65535) + SetParam(nparam - 1, 65535); + if (sp->parsestate == csi_table) + sp->parsestate = csi2_table; + } + break; + + case CASE_ESC_SEMI: + /* semicolon in csi or dec mode */ + if (nparam < NPARAM) { + parms.is_sub[nparam] = 0; + SetParam(nparam++, DEFAULT); + } + if (sp->parsestate == csi_table) + sp->parsestate = csi2_table; + break; + + /* + * A _few_ commands accept colon-separated subparameters. + * Mark the parameter list so that we can exclude (most) bogus + * commands with simple/fast checks. + */ + case CASE_ESC_COLON: + if (nparam < NPARAM) { + parms.has_subparams = 1; + if (nparam == 0) { + parms.is_sub[nparam] = 1; + SetParam(nparam++, DEFAULT); + } else if (parms.is_sub[nparam - 1] == 0) { + parms.is_sub[nparam - 1] = 1; + parms.is_sub[nparam] = 2; + parms.params[nparam] = 0; + ++nparam; + } else { + parms.is_sub[nparam] = 1 + parms.is_sub[nparam - 1]; + parms.params[nparam] = 0; + ++nparam; + } + } + break; + + case CASE_DEC_STATE: + /* enter dec mode */ + sp->parsestate = dec_table; + break; + + case CASE_DEC2_STATE: + /* enter dec2 mode */ + sp->parsestate = dec2_table; + break; + + case CASE_DEC3_STATE: + /* enter dec3 mode */ + sp->parsestate = dec3_table; + break; + + case CASE_ICH: + TRACE(("CASE_ICH - insert char\n")); + InsertChar(xw, (unsigned) one_if_default(0)); + ResetState(sp); + break; + + case CASE_CUU: + TRACE(("CASE_CUU - cursor up\n")); + CursorUp(screen, one_if_default(0)); + ResetState(sp); + break; + + case CASE_CUD: + TRACE(("CASE_CUD - cursor down\n")); + CursorDown(screen, one_if_default(0)); + ResetState(sp); + break; + + case CASE_CUF: + TRACE(("CASE_CUF - cursor forward\n")); + CursorForward(xw, one_if_default(0)); + ResetState(sp); + break; + + case CASE_CUB: + TRACE(("CASE_CUB - cursor backward\n")); + CursorBack(xw, one_if_default(0)); + ResetState(sp); + break; + + case CASE_CUP: + TRACE(("CASE_CUP - cursor position\n")); + if_OPT_XMC_GLITCH(screen, { + Jump_XMC(xw); + }); + CursorSet(screen, one_if_default(0) - 1, one_if_default(1) - 1, xw->flags); + ResetState(sp); + break; + + case CASE_VPA: + TRACE(("CASE_VPA - vertical position absolute\n")); + CursorSet(screen, one_if_default(0) - 1, CursorCol(xw), xw->flags); + ResetState(sp); + break; + + case CASE_HPA: + TRACE(("CASE_HPA - horizontal position absolute\n")); + CursorSet(screen, CursorRow(xw), one_if_default(0) - 1, xw->flags); + ResetState(sp); + break; + + case CASE_VPR: + TRACE(("CASE_VPR - vertical position relative\n")); + CursorSet(screen, + CursorRow(xw) + one_if_default(0), + CursorCol(xw), + xw->flags); + ResetState(sp); + break; + + case CASE_HPR: + TRACE(("CASE_HPR - horizontal position relative\n")); + CursorSet(screen, + CursorRow(xw), + CursorCol(xw) + one_if_default(0), + xw->flags); + ResetState(sp); + break; + + case CASE_HP_BUGGY_LL: + TRACE(("CASE_HP_BUGGY_LL\n")); + /* Some HP-UX applications have the bug that they + assume ESC F goes to the lower left corner of + the screen, regardless of what terminfo says. */ + if (screen->hp_ll_bc) + CursorSet(screen, screen->max_row, 0, xw->flags); + ResetState(sp); + break; + + case CASE_ED: + TRACE(("CASE_ED - erase display\n")); + do_cd_xtra_scroll(xw); + do_erase_display(xw, zero_if_default(0), OFF_PROTECT); + ResetState(sp); + break; + + case CASE_EL: + TRACE(("CASE_EL - erase line\n")); + do_erase_line(xw, zero_if_default(0), OFF_PROTECT); + ResetState(sp); + break; + + case CASE_ECH: + TRACE(("CASE_ECH - erase char\n")); + /* ECH */ + do_erase_char(xw, one_if_default(0), OFF_PROTECT); + ResetState(sp); + break; + + case CASE_IL: + TRACE(("CASE_IL - insert line\n")); + InsertLine(xw, one_if_default(0)); + ResetState(sp); + break; + + case CASE_DL: + TRACE(("CASE_DL - delete line\n")); + DeleteLine(xw, one_if_default(0)); + ResetState(sp); + break; + + case CASE_DCH: + TRACE(("CASE_DCH - delete char\n")); + DeleteChar(xw, (unsigned) one_if_default(0)); + ResetState(sp); + break; + + case CASE_TRACK_MOUSE: + /* + * A single parameter other than zero is always scroll-down. + * A zero-parameter is used to reset the mouse mode, and is + * not useful for scrolling anyway. + */ + if (nparam > 1 || GetParam(0) == 0) { + CELL start; + + TRACE(("CASE_TRACK_MOUSE\n")); + /* Track mouse as long as in window and between + * specified rows + */ + start.row = one_if_default(2) - 1; + start.col = GetParam(1) - 1; + TrackMouse(xw, + GetParam(0), + &start, + GetParam(3) - 1, GetParam(4) - 2); + } else { + TRACE(("CASE_SD - scroll down\n")); + /* SD */ + RevScroll(xw, one_if_default(0)); + do_xevents(xw); + } + ResetState(sp); + break; + + case CASE_SD: + /* + * Cater to ECMA-48's typographical error... + */ + TRACE(("CASE_SD - scroll down\n")); + RevScroll(xw, one_if_default(0)); + do_xevents(xw); + ResetState(sp); + break; + + case CASE_DECID: + TRACE(("CASE_DECID\n")); + if_OPT_VT52_MODE(screen, { + unparseputc(xw, ANSI_ESC); + unparseputc(xw, '/'); + unparseputc(xw, 'Z'); + unparse_end(xw); + ResetState(sp); + break; + }); + SetParam(0, DEFAULT); /* Default ID parameter */ + /* FALLTHRU */ + case CASE_DA1: + TRACE(("CASE_DA1\n")); + if (GetParam(0) <= 0) { /* less than means DEFAULT */ + count = 0; + init_reply(ANSI_CSI); + reply.a_pintro = '?'; + + /* + * The first parameter corresponds to the highest operating + * level (i.e., service level) of the emulation. A DEC + * terminal can be setup to respond with a different DA + * response, but there's no control sequence that modifies + * this. We set it via a resource. + */ + if (screen->terminal_id < 200) { + switch (screen->terminal_id) { + case 132: + reply.a_param[count++] = 4; /* VT132 */ +#if OPT_REGIS_GRAPHICS + reply.a_param[count++] = 6; /* no STP, AVO, GPO (ReGIS) */ +#else + reply.a_param[count++] = 2; /* no STP, AVO, no GPO (ReGIS) */ +#endif + break; + case 131: + reply.a_param[count++] = 7; /* VT131 */ + break; + case 125: + reply.a_param[count++] = 12; /* VT125 */ +#if OPT_REGIS_GRAPHICS + reply.a_param[count++] = 0 | 2 | 1; /* no STP, AVO, GPO (ReGIS) */ +#else + reply.a_param[count++] = 0 | 2 | 0; /* no STP, AVO, no GPO (ReGIS) */ +#endif + reply.a_param[count++] = 0; /* no printer */ + reply.a_param[count++] = XTERM_PATCH; /* ROM version */ + break; + case 102: + reply.a_param[count++] = 6; /* VT102 */ + break; + case 101: + reply.a_param[count++] = 1; /* VT101 */ + reply.a_param[count++] = 0; /* no options */ + break; + default: /* VT100 */ + reply.a_param[count++] = 1; /* VT100 */ + reply.a_param[count++] = 0 | 2 | 0; /* no STP, AVO, no GPO (ReGIS) */ + break; + } + } else { + reply.a_param[count++] = (ParmType) (60 + + screen->terminal_id + / 100); + reply.a_param[count++] = 1; /* 132-columns */ + reply.a_param[count++] = 2; /* printer */ +#if OPT_REGIS_GRAPHICS + if (optRegisGraphics(screen)) { + reply.a_param[count++] = 3; /* ReGIS graphics */ + } +#endif +#if OPT_SIXEL_GRAPHICS + if (optSixelGraphics(screen)) { + reply.a_param[count++] = 4; /* sixel graphics */ + } +#endif + reply.a_param[count++] = 6; /* selective-erase */ +#if OPT_SUNPC_KBD + if (xw->keyboard.type == keyboardIsVT220) +#endif + reply.a_param[count++] = 8; /* user-defined-keys */ + reply.a_param[count++] = 9; /* national replacement charsets */ + reply.a_param[count++] = 15; /* technical characters */ + reply.a_param[count++] = 16; /* locator port */ + if (screen->terminal_id >= 400) { + reply.a_param[count++] = 17; /* terminal state interrogation */ + reply.a_param[count++] = 18; /* windowing extension */ + reply.a_param[count++] = 21; /* horizontal scrolling */ + } + if_OPT_ISO_COLORS(screen, { + reply.a_param[count++] = 22; /* ANSI color, VT525 */ + }); + reply.a_param[count++] = 28; /* rectangular editing */ +#if OPT_DEC_LOCATOR + reply.a_param[count++] = 29; /* ANSI text locator */ +#endif + } + reply.a_nparam = (ParmType) count; + reply.a_inters = 0; + reply.a_final = 'c'; + unparseseq(xw, &reply); + } + ResetState(sp); + break; + + case CASE_DA2: + TRACE(("CASE_DA2\n")); + if (GetParam(0) <= 0) { /* less than means DEFAULT */ + count = 0; + init_reply(ANSI_CSI); + reply.a_pintro = '>'; + + if (screen->terminal_id >= 200) { + switch (screen->terminal_id) { + case 220: + default: + reply.a_param[count++] = 1; /* VT220 */ + break; + case 240: + case 241: + /* http://www.decuslib.com/DECUS/vax87a/gendyn/vt200_kind.lis */ + reply.a_param[count++] = 2; /* VT240 */ + break; + case 320: + /* http://www.vt100.net/docs/vt320-uu/appendixe.html */ + reply.a_param[count++] = 24; /* VT320 */ + break; + case 330: + reply.a_param[count++] = 18; /* VT330 */ + break; + case 340: + reply.a_param[count++] = 19; /* VT340 */ + break; + case 382: + reply.a_param[count++] = 32; /* VT382 */ + break; + case 420: + reply.a_param[count++] = 41; /* VT420 */ + break; + case 510: + /* http://www.vt100.net/docs/vt510-rm/DA2 */ + reply.a_param[count++] = 61; /* VT510 */ + break; + case 520: + reply.a_param[count++] = 64; /* VT520 */ + break; + case 525: + reply.a_param[count++] = 65; /* VT525 */ + break; + } + } else { + reply.a_param[count++] = 0; /* VT100 (nonstandard) */ + } + reply.a_param[count++] = XTERM_PATCH; /* Version */ + reply.a_param[count++] = 0; /* options (none) */ + reply.a_nparam = (ParmType) count; + reply.a_inters = 0; + reply.a_final = 'c'; + unparseseq(xw, &reply); + } + ResetState(sp); + break; + + case CASE_DECRPTUI: + TRACE(("CASE_DECRPTUI\n")); + if ((screen->vtXX_level >= 4) + && (GetParam(0) <= 0)) { /* less than means DEFAULT */ + unparseputc1(xw, ANSI_DCS); + unparseputc(xw, '!'); + unparseputc(xw, '|'); + /* report the "terminal unit id" as 4 pairs of hexadecimal + * digits -- meaningless for a terminal emulator, but some + * host may care about the format. + */ + for (count = 0; count < 8; ++count) { + unparseputc(xw, '0'); + } + unparseputc1(xw, ANSI_ST); + unparse_end(xw); + } + ResetState(sp); + break; + + case CASE_TBC: + TRACE(("CASE_TBC - tab clear\n")); + if ((value = GetParam(0)) <= 0) /* less than means default */ + TabClear(xw->tabs, screen->cur_col); + else if (value == 3) + TabZonk(xw->tabs); + ResetState(sp); + break; + + case CASE_SET: + TRACE(("CASE_SET - set mode\n")); + ansi_modes(xw, bitset); + ResetState(sp); + break; + + case CASE_RST: + TRACE(("CASE_RST - reset mode\n")); + ansi_modes(xw, bitclr); + ResetState(sp); + break; + + case CASE_SGR: + for (item = 0; item < nparam; ++item) { + int op = GetParam(item); + int skip; + + if_OPT_XMC_GLITCH(screen, { + Mark_XMC(xw, op); + }); + TRACE(("CASE_SGR %d\n", op)); + + /* + * Only SGR 38/48 accept subparameters, and in those cases + * the values will not be seen at this point. + */ + if ((skip = param_has_subparams(item))) { + switch (op) { + case 38: + /* FALLTHRU */ + case 48: + if_OPT_ISO_COLORS(screen, { + break; + }); + /* FALLTHRU */ + default: + TRACE(("...unexpected subparameter in SGR\n")); + item += skip; /* ignore this */ + op = NPARAM; /* will never use this, anyway */ + break; + } + } + + switch (op) { + case DEFAULT: + /* FALLTHRU */ + case 0: + resetRendition(xw); + if_OPT_ISO_COLORS(screen, { + reset_SGR_Colors(xw); + }); + break; + case 1: /* Bold */ + UIntSet(xw->flags, BOLD); + if_OPT_ISO_COLORS(screen, { + setExtendedFG(xw); + }); + break; +#if OPT_WIDE_ATTRS + case 2: /* faint, decreased intensity or second colour */ + UIntSet(xw->flags, ATR_FAINT); + if_OPT_ISO_COLORS(screen, { + setExtendedFG(xw); + }); + break; + case 3: /* italicized */ + setItalicFont(xw, UseItalicFont(screen)); + UIntSet(xw->flags, ATR_ITALIC); + if_OPT_ISO_COLORS(screen, { + setExtendedFG(xw); + }); + break; +#endif + case 4: /* Underscore */ + UIntSet(xw->flags, UNDERLINE); + if_OPT_ISO_COLORS(screen, { + setExtendedFG(xw); + }); + break; + case 5: /* Blink (less than 150 per minute) */ + /* FALLTHRU */ + case 6: /* Blink (150 per minute, or more) */ + UIntSet(xw->flags, BLINK); + StartBlinking(xw); + if_OPT_ISO_COLORS(screen, { + setExtendedFG(xw); + }); + break; + case 7: + UIntSet(xw->flags, INVERSE); + if_OPT_ISO_COLORS(screen, { + setExtendedBG(xw); + }); + break; + case 8: + UIntSet(xw->flags, INVISIBLE); + break; +#if OPT_WIDE_ATTRS + case 9: /* crossed-out characters */ + UIntSet(xw->flags, ATR_STRIKEOUT); + break; +#endif +#if OPT_WIDE_ATTRS + case 21: /* doubly-underlined */ + UIntSet(xw->flags, ATR_DBL_UNDER); + break; +#endif + case 22: /* reset 'bold' */ + UIntClr(xw->flags, BOLD); +#if OPT_WIDE_ATTRS + UIntClr(xw->flags, ATR_FAINT); +#endif + if_OPT_ISO_COLORS(screen, { + setExtendedFG(xw); + }); + break; +#if OPT_WIDE_ATTRS + case 23: /* not italicized */ + ResetItalics(xw); + if_OPT_ISO_COLORS(screen, { + setExtendedFG(xw); + }); + break; +#endif + case 24: + UIntClr(xw->flags, UNDERLINE); +#if OPT_WIDE_ATTRS + UIntClr(xw->flags, ATR_DBL_UNDER); +#endif + if_OPT_ISO_COLORS(screen, { + setExtendedFG(xw); + }); + break; + case 25: /* reset 'blink' */ + UIntClr(xw->flags, BLINK); + if_OPT_ISO_COLORS(screen, { + setExtendedFG(xw); + }); + break; + case 27: + UIntClr(xw->flags, INVERSE); + if_OPT_ISO_COLORS(screen, { + setExtendedBG(xw); + }); + break; + case 28: + UIntClr(xw->flags, INVISIBLE); + break; +#if OPT_WIDE_ATTRS + case 29: /* not crossed out */ + UIntClr(xw->flags, ATR_STRIKEOUT); + break; +#endif + case 30: + /* FALLTHRU */ + case 31: + /* FALLTHRU */ + case 32: + /* FALLTHRU */ + case 33: + /* FALLTHRU */ + case 34: + /* FALLTHRU */ + case 35: + /* FALLTHRU */ + case 36: + /* FALLTHRU */ + case 37: + if_OPT_ISO_COLORS(screen, { + xw->sgr_foreground = (op - 30); + xw->sgr_38_xcolors = False; + clrDirectFG(xw->flags); + setExtendedFG(xw); + }); + break; + case 38: + /* This is more complicated than I'd like, but it should + * properly eat all the parameters for unsupported modes. + */ + if_OPT_ISO_COLORS(screen, { + Boolean extended; + if (parse_extended_colors(xw, &value, &item, + &extended)) { + xw->sgr_foreground = value; + xw->sgr_38_xcolors = True; + setDirectFG(xw->flags, extended); + setExtendedFG(xw); + } + }); + break; + case 39: + if_OPT_ISO_COLORS(screen, { + reset_SGR_Foreground(xw); + }); + break; + case 40: + /* FALLTHRU */ + case 41: + /* FALLTHRU */ + case 42: + /* FALLTHRU */ + case 43: + /* FALLTHRU */ + case 44: + /* FALLTHRU */ + case 45: + /* FALLTHRU */ + case 46: + /* FALLTHRU */ + case 47: + if_OPT_ISO_COLORS(screen, { + xw->sgr_background = (op - 40); + clrDirectBG(xw->flags); + setExtendedBG(xw); + }); + break; + case 48: + if_OPT_ISO_COLORS(screen, { + Boolean extended; + if (parse_extended_colors(xw, &value, &item, + &extended)) { + xw->sgr_background = value; + setDirectBG(xw->flags, extended); + setExtendedBG(xw); + } + }); + break; + case 49: + if_OPT_ISO_COLORS(screen, { + reset_SGR_Background(xw); + }); + break; + case 90: + /* FALLTHRU */ + case 91: + /* FALLTHRU */ + case 92: + /* FALLTHRU */ + case 93: + /* FALLTHRU */ + case 94: + /* FALLTHRU */ + case 95: + /* FALLTHRU */ + case 96: + /* FALLTHRU */ + case 97: + if_OPT_AIX_COLORS(screen, { + xw->sgr_foreground = (op - 90 + 8); + clrDirectFG(xw->flags); + setExtendedFG(xw); + }); + break; + case 100: +#if !OPT_AIX_COLORS + if_OPT_ISO_COLORS(screen, { + reset_SGR_Foreground(xw); + reset_SGR_Background(xw); + }); + break; +#endif + case 101: + /* FALLTHRU */ + case 102: + /* FALLTHRU */ + case 103: + /* FALLTHRU */ + case 104: + /* FALLTHRU */ + case 105: + /* FALLTHRU */ + case 106: + /* FALLTHRU */ + case 107: + if_OPT_AIX_COLORS(screen, { + xw->sgr_background = (op - 100 + 8); + clrDirectBG(xw->flags); + setExtendedBG(xw); + }); + break; + default: + skip += NPARAM; + break; + } + } + ResetState(sp); + break; + + /* DSR (except for the '?') is a superset of CPR */ + case CASE_DSR: + sp->private_function = True; + + /* FALLTHRU */ + case CASE_CPR: + TRACE(("CASE_DSR - device status report\n")); + count = 0; + init_reply(ANSI_CSI); + reply.a_pintro = CharOf(sp->private_function ? '?' : 0); + reply.a_inters = 0; + reply.a_final = 'n'; + + switch (GetParam(0)) { + case 5: + TRACE(("...request operating status\n")); + /* operating status */ + reply.a_param[count++] = 0; /* (no malfunction ;-) */ + break; + case 6: + TRACE(("...request %s\n", + (sp->private_function + ? "DECXCPR" + : "CPR"))); + /* CPR */ + /* DECXCPR (with page=1) */ + value = (screen->cur_row + 1); + if ((xw->flags & ORIGIN) != 0) { + value -= screen->top_marg; + } + reply.a_param[count++] = (ParmType) value; + + value = (screen->cur_col + 1); + if ((xw->flags & ORIGIN) != 0) { + value -= screen->lft_marg; + } + reply.a_param[count++] = (ParmType) value; + + if (sp->private_function + && screen->vtXX_level >= 4) { /* VT420 */ + reply.a_param[count++] = 1; + } + reply.a_final = 'R'; + break; + case 15: + TRACE(("...request printer status\n")); + if (sp->private_function + && screen->vtXX_level >= 2) { /* VT220 */ + reply.a_param[count++] = 13; /* no printer detected */ + } + break; + case 25: + TRACE(("...request UDK status\n")); + if (sp->private_function + && screen->vtXX_level >= 2) { /* VT220 */ + reply.a_param[count++] = 20; /* UDK always unlocked */ + } + break; + case 26: + TRACE(("...request keyboard status\n")); + if (sp->private_function + && screen->vtXX_level >= 2) { /* VT220 */ + reply.a_param[count++] = 27; + reply.a_param[count++] = 1; /* North American */ + if (screen->vtXX_level >= 3) { /* VT320 */ + reply.a_param[count++] = 0; /* ready */ + } + if (screen->vtXX_level >= 4) { /* VT420 */ + reply.a_param[count++] = 0; /* LK201 */ + } + } + break; + case 53: /* according to existing xterm handling */ + /* FALLTHRU */ + case 55: /* according to the VT330/VT340 Text Programming Manual */ + TRACE(("...request locator status\n")); + if (sp->private_function + && screen->vtXX_level >= 3) { /* VT330 */ +#if OPT_DEC_LOCATOR + reply.a_param[count++] = 50; /* locator ready */ +#else + reply.a_param[count++] = 53; /* no locator */ +#endif + } + break; + case 56: + TRACE(("...request locator type\n")); + if (sp->private_function + && screen->vtXX_level >= 3) { /* VT330 */ + reply.a_param[count++] = 57; +#if OPT_DEC_LOCATOR + reply.a_param[count++] = 1; /* mouse */ +#else + reply.a_param[count++] = 0; /* unknown */ +#endif + } + break; + case 62: + TRACE(("...request DECMSR - macro space\n")); + if (sp->private_function + && screen->vtXX_level >= 4) { /* VT420 */ + reply.a_pintro = 0; + reply.a_radix[count] = 16; /* no data */ + reply.a_param[count++] = 0; /* no space for macros */ + reply.a_inters = '*'; + reply.a_final = L_CURL; + } + break; + case 63: + TRACE(("...request DECCKSR - memory checksum\n")); + /* DECCKSR - Memory checksum */ + if (sp->private_function + && screen->vtXX_level >= 4) { /* VT420 */ + init_reply(ANSI_DCS); + reply.a_param[count++] = (ParmType) GetParam(1); /* PID */ + reply.a_delim = "!~"; /* delimiter */ + reply.a_radix[count] = 16; /* use hex */ + reply.a_param[count++] = 0; /* no data */ + } + break; + case 75: + TRACE(("...request data integrity\n")); + if (sp->private_function + && screen->vtXX_level >= 4) { /* VT420 */ + reply.a_param[count++] = 70; /* no errors */ + } + break; + case 85: + TRACE(("...request multi-session configuration\n")); + if (sp->private_function + && screen->vtXX_level >= 4) { /* VT420 */ + reply.a_param[count++] = 83; /* not configured */ + } + break; + default: + break; + } + + if ((reply.a_nparam = (ParmType) count) != 0) + unparseseq(xw, &reply); + + ResetState(sp); + sp->private_function = False; + break; + + case CASE_MC: + TRACE(("CASE_MC - media control\n")); + xtermMediaControl(xw, GetParam(0), False); + ResetState(sp); + break; + + case CASE_DEC_MC: + TRACE(("CASE_DEC_MC - DEC media control\n")); + xtermMediaControl(xw, GetParam(0), True); + ResetState(sp); + break; + + case CASE_HP_MEM_LOCK: + /* FALLTHRU */ + case CASE_HP_MEM_UNLOCK: + TRACE(("%s\n", ((sp->parsestate[c] == CASE_HP_MEM_LOCK) + ? "CASE_HP_MEM_LOCK" + : "CASE_HP_MEM_UNLOCK"))); + if (screen->scroll_amt) + FlushScroll(xw); + if (sp->parsestate[c] == CASE_HP_MEM_LOCK) + set_tb_margins(screen, screen->cur_row, screen->bot_marg); + else + set_tb_margins(screen, 0, screen->bot_marg); + ResetState(sp); + break; + + case CASE_DECSTBM: + TRACE(("CASE_DECSTBM - set scrolling region\n")); + { + int top; + int bot; + top = one_if_default(0); + if (nparam < 2 || (bot = GetParam(1)) == DEFAULT + || bot > MaxRows(screen) + || bot == 0) + bot = MaxRows(screen); + if (bot > top) { + if (screen->scroll_amt) + FlushScroll(xw); + set_tb_margins(screen, top - 1, bot - 1); + CursorSet(screen, 0, 0, xw->flags); + } + ResetState(sp); + } + break; + + case CASE_DECREQTPARM: + TRACE(("CASE_DECREQTPARM\n")); + if (screen->terminal_id < 200) { /* VT102 */ + value = zero_if_default(0); + if (value == 0 || value == 1) { + init_reply(ANSI_CSI); + reply.a_pintro = 0; + reply.a_nparam = 7; + reply.a_param[0] = (ParmType) (value + 2); + reply.a_param[1] = 1; /* no parity */ + reply.a_param[2] = 1; /* eight bits */ + reply.a_param[3] = 128; /* transmit 38.4k baud */ + reply.a_param[4] = 128; /* receive 38.4k baud */ + reply.a_param[5] = 1; /* clock multiplier ? */ + reply.a_param[6] = 0; /* STP flags ? */ + reply.a_inters = 0; + reply.a_final = 'x'; + unparseseq(xw, &reply); + } + } + ResetState(sp); + break; + + case CASE_DECSET: + /* DECSET */ +#if OPT_VT52_MODE + if (screen->vtXX_level != 0) +#endif + dpmodes(xw, bitset); + ResetState(sp); +#if OPT_TEK4014 + if (TEK4014_ACTIVE(xw)) { + TRACE(("Tek4014 is now active...\n")); + return False; + } +#endif + break; + + case CASE_DECRST: + /* DECRST */ + dpmodes(xw, bitclr); + init_groundtable(screen, sp); + ResetState(sp); + break; + + case CASE_DECALN: + TRACE(("CASE_DECALN - alignment test\n")); + if (screen->cursor_state) + HideCursor(); + /* + * DEC STD 070 does not mention left/right margins. Likely the + * text was for VT100, and not updated for VT420. + */ + resetRendition(xw); + resetMargins(xw); + CursorSet(screen, 0, 0, xw->flags); + xtermParseRect(xw, 0, 0, &myRect); + ScrnFillRectangle(xw, &myRect, 'E', 0, False); + ResetState(sp); + break; + + case CASE_GSETS5: + if (screen->vtXX_level < 5) { + ResetState(sp); + break; + } + /* FALLTHRU */ + case CASE_GSETS3: + if (screen->vtXX_level < 3) { + ResetState(sp); + break; + } + /* FALLTHRU */ + case CASE_GSETS: + if (screen->vtXX_level >= 2 || strchr("012AB", (int) c) != 0) { + TRACE(("CASE_GSETS(%d) = '%c'\n", sp->scstype, c)); + xtermDecodeSCS(xw, sp->scstype, 0, (int) c); + } + ResetState(sp); + break; + + case CASE_ANSI_SC: + if (IsLeftRightMode(xw)) { + int left; + int right; + + TRACE(("CASE_DECSLRM - set left and right margin\n")); + left = one_if_default(0); + if (nparam < 2 || (right = GetParam(1)) == DEFAULT + || right > MaxCols(screen) + || right == 0) + right = MaxCols(screen); + if (right > left) { + set_lr_margins(screen, left - 1, right - 1); + CursorSet(screen, 0, 0, xw->flags); + } + } else { + TRACE(("CASE_ANSI_SC - save cursor\n")); + CursorSave(xw); + } + ResetState(sp); + break; + + case CASE_DECSC: + TRACE(("CASE_DECSC - save cursor\n")); + CursorSave(xw); + ResetState(sp); + break; + + case CASE_ANSI_RC: + /* FALLTHRU */ + case CASE_DECRC: + TRACE(("CASE_%sRC - restore cursor\n", + (sp->nextstate == CASE_DECRC) ? "DEC" : "ANSI_")); + CursorRestore(xw); + if_OPT_ISO_COLORS(screen, { + setExtendedFG(xw); + }); + ResetState(sp); + break; + + case CASE_DECKPAM: + TRACE(("CASE_DECKPAM\n")); + xw->keyboard.flags |= MODE_DECKPAM; + update_appkeypad(); + ResetState(sp); + break; + + case CASE_DECKPNM: + TRACE(("CASE_DECKPNM\n")); + UIntClr(xw->keyboard.flags, MODE_DECKPAM); + update_appkeypad(); + ResetState(sp); + break; + + case CASE_CSI_QUOTE_STATE: + sp->parsestate = csi_quo_table; + break; + +#if OPT_BLINK_CURS + case CASE_CSI_SPACE_STATE: + sp->parsestate = csi_sp_table; + break; + + case CASE_DECSCUSR: + TRACE(("CASE_DECSCUSR\n")); + { + Boolean change = True; + int blinks = screen->cursor_blink_esc; + + HideCursor(); + + switch (GetParam(0)) { + case DEFAULT: + /* FALLTHRU */ + case DEFAULT_STYLE: + /* FALLTHRU */ + case BLINK_BLOCK: + blinks = True; + screen->cursor_shape = CURSOR_BLOCK; + break; + case STEADY_BLOCK: + blinks = False; + screen->cursor_shape = CURSOR_BLOCK; + break; + case BLINK_UNDERLINE: + blinks = True; + screen->cursor_shape = CURSOR_UNDERLINE; + break; + case STEADY_UNDERLINE: + blinks = False; + screen->cursor_shape = CURSOR_UNDERLINE; + break; + case BLINK_BAR: + blinks = True; + screen->cursor_shape = CURSOR_BAR; + break; + case STEADY_BAR: + blinks = False; + screen->cursor_shape = CURSOR_BAR; + break; + default: + change = False; + break; + } + TRACE(("cursor_shape:%d blinks:%s\n", + screen->cursor_shape, BtoS(blinks))); + if (change) { + xtermSetCursorBox(screen); + screen->cursor_blink_esc = blinks; + UpdateCursorBlink(xw); + } + } + ResetState(sp); + break; +#endif + +#if OPT_SCROLL_LOCK + case CASE_DECLL: + TRACE(("CASE_DECLL\n")); + if (nparam > 0) { + for (count = 0; count < nparam; ++count) { + int op = zero_if_default(count); + switch (op) { + case 0: + case DEFAULT: + xtermClearLEDs(screen); + break; + case 1: + /* FALLTHRU */ + case 2: + /* FALLTHRU */ + case 3: + xtermShowLED(screen, + (Cardinal) op, + True); + break; + case 21: + /* FALLTHRU */ + case 22: + /* FALLTHRU */ + case 23: + xtermShowLED(screen, + (Cardinal) (op - 20), + True); + break; + } + } + } else { + xtermClearLEDs(screen); + } + ResetState(sp); + break; +#endif + +#if OPT_VT52_MODE + case CASE_VT52_FINISH: + TRACE(("CASE_VT52_FINISH terminal_id %d, vtXX_level %d\n", + screen->terminal_id, + screen->vtXX_level)); + if (screen->terminal_id >= 100 + && screen->vtXX_level == 0) { + sp->groundtable = + sp->parsestate = ansi_table; + /* + * On restore, the terminal does not recognize DECRQSS for + * DECSCL (per vttest). + */ + screen->vtXX_level = 1; + xw->flags = screen->vt52_save_flags; + screen->curgl = screen->vt52_save_curgl; + screen->curgr = screen->vt52_save_curgr; + screen->curss = screen->vt52_save_curss; + restoreCharsets(screen, screen->vt52_save_gsets); + update_vt52_vt100_settings(); + } + break; +#endif + + case CASE_ANSI_LEVEL_1: + TRACE(("CASE_ANSI_LEVEL_1\n")); + set_ansi_conformance(screen, 1); + ResetState(sp); + break; + + case CASE_ANSI_LEVEL_2: + TRACE(("CASE_ANSI_LEVEL_2\n")); + set_ansi_conformance(screen, 2); + ResetState(sp); + break; + + case CASE_ANSI_LEVEL_3: + TRACE(("CASE_ANSI_LEVEL_3\n")); + set_ansi_conformance(screen, 3); + ResetState(sp); + break; + + case CASE_DECSCL: + TRACE(("CASE_DECSCL(%d,%d)\n", GetParam(0), GetParam(1))); + /* + * This changes the emulation level, and is not recognized by + * VT100s. However, a VT220 or above can be set to conformance + * level 1 to act like a VT100. + */ + if (screen->terminal_id >= 200) { + /* + * Disallow unrecognized parameters, as well as attempts to set + * the operating level higher than the given terminal-id. + */ + if (GetParam(0) >= 61 + && GetParam(0) <= 60 + (screen->terminal_id / 100)) { + int new_vtXX_level = GetParam(0) - 60; + int case_value = zero_if_default(1); + /* + * Note: + * + * The VT300, VT420, VT520 manuals claim that DECSCL does a + * hard reset (RIS). + * + * Both the VT220 manual and DEC STD 070 (which documents + * levels 1-4 in detail) state that it is a soft reset. + * + * Perhaps both sets of manuals are right (unlikely). + * Kermit says it's soft. + */ + ReallyReset(xw, False, False); + init_parser(xw, sp); + screen->vtXX_level = new_vtXX_level; + if (new_vtXX_level > 1) { + switch (case_value) { + case 1: + show_8bit_control(False); + break; + case 0: + case 2: + show_8bit_control(True); + break; + } + } + } + } + ResetState(sp); + break; + + case CASE_DECSCA: + TRACE(("CASE_DECSCA\n")); + screen->protected_mode = DEC_PROTECT; + if (GetParam(0) <= 0 || GetParam(0) == 2) { + UIntClr(xw->flags, PROTECTED); + TRACE(("...clear PROTECTED\n")); + } else if (GetParam(0) == 1) { + xw->flags |= PROTECTED; + TRACE(("...set PROTECTED\n")); + } + ResetState(sp); + break; + + case CASE_DECSED: + TRACE(("CASE_DECSED\n")); + do_erase_display(xw, zero_if_default(0), DEC_PROTECT); + ResetState(sp); + break; + + case CASE_DECSEL: + TRACE(("CASE_DECSEL\n")); + do_erase_line(xw, zero_if_default(0), DEC_PROTECT); + ResetState(sp); + break; + + case CASE_GRAPHICS_ATTRIBUTES: +#if OPT_GRAPHICS + TRACE(("CASE_GRAPHICS_ATTRIBUTES\n")); + { + /* request: item, action, value */ + /* reply: item, status, value */ + if (nparam != 3) { + TRACE(("DATA_ERROR: malformed CASE_GRAPHICS_ATTRIBUTES request with %d parameters\n", nparam)); + } else { + int status = 3; /* assume failure */ + int result = 0; + int result2 = 0; + + TRACE(("CASE_GRAPHICS_ATTRIBUTES request: %d, %d, %d\n", + GetParam(0), GetParam(1), GetParam(2))); + switch (GetParam(0)) { + case 1: /* color register count */ + switch (GetParam(1)) { + case 1: /* read */ + status = 0; /* success */ + result = (int) get_color_register_count(screen); + break; + case 2: /* reset */ + screen->numcolorregisters = 0; + status = 0; /* success */ + result = (int) get_color_register_count(screen); + break; + case 3: /* set */ + if (GetParam(2) > 1 && + (unsigned) GetParam(2) <= MAX_COLOR_REGISTERS) { + screen->numcolorregisters = GetParam(2); + status = 0; /* success */ + result = (int) get_color_register_count(screen); + } + break; + case 4: /* read maximum */ + status = 0; /* success */ + result = MAX_COLOR_REGISTERS; + break; + default: + TRACE(("DATA_ERROR: CASE_GRAPHICS_ATTRIBUTES color register count request with unknown action parameter: %d\n", + GetParam(1))); + status = 2; /* error in Pa */ + break; + } + break; + case 2: /* graphics geometry */ + switch (GetParam(1)) { + case 1: /* read */ + TRACE(("Get sixel graphics geometry\n")); + status = 0; /* success */ + result = Min(Width(screen), screen->graphics_max_wide); + result2 = Min(Height(screen), screen->graphics_max_high); + break; + case 2: /* reset */ + /* FALLTHRU */ + case 3: /* set */ + break; + case 4: /* read maximum */ + status = 0; /* success */ + result = screen->graphics_max_wide; + result2 = screen->graphics_max_high; + break; + default: + TRACE(("DATA_ERROR: CASE_GRAPHICS_ATTRIBUTES graphics geometry request with unknown action parameter: %d\n", + GetParam(1))); + status = 2; /* error in Pa */ + break; + } + break; +# if OPT_REGIS_GRAPHICS + case 3: /* ReGIS geometry */ + switch (GetParam(1)) { + case 1: /* read */ + status = 0; /* success */ + result = screen->graphics_regis_def_wide; + result2 = screen->graphics_regis_def_high; + break; + case 2: /* reset */ + /* FALLTHRU */ + case 3: /* set */ + /* FALLTHRU */ + case 4: /* read maximum */ + /* not implemented */ + break; + default: + TRACE(("DATA_ERROR: CASE_GRAPHICS_ATTRIBUTES ReGIS geometry request with unknown action parameter: %d\n", + GetParam(1))); + status = 2; /* error in Pa */ + break; + } + break; +#endif + default: + TRACE(("DATA_ERROR: CASE_GRAPHICS_ATTRIBUTES request with unknown item parameter: %d\n", + GetParam(0))); + status = 1; + break; + } + + init_reply(ANSI_CSI); + reply.a_pintro = '?'; + count = 0; + reply.a_param[count++] = (ParmType) GetParam(0); + reply.a_param[count++] = (ParmType) status; + reply.a_param[count++] = (ParmType) result; + if (GetParam(0) >= 2) + reply.a_param[count++] = (ParmType) result2; + reply.a_nparam = (ParmType) count; + reply.a_inters = 0; + reply.a_final = 'S'; + unparseseq(xw, &reply); + } + } +#endif + ResetState(sp); + break; + + case CASE_ST: + TRACE(("CASE_ST: End of String (%lu bytes) (mode=%d)\n", + (unsigned long) sp->string_used, + sp->string_mode)); + ResetState(sp); + if (!sp->string_used) + break; + sp->string_area[--(sp->string_used)] = '\0'; + switch (sp->string_mode) { + case ANSI_APC: + /* ignored */ + break; + case ANSI_DCS: + do_dcs(xw, sp->string_area, sp->string_used); + break; + case ANSI_OSC: + do_osc(xw, sp->string_area, sp->string_used, ANSI_ST); + break; + case ANSI_PM: + /* ignored */ + break; + case ANSI_SOS: + /* ignored */ + break; + default: + TRACE(("unknown mode\n")); + break; + } + break; + + case CASE_SOS: + TRACE(("CASE_SOS: Start of String\n")); + if (ParseSOS(screen)) { + sp->string_mode = ANSI_SOS; + sp->parsestate = sos_table; + } else { + illegal_parse(xw, c, sp); + } + break; + + case CASE_PM: + TRACE(("CASE_PM: Privacy Message\n")); + if (ParseSOS(screen)) { + sp->string_mode = ANSI_PM; + sp->parsestate = sos_table; + } else { + illegal_parse(xw, c, sp); + } + break; + + case CASE_DCS: + TRACE(("CASE_DCS: Device Control String\n")); + sp->string_mode = ANSI_DCS; + sp->parsestate = sos_table; + break; + + case CASE_APC: + TRACE(("CASE_APC: Application Program Command\n")); + if (ParseSOS(screen)) { + sp->string_mode = ANSI_APC; + sp->parsestate = sos_table; + } else { + illegal_parse(xw, c, sp); + } + break; + + case CASE_SPA: + TRACE(("CASE_SPA - start protected area\n")); + screen->protected_mode = ISO_PROTECT; + xw->flags |= PROTECTED; + ResetState(sp); + break; + + case CASE_EPA: + TRACE(("CASE_EPA - end protected area\n")); + UIntClr(xw->flags, PROTECTED); + ResetState(sp); + break; + + case CASE_SU: + TRACE(("CASE_SU - scroll up\n")); + xtermScroll(xw, one_if_default(0)); + ResetState(sp); + break; + + case CASE_SL: /* ISO 6429, non-DEC */ + TRACE(("CASE_SL - scroll left\n")); + xtermScrollLR(xw, one_if_default(0), True); + ResetState(sp); + break; + + case CASE_SR: /* ISO 6429, non-DEC */ + TRACE(("CASE_SR - scroll right\n")); + xtermScrollLR(xw, one_if_default(0), False); + ResetState(sp); + break; + + case CASE_DECDC: + TRACE(("CASE_DC - delete column\n")); + if (screen->vtXX_level >= 4) { + xtermColScroll(xw, one_if_default(0), True, screen->cur_col); + } + ResetState(sp); + break; + + case CASE_DECIC: + TRACE(("CASE_IC - insert column\n")); + if (screen->vtXX_level >= 4) { + xtermColScroll(xw, one_if_default(0), False, screen->cur_col); + } + ResetState(sp); + break; + + case CASE_DECBI: + TRACE(("CASE_BI - back index\n")); + if (screen->vtXX_level >= 4) { + xtermColIndex(xw, True); + } + ResetState(sp); + break; + + case CASE_DECFI: + TRACE(("CASE_FI - forward index\n")); + if (screen->vtXX_level >= 4) { + xtermColIndex(xw, False); + } + ResetState(sp); + break; + + case CASE_IND: + TRACE(("CASE_IND - index\n")); + xtermIndex(xw, 1); + do_xevents(xw); + ResetState(sp); + break; + + case CASE_CPL: + TRACE(("CASE_CPL - cursor prev line\n")); + CursorPrevLine(xw, one_if_default(0)); + ResetState(sp); + break; + + case CASE_CNL: + TRACE(("CASE_CNL - cursor next line\n")); + CursorNextLine(xw, one_if_default(0)); + ResetState(sp); + break; + + case CASE_NEL: + TRACE(("CASE_NEL\n")); + xtermIndex(xw, 1); + CarriageReturn(xw); + ResetState(sp); + break; + + case CASE_HTS: + TRACE(("CASE_HTS - horizontal tab set\n")); + TabSet(xw->tabs, screen->cur_col); + ResetState(sp); + break; + + case CASE_REPORT_VERSION: + TRACE(("CASE_REPORT_VERSION - report terminal version\n")); + if (GetParam(0) <= 0) { + unparseputc1(xw, ANSI_DCS); + unparseputc(xw, '>'); + unparseputc(xw, '|'); + unparseputs(xw, xtermVersion()); + unparseputc1(xw, ANSI_ST); + unparse_end(xw); + } + ResetState(sp); + break; + + case CASE_RI: + TRACE(("CASE_RI - reverse index\n")); + RevIndex(xw, 1); + ResetState(sp); + break; + + case CASE_SS2: + TRACE(("CASE_SS2\n")); + screen->curss = 2; + ResetState(sp); + break; + + case CASE_SS3: + TRACE(("CASE_SS3\n")); + screen->curss = 3; + ResetState(sp); + break; + + case CASE_CSI_STATE: + /* enter csi state */ + InitParams(); + SetParam(nparam++, DEFAULT); + sp->parsestate = csi_table; + break; + + case CASE_ESC_SP_STATE: + /* esc space */ + sp->parsestate = esc_sp_table; + break; + + case CASE_CSI_EX_STATE: + /* csi exclamation */ + sp->parsestate = csi_ex_table; + break; + + case CASE_CSI_TICK_STATE: + /* csi tick (') */ + sp->parsestate = csi_tick_table; + break; + +#if OPT_DEC_LOCATOR + case CASE_DECEFR: + TRACE(("CASE_DECEFR - Enable Filter Rectangle\n")); + if (okSendMousePos(xw) == DEC_LOCATOR) { + MotionOff(screen, xw); + if ((screen->loc_filter_top = GetParam(0)) < 1) + screen->loc_filter_top = LOC_FILTER_POS; + if (nparam < 2 + || (screen->loc_filter_left = GetParam(1)) < 1) + screen->loc_filter_left = LOC_FILTER_POS; + if (nparam < 3 + || (screen->loc_filter_bottom = GetParam(2)) < 1) + screen->loc_filter_bottom = LOC_FILTER_POS; + if (nparam < 4 + || (screen->loc_filter_right = GetParam(3)) < 1) + screen->loc_filter_right = LOC_FILTER_POS; + InitLocatorFilter(xw); + } + ResetState(sp); + break; + + case CASE_DECELR: + MotionOff(screen, xw); + if (GetParam(0) <= 0 || GetParam(0) > 2) { + screen->send_mouse_pos = MOUSE_OFF; + TRACE(("DECELR - Disable Locator Reports\n")); + } else { + TRACE(("DECELR - Enable Locator Reports\n")); + screen->send_mouse_pos = DEC_LOCATOR; + xtermShowPointer(xw, True); + if (GetParam(0) == 2) { + screen->locator_reset = True; + } else { + screen->locator_reset = False; + } + if (nparam < 2 || GetParam(1) != 1) { + screen->locator_pixels = False; + } else { + screen->locator_pixels = True; + } + screen->loc_filter = False; + } + ResetState(sp); + break; + + case CASE_DECSLE: + TRACE(("DECSLE - Select Locator Events\n")); + for (count = 0; count < nparam; ++count) { + switch (zero_if_default(count)) { + case 0: + MotionOff(screen, xw); + screen->loc_filter = False; + screen->locator_events = 0; + break; + case 1: + screen->locator_events |= LOC_BTNS_DN; + break; + case 2: + UIntClr(screen->locator_events, LOC_BTNS_DN); + break; + case 3: + screen->locator_events |= LOC_BTNS_UP; + break; + case 4: + UIntClr(screen->locator_events, LOC_BTNS_UP); + break; + } + } + ResetState(sp); + break; + + case CASE_DECRQLP: + TRACE(("DECRQLP - Request Locator Position\n")); + if (GetParam(0) < 2) { + /* Issue DECLRP Locator Position Report */ + GetLocatorPosition(xw); + } + ResetState(sp); + break; +#endif /* OPT_DEC_LOCATOR */ + +#if OPT_DEC_RECTOPS + case CASE_CSI_DOLLAR_STATE: + TRACE(("CASE_CSI_DOLLAR_STATE\n")); + /* csi dollar ($) */ + if (screen->vtXX_level >= 3) + sp->parsestate = csi_dollar_table; + else + sp->parsestate = eigtable; + break; + + case CASE_CSI_STAR_STATE: + TRACE(("CASE_CSI_STAR_STATE\n")); + /* csi star (*) */ + if (screen->vtXX_level >= 4) + sp->parsestate = csi_star_table; + else + sp->parsestate = eigtable; + break; + + case CASE_DECRQCRA: + if (screen->vtXX_level >= 4 && AllowWindowOps(xw, ewGetChecksum)) { + int checksum; + int pid; + + TRACE(("CASE_DECRQCRA - Request checksum of rectangular area\n")); + xtermCheckRect(xw, ParamPair(0), &checksum); + init_reply(ANSI_DCS); + count = 0; + checksum &= 0xffff; + pid = GetParam(0); + reply.a_param[count++] = (ParmType) pid; + reply.a_delim = "!~"; /* delimiter */ + reply.a_radix[count] = 16; + reply.a_param[count++] = (ParmType) checksum; + reply.a_nparam = (ParmType) count; + TRACE(("...checksum(%d) = %04X\n", pid, checksum)); + unparseseq(xw, &reply); + } + ResetState(sp); + break; + + case CASE_DECCRA: + if (screen->vtXX_level >= 4) { + TRACE(("CASE_DECCRA - Copy rectangular area\n")); + xtermParseRect(xw, ParamPair(0), &myRect); + ScrnCopyRectangle(xw, &myRect, ParamPair(5)); + } + ResetState(sp); + break; + + case CASE_DECERA: + if (screen->vtXX_level >= 4) { + TRACE(("CASE_DECERA - Erase rectangular area\n")); + xtermParseRect(xw, ParamPair(0), &myRect); + ScrnFillRectangle(xw, &myRect, ' ', xw->flags, True); + } + ResetState(sp); + break; + + case CASE_DECFRA: + if (screen->vtXX_level >= 4) { + value = zero_if_default(0); + + TRACE(("CASE_DECFRA - Fill rectangular area\n")); + if (nparam > 0 && CharWidth(value) > 0) { + xtermParseRect(xw, ParamPair(1), &myRect); + ScrnFillRectangle(xw, &myRect, value, xw->flags, True); + } + } + ResetState(sp); + break; + + case CASE_DECSERA: + if (screen->vtXX_level >= 4) { + TRACE(("CASE_DECSERA - Selective erase rectangular area\n")); + xtermParseRect(xw, ParamPair(0), &myRect); + ScrnWipeRectangle(xw, &myRect); + } + ResetState(sp); + break; + + case CASE_DECSACE: + TRACE(("CASE_DECSACE - Select attribute change extent\n")); + screen->cur_decsace = zero_if_default(0); + ResetState(sp); + break; + + case CASE_DECCARA: + if (screen->vtXX_level >= 4) { + TRACE(("CASE_DECCARA - Change attributes in rectangular area\n")); + xtermParseRect(xw, ParamPair(0), &myRect); + ScrnMarkRectangle(xw, &myRect, False, ParamPair(4)); + } + ResetState(sp); + break; + + case CASE_DECRARA: + if (screen->vtXX_level >= 4) { + TRACE(("CASE_DECRARA - Reverse attributes in rectangular area\n")); + xtermParseRect(xw, ParamPair(0), &myRect); + ScrnMarkRectangle(xw, &myRect, True, ParamPair(4)); + } + ResetState(sp); + break; + + case CASE_DECSCPP: + if (screen->vtXX_level >= 3) { + TRACE(("CASE_DECSCPP\n")); + /* default and 0 are "80", with "132" as the other legal choice */ + switch (zero_if_default(0)) { + case 0: + case 80: + value = 80; + break; + case 132: + value = 132; + break; + default: + value = -1; + break; + } + if (value > 0) { + if (screen->cur_col + 1 > value) + CursorSet(screen, screen->cur_row, value - 1, xw->flags); + UIntClr(xw->flags, IN132COLUMNS); + if (value == 132) + UIntSet(xw->flags, IN132COLUMNS); + RequestResize(xw, -1, value, True); + } + } + ResetState(sp); + break; + + case CASE_DECSNLS: + if (screen->vtXX_level >= 4 && AllowWindowOps(xw, ewSetWinLines)) { + TRACE(("CASE_DECSNLS\n")); + value = zero_if_default(0); + if (value >= 1 && value <= 255) { + RequestResize(xw, value, -1, True); + } + } + ResetState(sp); + break; + + case CASE_DECRQPSR: +#define reply_char(n,c) do { reply.a_radix[(n)] = 1; reply.a_param[(n)++] = (ParmType)(c); } while (0) +#define reply_bit(n,c) ((n) ? (c) : 0) + if (screen->vtXX_level >= 3) { + TRACE(("CASE_DECRQPSR\n")); + switch (GetParam(0)) { + case 1: + TRACE(("...DECCIR\n")); + init_reply(ANSI_DCS); + count = 0; + reply_char(count, '1'); + reply_char(count, '$'); + reply_char(count, 'u'); + reply.a_param[count++] = (ParmType) (screen->cur_row + 1); + reply.a_param[count++] = (ParmType) (screen->cur_col + 1); + reply.a_param[count++] = (ParmType) thispage; + reply_char(count, ';'); + reply_char(count, (0x40 + | reply_bit(xw->flags & INVERSE, 8) + | reply_bit(xw->flags & BLINK, 4) + | reply_bit(xw->flags & UNDERLINE, 2) + | reply_bit(xw->flags & BOLD, 1) + )); + reply_char(count, ';'); + reply_char(count, 0x40 | + reply_bit(screen->protected_mode & + DEC_PROTECT, 1) + ); + reply_char(count, ';'); + reply_char(count, (0x40 + | reply_bit(screen->do_wrap, 8) + | reply_bit((screen->curss == 3), 4) + | reply_bit((screen->curss == 2), 2) + | reply_bit(xw->flags & ORIGIN, 1) + )); + reply_char(count, ';'); + reply.a_param[count++] = screen->curgl; + reply.a_param[count++] = screen->curgr; + reply_char(count, ';'); + reply_char(count, 0x4f); /* assert all 96's */ + reply_char(count, ';'); + for (item = 0; item < NUM_GSETS; ++item) { + char *temp = encode_scs(screen->gsets[item]); + while (*temp != '\0') { + reply_char(count, *temp++); + } + } + reply.a_nparam = (ParmType) count; + unparseseq(xw, &reply); + break; + case 2: + TRACE(("...DECTABSR\n")); + init_reply(ANSI_DCS); + reply.a_delim = "/"; + count = 0; + reply_char(count, '2'); + reply_char(count, '$'); + reply_char(count, 'u'); + for (item = 0; item < MAX_TABS; ++item) { + if (count + 1 >= NPARAM) + break; + if (TabIsSet(xw->tabs, item)) { + reply.a_param[count++] = (ParmType) (item + 1); + } + if (item > screen->max_col) + break; + } + reply.a_nparam = (ParmType) count; + unparseseq(xw, &reply); + break; + } + } + ResetState(sp); + break; + + case CASE_RQM: + TRACE(("CASE_RQM\n")); + do_ansi_rqm(xw, ParamPair(0)); + ResetState(sp); + break; + + case CASE_DECRQM: + TRACE(("CASE_DECRQM\n")); + do_dec_rqm(xw, ParamPair(0)); + ResetState(sp); + break; + + case CASE_CSI_DEC_DOLLAR_STATE: + TRACE(("CASE_CSI_DEC_DOLLAR_STATE\n")); + /* csi ? dollar ($) */ + sp->parsestate = csi_dec_dollar_table; + break; +#else + case CASE_CSI_DOLLAR_STATE: + /* csi dollar ($) */ + sp->parsestate = eigtable; + break; + + case CASE_CSI_STAR_STATE: + /* csi dollar (*) */ + sp->parsestate = eigtable; + break; + + case CASE_CSI_DEC_DOLLAR_STATE: + /* csi ? dollar ($) */ + sp->parsestate = eigtable; + break; +#endif /* OPT_DEC_RECTOPS */ + +#if OPT_XTERM_SGR + case CASE_CSI_HASH_STATE: + TRACE(("CASE_CSI_HASH_STATE\n")); + /* csi hash (#) */ + sp->parsestate = csi_hash_table; + break; + + case CASE_XTERM_CHECKSUM: +#if OPT_DEC_RECTOPS + if (screen->vtXX_level >= 4 && AllowWindowOps(xw, ewSetChecksum)) { + TRACE(("CASE_XTERM_CHECKSUM\n")); + screen->checksum_ext = zero_if_default(0); + } +#endif + ResetState(sp); + break; + + case CASE_XTERM_PUSH_SGR: + TRACE(("CASE_XTERM_PUSH_SGR\n")); + value = 0; + if (nparam == 0 || (nparam == 1 && GetParam(0) == DEFAULT)) { + value = DEFAULT; + } else if (nparam > 0) { + for (count = 0; count < nparam; ++count) { + item = zero_if_default(count); + /* deprecated - for compatibility */ +#if OPT_ISO_COLORS + if (item == psFG_COLOR_obs) { + item = psFG_COLOR; + } else if (item == psBG_COLOR_obs) { + item = psBG_COLOR; + } +#endif + if (item > 0 && item < MAX_PUSH_SGR) { + value |= (1 << (item - 1)); + } + } + } + xtermPushSGR(xw, value); + ResetState(sp); + break; + + case CASE_XTERM_REPORT_SGR: + TRACE(("CASE_XTERM_REPORT_SGR\n")); + xtermParseRect(xw, ParamPair(0), &myRect); + xtermReportSGR(xw, &myRect); + ResetState(sp); + break; + + case CASE_XTERM_POP_SGR: + TRACE(("CASE_XTERM_POP_SGR\n")); + xtermPopSGR(xw); + ResetState(sp); + break; + + case CASE_XTERM_PUSH_COLORS: + TRACE(("CASE_XTERM_PUSH_COLORS\n")); + if (nparam == 0) { + xtermPushColors(xw, DEFAULT); + } else { + for (count = 0; count < nparam; ++count) { + xtermPushColors(xw, GetParam(count)); + } + } + ResetState(sp); + break; + + case CASE_XTERM_POP_COLORS: + TRACE(("CASE_XTERM_POP_COLORS\n")); + if (nparam == 0) { + xtermPopColors(xw, DEFAULT); + } else { + for (count = 0; count < nparam; ++count) { + xtermPopColors(xw, GetParam(count)); + } + } + ResetState(sp); + break; + + case CASE_XTERM_REPORT_COLORS: + TRACE(("CASE_XTERM_REPORT_COLORS\n")); + xtermReportColors(xw); + ResetState(sp); + break; +#endif + + case CASE_S7C1T: + TRACE(("CASE_S7C1T\n")); + if (screen->vtXX_level >= 2) { + show_8bit_control(False); + ResetState(sp); + } + break; + + case CASE_S8C1T: + TRACE(("CASE_S8C1T\n")); + if (screen->vtXX_level >= 2) { + show_8bit_control(True); + ResetState(sp); + } + break; + + case CASE_OSC: + TRACE(("CASE_OSC: Operating System Command\n")); + sp->parsestate = sos_table; + sp->string_mode = ANSI_OSC; + break; + + case CASE_RIS: + TRACE(("CASE_RIS\n")); + VTReset(xw, True, True); + /* NOTREACHED */ + + case CASE_DECSTR: + TRACE(("CASE_DECSTR\n")); + VTReset(xw, False, False); + /* NOTREACHED */ + + case CASE_REP: + TRACE(("CASE_REP\n")); + if (CharWidth(sp->lastchar) > 0) { + IChar repeated[2]; + count = one_if_default(0); + repeated[0] = (IChar) sp->lastchar; + while (count-- > 0) { + dotext(xw, + screen->gsets[(int) (screen->curgl)], + repeated, 1); + } + } + ResetState(sp); + break; + + case CASE_LS2: + TRACE(("CASE_LS2\n")); + screen->curgl = 2; + ResetState(sp); + break; + + case CASE_LS3: + TRACE(("CASE_LS3\n")); + screen->curgl = 3; + ResetState(sp); + break; + + case CASE_LS3R: + TRACE(("CASE_LS3R\n")); + screen->curgr = 3; + ResetState(sp); + break; + + case CASE_LS2R: + TRACE(("CASE_LS2R\n")); + screen->curgr = 2; + ResetState(sp); + break; + + case CASE_LS1R: + TRACE(("CASE_LS1R\n")); + screen->curgr = 1; + ResetState(sp); + break; + + case CASE_XTERM_SAVE: + savemodes(xw); + ResetState(sp); + break; + + case CASE_XTERM_RESTORE: + restoremodes(xw); + ResetState(sp); + break; + + case CASE_XTERM_WINOPS: + TRACE(("CASE_XTERM_WINOPS\n")); + window_ops(xw); + ResetState(sp); + break; +#if OPT_WIDE_CHARS + case CASE_ESC_PERCENT: + TRACE(("CASE_ESC_PERCENT\n")); + sp->parsestate = esc_pct_table; + break; + + case CASE_UTF8: + /* If we did not set UTF-8 mode from resource or the + * command-line, allow it to be enabled/disabled by + * control sequence. + */ + TRACE(("CASE_UTF8 wide:%d, utf8:%d, req:%s\n", + screen->wide_chars, + screen->utf8_mode, + BtoS(c == 'G'))); + if ((!screen->wide_chars) && (c == 'G')) { + WriteNow(); + ChangeToWide(xw); + } + if (screen->wide_chars + && !screen->utf8_always) { + switchPtyData(screen, c == 'G'); + TRACE(("UTF8 mode %s\n", + BtoS(screen->utf8_mode))); + } else { + TRACE(("UTF8 mode NOT turned %s (%s)\n", + BtoS(c == 'G'), + (screen->utf8_mode == uAlways) + ? "UTF-8 mode set from command-line" + : "wideChars resource was not set")); + } + ResetState(sp); + break; + + case CASE_SCS_DQUOTE: + TRACE(("CASE_SCS_DQUOTE\n")); + sp->parsestate = scs_2qt_table; + break; + + case CASE_GSETS_DQUOTE: + if (screen->vtXX_level >= 5) { + TRACE(("CASE_GSETS_DQUOTE(%d) = '%c'\n", sp->scstype, c)); + xtermDecodeSCS(xw, sp->scstype, '"', (int) c); + } + ResetState(sp); + break; + + case CASE_SCS_AMPRSND: + TRACE(("CASE_SCS_AMPRSND\n")); + sp->parsestate = scs_amp_table; + break; + + case CASE_GSETS_AMPRSND: + if (screen->vtXX_level >= 5) { + TRACE(("CASE_GSETS_AMPRSND(%d) = '%c'\n", sp->scstype, c)); + xtermDecodeSCS(xw, sp->scstype, '&', (int) c); + } + ResetState(sp); + break; + + case CASE_SCS_PERCENT: + TRACE(("CASE_SCS_PERCENT\n")); + sp->parsestate = scs_pct_table; + break; + + case CASE_GSETS_PERCENT: + if (screen->vtXX_level >= 3) { + TRACE(("CASE_GSETS_PERCENT(%d) = '%c'\n", sp->scstype, c)); + xtermDecodeSCS(xw, sp->scstype, '%', (int) c); + } + ResetState(sp); + break; +#endif +#if OPT_MOD_FKEYS + case CASE_SET_MOD_FKEYS: + TRACE(("CASE_SET_MOD_FKEYS\n")); + if (nparam >= 1) { + set_mod_fkeys(xw, + GetParam(0), + ((nparam > 1) + ? GetParam(1) + : DEFAULT), + True); + } else { + for (value = 1; value <= 5; ++value) + set_mod_fkeys(xw, value, DEFAULT, True); + } + ResetState(sp); + break; + + case CASE_SET_MOD_FKEYS0: + TRACE(("CASE_SET_MOD_FKEYS0\n")); + if (nparam >= 1 && GetParam(0) != DEFAULT) { + set_mod_fkeys(xw, GetParam(0), -1, False); + } else { + xw->keyboard.modify_now.function_keys = -1; + } + ResetState(sp); + break; +#endif + case CASE_HIDE_POINTER: + TRACE(("CASE_HIDE_POINTER\n")); + if (nparam >= 1 && GetParam(0) != DEFAULT) { + screen->pointer_mode = GetParam(0); + } else { + screen->pointer_mode = DEF_POINTER_MODE; + } + ResetState(sp); + break; + + case CASE_XTERM_SM_TITLE: + TRACE(("CASE_XTERM_SM_TITLE\n")); + if (nparam >= 1) { + int n; + for (n = 0; n < nparam; ++n) { + if (GetParam(n) != DEFAULT) + screen->title_modes |= (1 << GetParam(n)); + } + } else { + screen->title_modes = DEF_TITLE_MODES; + } + TRACE(("...title_modes %#x\n", screen->title_modes)); + ResetState(sp); + break; + + case CASE_XTERM_RM_TITLE: + TRACE(("CASE_XTERM_RM_TITLE\n")); + if (nparam >= 1) { + int n; + for (n = 0; n < nparam; ++n) { + if (GetParam(n) != DEFAULT) + screen->title_modes &= ~(1 << GetParam(n)); + } + } else { + screen->title_modes = DEF_TITLE_MODES; + } + TRACE(("...title_modes %#x\n", screen->title_modes)); + ResetState(sp); + break; + + case CASE_CSI_IGNORE: + sp->parsestate = cigtable; + break; + + case CASE_DECSWBV: + TRACE(("CASE_DECSWBV\n")); + switch (zero_if_default(0)) { + case 2: + /* FALLTHRU */ + case 3: + /* FALLTHRU */ + case 4: + screen->warningVolume = bvLow; + break; + case 5: + /* FALLTHRU */ + case 6: + /* FALLTHRU */ + case 7: + /* FALLTHRU */ + case 8: + screen->warningVolume = bvHigh; + break; + default: + screen->warningVolume = bvOff; + break; + } + TRACE(("...warningVolume %d\n", screen->warningVolume)); + ResetState(sp); + break; + + case CASE_DECSMBV: + TRACE(("CASE_DECSMBV\n")); + switch (zero_if_default(0)) { + case 2: + /* FALLTHRU */ + case 3: + /* FALLTHRU */ + case 4: + screen->marginVolume = bvLow; + break; + case 0: + /* FALLTHRU */ + case 5: + /* FALLTHRU */ + case 6: + /* FALLTHRU */ + case 7: + /* FALLTHRU */ + case 8: + screen->marginVolume = bvHigh; + break; + default: + screen->marginVolume = bvOff; + break; + } + TRACE(("...marginVolume %d\n", screen->marginVolume)); + ResetState(sp); + break; + } + if (sp->parsestate == sp->groundtable) + sp->lastchar = thischar; + } while (0); + +#if OPT_WIDE_CHARS + screen->utf8_inparse = (Boolean) ((screen->utf8_mode != uFalse) + && (sp->parsestate != sos_table)); +#endif + + return True; +} + +static Boolean +redoparsing(XtermWidget xw, unsigned c, struct ParseState *sp, unsigned check) +{ + Boolean result = False; + if (!(sp->check_recur & check)) { + UIntSet(sp->check_recur, check); + result = doparsing(xw, c, sp); + UIntClr(sp->check_recur, check); + } + return result; +} + +static void +VTparse(XtermWidget xw) +{ + Boolean keep_running; + + /* We longjmp back to this point in VTReset() */ + (void) setjmp(vtjmpbuf); + init_parser(xw, &myState); + + do { + keep_running = doparsing(xw, doinput(xw), &myState); + while (myState.defer_used) { + Char *deferred = myState.defer_area; + size_t len = myState.defer_used; + size_t i; + myState.defer_area = NULL; + myState.defer_size = 0; + myState.defer_used = 0; + for (i = 0; i < len; i++) { + (void) doparsing(xw, deferred[i], &myState); + } + free(deferred); + } + } while (keep_running); +} + +static Char *v_buffer; /* pointer to physical buffer */ +static Char *v_bufstr = NULL; /* beginning of area to write */ +static Char *v_bufptr; /* end of area to write */ +static Char *v_bufend; /* end of physical buffer */ + +/* Write data to the pty as typed by the user, pasted with the mouse, + or generated by us in response to a query ESC sequence. */ + +void +v_write(int f, const Char *data, unsigned len) +{ + TRACE2(("v_write(%d:%s)\n", len, visibleChars(data, len))); + if (v_bufstr == NULL) { + if (len > 0) { + v_buffer = (Char *) XtMalloc((Cardinal) len); + v_bufstr = v_buffer; + v_bufptr = v_buffer; + v_bufend = v_buffer + len; + } + if (v_bufstr == NULL) { + return; + } + } + if_DEBUG({ + fprintf(stderr, "v_write called with %u bytes (%ld left over)", + len, (long) (v_bufptr - v_bufstr)); + if (len > 1 && len < 10) + fprintf(stderr, " \"%.*s\"", len, (const char *) data); + fprintf(stderr, "\n"); + }); + +#ifdef VMS + if ((1 << f) != pty_mask) { + tt_write((const char *) data, len); + return; + } +#else /* VMS */ + if (!FD_ISSET(f, &pty_mask)) { + IGNORE_RC(write(f, (const char *) data, (size_t) len)); + return; + } +#endif /* VMS */ + + /* + * Append to the block we already have. + * Always doing this simplifies the code, and + * isn't too bad, either. If this is a short + * block, it isn't too expensive, and if this is + * a long block, we won't be able to write it all + * anyway. + */ + + if (len > 0) { +#if OPT_DABBREV + TScreenOf(term)->dabbrev_working = False; /* break dabbrev sequence */ +#endif + if (v_bufend < v_bufptr + len) { /* we've run out of room */ + if (v_bufstr != v_buffer) { + /* there is unused space, move everything down */ + /* possibly overlapping memmove here */ + if_DEBUG({ + fprintf(stderr, "moving data down %ld\n", + (long) (v_bufstr - v_buffer)); + }); + memmove(v_buffer, v_bufstr, (size_t) (v_bufptr - v_bufstr)); + v_bufptr -= v_bufstr - v_buffer; + v_bufstr = v_buffer; + } + if (v_bufend < v_bufptr + len) { + /* still won't fit: get more space */ + /* Don't use XtRealloc because an error is not fatal. */ + unsigned size = (unsigned) (v_bufptr - v_buffer); + v_buffer = TypeRealloc(Char, size + len, v_buffer); + if (v_buffer) { + if_DEBUG({ + fprintf(stderr, "expanded buffer to %u\n", + size + len); + }); + v_bufstr = v_buffer; + v_bufptr = v_buffer + size; + v_bufend = v_bufptr + len; + } else { + /* no memory: ignore entire write request */ + xtermWarning("cannot allocate buffer space\n"); + v_buffer = v_bufstr; /* restore clobbered pointer */ + } + } + } + if (v_bufend >= v_bufptr + len) { + /* new stuff will fit */ + memmove(v_bufptr, data, (size_t) len); + v_bufptr += len; + } + } + + /* + * Write out as much of the buffer as we can. + * Be careful not to overflow the pty's input silo. + * We are conservative here and only write + * a small amount at a time. + * + * If we can't push all the data into the pty yet, we expect write + * to return a non-negative number less than the length requested + * (if some data written) or -1 and set errno to EAGAIN, + * EWOULDBLOCK, or EINTR (if no data written). + * + * (Not all systems do this, sigh, so the code is actually + * a little more forgiving.) + */ + +#define MAX_PTY_WRITE 128 /* 1/2 POSIX minimum MAX_INPUT */ + + if (v_bufptr > v_bufstr) { + int riten; + +#ifdef VMS + riten = tt_write(v_bufstr, + ((v_bufptr - v_bufstr <= VMS_TERM_BUFFER_SIZE) + ? v_bufptr - v_bufstr + : VMS_TERM_BUFFER_SIZE)); + if (riten == 0) + return (riten); +#else /* VMS */ + riten = (int) write(f, v_bufstr, + (size_t) ((v_bufptr - v_bufstr <= MAX_PTY_WRITE) + ? v_bufptr - v_bufstr + : MAX_PTY_WRITE)); + if (riten < 0) +#endif /* VMS */ + { + if_DEBUG({ + perror("write"); + }); + riten = 0; + } + if_DEBUG({ + fprintf(stderr, "write called with %ld, wrote %d\n", + ((long) ((v_bufptr - v_bufstr) <= MAX_PTY_WRITE) + ? (long) (v_bufptr - v_bufstr) + : MAX_PTY_WRITE), + riten); + }); + v_bufstr += riten; + if (v_bufstr >= v_bufptr) /* we wrote it all */ + v_bufstr = v_bufptr = v_buffer; + } + + /* + * If we have lots of unused memory allocated, return it + */ + if (v_bufend - v_bufptr > 1024) { /* arbitrary hysteresis */ + /* save pointers across realloc */ + int start = (int) (v_bufstr - v_buffer); + int size = (int) (v_bufptr - v_buffer); + unsigned allocsize = (unsigned) (size ? size : 1); + + v_buffer = TypeRealloc(Char, allocsize, v_buffer); + if (v_buffer) { + v_bufstr = v_buffer + start; + v_bufptr = v_buffer + size; + v_bufend = v_buffer + allocsize; + if_DEBUG({ + fprintf(stderr, "shrunk buffer to %u\n", allocsize); + }); + } else { + /* should we print a warning if couldn't return memory? */ + v_buffer = v_bufstr - start; /* restore clobbered pointer */ + } + } +} + +static void +updateCursor(TScreen *screen) +{ + if (screen->cursor_set != screen->cursor_state) { + if (screen->cursor_set) + ShowCursor(); + else + HideCursor(); + } +} + +#if OPT_BLINK_CURS || OPT_BLINK_TEXT +static void +reallyStopBlinking(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->cursor_state == BLINKED_OFF) { + /* force cursor to display if it is enabled */ + screen->cursor_state = !screen->cursor_set; + updateCursor(screen); + xevents(xw); + } +} +#endif + +static void +update_the_screen(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Boolean moved; + + if (screen->scroll_amt) + FlushScroll(xw); + moved = CursorMoved(screen); + if (screen->cursor_set && moved) { + if (screen->cursor_state) + HideCursor(); + ShowCursor(); +#if OPT_INPUT_METHOD + PreeditPosition(xw); +#endif + } else { +#if OPT_INPUT_METHOD + if (moved) + PreeditPosition(xw); +#endif + updateCursor(screen); + } +} + +#ifdef VMS +#define ptymask() (v_bufptr > v_bufstr ? pty_mask : 0) + +static void +in_put(XtermWidget xw) +{ + static PtySelect select_mask; + static PtySelect write_mask; + int update = VTbuffer->update; + int size; + + int status; + Dimension replyWidth, replyHeight; + XtGeometryResult stat; + + TScreen *screen = TScreenOf(xw); + char *cp; + int i; + + select_mask = pty_mask; /* force initial read */ + for (;;) { + + /* if the terminal changed size, resize the widget */ + if (tt_changed) { + tt_changed = False; + + stat = REQ_RESIZE((Widget) xw, + ((Dimension) FontWidth(screen) + * (tt_width) + + 2 * screen->border + + screen->fullVwin.sb_info.width), + ((Dimension) FontHeight(screen) + * (tt_length) + + 2 * screen->border), + &replyWidth, &replyHeight); + + if (stat == XtGeometryYes || stat == XtGeometryDone) { + xw->core.width = replyWidth; + xw->core.height = replyHeight; + + ScreenResize(xw, replyWidth, replyHeight, &xw->flags); + } + repairSizeHints(); + } + + if (screen->eventMode == NORMAL + && readPtyData(xw, &select_mask, VTbuffer)) { + if (screen->scrollWidget + && screen->scrollttyoutput + && screen->topline < 0) + /* Scroll to bottom */ + WindowScroll(xw, 0, False); + break; + } + update_the_screen(xw); + + if (QLength(screen->display)) { + select_mask = X_mask; + } else { + write_mask = ptymask(); + XFlush(screen->display); + select_mask = Select_mask; + if (screen->eventMode != NORMAL) + select_mask = X_mask; + } + if (write_mask & ptymask()) { + v_write(screen->respond, 0, 0); /* flush buffer */ + } + + if (select_mask & X_mask) { + xevents(xw); + if (VTbuffer->update != update) + break; + } + } +} +#else /* VMS */ + +static void +in_put(XtermWidget xw) +{ + static PtySelect select_mask; + static PtySelect write_mask; + + TScreen *screen = TScreenOf(xw); + int i; + int update = VTbuffer->update; +#if USE_DOUBLE_BUFFER + int should_wait = 1; +#endif + + static struct timeval select_timeout; + +#if OPT_BLINK_CURS + /* + * Compute the timeout for the blinking cursor to be much smaller than + * the "on" or "off" interval. + */ + int tick = ((screen->blink_on < screen->blink_off) + ? screen->blink_on + : screen->blink_off); + tick *= (1000 / 8); /* 1000 for msec/usec, 8 for "much" smaller */ + if (tick < 1) + tick = 1; +#endif + + for (;;) { + int size; + int time_select; + + if (screen->eventMode == NORMAL + && (size = readPtyData(xw, &select_mask, VTbuffer)) != 0) { + if (screen->scrollWidget + && screen->scrollttyoutput + && screen->topline < 0) + WindowScroll(xw, 0, False); /* Scroll to bottom */ + /* stop speed reading at some point to look for X stuff */ + TRACE(("VTbuffer uses %ld/%d\n", + (long) (VTbuffer->last - VTbuffer->buffer), + BUF_SIZE)); + if ((VTbuffer->last - VTbuffer->buffer) > BUF_SIZE) { + FD_CLR(screen->respond, &select_mask); + break; + } +#if USE_DOUBLE_BUFFER + if (resource.buffered && should_wait) { + /* wait for potential extra data (avoids some flickering) */ + usleep((unsigned) DbeMsecs(xw)); + should_wait = 0; + } +#endif +#if defined(HAVE_SCHED_YIELD) + /* + * If we've read a full (small/fragment) buffer, let the operating + * system have a turn, and we'll resume reading until we've either + * read only a fragment of the buffer, or we've filled the large + * buffer (see above). Doing this helps keep up with large bursts + * of output. + */ + if (size == FRG_SIZE) { + select_timeout.tv_sec = 0; + i = Select(max_plus1, &select_mask, &write_mask, 0, + &select_timeout); + if (i > 0 && FD_ISSET(screen->respond, &select_mask)) { + sched_yield(); + } else + break; + } else { + break; + } +#else + (void) size; /* unused in this branch */ + break; +#endif + } + update_the_screen(xw); + + XFlush(screen->display); /* always flush writes before waiting */ + + /* Update the masks and, unless X events are already in the queue, + wait for I/O to be possible. */ + XFD_COPYSET(&Select_mask, &select_mask); + /* in selection mode xterm does not read pty */ + if (screen->eventMode != NORMAL) + FD_CLR(screen->respond, &select_mask); + + if (v_bufptr > v_bufstr) { + XFD_COPYSET(&pty_mask, &write_mask); + } else + FD_ZERO(&write_mask); + select_timeout.tv_sec = 0; + time_select = 0; + + /* + * if there's either an XEvent or an XtTimeout pending, just take + * a quick peek, i.e. timeout from the select() immediately. If + * there's nothing pending, let select() block a little while, but + * for a shorter interval than the arrow-style scrollbar timeout. + * The blocking is optional, because it tends to increase the load + * on the host. + */ + if (xtermAppPending()) { + select_timeout.tv_usec = 0; + time_select = 1; + } else if (screen->awaitInput) { + select_timeout.tv_usec = 50000; + time_select = 1; +#if OPT_BLINK_CURS + } else if ((screen->blink_timer != 0 && + ((screen->select & FOCUS) || screen->always_highlight)) || + (screen->cursor_state == BLINKED_OFF)) { + select_timeout.tv_usec = tick; + while (select_timeout.tv_usec > 1000000) { + select_timeout.tv_usec -= 1000000; + select_timeout.tv_sec++; + } + time_select = 1; +#endif +#if OPT_SESSION_MGT + } else if (resource.sessionMgt) { + if (ice_fd >= 0) + FD_SET(ice_fd, &select_mask); +#endif + } + if (need_cleanup) + NormalExit(); + xtermFlushDbe(xw); + i = Select(max_plus1, &select_mask, &write_mask, 0, + (time_select ? &select_timeout : 0)); + if (i < 0) { + if (errno != EINTR) + SysError(ERROR_SELECT); + continue; + } + + /* if there is room to write more data to the pty, go write more */ + if (FD_ISSET(screen->respond, &write_mask)) { + v_write(screen->respond, (Char *) 0, 0); /* flush buffer */ + } + + /* if there are X events already in our queue, it + counts as being readable */ + if (xtermAppPending() || + FD_ISSET(ConnectionNumber(screen->display), &select_mask)) { + xevents(xw); + if (VTbuffer->update != update) /* HandleInterpret */ + break; + } + + } +} +#endif /* VMS */ + +static IChar +doinput(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + while (!morePtyData(screen, VTbuffer)) + in_put(xw); + return nextPtyData(screen, VTbuffer); +} + +#if OPT_INPUT_METHOD +/* + * For OverTheSpot, client has to inform the position for XIM preedit. + */ +static void +PreeditPosition(XtermWidget xw) +{ + TInput *input = lookupTInput(xw, (Widget) xw); + TScreen *screen = TScreenOf(xw); + CLineData *ld; + XPoint spot; + XVaNestedList list; + + if (input && input->xic + && (ld = getLineData(screen, screen->cur_row)) != 0) { + spot.x = (short) LineCursorX(screen, ld, screen->cur_col); + spot.y = (short) (CursorY(screen, screen->cur_row) + xw->work.xim_fs_ascent); + list = XVaCreateNestedList(0, + XNSpotLocation, &spot, + XNForeground, T_COLOR(screen, TEXT_FG), + XNBackground, T_COLOR(screen, TEXT_BG), + (void *) 0); + XSetICValues(input->xic, XNPreeditAttributes, list, (void *) 0); + XFree(list); + } +} +#endif + +static void +WrapLine(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + LineData *ld = getLineData(screen, screen->cur_row); + + if (ld != 0) { + /* mark that we had to wrap this line */ + LineSetFlag(ld, LINEWRAPPED); + if (screen->show_wrap_marks) { + ShowWrapMarks(xw, screen->cur_row, ld); + } + xtermAutoPrint(xw, '\n'); + xtermIndex(xw, 1); + set_cur_col(screen, ScrnLeftMargin(xw)); + } +} + +/* + * Process a string of characters according to the character set indicated by + * charset. Worry about end of line conditions (wraparound if selected). + * + * It is possible to use CUP, etc., to move outside margins. In that case, the + * right-margin is ineffective until the text (may) wrap and get within the + * margins. + */ +void +dotext(XtermWidget xw, + DECNRCM_codes charset, + IChar *buf, /* start of characters to process */ + Cardinal len) /* end */ +{ + TScreen *screen = TScreenOf(xw); +#if OPT_WIDE_CHARS + Cardinal chars_chomped = 1; + int next_col = screen->cur_col; +#else + int next_col, this_col; /* must be signed */ +#endif + Cardinal offset; + int rmargin = ScrnRightMargin(xw); + +#if OPT_WIDE_CHARS + if (screen->vt100_graphics) +#endif + if (!xtermCharSetOut(xw, buf, buf + len, charset)) + return; + + if_OPT_XMC_GLITCH(screen, { + Cardinal n; + if (charset != '?') { + for (n = 0; n < len; n++) { + if (buf[n] == XMC_GLITCH) + buf[n] = XMC_GLITCH + 1; + } + } + }); + +#if OPT_WIDE_CHARS + for (offset = 0; + offset < len && (chars_chomped > 0 || screen->do_wrap); + offset += chars_chomped) { + int width_here = 0; + int last_chomp = 0; + Boolean force_wrap; + + chars_chomped = 0; + do { + int right = ((screen->cur_col > rmargin) + ? screen->max_col + : rmargin); + int width_available = right + 1 - screen->cur_col; + Boolean need_wrap = False; + Boolean did_wrap = False; + + force_wrap = False; + + if (screen->do_wrap) { + screen->do_wrap = False; + if ((xw->flags & WRAPAROUND)) { + WrapLine(xw); + right = ((screen->cur_col > rmargin) + ? screen->max_col + : rmargin); + width_available = right + 1 - screen->cur_col; + next_col = screen->cur_col; + did_wrap = True; + } + } + + /* + * This can happen with left/right margins... + */ + if (width_available <= 0) { + break; + } + + /* + * Regarding the soft-hyphen aberration, see + * http://archives.miloush.net/michkap/archive/2006/09/02/736881.html + */ + while (width_here <= width_available + && chars_chomped < (len - offset)) { + Cardinal n = chars_chomped + offset; + if (!screen->utf8_mode + || (screen->vt100_graphics && charset == '0')) { + last_chomp = 1; + } else if (screen->c1_printable && + buf[n] >= 0x80 && + buf[n] <= 0xa0) { + last_chomp = 1; + } else { + last_chomp = CharWidth(buf[n]); + if (last_chomp <= 0) { + IChar ch = buf[n]; + Bool eat_it = !screen->utf8_mode && (ch > 127); + if (ch == 0xad) { + /* + * Only display soft-hyphen if it happens to be at + * the right-margin. While that means that only + * the displayed character could be selected for + * pasting, a well-behaved application would never + * send this, anyway... + */ + if (width_here < width_available - 1) { + eat_it = True; + } else { + last_chomp = 1; + eat_it = False; + } + TRACE(("...will%s display soft-hyphen\n", + eat_it ? " not" : "")); + } + /* + * Supposedly we dealt with combining characters and + * control characters in doparse(). Anything left over + * is junk that we will not attempt to display. + */ + if (eat_it) { + TRACE(("...will not display U+%04X\n", ch)); + --len; + while (n < len) { + buf[n] = buf[n + 1]; + ++n; + } + last_chomp = 0; + chars_chomped--; + } + } + } + width_here += last_chomp; + chars_chomped++; + } + + if (width_here > width_available) { + if (last_chomp > right + 1) { + break; /* give up - it is too big */ + } else if (chars_chomped-- == 0) { + /* This can happen with left/right margins... */ + break; + } + width_here -= last_chomp; + if (chars_chomped > 0) { + if (!(xw->flags & WRAPAROUND)) { + buf[chars_chomped + offset - 1] = buf[len - 1]; + } else { + need_wrap = True; + } + } + } else if (width_here == width_available) { + need_wrap = True; + } else if (chars_chomped != (len - offset)) { + need_wrap = True; + } + + if (chars_chomped != 0 && next_col <= screen->max_col) { + WriteText(xw, buf + offset, chars_chomped); + } else if (!did_wrap + && len > 0 + && (xw->flags & WRAPAROUND) + && screen->cur_col > ScrnLeftMargin(xw)) { + force_wrap = True; + need_wrap = True; + } + next_col += width_here; + screen->do_wrap = need_wrap; + } while (force_wrap); + } + + /* + * Remember that we wrote something to the screen, for use as a base of + * combining characters. The logic above may have called cursor-forward + * or carriage-return operations which resets this flag, so we set it at + * the very end. + */ + screen->char_was_written = True; +#else /* ! OPT_WIDE_CHARS */ + + for (offset = 0; offset < len; offset += (Cardinal) this_col) { +#if OPT_DEC_CHRSET + CLineData *ld = getLineData(screen, screen->cur_row); +#endif + int right = ((screen->cur_col > rmargin) + ? screen->max_col + : rmargin); + + int last_col = LineMaxCol(screen, ld); + if (last_col > right) + last_col = right; + this_col = last_col - screen->cur_col + 1; + if (screen->do_wrap) { + screen->do_wrap = False; + if ((xw->flags & WRAPAROUND)) { + WrapLine(xw); + } + this_col = 1; + } + if (offset + (Cardinal) this_col > len) { + this_col = (int) (len - offset); + } + next_col = screen->cur_col + this_col; + + WriteText(xw, buf + offset, (unsigned) this_col); + + /* + * The call to WriteText updates screen->cur_col. + * If screen->cur_col is less than next_col, we must have + * hit the right margin - so set the do_wrap flag. + */ + screen->do_wrap = (Boolean) (screen->cur_col < next_col); + } + +#endif /* OPT_WIDE_CHARS */ +} + +#if OPT_WIDE_CHARS +unsigned +visual_width(const IChar *str, Cardinal len) +{ + /* returns the visual width of a string (doublewide characters count + as 2, normalwide characters count as 1) */ + unsigned my_len = 0; + while (len) { + int ch = (int) *str++; + if (isWide(ch)) + my_len += 2; + else + my_len++; + len--; + } + return my_len; +} +#endif + +#if HANDLE_STRUCT_NOTIFY +/* Flag icon name with "***" on window output when iconified. + */ +static void +HandleStructNotify(Widget w GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XEvent *event, + Boolean *cont GCC_UNUSED) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + (void) screen; + TRACE_EVENT("HandleStructNotify", event, NULL, 0); + switch (event->type) { + case MapNotify: + resetZIconBeep(xw); + mapstate = !IsUnmapped; + break; + case UnmapNotify: + mapstate = IsUnmapped; + break; + case MappingNotify: + XRefreshKeyboardMapping(&(event->xmapping)); + VTInitModifiers(xw); + break; + case ConfigureNotify: + if (event->xconfigure.window == XtWindow(toplevel)) { +#if !OPT_TOOLBAR + int height = event->xconfigure.height; + int width = event->xconfigure.width; +#endif + +#if USE_DOUBLE_BUFFER + discardRenderDraw(screen); +#endif /* USE_DOUBLE_BUFFER */ +#if OPT_TOOLBAR + /* + * The notification is for the top-level widget, but we care about + * vt100 (ignore the tek4014 window). + */ + if (screen->Vshow) { + VTwin *Vwin = WhichVWin(screen); + TbInfo *info = &(Vwin->tb_info); + TbInfo save = *info; + + if (info->menu_bar) { + XtVaGetValues(info->menu_bar, + XtNheight, &info->menu_height, + XtNborderWidth, &info->menu_border, + (XtPointer) 0); + + if (save.menu_height != info->menu_height + || save.menu_border != info->menu_border) { + + TRACE(("...menu_height %d\n", info->menu_height)); + TRACE(("...menu_border %d\n", info->menu_border)); + TRACE(("...had height %d, border %d\n", + save.menu_height, + save.menu_border)); + + /* + * Window manager still may be using the old values. + * Try to fool it. + */ + REQ_RESIZE((Widget) xw, + screen->fullVwin.fullwidth, + (Dimension) (info->menu_height + - save.menu_height + + screen->fullVwin.fullheight), + NULL, NULL); + repairSizeHints(); + } + } + } +#else + if (!xw->work.doing_resize +#if OPT_RENDERFONT && USE_DOUBLE_BUFFER + && !(resource.buffered && UsingRenderFont(xw)) /* buggyXft */ +#endif + && (height != xw->hints.height + || width != xw->hints.width)) { + /* + * This is a special case: other calls to RequestResize that + * could set the screensize arbitrarily are via escape + * sequences, and we've limited resizing. But a configure + * notify is from the window manager, presumably under control + * of the interactive user (ignoring abuse of wmctrl). Ignore + * the limit for this case. + */ + int saved_limit = xw->misc.limit_resize; + xw->misc.limit_resize = 0; + RequestResize(xw, height, width, False); + xw->misc.limit_resize = saved_limit; + } +#endif /* OPT_TOOLBAR */ + } + break; + } +} +#endif /* HANDLE_STRUCT_NOTIFY */ + +#if OPT_BLINK_CURS +static int +DoStartBlinking(TScreen *screen) +{ + int actual = ((screen->cursor_blink == cbTrue || + screen->cursor_blink == cbAlways) + ? 1 + : 0); + int wanted = screen->cursor_blink_esc ? 1 : 0; + int result; + if (screen->cursor_blink_xor) { + result = actual ^ wanted; + } else { + result = actual | wanted; + } + return result; +} + +static void +SetCursorBlink(XtermWidget xw, BlinkOps enable) +{ + TScreen *screen = TScreenOf(xw); + + if (SettableCursorBlink(screen)) { + screen->cursor_blink = enable; + } + if (DoStartBlinking(screen)) { + StartBlinking(xw); + } else { + /* EMPTY */ +#if OPT_BLINK_TEXT + reallyStopBlinking(xw); +#else + StopBlinking(xw); +#endif + } + update_cursorblink(); +} + +void +ToggleCursorBlink(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->cursor_blink == cbTrue) { + SetCursorBlink(xw, cbFalse); + } else if (screen->cursor_blink == cbFalse) { + SetCursorBlink(xw, cbTrue); + } +} +#endif + +/* + * process ANSI modes set, reset + */ +static void +ansi_modes(XtermWidget xw, BitFunc func) +{ + int i; + + for (i = 0; i < nparam; ++i) { + switch (GetParam(i)) { + case 2: /* KAM (if set, keyboard locked */ + (*func) (&xw->keyboard.flags, MODE_KAM); + break; + + case 4: /* IRM */ + (*func) (&xw->flags, INSERT); + break; + + case 12: /* SRM (if set, local echo */ + (*func) (&xw->keyboard.flags, MODE_SRM); + break; + + case 20: /* LNM */ + (*func) (&xw->flags, LINEFEED); + update_autolinefeed(); + break; + } + } +} + +#define IsSM() (func == bitset) + +#define set_bool_mode(flag) \ + flag = (Boolean) IsSM() + +static void +really_set_mousemode(XtermWidget xw, + Bool enabled, + XtermMouseModes mode) +{ + TScreenOf(xw)->send_mouse_pos = enabled ? mode : MOUSE_OFF; + if (okSendMousePos(xw) != MOUSE_OFF) + xtermShowPointer(xw, True); +} + +#define set_mousemode(mode) really_set_mousemode(xw, IsSM(), mode) + +#if OPT_PASTE64 || OPT_READLINE +#define set_mouseflag(f) \ + (IsSM() \ + ? SCREEN_FLAG_set(screen, f) \ + : SCREEN_FLAG_unset(screen, f)) +#endif + +/* + * process DEC private modes set, reset + */ +static void +dpmodes(XtermWidget xw, BitFunc func) +{ + TScreen *screen = TScreenOf(xw); + int i, j; + unsigned myflags; + + TRACE(("changing %d DEC private modes\n", nparam)); + for (i = 0; i < nparam; ++i) { + int code = GetParam(i); + + TRACE(("%s %d\n", IsSM()? "DECSET" : "DECRST", code)); + switch ((DECSET_codes) code) { + case srm_DECCKM: + (*func) (&xw->keyboard.flags, MODE_DECCKM); + update_appcursor(); + break; + case srm_DECANM: /* ANSI/VT52 mode */ + if (IsSM()) { /* ANSI (VT100) */ + /* + * Setting DECANM should have no effect, since this function + * cannot be reached from vt52 mode. + */ + /* EMPTY */ ; + } +#if OPT_VT52_MODE + else if (screen->terminal_id >= 100) { /* VT52 */ + TRACE(("DECANM terminal_id %d, vtXX_level %d\n", + screen->terminal_id, + screen->vtXX_level)); + /* + * According to DEC STD 070 section A.5.5, the various VT100 + * modes have undefined behavior when entering/exiting VT52 + * mode. xterm saves/restores/initializes the most commonly + * used settings, but a real VT100 or VT520 may differ. + * + * For instance, DEC's documentation goes on to comment that + * while the VT52 uses hardware tabs (8 columns), the emulation + * (e.g., a VT420) does not alter those tab settings when + * switching modes. + */ + screen->vtXX_level = 0; + screen->vt52_save_flags = xw->flags; + xw->flags = 0; + screen->vt52_save_curgl = screen->curgl; + screen->vt52_save_curgr = screen->curgr; + screen->vt52_save_curss = screen->curss; + saveCharsets(screen, screen->vt52_save_gsets); + resetCharsets(screen); + InitParams(); /* ignore the remaining params, if any */ + update_vt52_vt100_settings(); + RequestResize(xw, -1, 80, True); + } +#endif + break; + case srm_DECCOLM: + if (screen->c132) { + Boolean willResize = ((j = IsSM() + ? 132 + : 80) + != ((xw->flags & IN132COLUMNS) + ? 132 + : 80) + || j != MaxCols(screen)); + if (!(xw->flags & NOCLEAR_COLM)) + ClearScreen(xw); + if (willResize) + RequestResize(xw, -1, j, True); + (*func) (&xw->flags, IN132COLUMNS); + resetMargins(xw); + CursorSet(screen, 0, 0, xw->flags); + } + break; + case srm_DECSCLM: /* (slow scroll) */ + if (IsSM()) { + screen->jumpscroll = 0; + if (screen->scroll_amt) + FlushScroll(xw); + } else + screen->jumpscroll = 1; + (*func) (&xw->flags, SMOOTHSCROLL); + update_jumpscroll(); + break; + case srm_DECSCNM: + myflags = xw->flags; + (*func) (&xw->flags, REVERSE_VIDEO); + if ((xw->flags ^ myflags) & REVERSE_VIDEO) + ReverseVideo(xw); + /* update_reversevideo done in RevVid */ + break; + + case srm_DECOM: + (*func) (&xw->flags, ORIGIN); + CursorSet(screen, 0, 0, xw->flags); + break; + + case srm_DECAWM: + (*func) (&xw->flags, WRAPAROUND); + update_autowrap(); + break; + case srm_DECARM: + /* ignore autorepeat + * XAutoRepeatOn() and XAutoRepeatOff() can do this, but only + * for the whole display - not limited to a given window. + */ + break; + case srm_X10_MOUSE: /* MIT bogus sequence */ + MotionOff(screen, xw); + set_mousemode(X10_MOUSE); + break; +#if OPT_TOOLBAR + case srm_RXVT_TOOLBAR: + ShowToolbar(IsSM()); + break; +#endif +#if OPT_BLINK_CURS + case srm_ATT610_BLINK: /* AT&T 610: Start/stop blinking cursor */ + if (SettableCursorBlink(screen)) { + set_bool_mode(screen->cursor_blink_esc); + UpdateCursorBlink(xw); + } + break; + case srm_CURSOR_BLINK_OPS: + /* intentionally ignored (this is user-preference) */ + break; + case srm_XOR_CURSOR_BLINKS: + /* intentionally ignored (this is user-preference) */ + break; +#endif + case srm_DECPFF: /* print form feed */ + set_bool_mode(PrinterOf(screen).printer_formfeed); + break; + case srm_DECPEX: /* print extent */ + set_bool_mode(PrinterOf(screen).printer_extent); + break; + case srm_DECTCEM: /* Show/hide cursor (VT200) */ + set_bool_mode(screen->cursor_set); + break; + case srm_RXVT_SCROLLBAR: + if (screen->fullVwin.sb_info.width != (IsSM()? ON : OFF)) + ToggleScrollBar(xw); + break; +#if OPT_SHIFT_FONTS + case srm_RXVT_FONTSIZE: + set_bool_mode(xw->misc.shift_fonts); + break; +#endif +#if OPT_TEK4014 + case srm_DECTEK: + if (IsSM() && !(screen->inhibit & I_TEK)) { + FlushLog(xw); + TEK4014_ACTIVE(xw) = True; + TRACE(("Tek4014 is now active...\n")); + update_vttekmode(); + } + break; +#endif + case srm_132COLS: /* 132 column mode */ + set_bool_mode(screen->c132); + update_allow132(); + break; + case srm_CURSES_HACK: + set_bool_mode(screen->curses); + update_cursesemul(); + break; + case srm_DECNRCM: /* national charset (VT220) */ + if (screen->vtXX_level >= 2) { + if ((*func) (&xw->flags, NATIONAL)) { + modified_DECNRCM(xw); + } + } + break; + case srm_MARGIN_BELL: /* margin bell */ + set_bool_mode(screen->marginbell); + if (!screen->marginbell) + screen->bellArmed = -1; + update_marginbell(); + break; + case srm_REVERSEWRAP: /* reverse wraparound */ + (*func) (&xw->flags, REVERSEWRAP); + update_reversewrap(); + break; +#ifdef ALLOWLOGGING + case srm_ALLOWLOGGING: /* logging */ +#ifdef ALLOWLOGFILEONOFF + /* + * if this feature is enabled, logging may be + * enabled and disabled via escape sequences. + */ + if (IsSM()) + StartLog(xw); + else + CloseLog(xw); +#else + Bell(xw, XkbBI_Info, 0); + Bell(xw, XkbBI_Info, 0); +#endif /* ALLOWLOGFILEONOFF */ + break; +#endif + case srm_OPT_ALTBUF_CURSOR: /* alternate buffer & cursor */ + if (!xw->misc.titeInhibit) { + if (IsSM()) { + CursorSave(xw); + ToAlternate(xw, True); + ClearScreen(xw); + } else { + FromAlternate(xw); + CursorRestore(xw); + } + } else if (IsSM()) { + do_ti_xtra_scroll(xw); + } + break; + case srm_OPT_ALTBUF: + /* FALLTHRU */ + case srm_ALTBUF: /* alternate buffer */ + if (!xw->misc.titeInhibit) { + if (IsSM()) { + ToAlternate(xw, False); + } else { + if (screen->whichBuf + && (code == 1047)) + ClearScreen(xw); + FromAlternate(xw); + } + } else if (IsSM()) { + do_ti_xtra_scroll(xw); + } + break; + case srm_DECNKM: + (*func) (&xw->keyboard.flags, MODE_DECKPAM); + update_appkeypad(); + break; + case srm_DECBKM: + /* back-arrow mapped to backspace or delete(D) */ + (*func) (&xw->keyboard.flags, MODE_DECBKM); + TRACE(("DECSET DECBKM %s\n", + BtoS(xw->keyboard.flags & MODE_DECBKM))); + update_decbkm(); + break; + case srm_DECLRMM: + if (screen->vtXX_level >= 4) { /* VT420 */ + (*func) (&xw->flags, LEFT_RIGHT); + if (IsLeftRightMode(xw)) { + xterm_ResetDouble(xw); + } else { + reset_lr_margins(screen); + } + } + break; +#if OPT_SIXEL_GRAPHICS + case srm_DECSDM: /* sixel scrolling */ + if (optSixelGraphics(screen)) { /* FIXME: VT24x did not scroll sixel graphics */ + (*func) (&xw->keyboard.flags, MODE_DECSDM); + TRACE(("DECSET/DECRST DECSDM %s (resource default is %d)\n", + BtoS(xw->keyboard.flags & MODE_DECSDM), + TScreenOf(xw)->sixel_scrolling)); + update_decsdm(); + } + break; +#endif + case srm_DECNCSM: + if (screen->vtXX_level >= 5) { /* VT510 */ + (*func) (&xw->flags, NOCLEAR_COLM); + } + break; + case srm_VT200_MOUSE: /* xterm bogus sequence */ + MotionOff(screen, xw); + set_mousemode(VT200_MOUSE); + break; + case srm_VT200_HIGHLIGHT_MOUSE: /* xterm sequence w/hilite tracking */ + MotionOff(screen, xw); + set_mousemode(VT200_HIGHLIGHT_MOUSE); + break; + case srm_BTN_EVENT_MOUSE: + MotionOff(screen, xw); + set_mousemode(BTN_EVENT_MOUSE); + break; + case srm_ANY_EVENT_MOUSE: + set_mousemode(ANY_EVENT_MOUSE); + if (screen->send_mouse_pos == MOUSE_OFF) { + MotionOff(screen, xw); + } else { + MotionOn(screen, xw); + } + break; +#if OPT_FOCUS_EVENT + case srm_FOCUS_EVENT_MOUSE: + set_bool_mode(screen->send_focus_pos); + break; +#endif + case srm_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_SGR_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_URXVT_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_PIXEL_POSITION_MOUSE: + /* + * Rather than choose an arbitrary precedence among the coordinate + * modes, they are mutually exclusive. For consistency, a reset is + * only effective against the matching mode. + */ + if (IsSM()) { + screen->extend_coords = code; + } else if (screen->extend_coords == code) { + screen->extend_coords = 0; + } + break; + case srm_ALTERNATE_SCROLL: + set_bool_mode(screen->alternateScroll); + break; + case srm_RXVT_SCROLL_TTY_OUTPUT: + set_bool_mode(screen->scrollttyoutput); + update_scrollttyoutput(); + break; + case srm_RXVT_SCROLL_TTY_KEYPRESS: + set_bool_mode(screen->scrollkey); + update_scrollkey(); + break; + case srm_EIGHT_BIT_META: + if (screen->eight_bit_meta != ebNever) { + set_bool_mode(screen->eight_bit_meta); + } + break; +#if OPT_NUM_LOCK + case srm_REAL_NUMLOCK: + set_bool_mode(xw->misc.real_NumLock); + update_num_lock(); + break; + case srm_META_SENDS_ESC: + set_bool_mode(screen->meta_sends_esc); + update_meta_esc(); + break; +#endif + case srm_DELETE_IS_DEL: + set_bool_mode(screen->delete_is_del); + update_delete_del(); + break; +#if OPT_NUM_LOCK + case srm_ALT_SENDS_ESC: + set_bool_mode(screen->alt_sends_esc); + update_alt_esc(); + break; +#endif + case srm_KEEP_SELECTION: + set_bool_mode(screen->keepSelection); + update_keepSelection(); + break; + case srm_SELECT_TO_CLIPBOARD: + set_bool_mode(screen->selectToClipboard); + update_selectToClipboard(); + break; + case srm_BELL_IS_URGENT: + set_bool_mode(screen->bellIsUrgent); + update_bellIsUrgent(); + break; + case srm_POP_ON_BELL: + set_bool_mode(screen->poponbell); + update_poponbell(); + break; + case srm_KEEP_CLIPBOARD: + set_bool_mode(screen->keepClipboard); + update_keepClipboard(); + break; + case srm_ALLOW_ALTBUF: + if (IsSM()) { + xw->misc.titeInhibit = False; + } else if (!xw->misc.titeInhibit) { + xw->misc.titeInhibit = True; + FromAlternate(xw); + } + update_titeInhibit(); + break; + case srm_SAVE_CURSOR: + if (!xw->misc.titeInhibit) { + if (IsSM()) + CursorSave(xw); + else + CursorRestore(xw); + } + break; +#if OPT_TCAP_FKEYS + case srm_TCAP_FKEYS: + set_keyboard_type(xw, keyboardIsTermcap, IsSM()); + break; +#endif +#if OPT_SUN_FUNC_KEYS + case srm_SUN_FKEYS: + set_keyboard_type(xw, keyboardIsSun, IsSM()); + break; +#endif +#if OPT_HP_FUNC_KEYS + case srm_HP_FKEYS: + set_keyboard_type(xw, keyboardIsHP, IsSM()); + break; +#endif +#if OPT_SCO_FUNC_KEYS + case srm_SCO_FKEYS: + set_keyboard_type(xw, keyboardIsSCO, IsSM()); + break; +#endif + case srm_LEGACY_FKEYS: + set_keyboard_type(xw, keyboardIsLegacy, IsSM()); + break; +#if OPT_SUNPC_KBD + case srm_VT220_FKEYS: + set_keyboard_type(xw, keyboardIsVT220, IsSM()); + break; +#endif +#if OPT_PASTE64 || OPT_READLINE + case srm_PASTE_IN_BRACKET: + set_mouseflag(paste_brackets); + break; +#endif +#if OPT_READLINE + case srm_BUTTON1_MOVE_POINT: + set_mouseflag(click1_moves); + break; + case srm_BUTTON2_MOVE_POINT: + set_mouseflag(paste_moves); + break; + case srm_DBUTTON3_DELETE: + set_mouseflag(dclick3_deletes); + break; + case srm_PASTE_QUOTE: + set_mouseflag(paste_quotes); + break; + case srm_PASTE_LITERAL_NL: + set_mouseflag(paste_literal_nl); + break; +#endif /* OPT_READLINE */ +#if OPT_GRAPHICS + case srm_PRIVATE_COLOR_REGISTERS: /* private color registers for each graphic */ + TRACE(("DECSET/DECRST PRIVATE_COLOR_REGISTERS to %s (resource default is %s)\n", + BtoS(screen->privatecolorregisters), + BtoS(TScreenOf(xw)->privatecolorregisters))); + set_bool_mode(screen->privatecolorregisters); + update_privatecolorregisters(); + break; +#endif +#if OPT_SIXEL_GRAPHICS + case srm_SIXEL_SCROLLS_RIGHT: /* sixel scrolling moves cursor to right */ + if (optSixelGraphics(screen)) { /* FIXME: VT24x did not scroll sixel graphics */ + set_bool_mode(screen->sixel_scrolls_right); + TRACE(("DECSET/DECRST SIXEL_SCROLLS_RIGHT to %s (resource default is %s)\n", + BtoS(screen->sixel_scrolls_right), + BtoS(TScreenOf(xw)->sixel_scrolls_right))); + } + break; +#endif + default: + TRACE(("DATA_ERROR: unknown private code %d\n", code)); + break; + } + } +} + +/* + * process xterm private modes save + */ +static void +savemodes(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int i; + + for (i = 0; i < nparam; i++) { + int code = GetParam(i); + + TRACE(("savemodes %d\n", code)); + switch ((DECSET_codes) code) { + case srm_DECCKM: + DoSM(DP_DECCKM, xw->keyboard.flags & MODE_DECCKM); + break; + case srm_DECANM: /* ANSI/VT52 mode */ + /* no effect */ + break; + case srm_DECCOLM: + if (screen->c132) + DoSM(DP_DECCOLM, xw->flags & IN132COLUMNS); + break; + case srm_DECSCLM: /* (slow scroll) */ + DoSM(DP_DECSCLM, xw->flags & SMOOTHSCROLL); + break; + case srm_DECSCNM: + DoSM(DP_DECSCNM, xw->flags & REVERSE_VIDEO); + break; + case srm_DECOM: + DoSM(DP_DECOM, xw->flags & ORIGIN); + break; + case srm_DECAWM: + DoSM(DP_DECAWM, xw->flags & WRAPAROUND); + break; + case srm_DECARM: + /* ignore autorepeat */ + break; + case srm_X10_MOUSE: /* mouse bogus sequence */ + DoSM(DP_X_X10MSE, screen->send_mouse_pos); + break; +#if OPT_TOOLBAR + case srm_RXVT_TOOLBAR: + DoSM(DP_TOOLBAR, resource.toolBar); + break; +#endif +#if OPT_BLINK_CURS + case srm_ATT610_BLINK: /* AT&T 610: Start/stop blinking cursor */ + if (SettableCursorBlink(screen)) { + DoSM(DP_CRS_BLINK, screen->cursor_blink_esc); + } + break; + case srm_CURSOR_BLINK_OPS: + /* intentionally ignored (this is user-preference) */ + break; + case srm_XOR_CURSOR_BLINKS: + /* intentionally ignored (this is user-preference) */ + break; +#endif + case srm_DECPFF: /* print form feed */ + DoSM(DP_PRN_FORMFEED, PrinterOf(screen).printer_formfeed); + break; + case srm_DECPEX: /* print extent */ + DoSM(DP_PRN_EXTENT, PrinterOf(screen).printer_extent); + break; + case srm_DECTCEM: /* Show/hide cursor (VT200) */ + DoSM(DP_CRS_VISIBLE, screen->cursor_set); + break; + case srm_RXVT_SCROLLBAR: + DoSM(DP_RXVT_SCROLLBAR, (screen->fullVwin.sb_info.width != 0)); + break; +#if OPT_SHIFT_FONTS + case srm_RXVT_FONTSIZE: + DoSM(DP_RXVT_FONTSIZE, xw->misc.shift_fonts); + break; +#endif +#if OPT_TEK4014 + case srm_DECTEK: + DoSM(DP_DECTEK, TEK4014_ACTIVE(xw)); + break; +#endif + case srm_132COLS: /* 132 column mode */ + DoSM(DP_X_DECCOLM, screen->c132); + break; + case srm_CURSES_HACK: /* curses hack */ + DoSM(DP_X_MORE, screen->curses); + break; + case srm_DECNRCM: /* national charset (VT220) */ + if (screen->vtXX_level >= 2) { + DoSM(DP_DECNRCM, xw->flags & NATIONAL); + } + break; + case srm_MARGIN_BELL: /* margin bell */ + DoSM(DP_X_MARGIN, screen->marginbell); + break; + case srm_REVERSEWRAP: /* reverse wraparound */ + DoSM(DP_X_REVWRAP, xw->flags & REVERSEWRAP); + break; +#ifdef ALLOWLOGGING + case srm_ALLOWLOGGING: /* logging */ + DoSM(DP_X_LOGGING, screen->logging); + break; +#endif + case srm_OPT_ALTBUF_CURSOR: + /* FALLTHRU */ + case srm_OPT_ALTBUF: + /* FALLTHRU */ + case srm_ALTBUF: /* alternate buffer */ + DoSM(DP_X_ALTBUF, screen->whichBuf); + break; + case srm_DECNKM: + DoSM(DP_DECKPAM, xw->keyboard.flags & MODE_DECKPAM); + break; + case srm_DECBKM: /* backarrow mapping */ + DoSM(DP_DECBKM, xw->keyboard.flags & MODE_DECBKM); + break; + case srm_DECLRMM: /* left-right */ + DoSM(DP_X_LRMM, LEFT_RIGHT); + break; +#if OPT_SIXEL_GRAPHICS + case srm_DECSDM: /* sixel scrolling */ + DoSM(DP_DECSDM, xw->keyboard.flags & MODE_DECSDM); + update_decsdm(); + break; +#endif + case srm_DECNCSM: /* noclear */ + DoSM(DP_X_NCSM, NOCLEAR_COLM); + break; + case srm_VT200_MOUSE: /* mouse bogus sequence */ + /* FALLTHRU */ + case srm_VT200_HIGHLIGHT_MOUSE: + /* FALLTHRU */ + case srm_BTN_EVENT_MOUSE: + /* FALLTHRU */ + case srm_ANY_EVENT_MOUSE: + DoSM(DP_X_MOUSE, screen->send_mouse_pos); + break; +#if OPT_FOCUS_EVENT + case srm_FOCUS_EVENT_MOUSE: + DoSM(DP_X_FOCUS, screen->send_focus_pos); + break; +#endif + case srm_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_SGR_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_URXVT_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_PIXEL_POSITION_MOUSE: + DoSM(DP_X_EXT_MOUSE, screen->extend_coords); + break; + case srm_ALTERNATE_SCROLL: + DoSM(DP_ALTERNATE_SCROLL, screen->alternateScroll); + break; + case srm_RXVT_SCROLL_TTY_OUTPUT: + DoSM(DP_RXVT_SCROLL_TTY_OUTPUT, screen->scrollttyoutput); + break; + case srm_RXVT_SCROLL_TTY_KEYPRESS: + DoSM(DP_RXVT_SCROLL_TTY_KEYPRESS, screen->scrollkey); + break; + case srm_EIGHT_BIT_META: + DoSM(DP_EIGHT_BIT_META, screen->eight_bit_meta); + break; +#if OPT_NUM_LOCK + case srm_REAL_NUMLOCK: + DoSM(DP_REAL_NUMLOCK, xw->misc.real_NumLock); + break; + case srm_META_SENDS_ESC: + DoSM(DP_META_SENDS_ESC, screen->meta_sends_esc); + break; +#endif + case srm_DELETE_IS_DEL: + DoSM(DP_DELETE_IS_DEL, screen->delete_is_del); + break; +#if OPT_NUM_LOCK + case srm_ALT_SENDS_ESC: + DoSM(DP_ALT_SENDS_ESC, screen->alt_sends_esc); + break; +#endif + case srm_KEEP_SELECTION: + DoSM(DP_KEEP_SELECTION, screen->keepSelection); + break; + case srm_SELECT_TO_CLIPBOARD: + DoSM(DP_SELECT_TO_CLIPBOARD, screen->selectToClipboard); + break; + case srm_BELL_IS_URGENT: + DoSM(DP_BELL_IS_URGENT, screen->bellIsUrgent); + break; + case srm_POP_ON_BELL: + DoSM(DP_POP_ON_BELL, screen->poponbell); + break; + case srm_KEEP_CLIPBOARD: + DoSM(DP_KEEP_CLIPBOARD, screen->keepClipboard); + break; +#if OPT_TCAP_FKEYS + case srm_TCAP_FKEYS: + /* FALLTHRU */ +#endif +#if OPT_SUN_FUNC_KEYS + case srm_SUN_FKEYS: + /* FALLTHRU */ +#endif +#if OPT_HP_FUNC_KEYS + case srm_HP_FKEYS: + /* FALLTHRU */ +#endif +#if OPT_SCO_FUNC_KEYS + case srm_SCO_FKEYS: + /* FALLTHRU */ +#endif +#if OPT_SUNPC_KBD + case srm_VT220_FKEYS: + /* FALLTHRU */ +#endif + case srm_LEGACY_FKEYS: + DoSM(DP_KEYBOARD_TYPE, xw->keyboard.type); + break; + case srm_ALLOW_ALTBUF: + DoSM(DP_ALLOW_ALTBUF, xw->misc.titeInhibit); + break; + case srm_SAVE_CURSOR: + if (!xw->misc.titeInhibit) { + CursorSave(xw); + } + break; +#if OPT_PASTE64 || OPT_READLINE + case srm_PASTE_IN_BRACKET: + SCREEN_FLAG_save(screen, paste_brackets); + break; +#endif +#if OPT_READLINE + case srm_BUTTON1_MOVE_POINT: + SCREEN_FLAG_save(screen, click1_moves); + break; + case srm_BUTTON2_MOVE_POINT: + SCREEN_FLAG_save(screen, paste_moves); + break; + case srm_DBUTTON3_DELETE: + SCREEN_FLAG_save(screen, dclick3_deletes); + break; + case srm_PASTE_QUOTE: + SCREEN_FLAG_save(screen, paste_quotes); + break; + case srm_PASTE_LITERAL_NL: + SCREEN_FLAG_save(screen, paste_literal_nl); + break; +#endif /* OPT_READLINE */ +#if OPT_GRAPHICS + case srm_PRIVATE_COLOR_REGISTERS: /* private color registers for each graphic */ + TRACE(("save PRIVATE_COLOR_REGISTERS %s\n", + BtoS(screen->privatecolorregisters))); + DoSM(DP_X_PRIVATE_COLOR_REGISTERS, screen->privatecolorregisters); + update_privatecolorregisters(); + break; +#endif +#if OPT_SIXEL_GRAPHICS + case srm_SIXEL_SCROLLS_RIGHT: + TRACE(("save SIXEL_SCROLLS_RIGHT %s\n", + BtoS(screen->sixel_scrolls_right))); + DoSM(DP_SIXEL_SCROLLS_RIGHT, screen->sixel_scrolls_right); + break; +#endif + } + } +} + +/* + * process xterm private modes restore + */ +static void +restoremodes(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int i, j; + + for (i = 0; i < nparam; i++) { + int code = GetParam(i); + + TRACE(("restoremodes %d\n", code)); + switch ((DECSET_codes) code) { + case srm_DECCKM: + bitcpy(&xw->keyboard.flags, + screen->save_modes[DP_DECCKM], MODE_DECCKM); + update_appcursor(); + break; + case srm_DECANM: /* ANSI/VT52 mode */ + /* no effect */ + break; + case srm_DECCOLM: + if (screen->c132) { + if (!(xw->flags & NOCLEAR_COLM)) + ClearScreen(xw); + CursorSet(screen, 0, 0, xw->flags); + if ((j = (screen->save_modes[DP_DECCOLM] & IN132COLUMNS) + ? 132 : 80) != ((xw->flags & IN132COLUMNS) + ? 132 : 80) || j != MaxCols(screen)) + RequestResize(xw, -1, j, True); + bitcpy(&xw->flags, + screen->save_modes[DP_DECCOLM], + IN132COLUMNS); + } + break; + case srm_DECSCLM: /* (slow scroll) */ + if (screen->save_modes[DP_DECSCLM] & SMOOTHSCROLL) { + screen->jumpscroll = 0; + if (screen->scroll_amt) + FlushScroll(xw); + } else + screen->jumpscroll = 1; + bitcpy(&xw->flags, screen->save_modes[DP_DECSCLM], SMOOTHSCROLL); + update_jumpscroll(); + break; + case srm_DECSCNM: + if ((screen->save_modes[DP_DECSCNM] ^ xw->flags) & REVERSE_VIDEO) { + bitcpy(&xw->flags, screen->save_modes[DP_DECSCNM], REVERSE_VIDEO); + ReverseVideo(xw); + /* update_reversevideo done in RevVid */ + } + break; + case srm_DECOM: + bitcpy(&xw->flags, screen->save_modes[DP_DECOM], ORIGIN); + CursorSet(screen, 0, 0, xw->flags); + break; + + case srm_DECAWM: + bitcpy(&xw->flags, screen->save_modes[DP_DECAWM], WRAPAROUND); + update_autowrap(); + break; + case srm_DECARM: + /* ignore autorepeat */ + break; + case srm_X10_MOUSE: /* MIT bogus sequence */ + DoRM0(DP_X_X10MSE, screen->send_mouse_pos); + really_set_mousemode(xw, + screen->send_mouse_pos != MOUSE_OFF, + (XtermMouseModes) screen->send_mouse_pos); + break; +#if OPT_TOOLBAR + case srm_RXVT_TOOLBAR: + DoRM(DP_TOOLBAR, resource.toolBar); + ShowToolbar(resource.toolBar); + break; +#endif +#if OPT_BLINK_CURS + case srm_ATT610_BLINK: /* Start/stop blinking cursor */ + if (SettableCursorBlink(screen)) { + DoRM(DP_CRS_BLINK, screen->cursor_blink_esc); + UpdateCursorBlink(xw); + } + break; + case srm_CURSOR_BLINK_OPS: + /* intentionally ignored (this is user-preference) */ + break; + case srm_XOR_CURSOR_BLINKS: + /* intentionally ignored (this is user-preference) */ + break; +#endif + case srm_DECPFF: /* print form feed */ + DoRM(DP_PRN_FORMFEED, PrinterOf(screen).printer_formfeed); + break; + case srm_DECPEX: /* print extent */ + DoRM(DP_PRN_EXTENT, PrinterOf(screen).printer_extent); + break; + case srm_DECTCEM: /* Show/hide cursor (VT200) */ + DoRM(DP_CRS_VISIBLE, screen->cursor_set); + break; + case srm_RXVT_SCROLLBAR: + if ((screen->fullVwin.sb_info.width != 0) != + screen->save_modes[DP_RXVT_SCROLLBAR]) { + ToggleScrollBar(xw); + } + break; +#if OPT_SHIFT_FONTS + case srm_RXVT_FONTSIZE: + DoRM(DP_RXVT_FONTSIZE, xw->misc.shift_fonts); + break; +#endif +#if OPT_TEK4014 + case srm_DECTEK: + if (!(screen->inhibit & I_TEK) && + (TEK4014_ACTIVE(xw) != (Boolean) screen->save_modes[DP_DECTEK])) { + FlushLog(xw); + TEK4014_ACTIVE(xw) = (Boolean) screen->save_modes[DP_DECTEK]; + update_vttekmode(); + } + break; +#endif + case srm_132COLS: /* 132 column mode */ + DoRM(DP_X_DECCOLM, screen->c132); + update_allow132(); + break; + case srm_CURSES_HACK: /* curses hack */ + DoRM(DP_X_MORE, screen->curses); + update_cursesemul(); + break; + case srm_DECNRCM: /* national charset (VT220) */ + if (screen->vtXX_level >= 2) { + if (bitcpy(&xw->flags, screen->save_modes[DP_DECNRCM], NATIONAL)) + modified_DECNRCM(xw); + } + break; + case srm_MARGIN_BELL: /* margin bell */ + if ((DoRM(DP_X_MARGIN, screen->marginbell)) == 0) + screen->bellArmed = -1; + update_marginbell(); + break; + case srm_REVERSEWRAP: /* reverse wraparound */ + bitcpy(&xw->flags, screen->save_modes[DP_X_REVWRAP], REVERSEWRAP); + update_reversewrap(); + break; +#ifdef ALLOWLOGGING + case srm_ALLOWLOGGING: /* logging */ +#ifdef ALLOWLOGFILEONOFF + if (screen->save_modes[DP_X_LOGGING]) + StartLog(xw); + else + CloseLog(xw); +#endif /* ALLOWLOGFILEONOFF */ + /* update_logging done by StartLog and CloseLog */ + break; +#endif + case srm_OPT_ALTBUF_CURSOR: /* alternate buffer & cursor */ + /* FALLTHRU */ + case srm_OPT_ALTBUF: + /* FALLTHRU */ + case srm_ALTBUF: /* alternate buffer */ + if (!xw->misc.titeInhibit) { + if (screen->save_modes[DP_X_ALTBUF]) + ToAlternate(xw, False); + else + FromAlternate(xw); + /* update_altscreen done by ToAlt and FromAlt */ + } else if (screen->save_modes[DP_X_ALTBUF]) { + do_ti_xtra_scroll(xw); + } + break; + case srm_DECNKM: + bitcpy(&xw->flags, screen->save_modes[DP_DECKPAM], MODE_DECKPAM); + update_appkeypad(); + break; + case srm_DECBKM: /* backarrow mapping */ + bitcpy(&xw->flags, screen->save_modes[DP_DECBKM], MODE_DECBKM); + update_decbkm(); + break; + case srm_DECLRMM: /* left-right */ + bitcpy(&xw->flags, screen->save_modes[DP_X_LRMM], LEFT_RIGHT); + if (IsLeftRightMode(xw)) { + xterm_ResetDouble(xw); + } else { + reset_lr_margins(screen); + } + break; +#if OPT_SIXEL_GRAPHICS + case srm_DECSDM: /* sixel scrolling */ + bitcpy(&xw->keyboard.flags, screen->save_modes[DP_DECSDM], MODE_DECSDM); + update_decsdm(); + break; +#endif + case srm_DECNCSM: /* noclear */ + bitcpy(&xw->flags, screen->save_modes[DP_X_NCSM], NOCLEAR_COLM); + break; + case srm_VT200_MOUSE: /* mouse bogus sequence */ + /* FALLTHRU */ + case srm_VT200_HIGHLIGHT_MOUSE: + /* FALLTHRU */ + case srm_BTN_EVENT_MOUSE: + /* FALLTHRU */ + case srm_ANY_EVENT_MOUSE: + DoRM0(DP_X_MOUSE, screen->send_mouse_pos); + really_set_mousemode(xw, + screen->send_mouse_pos != MOUSE_OFF, + (XtermMouseModes) screen->send_mouse_pos); + break; +#if OPT_FOCUS_EVENT + case srm_FOCUS_EVENT_MOUSE: + DoRM(DP_X_FOCUS, screen->send_focus_pos); + break; +#endif + case srm_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_SGR_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_URXVT_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_PIXEL_POSITION_MOUSE: + DoRM(DP_X_EXT_MOUSE, screen->extend_coords); + break; + case srm_ALLOW_ALTBUF: + DoRM(DP_ALLOW_ALTBUF, xw->misc.titeInhibit); + if (xw->misc.titeInhibit) + FromAlternate(xw); + update_titeInhibit(); + break; + case srm_SAVE_CURSOR: + if (!xw->misc.titeInhibit) { + CursorRestore(xw); + } + break; + case srm_ALTERNATE_SCROLL: + DoRM(DP_ALTERNATE_SCROLL, screen->alternateScroll); + break; + case srm_RXVT_SCROLL_TTY_OUTPUT: + DoRM(DP_RXVT_SCROLL_TTY_OUTPUT, screen->scrollttyoutput); + update_scrollttyoutput(); + break; + case srm_RXVT_SCROLL_TTY_KEYPRESS: + DoRM(DP_RXVT_SCROLL_TTY_KEYPRESS, screen->scrollkey); + update_scrollkey(); + break; + case srm_EIGHT_BIT_META: + DoRM(DP_EIGHT_BIT_META, screen->eight_bit_meta); + break; +#if OPT_NUM_LOCK + case srm_REAL_NUMLOCK: + DoRM(DP_REAL_NUMLOCK, xw->misc.real_NumLock); + update_num_lock(); + break; + case srm_META_SENDS_ESC: + DoRM(DP_META_SENDS_ESC, screen->meta_sends_esc); + update_meta_esc(); + break; +#endif + case srm_DELETE_IS_DEL: + DoRM(DP_DELETE_IS_DEL, screen->delete_is_del); + update_delete_del(); + break; +#if OPT_NUM_LOCK + case srm_ALT_SENDS_ESC: + DoRM(DP_ALT_SENDS_ESC, screen->alt_sends_esc); + update_alt_esc(); + break; +#endif + case srm_KEEP_SELECTION: + DoRM(DP_KEEP_SELECTION, screen->keepSelection); + update_keepSelection(); + break; + case srm_SELECT_TO_CLIPBOARD: + DoRM(DP_SELECT_TO_CLIPBOARD, screen->selectToClipboard); + update_selectToClipboard(); + break; + case srm_BELL_IS_URGENT: + DoRM(DP_BELL_IS_URGENT, screen->bellIsUrgent); + update_bellIsUrgent(); + break; + case srm_POP_ON_BELL: + DoRM(DP_POP_ON_BELL, screen->poponbell); + update_poponbell(); + break; + case srm_KEEP_CLIPBOARD: + DoRM(DP_KEEP_CLIPBOARD, screen->keepClipboard); + update_keepClipboard(); + break; +#if OPT_TCAP_FKEYS + case srm_TCAP_FKEYS: + /* FALLTHRU */ +#endif +#if OPT_SUN_FUNC_KEYS + case srm_SUN_FKEYS: + /* FALLTHRU */ +#endif +#if OPT_HP_FUNC_KEYS + case srm_HP_FKEYS: + /* FALLTHRU */ +#endif +#if OPT_SCO_FUNC_KEYS + case srm_SCO_FKEYS: + /* FALLTHRU */ +#endif +#if OPT_SUNPC_KBD + case srm_VT220_FKEYS: + /* FALLTHRU */ +#endif + case srm_LEGACY_FKEYS: + xw->keyboard.type = (xtermKeyboardType) screen->save_modes[DP_KEYBOARD_TYPE]; + break; +#if OPT_PASTE64 || OPT_READLINE + case srm_PASTE_IN_BRACKET: + SCREEN_FLAG_restore(screen, paste_brackets); + break; +#endif +#if OPT_READLINE + case srm_BUTTON1_MOVE_POINT: + SCREEN_FLAG_restore(screen, click1_moves); + break; + case srm_BUTTON2_MOVE_POINT: + SCREEN_FLAG_restore(screen, paste_moves); + break; + case srm_DBUTTON3_DELETE: + SCREEN_FLAG_restore(screen, dclick3_deletes); + break; + case srm_PASTE_QUOTE: + SCREEN_FLAG_restore(screen, paste_quotes); + break; + case srm_PASTE_LITERAL_NL: + SCREEN_FLAG_restore(screen, paste_literal_nl); + break; +#endif /* OPT_READLINE */ +#if OPT_GRAPHICS + case srm_PRIVATE_COLOR_REGISTERS: /* private color registers for each graphic */ + TRACE(("restore PRIVATE_COLOR_REGISTERS before: %s\n", + BtoS(screen->privatecolorregisters))); + DoRM(DP_X_PRIVATE_COLOR_REGISTERS, screen->privatecolorregisters); + TRACE(("restore PRIVATE_COLOR_REGISTERS after: %s\n", + BtoS(screen->privatecolorregisters))); + update_privatecolorregisters(); + break; +#endif +#if OPT_SIXEL_GRAPHICS + case srm_SIXEL_SCROLLS_RIGHT: + TRACE(("restore SIXEL_SCROLLS_RIGHT before: %s\n", + BtoS(screen->sixel_scrolls_right))); + DoRM(DP_SIXEL_SCROLLS_RIGHT, screen->sixel_scrolls_right); + TRACE(("restore SIXEL_SCROLLS_RIGHT after: %s\n", + BtoS(screen->sixel_scrolls_right))); + break; +#endif + } + } +} + +/* + * Convert an XTextProperty to a string. + * + * This frees the data owned by the XTextProperty, and returns in its place the + * string, which must be freed by the caller. + */ +static char * +property_to_string(XtermWidget xw, XTextProperty * text) +{ + TScreen *screen = TScreenOf(xw); + Display *dpy = screen->display; + char *result = 0; + char **list = NULL; + int length = 0; + int rc; + + TRACE(("property_to_string value %p, encoding %s, format %d, nitems %ld\n", + text->value, + TraceAtomName(dpy, text->encoding), + text->format, + text->nitems)); + +#if OPT_WIDE_CHARS + /* + * We will use the XmbTextPropertyToTextList call to extract UTF-8 data. + * The xtermUtf8ToTextList() call is used to convert UTF-8 explicitly to + * ISO-8859-1. + */ + rc = -1; + if ((text->format != 8) + || IsTitleMode(xw, tmGetUtf8) + || (text->encoding == XA_UTF8_STRING(dpy) && + !(screen->wide_chars || screen->c1_printable) && + (rc = xtermUtf8ToTextList(xw, text, &list, &length)) < 0) + || (rc < 0)) +#endif + if ((rc = XmbTextPropertyToTextList(dpy, text, &list, &length)) < 0) + rc = XTextPropertyToStringList(text, &list, &length); + + if (rc >= 0) { + int n, c, pass; + size_t need; + + for (pass = 0; pass < 2; ++pass) { + for (n = 0, need = 0; n < length; n++) { + char *s = list[n]; + while ((c = *s++) != '\0') { + if (pass) + result[need] = (char) c; + ++need; + } + } + if (pass) + result[need] = '\0'; + else + result = malloc(need + 1); + if (result == 0) + break; + } + XFreeStringList(list); + } + if (text->value != 0) + XFree(text->value); + + return result; +} + +static char * +get_icon_label(XtermWidget xw) +{ + XTextProperty text; + char *result = 0; + + if (XGetWMIconName(TScreenOf(xw)->display, VShellWindow(xw), &text)) { + result = property_to_string(xw, &text); + } + return result; +} + +static char * +get_window_label(XtermWidget xw) +{ + XTextProperty text; + char *result = 0; + + if (XGetWMName(TScreenOf(xw)->display, VShellWindow(xw), &text)) { + result = property_to_string(xw, &text); + } + return result; +} + +/* + * Report window label (icon or title) in dtterm protocol + * ESC ] code label ESC backslash + */ +static void +report_win_label(XtermWidget xw, + int code, + char *text) +{ + unparseputc(xw, ANSI_ESC); + unparseputc(xw, ']'); + unparseputc(xw, code); + + if (text != 0) { + int copy = IsTitleMode(xw, tmGetBase16); + if (copy) { + TRACE(("Encoding hex:%s\n", text)); + text = x_encode_hex(text); + } + unparseputs(xw, text); + if (copy) + free(text); + } + + unparseputc(xw, ANSI_ESC); + unparseputc(xw, '\\'); /* should be ST */ + unparse_end(xw); +} + +/* + * Window operations (from CDE dtterm description, as well as extensions). + * See also "allowWindowOps" resource. + */ +static void +window_ops(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + XWindowChanges values; + XWindowAttributes win_attrs; +#if OPT_MAXIMIZE + unsigned root_width; + unsigned root_height; +#endif + int code = zero_if_default(0); + char *label; + + TRACE(("window_ops %d\n", code)); + switch (code) { + case ewRestoreWin: /* Restore (de-iconify) window */ + if (AllowWindowOps(xw, ewRestoreWin)) { + xtermDeiconify(xw); + } + break; + + case ewMinimizeWin: /* Minimize (iconify) window */ + if (AllowWindowOps(xw, ewMinimizeWin)) { + xtermIconify(xw); + } + break; + + case ewSetWinPosition: /* Move the window to the given position */ + if (AllowWindowOps(xw, ewSetWinPosition)) { + unsigned value_mask; + + values.x = (Position) zero_if_default(1); + values.y = (Position) zero_if_default(2); + TRACE(("...move window to %d,%d\n", values.x, values.y)); + value_mask = (CWX | CWY); + XReconfigureWMWindow(screen->display, + VShellWindow(xw), + DefaultScreen(screen->display), + value_mask, + &values); + } + break; + + case ewSetWinSizePixels: /* Resize the window to given size in pixels */ + if (AllowWindowOps(xw, ewSetWinSizePixels)) { + RequestResize(xw, optional_param(1), optional_param(2), False); + } + break; + + case ewRaiseWin: /* Raise the window to the front of the stack */ + if (AllowWindowOps(xw, ewRaiseWin)) { + TRACE(("...raise window\n")); + XRaiseWindow(screen->display, VShellWindow(xw)); + } + break; + + case ewLowerWin: /* Lower the window to the bottom of the stack */ + if (AllowWindowOps(xw, ewLowerWin)) { + TRACE(("...lower window\n")); + XLowerWindow(screen->display, VShellWindow(xw)); + } + break; + + case ewRefreshWin: /* Refresh the window */ + if (AllowWindowOps(xw, ewRefreshWin)) { + TRACE(("...redraw window\n")); + Redraw(); + } + break; + + case ewSetWinSizeChars: /* Resize the text-area, in characters */ + if (AllowWindowOps(xw, ewSetWinSizeChars)) { + RequestResize(xw, optional_param(1), optional_param(2), True); + } + break; + +#if OPT_MAXIMIZE + case ewMaximizeWin: /* Maximize or restore */ + if (AllowWindowOps(xw, ewMaximizeWin)) { + RequestMaximize(xw, zero_if_default(1)); + } + break; + case ewFullscreenWin: /* Fullscreen or restore */ + if (AllowWindowOps(xw, ewFullscreenWin)) { + switch (zero_if_default(1)) { + default: + RequestMaximize(xw, 0); + break; + case 1: + RequestMaximize(xw, 1); + break; + case 2: + RequestMaximize(xw, !(screen->restore_data)); + break; + } + } + break; +#endif + + case ewGetWinState: /* Report the window's state */ + if (AllowWindowOps(xw, ewGetWinState)) { + TRACE(("...get window attributes\n")); + init_reply(ANSI_CSI); + reply.a_pintro = 0; + reply.a_nparam = 1; + reply.a_param[0] = (ParmType) (xtermIsIconified(xw) ? 2 : 1); + reply.a_inters = 0; + reply.a_final = 't'; + unparseseq(xw, &reply); + } + break; + + case ewGetWinPosition: /* Report the window's position */ + if (AllowWindowOps(xw, ewGetWinPosition)) { + Window win; + Window result_win; + int result_y, result_x; + + TRACE(("...get window position\n")); + init_reply(ANSI_CSI); + reply.a_pintro = 0; + reply.a_nparam = 3; + reply.a_param[0] = 3; + switch (zero_if_default(1)) { + case 2: /* report the text-window's position */ + result_y = 0; + result_x = 0; + { + Widget mw; + for (mw = (Widget) xw; mw != 0; mw = XtParent(mw)) { + result_x += mw->core.x; + result_y += mw->core.y; + if (mw == SHELL_OF(xw)) + break; + } + } + result_x += OriginX(screen); + result_y += OriginY(screen); + break; + default: + win = WMFrameWindow(xw); + xtermGetWinAttrs(screen->display, + win, + &win_attrs); + XTranslateCoordinates(screen->display, + VShellWindow(xw), + win_attrs.root, + -win_attrs.border_width, + -win_attrs.border_width, + &result_x, &result_y, &result_win); + TRACE(("translated position %d,%d vs %d,%d\n", + result_y, result_x, + win_attrs.y, win_attrs.x)); + if (!discount_frame_extents(xw, &result_y, &result_x)) { + TRACE(("...cancelled translation\n")); + result_y = win_attrs.y; + result_x = win_attrs.x; + } + break; + } + reply.a_param[1] = (ParmType) result_x; + reply.a_param[2] = (ParmType) result_y; + reply.a_inters = 0; + reply.a_final = 't'; + unparseseq(xw, &reply); + } + break; + + case ewGetWinSizePixels: /* Report the window's size in pixels */ + if (AllowWindowOps(xw, ewGetWinSizePixels)) { + ParmType high = (ParmType) Height(screen); + ParmType wide = (ParmType) Width(screen); + + TRACE(("...get window size in pixels\n")); + init_reply(ANSI_CSI); + reply.a_pintro = 0; + reply.a_nparam = 3; + reply.a_param[0] = 4; + switch (zero_if_default(1)) { + case 2: /* report the shell-window's size */ + xtermGetWinAttrs(screen->display, + WMFrameWindow(xw), + &win_attrs); + high = (ParmType) win_attrs.height; + wide = (ParmType) win_attrs.width; + /* FALLTHRU */ + default: + reply.a_param[1] = high; + reply.a_param[2] = wide; + break; + } + reply.a_inters = 0; + reply.a_final = 't'; + unparseseq(xw, &reply); + } + break; + +#if OPT_MAXIMIZE + case ewGetScreenSizePixels: /* Report the screen's size, in Pixels */ + if (AllowWindowOps(xw, ewGetScreenSizePixels)) { + TRACE(("...get screen size in pixels\n")); + (void) QueryMaximize(xw, &root_width, &root_height); + init_reply(ANSI_CSI); + reply.a_pintro = 0; + reply.a_nparam = 3; + reply.a_param[0] = 5; + reply.a_param[1] = (ParmType) root_height; + reply.a_param[2] = (ParmType) root_width; + reply.a_inters = 0; + reply.a_final = 't'; + unparseseq(xw, &reply); + } + break; + case ewGetCharSizePixels: /* Report the font's size, in pixel */ + if (AllowWindowOps(xw, ewGetScreenSizeChars)) { + TRACE(("...get font size in pixels\n")); + TRACE(("...using font size %dx%d\n", + FontHeight(screen), + FontWidth(screen))); + init_reply(ANSI_CSI); + reply.a_pintro = 0; + reply.a_nparam = 3; + reply.a_param[0] = 6; + reply.a_param[1] = (ParmType) FontHeight(screen); + reply.a_param[2] = (ParmType) FontWidth(screen); + reply.a_inters = 0; + reply.a_final = 't'; + unparseseq(xw, &reply); + } + break; +#endif + + case ewGetWinSizeChars: /* Report the text's size in characters */ + if (AllowWindowOps(xw, ewGetWinSizeChars)) { + TRACE(("...get window size in characters\n")); + init_reply(ANSI_CSI); + reply.a_pintro = 0; + reply.a_nparam = 3; + reply.a_param[0] = 8; + reply.a_param[1] = (ParmType) MaxRows(screen); + reply.a_param[2] = (ParmType) MaxCols(screen); + reply.a_inters = 0; + reply.a_final = 't'; + unparseseq(xw, &reply); + } + break; + +#if OPT_MAXIMIZE + case ewGetScreenSizeChars: /* Report the screen's size, in characters */ + if (AllowWindowOps(xw, ewGetScreenSizeChars)) { + TRACE(("...get screen size in characters\n")); + TRACE(("...using font size %dx%d\n", + FontHeight(screen), + FontWidth(screen))); + (void) QueryMaximize(xw, &root_width, &root_height); + init_reply(ANSI_CSI); + reply.a_pintro = 0; + reply.a_nparam = 3; + reply.a_param[0] = 9; + reply.a_param[1] = (ParmType) (root_height + / (unsigned) FontHeight(screen)); + reply.a_param[2] = (ParmType) (root_width + / (unsigned) FontWidth(screen)); + reply.a_inters = 0; + reply.a_final = 't'; + unparseseq(xw, &reply); + } + break; +#endif + + case ewGetIconTitle: /* Report the icon's label */ + if (AllowWindowOps(xw, ewGetIconTitle)) { + TRACE(("...get icon's label\n")); + report_win_label(xw, 'L', label = get_icon_label(xw)); + free(label); + } + break; + + case ewGetWinTitle: /* Report the window's title */ + if (AllowWindowOps(xw, ewGetWinTitle)) { + TRACE(("...get window's label\n")); + report_win_label(xw, 'l', label = get_window_label(xw)); + free(label); + } + break; + + case ewPushTitle: /* save the window's title(s) on stack */ + if (AllowWindowOps(xw, ewPushTitle)) { + SaveTitle *last = screen->save_title; + SaveTitle *item = TypeCalloc(SaveTitle); + + TRACE(("...push title onto stack\n")); + if (item != 0) { + switch (zero_if_default(1)) { + case 0: + item->iconName = get_icon_label(xw); + item->windowName = get_window_label(xw); + break; + case 1: + item->iconName = get_icon_label(xw); + break; + case 2: + item->windowName = get_window_label(xw); + break; + } + item->next = last; + if (item->iconName == 0) { + item->iconName = ((last == 0) + ? get_icon_label(xw) + : x_strdup(last->iconName)); + } + if (item->windowName == 0) { + item->windowName = ((last == 0) + ? get_window_label(xw) + : x_strdup(last->windowName)); + } + screen->save_title = item; + } + } + break; + + case ewPopTitle: /* restore the window's title(s) from stack */ + if (AllowWindowOps(xw, ewPopTitle)) { + SaveTitle *item = screen->save_title; + + TRACE(("...pop title off stack\n")); + if (item != 0) { + switch (zero_if_default(1)) { + case 0: + ChangeIconName(xw, item->iconName); + ChangeTitle(xw, item->windowName); + break; + case 1: + ChangeIconName(xw, item->iconName); + break; + case 2: + ChangeTitle(xw, item->windowName); + break; + } + screen->save_title = item->next; + free(item->iconName); + free(item->windowName); + free(item); + } + } + break; + + default: /* DECSLPP (24, 25, 36, 48, 72, 144) */ + if (AllowWindowOps(xw, ewSetWinLines)) { + if (code >= 24) + RequestResize(xw, code, -1, True); + } + break; + } +} + +/* + * set a bit in a word given a pointer to the word and a mask. + */ +static int +bitset(unsigned *p, unsigned mask) +{ + unsigned before = *p; + *p |= mask; + return (before != *p); +} + +/* + * clear a bit in a word given a pointer to the word and a mask. + */ +static int +bitclr(unsigned *p, unsigned mask) +{ + unsigned before = *p; + *p &= ~mask; + return (before != *p); +} + +/* + * Copy bits from one word to another, given a mask + */ +static int +bitcpy(unsigned *p, unsigned q, unsigned mask) +{ + unsigned before = *p; + bitclr(p, mask); + bitset(p, q & mask); + return (before != *p); +} + +void +unparseputc1(XtermWidget xw, int c) +{ + if (c >= 0x80 && c <= 0x9F) { + if (!TScreenOf(xw)->control_eight_bits) { + unparseputc(xw, A2E(ANSI_ESC)); + c = A2E(c - 0x40); + } + } + unparseputc(xw, c); +} + +void +unparseseq(XtermWidget xw, ANSI *ap) +{ + int c; + + assert(ap->a_nparam < NPARAM); + unparseputc1(xw, c = ap->a_type); + if (c == ANSI_ESC + || c == ANSI_DCS + || c == ANSI_CSI + || c == ANSI_OSC + || c == ANSI_PM + || c == ANSI_APC + || c == ANSI_SS3) { + int i; + int inters; + char temp[8]; + + if (ap->a_pintro != 0) + unparseputc(xw, ap->a_pintro); + for (i = 0; i < ap->a_nparam; ++i) { + if (i != 0) { + if (ap->a_radix[i] == 1 || ap->a_radix[i - 1] == 1) { + ; + } else if (ap->a_delim) { + unparseputs(xw, ap->a_delim); + } else { + unparseputc(xw, ';'); + } + } + switch (ap->a_radix[i]) { + case 16: + sprintf(temp, "%04X", ap->a_param[i] & 0xffff); + unparseputs(xw, temp); + break; + case 1: + unparseputc(xw, ap->a_param[i]); + break; + default: + unparseputn(xw, (unsigned) ap->a_param[i]); + break; + } + } + if ((inters = ap->a_inters) != 0) { + for (i = 3; i >= 0; --i) { + c = CharOf(inters >> (8 * i)); + if (c != 0) + unparseputc(xw, c); + } + } + switch (ap->a_type) { + case ANSI_DCS: + /* FALLTHRU */ + case ANSI_OSC: + /* FALLTHRU */ + case ANSI_PM: + /* FALLTHRU */ + case ANSI_APC: + unparseputc1(xw, ANSI_ST); + break; + default: + unparseputc(xw, (char) ap->a_final); + break; + } + } + unparse_end(xw); +} + +void +unparseputn(XtermWidget xw, unsigned n) +{ + unsigned q; + + q = n / 10; + if (q != 0) + unparseputn(xw, q); + unparseputc(xw, (char) ('0' + (n % 10))); +} + +void +unparseputs(XtermWidget xw, const char *s) +{ + if (s != 0) { + while (*s) + unparseputc(xw, *s++); + } +} + +void +unparseputc(XtermWidget xw, int c) +{ + TScreen *screen = TScreenOf(xw); + IChar *buf = screen->unparse_bfr; + unsigned len; + + if ((screen->unparse_len + 2) >= screen->unparse_max) + unparse_end(xw); + + len = screen->unparse_len; + +#if OPT_TCAP_QUERY + /* + * If we're returning a termcap string, it has to be translated since + * a DCS must not contain any characters except for the normal 7-bit + * printable ASCII (counting tab, carriage return, etc). For now, + * just use hexadecimal for the whole thing. + */ + if (screen->tc_query_code >= 0) { + char tmp[3]; + sprintf(tmp, "%02X", c & 0xFF); + buf[len++] = CharOf(tmp[0]); + buf[len++] = CharOf(tmp[1]); + } else +#endif + if ((buf[len++] = (IChar) c) == '\r' && (xw->flags & LINEFEED)) { + buf[len++] = '\n'; + } + + screen->unparse_len = len; + + /* If send/receive mode is reset, we echo characters locally */ + if ((xw->keyboard.flags & MODE_SRM) == 0) { + (void) redoparsing(xw, (unsigned) c, &myState, PARSE_SRM); + } +} + +void +unparse_end(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + +#if OPT_TCAP_QUERY + /* + * tcap-query works by simulating key-presses, which ordinarily would be + * flushed out at the end of each key. For better efficiency, do not do + * the flush unless we are about to fill the buffer used to capture the + * response. + */ + if ((screen->tc_query_code >= 0) + && (screen->unparse_len + 2 < screen->unparse_max)) { + return; + } +#endif + if (screen->unparse_len) { + TRACE(("unparse_end %u:%s\n", + screen->unparse_len, + visibleIChars(screen->unparse_bfr, screen->unparse_len))); +#ifdef VMS + tt_write(screen->unparse_bfr, screen->unparse_len); +#else /* VMS */ + writePtyData(screen->respond, screen->unparse_bfr, screen->unparse_len); +#endif /* VMS */ + screen->unparse_len = 0; + } +} + +void +ToggleAlternate(XtermWidget xw) +{ + if (TScreenOf(xw)->whichBuf) + FromAlternate(xw); + else + ToAlternate(xw, False); +} + +static void +ToAlternate(XtermWidget xw, Bool clearFirst) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->whichBuf == 0) { + TRACE(("ToAlternate\n")); + if (!screen->editBuf_index[1]) + screen->editBuf_index[1] = allocScrnBuf(xw, + (unsigned) MaxRows(screen), + (unsigned) MaxCols(screen), + &screen->editBuf_data[1]); + SwitchBufs(xw, 1, clearFirst); +#if OPT_SAVE_LINES + screen->visbuf = screen->editBuf_index[screen->whichBuf]; +#endif + update_altscreen(); + } +} + +static void +FromAlternate(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->whichBuf != 0) { + TRACE(("FromAlternate\n")); + if (screen->scroll_amt) + FlushScroll(xw); + SwitchBufs(xw, 0, False); +#if OPT_SAVE_LINES + screen->visbuf = screen->editBuf_index[screen->whichBuf]; +#endif + update_altscreen(); + } +} + +static void +SwitchBufs(XtermWidget xw, int toBuf, Bool clearFirst) +{ + TScreen *screen = TScreenOf(xw); + int rows, top; + + screen->whichBuf = toBuf; + if (screen->cursor_state) + HideCursor(); + + rows = MaxRows(screen); + SwitchBufPtrs(screen, toBuf); + + if ((top = INX2ROW(screen, 0)) < rows) { + if (screen->scroll_amt) { + FlushScroll(xw); + } + xtermClear2(xw, + (int) OriginX(screen), + (int) top * FontHeight(screen) + screen->border, + (unsigned) Width(screen), + (unsigned) ((rows - top) * FontHeight(screen))); + if (clearFirst) { + ClearBufRows(xw, top, rows); + } + } + ScrnUpdate(xw, 0, 0, rows, MaxCols(screen), False); +} + +Bool +CheckBufPtrs(TScreen *screen) +{ + return (screen->visbuf != 0 +#if OPT_SAVE_LINES + && screen->editBuf_index[0] != 0 +#endif + && screen->editBuf_index[1] != 0); +} + +/* + * Swap buffer line pointers between alternate and regular screens. + */ +void +SwitchBufPtrs(TScreen *screen, int toBuf) +{ + if (CheckBufPtrs(screen)) { +#if OPT_SAVE_LINES + screen->visbuf = screen->editBuf_index[toBuf]; +#else + size_t len = ScrnPointers(screen, (size_t) MaxRows(screen)); + + (void) toBuf; + memcpy(screen->save_ptr, screen->visbuf, len); + memcpy(screen->visbuf, screen->editBuf_index[1], len); + memcpy(screen->editBuf_index[1], screen->save_ptr, len); +#endif + } +} + +void +VTRun(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("VTRun ...\n")); + + if (!screen->Vshow) { + set_vt_visibility(True); + } + update_vttekmode(); + update_vtshow(); + update_tekshow(); + set_vthide_sensitivity(); + + ScrnAllocBuf(xw); + + screen->cursor_state = OFF; + screen->cursor_set = ON; +#if OPT_BLINK_CURS + if (DoStartBlinking(screen)) + StartBlinking(xw); +#endif + +#if OPT_TEK4014 + if (Tpushb > Tpushback) { + fillPtyData(xw, VTbuffer, (char *) Tpushback, (int) (Tpushb - Tpushback)); + Tpushb = Tpushback; + } +#endif + screen->is_running = True; + if (screen->embed_high && screen->embed_wide) { + ScreenResize(xw, screen->embed_wide, screen->embed_high, &(xw->flags)); + } +#if OPT_MAXIMIZE + else if (resource.fullscreen == esTrue || resource.fullscreen == esAlways) + FullScreen(xw, True); +#endif + if (!setjmp(VTend)) + VTparse(xw); + StopBlinking(xw); + HideCursor(); + screen->cursor_set = OFF; + TRACE(("... VTRun\n")); +} + +/*ARGSUSED*/ +static void +VTExpose(Widget w GCC_UNUSED, + XEvent *event, + Region region GCC_UNUSED) +{ + DEBUG_MSG("Expose\n"); + if (event->type == Expose) + HandleExposure(term, event); +} + +static void +VTGraphicsOrNoExpose(XEvent *event) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + if (screen->incopy <= 0) { + screen->incopy = 1; + if (screen->scrolls > 0) + screen->scrolls--; + } + if (event->type == GraphicsExpose) + if (HandleExposure(xw, event)) + screen->cursor_state = OFF; + if ((event->type == NoExpose) + || ((XGraphicsExposeEvent *) event)->count == 0) { + if (screen->incopy <= 0 && screen->scrolls > 0) + screen->scrolls--; + if (screen->scrolls) + screen->incopy = -1; + else + screen->incopy = 0; + } +} + +/*ARGSUSED*/ +static void +VTNonMaskableEvent(Widget w GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XEvent *event, + Boolean *cont GCC_UNUSED) +{ + switch (event->type) { + case GraphicsExpose: + /* FALLTHRU */ + case NoExpose: + VTGraphicsOrNoExpose(event); + break; + } +} + +static void +VTResize(Widget w) +{ + if (XtIsRealized(w)) { + XtermWidget xw = (XtermWidget) w; + ScreenResize(xw, xw->core.width, xw->core.height, &xw->flags); + } +} + +#define okDimension(src,dst) ((src <= 32767) \ + && ((dst = (Dimension) src) == src)) + +static void +RequestResize(XtermWidget xw, int rows, int cols, Bool text) +{ + TScreen *screen = TScreenOf(xw); + Dimension replyWidth, replyHeight; + Dimension askedWidth, askedHeight; + XtGeometryResult status; + XWindowAttributes attrs; +#if OPT_RENDERFONT && USE_DOUBLE_BUFFER + Boolean buggyXft = False; + Cardinal ignore = 0; +#endif + + TRACE(("RequestResize(rows=%d, cols=%d, text=%d)\n", rows, cols, text)); + + /* check first if the row/column values fit into a Dimension */ + if (cols > 0) { + if ((int) (askedWidth = (Dimension) cols) < cols) { + TRACE(("... cols too large for Dimension\n")); + return; + } + } else { + askedWidth = 0; + } + if (rows > 0) { + if ((int) (askedHeight = (Dimension) rows) < rows) { + TRACE(("... rows too large for Dimension\n")); + return; + } + } else { + askedHeight = 0; + } + + xw->work.doing_resize = True; + +#if OPT_RENDERFONT && USE_DOUBLE_BUFFER + /* + * Work around a bug seen when vttest switches from 132 columns back to 80 + * columns, while double-buffering is active. If Xft is active during the + * resize, the screen will be blank thereafter. This workaround causes + * some extra flickering, but that is preferable to a blank screen. + * + * Since the bitmap- and TrueType-fonts do not always have identical sizes, + * do this switching early, to use the updated font-sizes in the request + * for resizing the window. + */ +#define ToggleXft() HandleRenderFont((Widget)xw, (XEvent *)0, (String *)0, &ignore) + if (resource.buffered + && UsingRenderFont(xw)) { + ToggleXft(); + buggyXft = True; + } +#endif + + /* + * If the requested values will fit into a Dimension, and one or both are + * zero, get the current corresponding screen dimension to use as a limit. + */ + if (askedHeight == 0 + || askedWidth == 0 + || xw->misc.limit_resize > 0) { + xtermGetWinAttrs(XtDisplay(xw), + RootWindowOfScreen(XtScreen(xw)), &attrs); + } + + /* + * Using the current font metrics, translate the requested character + * rows/columns into pixels. + */ + if (text) { + unsigned long value; + + if ((value = (unsigned long) rows) != 0) { + if (rows < 0) + value = (unsigned long) MaxRows(screen); + value *= (unsigned long) FontHeight(screen); + value += (unsigned long) (2 * screen->border); + if (!okDimension(value, askedHeight)) + goto give_up; + } + + if ((value = (unsigned long) cols) != 0) { + if (cols < 0) + value = (unsigned long) MaxCols(screen); + value *= (unsigned long) FontWidth(screen); + value += (unsigned long) ((2 * screen->border) + + ScrollbarWidth(screen)); + if (!okDimension(value, askedWidth)) + goto give_up; + } + + } else { + if (rows < 0) + askedHeight = FullHeight(screen); + if (cols < 0) + askedWidth = FullWidth(screen); + } + + if (rows == 0) { + askedHeight = (Dimension) attrs.height; + } + if (cols == 0) { + askedWidth = (Dimension) attrs.width; + } + + if (xw->misc.limit_resize > 0) { + Dimension high = (Dimension) (xw->misc.limit_resize * attrs.height); + Dimension wide = (Dimension) (xw->misc.limit_resize * attrs.width); + if ((int) high < attrs.height) + high = (Dimension) attrs.height; + if (askedHeight > high) + askedHeight = high; + if ((int) wide < attrs.width) + wide = (Dimension) attrs.width; + if (askedWidth > wide) + askedWidth = wide; + } +#ifndef nothack + getXtermSizeHints(xw); +#endif + + TRACE(("...requesting resize %dx%d\n", askedHeight, askedWidth)); + status = REQ_RESIZE((Widget) xw, + askedWidth, askedHeight, + &replyWidth, &replyHeight); + + if (status == XtGeometryYes || + status == XtGeometryDone) { + ScreenResize(xw, replyWidth, replyHeight, &xw->flags); + } +#ifndef nothack + /* + * XtMakeResizeRequest() has the undesirable side-effect of clearing + * the window manager's hints, even on a failed request. This would + * presumably be fixed if the shell did its own work. + */ + if (xw->hints.flags + && replyHeight + && replyWidth) { + xw->hints.height = replyHeight; + xw->hints.width = replyWidth; + + TRACE(("%s@%d -- ", __FILE__, __LINE__)); + TRACE_HINTS(&xw->hints); + XSetWMNormalHints(screen->display, VShellWindow(xw), &xw->hints); + TRACE(("%s@%d -- ", __FILE__, __LINE__)); + TRACE_WM_HINTS(xw); + } +#endif + + XSync(screen->display, False); /* synchronize */ + if (xtermAppPending()) { + xevents(xw); + } + + give_up: +#if OPT_RENDERFONT && USE_DOUBLE_BUFFER + if (buggyXft) { + ToggleXft(); + if (xtermAppPending()) { + xevents(xw); + } + } +#endif + + xw->work.doing_resize = False; + + TRACE(("...RequestResize done\n")); + return; +} + +static String xterm_trans = +"WM_PROTOCOLS: DeleteWindow()\n\ + : KeyboardMapping()\n"; + +int +VTInit(XtermWidget xw) +{ + Widget vtparent = SHELL_OF(xw); + + TRACE(("VTInit {{\n")); + + XtRealizeWidget(vtparent); + XtOverrideTranslations(vtparent, XtParseTranslationTable(xterm_trans)); + (void) XSetWMProtocols(XtDisplay(vtparent), XtWindow(vtparent), + &wm_delete_window, 1); + TRACE_TRANS("shell", vtparent); + TRACE_TRANS("vt100", (Widget) (xw)); + + ScrnAllocBuf(xw); + + TRACE(("...}} VTInit\n")); + return (1); +} + +static void +VTClassInit(void) +{ + XtAddConverter(XtRString, XtRGravity, XmuCvtStringToGravity, + (XtConvertArgList) NULL, (Cardinal) 0); +} + +#if OPT_COLOR_RES +/* + * Override the use of XtDefaultForeground/XtDefaultBackground to make some + * colors, such as cursor color, use the actual foreground/background value + * if there is no explicit resource value used. + */ +static Pixel +fill_Tres(XtermWidget target, XtermWidget source, int offset) +{ + char *name; + ScrnColors temp; + TScreen *src = TScreenOf(source); + TScreen *dst = TScreenOf(target); + + dst->Tcolors[offset] = src->Tcolors[offset]; + dst->Tcolors[offset].mode = False; + + if ((name = x_strtrim(dst->Tcolors[offset].resource)) != 0) + dst->Tcolors[offset].resource = name; + + if (name == 0) { + dst->Tcolors[offset].value = target->dft_foreground; + } else if (isDefaultForeground(name)) { + dst->Tcolors[offset].value = ((offset == TEXT_FG || offset == TEXT_BG) + ? target->dft_foreground + : dst->Tcolors[TEXT_FG].value); + } else if (isDefaultBackground(name)) { + dst->Tcolors[offset].value = ((offset == TEXT_FG || offset == TEXT_BG) + ? target->dft_background + : dst->Tcolors[TEXT_BG].value); + } else { + memset(&temp, 0, sizeof(temp)); + if (AllocateTermColor(target, &temp, offset, name, True)) { + if (COLOR_DEFINED(&(temp), offset)) + free(temp.names[offset]); + dst->Tcolors[offset].value = temp.colors[offset]; + } else if (offset == TEXT_FG || offset == TEXT_BG) { + free(name); + dst->Tcolors[offset].resource = 0; + } + } + return dst->Tcolors[offset].value; +} + +/* + * If one or both of the foreground/background colors cannot be allocated, + * e.g., due to gross misconfiguration, recover by setting both to the + * display's default values. + */ +static void +repairColors(XtermWidget target) +{ + TScreen *screen = TScreenOf(target); + + if (screen->Tcolors[TEXT_FG].resource == 0 || + screen->Tcolors[TEXT_BG].resource == 0) { + xtermWarning("unable to allocate fg/bg colors\n"); + screen->Tcolors[TEXT_FG].resource = x_strdup(XtDefaultForeground); + screen->Tcolors[TEXT_BG].resource = x_strdup(XtDefaultBackground); + if (screen->Tcolors[TEXT_FG].resource == 0 || + screen->Tcolors[TEXT_BG].resource == 0) { + Exit(1); + } + screen->Tcolors[TEXT_FG].value = target->dft_foreground; + screen->Tcolors[TEXT_BG].value = target->dft_background; + } +} +#else +#define fill_Tres(target, source, offset) \ + TScreenOf(target)->Tcolors[offset] = TScreenOf(source)->Tcolors[offset] +#define repairColors(target) /* nothing */ +#endif + +#if OPT_WIDE_CHARS +static void +set_utf8_feature(TScreen *screen, int *feature) +{ + if (*feature == uDefault) { + switch (screen->utf8_mode) { + case uFalse: + /* FALLTHRU */ + case uTrue: + *feature = screen->utf8_mode; + break; + case uDefault: + /* should not happen */ + *feature = uTrue; + break; + case uAlways: + /* use this to disable menu entry */ + break; + } + } +} + +static void +VTInitialize_locale(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Bool is_utf8 = xtermEnvUTF8(); + + TRACE(("VTInitialize_locale\n")); + TRACE(("... request screen.utf8_mode = %d\n", screen->utf8_mode)); + TRACE(("... request screen.utf8_fonts = %d\n", screen->utf8_fonts)); + TRACE(("... request screen.utf8_title = %d\n", screen->utf8_title)); + + screen->utf8_always = (screen->utf8_mode == uAlways); + if (screen->utf8_mode < 0) + screen->utf8_mode = uFalse; + + if (screen->utf8_mode > 3) + screen->utf8_mode = uDefault; + + screen->latin9_mode = 0; + screen->unicode_font = 0; +#if OPT_LUIT_PROG + xw->misc.callfilter = 0; + xw->misc.use_encoding = 0; + + TRACE(("... setup for luit:\n")); + TRACE(("... request misc.locale_str = \"%s\"\n", xw->misc.locale_str)); + + if (screen->utf8_mode == uFalse) { + TRACE(("... command-line +u8 overrides\n")); + } else +#if OPT_MINI_LUIT + if (x_strcasecmp(xw->misc.locale_str, "CHECKFONT") == 0) { + int fl = (int) strlen(DefaultFontN(xw)); + if (fl > 11 + && x_strcasecmp(DefaultFontN(xw) + fl - 11, "-ISO10646-1") == 0) { + screen->unicode_font = 1; + /* unicode font, use True */ +#ifdef HAVE_LANGINFO_CODESET + if (!strcmp(xtermEnvEncoding(), "ANSI_X3.4-1968") + || !strcmp(xtermEnvEncoding(), "ISO-8859-1")) { + if (screen->utf8_mode == uDefault) + screen->utf8_mode = uFalse; + } else if (!strcmp(xtermEnvEncoding(), "ISO-8859-15")) { + if (screen->utf8_mode == uDefault) + screen->utf8_mode = uFalse; + screen->latin9_mode = 1; + } else { + xw->misc.callfilter = (Boolean) (is_utf8 ? 0 : 1); + screen->utf8_mode = uAlways; + } +#else + xw->misc.callfilter = is_utf8 ? 0 : 1; + screen->utf8_mode = uAlways; +#endif + } else { + /* other encoding, use False */ + if (screen->utf8_mode == uDefault) { + screen->utf8_mode = is_utf8 ? uAlways : uFalse; + } + } + } else +#endif /* OPT_MINI_LUIT */ + if (x_strcasecmp(xw->misc.locale_str, "TRUE") == 0 || + x_strcasecmp(xw->misc.locale_str, "ON") == 0 || + x_strcasecmp(xw->misc.locale_str, "YES") == 0 || + x_strcasecmp(xw->misc.locale_str, "AUTO") == 0 || + strcmp(xw->misc.locale_str, "1") == 0) { + /* when true ... fully obeying LC_CTYPE locale */ + xw->misc.callfilter = (Boolean) (is_utf8 ? 0 : 1); + screen->utf8_mode = uAlways; + } else if (x_strcasecmp(xw->misc.locale_str, "FALSE") == 0 || + x_strcasecmp(xw->misc.locale_str, "OFF") == 0 || + x_strcasecmp(xw->misc.locale_str, "NO") == 0 || + strcmp(xw->misc.locale_str, "0") == 0) { + /* when false ... original value of utf8_mode is effective */ + if (screen->utf8_mode == uDefault) { + screen->utf8_mode = is_utf8 ? uAlways : uFalse; + } + } else if (x_strcasecmp(xw->misc.locale_str, "MEDIUM") == 0 || + x_strcasecmp(xw->misc.locale_str, "SEMIAUTO") == 0) { + /* when medium ... obeying locale only for UTF-8 and Asian */ + if (is_utf8) { + screen->utf8_mode = uAlways; + } else if ( +#ifdef MB_CUR_MAX + MB_CUR_MAX > 1 || +#else + !strncmp(xtermEnvLocale(), "ja", (size_t) 2) || + !strncmp(xtermEnvLocale(), "ko", (size_t) 2) || + !strncmp(xtermEnvLocale(), "zh", (size_t) 2) || +#endif + !strncmp(xtermEnvLocale(), "th", (size_t) 2) || + !strncmp(xtermEnvLocale(), "vi", (size_t) 2)) { + xw->misc.callfilter = 1; + screen->utf8_mode = uAlways; + } else { + screen->utf8_mode = uFalse; + } + } else if (x_strcasecmp(xw->misc.locale_str, "UTF-8") == 0 || + x_strcasecmp(xw->misc.locale_str, "UTF8") == 0) { + /* when UTF-8 ... UTF-8 mode */ + screen->utf8_mode = uAlways; + } else { + /* other words are regarded as encoding name passed to luit */ + xw->misc.callfilter = 1; + screen->utf8_mode = uAlways; + xw->misc.use_encoding = 1; + } + TRACE(("... updated misc.callfilter = %s\n", BtoS(xw->misc.callfilter))); + TRACE(("... updated misc.use_encoding = %s\n", BtoS(xw->misc.use_encoding))); +#else + if (screen->utf8_mode == uDefault) { + screen->utf8_mode = is_utf8 ? uAlways : uFalse; + } +#endif /* OPT_LUIT_PROG */ + + set_utf8_feature(screen, &screen->utf8_fonts); + set_utf8_feature(screen, &screen->utf8_title); + + screen->utf8_inparse = (Boolean) (screen->utf8_mode != uFalse); + + TRACE(("... updated screen.utf8_mode = %d\n", screen->utf8_mode)); + TRACE(("... updated screen.utf8_fonts = %d\n", screen->utf8_fonts)); + TRACE(("... updated screen.utf8_title = %d\n", screen->utf8_title)); + TRACE(("...VTInitialize_locale done\n")); +} +#endif + +void +lookupSelectUnit(XtermWidget xw, Cardinal item, String value) +{ + /* *INDENT-OFF* */ + static const struct { + const char * name; + SelectUnit code; + } table[] = { + { "char", Select_CHAR }, + { "word", Select_WORD }, + { "line", Select_LINE }, + { "group", Select_GROUP }, + { "page", Select_PAGE }, + { "all", Select_ALL }, +#if OPT_SELECT_REGEX + { "regex", Select_REGEX }, +#endif + }; + /* *INDENT-ON* */ + + TScreen *screen = TScreenOf(xw); + String next = x_skip_nonblanks(value); + Cardinal n; + + screen->selectMap[item] = NSELECTUNITS; + for (n = 0; n < XtNumber(table); ++n) { + if (!x_strncasecmp(table[n].name, value, (unsigned) (next - value))) { + screen->selectMap[item] = table[n].code; +#if OPT_SELECT_REGEX + if (table[n].code == Select_REGEX) { + screen->selectExpr[item] = x_strtrim(next); + TRACE(("Parsed regex \"%s\"\n", screen->selectExpr[item])); + } +#endif + break; + } + } +} + +static void +ParseOnClicks(XtermWidget wnew, XtermWidget wreq, Cardinal item) +{ + lookupSelectUnit(wnew, item, TScreenOf(wreq)->onClick[item]); +} + +/* + * Parse a comma-separated list, returning a string which the caller must + * free, and updating the source pointer. + */ +static char * +ParseList(const char **source) +{ + const char *base = *source; + const char *next; + char *value = 0; + char *result; + + /* ignore empty values */ + while (*base == ',') + ++base; + + if (*base != '\0') { + size_t size; + + next = base; + while (*next != '\0' && *next != ',') + ++next; + size = (size_t) (1 + next - base); + value = malloc(size); + if (value != 0) { + memcpy(value, base, size); + value[size - 1] = '\0'; + } + *source = next; + } else { + *source = base; + } + result = x_strtrim(value); + free(value); + return result; +} + +static void +set_flags_from_list(char *target, + const char *source, + const FlagList * list) +{ + Cardinal n; + + while (!IsEmpty(source)) { + char *next = ParseList(&source); + Boolean found = False; + + if (next == 0) + break; + if (isdigit(CharOf(*next))) { + char *temp; + int value = (int) strtol(next, &temp, 0); + if (!FullS2L(next, temp)) { + xtermWarning("Expected a number: %s\n", next); + } else { + for (n = 0; list[n].name != 0; ++n) { + if (list[n].code == value) { + target[value] = 1; + found = True; + TRACE(("...found %s (%d)\n", list[n].name, value)); + break; + } + } + } + } else { + for (n = 0; list[n].name != 0; ++n) { + if (!x_wildstrcmp(next, list[n].name)) { + int value = list[n].code; + target[value] = 1; + found = True; + TRACE(("...found %s (%d)\n", list[n].name, value)); + } + } + } + if (!found) { + xtermWarning("Unrecognized keyword: %s\n", next); + } + free(next); + } +} + +#define InitCursorShape(target, source) \ + target->cursor_shape = source->cursor_underline \ + ? CURSOR_UNDERLINE \ + : CURSOR_BLOCK + +#if OPT_XRES_QUERY +static XtResource * +findVT100Resource(const char *name) +{ + Cardinal n; + XtResource *result = 0; + + if (!IsEmpty(name)) { + XrmQuark quarkName = XrmPermStringToQuark(name); + for (n = 0; n < XtNumber(xterm_resources); ++n) { + if ((int) xterm_resources[n].resource_offset >= 0 + && !strcmp(xterm_resources[n].resource_name, name)) { + result = &xterm_resources[n]; + break; + } else if (xterm_resources[n].resource_name + == (String) (intptr_t) quarkName) { + result = &xterm_resources[n]; + break; + } + } + } + return result; +} + +static int +cmp_resources(const void *a, const void *b) +{ + return strcmp((*(const String *) a), + (*(const String *) b)); +} + +static void +reportResources(XtermWidget xw) +{ + String *list = TypeMallocN(String, XtNumber(xterm_resources)); + Cardinal n; + int widest = 0; + + if (list == NULL) + return; + + for (n = 0; n < XtNumber(xterm_resources); ++n) { + int width; + list[n] = (((int) xterm_resources[n].resource_offset < 0) + ? XrmQuarkToString((XrmQuark) (intptr_t) + xterm_resources[n].resource_name) + : xterm_resources[n].resource_name); + width = (int) strlen(list[n]); + if (widest < width) + widest = width; + } + qsort(list, (size_t) XtNumber(xterm_resources), sizeof(String), cmp_resources); + for (n = 0; n < XtNumber(xterm_resources); ++n) { + char *value = vt100ResourceToString(xw, list[n]); + printf("%-*s : %s\n", widest, list[n], value ? value : "(skip)"); + free(value); + } + free(list); +} + +char * +vt100ResourceToString(XtermWidget xw, const char *name) +{ + XtResource *data; + char *result = NULL; + + if ((data = findVT100Resource(name)) != 0) { + int fake_offset = (int) data->resource_offset; + void *res_addr; + int real_offset; + String res_type; + + /* + * X Toolkit "compiles" the resource-list into quarks and changes the + * resource-offset at the same time to a negative value. + */ + if (fake_offset < 0) { + real_offset = -(fake_offset + 1); + res_type = XrmQuarkToString((XrmQuark) (intptr_t) data->resource_type); + } else { + real_offset = fake_offset; + res_type = data->resource_type; + } + res_addr = (void *) ((char *) xw + real_offset); + + if (!strcmp(res_type, XtRString)) { + char *value = *(char **) res_addr; + if (value != NULL) { + size_t need = strlen(value); + if ((result = malloc(1 + need)) != 0) + strcpy(result, value); + } + } else if (!strcmp(res_type, XtRInt)) { + if ((result = malloc(1 + (size_t) (3 * data->resource_size))) != 0) + sprintf(result, "%d", *(int *) res_addr); + } else if (!strcmp(res_type, XtRFloat)) { + if ((result = malloc(1 + (size_t) (3 * data->resource_size))) != 0) + sprintf(result, "%f", (double) (*(float *) res_addr)); + } else if (!strcmp(res_type, XtRBoolean)) { + if ((result = malloc((size_t) 6)) != 0) + strcpy(result, *(Boolean *) res_addr ? "true" : "false"); + } + } + TRACE(("vt100ResourceToString(%s) %s\n", name, NonNull(result))); + return result; +} +#endif /* OPT_XRES_QUERY */ + +static int +decodeTerminalID(const char *value) +{ + const char *s; + char *t; + long result; + + for (s = value; *s; s++) { + if (!isalpha(CharOf(*s))) + break; + } + result = strtol(s, &t, 10); + if (t == s || *t != '\0' || result <= 0L || result > 1000L) { + xtermWarning("unexpected value for terminalID: \"%s\"\n", value); + result = atoi(DFT_DECID); + } + TRACE(("decodeTerminalID \"%s\" ->%d\n", value, (int) result)); + return (int) result; +} + +static int +limitedTerminalID(int terminal_id) +{ + if (terminal_id < MIN_DECID) + terminal_id = MIN_DECID; + else if (terminal_id > MAX_DECID) + terminal_id = MAX_DECID; + else + terminal_id = atoi(DFT_DECID); + return terminal_id; +} + +/* ARGSUSED */ +static void +VTInitialize(Widget wrequest, + Widget new_arg, + ArgList args GCC_UNUSED, + Cardinal *num_args GCC_UNUSED) +{ +#define Kolor(name) TScreenOf(wnew)->name.resource +#define TxtFg(name) !x_strcasecmp(Kolor(Tcolors[TEXT_FG]), Kolor(name)) +#define TxtBg(name) !x_strcasecmp(Kolor(Tcolors[TEXT_BG]), Kolor(name)) +#define DftFg(name) isDefaultForeground(Kolor(name)) +#define DftBg(name) isDefaultBackground(Kolor(name)) + +#define DATA_END { NULL, -1 } + +#if OPT_BLINK_CURS +#define DATA(name) { #name, cb##name } + static const FlagList tblBlinkOps[] = + { + DATA(Always) + ,DATA(Never) + ,DATA_END + }; +#undef DATA +#endif + +#define DATA(name) { #name, ec##name } + static const FlagList tblColorOps[] = + { + DATA(SetColor) + ,DATA(GetColor) + ,DATA(GetAnsiColor) + ,DATA_END + }; +#undef DATA + +#define DATA(name) { #name, ef##name } + static const FlagList tblFontOps[] = + { + DATA(SetFont) + ,DATA(GetFont) + ,DATA_END + }; +#undef DATA + +#define DATA(name) { #name, em##name } + static const FlagList tblMouseOps[] = + { + DATA(X10) + ,DATA(Locator) + ,DATA(VT200Click) + ,DATA(VT200Hilite) + ,DATA(AnyButton) + ,DATA(AnyEvent) + ,DATA(FocusEvent) + ,DATA(Extended) + ,DATA(SGR) + ,DATA(URXVT) + ,DATA(AlternateScroll) + ,DATA_END + }; +#undef DATA + +#define DATA(name) { #name, ep##name } + static const FlagList tblPasteControls[] = + { + DATA(C0) + ,DATA(BS) + ,DATA(CR) + ,DATA(DEL) + ,DATA(ESC) + ,DATA(FF) + ,DATA(HT) + ,DATA(NL) + ,DATA_END + }; +#undef DATA + +#define DATA(name) { #name, et##name } + static const FlagList tblTcapOps[] = + { + DATA(SetTcap) + ,DATA(GetTcap) + ,DATA_END + }; +#undef DATA + +#define DATA(name) { #name, ew##name } + static const FlagList tblWindowOps[] = + { + DATA(RestoreWin) + ,DATA(MinimizeWin) + ,DATA(SetWinPosition) + ,DATA(SetWinSizePixels) + ,DATA(RaiseWin) + ,DATA(LowerWin) + ,DATA(RefreshWin) + ,DATA(SetWinSizeChars) +#if OPT_MAXIMIZE + ,DATA(MaximizeWin) + ,DATA(FullscreenWin) +#endif + ,DATA(GetWinState) + ,DATA(GetWinPosition) + ,DATA(GetWinSizePixels) + ,DATA(GetWinSizeChars) +#if OPT_MAXIMIZE + ,DATA(GetScreenSizeChars) +#endif + ,DATA(GetIconTitle) + ,DATA(GetWinTitle) + ,DATA(PushTitle) + ,DATA(PopTitle) + /* this item uses all remaining numbers in the sequence */ + ,DATA(SetWinLines) + /* starting at this point, numbers do not apply */ + ,DATA(SetXprop) + ,DATA(GetSelection) + ,DATA(SetSelection) + ,DATA(GetChecksum) + ,DATA(SetChecksum) + ,DATA_END + }; +#undef DATA + +#if OPT_RENDERFONT +#define DATA(name) { #name, er##name } + static const FlagList tblRenderFont[] = + { + DATA(Default) + ,DATA_END + }; +#undef DATA +#endif + +#if OPT_WIDE_CHARS +#define DATA(name) { #name, u##name } + static const FlagList tblUtf8Mode[] = + { + DATA(Always) + ,DATA(Default) + ,DATA_END + }; +#undef DATA +#endif + +#ifndef NO_ACTIVE_ICON +#define DATA(name) { #name, ei##name } + static const FlagList tblAIconOps[] = + { + DATA(Default) + ,DATA_END + }; +#undef DATA +#endif + +#define DATA(name) { #name, eb##name } + static const FlagList tbl8BitMeta[] = + { + DATA(Never) + ,DATA(Locale) + ,DATA_END + }; +#undef DATA + + XtermWidget request = (XtermWidget) wrequest; + XtermWidget wnew = (XtermWidget) new_arg; + Widget my_parent = SHELL_OF(wnew); + int i; + +#if OPT_ISO_COLORS + Bool color_ok; +#endif + +#if OPT_ISO_COLORS && OPT_COLOR_RES2 + static XtResource fake_resources[] = + { +#if OPT_256_COLORS +# include <256colres.h> +#elif OPT_88_COLORS +# include <88colres.h> +#endif + }; +#endif /* OPT_COLOR_RES2 */ + TScreen *screen = TScreenOf(wnew); + char *saveLocale = xtermSetLocale(LC_NUMERIC, "C"); + +#if OPT_TRACE + check_bitmasks(); + check_tables(); +#endif + + TRACE(("VTInitialize wnew %p, %d / %d resources\n", + (void *) wnew, XtNumber(xterm_resources), MAXRESOURCES)); + assert(XtNumber(xterm_resources) < MAXRESOURCES); + + /* Zero out the entire "screen" component of "wnew" widget, then do + * field-by-field assignment of "screen" fields that are named in the + * resource list. + */ + memset(screen, 0, sizeof(wnew->screen)); + + /* DESCO Sys#67660 + * Zero out the entire "keyboard" component of "wnew" widget. + */ + memset(&wnew->keyboard, 0, sizeof(wnew->keyboard)); + + /* + * The workspace has no resources - clear it. + */ + memset(&wnew->work, 0, sizeof(wnew->work)); + + /* dummy values so that we don't try to Realize the parent shell with height + * or width of 0, which is illegal in X. The real size is computed in the + * xtermWidget's Realize proc, but the shell's Realize proc is called first, + * and must see a valid size. + */ + wnew->core.height = wnew->core.width = 1; + + /* + * The definition of -rv now is that it changes the definition of + * XtDefaultForeground and XtDefaultBackground. So, we no longer + * need to do anything special. + */ + screen->display = wnew->core.screen->display; + + /* prep getVisualInfo() */ + wnew->visInfo = 0; + wnew->numVisuals = 0; + (void) getVisualInfo(wnew); + + /* + * We use the default foreground/background colors to compare/check if a + * color-resource has been set. + */ +#define MyBlackPixel(dpy) BlackPixel(dpy,DefaultScreen(dpy)) +#define MyWhitePixel(dpy) WhitePixel(dpy,DefaultScreen(dpy)) + + if (request->misc.re_verse) { + wnew->dft_foreground = MyWhitePixel(screen->display); + wnew->dft_background = MyBlackPixel(screen->display); + } else { + wnew->dft_foreground = MyBlackPixel(screen->display); + wnew->dft_background = MyWhitePixel(screen->display); + } + + init_Tres(TEXT_FG); + init_Tres(TEXT_BG); + repairColors(wnew); + + wnew->old_foreground = T_COLOR(screen, TEXT_FG); + wnew->old_background = T_COLOR(screen, TEXT_BG); + + TRACE(("Color resource initialization:\n")); + TRACE((" Default foreground 0x%06lx\n", wnew->dft_foreground)); + TRACE((" Default background 0x%06lx\n", wnew->dft_background)); + TRACE((" Screen foreground 0x%06lx\n", T_COLOR(screen, TEXT_FG))); + TRACE((" Screen background 0x%06lx\n", T_COLOR(screen, TEXT_BG))); + TRACE((" Actual foreground 0x%06lx\n", wnew->old_foreground)); + TRACE((" Actual background 0x%06lx\n", wnew->old_background)); + + screen->mouse_button = 0; + screen->mouse_row = -1; + screen->mouse_col = -1; + +#if OPT_BOX_CHARS + init_Bres(screen.force_box_chars); + init_Bres(screen.force_packed); + init_Bres(screen.force_all_chars); + init_Bres(screen.assume_all_chars); +#endif + init_Bres(screen.free_bold_box); + init_Bres(screen.allowBoldFonts); + + init_Bres(screen.c132); + init_Bres(screen.curses); + init_Bres(screen.hp_ll_bc); +#if OPT_XMC_GLITCH + init_Ires(screen.xmc_glitch); + init_Ires(screen.xmc_attributes); + init_Bres(screen.xmc_inline); + init_Bres(screen.move_sgr_ok); +#endif +#if OPT_BLINK_CURS + init_Sres(screen.cursor_blink_s); + wnew->screen.cursor_blink = + extendedBoolean(wnew->screen.cursor_blink_s, + tblBlinkOps, cbLAST); + init_Bres(screen.cursor_blink_xor); + init_Ires(screen.blink_on); + init_Ires(screen.blink_off); + screen->cursor_blink_i = screen->cursor_blink; +#endif + init_Bres(screen.cursor_underline); + /* resources allow for underline or block, not (yet) bar */ + InitCursorShape(screen, TScreenOf(request)); +#if OPT_BLINK_CURS + TRACE(("cursor_shape:%d blinks:%d\n", + screen->cursor_shape, + screen->cursor_blink)); +#endif +#if OPT_BLINK_TEXT + init_Ires(screen.blink_as_bold); +#endif + init_Ires(screen.border); + init_Bres(screen.jumpscroll); + init_Bres(screen.fastscroll); + + init_Bres(screen.old_fkeys); + wnew->screen.old_fkeys0 = wnew->screen.old_fkeys; + wnew->keyboard.type = screen->old_fkeys + ? keyboardIsLegacy + : keyboardIsDefault; + + init_Mres(screen.delete_is_del); +#ifdef ALLOWLOGGING + init_Bres(misc.logInhibit); + init_Bres(misc.log_on); + init_Sres(screen.logfile); +#endif + init_Bres(screen.bellIsUrgent); + init_Bres(screen.bellOnReset); + init_Bres(screen.marginbell); + init_Bres(screen.multiscroll); + init_Ires(screen.nmarginbell); + init_Ires(screen.savelines); + init_Ires(screen.scrollBarBorder); + init_Ires(screen.scrolllines); + init_Bres(screen.alternateScroll); + init_Bres(screen.scrollttyoutput); + init_Bres(screen.scrollkey); + + init_Dres(screen.scale_height); + if (screen->scale_height < (float) 0.9) + screen->scale_height = (float) 0.9; + if (screen->scale_height > (float) 1.5) + screen->scale_height = (float) 1.5; + + init_Bres(misc.autoWrap); + init_Bres(misc.login_shell); + init_Bres(misc.reverseWrap); + init_Bres(misc.scrollbar); + init_Sres(misc.geo_metry); + init_Sres(misc.T_geometry); + + init_Sres(screen.term_id); + screen->terminal_id = decodeTerminalID(TScreenOf(request)->term_id); + switch (screen->terminal_id) { + case 52: + case 100: + case 101: + case 102: + case 125: /* maybe graphics */ + case 131: + case 132: /* maybe graphics */ + case 220: + case 320: + case 420: + case 510: + case 520: + case 525: + break; + default: +#if OPT_REGIS_GRAPHICS + if (optRegisGraphics(screen)) + break; +#endif +#if OPT_SIXEL_GRAPHICS + if (optSixelGraphics(screen)) + break; +#endif + screen->terminal_id = limitedTerminalID(screen->terminal_id); + break; + } + TRACE(("term_id '%s' -> terminal_id %d\n", + screen->term_id, + screen->terminal_id)); + + screen->vtXX_level = (screen->terminal_id / 100); + + init_Ires(screen.title_modes); + screen->title_modes0 = screen->title_modes; + + init_Ires(screen.nextEventDelay); + if (screen->nextEventDelay <= 0) + screen->nextEventDelay = 1; + + init_Bres(screen.visualbell); + init_Bres(screen.flash_line); + init_Ires(screen.visualBellDelay); + init_Bres(screen.poponbell); + + init_Bres(screen.eraseSavedLines0); + screen->eraseSavedLines = screen->eraseSavedLines0; + + init_Ires(misc.limit_resize); + +#if OPT_NUM_LOCK + init_Bres(misc.real_NumLock); + init_Bres(misc.alwaysUseMods); +#endif + +#if OPT_INPUT_METHOD + init_Bres(misc.open_im); + init_Ires(misc.retry_im); + init_Sres(misc.f_x); + init_Sres(misc.input_method); + init_Sres(misc.preedit_type); +#endif + +#if OPT_SHIFT_FONTS + init_Bres(misc.shift_fonts); +#endif +#if OPT_SUNPC_KBD + init_Ires(misc.ctrl_fkeys); +#endif +#if OPT_TEK4014 + TEK4014_SHOWN(wnew) = False; /* not a resource... */ + init_Bres(misc.tekInhibit); + init_Bres(misc.tekSmall); + init_Bres(misc.TekEmu); +#endif +#if OPT_TCAP_QUERY + screen->tc_query_code = -1; +#endif + wnew->misc.re_verse0 = request->misc.re_verse; + init_Bres(misc.re_verse); + init_Ires(screen.multiClickTime); + init_Ires(screen.bellSuppressTime); + init_Sres(screen.charClass); + + init_Bres(screen.always_highlight); + init_Bres(screen.brokenSelections); + init_Bres(screen.cutNewline); + init_Bres(screen.cutToBeginningOfLine); + init_Bres(screen.highlight_selection); + init_Bres(screen.show_wrap_marks); + init_Bres(screen.i18nSelections); + init_Bres(screen.keepClipboard); + init_Bres(screen.keepSelection); + init_Bres(screen.selectToClipboard); + init_Bres(screen.trim_selection); + + screen->pointer_cursor = TScreenOf(request)->pointer_cursor; + init_Ires(screen.pointer_mode); + wnew->screen.pointer_mode0 = wnew->screen.pointer_mode; + + init_Sres(screen.answer_back); + + wnew->SPS.printer_checked = False; + init_Sres(SPS.printer_command); + init_Bres(SPS.printer_autoclose); + init_Bres(SPS.printer_extent); + init_Bres(SPS.printer_formfeed); + init_Bres(SPS.printer_newline); + init_Ires(SPS.printer_controlmode); +#if OPT_PRINT_COLORS + init_Ires(SPS.print_attributes); +#endif + + init_Sres(screen.keyboard_dialect); + + init_Bres(screen.input_eight_bits); + init_Bres(screen.output_eight_bits); + init_Bres(screen.control_eight_bits); + init_Bres(screen.backarrow_key); + init_Bres(screen.alt_is_not_meta); + init_Bres(screen.alt_sends_esc); + init_Bres(screen.meta_sends_esc); + + init_Bres(screen.allowPasteControl0); + init_Bres(screen.allowSendEvent0); + init_Bres(screen.allowColorOp0); + init_Bres(screen.allowFontOp0); + init_Bres(screen.allowMouseOp0); + init_Bres(screen.allowTcapOp0); + init_Bres(screen.allowTitleOp0); + init_Bres(screen.allowWindowOp0); + +#if OPT_SCROLL_LOCK + init_Bres(screen.allowScrollLock0); +#endif + + init_Sres(screen.disallowedColorOps); + + set_flags_from_list(screen->disallow_color_ops, + screen->disallowedColorOps, + tblColorOps); + + init_Sres(screen.disallowedFontOps); + + set_flags_from_list(screen->disallow_font_ops, + screen->disallowedFontOps, + tblFontOps); + + init_Sres(screen.disallowedMouseOps); + + set_flags_from_list(screen->disallow_mouse_ops, + screen->disallowedMouseOps, + tblMouseOps); + + init_Sres(screen.disallowedPasteControls); + + set_flags_from_list(screen->disallow_paste_controls, + screen->disallowedPasteControls, + tblPasteControls); + + init_Sres(screen.disallowedTcapOps); + + set_flags_from_list(screen->disallow_tcap_ops, + screen->disallowedTcapOps, + tblTcapOps); + + init_Sres(screen.disallowedWinOps); + + set_flags_from_list(screen->disallow_win_ops, + screen->disallowedWinOps, + tblWindowOps); + + init_Sres(screen.default_string); + init_Sres(screen.eightbit_select_types); +#if OPT_WIDE_CHARS + init_Sres(screen.utf8_select_types); +#endif + + /* make a copy so that editres cannot change the resource after startup */ + screen->allowPasteControls = screen->allowPasteControl0; + screen->allowSendEvents = screen->allowSendEvent0; + screen->allowColorOps = screen->allowColorOp0; + screen->allowFontOps = screen->allowFontOp0; + screen->allowMouseOps = screen->allowMouseOp0; + screen->allowTcapOps = screen->allowTcapOp0; + screen->allowTitleOps = screen->allowTitleOp0; + screen->allowWindowOps = screen->allowWindowOp0; + +#if OPT_SCROLL_LOCK + screen->allowScrollLock = screen->allowScrollLock0; +#endif + + init_Bres(screen.quiet_grab); + +#ifndef NO_ACTIVE_ICON + init_Sres(screen.icon_fontname); + getIconicFont(screen)->fs = XLoadQueryFont(screen->display, + screen->icon_fontname); + TRACE(("iconFont '%s' %sloaded successfully\n", + screen->icon_fontname, + getIconicFont(screen)->fs ? "" : "NOT ")); + init_Sres(misc.active_icon_s); + wnew->work.active_icon = + (Boolean) extendedBoolean(wnew->misc.active_icon_s, + tblAIconOps, eiLAST); + init_Ires(misc.icon_border_width); + wnew->misc.icon_border_pixel = request->misc.icon_border_pixel; +#endif /* NO_ACTIVE_ICON */ + + init_Bres(misc.signalInhibit); + init_Bres(misc.titeInhibit); + init_Bres(misc.tiXtraScroll); + init_Bres(misc.cdXtraScroll); + init_Bres(misc.color_inner_border); + init_Bres(misc.dynamicColors); + +#if OPT_DEC_CHRSET + for (i = 0; i < NUM_CHRSET; i++) { + screen->double_fonts[i].warn = fwResource; + } +#endif + for (i = fontMenu_font1; i <= fontMenu_lastBuiltin; i++) { + init_Sres2(screen.MenuFontName, i); + } + for (i = 0; i < fMAX; i++) { + screen->fnts[i].warn = fwResource; +#if OPT_WIDE_ATTRS + screen->ifnts[i].warn = fwResource; +#endif + } +#ifndef NO_ACTIVE_ICON + screen->fnt_icon.warn = fwResource; +#endif + + init_Ires(misc.fontWarnings); + + initFontLists(wnew); + +#define DefaultFontNames screen->menu_font_names[fontMenu_default] + + /* + * Process Xft font resources first, since faceName may contain X11 fonts + * that should override the "font" resource. + */ +#if OPT_RENDERFONT + init_Bres(screen.force_xft_height); + for (i = 0; i <= fontMenu_lastBuiltin; ++i) { + init_Dres2(misc.face_size, i); + } + +#define ALLOC_FONTLIST(name,which,field) \ + init_Sres(misc.default_xft.field);\ + allocFontList(wnew,\ + name,\ + &(wnew->work.fonts),\ + which,\ + wnew->misc.default_xft.field,\ + True) + + ALLOC_FONTLIST(XtNfaceName, fNorm, f_n); + +#if OPT_WIDE_CHARS + ALLOC_FONTLIST(XtNfaceNameDoublesize, fWide, f_w); +#endif + +#undef ALLOC_FONTLIST + +#endif + + /* + * Process X11 (XLFD) font specifications. + */ +#define ALLOC_FONTLIST(name,which,field) \ + init_Sres(misc.default_font.field);\ + allocFontList(wnew,\ + name,\ + &(wnew->work.fonts),\ + which,\ + wnew->misc.default_font.field,\ + False) + + ALLOC_FONTLIST(XtNfont, fNorm, f_n); + ALLOC_FONTLIST(XtNboldFont, fBold, f_b); + + DefaultFontNames[fNorm] = x_strdup(DefaultFontN(wnew)); + DefaultFontNames[fBold] = x_strdup(DefaultFontB(wnew)); + +#if OPT_WIDE_CHARS + ALLOC_FONTLIST(XtNwideFont, fWide, f_w); + ALLOC_FONTLIST(XtNwideBoldFont, fWBold, f_wb); + + DefaultFontNames[fWide] = x_strdup(DefaultFontW(wnew)); + DefaultFontNames[fWBold] = x_strdup(DefaultFontWB(wnew)); +#endif + +#undef ALLOC_FONTLIST + + screen->EscapeFontName() = NULL; + screen->SelectFontName() = NULL; + + screen->menu_font_number = fontMenu_default; + init_Sres(screen.initial_font); + if (screen->initial_font != 0) { + int result = xtermGetFont(screen->initial_font); + if (result >= 0) + screen->menu_font_number = result; + } +#if OPT_BROKEN_OSC + init_Bres(screen.brokenLinuxOSC); +#endif + +#if OPT_BROKEN_ST + init_Bres(screen.brokenStringTerm); +#endif + +#if OPT_C1_PRINT + init_Bres(screen.c1_printable); +#endif + +#if OPT_CLIP_BOLD + init_Bres(screen.use_border_clipping); + init_Bres(screen.use_clipping); +#endif + +#if OPT_DEC_CHRSET + init_Bres(screen.font_doublesize); + init_Ires(screen.cache_doublesize); + if (screen->cache_doublesize > NUM_CHRSET) + screen->cache_doublesize = NUM_CHRSET; + if (screen->cache_doublesize == 0) + screen->font_doublesize = False; + TRACE(("Doublesize%s enabled, up to %d fonts\n", + screen->font_doublesize ? "" : " not", + screen->cache_doublesize)); +#endif +#if OPT_DEC_RECTOPS + init_Ires(screen.checksum_ext0); + screen->checksum_ext = screen->checksum_ext0; +#endif + +#if OPT_ISO_COLORS + init_Ires(screen.veryBoldColors); + init_Bres(screen.boldColors); + init_Bres(screen.colorAttrMode); + init_Bres(screen.colorBDMode); + init_Bres(screen.colorBLMode); + init_Bres(screen.colorMode); + init_Bres(screen.colorULMode); + init_Bres(screen.italicULMode); + init_Bres(screen.colorRVMode); + +#if OPT_WIDE_ATTRS + init_Bres(screen.colorITMode); +#endif +#if OPT_DIRECT_COLOR + init_Bres(screen.direct_color); +#endif + +#if OPT_COLOR_RES2 + TRACE(("...will fake resources for color%d to color%d\n", + MIN_ANSI_COLORS, + NUM_ANSI_COLORS - 1)); +#endif + for (i = 0, color_ok = False; i < MAXCOLORS; i++) { + +#if OPT_COLOR_RES2 + /* + * Xt has a hardcoded limit on the maximum number of resources that can + * be used in a widget. If we configure both luit (which implies + * wide-characters) and 256-colors, it goes over that limit. Most + * people would not need a resource-file with 256-colors; the default + * values in our table are sufficient. In that case, fake the resource + * setting by copying the default value from the table. The #define's + * can be overridden to make these true resources. + */ + if (i >= MIN_ANSI_COLORS && i < NUM_ANSI_COLORS) { + screen->Acolors[i].resource = + x_strtrim(fake_resources[i - MIN_ANSI_COLORS].default_addr); + if (screen->Acolors[i].resource == 0) + screen->Acolors[i].resource = XtDefaultForeground; + } else +#endif /* OPT_COLOR_RES2 */ + { + screen->Acolors[i] = TScreenOf(request)->Acolors[i]; + screen->Acolors[i].resource = + x_strtrim(screen->Acolors[i].resource); + } + +#if OPT_COLOR_RES + TRACE(("Acolors[%d] = %s\n", i, screen->Acolors[i].resource)); + screen->Acolors[i].mode = False; + if (DftFg(Acolors[i])) { + screen->Acolors[i].value = T_COLOR(screen, TEXT_FG); + screen->Acolors[i].mode = True; + } else if (DftBg(Acolors[i])) { + screen->Acolors[i].value = T_COLOR(screen, TEXT_BG); + screen->Acolors[i].mode = True; + } else { + color_ok = True; + } +#else + TRACE(("Acolors[%d] = %#lx\n", i, TScreenOf(request)->Acolors[i])); + if (screen->Acolors[i] != wnew->dft_foreground && + screen->Acolors[i] != T_COLOR(screen, TEXT_FG) && + screen->Acolors[i] != T_COLOR(screen, TEXT_BG)) + color_ok = True; +#endif + } + + /* + * Check if we're trying to use color in a monochrome screen. Disable + * color in that case, since that would make ANSI colors unusable. A 4-bit + * or 8-bit display is usable, so we do not have to check for anything more + * specific. + */ + if (color_ok) { + if (getVisualDepth(wnew) <= 1) { + TRACE(("disabling color since screen is monochrome\n")); + color_ok = False; + } + } + + /* If none of the colors are anything other than the foreground or + * background, we'll assume this isn't color, no matter what the colorMode + * resource says. (There doesn't seem to be any good way to determine if + * the resource lookup failed versus the user having misconfigured this). + */ + if (!color_ok) { + screen->colorMode = False; + TRACE(("All colors are foreground or background: disable colorMode\n")); + } + wnew->sgr_foreground = -1; + wnew->sgr_background = -1; + wnew->sgr_38_xcolors = False; + clrDirectFG(wnew->flags); + clrDirectFG(wnew->flags); +#endif /* OPT_ISO_COLORS */ + + /* + * Decode the resources that control the behavior on multiple mouse clicks. + * A single click is always bound to normal character selection, but the + * other flavors can be changed. + */ + for (i = 0; i < NSELECTUNITS; ++i) { + int ck = (i + 1); + screen->maxClicks = ck; + if (i == Select_CHAR) + screen->selectMap[i] = Select_CHAR; + else if (TScreenOf(request)->onClick[i] != 0) + ParseOnClicks(wnew, request, (unsigned) i); + else if (i <= Select_LINE) + screen->selectMap[i] = (SelectUnit) i; + else + break; +#if OPT_XRES_QUERY + init_Sres(screen.onClick[i]); +#endif + TRACE(("on%dClicks %s=%d\n", ck, + NonNull(TScreenOf(request)->onClick[i]), + screen->selectMap[i])); + if (screen->selectMap[i] == NSELECTUNITS) + break; + } + TRACE(("maxClicks %d\n", screen->maxClicks)); + + init_Tres(MOUSE_FG); + init_Tres(MOUSE_BG); + init_Tres(TEXT_CURSOR); +#if OPT_HIGHLIGHT_COLOR + init_Tres(HIGHLIGHT_BG); + init_Tres(HIGHLIGHT_FG); + init_Bres(screen.hilite_reverse); + init_Mres(screen.hilite_color); + if (screen->hilite_color == Maybe) { + screen->hilite_color = False; +#if OPT_COLOR_RES + /* + * If the highlight text/background are both set, and if they are + * not equal to either the text/background or background/text, then + * set the highlightColorMode automatically. + */ + if (!DftFg(Tcolors[HIGHLIGHT_BG]) + && !DftBg(Tcolors[HIGHLIGHT_FG]) + && !TxtFg(Tcolors[HIGHLIGHT_BG]) + && !TxtBg(Tcolors[HIGHLIGHT_FG]) + && !TxtBg(Tcolors[HIGHLIGHT_BG]) + && !TxtFg(Tcolors[HIGHLIGHT_FG])) { + TRACE(("...setting hilite_color automatically\n")); + screen->hilite_color = True; + } +#endif + } +#endif + +#if OPT_TEK4014 + /* + * The Tek4014 window has no separate resources for foreground, background + * and cursor color. Since xterm always creates the vt100 widget first, we + * can set the Tektronix colors here. That lets us use escape sequences to + * set its dynamic colors and get consistent behavior whether or not the + * window is displayed. + */ + screen->Tcolors[TEK_BG] = screen->Tcolors[TEXT_BG]; + screen->Tcolors[TEK_FG] = screen->Tcolors[TEXT_FG]; + screen->Tcolors[TEK_CURSOR] = screen->Tcolors[TEXT_CURSOR]; +#endif + +#ifdef SCROLLBAR_RIGHT + init_Bres(misc.useRight); +#endif + +#if OPT_RENDERFONT + init_Ires(misc.limit_fontsets); + wnew->work.max_fontsets = (unsigned) wnew->misc.limit_fontsets; + + init_Sres(misc.render_font_s); + wnew->work.render_font = + (Boolean) extendedBoolean(wnew->misc.render_font_s, + tblRenderFont, erLast); + if (wnew->work.render_font == erDefault) { + if (IsEmpty(CurrentXftFont(wnew))) { + free((void *) CurrentXftFont(wnew)); + CurrentXftFont(wnew) = x_strdup(DEFFACENAME_AUTO); + TRACE(("will allow runtime switch to render_font using \"%s\"\n", + CurrentXftFont(wnew))); + } else { + wnew->work.render_font = erTrue; + TRACE(("initially using TrueType font\n")); + } + } + /* minor tweak to make debug traces consistent: */ + if (wnew->work.render_font) { + if (IsEmpty(CurrentXftFont(wnew))) { + wnew->work.render_font = False; + TRACE(("reset render_font since there is no face_name\n")); + } + } +#endif + +#if OPT_WIDE_CHARS + /* setup data for next call */ + init_Sres(screen.utf8_mode_s); + request->screen.utf8_mode = + extendedBoolean(request->screen.utf8_mode_s, tblUtf8Mode, uLast); + + init_Sres(screen.utf8_fonts_s); + request->screen.utf8_fonts = + extendedBoolean(request->screen.utf8_fonts_s, tblUtf8Mode, uLast); + + init_Sres(screen.utf8_title_s); + request->screen.utf8_title = + extendedBoolean(request->screen.utf8_title_s, tblUtf8Mode, uLast); + + /* + * Make a copy in the input/request so that DefaultFontN() works for + * the "CHECKFONT" option. + */ + copyFontList(&(request->work.fonts.x11.list_n), + wnew->work.fonts.x11.list_n); + + VTInitialize_locale(request); + init_Bres(screen.normalized_c); + init_Bres(screen.utf8_latin1); + init_Bres(screen.utf8_weblike); + +#if OPT_LUIT_PROG + init_Bres(misc.callfilter); + init_Bres(misc.use_encoding); + init_Sres(misc.locale_str); + init_Sres(misc.localefilter); +#endif + + init_Ires(screen.utf8_inparse); + init_Ires(screen.utf8_mode); + init_Ires(screen.utf8_fonts); + init_Ires(screen.utf8_title); + init_Ires(screen.max_combining); + + init_Ires(screen.utf8_always); /* from utf8_mode, used in doparse */ + + if (screen->max_combining < 0) { + screen->max_combining = 0; + } + if (screen->max_combining > 5) { + screen->max_combining = 5; + } + + init_Bres(screen.vt100_graphics); + init_Bres(screen.wide_chars); + init_Bres(misc.mk_width); + init_Bres(misc.cjk_width); + + init_Ires(misc.mk_samplesize); + init_Ires(misc.mk_samplepass); + + if (wnew->misc.mk_samplesize > 0xffff) + wnew->misc.mk_samplesize = 0xffff; + if (wnew->misc.mk_samplesize < 0) + wnew->misc.mk_samplesize = 0; + + if (wnew->misc.mk_samplepass > wnew->misc.mk_samplesize) + wnew->misc.mk_samplepass = wnew->misc.mk_samplesize; + if (wnew->misc.mk_samplepass < 0) + wnew->misc.mk_samplepass = 0; + + if (TScreenOf(request)->utf8_mode) { + TRACE(("setting wide_chars on\n")); + screen->wide_chars = True; + } else { + TRACE(("setting utf8_mode to 0\n")); + screen->utf8_mode = uFalse; + } + mk_wcwidth_init(screen->utf8_mode); + TRACE(("initialized UTF-8 mode to %d\n", screen->utf8_mode)); + +#if OPT_MINI_LUIT + if (TScreenOf(request)->latin9_mode) { + screen->latin9_mode = True; + } + if (TScreenOf(request)->unicode_font) { + screen->unicode_font = True; + } + TRACE(("initialized Latin9 mode to %d\n", screen->latin9_mode)); + TRACE(("initialized unicode_font to %d\n", screen->unicode_font)); +#endif + + decode_wcwidth(wnew); + xtermSaveVTFonts(wnew); +#endif /* OPT_WIDE_CHARS */ + + init_Sres(screen.eight_bit_meta_s); + wnew->screen.eight_bit_meta = + extendedBoolean(request->screen.eight_bit_meta_s, tbl8BitMeta, ebLast); + if (wnew->screen.eight_bit_meta == ebLocale) { +#if OPT_WIDE_CHARS + if (xtermEnvUTF8()) { + wnew->screen.eight_bit_meta = ebFalse; + TRACE(("...eightBitMeta is false due to locale\n")); + } else +#endif /* OPT_WIDE_CHARS */ + { + wnew->screen.eight_bit_meta = ebTrue; + TRACE(("...eightBitMeta is true due to locale\n")); + } + } + + init_Bres(screen.always_bold_mode); + init_Bres(screen.bold_mode); + init_Bres(screen.underline); + + wnew->cur_foreground = 0; + wnew->cur_background = 0; + + wnew->keyboard.flags = MODE_SRM; + + if (screen->backarrow_key) + wnew->keyboard.flags |= MODE_DECBKM; + TRACE(("initialized DECBKM %s\n", + BtoS(wnew->keyboard.flags & MODE_DECBKM))); + +#if OPT_SIXEL_GRAPHICS + init_Bres(screen.sixel_scrolling); + if (screen->sixel_scrolling) + wnew->keyboard.flags |= MODE_DECSDM; + TRACE(("initialized DECSDM %s\n", + BtoS(wnew->keyboard.flags & MODE_DECSDM))); +#endif + +#if OPT_GRAPHICS + init_Sres(screen.graph_id); + screen->graphics_id = decodeTerminalID(TScreenOf(request)->graph_id); + switch (screen->graphics_id) { + case 125: + case 240: + case 241: + case 330: + case 340: + case 382: + break; + default: + screen->graphics_id = 0; + break; + } + TRACE(("graph_id '%s' -> graphics_id %d\n", + screen->graph_id, + screen->graphics_id)); + + init_Ires(screen.numcolorregisters); + TRACE(("initialized NUM_COLOR_REGISTERS to resource default: %d\n", + screen->numcolorregisters)); + + init_Bres(screen.privatecolorregisters); /* FIXME: should this be off unconditionally here? */ + TRACE(("initialized PRIVATE_COLOR_REGISTERS to resource default: %s\n", + BtoS(screen->privatecolorregisters))); +#endif + +#if OPT_GRAPHICS + { + int native_w, native_h; + + switch (GraphicsId(screen)) { + case 125: + native_w = 768; + native_h = 460; + break; + case 240: + /* FALLTHRU */ + case 241: + native_w = 800; + native_h = 460; + break; + case 330: + native_w = 800; + native_h = 480; + break; + case 340: + /* FALLTHRU */ + default: + native_w = 800; + native_h = 480; + break; + case 382: + native_w = 960; + native_h = 750; + break; + } + +# if OPT_REGIS_GRAPHICS + init_Sres(screen.graphics_regis_default_font); + TRACE(("default ReGIS font: %s\n", + screen->graphics_regis_default_font)); + + init_Sres(screen.graphics_regis_screensize); + screen->graphics_regis_def_high = 1000; + screen->graphics_regis_def_wide = 1000; + if (!x_strcasecmp(screen->graphics_regis_screensize, "auto")) { + TRACE(("setting default ReGIS screensize based on graphics_id %d\n", + GraphicsId(screen))); + screen->graphics_regis_def_high = (Dimension) native_w; + screen->graphics_regis_def_wide = (Dimension) native_h; + } else { + int conf_high; + int conf_wide; + char ignore; + + if (sscanf(screen->graphics_regis_screensize, + "%dx%d%c", + &conf_wide, + &conf_high, + &ignore) == 2) { + if (conf_high > 0 && conf_wide > 0) { + screen->graphics_regis_def_high = + (Dimension) conf_high; + screen->graphics_regis_def_wide = + (Dimension) conf_wide; + } else { + TRACE(("ignoring invalid regisScreenSize %s\n", + screen->graphics_regis_screensize)); + } + } else { + TRACE(("ignoring invalid regisScreenSize %s\n", + screen->graphics_regis_screensize)); + } + } + TRACE(("default ReGIS graphics screensize %dx%d\n", + (int) screen->graphics_regis_def_wide, + (int) screen->graphics_regis_def_high)); +# endif + + init_Sres(screen.graphics_max_size); + screen->graphics_max_high = 1000; + screen->graphics_max_wide = 1000; + if (!x_strcasecmp(screen->graphics_max_size, "auto")) { + TRACE(("setting max graphics screensize based on graphics_id %d\n", + GraphicsId(screen))); + screen->graphics_max_high = (Dimension) native_w; + screen->graphics_max_wide = (Dimension) native_h; + } else { + int conf_high; + int conf_wide; + char ignore; + + if (sscanf(screen->graphics_max_size, + "%dx%d%c", + &conf_wide, + &conf_high, + &ignore) == 2) { + if (conf_high > 0 && conf_wide > 0) { + screen->graphics_max_high = (Dimension) conf_high; + screen->graphics_max_wide = (Dimension) conf_wide; + } else { + TRACE(("ignoring invalid maxGraphicSize %s\n", + screen->graphics_max_size)); + } + } else { + TRACE(("ignoring invalid maxGraphicSize %s\n", + screen->graphics_max_size)); + } + } +# if OPT_REGIS_GRAPHICS + /* Make sure the max is large enough for the default ReGIS size. */ + if (screen->graphics_regis_def_high > + screen->graphics_max_high) { + screen->graphics_max_high = + screen->graphics_regis_def_high; + } + if (screen->graphics_regis_def_wide > + screen->graphics_max_wide) { + screen->graphics_max_wide = + screen->graphics_regis_def_wide; + } +# endif + TRACE(("max graphics screensize %dx%d\n", + (int) screen->graphics_max_wide, + (int) screen->graphics_max_high)); + } +#endif + +#if OPT_SIXEL_GRAPHICS + init_Bres(screen.sixel_scrolls_right); + TRACE(("initialized SIXEL_SCROLLS_RIGHT to resource default: %s\n", + BtoS(screen->sixel_scrolls_right))); +#endif + + /* look for focus related events on the shell, because we need + * to care about the shell's border being part of our focus. + */ + TRACE(("adding event handlers for my_parent %p\n", (void *) my_parent)); + XtAddEventHandler(my_parent, EnterWindowMask, False, + HandleEnterWindow, (Opaque) NULL); + XtAddEventHandler(my_parent, LeaveWindowMask, False, + HandleLeaveWindow, (Opaque) NULL); + XtAddEventHandler(my_parent, FocusChangeMask, False, + HandleFocusChange, (Opaque) NULL); + XtAddEventHandler((Widget) wnew, 0L, True, + VTNonMaskableEvent, (Opaque) NULL); + XtAddEventHandler((Widget) wnew, PropertyChangeMask, False, + HandleBellPropertyChange, (Opaque) NULL); + +#if HANDLE_STRUCT_NOTIFY +#if OPT_TOOLBAR + wnew->VT100_TB_INFO(menu_bar) = request->VT100_TB_INFO(menu_bar); + init_Ires(VT100_TB_INFO(menu_height)); +#endif + XtAddEventHandler(my_parent, MappingNotify | StructureNotifyMask, False, + HandleStructNotify, (Opaque) 0); +#endif /* HANDLE_STRUCT_NOTIFY */ + + screen->bellInProgress = False; + + set_character_class(screen->charClass); +#if OPT_REPORT_CCLASS + if (resource.reportCClass) + report_char_class(wnew); +#endif + + /* create it, but don't realize it */ + ScrollBarOn(wnew, True); + + /* make sure that the resize gravity acceptable */ + if (!GravityIsNorthWest(wnew) && + !GravityIsSouthWest(wnew)) { + char value[80]; + String temp[2]; + Cardinal nparams = 1; + + sprintf(value, "%d", wnew->misc.resizeGravity); + temp[0] = value; + temp[1] = 0; + XtAppWarningMsg(app_con, "rangeError", "resizeGravity", "XTermError", + "unsupported resizeGravity resource value (%s)", + temp, &nparams); + wnew->misc.resizeGravity = SouthWestGravity; + } +#ifndef NO_ACTIVE_ICON + screen->whichVwin = &screen->fullVwin; +#endif /* NO_ACTIVE_ICON */ + + init_Ires(screen.unparse_max); + if ((int) screen->unparse_max < 256) + screen->unparse_max = 256; + screen->unparse_bfr = (IChar *) (void *) XtCalloc(screen->unparse_max, + (Cardinal) sizeof(IChar)); + + if (screen->savelines < 0) + screen->savelines = 0; + + init_Bres(screen.awaitInput); + + wnew->flags = 0; + if (!screen->jumpscroll) + wnew->flags |= SMOOTHSCROLL; + if (wnew->misc.reverseWrap) + wnew->flags |= REVERSEWRAP; + if (wnew->misc.autoWrap) + wnew->flags |= WRAPAROUND; + if (wnew->misc.re_verse != wnew->misc.re_verse0) + wnew->flags |= REVERSE_VIDEO; + if (screen->c132) + wnew->flags |= IN132COLUMNS; + + wnew->initflags = wnew->flags; + +#if OPT_MOD_FKEYS + init_Ires(keyboard.modify_1st.allow_keys); + init_Ires(keyboard.modify_1st.cursor_keys); + init_Ires(keyboard.modify_1st.function_keys); + init_Ires(keyboard.modify_1st.keypad_keys); + init_Ires(keyboard.modify_1st.other_keys); + init_Ires(keyboard.modify_1st.string_keys); + init_Ires(keyboard.format_keys); + wnew->keyboard.modify_now = wnew->keyboard.modify_1st; +#endif + + init_Ires(misc.appcursorDefault); + if (wnew->misc.appcursorDefault) + wnew->keyboard.flags |= MODE_DECCKM; + + init_Ires(misc.appkeypadDefault); + if (wnew->misc.appkeypadDefault) + wnew->keyboard.flags |= MODE_DECKPAM; + + initLineData(wnew); +#if OPT_WIDE_CHARS + freeFontList(&(request->work.fonts.x11.list_n)); +#endif +#if OPT_XRES_QUERY + if (resource.reportXRes) + reportResources(wnew); +#endif + xtermResetLocale(LC_NUMERIC, saveLocale); + return; +} + +void +releaseCursorGCs(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + VTwin *win = WhichVWin(screen); + int n; + + for_each_curs_gc(n) { + freeCgs(xw, win, (CgsEnum) n); + } +} + +void +releaseWindowGCs(XtermWidget xw, VTwin *win) +{ + int n; + + for_each_text_gc(n) { + switch (n) { + case gcBorder: + case gcFiller: + break; + default: + freeCgs(xw, win, (CgsEnum) n); + break; + } + } +} + +#define TRACE_FREE_LEAK(name) \ + if (name) { \ + TRACE(("freed " #name ": %p\n", (const void *) name)); \ + free((void *) name); \ + name = 0; \ + } + +#define FREE_LEAK(name) \ + if (name) { \ + free((void *) name); \ + name = 0; \ + } + +#if OPT_INPUT_METHOD +static void +cleanupInputMethod(XtermWidget xw) +{ + TInput *input = lookupTInput(xw, (Widget) xw); + + if (input && input->xim) { + XCloseIM(input->xim); + input->xim = 0; + TRACE(("freed screen->xim\n")); + } +} +#else +#define cleanupInputMethod(xw) /* nothing */ +#endif + +static void +VTDestroy(Widget w GCC_UNUSED) +{ +#ifdef NO_LEAKS + XtermWidget xw = (XtermWidget) w; + TScreen *screen = TScreenOf(xw); + Cardinal n, k; + + StopBlinking(xw); + + if (screen->scrollWidget) { + XtUninstallTranslations(screen->scrollWidget); + XtDestroyWidget(screen->scrollWidget); + } +#if OPT_FIFO_LINES + while (screen->saved_fifo > 0) { + deleteScrollback(screen); + } +#endif + while (screen->save_title != 0) { + SaveTitle *last = screen->save_title; + screen->save_title = last->next; + free(last->iconName); + free(last->windowName); + free(last); + } +#ifndef NO_ACTIVE_ICON + TRACE_FREE_LEAK(xw->misc.active_icon_s); +#endif +#if OPT_ISO_COLORS + TRACE_FREE_LEAK(screen->cmap_data); + for (n = 0; n < MAXCOLORS; n++) { + TRACE_FREE_LEAK(screen->Acolors[n].resource); + } + for (n = 0; n < MAX_SAVED_SGR; n++) { + TRACE_FREE_LEAK(xw->saved_colors.palettes[n]); + } +#endif +#if OPT_COLOR_RES + for (n = 0; n < NCOLORS; n++) { + switch (n) { +#if OPT_TEK4014 + case TEK_BG: + /* FALLTHRU */ + case TEK_FG: + /* FALLTHRU */ + case TEK_CURSOR: + break; +#endif + default: + TRACE_FREE_LEAK(screen->Tcolors[n].resource); + break; + } + } +#endif + TRACE_FREE_LEAK(screen->unparse_bfr); + TRACE_FREE_LEAK(screen->save_ptr); + TRACE_FREE_LEAK(screen->saveBuf_data); + TRACE_FREE_LEAK(screen->saveBuf_index); + for (n = 0; n < 2; ++n) { + TRACE_FREE_LEAK(screen->editBuf_data[n]); + TRACE_FREE_LEAK(screen->editBuf_index[n]); + } + TRACE_FREE_LEAK(screen->keyboard_dialect); + TRACE_FREE_LEAK(screen->term_id); +#if OPT_WIDE_CHARS +#if OPT_LUIT_PROG + TRACE_FREE_LEAK(xw->misc.locale_str); + TRACE_FREE_LEAK(xw->misc.localefilter); +#endif +#endif + TRACE_FREE_LEAK(xw->misc.T_geometry); + TRACE_FREE_LEAK(xw->misc.geo_metry); +#if OPT_INPUT_METHOD + cleanupInputMethod(xw); + TRACE_FREE_LEAK(xw->misc.f_x); + TRACE_FREE_LEAK(xw->misc.input_method); + TRACE_FREE_LEAK(xw->misc.preedit_type); +#endif + releaseCursorGCs(xw); + releaseWindowGCs(xw, &(screen->fullVwin)); +#ifndef NO_ACTIVE_ICON + XFreeFont(screen->display, getIconicFont(screen)->fs); + releaseWindowGCs(xw, &(screen->iconVwin)); +#endif + XtUninstallTranslations((Widget) xw); +#if OPT_TOOLBAR + XtUninstallTranslations((Widget) XtParent(xw)); +#endif + XtUninstallTranslations((Widget) SHELL_OF(xw)); + + if (screen->hidden_cursor) + XFreeCursor(screen->display, screen->hidden_cursor); + + xtermCloseFonts(xw, screen->fnts); +#if OPT_WIDE_ATTRS + xtermCloseFonts(xw, screen->ifnts); +#endif + noleaks_cachedCgs(xw); + free_termcap(xw); + + TRACE_FREE_LEAK(screen->selection_targets_8bit); +#if OPT_SELECT_REGEX + for (n = 0; n < NSELECTUNITS; ++n) { + if (screen->selectMap[n] == Select_REGEX) { + TRACE_FREE_LEAK(screen->selectExpr[n]); + } + } +#endif + +#if OPT_RENDERFONT + for (n = 0; n < NMENUFONTS; ++n) { + int e; + for (e = 0; e < fMAX; ++e) { + xtermCloseXft(screen, getMyXftFont(xw, e, (int) n)); + } + } + discardRenderDraw(screen); + { + ListXftFonts *p; + while ((p = screen->list_xft_fonts) != 0) { + screen->list_xft_fonts = p->next; + free(p); + } + } +#endif + + /* free things allocated via init_Sres or Init_Sres2 */ +#ifndef NO_ACTIVE_ICON + TRACE_FREE_LEAK(screen->icon_fontname); +#endif +#ifdef ALLOWLOGGING + TRACE_FREE_LEAK(screen->logfile); +#endif + TRACE_FREE_LEAK(screen->eight_bit_meta_s); + TRACE_FREE_LEAK(screen->term_id); + TRACE_FREE_LEAK(screen->charClass); + TRACE_FREE_LEAK(screen->answer_back); + TRACE_FREE_LEAK(screen->printer_state.printer_command); + TRACE_FREE_LEAK(screen->keyboard_dialect); + TRACE_FREE_LEAK(screen->disallowedColorOps); + TRACE_FREE_LEAK(screen->disallowedFontOps); + TRACE_FREE_LEAK(screen->disallowedMouseOps); + TRACE_FREE_LEAK(screen->disallowedPasteControls); + TRACE_FREE_LEAK(screen->disallowedTcapOps); + TRACE_FREE_LEAK(screen->disallowedWinOps); + TRACE_FREE_LEAK(screen->default_string); + TRACE_FREE_LEAK(screen->eightbit_select_types); + +#if OPT_WIDE_CHARS + TRACE_FREE_LEAK(screen->utf8_select_types); +#endif + +#if 0 + for (n = fontMenu_font1; n <= fontMenu_lastBuiltin; n++) { + TRACE_FREE_LEAK(screen->MenuFontName(n)); + } +#endif + + TRACE_FREE_LEAK(screen->initial_font); + +#if OPT_LUIT_PROG + TRACE_FREE_LEAK(xw->misc.locale_str); + TRACE_FREE_LEAK(xw->misc.localefilter); +#endif + +#if OPT_RENDERFONT + TRACE_FREE_LEAK(xw->misc.default_xft.f_n); +#if OPT_WIDE_CHARS + TRACE_FREE_LEAK(xw->misc.default_xft.f_w); +#endif + TRACE_FREE_LEAK(xw->misc.render_font_s); +#endif + + TRACE_FREE_LEAK(xw->misc.default_font.f_n); + TRACE_FREE_LEAK(xw->misc.default_font.f_b); + +#if OPT_WIDE_CHARS + TRACE_FREE_LEAK(xw->misc.default_font.f_w); + TRACE_FREE_LEAK(xw->misc.default_font.f_wb); +#endif + + freeFontLists(&(xw->work.fonts.x11)); +#if OPT_RENDERFONT + freeFontLists(&(xw->work.fonts.xft)); +#endif + + xtermFontName(NULL); +#if OPT_LOAD_VTFONTS || OPT_WIDE_CHARS + TRACE_FREE_LEAK(screen->cacheVTFonts.default_font.f_n); + TRACE_FREE_LEAK(screen->cacheVTFonts.default_font.f_b); +#if OPT_WIDE_CHARS + TRACE_FREE_LEAK(screen->cacheVTFonts.default_font.f_w); + TRACE_FREE_LEAK(screen->cacheVTFonts.default_font.f_wb); +#endif + freeFontLists(&(screen->cacheVTFonts.fonts.x11)); + for (n = 0; n < NMENUFONTS; ++n) { + for (k = 0; k < fMAX; ++k) { + if (screen->menu_font_names[n][k] != + screen->cacheVTFonts.menu_font_names[n][k]) { + if (screen->menu_font_names[n][k] != _Font_Selected_) { + TRACE_FREE_LEAK(screen->menu_font_names[n][k]); + } + TRACE_FREE_LEAK(screen->cacheVTFonts.menu_font_names[n][k]); + } else { + TRACE_FREE_LEAK(screen->menu_font_names[n][k]); + } + } + } +#endif + +#if OPT_SELECT_REGEX + for (n = 0; n < NSELECTUNITS; ++n) { + FREE_LEAK(screen->selectExpr[n]); + } +#endif + + if (screen->selection_atoms) + XtFree((void *) (screen->selection_atoms)); + + for (n = 0; n < MAX_SELECTIONS; ++n) { + free(screen->selected_cells[n].data_buffer); + } + + if (defaultTranslations != xtermClassRec.core_class.tm_table) { + TRACE_FREE_LEAK(defaultTranslations); + } + TRACE_FREE_LEAK(xtermClassRec.core_class.tm_table); + TRACE_FREE_LEAK(xw->keyboard.extra_translations); + TRACE_FREE_LEAK(xw->keyboard.shell_translations); + TRACE_FREE_LEAK(xw->keyboard.xterm_translations); + + XtFree((void *) (xw->visInfo)); + +#if OPT_WIDE_CHARS + FreeTypedBuffer(XChar2b); + FreeTypedBuffer(char); +#endif +#if OPT_RENDERFONT +#if OPT_RENDERWIDE + FreeTypedBuffer(XftCharSpec); +#else + FreeTypedBuffer(XftChar8); +#endif +#endif + + TRACE_FREE_LEAK(myState.print_area); + TRACE_FREE_LEAK(myState.string_area); + memset(&myState, 0, sizeof(myState)); + +#endif /* defined(NO_LEAKS) */ +} + +#ifndef NO_ACTIVE_ICON +static void * +getProperty(Display *dpy, + Window w, + Atom req_type, + const char *prop_name) +{ + Atom property; + Atom actual_return_type; + int actual_format_return = 0; + unsigned long nitems_return = 0; + unsigned long bytes_after_return = 0; + unsigned char *prop_return = 0; + long long_length = 1024; + size_t limit; + char *result = 0; + + TRACE(("getProperty %s(%s)\n", prop_name, + req_type ? TraceAtomName(dpy, req_type) : "?")); + property = XInternAtom(dpy, prop_name, False); + + if (!xtermGetWinProp(dpy, + w, + property, + 0L, + long_length, + req_type, + &actual_return_type, + &actual_format_return, + &nitems_return, + &bytes_after_return, + &prop_return)) { + TRACE((".. Cannot get %s property.\n", prop_name)); + } else if (prop_return != 0) { + + if (nitems_return != 0 && + actual_format_return != 0 && + actual_return_type == req_type) { + /* + * Null-terminate the result to make string handling easier. + * The format==8 corresponds to strings, and the number of items + * is the number of characters. + */ + if (actual_format_return == 8) { + limit = nitems_return; + } else { + /* manpage is misleading - X really uses 'long', not 32-bits */ + limit = sizeof(long) * nitems_return; + } + if ((result = malloc(limit + 1)) != 0) { + memcpy(result, prop_return, limit); + result[limit] = '\0'; + } + TRACE(("... result %s\n", result ? ("ok") : "null")); + } + XFree(prop_return); + } else { + TRACE((".. no property returned\n")); + } + return (void *) result; +} + +/* + * Active icons are supported by fvwm. This feature is not supported by + * metacity (gnome) or kwin (kde). Both metacity and kwin support (in + * incompatible ways, e.g., one uses the icon theme as a fallback for window + * decorations but the other does not, etc, ...) an icon as part of the window + * decoration (usually on the upper-left of the window). + * + * In either case, xterm's icon will only be shown in the window decorations if + * xterm does not use the active icon feature. + * + * This function (tries to) determine the window manager's name, so that we can + * provide a useful automatic default for active icons. It is based on reading + * wmctrl, which covers most of EWMH and ICCM. + */ +static char * +getWindowManagerName(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Display *dpy = screen->display; + Window *sup_window = NULL; + char *result = 0; + + TRACE(("getWindowManagerName\n")); +#define getWinProp(type, name) \ + (Window *)getProperty(dpy, DefaultRootWindow(dpy), type, name) + if ((sup_window = getWinProp(XA_WINDOW, "_NET_SUPPORTING_WM_CHECK")) == 0) { + sup_window = getWinProp(XA_CARDINAL, "_WIN_SUPPORTING_WM_CHECK"); + } + + /* + * If we found the supporting window, get the property containing the + * window manager's name. EWMH defines _NET_WM_NAME, while ICCM defines + * WM_CLASS. There is no standard for the names stored there; + * conventionally it is mixed case. In practice, the former is more often + * set; the latter is not given (or is a lowercased version of the former). + */ + if (sup_window != 0) { +#define getStringProp(type,name) \ + (char *)getProperty(dpy, *sup_window, type, name) + if ((result = getStringProp(XA_UTF8_STRING(dpy), "_NET_WM_NAME")) == 0 + && (result = getStringProp(XA_STRING, "_NET_WM_NAME")) == 0 + && (result = getStringProp(XA_STRING, "WM_CLASS")) == 0) { + TRACE(("... window manager does not tell its name\n")); + } + free(sup_window); + } else { + TRACE(("... Cannot get window manager info properties\n")); + } + if (result == 0) + result = x_strdup("unknown"); + TRACE(("... window manager name is %s\n", result)); + return result; +} + +static Boolean +discount_frame_extents(XtermWidget xw, int *high, int *wide) +{ + TScreen *screen = TScreenOf(xw); + Display *dpy = screen->display; + + Atom atom_supported = XInternAtom(dpy, "_NET_FRAME_EXTENTS", False); + Atom actual_type; + int actual_format; + long long_offset = 0; + long long_length = 128; /* number of items to ask for at a time */ + unsigned long nitems; + unsigned long bytes_after; + unsigned char *args; + Boolean rc; + + rc = xtermGetWinProp(dpy, + VShellWindow(xw), + atom_supported, + long_offset, + long_length, + XA_CARDINAL, /* req_type */ + &actual_type, /* actual_type_return */ + &actual_format, /* actual_format_return */ + &nitems, /* nitems_return */ + &bytes_after, /* bytes_after_return */ + &args /* prop_return */ + ); + + if (rc && args && (nitems == 4) && (actual_format == 32)) { + long *extents = (long *) (void *) args; + + TRACE(("_NET_FRAME_EXTENTS:\n")); + TRACE((" left: %ld\n", extents[0])); + TRACE((" right: %ld\n", extents[1])); + TRACE((" top: %ld\n", extents[2])); + TRACE((" bottom: %ld\n", extents[3])); + + if (!x_strncasecmp(xw->work.wm_name, "gnome shell", 11)) { + *wide -= (int) (extents[0] + extents[1]); /* -= (left+right) */ + *high -= (int) (extents[2] + extents[3]); /* -= (top+bottom) */ + TRACE(("...applied extents %d,%d\n", *high, *wide)); + } else if (!x_strncasecmp(xw->work.wm_name, "compiz", 6)) { + /* Ubuntu 16.04 is really off-by-one */ + *wide -= (int) (extents[0] + extents[1] - 1); + *high -= (int) (extents[2] + extents[3] - 1); + TRACE(("...applied extents %d,%d\n", *high, *wide)); + } else if (!x_strncasecmp(xw->work.wm_name, "fvwm", 4)) { + TRACE(("...skipping extents\n")); + } else { + TRACE(("...ignoring extents\n")); + rc = False; + } + } else { + rc = False; + } + return rc; +} +#endif /* !NO_ACTIVE_ICON */ + +void +initBorderGC(XtermWidget xw, VTwin *win) +{ + TScreen *screen = TScreenOf(xw); + Pixel filler; + + TRACE(("initBorderGC(%s) core bg %#lx, bd %#lx text fg %#lx, bg %#lx %s\n", + (win == &(screen->fullVwin)) ? "full" : "icon", + xw->core.background_pixel, + xw->core.border_pixel, + T_COLOR(screen, TEXT_FG), + T_COLOR(screen, TEXT_BG), + xw->misc.re_verse ? "reverse" : "normal")); + if (xw->misc.color_inner_border + && (xw->core.background_pixel != xw->core.border_pixel)) { + /* + * By default, try to match the inner window's background. + */ + if ((xw->core.background_pixel == T_COLOR(screen, TEXT_BG)) && + (xw->core.border_pixel == T_COLOR(screen, TEXT_FG))) { + filler = T_COLOR(screen, TEXT_BG); + } else { + filler = xw->core.border_pixel; + } + TRACE((" border %#lx\n", filler)); + setCgsFore(xw, win, gcBorder, filler); + setCgsBack(xw, win, gcBorder, filler); + win->border_gc = getCgsGC(xw, win, gcBorder); + } +#if USE_DOUBLE_BUFFER + else if (resource.buffered) { + filler = T_COLOR(screen, TEXT_BG); + TRACE((" border %#lx (buffered)\n", filler)); + setCgsFore(xw, win, gcBorder, filler); + setCgsBack(xw, win, gcBorder, filler); + win->border_gc = getCgsGC(xw, win, gcBorder); + } +#endif + else { + TRACE((" border unused\n")); + win->border_gc = 0; + } + + /* + * Initialize a GC for double-buffering, needed for XFillRectangle call + * in xtermClear2(). When not double-buffering, the XClearArea call works, + * without requiring a separate GC. + */ +#if USE_DOUBLE_BUFFER + if (resource.buffered) { + filler = (((xw->flags & BG_COLOR) && (xw->cur_background >= 0)) + ? getXtermBG(xw, xw->flags, xw->cur_background) + : T_COLOR(screen, TEXT_BG)); + + TRACE((" filler %#lx %s\n", + filler, + xw->misc.re_verse ? "reverse" : "normal")); + + setCgsFore(xw, win, gcFiller, filler); + setCgsBack(xw, win, gcFiller, filler); + + win->filler_gc = getCgsGC(xw, win, gcFiller); + } +#endif +} + +/*ARGSUSED*/ +static void +VTRealize(Widget w, + XtValueMask * valuemask, + XSetWindowAttributes * values) +{ + XtermWidget xw = (XtermWidget) w; + TScreen *screen = TScreenOf(xw); + + const VTFontNames *myfont; + struct Xinerama_geometry pos; + int pr; + Atom pid_atom; + int i; + + TRACE(("VTRealize {{\n")); + + TabReset(xw->tabs); + + if (screen->menu_font_number == fontMenu_default) { + myfont = defaultVTFontNames(xw); + } else { + myfont = xtermFontName(screen->MenuFontName(screen->menu_font_number)); + } + memset(screen->fnts, 0, sizeof(screen->fnts)); + + if (!xtermLoadFont(xw, + myfont, + False, + screen->menu_font_number)) { + if (XmuCompareISOLatin1(myfont->f_n, DEFFONT) != 0) { + char *use_font = x_strdup(DEFFONT); + xtermWarning("unable to open font \"%s\", trying \"%s\"....\n", + myfont->f_n, use_font); + (void) xtermLoadFont(xw, + xtermFontName(use_font), + False, + screen->menu_font_number); + screen->MenuFontName(screen->menu_font_number) = use_font; + } + } + + /* really screwed if we couldn't open default font */ + if (!GetNormalFont(screen, fNorm)->fs) { + xtermWarning("unable to locate a suitable font\n"); + Exit(1); + } +#if OPT_WIDE_CHARS + if (screen->utf8_mode) { + TRACE(("check if this is a wide font, if not try again\n")); + if (xtermLoadWideFonts(xw, False)) { + SetVTFont(xw, screen->menu_font_number, True, NULL); + /* we will not be able to switch to ISO-8859-1 */ + if (!screen->mergedVTFonts) { + screen->utf8_fonts = uAlways; + update_font_utf8_fonts(); + } + } + } +#endif + + /* making cursor */ + if (!screen->pointer_cursor) { + screen->pointer_cursor = + make_colored_cursor(XC_xterm, + T_COLOR(screen, MOUSE_FG), + T_COLOR(screen, MOUSE_BG)); + } else { + recolor_cursor(screen, + screen->pointer_cursor, + T_COLOR(screen, MOUSE_FG), + T_COLOR(screen, MOUSE_BG)); + } + + /* set defaults */ + pos.x = 1; + pos.y = 1; + pos.w = 80; + pos.h = 24; + + TRACE(("parsing geo_metry %s\n", NonNull(xw->misc.geo_metry))); + pr = XParseXineramaGeometry(screen->display, xw->misc.geo_metry, &pos); + TRACE(("... position %d,%d size %dx%d\n", pos.y, pos.x, pos.h, pos.w)); + + set_max_col(screen, (int) (pos.w - 1)); /* units in character cells */ + set_max_row(screen, (int) (pos.h - 1)); /* units in character cells */ + xtermUpdateFontInfo(xw, False); + + pos.w = screen->fullVwin.fullwidth; + pos.h = screen->fullVwin.fullheight; + + TRACE(("... BorderWidth: widget %d parent %d shell %d\n", + BorderWidth(xw), + BorderWidth(XtParent(xw)), + BorderWidth(SHELL_OF(xw)))); + + if ((pr & XValue) && (XNegative & pr)) { + pos.x = (Position) (pos.x + (pos.scr_w + - (int) pos.w + - (BorderWidth(XtParent(xw)) * 2))); + } + if ((pr & YValue) && (YNegative & pr)) { + pos.y = (Position) (pos.y + (pos.scr_h + - (int) pos.h + - (BorderWidth(XtParent(xw)) * 2))); + } + pos.x = (Position) (pos.x + pos.scr_x); + pos.y = (Position) (pos.y + pos.scr_y); + + /* set up size hints for window manager; min 1 char by 1 char */ + getXtermSizeHints(xw); + xtermSizeHints(xw, (xw->misc.scrollbar + ? (screen->scrollWidget->core.width + + BorderWidth(screen->scrollWidget)) + : 0)); + + xw->hints.x = pos.x; + xw->hints.y = pos.y; +#if OPT_MAXIMIZE + /* assure single-increment resize for fullscreen */ + if (xw->work.ewmh[0].mode) { + xw->hints.width_inc = 1; + xw->hints.height_inc = 1; + } +#endif + if ((XValue & pr) || (YValue & pr)) { + xw->hints.flags |= USSize | USPosition; + xw->hints.flags |= PWinGravity; + switch (pr & (XNegative | YNegative)) { + case 0: + xw->hints.win_gravity = NorthWestGravity; + break; + case XNegative: + xw->hints.win_gravity = NorthEastGravity; + break; + case YNegative: + xw->hints.win_gravity = SouthWestGravity; + break; + default: + xw->hints.win_gravity = SouthEastGravity; + break; + } + } else { + /* set a default size, but do *not* set position */ + xw->hints.flags |= PSize; + } + xw->hints.height = xw->hints.base_height + + xw->hints.height_inc * MaxRows(screen); + xw->hints.width = xw->hints.base_width + + xw->hints.width_inc * MaxCols(screen); + + if ((WidthValue & pr) || (HeightValue & pr)) + xw->hints.flags |= USSize; + else + xw->hints.flags |= PSize; + + /* + * Note that the size-hints are for the shell, while the resize-request + * is for the vt100 widget. They are not the same size. + */ + (void) REQ_RESIZE((Widget) xw, + (Dimension) pos.w, (Dimension) pos.h, + &xw->core.width, &xw->core.height); + + /* XXX This is bogus. We are parsing geometries too late. This + * is information that the shell widget ought to have before we get + * realized, so that it can do the right thing. + */ + if (xw->hints.flags & USPosition) + XMoveWindow(XtDisplay(xw), VShellWindow(xw), + xw->hints.x, xw->hints.y); + + TRACE(("%s@%d -- ", __FILE__, __LINE__)); + TRACE_HINTS(&xw->hints); + XSetWMNormalHints(XtDisplay(xw), VShellWindow(xw), &xw->hints); + TRACE(("%s@%d -- ", __FILE__, __LINE__)); + TRACE_WM_HINTS(xw); + + if ((pid_atom = XInternAtom(XtDisplay(xw), "_NET_WM_PID", False)) != None) { + /* XChangeProperty format 32 really is "long" */ + unsigned long pid_l = (unsigned long) getpid(); + TRACE(("Setting _NET_WM_PID property to %lu\n", pid_l)); + XChangeProperty(XtDisplay(xw), VShellWindow(xw), + pid_atom, XA_CARDINAL, 32, PropModeReplace, + (unsigned char *) &pid_l, 1); + } + + XFlush(XtDisplay(xw)); /* get it out to window manager */ + + /* use ForgetGravity instead of SouthWestGravity because translating + the Expose events for ConfigureNotifys is too hard */ + values->bit_gravity = (GravityIsNorthWest(xw) + ? NorthWestGravity + : ForgetGravity); + screen->fullVwin.window = XtWindow(xw) = + XCreateWindow(XtDisplay(xw), XtWindow(XtParent(xw)), + xw->core.x, xw->core.y, + xw->core.width, xw->core.height, BorderWidth(xw), + (int) xw->core.depth, + InputOutput, CopyFromParent, + *valuemask | CWBitGravity, values); +#if USE_DOUBLE_BUFFER + screen->fullVwin.drawable = screen->fullVwin.window; + + if (resource.buffered) { + Window win = screen->fullVwin.window; + Drawable d; + int major, minor; + if (XdbeQueryExtension(XtDisplay(xw), &major, &minor)) { + d = XdbeAllocateBackBufferName(XtDisplay(xw), win, + (XdbeSwapAction) XdbeCopied); + if (d == None) { + fprintf(stderr, "Couldn't allocate a back buffer!\n"); + exit(3); + } + screen->fullVwin.drawable = d; + screen->needSwap = 1; + TRACE(("initialized double-buffering\n")); + } else { + resource.buffered = False; + } + } +#endif /* USE_DOUBLE_BUFFER */ + screen->event_mask = values->event_mask; + +#ifndef NO_ACTIVE_ICON + /* + * Normally, the font-number for icon fonts does not correspond with any of + * the menu-selectable fonts. If we cannot load the font given for the + * iconFont resource, try with font1 aka "Unreadable". + */ + screen->icon_fontnum = -1; + if (getIconicFont(screen)->fs == 0) { + getIconicFont(screen)->fs = + XLoadQueryFont(screen->display, + screen->MenuFontName(fontMenu_font1)); + ReportIcons(("%susing font1 '%s' as iconFont\n", + (getIconicFont(screen)->fs + ? "" + : "NOT "), + screen->MenuFontName(fontMenu_font1))); + } +#if OPT_RENDERFONT + /* + * If we still have no result from iconFont resource (perhaps because fonts + * are missing) but are using Xft, try to use that instead. We prefer + * bitmap fonts in any case, since scaled fonts are usually less readable, + * particularly at small sizes. + */ + if (UsingRenderFont(xw) + && getIconicFont(screen)->fs == 0) { + screen->icon_fontnum = fontMenu_default; + getIconicFont(screen)->fs = GetNormalFont(screen, fNorm)->fs; /* need for next-if */ + ReportIcons(("using TrueType font as iconFont\n")); + } +#endif + xw->work.wm_name = getWindowManagerName(xw); + if ((xw->work.active_icon == eiDefault) && getIconicFont(screen)->fs) { + ReportIcons(("window manager name is %s\n", xw->work.wm_name)); + if (x_strncasecmp(xw->work.wm_name, "fvwm", 4) && + x_strncasecmp(xw->work.wm_name, "window maker", 12)) { + xw->work.active_icon = eiFalse; + } + } + if (xw->work.active_icon && getIconicFont(screen)->fs) { + int iconX = 0, iconY = 0; + Widget shell = SHELL_OF(xw); + VTwin *win = &(screen->iconVwin); + int save_fontnum = screen->menu_font_number; + + ReportIcons(("initializing active-icon %d\n", screen->icon_fontnum)); + screen->menu_font_number = screen->icon_fontnum; + XtVaGetValues(shell, + XtNiconX, &iconX, + XtNiconY, &iconY, + (XtPointer) 0); + xtermComputeFontInfo(xw, &(screen->iconVwin), + getIconicFont(screen)->fs, 0); + screen->menu_font_number = save_fontnum; + + /* since only one client is permitted to select for Button + * events, we have to let the window manager get 'em... + */ + values->event_mask &= ~(ButtonPressMask | ButtonReleaseMask); + values->border_pixel = xw->misc.icon_border_pixel; + + screen->iconVwin.window = + XCreateWindow(XtDisplay(xw), + RootWindowOfScreen(XtScreen(shell)), + iconX, iconY, + screen->iconVwin.fullwidth, + screen->iconVwin.fullheight, + xw->misc.icon_border_width, + (int) xw->core.depth, + InputOutput, CopyFromParent, + *valuemask | CWBitGravity | CWBorderPixel, + values); +#if USE_DOUBLE_BUFFER + screen->iconVwin.drawable = screen->iconVwin.window; +#endif + XtVaSetValues(shell, + XtNiconWindow, screen->iconVwin.window, + (XtPointer) 0); + XtRegisterDrawable(XtDisplay(xw), screen->iconVwin.window, w); + + setCgsFont(xw, win, gcNorm, getIconicFont(screen)); + setCgsFore(xw, win, gcNorm, T_COLOR(screen, TEXT_FG)); + setCgsBack(xw, win, gcNorm, T_COLOR(screen, TEXT_BG)); + + copyCgs(xw, win, gcBold, gcNorm); + + setCgsFont(xw, win, gcNormReverse, getIconicFont(screen)); + setCgsFore(xw, win, gcNormReverse, T_COLOR(screen, TEXT_BG)); + setCgsBack(xw, win, gcNormReverse, T_COLOR(screen, TEXT_FG)); + + copyCgs(xw, win, gcBoldReverse, gcNormReverse); + + initBorderGC(xw, win); + +#if OPT_TOOLBAR + /* + * Toolbar is initialized before we get here. Enable the menu item + * and set it properly. + */ + SetItemSensitivity(vtMenuEntries[vtMenu_activeicon].widget, True); + update_activeicon(); +#endif + } else { + ReportIcons(("disabled active-icon\n")); + xw->work.active_icon = eiFalse; + } +#endif /* NO_ACTIVE_ICON */ + +#if OPT_INPUT_METHOD + VTInitI18N(xw); +#endif +#if OPT_NUM_LOCK + VTInitModifiers(xw); +#if OPT_EXTRA_PASTE + if (xw->keyboard.extra_translations) { + XtOverrideTranslations((Widget) xw, + XtParseTranslationTable(xw->keyboard.extra_translations)); + } +#endif +#endif + + set_cursor_gcs(xw); + initBorderGC(xw, &(screen->fullVwin)); + + /* Reset variables used by ANSI emulation. */ + + resetCharsets(screen); + + XDefineCursor(screen->display, VShellWindow(xw), screen->pointer_cursor); + + set_cur_col(screen, 0); + set_cur_row(screen, 0); + set_max_col(screen, Width(screen) / screen->fullVwin.f_width - 1); + set_max_row(screen, Height(screen) / screen->fullVwin.f_height - 1); + resetMargins(xw); + + memset(screen->sc, 0, sizeof(screen->sc)); + + /* Mark screen buffer as unallocated. We wait until the run loop so + that the child process does not fork and exec with all the dynamic + memory it will never use. If we were to do it here, the + swap space for new process would be huge for huge savelines. */ +#if OPT_TEK4014 + if (!tekWidget) /* if not called after fork */ +#endif + { + screen->visbuf = NULL; + screen->saveBuf_index = NULL; + } + + ResetWrap(screen); + screen->scrolls = screen->incopy = 0; + xtermSetCursorBox(screen); + + screen->savedlines = 0; + + for (i = 0; i < 2; ++i) { + screen->whichBuf = !screen->whichBuf; + CursorSave(xw); + } + +#ifndef NO_ACTIVE_ICON + if (!xw->work.active_icon) +#endif + xtermLoadIcon(xw, resource.icon_hint); + + /* + * Do this last, since it may change the layout via a resize. + */ + if (xw->misc.scrollbar) { + screen->fullVwin.sb_info.width = 0; + ScrollBarOn(xw, False); + } + + xtermSetWinSize(xw); + TRACE(("}} VTRealize\n")); +} + +#if OPT_INPUT_METHOD + +/* limit this feature to recent XFree86 since X11R6.x core dumps */ +#if defined(XtSpecificationRelease) && XtSpecificationRelease >= 6 && defined(X_HAVE_UTF8_STRING) +#define USE_XIM_INSTANTIATE_CB + +static void +xim_instantiate_cb(Display *display, + XPointer client_data GCC_UNUSED, + XPointer call_data GCC_UNUSED) +{ + XtermWidget xw = term; + + TRACE(("xim_instantiate_cb client=%p, call=%p\n", client_data, call_data)); + + if (display == XtDisplay(xw)) { + VTInitI18N(xw); + } +} + +static void +xim_destroy_cb(XIM im GCC_UNUSED, + XPointer client_data GCC_UNUSED, + XPointer call_data GCC_UNUSED) +{ + XtermWidget xw = term; + TInput *input = lookupTInput(xw, (Widget) xw); + + TRACE(("xim_destroy_cb im=%lx, client=%p, call=%p\n", + (long) im, client_data, call_data)); + if (input) + input->xic = NULL; + XRegisterIMInstantiateCallback(XtDisplay(xw), NULL, NULL, NULL, + xim_instantiate_cb, NULL); +} +#endif /* X11R6+ */ + +static Boolean +xim_create_fs(XtermWidget xw) +{ + XFontStruct **fonts; + char **font_name_list; + char **missing_charset_list; + char *def_string; + int missing_charset_count; + unsigned i, j; + + if (xw->work.xim_fs == 0) { + xw->work.xim_fs = XCreateFontSet(XtDisplay(xw), + xw->misc.f_x, + &missing_charset_list, + &missing_charset_count, + &def_string); + if (xw->work.xim_fs == NULL) { + xtermWarning("Preparation of font set " + "\"%s\" for XIM failed.\n", xw->misc.f_x); + xw->work.xim_fs = XCreateFontSet(XtDisplay(xw), + DEFXIMFONT, + &missing_charset_list, + &missing_charset_count, + &def_string); + } + } + if (xw->work.xim_fs == NULL) { + xtermWarning("Preparation of default font set " + "\"%s\" for XIM failed.\n", DEFXIMFONT); + cleanupInputMethod(xw); + xw->work.cannot_im = True; + } else { + (void) XExtentsOfFontSet(xw->work.xim_fs); + j = (unsigned) XFontsOfFontSet(xw->work.xim_fs, &fonts, &font_name_list); + for (i = 0, xw->work.xim_fs_ascent = 0; i < j; i++) { + if (xw->work.xim_fs_ascent < (*fonts)->ascent) + xw->work.xim_fs_ascent = (*fonts)->ascent; + } + } + return (Boolean) !(xw->work.cannot_im); +} + +static void +xim_create_xic(XtermWidget xw, Widget theInput) +{ + Display *myDisplay = XtDisplay(theInput); + Window myWindow = XtWindow(theInput); + unsigned i, j; + char *p = NULL, *s, *t, *ns, *end, buf[32]; + XIMStyles *xim_styles; + XIMStyle input_style = 0; + Bool found; + static struct { + const char *name; + unsigned long code; + } known_style[] = { + { + "OverTheSpot", (XIMPreeditPosition | XIMStatusNothing) + }, + { + "OffTheSpot", (XIMPreeditArea | XIMStatusArea) + }, + { + "Root", (XIMPreeditNothing | XIMStatusNothing) + }, + }; + TInput *input = lookupTInput(xw, theInput); + + if (xw->work.cannot_im) { + return; + } + + if (input == 0) { + for (i = 0; i < NINPUTWIDGETS; ++i) { + if (xw->work.inputs[i].w == 0) { + input = xw->work.inputs + i; + input->w = theInput; + break; + } + } + } + + if (input == 0) { + xtermWarning("attempted to add too many input widgets\n"); + return; + } + + TRACE(("xim_real_init\n")); + + if (IsEmpty(xw->misc.input_method)) { + if ((p = XSetLocaleModifiers("")) != NULL && *p) { + input->xim = XOpenIM(myDisplay, NULL, NULL, NULL); + } + } else { + s = xw->misc.input_method; + i = 5 + (unsigned) strlen(s); + + t = (char *) MyStackAlloc(i, buf); + if (t == NULL) { + SysError(ERROR_VINIT); + } else { + + for (ns = s; ns && *s;) { + while (*s && isspace(CharOf(*s))) + s++; + if (!*s) + break; + if ((ns = end = strchr(s, ',')) == 0) + end = s + strlen(s); + while ((end != s) && isspace(CharOf(end[-1]))) + end--; + + if (end != s) { + strcpy(t, "@im="); + strncat(t, s, (size_t) (end - s)); + + if ((p = XSetLocaleModifiers(t)) != 0 && *p + && (input->xim = XOpenIM(myDisplay, + NULL, + NULL, + NULL)) != 0) { + break; + } + + } + s = ns + 1; + } + MyStackFree(t, buf); + } + } + + if (input->xim == NULL + && (p = XSetLocaleModifiers("@im=none")) != NULL + && *p) { + input->xim = XOpenIM(myDisplay, NULL, NULL, NULL); + } + + if (!input->xim) { + xtermWarning("Failed to open input method\n"); + return; + } + TRACE(("VTInitI18N opened input method:%s\n", NonNull(p))); + + if (XGetIMValues(input->xim, XNQueryInputStyle, &xim_styles, (void *) 0) + || !xim_styles + || !xim_styles->count_styles) { + xtermWarning("input method doesn't support any style\n"); + cleanupInputMethod(xw); + xw->work.cannot_im = True; + return; + } + + found = False; + for (s = xw->misc.preedit_type; s && !found;) { + while (*s && isspace(CharOf(*s))) + s++; + if (!*s) + break; + if ((ns = end = strchr(s, ',')) != 0) + ns++; + else + end = s + strlen(s); + while ((end != s) && isspace(CharOf(end[-1]))) + end--; + + if (end != s) { /* just in case we have a spurious comma */ + TRACE(("looking for style '%.*s'\n", (int) (end - s), s)); + for (i = 0; i < XtNumber(known_style); i++) { + if ((int) strlen(known_style[i].name) == (end - s) + && !strncmp(s, known_style[i].name, (size_t) (end - s))) { + input_style = known_style[i].code; + for (j = 0; j < xim_styles->count_styles; j++) { + if (input_style == xim_styles->supported_styles[j]) { + found = True; + break; + } + } + if (found) + break; + } + } + } + + s = ns; + } + XFree(xim_styles); + + if (!found) { + xtermWarning("input method doesn't support my preedit type (%s)\n", + xw->misc.preedit_type); + cleanupInputMethod(xw); + xw->work.cannot_im = True; + return; + } + + /* + * Check for styles we do not yet support. + */ + TRACE(("input_style %#lx\n", input_style)); + if (input_style == (XIMPreeditArea | XIMStatusArea)) { + xtermWarning("This program doesn't support the 'OffTheSpot' preedit type\n"); + cleanupInputMethod(xw); + xw->work.cannot_im = True; + return; + } + + /* + * For XIMPreeditPosition (or OverTheSpot), XIM client has to + * prepare a font. + * The font has to be locale-dependent XFontSet, whereas + * XTerm use Unicode font. This leads a problem that the + * same font cannot be used for XIM preedit. + */ + if (input_style != (XIMPreeditNothing | XIMStatusNothing)) { + XVaNestedList p_list; + XPoint spot = + {0, 0}; + + if (xim_create_fs(xw)) { + p_list = XVaCreateNestedList(0, + XNSpotLocation, &spot, + XNFontSet, xw->work.xim_fs, + (void *) 0); + input->xic = XCreateIC(input->xim, + XNInputStyle, input_style, + XNClientWindow, myWindow, + XNFocusWindow, myWindow, + XNPreeditAttributes, p_list, + (void *) 0); + } + } else { + input->xic = XCreateIC(input->xim, XNInputStyle, input_style, + XNClientWindow, myWindow, + XNFocusWindow, myWindow, + (void *) 0); + } + + if (!input->xic) { + xtermWarning("Failed to create input context\n"); + cleanupInputMethod(xw); + } +#if defined(USE_XIM_INSTANTIATE_CB) + else { + XIMCallback destroy_cb; + + destroy_cb.callback = xim_destroy_cb; + destroy_cb.client_data = NULL; + if (XSetIMValues(input->xim, + XNDestroyCallback, + &destroy_cb, + (void *) 0)) { + xtermWarning("Could not set destroy callback to IM\n"); + } + } +#endif + + return; +} + +static void +xim_real_init(XtermWidget xw) +{ + xim_create_xic(xw, (Widget) xw); +} + +static void +VTInitI18N(XtermWidget xw) +{ + if (xw->misc.open_im) { + xim_real_init(xw); + +#if defined(USE_XIM_INSTANTIATE_CB) + if (lookupTInput(xw, (Widget) xw) == NULL + && !xw->work.cannot_im + && xw->misc.retry_im-- > 0) { + sleep(3); + XRegisterIMInstantiateCallback(XtDisplay(xw), NULL, NULL, NULL, + xim_instantiate_cb, NULL); + } +#endif + } +} + +TInput * +lookupTInput(XtermWidget xw, Widget w) +{ + TInput *result = 0; + unsigned n; + + for (n = 0; n < NINPUTWIDGETS; ++n) { + if (xw->work.inputs[n].w == w) { + result = xw->work.inputs + n; + break; + } + } + + return result; +} +#endif /* OPT_INPUT_METHOD */ + +static void +set_cursor_outline_gc(XtermWidget xw, + Bool filled, + Pixel fg, + Pixel bg, + Pixel cc) +{ + TScreen *screen = TScreenOf(xw); + VTwin *win = WhichVWin(screen); + CgsEnum cgsId = gcVTcursOutline; + + if (cc == bg) + cc = fg; + + if (filled) { + setCgsFore(xw, win, cgsId, bg); + setCgsBack(xw, win, cgsId, cc); + } else { + setCgsFore(xw, win, cgsId, cc); + setCgsBack(xw, win, cgsId, bg); + } +} + +static Boolean +VTSetValues(Widget cur, + Widget request GCC_UNUSED, + Widget wnew, + ArgList args GCC_UNUSED, + Cardinal *num_args GCC_UNUSED) +{ + XtermWidget curvt = (XtermWidget) cur; + XtermWidget newvt = (XtermWidget) wnew; + Boolean refresh_needed = False; + Boolean fonts_redone = False; + + if ((T_COLOR(TScreenOf(curvt), TEXT_BG) != + T_COLOR(TScreenOf(newvt), TEXT_BG)) || + (T_COLOR(TScreenOf(curvt), TEXT_FG) != + T_COLOR(TScreenOf(newvt), TEXT_FG)) || + (TScreenOf(curvt)->MenuFontName(TScreenOf(curvt)->menu_font_number) != + TScreenOf(newvt)->MenuFontName(TScreenOf(newvt)->menu_font_number)) || + strcmp(DefaultFontN(curvt), DefaultFontN(newvt))) { + if (strcmp(DefaultFontN(curvt), DefaultFontN(newvt))) { + TScreenOf(newvt)->MenuFontName(fontMenu_default) = DefaultFontN(newvt); + } + if (xtermLoadFont(newvt, + xtermFontName(TScreenOf(newvt)->MenuFontName(TScreenOf(curvt)->menu_font_number)), + True, TScreenOf(newvt)->menu_font_number)) { + /* resizing does the redisplay, so don't ask for it here */ + refresh_needed = True; + fonts_redone = True; + } else if (strcmp(DefaultFontN(curvt), DefaultFontN(newvt))) { + TScreenOf(newvt)->MenuFontName(fontMenu_default) = DefaultFontN(curvt); + } + } + if (!fonts_redone + && (T_COLOR(TScreenOf(curvt), TEXT_CURSOR) != + T_COLOR(TScreenOf(newvt), TEXT_CURSOR))) { + if (set_cursor_gcs(newvt)) + refresh_needed = True; + } + if (curvt->misc.re_verse != newvt->misc.re_verse) { + newvt->flags ^= REVERSE_VIDEO; + ReverseVideo(newvt); + /* ReverseVideo toggles */ + newvt->misc.re_verse = (Boolean) (!newvt->misc.re_verse); + refresh_needed = True; + } + if ((T_COLOR(TScreenOf(curvt), MOUSE_FG) != + T_COLOR(TScreenOf(newvt), MOUSE_FG)) || + (T_COLOR(TScreenOf(curvt), MOUSE_BG) != + T_COLOR(TScreenOf(newvt), MOUSE_BG))) { + recolor_cursor(TScreenOf(newvt), + TScreenOf(newvt)->pointer_cursor, + T_COLOR(TScreenOf(newvt), MOUSE_FG), + T_COLOR(TScreenOf(newvt), MOUSE_BG)); + refresh_needed = True; + } + if (curvt->misc.scrollbar != newvt->misc.scrollbar) { + ToggleScrollBar(newvt); + } + + return refresh_needed; +} + +/* + * Given a font-slot and information about selection/reverse, find the + * corresponding cached-GC slot. + */ +#if OPT_WIDE_ATTRS +static int +reverseCgs(XtermWidget xw, unsigned attr_flags, Bool hilite, int font) +{ + TScreen *screen = TScreenOf(xw); + CgsEnum result = gcMAX; + + (void) screen; + if (ReverseOrHilite(screen, attr_flags, hilite)) { + switch (font) { + case fNorm: + result = gcNormReverse; + break; + case fBold: + result = gcBoldReverse; + break; +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE + case fItal: + result = gcNormReverse; /* FIXME */ + break; +#endif +#if OPT_WIDE_CHARS + case fWide: + result = gcWideReverse; + break; + case fWBold: + result = gcWBoldReverse; + break; + case fWItal: + result = gcWideReverse; /* FIXME */ + break; +#endif + } + } else { + switch (font) { + case fNorm: + result = gcNorm; + break; + case fBold: + result = gcBold; + break; +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE + case fItal: + result = gcNorm; /* FIXME */ + break; +#endif +#if OPT_WIDE_CHARS + case fWide: + result = gcWide; + break; + case fWBold: + result = gcWBold; + break; + case fWItal: + result = gcWide; /* FIXME */ + break; +#endif + } + } + return (int) result; +} +#endif + +#define setGC(code) set_at = __LINE__, currentCgs = code + +#define OutsideSelection(screen,srow,scol) \ + ((srow) > (screen)->endH.row || \ + ((srow) == (screen)->endH.row && \ + (scol) >= (screen)->endH.col) || \ + (srow) < (screen)->startH.row || \ + ((srow) == (screen)->startH.row && \ + (scol) < (screen)->startH.col)) + +/* + * Shows cursor at new cursor position in screen. + */ +void +ShowCursor(void) +{ + XtermWidget xw = term; + XTermDraw params; + TScreen *screen = TScreenOf(xw); + IChar base; + unsigned flags; + CellColor fg_bg = initCColor; + GC currentGC; + GC outlineGC; + CgsEnum currentCgs = gcMAX; + VTwin *currentWin = WhichVWin(screen); + int set_at; + Bool in_selection; + Bool reversed; + Bool filled; + Pixel fg_pix; + Pixel bg_pix; + Pixel tmp; +#if OPT_HIGHLIGHT_COLOR + Pixel selbg_pix = T_COLOR(screen, HIGHLIGHT_BG); + Pixel selfg_pix = T_COLOR(screen, HIGHLIGHT_FG); + Boolean use_selbg; + Boolean use_selfg; +#endif +#if OPT_WIDE_CHARS + int my_col = 0; +#endif + int cursor_col; + CLineData *ld = 0; + + if (screen->cursor_state == BLINKED_OFF) + return; + + if (screen->eventMode != NORMAL) + return; + + if (INX2ROW(screen, screen->cur_row) > screen->max_row) + return; + + screen->cursorp.row = screen->cur_row; + cursor_col = screen->cursorp.col = screen->cur_col; + screen->cursor_moved = False; + +#ifndef NO_ACTIVE_ICON + if (IsIcon(screen)) { + screen->cursor_state = ON; + return; + } +#endif /* NO_ACTIVE_ICON */ + + ld = getLineData(screen, screen->cur_row); + + base = ld->charData[cursor_col]; + flags = ld->attribs[cursor_col]; + + if_OPT_WIDE_CHARS(screen, { + if (base == HIDDEN_CHAR && cursor_col > 0) { + /* if cursor points to non-initial part of wide character, + * back it up + */ + --cursor_col; + base = ld->charData[cursor_col]; + } + my_col = cursor_col; + if (base == 0) + base = ' '; + if (isWide((int) base)) + my_col += 1; + }); + + if (base == 0) { + base = ' '; + } +#if OPT_ISO_COLORS +#ifdef EXP_BOGUS_FG + /* + * If the cursor happens to be on blanks, and we have not set both + * foreground and background color, do not treat it as a colored cell. + */ + if (base == ' ') { + if ((flags & (FG_COLOR | BG_COLOR)) == BG_COLOR) { + TRACE(("ShowCursor - do not treat as a colored cell\n")); + flags &= ~(FG_COLOR | BG_COLOR); + } else if ((flags & (FG_COLOR | BG_COLOR)) == FG_COLOR) { + TRACE(("ShowCursor - should we treat as a colored cell?\n")); + if (!(xw->flags & FG_COLOR)) { + if (CheckBogusForeground(screen, "ShowCursor")) { + flags &= ~(FG_COLOR | BG_COLOR); + } + } + } + } +#else /* !EXP_BOGUS_FG */ + /* + * If the cursor happens to be on blanks, and the foreground color is set + * but not the background, do not treat it as a colored cell. + */ + if ((flags & TERM_COLOR_FLAGS(xw)) == FG_COLOR + && base == ' ') { + flags &= ~TERM_COLOR_FLAGS(xw); + } +#endif +#endif + + /* + * Compare the current cell to the last set of colors used for the + * cursor and update the GC's if needed. + */ + (void) fg_bg; + if_OPT_ISO_COLORS(screen, { + fg_bg = ld->color[cursor_col]; + }); + + fg_pix = getXtermFG(xw, flags, (int) extract_fg(xw, fg_bg, flags)); + bg_pix = getXtermBG(xw, flags, (int) extract_bg(xw, fg_bg, flags)); + + /* + * If we happen to have the same foreground/background colors, choose + * a workable foreground color from which we can obtain a visible cursor. + */ + if (fg_pix == bg_pix) { + long bg_diff = (long) (bg_pix - T_COLOR(TScreenOf(xw), TEXT_BG)); + long fg_diff = (long) (bg_pix - T_COLOR(TScreenOf(xw), TEXT_FG)); + if (bg_diff < 0) + bg_diff = -bg_diff; + if (fg_diff < 0) + fg_diff = -fg_diff; + if (bg_diff < fg_diff) { + fg_pix = T_COLOR(TScreenOf(xw), TEXT_FG); + } else { + fg_pix = T_COLOR(TScreenOf(xw), TEXT_BG); + } + } + + if (OutsideSelection(screen, screen->cur_row, screen->cur_col)) + in_selection = False; + else + in_selection = True; + + reversed = ReverseOrHilite(screen, flags, in_selection); + + /* This is like updatedXtermGC(), except that we have to worry about + * whether the window has focus, since in that case we want just an + * outline for the cursor. + */ + filled = (screen->select || screen->always_highlight) && isCursorBlock(screen); +#if OPT_HIGHLIGHT_COLOR + use_selbg = isNotForeground(xw, fg_pix, bg_pix, selbg_pix); + use_selfg = isNotBackground(xw, fg_pix, bg_pix, selfg_pix); +#endif + if (filled) { + if (reversed) { /* text is reverse video */ + if (getCgsGC(xw, currentWin, gcVTcursNormal)) { + setGC(gcVTcursNormal); + } else { + if (flags & BOLDATTR(screen)) { + setGC(gcBold); + } else { + setGC(gcNorm); + } + } + EXCHANGE(fg_pix, bg_pix, tmp); +#if OPT_HIGHLIGHT_COLOR + if (screen->hilite_reverse) { + if (use_selbg && !use_selfg) + fg_pix = bg_pix; + if (use_selfg && !use_selbg) + bg_pix = fg_pix; + if (use_selbg) + bg_pix = selbg_pix; + if (use_selfg) + fg_pix = selfg_pix; + } +#endif + } else { /* normal video */ + if (getCgsGC(xw, currentWin, gcVTcursReverse)) { + setGC(gcVTcursReverse); + } else { + if (flags & BOLDATTR(screen)) { + setGC(gcBoldReverse); + } else { + setGC(gcNormReverse); + } + } + } + +#define CUR_XX T_COLOR(screen, TEXT_CURSOR) +#define CGS_FG getCgsFore(xw, currentWin, getCgsGC(xw, currentWin, currentCgs)) +#define CGS_BG getCgsBack(xw, currentWin, getCgsGC(xw, currentWin, currentCgs)) + +#define FIX_311 (CUR_XX == (reversed ? xw->dft_background : xw->dft_foreground)) +#define FIX_328 (CUR_XX == bg_pix) +#define FIX_330 (FIX_328 && reversed && in_selection) + + if (FIX_330 || FIX_311) { + setCgsBack(xw, currentWin, currentCgs, fg_pix); + } + setCgsFore(xw, currentWin, currentCgs, bg_pix); + } else { /* not selected */ + if (reversed) { /* text is reverse video */ + EXCHANGE(fg_pix, bg_pix, tmp); + setGC(gcNormReverse); + } else { /* normal video */ + setGC(gcNorm); + } +#if OPT_HIGHLIGHT_COLOR + if (screen->hilite_reverse) { + if (in_selection && !reversed) { + /* EMPTY */ + /* really INVERSE ... */ + ; + } else if (in_selection || reversed) { + if (use_selbg) { + if (use_selfg) { + bg_pix = fg_pix; + } else { + fg_pix = bg_pix; + bg_pix = selbg_pix; + } + } + if (use_selfg) { + fg_pix = selfg_pix; + } + } + } else { + if (in_selection) { + if (use_selbg) { + bg_pix = selbg_pix; + } + if (use_selfg) { + fg_pix = selfg_pix; + } + } + } +#endif + setCgsFore(xw, currentWin, currentCgs, fg_pix); + setCgsBack(xw, currentWin, currentCgs, bg_pix); + } + + if (screen->cursor_busy == 0 + && (screen->cursor_state != ON || screen->cursor_GC != set_at)) { + int x, y; + + screen->cursor_GC = set_at; + TRACE(("ShowCursor calling drawXtermText cur(%d,%d) %s-%s, set_at %d\n", + screen->cur_row, screen->cur_col, + (filled ? "filled" : "outline"), + (isCursorBlock(screen) ? "box" : + isCursorUnderline(screen) ? "underline" : "bar"), + set_at)); + + currentGC = getCgsGC(xw, currentWin, currentCgs); + x = LineCursorX(screen, ld, cursor_col); + y = CursorY(screen, screen->cur_row); + + if (!isCursorBlock(screen)) { + /* + * Overriding the combination of filled, reversed, in_selection is + * too complicated since the underline or bar and the text-cell use + * different rules. Just redraw the text-cell, and draw the + * underline or bar on top of it. + */ + HideCursor(); + + /* + * Our current-GC is likely to have been modified in HideCursor(). + * Set up a new request. + */ + if (filled) { + if (FIX_330 || FIX_311) { + setCgsBack(xw, currentWin, currentCgs, fg_pix); + } + setCgsFore(xw, currentWin, currentCgs, bg_pix); + } else { + setCgsFore(xw, currentWin, currentCgs, fg_pix); + setCgsBack(xw, currentWin, currentCgs, bg_pix); + } + } + + /* + * Update the outline-gc, to keep the cursor color distinct from the + * background color. + */ + set_cursor_outline_gc(xw, + filled, + fg_pix, + bg_pix, + T_COLOR(screen, TEXT_CURSOR)); + + outlineGC = getCgsGC(xw, currentWin, gcVTcursOutline); + if (outlineGC == 0) + outlineGC = currentGC; + + if (isCursorUnderline(screen)) { + + /* + * Finally, draw the underline. + */ + screen->box->x = (short) x; + screen->box->y = (short) (y + FontHeight(screen) - 2); + XDrawLines(screen->display, VDrawable(screen), outlineGC, + screen->box, NBOX, CoordModePrevious); + } else if (isCursorBar(screen)) { + + /* + * Or draw the bar. + */ + screen->box->x = (short) x; + screen->box->y = (short) y; + XDrawLines(screen->display, VDrawable(screen), outlineGC, + screen->box, NBOX, CoordModePrevious); + } else { +#if OPT_WIDE_ATTRS + int italics_on = ((ld->attribs[cursor_col] & ATR_ITALIC) != 0); + int italics_off = ((xw->flags & ATR_ITALIC) != 0); + int fix_italics = (italics_on != italics_off); + int which_font = ((xw->flags & BOLD) ? fBold : fNorm); + MyGetFont getter = italics_on ? getItalicFont : getNormalFont; + + if_OPT_WIDE_CHARS(screen, { + if (isWide((int) base)) { + which_font = ((xw->flags & BOLD) ? fWBold : fWide); + } + }); + + if (fix_italics && UseItalicFont(screen)) { + xtermLoadItalics(xw); + setCgsFont(xw, currentWin, currentCgs, + getter(screen, which_font)); + } + currentGC = getCgsGC(xw, currentWin, currentCgs); +#endif /* OPT_WIDE_ATTRS */ + + /* *INDENT-EQLS* */ + params.xw = xw; + params.attr_flags = (flags & DRAWX_MASK); + params.draw_flags = 0; + params.this_chrset = LineCharSet(screen, ld); + params.real_chrset = CSET_SWL; + params.on_wide = 0; + + drawXtermText(¶ms, + currentGC, x, y, + &base, 1); + +#if OPT_WIDE_CHARS + if_OPT_WIDE_CHARS(screen, { + size_t off; + + /* *INDENT-EQLS* */ + params.draw_flags = NOBACKGROUND; + params.on_wide = isWide((int) base); + + for_each_combData(off, ld) { + if (!(ld->combData[off][my_col])) + break; + drawXtermText(¶ms, + currentGC, x, y, + ld->combData[off] + my_col, 1); + } + }); +#endif + + if (!filled) { + screen->box->x = (short) x; + screen->box->y = (short) y; + XDrawLines(screen->display, VDrawable(screen), outlineGC, + screen->box, NBOX, CoordModePrevious); + } +#if OPT_WIDE_ATTRS + if (fix_italics && UseItalicFont(screen)) { + setCgsFont(xw, currentWin, currentCgs, + getter(screen, which_font)); + } +#endif + } + } + screen->cursor_state = ON; + + return; +} + +/* + * hide cursor at previous cursor position in screen. + */ +void +HideCursor(void) +{ + XtermWidget xw = term; + XTermDraw params; + TScreen *screen = TScreenOf(xw); + GC currentGC; + int x, y; + IChar base; + unsigned flags; + CellColor fg_bg = initCColor; + Bool in_selection; +#if OPT_WIDE_CHARS + int my_col = 0; +#endif + int cursor_col; + CLineData *ld = 0; +#if OPT_WIDE_ATTRS + int which_Cgs = gcMAX; + unsigned attr_flags; + int which_font = fNorm; + MyGetFont getter = getNormalFont; +#endif + + if (screen->cursor_state == OFF) + return; + if (INX2ROW(screen, screen->cursorp.row) > screen->max_row) + return; + + cursor_col = screen->cursorp.col; + +#ifndef NO_ACTIVE_ICON + if (IsIcon(screen)) { + screen->cursor_state = OFF; + return; + } +#endif /* NO_ACTIVE_ICON */ + + ld = getLineData(screen, screen->cursorp.row); + + base = ld->charData[cursor_col]; + flags = ld->attribs[cursor_col]; + + if_OPT_WIDE_CHARS(screen, { + if (base == HIDDEN_CHAR && cursor_col > 0) { + /* if cursor points to non-initial part of wide character, + * back it up + */ + --cursor_col; + base = ld->charData[cursor_col]; + } + my_col = cursor_col; + if (base == 0) + base = ' '; + if (isWide((int) base)) + my_col += 1; + }); + + if (base == 0) { + base = ' '; + } +#ifdef EXP_BOGUS_FG + /* + * If the cursor happens to be on blanks, and we have not set both + * foreground and background color, do not treat it as a colored cell. + */ +#if OPT_ISO_COLORS + if (base == ' ') { + if ((flags & (FG_COLOR | BG_COLOR)) == BG_COLOR) { + TRACE(("HideCursor - do not treat as a colored cell\n")); + flags &= ~(FG_COLOR | BG_COLOR); + } else if ((flags & (FG_COLOR | BG_COLOR)) == FG_COLOR) { + TRACE(("HideCursor - should we treat as a colored cell?\n")); + if (!(xw->flags & FG_COLOR)) + if (CheckBogusForeground(screen, "HideCursor")) + flags &= ~(FG_COLOR | BG_COLOR); + } + } +#endif +#endif + + /* + * Compare the current cell to the last set of colors used for the + * cursor and update the GC's if needed. + */ + if_OPT_ISO_COLORS(screen, { + fg_bg = ld->color[cursor_col]; + }); + + if (OutsideSelection(screen, screen->cursorp.row, screen->cursorp.col)) + in_selection = False; + else + in_selection = True; + +#if OPT_WIDE_ATTRS + attr_flags = ld->attribs[cursor_col]; + if ((attr_flags & ATR_ITALIC) ^ (xw->flags & ATR_ITALIC)) { + which_font = ((attr_flags & BOLD) ? fBold : fNorm); + if ((attr_flags & ATR_ITALIC) && UseItalicFont(screen)) + getter = getItalicFont; + + if_OPT_WIDE_CHARS(screen, { + if (isWide((int) base)) { + which_font = ((attr_flags & BOLD) ? fWBold : fWide); + } + }); + + which_Cgs = reverseCgs(xw, attr_flags, in_selection, which_font); + if (which_Cgs != gcMAX) { + setCgsFont(xw, WhichVWin(screen), + (CgsEnum) which_Cgs, + getter(screen, which_font)); + } + } +#endif + + currentGC = updatedXtermGC(xw, flags, fg_bg, in_selection); + + TRACE(("HideCursor calling drawXtermText cur(%d,%d)\n", + screen->cursorp.row, screen->cursorp.col)); + + x = LineCursorX(screen, ld, cursor_col); + y = CursorY(screen, screen->cursorp.row); + + /* *INDENT-EQLS* */ + params.xw = xw; + params.attr_flags = (flags & DRAWX_MASK); + params.draw_flags = 0; + params.this_chrset = LineCharSet(screen, ld); + params.real_chrset = CSET_SWL; + params.on_wide = 0; + + drawXtermText(¶ms, + currentGC, x, y, + &base, 1); + +#if OPT_WIDE_CHARS + if_OPT_WIDE_CHARS(screen, { + size_t off; + + /* *INDENT-EQLS* */ + params.draw_flags = NOBACKGROUND; + params.on_wide = isWide((int) base); + + for_each_combData(off, ld) { + if (!(ld->combData[off][my_col])) + break; + drawXtermText(¶ms, + currentGC, x, y, + ld->combData[off] + my_col, 1); + } + }); +#endif + screen->cursor_state = OFF; + +#if OPT_WIDE_ATTRS + if (which_Cgs != gcMAX) { + setCgsFont(xw, WhichVWin(screen), + (CgsEnum) which_Cgs, + getter(screen, which_font)); + } +#endif + resetXtermGC(xw, flags, in_selection); + + refresh_displayed_graphics(xw, + screen->cursorp.col, + screen->cursorp.row, + 1, 1); + + return; +} + +#if OPT_BLINK_CURS || OPT_BLINK_TEXT +static void +StartBlinking(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->blink_timer == 0) { + unsigned long interval = (unsigned long) ((screen->cursor_state == ON) + ? screen->blink_on + : screen->blink_off); + if (interval == 0) /* wow! */ + interval = 1; /* let's humor him anyway */ + screen->blink_timer = XtAppAddTimeOut(app_con, + interval, + HandleBlinking, + xw); + } +} + +static void +StopBlinking(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->blink_timer) { + XtRemoveTimeOut(screen->blink_timer); + screen->blink_timer = 0; + reallyStopBlinking(xw); + } else { + screen->blink_timer = 0; + } +} + +#if OPT_BLINK_TEXT +Bool +LineHasBlinking(TScreen *screen, CLineData *ld) +{ + Bool result = False; + if (ld != 0) { + int col; + + for (col = 0; col < MaxCols(screen); ++col) { + if (ld->attribs[col] & BLINK) { + result = True; + break; + } + } + } + return result; +} +#endif + +/* + * Blink the cursor by alternately showing/hiding cursor. We leave the timer + * running all the time (even though that's a little inefficient) to make the + * logic simple. + */ +static void +HandleBlinking(XtPointer closure, XtIntervalId * id GCC_UNUSED) +{ + XtermWidget xw = (XtermWidget) closure; + TScreen *screen = TScreenOf(xw); + Bool resume = False; + + screen->blink_timer = 0; + screen->blink_state = !screen->blink_state; + +#if OPT_BLINK_CURS + if (DoStartBlinking(screen)) { + if (screen->cursor_state == ON) { + if (screen->select || screen->always_highlight) { + HideCursor(); + if (screen->cursor_state == OFF) + screen->cursor_state = BLINKED_OFF; + } + } else if (screen->cursor_state == BLINKED_OFF) { + screen->cursor_state = OFF; + ShowCursor(); + if (screen->cursor_state == OFF) + screen->cursor_state = BLINKED_OFF; + } + resume = True; + } +#endif + +#if OPT_BLINK_TEXT + /* + * Inspect the lines on the current screen to see if any have the BLINK flag + * associated with them. Prune off any that have had the corresponding + * cells reset. If any are left, repaint those lines with ScrnRefresh(). + */ + if (!(screen->blink_as_bold)) { + int row; + int first_row = screen->max_row; + int last_row = -1; + + for (row = screen->max_row; row >= 0; row--) { + LineData *ld = getLineData(screen, ROW2INX(screen, row)); + + if (ld != 0 && LineTstBlinked(ld)) { + if (LineHasBlinking(screen, ld)) { + resume = True; + if (row > last_row) + last_row = row; + if (row < first_row) + first_row = row; + } else { + LineClrBlinked(ld); + } + } + } + /* + * FIXME: this could be a little more efficient, e.g,. by limiting the + * columns which are updated. + */ + if (first_row <= last_row) { + ScrnRefresh(xw, + first_row, + 0, + last_row + 1 - first_row, + MaxCols(screen), + True); + } + } +#endif + + /* + * If either the cursor or text is blinking, restart the timer. + */ + if (resume) + StartBlinking(xw); +} +#endif /* OPT_BLINK_CURS || OPT_BLINK_TEXT */ + +void +RestartBlinking(XtermWidget xw) +{ +#if OPT_BLINK_CURS || OPT_BLINK_TEXT + TScreen *screen = TScreenOf(xw); + + if (screen->blink_timer == 0) { + Bool resume = False; + +#if OPT_BLINK_CURS + if (DoStartBlinking(screen)) { + resume = True; + } +#endif +#if OPT_BLINK_TEXT + if (!resume) { + int row; + + for (row = screen->max_row; row >= 0; row--) { + CLineData *ld = getLineData(screen, ROW2INX(screen, row)); + + if (ld != 0 && LineTstBlinked(ld)) { + if (LineHasBlinking(screen, ld)) { + resume = True; + break; + } + } + } + } +#endif + if (resume) + StartBlinking(xw); + } +#else + (void) xw; +#endif +} + +/* + * Implement soft or hard (full) reset of the VTxxx emulation. There are a + * couple of differences from real DEC VTxxx terminals (to avoid breaking + * applications which have come to rely on xterm doing this): + * + * + autowrap mode should be reset (instead it's reset to the resource + * default). + * + the popup menu offers a choice of resetting the savedLines, or not. + * (but the control sequence does this anyway). + */ +static void +ReallyReset(XtermWidget xw, Bool full, Bool saved) +{ + TScreen *screen = TScreenOf(xw); + IFlags saveflags = xw->flags; + + TRACE(("ReallyReset %s, %s\n", + full ? "hard" : "soft", + saved ? "clear savedLines" : "keep savedLines")); + + if (!XtIsRealized((Widget) xw) || (CURRENT_EMU() != (Widget) xw)) { + Bell(xw, XkbBI_MinorError, 0); + return; + } + + if (saved) { + screen->savedlines = 0; + ScrollBarDrawThumb(xw, 0); + } + + /* make cursor visible */ + screen->cursor_set = ON; + InitCursorShape(screen, screen); +#if OPT_BLINK_CURS + screen->cursor_blink = screen->cursor_blink_i; + screen->cursor_blink_esc = 0; + TRACE(("cursor_shape:%d blinks:%d\n", + screen->cursor_shape, + screen->cursor_blink)); +#endif + + /* reset scrolling region */ + resetMargins(xw); + + bitclr(&xw->flags, ORIGIN); + + if_OPT_ISO_COLORS(screen, { + static char empty[1]; + reset_SGR_Colors(xw); + if (ResetAnsiColorRequest(xw, empty, 0)) + xtermRepaint(xw); + }); + + /* Reset character-sets to initial state */ + resetCharsets(screen); + +#if OPT_MOD_FKEYS + /* Reset modifier-resources to initial state */ + xw->keyboard.modify_now = xw->keyboard.modify_1st; +#endif +#if OPT_DEC_RECTOPS + screen->checksum_ext = screen->checksum_ext0; +#endif + + /* Reset DECSCA */ + bitclr(&xw->flags, PROTECTED); + screen->protected_mode = OFF_PROTECT; + + reset_displayed_graphics(screen); + + if (full) { /* RIS */ + if (screen->bellOnReset) + Bell(xw, XkbBI_TerminalBell, 0); + + /* reset the mouse mode */ + screen->send_mouse_pos = MOUSE_OFF; + screen->send_focus_pos = OFF; + screen->extend_coords = 0; + screen->waitingForTrackInfo = False; + screen->eventMode = NORMAL; + + xtermShowPointer(xw, True); + + TabReset(xw->tabs); + xw->keyboard.flags = MODE_SRM; + + guard_keyboard_type = False; + screen->old_fkeys = screen->old_fkeys0; + decode_keyboard_type(xw, &resource); + update_keyboard_type(); + +#if OPT_INITIAL_ERASE + if (xw->keyboard.reset_DECBKM == 1) + xw->keyboard.flags |= MODE_DECBKM; + else if (xw->keyboard.reset_DECBKM == 2) +#endif + if (TScreenOf(xw)->backarrow_key) + xw->keyboard.flags |= MODE_DECBKM; + TRACE(("full reset DECBKM %s\n", + BtoS(xw->keyboard.flags & MODE_DECBKM))); + +#if OPT_SCROLL_LOCK + xtermClearLEDs(screen); +#endif + screen->title_modes = screen->title_modes0; + screen->pointer_mode = screen->pointer_mode0; +#if OPT_SIXEL_GRAPHICS + if (TScreenOf(xw)->sixel_scrolling) + xw->keyboard.flags |= MODE_DECSDM; + TRACE(("full reset DECSDM to %s (resource default is %s)\n", + BtoS(xw->keyboard.flags & MODE_DECSDM), + BtoS(TScreenOf(xw)->sixel_scrolling))); +#endif + +#if OPT_GRAPHICS + screen->privatecolorregisters = TScreenOf(xw)->privatecolorregisters; + TRACE(("full reset PRIVATE_COLOR_REGISTERS to %s (resource default is %s)\n", + BtoS(screen->privatecolorregisters), + BtoS(TScreenOf(xw)->privatecolorregisters))); +#endif + +#if OPT_SIXEL_GRAPHICS + screen->sixel_scrolls_right = TScreenOf(xw)->sixel_scrolls_right; + TRACE(("full reset SIXEL_SCROLLS_RIGHT to %s (resource default is %s)\n", + BtoS(screen->sixel_scrolls_right), + BtoS(TScreenOf(xw)->sixel_scrolls_right))); +#endif + + update_appcursor(); + update_appkeypad(); + update_decbkm(); + update_decsdm(); + show_8bit_control(False); + reset_decudk(xw); + + FromAlternate(xw); + ClearScreen(xw); + screen->cursor_state = OFF; + + if (xw->flags & REVERSE_VIDEO) + ReverseVideo(xw); + ResetItalics(xw); + xw->flags = xw->initflags; + + update_reversevideo(); + update_autowrap(); + update_reversewrap(); + update_autolinefeed(); + + screen->jumpscroll = (Boolean) (!(xw->flags & SMOOTHSCROLL)); + update_jumpscroll(); + +#if OPT_DEC_RECTOPS + screen->cur_decsace = 0; +#endif +#if OPT_PASTE64 || OPT_READLINE + screen->paste_brackets = OFF; +#endif +#if OPT_READLINE + screen->click1_moves = OFF; + screen->paste_moves = OFF; + screen->dclick3_deletes = OFF; + screen->paste_quotes = OFF; + screen->paste_literal_nl = OFF; +#endif /* OPT_READLINE */ + + if (screen->c132 && (saveflags & IN132COLUMNS)) { + TRACE(("Making resize-request to restore 80-columns %dx%d\n", + MaxRows(screen), MaxCols(screen))); + RequestResize(xw, MaxRows(screen), 80, True); + repairSizeHints(); + XSync(screen->display, False); /* synchronize */ + if (xtermAppPending()) + xevents(xw); + } + + CursorSet(screen, 0, 0, xw->flags); + CursorSave(xw); + } else { /* DECSTR */ + /* + * There's a tiny difference, to accommodate usage of xterm. + * We reset autowrap to the resource values rather than turning + * it off. + */ + UIntClr(xw->keyboard.flags, (MODE_DECCKM | MODE_KAM | MODE_DECKPAM)); + bitcpy(&xw->flags, xw->initflags, WRAPAROUND | REVERSEWRAP); + bitclr(&xw->flags, INSERT | INVERSE | BOLD | BLINK | UNDERLINE | INVISIBLE); + ResetItalics(xw); + if_OPT_ISO_COLORS(screen, { + reset_SGR_Colors(xw); + }); + update_appcursor(); + update_autowrap(); + update_reversewrap(); + + CursorSave(xw); + screen->sc[screen->whichBuf].row = + screen->sc[screen->whichBuf].col = 0; + } +} + +void +VTReset(XtermWidget xw, Bool full, Bool saved) +{ + ReallyReset(xw, full, saved); + + free(myState.string_area); + myState.string_area = 0; + + free(myState.print_area); + myState.print_area = 0; + + longjmp(vtjmpbuf, 1); /* force ground state in parser */ +} + +typedef enum { + ccLO, + ccDASH, + ccHI, + ccCOLON, + ccID, + ccCOMMA +} CCLASS; + +/* + * set_character_class - takes a string of the form + * + * low[-high][:id][,low[-high][:id][...]] + * + * and sets the indicated ranges to the indicated values. + */ +static int +set_character_class(char *s) +{ +#define FMT "%s in range string \"%s\" (position %d)\n" + + TRACE(("set_character_class(%s) {{\n", NonNull(s))); + if (IsEmpty(s)) { + return -1; + } else { + CCLASS state = ccLO; + int arg[3]; + int i; + int len = (int) strlen(s); + + arg[0] = + arg[1] = + arg[2] = -1; + + for (i = 0; i < len; ++i) { + int ch = CharOf(s[i]); + char *t = 0; + long value = 0; + + if (isspace(ch)) + continue; + + switch (state) { + case ccLO: + case ccHI: + case ccID: + if (!isdigit(ch)) { + xtermWarning(FMT, "missing number", s, i); + return (-1); + } + value = strtol(s + i, &t, 0); + i = (int) (t - s - 1); + break; + case ccDASH: + case ccCOLON: + case ccCOMMA: + break; + } + + switch (state) { + case ccLO: + arg[0] = + arg[1] = (int) value; + arg[2] = -1; + state = ccDASH; + break; + + case ccDASH: + if (ch == '-') { + state = ccHI; + } else { + goto parse_class; + } + break; + + case ccHI: + arg[1] = (int) value; + state = ccCOLON; + break; + + parse_class: + case ccCOLON: + if (ch == ':') { + state = ccID; + } else if (ch == ',') { + goto apply_class; + } else { + xtermWarning(FMT, "unexpected character", s, i); + return (-1); + } + break; + + case ccID: + arg[2] = (int) value; + state = ccCOMMA; + break; + + apply_class: + case ccCOMMA: + if (SetCharacterClassRange(arg[0], arg[1], arg[2]) != 0) { + xtermWarning(FMT, "bad range", s, i); + return -1; + } + state = ccLO; + break; + } + } + if (state >= ccDASH) { + if (SetCharacterClassRange(arg[0], arg[1], arg[2]) != 0) { + xtermWarning(FMT, "bad range", s, i); + return -1; + } + } + } + + TRACE(("}} set_character_class\n")); + return (0); +#undef FMT +} + +void +getKeymapResources(Widget w, + const char *mapName, + const char *mapClass, + const char *type, + void *result, + size_t size) +{ + XtResource key_resources[1]; + key_resources[0].resource_name = XtNtranslations; + key_resources[0].resource_class = XtCTranslations; + key_resources[0].resource_type = (char *) type; + key_resources[0].resource_size = (Cardinal) size; + key_resources[0].resource_offset = 0; + key_resources[0].default_type = key_resources[0].resource_type; + key_resources[0].default_addr = 0; + XtGetSubresources(w, (XtPointer) result, mapName, mapClass, + key_resources, (Cardinal) 1, NULL, (Cardinal) 0); +} + +/* ARGSUSED */ +static void +HandleKeymapChange(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + static XtTranslations keymap, original; + + TRACE(("HandleKeymapChange(%#lx, %s)\n", + (unsigned long) w, + (*param_count + ? params[0] + : "missing"))); + + if (*param_count != 1) + return; + + if (original == NULL) { + TRACE(("...saving original keymap-translations\n")); + original = w->core.tm.translations; + } + + if (strcmp(params[0], "None") == 0) { + TRACE(("...restoring original keymap-translations\n")); + XtOverrideTranslations(w, original); + } else { + char mapName[1000]; + char mapClass[1000]; + char *pmapName; + char *pmapClass; + size_t len; + + len = strlen(params[0]) + 7; + + pmapName = (char *) MyStackAlloc(len, mapName); + pmapClass = (char *) MyStackAlloc(len, mapClass); + if (pmapName == NULL + || pmapClass == NULL) { + SysError(ERROR_KMMALLOC1); + } else { + + (void) sprintf(pmapName, "%sKeymap", params[0]); + (void) strcpy(pmapClass, pmapName); + if (islower(CharOf(pmapClass[0]))) + pmapClass[0] = x_toupper(pmapClass[0]); + getKeymapResources(w, pmapName, pmapClass, XtRTranslationTable, + &keymap, sizeof(keymap)); + if (keymap != NULL) { + TRACE(("...applying keymap \"%s\"\n", pmapName)); + XtOverrideTranslations(w, keymap); + } else { + TRACE(("...found no match for keymap \"%s\"\n", pmapName)); + } + + MyStackFree(pmapName, mapName); + MyStackFree(pmapClass, mapClass); + } + } +} + +/* ARGSUSED */ +static void +HandleBell(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params, /* [0] = volume */ + Cardinal *param_count) /* 0 or 1 */ +{ + int percent = (*param_count) ? atoi(params[0]) : 0; + + Bell(term, XkbBI_TerminalBell, percent); +} + +/* ARGSUSED */ +static void +HandleVisualBell(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + VisualBell(); +} + +/* ARGSUSED */ +static void +HandleIgnore(Widget w, + XEvent *event, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + XtermWidget xw; + + TRACE(("Handle ignore for %p %s\n", + (void *) w, visibleEventType(event->type))); + if ((xw = getXtermWidget(w)) != 0) { + /* do nothing, but check for funny escape sequences */ + switch (event->type) { + case ButtonPress: + case ButtonRelease: + default: + (void) SendMousePosition(xw, event); + break; + } + } +} + +/* ARGSUSED */ +static void +DoSetSelectedFont(Widget w, + XtPointer client_data GCC_UNUSED, + Atom *selection GCC_UNUSED, + Atom *type, + XtPointer value, + unsigned long *length, + int *format) +{ + XtermWidget xw = getXtermWidget(w); + + if (xw == 0) { + xtermWarning("unexpected widget in DoSetSelectedFont\n"); + } else if (*type != XA_STRING || *format != 8) { + Bell(xw, XkbBI_MinorError, 0); + } else { + Boolean failed = False; + int oldFont = TScreenOf(xw)->menu_font_number; + char *save = TScreenOf(xw)->SelectFontName(); + char *val; + char *test; + unsigned len = (unsigned) *length; + unsigned tst; + + /* + * Some versions of X deliver null-terminated selections, some do not. + */ + for (tst = 0; tst < len; ++tst) { + if (((char *) value)[tst] == '\0') { + len = tst; + break; + } + } + + if (len > 0 && (val = TypeMallocN(char, len + 1)) != 0) { + char *used; + + memcpy(val, value, (size_t) len); + val[len] = '\0'; + used = x_strtrim(val); + TRACE(("DoSetSelectedFont(%s)\n", used)); + /* Do some sanity checking to avoid sending a long selection + back to the server in an OpenFont that is unlikely to succeed. + XLFD allows up to 255 characters and no control characters; + we are a little more liberal here. */ + if (len < 1000 + && used != 0 + && !strchr(used, '\n') + && (test = x_strdup(used)) != 0) { + TScreenOf(xw)->SelectFontName() = test; + if (!xtermLoadFont(xw, + xtermFontName(used), + True, + fontMenu_fontsel)) { + failed = True; + free(test); + TScreenOf(xw)->SelectFontName() = save; + } + } else { + failed = True; + } + if (failed) { + (void) xtermLoadFont(xw, + xtermFontName(TScreenOf(xw)->MenuFontName(oldFont)), + True, + oldFont); + Bell(xw, XkbBI_MinorError, 0); + } + free(used); + free(val); + } + } +} + +void +FindFontSelection(XtermWidget xw, const char *atom_name, Bool justprobe) +{ + TScreen *screen = TScreenOf(xw); + static AtomPtr *atoms; + static unsigned int atomCount = 0; + AtomPtr *pAtom; + unsigned a; + Atom target; + + if (!atom_name) + atom_name = ((screen->mappedSelect && atomCount) + ? screen->mappedSelect[0] + : "PRIMARY"); + TRACE(("FindFontSelection(%s)\n", atom_name)); + + for (pAtom = atoms, a = atomCount; a; a--, pAtom++) { + if (strcmp(atom_name, XmuNameOfAtom(*pAtom)) == 0) { + TRACE(("...found atom %d:%s\n", a + 1, atom_name)); + break; + } + } + if (!a) { + atoms = TypeXtReallocN(AtomPtr, atoms, atomCount + 1); + *(pAtom = &atoms[atomCount]) = XmuMakeAtom(atom_name); + ++atomCount; + TRACE(("...added atom %d:%s\n", atomCount, atom_name)); + } + + target = XmuInternAtom(XtDisplay(xw), *pAtom); + if (justprobe) { + screen->SelectFontName() = + XGetSelectionOwner(XtDisplay(xw), target) ? _Font_Selected_ : 0; + TRACE(("...selected fontname '%s'\n", + NonNull(screen->SelectFontName()))); + } else { + XtGetSelectionValue((Widget) xw, target, XA_STRING, + DoSetSelectedFont, NULL, + XtLastTimestampProcessed(XtDisplay(xw))); + } + return; +} + +Bool +set_cursor_gcs(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + VTwin *win = WhichVWin(screen); + + Pixel cc = T_COLOR(screen, TEXT_CURSOR); + Pixel fg = T_COLOR(screen, TEXT_FG); + Pixel bg = T_COLOR(screen, TEXT_BG); + Bool changed = False; + + /* + * Let's see, there are three things that have "color": + * + * background + * text + * cursorblock + * + * And, there are four situations when drawing a cursor, if we decide + * that we like have a solid block of cursor color with the letter + * that it is highlighting shown in the background color to make it + * stand out: + * + * selected window, normal video - background on cursor + * selected window, reverse video - foreground on cursor + * unselected window, normal video - foreground on background + * unselected window, reverse video - background on foreground + * + * Since the last two are really just normalGC and reverseGC, we only + * need two new GC's. Under monochrome, we get the same effect as + * above by setting cursor color to foreground. + */ + + TRACE(("set_cursor_gcs cc=%#lx, fg=%#lx, bg=%#lx\n", cc, fg, bg)); + if (win != 0 && (cc != bg)) { + Pixel xx = ((fg == cc) ? bg : cc); + + /* set the fonts to the current one */ + setCgsFont(xw, win, gcVTcursNormal, 0); + setCgsFont(xw, win, gcVTcursFilled, 0); + setCgsFont(xw, win, gcVTcursReverse, 0); + setCgsFont(xw, win, gcVTcursOutline, 0); + + /* we have a colored cursor */ + setCgsFore(xw, win, gcVTcursNormal, fg); + setCgsBack(xw, win, gcVTcursNormal, xx); + + setCgsFore(xw, win, gcVTcursFilled, xx); + setCgsBack(xw, win, gcVTcursFilled, fg); + + if (screen->always_highlight) { + /* both GC's use the same color */ + setCgsFore(xw, win, gcVTcursReverse, bg); + setCgsBack(xw, win, gcVTcursReverse, cc); + } else { + setCgsFore(xw, win, gcVTcursReverse, bg); + setCgsBack(xw, win, gcVTcursReverse, cc); + } + set_cursor_outline_gc(xw, screen->always_highlight, fg, bg, cc); + changed = True; + } + + if (changed) { + TRACE(("...set_cursor_gcs - done\n")); + } + return changed; +} + +/* + * Build up the default translations string, allowing the user to suppress + * some of the features. + */ +void +VTInitTranslations(void) +{ + /* *INDENT-OFF* */ + static struct { + Boolean wanted; + const char *name; + const char *value; + } table[] = { +#define DATA(name,value) { False, name, value } + DATA("select", +"\ + Shift Select:select-cursor-start() select-cursor-end(SELECT, CUT_BUFFER0) \n\ + Shift Insert:insert-selection(SELECT, CUT_BUFFER0) \n\ +" + ), +#if OPT_MAXIMIZE + DATA("fullscreen", +"\ + Alt Return:fullscreen() \n\ +" + ), +#endif +#if OPT_SCROLL_LOCK + DATA("scroll-lock", +"\ + Scroll_Lock:scroll-lock() \n\ +" + ), +#endif +#if OPT_SHIFT_FONTS + DATA("shift-fonts", +"\ + Shift~Ctrl KP_Add:larger-vt-font() \n\ + Shift Ctrl KP_Add:smaller-vt-font() \n\ + Shift KP_Subtract:smaller-vt-font() \n\ +" + ), +#endif + DATA("paging", +"\ + Shift Prior:scroll-back(1,halfpage) \n\ + Shift Next:scroll-forw(1,halfpage) \n\ +" + ), + /* This must be the last set mentioning "KeyPress" */ + DATA("keypress", +"\ + ~Meta :insert-seven-bit() \n\ + Meta :insert-eight-bit() \n\ +" + ), + DATA("popup-menu", +"\ + !Ctrl :popup-menu(mainMenu) \n\ + !Lock Ctrl :popup-menu(mainMenu) \n\ + !Lock Ctrl @Num_Lock :popup-menu(mainMenu) \n\ + ! @Num_Lock Ctrl :popup-menu(mainMenu) \n\ + !Ctrl :popup-menu(vtMenu) \n\ + !Lock Ctrl :popup-menu(vtMenu) \n\ + !Lock Ctrl @Num_Lock :popup-menu(vtMenu) \n\ + ! @Num_Lock Ctrl :popup-menu(vtMenu) \n\ + !Ctrl :popup-menu(fontMenu) \n\ + !Lock Ctrl :popup-menu(fontMenu) \n\ + !Lock Ctrl @Num_Lock :popup-menu(fontMenu) \n\ + ! @Num_Lock Ctrl :popup-menu(fontMenu) \n\ +" + ), + /* PROCURA added "Meta :clear-saved-lines()" */ + DATA("reset", +"\ + Meta :clear-saved-lines() \n\ +" + ), + DATA("select", +"\ + ~Meta :select-start() \n\ + ~Meta :select-extend() \n\ + ~Ctrl ~Meta :ignore() \n\ + ~Ctrl ~Meta :insert-selection(SELECT, CUT_BUFFER0) \n\ + ~Ctrl ~Meta :start-extend() \n\ + ~Meta :select-extend() \n\ + :select-end(SELECT, CUT_BUFFER0) \n\ +" + ), + DATA("wheel-mouse", +"\ + Ctrl :scroll-back(1,halfpage,m) \n\ + Lock Ctrl :scroll-back(1,halfpage,m) \n\ + Lock @Num_Lock Ctrl :scroll-back(1,halfpage,m) \n\ + @Num_Lock Ctrl :scroll-back(1,halfpage,m) \n\ + :scroll-back(5,line,m) \n\ + Ctrl :scroll-forw(1,halfpage,m) \n\ + Lock Ctrl :scroll-forw(1,halfpage,m) \n\ + Lock @Num_Lock Ctrl :scroll-forw(1,halfpage,m) \n\ + @Num_Lock Ctrl :scroll-forw(1,halfpage,m) \n\ + :scroll-forw(5,line,m) \n\ +" + ), + DATA("default", +"\ + :ignore() \n\ +" + ) + }; +#undef DATA + /* *INDENT-ON* */ + + char *result = 0; + + int pass; + Cardinal item; + + TRACE(("VTInitTranslations\n")); + for (item = 0; item < XtNumber(table); ++item) { + table[item].wanted = True; + } +#if OPT_MAXIMIZE + /* + * As a special case, allow for disabling the alt-enter translation if + * the resource settings prevent fullscreen from being used. We would + * do the same for scroll-lock and shift-fonts if they were application + * resources too, rather than in the widget. + */ + if (resource.fullscreen == esNever) { + for (item = 0; item < XtNumber(table); ++item) { + if (!strcmp(table[item].name, "fullscreen")) { + table[item].wanted = False; + TRACE(("omit(%s):\n%s\n", table[item].name, table[item].value)); + } + } + } +#endif + if (!IsEmpty(resource.omitTranslation)) { + char *value; + const char *source = resource.omitTranslation; + + while (*source != '\0' && (value = ParseList(&source)) != 0) { + size_t len = strlen(value); + + TRACE(("parsed:%s\n", value)); + for (item = 0; item < XtNumber(table); ++item) { + if (strlen(table[item].name) >= len + && x_strncasecmp(table[item].name, + value, + (unsigned) len) == 0) { + table[item].wanted = False; + TRACE(("omit(%s):\n%s\n", table[item].name, table[item].value)); + /* continue: "select", for instance is two chunks */ + } + } + free(value); + } + } + + for (pass = 0; pass < 2; ++pass) { + size_t needed = 0; + for (item = 0; item < XtNumber(table); ++item) { + if (table[item].wanted) { + if (pass) { + strcat(result, table[item].value); + } else { + needed += strlen(table[item].value) + 1; + } + } + } + if (!pass) { + result = XtMalloc((Cardinal) needed); + *result = '\0'; + } + } + + TRACE(("result:\n%s\n", result)); + + defaultTranslations = result; + free((void *) xtermClassRec.core_class.tm_table); + xtermClassRec.core_class.tm_table = result; +} + +#ifdef NO_LEAKS +void +noleaks_charproc(void) +{ + if (v_buffer != 0) + free(v_buffer); +} +#endif diff --git a/ports/xterm/xterm-359/charproc.o b/ports/xterm/xterm-359/charproc.o new file mode 100644 index 0000000000000000000000000000000000000000..480a7fa0aafdef05d41d8eb18a1e5c5606e50a65 GIT binary patch literal 660592 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%0DAybygxyI)zC}#arqj=vIZAgz`k8` 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 +#include +#include + +#include + +#define BLANK ' ' +#define UNDEF 0x2e2e /* rendered as a backwards "?" (alt: 0x2426) */ + +/* + * This module performs translation as needed to support the DEC VT220 national + * replacement character sets as well as supplementary character sets (aka + * code-pages) introduced in VT320, etc. + * + * We assume that xterm's font is based on the ISO 8859-1 (Latin 1) character + * set, which is almost the same as the DEC multinational character set. Glyph + * positions 0-31 have to be the DEC graphic characters, though. + * + * References: + * "VT220 Programmer Pocket Guide" EK-VT220-HR-002 (2nd ed., 1984), which + * contains character charts for the national character sets. + * "VT330/VT340 Programmer Reference Manual Volume 1: Text Programming" + * EK-VT3XX-TP-001 (1st ed, 1987), which contains a table (2-1) + * listing the glyphs which are mapped from the multinational + * character set to the national character set. + * + * The latter reference, though easier to read, has a few errors and omissions. + * + * According to + * Digital ANSI-Compliant Printing Protocol + * Level 2 Programming Reference Manual + * EK–PPLV2–PM. B01 + * + * the supplementary character sets Greek, Hebrew, Latin-5 and Latin/Cyrillic + * are standardized by ISO: + * ISO Greek is 8859-7 + * ISO Hebrew is 8859-8 + * ISO Latin-5 is 8859-9 + * ISO Latin/Cyrillic is 8859-5 + * + * These are derived from the data at + * ftp://www.unicode.org/Public/MAPPINGS/ISO8859/ + * + * Note: the "figure A-xx" comments refer to EK–PPLV2–PM. + */ + +/* + * A "codepage" is treated different from the NRC mode: it is always enabled. + * Reuse the UNI() macros by temporarily setting its state. + */ +#if OPT_WIDE_CHARS +#define begin_CODEPAGE() \ + if (!(xw->flags & NATIONAL)) { \ + screen->utf8_nrc_mode++; \ + } +#define end_CODEPAGE() \ + if (!(xw->flags & NATIONAL)) { \ + screen->utf8_nrc_mode--; \ + } +#else +#define begin_CODEPAGE() /* nothing */ +#define end_CODEPAGE() /* nothing */ +#endif + +/* + * xterm's original implementation of NRCS in 1998 was before Unicode became + * prevalent. Most of the necessary mappings could be done using definitions + * from X11/keysymdef.h + */ +#define map_NRCS_Dutch(code) \ + switch (code) { \ + MAP(0x23, XK_sterling); \ + MAP(0x40, XK_threequarters); \ + UNI(0x5b, 0x0133); /* ij ligature */ \ + MAP(0x5c, XK_onehalf); \ + MAP(0x5d, XK_bar); \ + MAP(0x7b, XK_diaeresis); \ + UNI(0x7c, 0x0192); /* florin */ \ + MAP(0x7d, XK_onequarter); \ + MAP(0x7e, XK_acute); \ + } + +#define map_NRCS_Finnish(code) \ + switch (code) { \ + MAP(0x5b, XK_Adiaeresis); \ + MAP(0x5c, XK_Odiaeresis); \ + MAP(0x5d, XK_Aring); \ + MAP(0x5e, XK_Udiaeresis); \ + MAP(0x60, XK_eacute); \ + MAP(0x7b, XK_adiaeresis); \ + MAP(0x7c, XK_odiaeresis); \ + MAP(0x7d, XK_aring); \ + MAP(0x7e, XK_udiaeresis); \ + } + +#define map_NRCS_French(code) \ + switch (code) { \ + MAP(0x23, XK_sterling); \ + MAP(0x40, XK_agrave); \ + MAP(0x5b, XK_degree); \ + MAP(0x5c, XK_ccedilla); \ + MAP(0x5d, XK_section); \ + MAP(0x7b, XK_eacute); \ + MAP(0x7c, XK_ugrave); \ + MAP(0x7d, XK_egrave); \ + MAP(0x7e, XK_diaeresis); \ + } + +#define map_NRCS_French_Canadian(code) \ + switch (code) { \ + MAP(0x40, XK_agrave); \ + MAP(0x5b, XK_acircumflex); \ + MAP(0x5c, XK_ccedilla); \ + MAP(0x5d, XK_ecircumflex); \ + MAP(0x5e, XK_icircumflex); \ + MAP(0x60, XK_ocircumflex); \ + MAP(0x7b, XK_eacute); \ + MAP(0x7c, XK_ugrave); \ + MAP(0x7d, XK_egrave); \ + MAP(0x7e, XK_ucircumflex); \ + } + +#define map_NRCS_German(code) \ + switch (code) { \ + MAP(0x40, XK_section); \ + MAP(0x5b, XK_Adiaeresis); \ + MAP(0x5c, XK_Odiaeresis); \ + MAP(0x5d, XK_Udiaeresis); \ + MAP(0x7b, XK_adiaeresis); \ + MAP(0x7c, XK_odiaeresis); \ + MAP(0x7d, XK_udiaeresis); \ + MAP(0x7e, XK_ssharp); \ + } + +#define map_NRCS_Italian(code) \ + switch (code) { \ + MAP(0x23, XK_sterling); \ + MAP(0x40, XK_section); \ + MAP(0x5b, XK_degree); \ + MAP(0x5c, XK_ccedilla); \ + MAP(0x5d, XK_eacute); \ + MAP(0x60, XK_ugrave); \ + MAP(0x7b, XK_agrave); \ + MAP(0x7c, XK_ograve); \ + MAP(0x7d, XK_egrave); \ + MAP(0x7e, XK_igrave); \ + } + +#define map_NRCS_Norwegian_Danish(code) \ + switch (code) { \ + MAP(0x40, XK_Adiaeresis); \ + MAP(0x5b, XK_AE); \ + MAP(0x5c, XK_Ooblique); \ + MAP(0x5d, XK_Aring); \ + MAP(0x5e, XK_Udiaeresis); \ + MAP(0x60, XK_adiaeresis); \ + MAP(0x7b, XK_ae); \ + MAP(0x7c, XK_oslash); \ + MAP(0x7d, XK_aring); \ + MAP(0x7e, XK_udiaeresis); \ + } + +#define map_NRCS_Portuguese(code) \ + switch (code) { \ + MAP(0x5b, XK_Atilde); \ + MAP(0x5c, XK_Ccedilla); \ + MAP(0x5d, XK_Otilde); \ + MAP(0x7b, XK_atilde); \ + MAP(0x7c, XK_ccedilla); \ + MAP(0x7d, XK_otilde); \ + } + +#define map_NRCS_Spanish(code) \ + switch (code) { \ + MAP(0x23, XK_sterling); \ + MAP(0x40, XK_section); \ + MAP(0x5b, XK_exclamdown); \ + MAP(0x5c, XK_Ntilde); \ + MAP(0x5d, XK_questiondown); \ + MAP(0x7b, XK_degree); \ + MAP(0x7c, XK_ntilde); \ + MAP(0x7d, XK_ccedilla); \ + } + +#define map_NRCS_Swedish(code) \ + switch (code) { \ + MAP(0x40, XK_Eacute); \ + MAP(0x5b, XK_Adiaeresis); \ + MAP(0x5c, XK_Odiaeresis); \ + MAP(0x5d, XK_Aring); \ + MAP(0x5e, XK_Udiaeresis); \ + MAP(0x60, XK_eacute); \ + MAP(0x7b, XK_adiaeresis); \ + MAP(0x7c, XK_odiaeresis); \ + MAP(0x7d, XK_aring); \ + MAP(0x7e, XK_udiaeresis); \ + } + +#define map_NRCS_Swiss(code) \ + switch (code) { \ + MAP(0x23, XK_ugrave); \ + MAP(0x40, XK_agrave); \ + MAP(0x5b, XK_eacute); \ + MAP(0x5c, XK_ccedilla); \ + MAP(0x5d, XK_ecircumflex); \ + MAP(0x5e, XK_icircumflex); \ + MAP(0x5f, XK_egrave); \ + MAP(0x60, XK_ocircumflex); \ + MAP(0x7b, XK_adiaeresis); \ + MAP(0x7c, XK_odiaeresis); \ + MAP(0x7d, XK_udiaeresis); \ + MAP(0x7e, XK_ucircumflex); \ + } + +/* + * Unlike NRCS, which splices a few characters onto ASCII, the supplementary + * character sets are complete, normally mapped to GR. Most of these mappings + * rely upon glyphs not found in ISO-8859-1. We can display most of those + * using Unicode, thereby supporting specialized applications that use SCS + * with luit, subject to the limitation that select/paste will give meaningless + * results in terms of the application which uses these mappings. + * + * Since the codepages introduced with VT320, etc, use 8-bit encodings, there + * is no plausible argument to be made that these mappings "use" UTF-8, even + * though there is a hidden step in the terminal emulator which relies upon + * UTF-8. + */ +#define map_DEC_Supp_Graphic(code,dft) \ + begin_CODEPAGE(); \ + switch (code) { \ + XXX(0x24, UNDEF); \ + XXX(0x26, UNDEF); \ + MAP(0x28, 0xa4); \ + XXX(0x2c, UNDEF); \ + XXX(0x2d, UNDEF); \ + XXX(0x2e, UNDEF); \ + XXX(0x2f, UNDEF); \ + XXX(0x34, UNDEF); \ + XXX(0x38, UNDEF); \ + XXX(0x3e, UNDEF); \ + XXX(0x50, UNDEF); \ + UNI(0x57, 0x0152); \ + MAP(0x5d, 0x0178); \ + XXX(0x5e, UNDEF); \ + XXX(0x70, UNDEF); \ + UNI(0x77, 0x0153); \ + MAP(0x7d, 0xff); \ + XXX(0x7e, UNDEF); \ + XXX(0x7f, UNDEF); \ + default: dft; break; \ + } \ + end_CODEPAGE() + +#if OPT_WIDE_CHARS + /* derived from http://www.vt100.net/charsets/technical.html */ +#define map_DEC_Technical(code) \ + begin_CODEPAGE(); \ + switch (code) { \ + UNI(0x21, 0x23b7); /* RADICAL SYMBOL BOTTOM Centred left to right, so that it joins up with 02/02 */ \ + UNI(0x22, 0x250c); /* BOX DRAWINGS LIGHT DOWN AND RIGHT */ \ + UNI(0x23, 0x2500); /* BOX DRAWINGS LIGHT HORIZONTAL */ \ + UNI(0x24, 0x2320); /* TOP HALF INTEGRAL with the proviso that the stem is vertical, to join with 02/06 */ \ + UNI(0x25, 0x2321); /* BOTTOM HALF INTEGRAL with the proviso above. */ \ + UNI(0x26, 0x2502); /* BOX DRAWINGS LIGHT VERTICAL */ \ + UNI(0x27, 0x23a1); /* LEFT SQUARE BRACKET UPPER CORNER Joins vertically to 02/06, 02/08. Doesn't join to its right. */ \ + UNI(0x28, 0x23a3); /* LEFT SQUARE BRACKET LOWER CORNER Joins vertically to 02/06, 02/07. Doesn't join to its right. */ \ + UNI(0x29, 0x23a4); /* RIGHT SQUARE BRACKET UPPER CORNER Joins vertically to 026, 02a. Doesn't join to its left. */ \ + UNI(0x2a, 0x23a6); /* RIGHT SQUARE BRACKET LOWER CORNER Joins vertically to 026, 029. Doesn't join to its left. */ \ + UNI(0x2b, 0x23a7); /* LEFT CURLY BRACKET UPPER HOOK Joins vertically to 026, 02c, 02/15. Doesn't join to its right. */ \ + UNI(0x2c, 0x23a9); /* LEFT CURLY BRACKET LOWER HOOK Joins vertically to 026, 02b, 02/15. Doesn't join to its right. */ \ + UNI(0x2d, 0x23ab); /* RIGHT CURLY BRACKET UPPER HOOK Joins vertically to 026, 02e, 03/00. Doesn't join to its left. */ \ + UNI(0x2e, 0x23ad); /* RIGHT CURLY BRACKET LOWER HOOK Joins vertically to 026, 02d, 03/00. Doesn't join to its left. */ \ + UNI(0x2f, 0x23a8); /* LEFT CURLY BRACKET MIDDLE PIECE Joins vertically to 026, 02b, 02c. */ \ + UNI(0x30, 0x23ac); /* RIGHT CURLY BRACKET MIDDLE PIECE Joins vertically to 02/06, 02d, 02e. */ \ + XXX(0x31, UNDEF); /* Top Left Sigma. Joins to right with 02/03, 03/05. Joins diagonally below right with 03/03, 03/07. */ \ + XXX(0x32, UNDEF); /* Bottom Left Sigma. Joins to right with 02/03, 03/06. Joins diagonally above right with 03/04, 03/07. */ \ + XXX(0x33, UNDEF); /* Top Diagonal Sigma. Line for joining 03/01 to 03/04 or 03/07. */ \ + XXX(0x34, UNDEF); /* Bottom Diagonal Sigma. Line for joining 03/02 to 03/03 or 03/07. */ \ + XXX(0x35, UNDEF); /* Top Right Sigma. Joins to left with 02/03, 03/01. */ \ + XXX(0x36, UNDEF); /* Bottom Right Sigma. Joins to left with 02/03, 03/02. */ \ + XXX(0x37, UNDEF); /* Middle Sigma. Joins diagonally with 03/01, 03/02, 03/03, 03/04. */ \ + XXX(0x38, UNDEF); /* undefined */ \ + XXX(0x39, UNDEF); /* undefined */ \ + XXX(0x3a, UNDEF); /* undefined */ \ + XXX(0x3b, UNDEF); /* undefined */ \ + UNI(0x3c, 0x2264); /* LESS-THAN OR EQUAL TO */ \ + UNI(0x3d, 0x2260); /* NOT EQUAL TO */ \ + UNI(0x3e, 0x2265); /* GREATER-THAN OR EQUAL TO */ \ + UNI(0x3f, 0x222B); /* INTEGRAL */ \ + UNI(0x40, 0x2234); /* THEREFORE */ \ + UNI(0x41, 0x221d); /* PROPORTIONAL TO */ \ + UNI(0x42, 0x221e); /* INFINITY */ \ + UNI(0x43, 0x00f7); /* DIVISION SIGN */ \ + UNI(0x44, 0x0394); /* GREEK CAPITAL DELTA */ \ + UNI(0x45, 0x2207); /* NABLA */ \ + UNI(0x46, 0x03a6); /* GREEK CAPITAL LETTER PHI */ \ + UNI(0x47, 0x0393); /* GREEK CAPITAL LETTER GAMMA */ \ + UNI(0x48, 0x223c); /* TILDE OPERATOR */ \ + UNI(0x49, 0x2243); /* ASYMPTOTICALLY EQUAL TO */ \ + UNI(0x4a, 0x0398); /* GREEK CAPITAL LETTER THETA */ \ + UNI(0x4b, 0x00d7); /* MULTIPLICATION SIGN */ \ + UNI(0x4c, 0x039b); /* GREEK CAPITAL LETTER LAMDA */ \ + UNI(0x4d, 0x21d4); /* LEFT RIGHT DOUBLE ARROW */ \ + UNI(0x4e, 0x21d2); /* RIGHTWARDS DOUBLE ARROW */ \ + UNI(0x4f, 0x2261); /* IDENTICAL TO */ \ + UNI(0x50, 0x03a0); /* GREEK CAPITAL LETTER PI */ \ + UNI(0x51, 0x03a8); /* GREEK CAPITAL LETTER PSI */ \ + UNI(0x52, UNDEF); /* undefined */ \ + UNI(0x53, 0x03a3); /* GREEK CAPITAL LETTER SIGMA */ \ + XXX(0x54, UNDEF); /* undefined */ \ + XXX(0x55, UNDEF); /* undefined */ \ + UNI(0x56, 0x221a); /* SQUARE ROOT */ \ + UNI(0x57, 0x03a9); /* GREEK CAPITAL LETTER OMEGA */ \ + UNI(0x58, 0x039e); /* GREEK CAPITAL LETTER XI */ \ + UNI(0x59, 0x03a5); /* GREEK CAPITAL LETTER UPSILON */ \ + UNI(0x5a, 0x2282); /* SUBSET OF */ \ + UNI(0x5b, 0x2283); /* SUPERSET OF */ \ + UNI(0x5c, 0x2229); /* INTERSECTION */ \ + UNI(0x5d, 0x222a); /* UNION */ \ + UNI(0x5e, 0x2227); /* LOGICAL AND */ \ + UNI(0x5f, 0x2228); /* LOGICAL OR */ \ + UNI(0x60, 0x00ac); /* NOT SIGN */ \ + UNI(0x61, 0x03b1); /* GREEK SMALL LETTER ALPHA */ \ + UNI(0x62, 0x03b2); /* GREEK SMALL LETTER BETA */ \ + UNI(0x63, 0x03c7); /* GREEK SMALL LETTER CHI */ \ + UNI(0x64, 0x03b4); /* GREEK SMALL LETTER DELTA */ \ + UNI(0x65, 0x03b5); /* GREEK SMALL LETTER EPSILON */ \ + UNI(0x66, 0x03c6); /* GREEK SMALL LETTER PHI */ \ + UNI(0x67, 0x03b3); /* GREEK SMALL LETTER GAMMA */ \ + UNI(0x68, 0x03b7); /* GREEK SMALL LETTER ETA */ \ + UNI(0x69, 0x03b9); /* GREEK SMALL LETTER IOTA */ \ + UNI(0x6a, 0x03b8); /* GREEK SMALL LETTER THETA */ \ + UNI(0x6b, 0x03ba); /* GREEK SMALL LETTER KAPPA */ \ + UNI(0x6c, 0x03bb); /* GREEK SMALL LETTER LAMDA */ \ + XXX(0x6d, UNDEF); /* undefined */ \ + UNI(0x6e, 0x03bd); /* GREEK SMALL LETTER NU */ \ + UNI(0x6f, 0x2202); /* PARTIAL DIFFERENTIAL */ \ + UNI(0x70, 0x03c0); /* GREEK SMALL LETTER PI */ \ + UNI(0x71, 0x03c8); /* GREEK SMALL LETTER PSI */ \ + UNI(0x72, 0x03c1); /* GREEK SMALL LETTER RHO */ \ + UNI(0x73, 0x03c3); /* GREEK SMALL LETTER SIGMA */ \ + UNI(0x74, 0x03c4); /* GREEK SMALL LETTER TAU */ \ + XXX(0x75, UNDEF); /* undefined */ \ + UNI(0x76, 0x0192); /* LATIN SMALL LETTER F WITH HOOK Probably chosen for its meaning of "function" */ \ + UNI(0x77, 0x03c9); /* GREEK SMALL LETTER OMEGA */ \ + UNI(0x78, 0x03bE); /* GREEK SMALL LETTER XI */ \ + UNI(0x79, 0x03c5); /* GREEK SMALL LETTER UPSILON */ \ + UNI(0x7a, 0x03b6); /* GREEK SMALL LETTER ZETA */ \ + UNI(0x7b, 0x2190); /* LEFTWARDS ARROW */ \ + UNI(0x7c, 0x2191); /* UPWARDS ARROW */ \ + UNI(0x7d, 0x2192); /* RIGHTWARDS ARROW */ \ + UNI(0x7e, 0x2193); /* DOWNWARDS ARROW */ \ + } \ + end_CODEPAGE() + /* ISO Latin/Cyrillic is 8859-5 */ +#define map_ISO_Latin_Cyrillic(code) \ + begin_CODEPAGE(); \ + switch (code) { \ + UNI(0x20, 0x00a0); /* NO-BREAK SPACE */ \ + UNI(0x21, 0x0401); /* CYRILLIC CAPITAL LETTER IO */ \ + UNI(0x22, 0x0402); /* CYRILLIC CAPITAL LETTER DJE */ \ + UNI(0x23, 0x0403); /* CYRILLIC CAPITAL LETTER GJE */ \ + UNI(0x24, 0x0404); /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */ \ + UNI(0x25, 0x0405); /* CYRILLIC CAPITAL LETTER DZE */ \ + UNI(0x26, 0x0406); /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ \ + UNI(0x27, 0x0407); /* CYRILLIC CAPITAL LETTER YI */ \ + UNI(0x28, 0x0408); /* CYRILLIC CAPITAL LETTER JE */ \ + UNI(0x29, 0x0409); /* CYRILLIC CAPITAL LETTER LJE */ \ + UNI(0x2a, 0x040a); /* CYRILLIC CAPITAL LETTER NJE */ \ + UNI(0x2b, 0x040b); /* CYRILLIC CAPITAL LETTER TSHE */ \ + UNI(0x2c, 0x040c); /* CYRILLIC CAPITAL LETTER KJE */ \ + UNI(0x2d, 0x00ad); /* SOFT HYPHEN */ \ + UNI(0x2e, 0x040e); /* CYRILLIC CAPITAL LETTER SHORT U */ \ + UNI(0x2f, 0x040f); /* CYRILLIC CAPITAL LETTER DZHE */ \ + UNI(0x30, 0x0410); /* CYRILLIC CAPITAL LETTER A */ \ + UNI(0x31, 0x0411); /* CYRILLIC CAPITAL LETTER BE */ \ + UNI(0x32, 0x0412); /* CYRILLIC CAPITAL LETTER VE */ \ + UNI(0x33, 0x0413); /* CYRILLIC CAPITAL LETTER GHE */ \ + UNI(0x34, 0x0414); /* CYRILLIC CAPITAL LETTER DE */ \ + UNI(0x35, 0x0415); /* CYRILLIC CAPITAL LETTER IE */ \ + UNI(0x36, 0x0416); /* CYRILLIC CAPITAL LETTER ZHE */ \ + UNI(0x37, 0x0417); /* CYRILLIC CAPITAL LETTER ZE */ \ + UNI(0x38, 0x0418); /* CYRILLIC CAPITAL LETTER I */ \ + UNI(0x39, 0x0419); /* CYRILLIC CAPITAL LETTER SHORT I */ \ + UNI(0x3a, 0x041a); /* CYRILLIC CAPITAL LETTER KA */ \ + UNI(0x3b, 0x041b); /* CYRILLIC CAPITAL LETTER EL */ \ + UNI(0x3c, 0x041c); /* CYRILLIC CAPITAL LETTER EM */ \ + UNI(0x3d, 0x041d); /* CYRILLIC CAPITAL LETTER EN */ \ + UNI(0x3e, 0x041e); /* CYRILLIC CAPITAL LETTER O */ \ + UNI(0x3f, 0x041f); /* CYRILLIC CAPITAL LETTER PE */ \ + UNI(0x40, 0x0420); /* CYRILLIC CAPITAL LETTER ER */ \ + UNI(0x41, 0x0421); /* CYRILLIC CAPITAL LETTER ES */ \ + UNI(0x42, 0x0422); /* CYRILLIC CAPITAL LETTER TE */ \ + UNI(0x43, 0x0423); /* CYRILLIC CAPITAL LETTER U */ \ + UNI(0x44, 0x0424); /* CYRILLIC CAPITAL LETTER EF */ \ + UNI(0x45, 0x0425); /* CYRILLIC CAPITAL LETTER HA */ \ + UNI(0x46, 0x0426); /* CYRILLIC CAPITAL LETTER TSE */ \ + UNI(0x47, 0x0427); /* CYRILLIC CAPITAL LETTER CHE */ \ + UNI(0x48, 0x0428); /* CYRILLIC CAPITAL LETTER SHA */ \ + UNI(0x49, 0x0429); /* CYRILLIC CAPITAL LETTER SHCHA */ \ + UNI(0x4a, 0x042a); /* CYRILLIC CAPITAL LETTER HARD SIGN */ \ + UNI(0x4b, 0x042b); /* CYRILLIC CAPITAL LETTER YERU */ \ + UNI(0x4c, 0x042c); /* CYRILLIC CAPITAL LETTER SOFT SIGN */ \ + UNI(0x4d, 0x042d); /* CYRILLIC CAPITAL LETTER E */ \ + UNI(0x4e, 0x042e); /* CYRILLIC CAPITAL LETTER YU */ \ + UNI(0x4f, 0x042f); /* CYRILLIC CAPITAL LETTER YA */ \ + UNI(0x50, 0x0430); /* CYRILLIC SMALL LETTER A */ \ + UNI(0x51, 0x0431); /* CYRILLIC SMALL LETTER BE */ \ + UNI(0x52, 0x0432); /* CYRILLIC SMALL LETTER VE */ \ + UNI(0x53, 0x0433); /* CYRILLIC SMALL LETTER GHE */ \ + UNI(0x54, 0x0434); /* CYRILLIC SMALL LETTER DE */ \ + UNI(0x55, 0x0435); /* CYRILLIC SMALL LETTER IE */ \ + UNI(0x56, 0x0436); /* CYRILLIC SMALL LETTER ZHE */ \ + UNI(0x57, 0x0437); /* CYRILLIC SMALL LETTER ZE */ \ + UNI(0x58, 0x0438); /* CYRILLIC SMALL LETTER I */ \ + UNI(0x59, 0x0439); /* CYRILLIC SMALL LETTER SHORT I */ \ + UNI(0x5a, 0x043a); /* CYRILLIC SMALL LETTER KA */ \ + UNI(0x5b, 0x043b); /* CYRILLIC SMALL LETTER EL */ \ + UNI(0x5c, 0x043c); /* CYRILLIC SMALL LETTER EM */ \ + UNI(0x5d, 0x043d); /* CYRILLIC SMALL LETTER EN */ \ + UNI(0x5e, 0x043e); /* CYRILLIC SMALL LETTER O */ \ + UNI(0x5f, 0x043f); /* CYRILLIC SMALL LETTER PE */ \ + UNI(0x60, 0x0440); /* CYRILLIC SMALL LETTER ER */ \ + UNI(0x61, 0x0441); /* CYRILLIC SMALL LETTER ES */ \ + UNI(0x62, 0x0442); /* CYRILLIC SMALL LETTER TE */ \ + UNI(0x63, 0x0443); /* CYRILLIC SMALL LETTER U */ \ + UNI(0x64, 0x0444); /* CYRILLIC SMALL LETTER EF */ \ + UNI(0x65, 0x0445); /* CYRILLIC SMALL LETTER HA */ \ + UNI(0x66, 0x0446); /* CYRILLIC SMALL LETTER TSE */ \ + UNI(0x67, 0x0447); /* CYRILLIC SMALL LETTER CHE */ \ + UNI(0x68, 0x0448); /* CYRILLIC SMALL LETTER SHA */ \ + UNI(0x69, 0x0449); /* CYRILLIC SMALL LETTER SHCHA */ \ + UNI(0x6a, 0x044a); /* CYRILLIC SMALL LETTER HARD SIGN */ \ + UNI(0x6b, 0x044b); /* CYRILLIC SMALL LETTER YERU */ \ + UNI(0x6c, 0x044c); /* CYRILLIC SMALL LETTER SOFT SIGN */ \ + UNI(0x6d, 0x044d); /* CYRILLIC SMALL LETTER E */ \ + UNI(0x6e, 0x044e); /* CYRILLIC SMALL LETTER YU */ \ + UNI(0x6f, 0x044f); /* CYRILLIC SMALL LETTER YA */ \ + UNI(0x70, 0x2116); /* NUMERO SIGN */ \ + UNI(0x71, 0x0451); /* CYRILLIC SMALL LETTER IO */ \ + UNI(0x72, 0x0452); /* CYRILLIC SMALL LETTER DJE */ \ + UNI(0x73, 0x0453); /* CYRILLIC SMALL LETTER GJE */ \ + UNI(0x74, 0x0454); /* CYRILLIC SMALL LETTER UKRAINIAN IE */ \ + UNI(0x75, 0x0455); /* CYRILLIC SMALL LETTER DZE */ \ + UNI(0x76, 0x0456); /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ \ + UNI(0x77, 0x0457); /* CYRILLIC SMALL LETTER YI */ \ + UNI(0x78, 0x0458); /* CYRILLIC SMALL LETTER JE */ \ + UNI(0x79, 0x0459); /* CYRILLIC SMALL LETTER LJE */ \ + UNI(0x7a, 0x045a); /* CYRILLIC SMALL LETTER NJE */ \ + UNI(0x7b, 0x045b); /* CYRILLIC SMALL LETTER TSHE */ \ + UNI(0x7c, 0x045c); /* CYRILLIC SMALL LETTER KJE */ \ + UNI(0x7d, 0x00a7); /* SECTION SIGN */ \ + UNI(0x7e, 0x045e); /* CYRILLIC SMALL LETTER SHORT U */ \ + UNI(0x7f, 0x045f); /* CYRILLIC SMALL LETTER DZHE */ \ + } \ + end_CODEPAGE() + /* ISO Greek is 8859-7 */ +#define map_ISO_Greek_Supp(code) \ + begin_CODEPAGE(); \ + switch (code) { \ + UNI(0x20, 0x00a0); /* NO-BREAK SPACE */ \ + UNI(0x21, 0x2018); /* LEFT SINGLE QUOTATION MARK */ \ + UNI(0x22, 0x2019); /* RIGHT SINGLE QUOTATION MARK */ \ + UNI(0x23, 0x00a3); /* POUND SIGN */ \ + UNI(0x24, 0x20ac); /* EURO SIGN */ \ + UNI(0x25, 0x20af); /* DRACHMA SIGN */ \ + UNI(0x26, 0x00a6); /* BROKEN BAR */ \ + UNI(0x27, 0x00a7); /* SECTION SIGN */ \ + UNI(0x28, 0x00a8); /* DIAERESIS */ \ + UNI(0x29, 0x00a9); /* COPYRIGHT SIGN */ \ + UNI(0x2a, 0x037a); /* GREEK YPOGEGRAMMENI */ \ + UNI(0x2b, 0x00ab); /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + UNI(0x2c, 0x00ac); /* NOT SIGN */ \ + UNI(0x2d, 0x00ad); /* SOFT HYPHEN */ \ + XXX(0x2e, UNDEF); /* undefined */ \ + UNI(0x2f, 0x2015); /* HORIZONTAL BAR */ \ + UNI(0x30, 0x00b0); /* DEGREE SIGN */ \ + UNI(0x31, 0x00b1); /* PLUS-MINUS SIGN */ \ + UNI(0x32, 0x00b2); /* SUPERSCRIPT TWO */ \ + UNI(0x33, 0x00b3); /* SUPERSCRIPT THREE */ \ + UNI(0x34, 0x0384); /* GREEK TONOS */ \ + UNI(0x35, 0x0385); /* GREEK DIALYTIKA TONOS */ \ + UNI(0x36, 0x0386); /* GREEK CAPITAL LETTER ALPHA WITH TONOS */ \ + UNI(0x37, 0x00b7); /* MIDDLE DOT */ \ + UNI(0x38, 0x0388); /* GREEK CAPITAL LETTER EPSILON WITH TONOS */ \ + UNI(0x39, 0x0389); /* GREEK CAPITAL LETTER ETA WITH TONOS */ \ + UNI(0x3a, 0x038a); /* GREEK CAPITAL LETTER IOTA WITH TONOS */ \ + UNI(0x3b, 0x00bb); /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + UNI(0x3c, 0x038c); /* GREEK CAPITAL LETTER OMICRON WITH TONOS */ \ + UNI(0x3d, 0x00bd); /* VULGAR FRACTION ONE HALF */ \ + UNI(0x3e, 0x038e); /* GREEK CAPITAL LETTER UPSILON WITH TONOS */ \ + UNI(0x3f, 0x038f); /* GREEK CAPITAL LETTER OMEGA WITH TONOS */ \ + UNI(0x40, 0x0390); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ \ + UNI(0x41, 0x0391); /* GREEK CAPITAL LETTER ALPHA */ \ + UNI(0x42, 0x0392); /* GREEK CAPITAL LETTER BETA */ \ + UNI(0x43, 0x0393); /* GREEK CAPITAL LETTER GAMMA */ \ + UNI(0x44, 0x0394); /* GREEK CAPITAL LETTER DELTA */ \ + UNI(0x45, 0x0395); /* GREEK CAPITAL LETTER EPSILON */ \ + UNI(0x46, 0x0396); /* GREEK CAPITAL LETTER ZETA */ \ + UNI(0x47, 0x0397); /* GREEK CAPITAL LETTER ETA */ \ + UNI(0x48, 0x0398); /* GREEK CAPITAL LETTER THETA */ \ + UNI(0x49, 0x0399); /* GREEK CAPITAL LETTER IOTA */ \ + UNI(0x4a, 0x039a); /* GREEK CAPITAL LETTER KAPPA */ \ + UNI(0x4b, 0x039b); /* GREEK CAPITAL LETTER LAMDA */ \ + UNI(0x4c, 0x039c); /* GREEK CAPITAL LETTER MU */ \ + UNI(0x4d, 0x039d); /* GREEK CAPITAL LETTER NU */ \ + UNI(0x4e, 0x039e); /* GREEK CAPITAL LETTER XI */ \ + UNI(0x4f, 0x039f); /* GREEK CAPITAL LETTER OMICRON */ \ + UNI(0x50, 0x03a0); /* GREEK CAPITAL LETTER PI */ \ + UNI(0x51, 0x03a1); /* GREEK CAPITAL LETTER RHO */ \ + XXX(0x52, UNDEF); /* undefined */ \ + UNI(0x53, 0x03a3); /* GREEK CAPITAL LETTER SIGMA */ \ + UNI(0x54, 0x03a4); /* GREEK CAPITAL LETTER TAU */ \ + UNI(0x55, 0x03a5); /* GREEK CAPITAL LETTER UPSILON */ \ + UNI(0x56, 0x03a6); /* GREEK CAPITAL LETTER PHI */ \ + UNI(0x57, 0x03a7); /* GREEK CAPITAL LETTER CHI */ \ + UNI(0x58, 0x03a8); /* GREEK CAPITAL LETTER PSI */ \ + UNI(0x59, 0x03a9); /* GREEK CAPITAL LETTER OMEGA */ \ + UNI(0x5a, 0x03aa); /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ \ + UNI(0x5b, 0x03ab); /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ \ + UNI(0x5c, 0x03ac); /* GREEK SMALL LETTER ALPHA WITH TONOS */ \ + UNI(0x5d, 0x03ad); /* GREEK SMALL LETTER EPSILON WITH TONOS */ \ + UNI(0x5e, 0x03ae); /* GREEK SMALL LETTER ETA WITH TONOS */ \ + UNI(0x5f, 0x03af); /* GREEK SMALL LETTER IOTA WITH TONOS */ \ + UNI(0x60, 0x03b0); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ \ + UNI(0x61, 0x03b1); /* GREEK SMALL LETTER ALPHA */ \ + UNI(0x62, 0x03b2); /* GREEK SMALL LETTER BETA */ \ + UNI(0x63, 0x03b3); /* GREEK SMALL LETTER GAMMA */ \ + UNI(0x64, 0x03b4); /* GREEK SMALL LETTER DELTA */ \ + UNI(0x65, 0x03b5); /* GREEK SMALL LETTER EPSILON */ \ + UNI(0x66, 0x03b6); /* GREEK SMALL LETTER ZETA */ \ + UNI(0x67, 0x03b7); /* GREEK SMALL LETTER ETA */ \ + UNI(0x68, 0x03b8); /* GREEK SMALL LETTER THETA */ \ + UNI(0x69, 0x03b9); /* GREEK SMALL LETTER IOTA */ \ + UNI(0x6a, 0x03ba); /* GREEK SMALL LETTER KAPPA */ \ + UNI(0x6b, 0x03bb); /* GREEK SMALL LETTER LAMDA */ \ + UNI(0x6c, 0x03bc); /* GREEK SMALL LETTER MU */ \ + UNI(0x6d, 0x03bd); /* GREEK SMALL LETTER NU */ \ + UNI(0x6e, 0x03be); /* GREEK SMALL LETTER XI */ \ + UNI(0x6f, 0x03bf); /* GREEK SMALL LETTER OMICRON */ \ + UNI(0x70, 0x03c0); /* GREEK SMALL LETTER PI */ \ + UNI(0x71, 0x03c1); /* GREEK SMALL LETTER RHO */ \ + UNI(0x72, 0x03c2); /* GREEK SMALL LETTER FINAL SIGMA */ \ + UNI(0x73, 0x03c3); /* GREEK SMALL LETTER SIGMA */ \ + UNI(0x74, 0x03c4); /* GREEK SMALL LETTER TAU */ \ + UNI(0x75, 0x03c5); /* GREEK SMALL LETTER UPSILON */ \ + UNI(0x76, 0x03c6); /* GREEK SMALL LETTER PHI */ \ + UNI(0x77, 0x03c7); /* GREEK SMALL LETTER CHI */ \ + UNI(0x78, 0x03c8); /* GREEK SMALL LETTER PSI */ \ + UNI(0x79, 0x03c9); /* GREEK SMALL LETTER OMEGA */ \ + UNI(0x7a, 0x03ca); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */ \ + UNI(0x7b, 0x03cb); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ \ + UNI(0x7c, 0x03cc); /* GREEK SMALL LETTER OMICRON WITH TONOS */ \ + UNI(0x7d, 0x03cd); /* GREEK SMALL LETTER UPSILON WITH TONOS */ \ + UNI(0x7e, 0x03ce); /* GREEK SMALL LETTER OMEGA WITH TONOS */ \ + } \ + end_CODEPAGE() + /* figure A-23 "ISO Latin-Hebrew Supplemental Character Set" */ +#define map_ISO_Hebrew(code) \ + begin_CODEPAGE(); \ + switch (code) { \ + UNI(0x20, 0x00a0); /* NO-BREAK SPACE */ \ + XXX(0x21, UNDEF); /* undefined */ \ + UNI(0x22, 0x00a2); /* CENT SIGN */ \ + UNI(0x23, 0x00a3); /* POUND SIGN */ \ + UNI(0x24, 0x00a4); /* CURRENCY SIGN */ \ + UNI(0x25, 0x00a5); /* YEN SIGN */ \ + UNI(0x26, 0x00a6); /* BROKEN BAR */ \ + UNI(0x27, 0x00a7); /* SECTION SIGN */ \ + UNI(0x28, 0x00a8); /* DIAERESIS */ \ + UNI(0x29, 0x00a9); /* COPYRIGHT SIGN */ \ + UNI(0x2a, 0x00d7); /* MULTIPLICATION SIGN */ \ + UNI(0x2b, 0x00ab); /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + UNI(0x2c, 0x00ac); /* NOT SIGN */ \ + UNI(0x2d, 0x00ad); /* SOFT HYPHEN */ \ + UNI(0x2e, 0x00ae); /* REGISTERED SIGN */ \ + UNI(0x2f, 0x00af); /* MACRON */ \ + UNI(0x30, 0x00b0); /* DEGREE SIGN */ \ + UNI(0x31, 0x00b1); /* PLUS-MINUS SIGN */ \ + UNI(0x32, 0x00b2); /* SUPERSCRIPT TWO */ \ + UNI(0x33, 0x00b3); /* SUPERSCRIPT THREE */ \ + UNI(0x34, 0x00b4); /* ACUTE ACCENT */ \ + UNI(0x35, 0x00b5); /* MICRO SIGN */ \ + UNI(0x36, 0x00b6); /* PILCROW SIGN */ \ + UNI(0x37, 0x00b7); /* MIDDLE DOT */ \ + UNI(0x38, 0x00b8); /* CEDILLA */ \ + UNI(0x39, 0x00b9); /* SUPERSCRIPT ONE */ \ + UNI(0x3a, 0x00f7); /* DIVISION SIGN */ \ + UNI(0x3b, 0x00bb); /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + UNI(0x3c, 0x00bc); /* VULGAR FRACTION ONE QUARTER */ \ + UNI(0x3d, 0x00bd); /* VULGAR FRACTION ONE HALF */ \ + UNI(0x3e, 0x00be); /* VULGAR FRACTION THREE QUARTERS */ \ + XXX(0x3f, UNDEF); /* undefined */ \ + XXX(0x40, UNDEF); /* undefined */ \ + XXX(0x41, UNDEF); /* undefined */ \ + XXX(0x42, UNDEF); /* undefined */ \ + XXX(0x43, UNDEF); /* undefined */ \ + XXX(0x44, UNDEF); /* undefined */ \ + XXX(0x45, UNDEF); /* undefined */ \ + XXX(0x46, UNDEF); /* undefined */ \ + XXX(0x47, UNDEF); /* undefined */ \ + XXX(0x48, UNDEF); /* undefined */ \ + XXX(0x49, UNDEF); /* undefined */ \ + XXX(0x4a, UNDEF); /* undefined */ \ + XXX(0x4b, UNDEF); /* undefined */ \ + XXX(0x4c, UNDEF); /* undefined */ \ + XXX(0x4d, UNDEF); /* undefined */ \ + XXX(0x4e, UNDEF); /* undefined */ \ + XXX(0x4f, UNDEF); /* undefined */ \ + XXX(0x50, UNDEF); /* undefined */ \ + XXX(0x51, UNDEF); /* undefined */ \ + XXX(0x52, UNDEF); /* undefined */ \ + XXX(0x53, UNDEF); /* undefined */ \ + XXX(0x54, UNDEF); /* undefined */ \ + XXX(0x55, UNDEF); /* undefined */ \ + XXX(0x56, UNDEF); /* undefined */ \ + XXX(0x57, UNDEF); /* undefined */ \ + XXX(0x58, UNDEF); /* undefined */ \ + XXX(0x59, UNDEF); /* undefined */ \ + XXX(0x5a, UNDEF); /* undefined */ \ + XXX(0x5b, UNDEF); /* undefined */ \ + XXX(0x5c, UNDEF); /* undefined */ \ + XXX(0x5d, UNDEF); /* undefined */ \ + XXX(0x5e, UNDEF); /* undefined */ \ + UNI(0x5f, 0x2017); /* DOUBLE LOW LINE */ \ + UNI(0x60, 0x05d0); /* HEBREW LETTER ALEF */ \ + UNI(0x61, 0x05d1); /* HEBREW LETTER BET */ \ + UNI(0x62, 0x05d2); /* HEBREW LETTER GIMEL */ \ + UNI(0x63, 0x05d3); /* HEBREW LETTER DALET */ \ + UNI(0x64, 0x05d4); /* HEBREW LETTER HE */ \ + UNI(0x65, 0x05d5); /* HEBREW LETTER VAV */ \ + UNI(0x66, 0x05d6); /* HEBREW LETTER ZAYIN */ \ + UNI(0x67, 0x05d7); /* HEBREW LETTER HET */ \ + UNI(0x68, 0x05d8); /* HEBREW LETTER TET */ \ + UNI(0x69, 0x05d9); /* HEBREW LETTER YOD */ \ + UNI(0x6a, 0x05da); /* HEBREW LETTER FINAL KAF */ \ + UNI(0x6b, 0x05db); /* HEBREW LETTER KAF */ \ + UNI(0x6c, 0x05dc); /* HEBREW LETTER LAMED */ \ + UNI(0x6d, 0x05dd); /* HEBREW LETTER FINAL MEM */ \ + UNI(0x6e, 0x05de); /* HEBREW LETTER MEM */ \ + UNI(0x6f, 0x05df); /* HEBREW LETTER FINAL NUN */ \ + UNI(0x70, 0x05e0); /* HEBREW LETTER NUN */ \ + UNI(0x71, 0x05e1); /* HEBREW LETTER SAMEKH */ \ + UNI(0x72, 0x05e2); /* HEBREW LETTER AYIN */ \ + UNI(0x73, 0x05e3); /* HEBREW LETTER FINAL PE */ \ + UNI(0x74, 0x05e4); /* HEBREW LETTER PE */ \ + UNI(0x75, 0x05e5); /* HEBREW LETTER FINAL TSADI */ \ + UNI(0x76, 0x05e6); /* HEBREW LETTER TSADI */ \ + UNI(0x77, 0x05e7); /* HEBREW LETTER QOF */ \ + UNI(0x78, 0x05e8); /* HEBREW LETTER RESH */ \ + UNI(0x79, 0x05e9); /* HEBREW LETTER SHIN */ \ + UNI(0x7a, 0x05ea); /* HEBREW LETTER TAV */ \ + XXX(0x7b, UNDEF); /* undefined */ \ + XXX(0x7c, UNDEF); /* undefined */ \ + UNI(0x7d, 0x200e); /* LEFT-TO-RIGHT MARK */ \ + UNI(0x7e, 0x200f); /* RIGHT-TO-LEFT MARK */ \ + } \ + end_CODEPAGE() + /* ISO Latin-5 is 8859-9 */ +#define map_ISO_Latin_5(code) \ + begin_CODEPAGE(); \ + switch (code) { \ + UNI(0x20, 0x00a0); /* NO-BREAK SPACE */ \ + UNI(0x21, 0x00a1); /* INVERTED EXCLAMATION MARK */ \ + UNI(0x22, 0x00a2); /* CENT SIGN */ \ + UNI(0x23, 0x00a3); /* POUND SIGN */ \ + UNI(0x24, 0x00a4); /* CURRENCY SIGN */ \ + UNI(0x25, 0x00a5); /* YEN SIGN */ \ + UNI(0x26, 0x00a6); /* BROKEN BAR */ \ + UNI(0x27, 0x00a7); /* SECTION SIGN */ \ + UNI(0x28, 0x00a8); /* DIAERESIS */ \ + UNI(0x29, 0x00a9); /* COPYRIGHT SIGN */ \ + UNI(0x2a, 0x00aa); /* FEMININE ORDINAL INDICATOR */ \ + UNI(0x2b, 0x00ab); /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + UNI(0x2c, 0x00ac); /* NOT SIGN */ \ + UNI(0x2d, 0x00ad); /* SOFT HYPHEN */ \ + UNI(0x2e, 0x00ae); /* REGISTERED SIGN */ \ + UNI(0x2f, 0x00af); /* MACRON */ \ + UNI(0x30, 0x00b0); /* DEGREE SIGN */ \ + UNI(0x31, 0x00b1); /* PLUS-MINUS SIGN */ \ + UNI(0x32, 0x00b2); /* SUPERSCRIPT TWO */ \ + UNI(0x33, 0x00b3); /* SUPERSCRIPT THREE */ \ + UNI(0x34, 0x00b4); /* ACUTE ACCENT */ \ + UNI(0x35, 0x00b5); /* MICRO SIGN */ \ + UNI(0x36, 0x00b6); /* PILCROW SIGN */ \ + UNI(0x37, 0x00b7); /* MIDDLE DOT */ \ + UNI(0x38, 0x00b8); /* CEDILLA */ \ + UNI(0x39, 0x00b9); /* SUPERSCRIPT ONE */ \ + UNI(0x3a, 0x00ba); /* MASCULINE ORDINAL INDICATOR */ \ + UNI(0x3b, 0x00bb); /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + UNI(0x3c, 0x00bc); /* VULGAR FRACTION ONE QUARTER */ \ + UNI(0x3d, 0x00bd); /* VULGAR FRACTION ONE HALF */ \ + UNI(0x3e, 0x00be); /* VULGAR FRACTION THREE QUARTERS */ \ + UNI(0x3f, 0x00bf); /* INVERTED QUESTION MARK */ \ + UNI(0x40, 0x00c0); /* LATIN CAPITAL LETTER A WITH GRAVE */ \ + UNI(0x41, 0x00c1); /* LATIN CAPITAL LETTER A WITH ACUTE */ \ + UNI(0x42, 0x00c2); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ \ + UNI(0x43, 0x00c3); /* LATIN CAPITAL LETTER A WITH TILDE */ \ + UNI(0x44, 0x00c4); /* LATIN CAPITAL LETTER A WITH DIAERESIS */ \ + UNI(0x45, 0x00c5); /* LATIN CAPITAL LETTER A WITH RING ABOVE */ \ + UNI(0x46, 0x00c6); /* LATIN CAPITAL LETTER AE */ \ + UNI(0x47, 0x00c7); /* LATIN CAPITAL LETTER C WITH CEDILLA */ \ + UNI(0x48, 0x00c8); /* LATIN CAPITAL LETTER E WITH GRAVE */ \ + UNI(0x49, 0x00c9); /* LATIN CAPITAL LETTER E WITH ACUTE */ \ + UNI(0x4a, 0x00ca); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ \ + UNI(0x4b, 0x00cb); /* LATIN CAPITAL LETTER E WITH DIAERESIS */ \ + UNI(0x4c, 0x00cc); /* LATIN CAPITAL LETTER I WITH GRAVE */ \ + UNI(0x4d, 0x00cd); /* LATIN CAPITAL LETTER I WITH ACUTE */ \ + UNI(0x4e, 0x00ce); /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ \ + UNI(0x4f, 0x00cf); /* LATIN CAPITAL LETTER I WITH DIAERESIS */ \ + UNI(0x50, 0x011e); /* LATIN CAPITAL LETTER G WITH BREVE */ \ + UNI(0x51, 0x00d1); /* LATIN CAPITAL LETTER N WITH TILDE */ \ + UNI(0x52, 0x00d2); /* LATIN CAPITAL LETTER O WITH GRAVE */ \ + UNI(0x53, 0x00d3); /* LATIN CAPITAL LETTER O WITH ACUTE */ \ + UNI(0x54, 0x00d4); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ \ + UNI(0x55, 0x00d5); /* LATIN CAPITAL LETTER O WITH TILDE */ \ + UNI(0x56, 0x00d6); /* LATIN CAPITAL LETTER O WITH DIAERESIS */ \ + UNI(0x57, 0x00d7); /* MULTIPLICATION SIGN */ \ + UNI(0x58, 0x00d8); /* LATIN CAPITAL LETTER O WITH STROKE */ \ + UNI(0x59, 0x00d9); /* LATIN CAPITAL LETTER U WITH GRAVE */ \ + UNI(0x5a, 0x00da); /* LATIN CAPITAL LETTER U WITH ACUTE */ \ + UNI(0x5b, 0x00db); /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ \ + UNI(0x5c, 0x00dc); /* LATIN CAPITAL LETTER U WITH DIAERESIS */ \ + UNI(0x5d, 0x0130); /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ \ + UNI(0x5e, 0x015e); /* LATIN CAPITAL LETTER S WITH CEDILLA */ \ + UNI(0x5f, 0x00df); /* LATIN SMALL LETTER SHARP S */ \ + UNI(0x60, 0x00e0); /* LATIN SMALL LETTER A WITH GRAVE */ \ + UNI(0x61, 0x00e1); /* LATIN SMALL LETTER A WITH ACUTE */ \ + UNI(0x62, 0x00e2); /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ \ + UNI(0x63, 0x00e3); /* LATIN SMALL LETTER A WITH TILDE */ \ + UNI(0x64, 0x00e4); /* LATIN SMALL LETTER A WITH DIAERESIS */ \ + UNI(0x65, 0x00e5); /* LATIN SMALL LETTER A WITH RING ABOVE */ \ + UNI(0x66, 0x00e6); /* LATIN SMALL LETTER AE */ \ + UNI(0x67, 0x00e7); /* LATIN SMALL LETTER C WITH CEDILLA */ \ + UNI(0x68, 0x00e8); /* LATIN SMALL LETTER E WITH GRAVE */ \ + UNI(0x69, 0x00e9); /* LATIN SMALL LETTER E WITH ACUTE */ \ + UNI(0x6a, 0x00ea); /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ \ + UNI(0x6b, 0x00eb); /* LATIN SMALL LETTER E WITH DIAERESIS */ \ + UNI(0x6c, 0x00ec); /* LATIN SMALL LETTER I WITH GRAVE */ \ + UNI(0x6d, 0x00ed); /* LATIN SMALL LETTER I WITH ACUTE */ \ + UNI(0x6e, 0x00ee); /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ \ + UNI(0x6f, 0x00ef); /* LATIN SMALL LETTER I WITH DIAERESIS */ \ + UNI(0x70, 0x011f); /* LATIN SMALL LETTER G WITH BREVE */ \ + UNI(0x71, 0x00f1); /* LATIN SMALL LETTER N WITH TILDE */ \ + UNI(0x72, 0x00f2); /* LATIN SMALL LETTER O WITH GRAVE */ \ + UNI(0x73, 0x00f3); /* LATIN SMALL LETTER O WITH ACUTE */ \ + UNI(0x74, 0x00f4); /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ \ + UNI(0x75, 0x00f5); /* LATIN SMALL LETTER O WITH TILDE */ \ + UNI(0x76, 0x00f6); /* LATIN SMALL LETTER O WITH DIAERESIS */ \ + UNI(0x77, 0x00f7); /* DIVISION SIGN */ \ + UNI(0x78, 0x00f8); /* LATIN SMALL LETTER O WITH STROKE */ \ + UNI(0x79, 0x00f9); /* LATIN SMALL LETTER U WITH GRAVE */ \ + UNI(0x7a, 0x00fa); /* LATIN SMALL LETTER U WITH ACUTE */ \ + UNI(0x7b, 0x00fb); /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ \ + UNI(0x7c, 0x00fc); /* LATIN SMALL LETTER U WITH DIAERESIS */ \ + UNI(0x7d, 0x0131); /* LATIN SMALL LETTER DOTLESS I */ \ + UNI(0x7e, 0x015f); /* LATIN SMALL LETTER S WITH CEDILLA */ \ + UNI(0x7f, 0x00ff); /* LATIN SMALL LETTER Y WITH DIAERESIS */ \ + } \ + end_CODEPAGE() + /* DEC Cyrillic from screenshot */ +#define map_DEC_Cyrillic(code) \ + begin_CODEPAGE(); \ + switch (code) { \ + UNI(0x20, 0x00a0); /* NO-BREAK SPACE */ \ + XXX(0x21, UNDEF); /* undefined */ \ + XXX(0x22, UNDEF); /* undefined */ \ + XXX(0x23, UNDEF); /* undefined */ \ + XXX(0x24, UNDEF); /* undefined */ \ + XXX(0x25, UNDEF); /* undefined */ \ + XXX(0x26, UNDEF); /* undefined */ \ + XXX(0x27, UNDEF); /* undefined */ \ + XXX(0x28, UNDEF); /* undefined */ \ + XXX(0x29, UNDEF); /* undefined */ \ + XXX(0x2a, UNDEF); /* undefined */ \ + XXX(0x2b, UNDEF); /* undefined */ \ + XXX(0x2c, UNDEF); /* undefined */ \ + XXX(0x2d, UNDEF); /* undefined */ \ + XXX(0x2e, UNDEF); /* undefined */ \ + XXX(0x2f, UNDEF); /* undefined */ \ + XXX(0x30, UNDEF); /* undefined */ \ + XXX(0x31, UNDEF); /* undefined */ \ + XXX(0x32, UNDEF); /* undefined */ \ + XXX(0x33, UNDEF); /* undefined */ \ + XXX(0x34, UNDEF); /* undefined */ \ + XXX(0x35, UNDEF); /* undefined */ \ + XXX(0x36, UNDEF); /* undefined */ \ + XXX(0x37, UNDEF); /* undefined */ \ + XXX(0x38, UNDEF); /* undefined */ \ + XXX(0x39, UNDEF); /* undefined */ \ + XXX(0x3a, UNDEF); /* undefined */ \ + XXX(0x3b, UNDEF); /* undefined */ \ + XXX(0x3c, UNDEF); /* undefined */ \ + XXX(0x3d, UNDEF); /* undefined */ \ + XXX(0x3e, UNDEF); /* undefined */ \ + XXX(0x3f, UNDEF); /* undefined */ \ + \ + UNI(0x40, 0x044e); /* CYRILLIC SMALL LETTER YU */ \ + UNI(0x41, 0x0430); /* CYRILLIC SMALL LETTER A */ \ + UNI(0x42, 0x0431); /* CYRILLIC SMALL LETTER BE */ \ + UNI(0x43, 0x0446); /* CYRILLIC SMALL LETTER TSE */ \ + UNI(0x44, 0x0434); /* CYRILLIC SMALL LETTER DE */ \ + UNI(0x45, 0x0435); /* CYRILLIC SMALL LETTER IE */ \ + UNI(0x46, 0x0444); /* CYRILLIC SMALL LETTER EF */ \ + UNI(0x47, 0x0433); /* CYRILLIC SMALL LETTER GHE */ \ + UNI(0x48, 0x0445); /* CYRILLIC SMALL LETTER HA */ \ + UNI(0x49, 0x0438); /* CYRILLIC SMALL LETTER I */ \ + UNI(0x4a, 0x0439); /* CYRILLIC SMALL LETTER SHORT I */ \ + UNI(0x4b, 0x043a); /* CYRILLIC SMALL LETTER KA */ \ + UNI(0x4c, 0x043b); /* CYRILLIC SMALL LETTER EL */ \ + UNI(0x4d, 0x043c); /* CYRILLIC SMALL LETTER EM */ \ + UNI(0x4e, 0x043d); /* CYRILLIC SMALL LETTER EN */ \ + UNI(0x4f, 0x043e); /* CYRILLIC SMALL LETTER O */ \ + UNI(0x50, 0x043f); /* CYRILLIC SMALL LETTER PE */ \ + UNI(0x51, 0x044f); /* CYRILLIC SMALL LETTER YA */ \ + UNI(0x52, 0x0440); /* CYRILLIC SMALL LETTER ER */ \ + UNI(0x53, 0x0441); /* CYRILLIC SMALL LETTER ES */ \ + UNI(0x54, 0x0442); /* CYRILLIC SMALL LETTER TE */ \ + UNI(0x55, 0x0443); /* CYRILLIC SMALL LETTER U */ \ + UNI(0x56, 0x0436); /* CYRILLIC SMALL LETTER ZHE */ \ + UNI(0x57, 0x0432); /* CYRILLIC SMALL LETTER VE */ \ + UNI(0x58, 0x044c); /* CYRILLIC SMALL LETTER SOFT SIGN */ \ + UNI(0x59, 0x044b); /* CYRILLIC SMALL LETTER YERU */ \ + UNI(0x5a, 0x0437); /* CYRILLIC SMALL LETTER ZE */ \ + UNI(0x5b, 0x0448); /* CYRILLIC SMALL LETTER SHA */ \ + UNI(0x5c, 0x044d); /* CYRILLIC SMALL LETTER E */ \ + UNI(0x5d, 0x0449); /* CYRILLIC SMALL LETTER SHCHA */ \ + UNI(0x5e, 0x0447); /* CYRILLIC SMALL LETTER CHE */ \ + UNI(0x5f, 0x044a); /* CYRILLIC SMALL LETTER HARD SIGN */ \ + \ + UNI(0x60, 0x042e); /* CYRILLIC CAPITAL LETTER YU */ \ + UNI(0x61, 0x0410); /* CYRILLIC CAPITAL LETTER A */ \ + UNI(0x62, 0x0411); /* CYRILLIC CAPITAL LETTER BE */ \ + UNI(0x63, 0x0426); /* CYRILLIC CAPITAL LETTER TSE */ \ + UNI(0x64, 0x0414); /* CYRILLIC CAPITAL LETTER DE */ \ + UNI(0x65, 0x0415); /* CYRILLIC CAPITAL LETTER IE */ \ + UNI(0x66, 0x0424); /* CYRILLIC CAPITAL LETTER EF */ \ + UNI(0x67, 0x0413); /* CYRILLIC CAPITAL LETTER GHE */ \ + UNI(0x68, 0x0425); /* CYRILLIC CAPITAL LETTER HA */ \ + UNI(0x69, 0x0418); /* CYRILLIC CAPITAL LETTER I */ \ + UNI(0x6a, 0x0419); /* CYRILLIC CAPITAL LETTER SHORT I */ \ + UNI(0x6b, 0x041a); /* CYRILLIC CAPITAL LETTER KA */ \ + UNI(0x6c, 0x041b); /* CYRILLIC CAPITAL LETTER EL */ \ + UNI(0x6d, 0x041c); /* CYRILLIC CAPITAL LETTER EM */ \ + UNI(0x6e, 0x041d); /* CYRILLIC CAPITAL LETTER EN */ \ + UNI(0x6f, 0x041e); /* CYRILLIC CAPITAL LETTER O */ \ + UNI(0x70, 0x041f); /* CYRILLIC CAPITAL LETTER PE */ \ + UNI(0x71, 0x042f); /* CYRILLIC CAPITAL LETTER YA */ \ + UNI(0x72, 0x0420); /* CYRILLIC CAPITAL LETTER ER */ \ + UNI(0x73, 0x0421); /* CYRILLIC CAPITAL LETTER ES */ \ + UNI(0x74, 0x0422); /* CYRILLIC CAPITAL LETTER TE */ \ + UNI(0x75, 0x0423); /* CYRILLIC CAPITAL LETTER U */ \ + UNI(0x76, 0x0416); /* CYRILLIC CAPITAL LETTER ZHE */ \ + UNI(0x77, 0x0412); /* CYRILLIC CAPITAL LETTER VE */ \ + UNI(0x78, 0x042c); /* CYRILLIC CAPITAL LETTER SOFT SIGN */ \ + UNI(0x79, 0x042b); /* CYRILLIC CAPITAL LETTER YERU */ \ + UNI(0x7a, 0x0417); /* CYRILLIC CAPITAL LETTER ZE */ \ + UNI(0x7b, 0x0428); /* CYRILLIC CAPITAL LETTER SHA */ \ + UNI(0x7c, 0x042d); /* CYRILLIC CAPITAL LETTER E */ \ + UNI(0x7d, 0x0429); /* CYRILLIC CAPITAL LETTER SHCHA */ \ + UNI(0x7e, 0x0427); /* CYRILLIC CAPITAL LETTER CHE */ \ + UNI(0x7f, 0x042a); /* CYRILLIC CAPITAL LETTER HARD SIGN */ \ + \ + } \ + end_CODEPAGE() + /* figure A-24 "DEC Greek Supplemental Character Set" */ +#define map_DEC_Greek_Supp(code) \ + begin_CODEPAGE(); \ + switch (code) { \ + MAP(0x20, 0x00a0); /* NO-BREAK SPACE */ \ + UNI(0x21, 0x00a1); /* LEFT SINGLE QUOTATION MARK */ \ + UNI(0x22, 0x00a2); /* RIGHT SINGLE QUOTATION MARK */ \ + UNI(0x23, 0x00a3); /* POUND SIGN */ \ + XXX(0x24, UNDEF); /* EURO SIGN */ \ + UNI(0x25, 0x00a5); /* YEN SIGN */ \ + XXX(0x26, UNDEF); /* BROKEN BAR */ \ + UNI(0x27, 0x00a7); /* SECTION SIGN */ \ + UNI(0x28, 0x00a4); /* CURRENCY SIGN */ \ + UNI(0x29, 0x00a9); /* COPYRIGHT SIGN */ \ + UNI(0x2a, 0x00aa); /* FEMININE ORDINAL INDICATOR */ \ + UNI(0x2b, 0x00ab); /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + XXX(0x2c, UNDEF); /* reserved */ \ + XXX(0x2d, UNDEF); /* reserved */ \ + XXX(0x2e, UNDEF); /* reserved */ \ + XXX(0x2f, UNDEF); /* reserved */ \ + UNI(0x30, 0x00b0); /* DEGREE SIGN */ \ + UNI(0x31, 0x00b1); /* PLUS-MINUS SIGN */ \ + UNI(0x32, 0x00b2); /* SUPERSCRIPT TWO */ \ + UNI(0x33, 0x00b3); /* SUPERSCRIPT THREE */ \ + XXX(0x34, UNDEF); /* reserved */ \ + UNI(0x35, 0x00b5); /* MICRO SIGN */ \ + UNI(0x36, 0x00b6); /* PILCROW SIGN */ \ + UNI(0x37, 0x00b7); /* MIDDLE DOT */ \ + XXX(0x38, UNDEF); /* reserved */ \ + UNI(0x39, 0x00b9); /* SUPERSCRIPT ONE */ \ + UNI(0x3a, 0x00ba); /* MASCULINE ORDINAL INDICATOR */ \ + UNI(0x3b, 0x00bb); /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + UNI(0x3c, 0x00bc); /* VULGAR FRACTION ONE QUARTER */ \ + UNI(0x3d, 0x00bd); /* VULGAR FRACTION ONE HALF */ \ + XXX(0x3e, UNDEF); /* reserved */ \ + UNI(0x3f, 0x00BF); /* INVERTED QUESTION MARK */ \ + UNI(0x40, 0x03ca); /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */ \ + UNI(0x41, 0x0391); /* GREEK CAPITAL LETTER ALPHA */ \ + UNI(0x42, 0x0392); /* GREEK CAPITAL LETTER BETA */ \ + UNI(0x43, 0x0393); /* GREEK CAPITAL LETTER GAMMA */ \ + UNI(0x44, 0x0394); /* GREEK CAPITAL LETTER DELTA */ \ + UNI(0x45, 0x0395); /* GREEK CAPITAL LETTER EPSILON */ \ + UNI(0x46, 0x0396); /* GREEK CAPITAL LETTER ZETA */ \ + UNI(0x47, 0x0397); /* GREEK CAPITAL LETTER ETA */ \ + UNI(0x48, 0x0398); /* GREEK CAPITAL LETTER THETA */ \ + UNI(0x49, 0x0399); /* GREEK CAPITAL LETTER IOTA */ \ + UNI(0x4a, 0x039a); /* GREEK CAPITAL LETTER KAPPA */ \ + UNI(0x4b, 0x039b); /* GREEK CAPITAL LETTER LAMDA */ \ + UNI(0x4c, 0x039c); /* GREEK CAPITAL LETTER MU */ \ + UNI(0x4d, 0x039d); /* GREEK CAPITAL LETTER NU */ \ + UNI(0x4e, 0x039e); /* GREEK CAPITAL LETTER XI */ \ + UNI(0x4f, 0x039f); /* GREEK CAPITAL LETTER OMICRON */ \ + XXX(0x50, UNDEF); /* reserved */ \ + UNI(0x51, 0x03a0); /* GREEK CAPITAL LETTER PI */ \ + UNI(0x52, 0x03a1); /* GREEK CAPITAL LETTER RHO */ \ + UNI(0x53, 0x03a3); /* GREEK CAPITAL LETTER SIGMA */ \ + UNI(0x54, 0x03a4); /* GREEK CAPITAL LETTER TAU */ \ + UNI(0x55, 0x03a5); /* GREEK CAPITAL LETTER UPSILON */ \ + UNI(0x56, 0x03a6); /* GREEK CAPITAL LETTER PHI */ \ + UNI(0x57, 0x03a7); /* GREEK CAPITAL LETTER CHI */ \ + UNI(0x58, 0x03a8); /* GREEK CAPITAL LETTER PSI */ \ + UNI(0x59, 0x03a9); /* GREEK CAPITAL LETTER OMEGA */ \ + UNI(0x5a, 0x03ac); /* GREEK SMALL LETTER ALPHA WITH TONOS */ \ + UNI(0x5b, 0x03ad); /* GREEK SMALL LETTER EPSILON WITH TONOS */ \ + UNI(0x5c, 0x03ae); /* GREEK SMALL LETTER ETA WITH TONOS */ \ + UNI(0x5d, 0x03af); /* GREEK SMALL LETTER IOTA WITH TONOS */ \ + XXX(0x5e, UNDEF); /* reserved */ \ + UNI(0x5f, 0x03cc); /* GREEK SMALL LETTER OMICRON WITH TONOS */ \ + UNI(0x60, 0x03cb); /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ \ + UNI(0x61, 0x03b1); /* GREEK SMALL LETTER ALPHA */ \ + UNI(0x62, 0x03b2); /* GREEK SMALL LETTER BETA */ \ + UNI(0x63, 0x03b3); /* GREEK SMALL LETTER GAMMA */ \ + UNI(0x64, 0x03b4); /* GREEK SMALL LETTER DELTA */ \ + UNI(0x65, 0x03b5); /* GREEK SMALL LETTER EPSILON */ \ + UNI(0x66, 0x03b6); /* GREEK SMALL LETTER ZETA */ \ + UNI(0x67, 0x03b7); /* GREEK SMALL LETTER ETA */ \ + UNI(0x68, 0x03b8); /* GREEK SMALL LETTER THETA */ \ + UNI(0x69, 0x03b9); /* GREEK SMALL LETTER IOTA */ \ + UNI(0x6a, 0x03ba); /* GREEK SMALL LETTER KAPPA */ \ + UNI(0x6b, 0x03bb); /* GREEK SMALL LETTER LAMDA */ \ + UNI(0x6c, 0x03bc); /* GREEK SMALL LETTER MU */ \ + UNI(0x6d, 0x03bd); /* GREEK SMALL LETTER NU */ \ + UNI(0x6e, 0x03be); /* GREEK SMALL LETTER XI */ \ + UNI(0x6f, 0x03bf); /* GREEK SMALL LETTER OMICRON */ \ + XXX(0x70, UNDEF); /* reserved */ \ + UNI(0x71, 0x03c0); /* GREEK SMALL LETTER PI */ \ + UNI(0x72, 0x03c1); /* GREEK SMALL LETTER RHO */ \ + UNI(0x73, 0x03c3); /* GREEK SMALL LETTER SIGMA */ \ + UNI(0x74, 0x03c4); /* GREEK SMALL LETTER TAU */ \ + UNI(0x75, 0x03c5); /* GREEK SMALL LETTER UPSILON */ \ + UNI(0x76, 0x03c6); /* GREEK SMALL LETTER PHI */ \ + UNI(0x77, 0x03c7); /* GREEK SMALL LETTER CHI */ \ + UNI(0x78, 0x03c8); /* GREEK SMALL LETTER PSI */ \ + UNI(0x79, 0x03c9); /* GREEK SMALL LETTER OMEGA */ \ + UNI(0x7a, 0x03c2); /* GREEK SMALL LETTER FINAL SIGMA */ \ + UNI(0x7b, 0x03cd); /* GREEK SMALL LETTER UPSILON WITH TONOS */ \ + UNI(0x7c, 0x03ce); /* GREEK SMALL LETTER OMEGA WITH TONOS */ \ + UNI(0x7d, 0x0384); /* GREEK TONOS */ \ + XXX(0x7e, UNDEF); /* reserved */ \ + } \ + end_CODEPAGE() + /* figure A-22 "DEC Hebrew Supplemental Character Set" */ +#define map_DEC_Hebrew_Supp(code) \ + begin_CODEPAGE(); \ + switch (code) { \ + UNI(0x21, 0x00a1); /* INVERTED EXCLAMATION MARK */ \ + UNI(0x22, 0x00a2); /* CENT SIGN */ \ + UNI(0x23, 0x00a3); /* POUND SIGN */ \ + XXX(0x24, UNDEF); /* CURRENCY SIGN */ \ + UNI(0x25, 0x00a5); /* YEN SIGN */ \ + XXX(0x26, UNDEF); /* BROKEN BAR */ \ + UNI(0x27, 0x00a7); /* SECTION SIGN */ \ + UNI(0x28, 0x00a8); /* DIAERESIS */ \ + UNI(0x29, 0x00a9); /* COPYRIGHT SIGN */ \ + UNI(0x2a, 0x00d7); /* MULTIPLICATION SIGN */ \ + UNI(0x2b, 0x00ab); /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + XXX(0x2c, UNDEF); /* NOT SIGN */ \ + XXX(0x2d, UNDEF); /* SOFT HYPHEN */ \ + XXX(0x2e, UNDEF); /* REGISTERED SIGN */ \ + XXX(0x2f, UNDEF); /* MACRON */ \ + UNI(0x30, 0x00b0); /* DEGREE SIGN */ \ + UNI(0x31, 0x00b1); /* PLUS-MINUS SIGN */ \ + UNI(0x32, 0x00b2); /* SUPERSCRIPT TWO */ \ + UNI(0x33, 0x00b3); /* SUPERSCRIPT THREE */ \ + XXX(0x34, UNDEF); /* ACUTE ACCENT */ \ + UNI(0x35, 0x00b5); /* MICRO SIGN */ \ + UNI(0x36, 0x00b6); /* PILCROW SIGN */ \ + UNI(0x37, 0x00b7); /* MIDDLE DOT */ \ + XXX(0x38, UNDEF); /* CEDILLA */ \ + UNI(0x39, 0x00b9); /* SUPERSCRIPT ONE */ \ + UNI(0x3a, 0x00f7); /* DIVISION SIGN */ \ + UNI(0x3b, 0x00bb); /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + UNI(0x3c, 0x00bc); /* VULGAR FRACTION ONE QUARTER */ \ + UNI(0x3d, 0x00bd); /* VULGAR FRACTION ONE HALF */ \ + XXX(0x3e, UNDEF); /* VULGAR FRACTION THREE QUARTERS */ \ + UNI(0x3f, 0x00bf); /* INVERTED QUESTION MARK */ \ + XXX(0x40, UNDEF); /* reserved */ \ + XXX(0x41, UNDEF); /* reserved */ \ + XXX(0x42, UNDEF); /* reserved */ \ + XXX(0x43, UNDEF); /* reserved */ \ + XXX(0x44, UNDEF); /* reserved */ \ + XXX(0x45, UNDEF); /* reserved */ \ + XXX(0x46, UNDEF); /* reserved */ \ + XXX(0x47, UNDEF); /* reserved */ \ + XXX(0x48, UNDEF); /* reserved */ \ + XXX(0x49, UNDEF); /* reserved */ \ + XXX(0x4a, UNDEF); /* reserved */ \ + XXX(0x4b, UNDEF); /* reserved */ \ + XXX(0x4c, UNDEF); /* reserved */ \ + XXX(0x4d, UNDEF); /* reserved */ \ + XXX(0x4e, UNDEF); /* reserved */ \ + XXX(0x4f, UNDEF); /* reserved */ \ + XXX(0x50, UNDEF); /* reserved */ \ + XXX(0x51, UNDEF); /* reserved */ \ + XXX(0x52, UNDEF); /* reserved */ \ + XXX(0x53, UNDEF); /* reserved */ \ + XXX(0x54, UNDEF); /* reserved */ \ + XXX(0x55, UNDEF); /* reserved */ \ + XXX(0x56, UNDEF); /* reserved */ \ + XXX(0x57, UNDEF); /* reserved */ \ + XXX(0x58, UNDEF); /* reserved */ \ + XXX(0x59, UNDEF); /* reserved */ \ + XXX(0x5a, UNDEF); /* reserved */ \ + XXX(0x5b, UNDEF); /* reserved */ \ + XXX(0x5c, UNDEF); /* reserved */ \ + XXX(0x5d, UNDEF); /* reserved */ \ + XXX(0x5e, UNDEF); /* reserved */ \ + XXX(0x5f, UNDEF); /* reserved */ \ + UNI(0x60, 0x05d0); /* HEBREW LETTER ALEF */ \ + UNI(0x61, 0x05d1); /* HEBREW LETTER BET */ \ + UNI(0x62, 0x05d2); /* HEBREW LETTER GIMEL */ \ + UNI(0x63, 0x05d3); /* HEBREW LETTER DALET */ \ + UNI(0x64, 0x05d4); /* HEBREW LETTER HE */ \ + UNI(0x65, 0x05d5); /* HEBREW LETTER VAV */ \ + UNI(0x66, 0x05d6); /* HEBREW LETTER ZAYIN */ \ + UNI(0x67, 0x05d7); /* HEBREW LETTER HET */ \ + UNI(0x68, 0x05d8); /* HEBREW LETTER TET */ \ + UNI(0x69, 0x05d9); /* HEBREW LETTER YOD */ \ + UNI(0x6a, 0x05da); /* HEBREW LETTER FINAL KAF */ \ + UNI(0x6b, 0x05db); /* HEBREW LETTER KAF */ \ + UNI(0x6c, 0x05dc); /* HEBREW LETTER LAMED */ \ + UNI(0x6d, 0x05dd); /* HEBREW LETTER FINAL MEM */ \ + UNI(0x6e, 0x05de); /* HEBREW LETTER MEM */ \ + UNI(0x6f, 0x05df); /* HEBREW LETTER FINAL NUN */ \ + UNI(0x70, 0x05e0); /* HEBREW LETTER NUN */ \ + UNI(0x71, 0x05e1); /* HEBREW LETTER SAMEKH */ \ + UNI(0x72, 0x05e2); /* HEBREW LETTER AYIN */ \ + UNI(0x73, 0x05e3); /* HEBREW LETTER FINAL PE */ \ + UNI(0x74, 0x05e4); /* HEBREW LETTER PE */ \ + UNI(0x75, 0x05e5); /* HEBREW LETTER FINAL TSADI */ \ + UNI(0x76, 0x05e6); /* HEBREW LETTER TSADI */ \ + UNI(0x77, 0x05e7); /* HEBREW LETTER QOF */ \ + UNI(0x78, 0x05e8); /* HEBREW LETTER RESH */ \ + UNI(0x79, 0x05e9); /* HEBREW LETTER SHIN */ \ + UNI(0x7a, 0x05ea); /* HEBREW LETTER TAV */ \ + XXX(0x7b, UNDEF); /* reserved */ \ + XXX(0x7c, UNDEF); /* reserved */ \ + XXX(0x7d, UNDEF); /* reserved */ \ + XXX(0x7e, UNDEF); /* reserved */ \ + } \ + end_CODEPAGE() + /* figure A-27 "DEC 8-Bit Turkish Supplemental Character Set" */ +#define map_DEC_Turkish_Supp(code) \ + begin_CODEPAGE(); \ + switch (code) { \ + UNI(0x21, 0x00A1); /* INVERTED EXCLAMATION MARK */ \ + UNI(0x22, 0x00A2); /* CENT SIGN */ \ + UNI(0x23, 0x00A3); /* POUND SIGN */ \ + XXX(0x24, UNDEF); /* reserved */ \ + UNI(0x25, 0x00A5); /* YEN SIGN */ \ + XXX(0x26, UNDEF); /* reserved */ \ + UNI(0x27, 0x00A7); /* SECTION SIGN */ \ + UNI(0x28, 0x00A8); /* DIAERESIS */ \ + UNI(0x29, 0x00A9); /* COPYRIGHT SIGN */ \ + UNI(0x2A, 0x00AA); /* FEMININE ORDINAL INDICATOR */ \ + UNI(0x2B, 0x00AB); /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + XXX(0x2C, UNDEF); /* reserved */ \ + XXX(0x2D, UNDEF); /* reserved */ \ + UNI(0x2E, 0x0130); /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ \ + XXX(0x2F, UNDEF); /* reserved */ \ + UNI(0x30, 0x00B0); /* DEGREE SIGN */ \ + UNI(0x31, 0x00B1); /* PLUS-MINUS SIGN */ \ + UNI(0x32, 0x00B2); /* SUPERSCRIPT TWO */ \ + UNI(0x33, 0x00B3); /* SUPERSCRIPT THREE */ \ + XXX(0x34, UNDEF); /* reserved */ \ + UNI(0x35, 0x00B5); /* MICRO SIGN */ \ + UNI(0x36, 0x00B6); /* PILCROW SIGN */ \ + UNI(0x37, 0x00B7); /* MIDDLE DOT */ \ + XXX(0x38, UNDEF); /* reserved */ \ + UNI(0x39, 0x00B9); /* SUPERSCRIPT ONE */ \ + UNI(0x3A, 0x00BA); /* MASCULINE ORDINAL INDICATOR */ \ + UNI(0x3B, 0x00BB); /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ \ + UNI(0x3C, 0x00BC); /* VULGAR FRACTION ONE QUARTER */ \ + UNI(0x3D, 0x00BD); /* VULGAR FRACTION ONE HALF */ \ + UNI(0x3E, 0x0131); /* LATIN SMALL LETTER DOTLESS I */ \ + UNI(0x3F, 0x00BF); /* INVERTED QUESTION MARK */ \ + UNI(0x40, 0x00C0); /* LATIN CAPITAL LETTER A WITH GRAVE */ \ + UNI(0x41, 0x00C1); /* LATIN CAPITAL LETTER A WITH ACUTE */ \ + UNI(0x42, 0x00C2); /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ \ + UNI(0x43, 0x00C3); /* LATIN CAPITAL LETTER A WITH TILDE */ \ + UNI(0x44, 0x00C4); /* LATIN CAPITAL LETTER A WITH DIAERESIS */ \ + UNI(0x45, 0x00C5); /* LATIN CAPITAL LETTER A WITH RING ABOVE */ \ + UNI(0x46, 0x00C6); /* LATIN CAPITAL LETTER AE */ \ + UNI(0x47, 0x00C7); /* LATIN CAPITAL LETTER C WITH CEDILLA */ \ + UNI(0x48, 0x00C8); /* LATIN CAPITAL LETTER E WITH GRAVE */ \ + UNI(0x49, 0x00C9); /* LATIN CAPITAL LETTER E WITH ACUTE */ \ + UNI(0x4A, 0x00CA); /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ \ + UNI(0x4B, 0x00CB); /* LATIN CAPITAL LETTER E WITH DIAERESIS */ \ + UNI(0x4C, 0x00CC); /* LATIN CAPITAL LETTER I WITH GRAVE */ \ + UNI(0x4D, 0x00CD); /* LATIN CAPITAL LETTER I WITH ACUTE */ \ + UNI(0x4E, 0x00CE); /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ \ + UNI(0x4F, 0x00CF); /* LATIN CAPITAL LETTER I WITH DIAERESIS */ \ + UNI(0x50, 0x011E); /* LATIN CAPITAL LETTER G WITH BREVE */ \ + UNI(0x51, 0x00D1); /* LATIN CAPITAL LETTER N WITH TILDE */ \ + UNI(0x52, 0x00D2); /* LATIN CAPITAL LETTER O WITH GRAVE */ \ + UNI(0x53, 0x00D3); /* LATIN CAPITAL LETTER O WITH ACUTE */ \ + UNI(0x54, 0x00D4); /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ \ + UNI(0x55, 0x00D5); /* LATIN CAPITAL LETTER O WITH TILDE */ \ + UNI(0x56, 0x00D6); /* LATIN CAPITAL LETTER O WITH DIAERESIS */ \ + UNI(0x57, 0x0152); /* LATIN CAPITAL LIGATURE OE */ \ + UNI(0x58, 0x00D8); /* LATIN CAPITAL LETTER O WITH STROKE */ \ + UNI(0x59, 0x00D9); /* LATIN CAPITAL LETTER U WITH GRAVE */ \ + UNI(0x5A, 0x00DA); /* LATIN CAPITAL LETTER U WITH ACUTE */ \ + UNI(0x5B, 0x00DB); /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ \ + UNI(0x5C, 0x00DC); /* LATIN CAPITAL LETTER U WITH DIAERESIS */ \ + UNI(0x5D, 0x0178); /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ \ + UNI(0x5E, 0x015E); /* LATIN CAPITAL LETTER S WITH CEDILLA */ \ + UNI(0x5F, 0x00DF); /* LATIN SMALL LETTER SHARP S */ \ + UNI(0x60, 0x00E0); /* LATIN SMALL LETTER A WITH GRAVE */ \ + UNI(0x61, 0x00E1); /* LATIN SMALL LETTER A WITH ACUTE */ \ + UNI(0x62, 0x00E2); /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ \ + UNI(0x63, 0x00E3); /* LATIN SMALL LETTER A WITH TILDE */ \ + UNI(0x64, 0x00E4); /* LATIN SMALL LETTER A WITH DIAERESIS */ \ + UNI(0x65, 0x00E5); /* LATIN SMALL LETTER A WITH RING ABOVE */ \ + UNI(0x66, 0x00E6); /* LATIN SMALL LETTER AE */ \ + UNI(0x67, 0x00E7); /* LATIN SMALL LETTER C WITH CEDILLA */ \ + UNI(0x68, 0x00E8); /* LATIN SMALL LETTER E WITH GRAVE */ \ + UNI(0x69, 0x00E9); /* LATIN SMALL LETTER E WITH ACUTE */ \ + UNI(0x6A, 0x00EA); /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ \ + UNI(0x6B, 0x00EB); /* LATIN SMALL LETTER E WITH DIAERESIS */ \ + UNI(0x6C, 0x00EC); /* LATIN SMALL LETTER I WITH GRAVE */ \ + UNI(0x6D, 0x00ED); /* LATIN SMALL LETTER I WITH ACUTE */ \ + UNI(0x6E, 0x00EE); /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ \ + UNI(0x6F, 0x00EF); /* LATIN SMALL LETTER I WITH DIAERESIS */ \ + UNI(0x70, 0x011F); /* LATIN SMALL LETTER G WITH BREVE */ \ + UNI(0x71, 0x00F1); /* LATIN SMALL LETTER N WITH TILDE */ \ + UNI(0x72, 0x00F2); /* LATIN SMALL LETTER O WITH GRAVE */ \ + UNI(0x73, 0x00F3); /* LATIN SMALL LETTER O WITH ACUTE */ \ + UNI(0x74, 0x00F4); /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ \ + UNI(0x75, 0x00F5); /* LATIN SMALL LETTER O WITH TILDE */ \ + UNI(0x76, 0x00F6); /* LATIN SMALL LETTER O WITH DIAERESIS */ \ + UNI(0x77, 0x0153); /* LATIN SMALL LIGATURE OE */ \ + UNI(0x78, 0x00F8); /* LATIN SMALL LETTER O WITH STROKE */ \ + UNI(0x79, 0x00F9); /* LATIN SMALL LETTER U WITH GRAVE */ \ + UNI(0x7A, 0x00FA); /* LATIN SMALL LETTER U WITH ACUTE */ \ + UNI(0x7B, 0x00FB); /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ \ + UNI(0x7C, 0x00FC); /* LATIN SMALL LETTER U WITH DIAERESIS */ \ + UNI(0x7D, 0x00FF); /* LATIN SMALL LETTER Y WITH DIAERESIS */ \ + UNI(0x7E, 0x015F); /* LATIN SMALL LETTER S WITH CEDILLA */ \ + } \ + end_CODEPAGE() + /* + * mentioned, but not documented in VT510 manual, etc., this uses + * the ELOT927 table from Kermit 95: + */ +#define map_NRCS_Greek(code) \ + switch (code) { \ + MAP(0x61, 0x0391); /* CAPITAL GREEK LETTER ALPHA */ \ + MAP(0x62, 0x0392); /* CAPITAL GREEK LETTER BETA */ \ + MAP(0x63, 0x0393); /* CAPITAL GREEK LETTER GAMMA */ \ + MAP(0x64, 0x0394); /* CAPITAL GREEK LETTER DELTA */ \ + MAP(0x65, 0x0395); /* CAPITAL GREEK LETTER EPSILON */ \ + MAP(0x66, 0x0396); /* CAPITAL GREEK LETTER ZETA */ \ + MAP(0x67, 0x0397); /* CAPITAL GREEK LETTER ETA */ \ + MAP(0x68, 0x0398); /* CAPITAL GREEK LETTER THETA */ \ + MAP(0x69, 0x0399); /* CAPITAL GREEK LETTER IOTA */ \ + MAP(0x6a, 0x039a); /* CAPITAL GREEK LETTER KAPPA */ \ + MAP(0x6b, 0x039b); /* CAPITAL GREEK LETTER LAMDA */ \ + MAP(0x6c, 0x039c); /* CAPITAL GREEK LETTER MU */ \ + MAP(0x6d, 0x039d); /* CAPITAL GREEK LETTER NU */ \ + MAP(0x6e, 0x03a7); /* CAPITAL GREEK LETTER KSI (CHI) */ \ + MAP(0x6f, 0x039f); /* CAPITAL GREEK LETTER OMICRON */ \ + MAP(0x70, 0x03a0); /* CAPITAL GREEK LETTER PI */ \ + MAP(0x71, 0x03a1); /* CAPITAL GREEK LETTER RHO */ \ + MAP(0x72, 0x03a3); /* CAPITAL GREEK LETTER SIGMA */ \ + MAP(0x73, 0x03a4); /* CAPITAL GREEK LETTER TAU */ \ + MAP(0x74, 0x03a5); /* CAPITAL GREEK LETTER UPSILON */ \ + MAP(0x75, 0x03a6); /* CAPITAL GREEK LETTER FI (PHI) */ \ + MAP(0x76, 0x039e); /* CAPITAL GREEK LETTER XI */ \ + MAP(0x77, 0x03a8); /* CAPITAL GREEK LETTER PSI */ \ + MAP(0x78, 0x03a9); /* CAPITAL GREEK LETTER OMEGA */ \ + XXX(0x79, BLANK); /* unused */ \ + XXX(0x7a, BLANK); /* unused */ \ + } + /* figure A-21 "DEC 7-Bit Hebrew Character Set" */ +#define map_NRCS_Hebrew(code) \ + switch (code) { \ + UNI(0x60, 0x05d0); /* HEBREW LETTER ALEF */ \ + UNI(0x61, 0x05d1); /* HEBREW LETTER BET */ \ + UNI(0x62, 0x05d2); /* HEBREW LETTER GIMEL */ \ + UNI(0x63, 0x05d3); /* HEBREW LETTER DALET */ \ + UNI(0x64, 0x05d4); /* HEBREW LETTER HE */ \ + UNI(0x65, 0x05d5); /* HEBREW LETTER VAV */ \ + UNI(0x66, 0x05d6); /* HEBREW LETTER ZAYIN */ \ + UNI(0x67, 0x05d7); /* HEBREW LETTER HET */ \ + UNI(0x68, 0x05d8); /* HEBREW LETTER TET */ \ + UNI(0x69, 0x05d9); /* HEBREW LETTER YOD */ \ + UNI(0x6a, 0x05da); /* HEBREW LETTER FINAL KAF */ \ + UNI(0x6b, 0x05db); /* HEBREW LETTER KAF */ \ + UNI(0x6c, 0x05dc); /* HEBREW LETTER LAMED */ \ + UNI(0x6d, 0x05dd); /* HEBREW LETTER FINAL MEM */ \ + UNI(0x6e, 0x05de); /* HEBREW LETTER MEM */ \ + UNI(0x6f, 0x05df); /* HEBREW LETTER FINAL NUN */ \ + UNI(0x70, 0x05e0); /* HEBREW LETTER NUN */ \ + UNI(0x71, 0x05e1); /* HEBREW LETTER SAMEKH */ \ + UNI(0x72, 0x05e2); /* HEBREW LETTER AYIN */ \ + UNI(0x73, 0x05e3); /* HEBREW LETTER FINAL PE */ \ + UNI(0x74, 0x05e4); /* HEBREW LETTER PE */ \ + UNI(0x75, 0x05e5); /* HEBREW LETTER FINAL TSADI */ \ + UNI(0x76, 0x05e6); /* HEBREW LETTER TSADI */ \ + UNI(0x77, 0x05e7); /* HEBREW LETTER QOF */ \ + UNI(0x78, 0x05e8); /* HEBREW LETTER RESH */ \ + UNI(0x79, 0x05e9); /* HEBREW LETTER SHIN */ \ + UNI(0x7a, 0x05ea); /* HEBREW LETTER TAV */ \ + } + /* figure A-26 "DEC 7-Bit Turkish Character Set" */ +#define map_NRCS_Turkish(code) \ + switch (code) { \ + UNI(0x26, 0x011f); /* LATIN SMALL LETTER G WITH BREVE */ \ + UNI(0x40, 0x0130); /* LATIN CAPITAL LETTER I WITH DOT ABOVE */ \ + UNI(0x5b, 0x015e); /* LATIN CAPITAL LETTER S WITH CEDILLA */ \ + UNI(0x5c, 0x00d6); /* LATIN CAPITAL LETTER O WITH DIAERESIS */ \ + UNI(0x5d, 0x00c7); /* LATIN CAPITAL LETTER C WITH CEDILLA */ \ + UNI(0x5e, 0x00dC); /* LATIN CAPITAL LETTER U WITH DIAERESIS */ \ + UNI(0x60, 0x011e); /* LATIN CAPITAL LETTER G WITH BREVE */ \ + UNI(0x7b, 0x015f); /* LATIN SMALL LETTER S WITH CEDILLA */ \ + UNI(0x7c, 0x00f6); /* LATIN SMALL LETTER O WITH DIAERESIS */ \ + UNI(0x7d, 0x00e7); /* LATIN SMALL LETTER C WITH CEDILLA */ \ + UNI(0x7e, 0x00fc); /* LATIN SMALL LETTER U WITH DIAERESIS */ \ + } +#else +#define map_DEC_Cyrillic(code) /* nothing */ +#define map_DEC_Greek_Supp(code) /* nothing */ +#define map_DEC_Hebrew_Supp(code) /* nothing */ +#define map_DEC_Technical(code) /* nothing */ +#define map_DEC_Turkish_Supp(code) /* nothing */ +#define map_ISO_Greek_Supp(code) /* nothing */ +#define map_ISO_Hebrew(code) /* nothing */ +#define map_ISO_Latin_5(code) /* nothing */ +#define map_ISO_Latin_Cyrillic(code) /* nothing */ +#define map_NRCS_Greek(code) /* nothing */ +#define map_NRCS_Hebrew(code) /* nothing */ +#define map_NRCS_Turkish(code) /* nothing */ +#endif /* OPT_WIDE_CHARS */ + +/* + * Translate an input keysym to the corresponding NRC keysym. + */ +unsigned +xtermCharSetIn(XtermWidget xw, unsigned code, DECNRCM_codes charset) +{ + TScreen *screen = TScreenOf(xw); +#define MAP(to, from) case from: code = to; break + +#if OPT_WIDE_CHARS +#define UNI(to, from) case from: if (screen->utf8_nrc_mode) code = to; break +#else +#define UNI(to, from) case from: break +#endif + +#define XXX(to, from) /* no defined mapping to 0..255 */ + + TRACE(("CHARSET-IN GL=%s(G%d) GR=%s(G%d) SS%d\n\t%s\n", + visibleScsCode(screen->gsets[screen->curgl]), screen->curgl, + visibleScsCode(screen->gsets[screen->curgr]), screen->curgr, + screen->curss, + visibleUChar(code))); + + (void) screen; + switch (charset) { + case nrc_British: /* United Kingdom set (or Latin 1) */ + if (code == XK_sterling) + code = 0x23; + code &= 0x7f; + break; + + case nrc_DEC_Alt_Chars: + case nrc_DEC_Alt_Graphics: + case nrc_ASCII: + break; + + case nrc_DEC_Spec_Graphic: + break; + + case nrc_DEC_Supp: + map_DEC_Supp_Graphic(code, code &= 0x7f); + break; + + case nrc_DEC_Supp_Graphic: + map_DEC_Supp_Graphic(code, code |= 0x80); + break; + + case nrc_DEC_Technical: + map_DEC_Technical(code); + break; + + case nrc_Dutch: + map_NRCS_Dutch(code); + break; + + case nrc_Finnish: + case nrc_Finnish2: + map_NRCS_Finnish(code); + break; + + case nrc_French: + case nrc_French2: + map_NRCS_French(code); + break; + + case nrc_French_Canadian: + map_NRCS_French_Canadian(code); + break; + + case nrc_German: + map_NRCS_German(code); + break; + + case nrc_Greek: + map_NRCS_Greek(code); /* FIXME - ELOT? */ + break; + + case nrc_DEC_Greek_Supp: + map_DEC_Greek_Supp(code); + break; + + case nrc_ISO_Greek_Supp: + map_ISO_Greek_Supp(code); + break; + + case nrc_DEC_Hebrew_Supp: + map_DEC_Hebrew_Supp(code); + break; + + case nrc_Hebrew: + map_NRCS_Hebrew(code); + break; + + case nrc_ISO_Hebrew_Supp: + map_ISO_Hebrew(code); + break; + + case nrc_Italian: + map_NRCS_Italian(code); + break; + + case nrc_ISO_Latin_5_Supp: + map_ISO_Latin_5(code); + break; + + case nrc_ISO_Latin_Cyrillic: + map_ISO_Latin_Cyrillic(code); + break; + + case nrc_Norwegian_Danish: + case nrc_Norwegian_Danish2: + case nrc_Norwegian_Danish3: + map_NRCS_Norwegian_Danish(code); + break; + + case nrc_Portugese: + map_NRCS_Portuguese(code); + break; + + case nrc_SCS_NRCS: /* vt5xx - probably Serbo/Croatian */ + /* FIXME */ + break; + + case nrc_Spanish: + map_NRCS_Spanish(code); + break; + + case nrc_Swedish2: + case nrc_Swedish: + map_NRCS_Swedish(code); + break; + + case nrc_Swiss: + map_NRCS_Swiss(code); + break; + + case nrc_Turkish: + map_NRCS_Turkish(code); + break; + + case nrc_DEC_Turkish_Supp: + map_DEC_Turkish_Supp(code); + break; + + case nrc_Cyrillic: + map_DEC_Cyrillic(code); + break; + + case nrc_British_Latin_1: + case nrc_Russian: + case nrc_French_Canadian2: + case nrc_Unknown: + default: /* any character sets we don't recognize */ + break; + } + code &= 0x7f; /* NRC in any case is 7-bit */ + TRACE(("->\t%s\n", + visibleUChar(code))); + return code; +#undef MAP +#undef UNI +#undef XXX +} + +/* + * Translate a string to the display form. This assumes the font has the + * DEC graphic characters in cells 0-31, and otherwise is ISO-8859-1. + */ +int +xtermCharSetOut(XtermWidget xw, IChar *buf, IChar *ptr, DECNRCM_codes leftset) +{ + IChar *s; + TScreen *screen = TScreenOf(xw); + int count = 0; + DECNRCM_codes rightset = screen->gsets[(int) (screen->curgr)]; + +#define MAP(from, to) case from: chr = to; break + +#if OPT_WIDE_CHARS +#define UNI(from, to) case from: if (screen->utf8_nrc_mode) chr = to; break +#define XXX(from, to) UNI(from, to) +#else +#define UNI(old, new) chr = old; break +#define XXX(from, to) /* nothing */ +#endif + + TRACE(("CHARSET-OUT GL=%s(G%d) GR=%s(G%d) SS%d\n\t%s\n", + visibleScsCode(leftset), screen->curgl, + visibleScsCode(rightset), screen->curgr, + screen->curss, + visibleIChars(buf, (unsigned) (ptr - buf)))); + + for (s = buf; s < ptr; ++s) { + int eight = CharOf(E2A(*s)); + int seven = eight & 0x7f; + DECNRCM_codes cs = (eight >= 128) ? rightset : leftset; + int chr = eight; + + count++; +#if OPT_WIDE_CHARS + /* + * This is only partly right - prevent inadvertent remapping of + * the replacement character and other non-8bit codes into bogus + * 8bit codes. + */ + if (screen->utf8_mode || screen->utf8_nrc_mode) { + if (*s > 255) + continue; + } +#endif + if (*s < 32) + continue; + + switch (cs) { + case nrc_British_Latin_1: + /* FALLTHRU */ + case nrc_British: /* United Kingdom set (or Latin 1) */ + if ((xw->flags & NATIONAL) + || (screen->vtXX_level <= 1)) { + if ((xw->flags & NATIONAL)) { + chr = seven; + } + if (chr == 0x23) { + chr = XTERM_POUND; +#if OPT_WIDE_CHARS + if (screen->utf8_nrc_mode) { + chr = 0xa3; + } +#endif + } + } else { + chr = (seven | 0x80); + } + break; + + case nrc_DEC_Alt_Chars: + case nrc_DEC_Alt_Graphics: + case nrc_ASCII: + break; + + case nrc_DEC_Spec_Graphic: + if (seven > 0x5f && seven <= 0x7e) { +#if OPT_WIDE_CHARS + if (screen->utf8_mode || screen->utf8_nrc_mode) + chr = (int) dec2ucs(screen, (unsigned) (seven - 0x5f)); + else +#endif + chr = seven - 0x5f; + } else if (chr == 0x5f) { + chr = 0; + } else { + chr = seven; + } + break; + + case nrc_DEC_Supp: + map_DEC_Supp_Graphic(chr = seven, chr |= 0x80); + break; + + case nrc_DEC_Supp_Graphic: + map_DEC_Supp_Graphic(chr = seven, chr |= 0x80); + break; + + case nrc_DEC_Technical: + map_DEC_Technical(chr = seven); + break; + + case nrc_Dutch: + map_NRCS_Dutch(chr = seven); + break; + + case nrc_Finnish: + case nrc_Finnish2: + map_NRCS_Finnish(chr = seven); + break; + + case nrc_French: + case nrc_French2: + map_NRCS_French(chr = seven); + break; + + case nrc_French_Canadian: + case nrc_French_Canadian2: + map_NRCS_French_Canadian(chr = seven); + break; + + case nrc_German: + map_NRCS_German(chr = seven); + break; + + case nrc_Greek: + map_NRCS_Greek(chr = seven); /* FIXME - ELOT? */ + break; + + case nrc_DEC_Greek_Supp: + map_DEC_Greek_Supp(chr = seven); + break; + + case nrc_ISO_Greek_Supp: + map_ISO_Greek_Supp(chr = seven); + break; + + case nrc_DEC_Hebrew_Supp: + map_DEC_Hebrew_Supp(chr = seven); + break; + + case nrc_Hebrew: + map_NRCS_Hebrew(chr = seven); + break; + + case nrc_ISO_Hebrew_Supp: + map_ISO_Hebrew(chr = seven); + break; + + case nrc_Italian: + map_NRCS_Italian(chr = seven); + break; + + case nrc_ISO_Latin_5_Supp: + map_ISO_Latin_5(chr = seven); + break; + + case nrc_ISO_Latin_Cyrillic: + map_ISO_Latin_Cyrillic(chr = seven); + break; + + case nrc_Norwegian_Danish: + case nrc_Norwegian_Danish2: + case nrc_Norwegian_Danish3: + map_NRCS_Norwegian_Danish(chr = seven); + break; + + case nrc_Portugese: + map_NRCS_Portuguese(chr = seven); + break; + + case nrc_SCS_NRCS: /* vt5xx - probably Serbo/Croatian */ + /* FIXME */ + break; + + case nrc_Spanish: + map_NRCS_Spanish(chr = seven); + break; + + case nrc_Swedish2: + case nrc_Swedish: + map_NRCS_Swedish(chr = seven); + break; + + case nrc_Swiss: + map_NRCS_Swiss(chr = seven); + break; + + case nrc_Turkish: + map_NRCS_Turkish(chr = seven); + break; + + case nrc_DEC_Turkish_Supp: + map_DEC_Turkish_Supp(chr = seven); + break; + + case nrc_Cyrillic: + map_DEC_Cyrillic(chr = seven); + break; + + case nrc_Russian: + case nrc_Unknown: + default: /* any character sets we don't recognize */ + count--; + break; + } + /* + * The state machine already treated DEL as a nonprinting and + * nonspacing character. If we have DEL now, simply render + * it as a blank. + */ + if (chr == ANSI_DEL) + chr = ' '; + *s = (IChar) A2E(chr); + } + TRACE(("%d\t%s\n", + count, + visibleIChars(buf, (unsigned) (ptr - buf)))); + return count; +#undef MAP +#undef UNI +#undef XXX +} diff --git a/ports/xterm/xterm-359/charsets.o b/ports/xterm/xterm-359/charsets.o new file mode 100644 index 0000000000000000000000000000000000000000..7a9066ccae6f1ae3d8a9efb6795b98a8d0db069b GIT binary patch literal 291328 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 z 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 C^yK>h literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/config.guess b/ports/xterm/xterm-359/config.guess new file mode 100755 index 0000000..e94095c --- /dev/null +++ b/ports/xterm/xterm-359/config.guess @@ -0,0 +1,1687 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-07-12' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + then + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "$HP_ARCH" = "" ]; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ "$HP_ARCH" = hppa2.0w ] + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + fi + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-pc-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + set_cc_for_build + LIBCABI=$LIBC + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI="$LIBC"x32 + fi + fi + echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + arm64:Darwin:*:*) + echo aarch64-apple-darwin"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + # shellcheck disable=SC2154 + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + exit ;; +esac + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/ports/xterm/xterm-359/config.log b/ports/xterm/xterm-359/config.log new file mode 100644 index 0000000..4090e19 --- /dev/null +++ b/ports/xterm/xterm-359/config.log @@ -0,0 +1,2218 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by configure, which was +generated by GNU Autoconf 2.52.20200802. Invocation command line was + + $ ./configure --with-neXtaw --enable-toolbar + +## ---------- ## +## Platform. ## +## ---------- ## + +hostname = commandante +uname -m = x86_64 +uname -r = 5.11.13-hardened1-hardened +uname -s = Linux +uname -v = #5 SMP PREEMPT Thu Apr 29 18:52:56 UTC 2021 + +/usr/bin/uname -p = unknown +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH = /bin:/sbin:/usr/bin:/usr/sbin + +## ------------ ## +## Core tests. ## +## ------------ ## + +configure:1103: PATH=".;."; conftest.sh +./configure[1111]: conftest.sh: not found +configure:1106: $? = 127 +configure:1148: checking build system type +configure:1166: result: x86_64-pc-linux-gnu +configure:1174: checking host system type +configure:1188: result: x86_64-pc-linux-gnu +configure:1214: result: Configuring for linux-gnu +configure:1280: checking for gcc +configure:1295: found /bin/gcc +configure:1303: result: gcc +configure:1531: checking for C compiler version +configure:1534: gcc --version &5 +gcc (GCC) 11.1.0 +Copyright (C) 2021 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +configure:1537: $? = 0 +configure:1539: gcc -v &5 +Using built-in specs. +COLLECT_GCC=gcc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/11.1.0/lto-wrapper +Target: x86_64-pc-linux-gnu +Configured with: ../gcc/configure --prefix=/usr --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --disable-multilib --disable-symvers --disable-libmpx --disable-libmudflap --disable-libsanitizer --disable-werror --disable-fixed-point --disable-libstdcxx-pch --disable-nls --enable-checking=release --enable-__cxa_atexit --enable-default-pie --enable-default-ssp --enable-shared --enable-threads --enable-tls --enable-languages=c,c++ --without-included-gettext --with-system-zlib --build=x86_64-pc-linux-gnu --disable-bootstrap +Thread model: posix +Supported LTO compression algorithms: zlib zstd +gcc version 11.1.0 (GCC) +configure:1542: $? = 0 +configure:1544: gcc -V &5 +gcc: error: unrecognized command-line option '-V' +gcc: fatal error: no input files +compilation terminated. +configure:1547: $? = 1 +configure:1567: checking for C compiler default output +configure:1570: gcc conftest.c >&5 +configure:1573: $? = 0 +configure:1602: result: a.out +configure:1607: checking whether the C compiler works +configure:1613: ./a.out +configure:1616: $? = 0 +configure:1631: result: yes +configure:1638: checking whether we are cross compiling +configure:1640: result: no +configure:1643: checking for executable suffix +configure:1645: gcc -o conftest conftest.c >&5 +configure:1648: $? = 0 +configure:1670: result: +configure:1676: checking for object suffix +configure:1694: gcc -c conftest.c >&5 +configure:1697: $? = 0 +configure:1716: result: o +configure:1720: checking whether we are using the GNU C compiler +configure:1741: gcc -c conftest.c >&5 +configure:1744: $? = 0 +configure:1747: test -s conftest.o +configure:1750: $? = 0 +configure:1762: result: yes +configure:1768: checking whether gcc accepts -g +configure:1786: gcc -c -g conftest.c >&5 +configure:1789: $? = 0 +configure:1792: test -s conftest.o +configure:1795: $? = 0 +configure:1805: result: yes +configure:1832: gcc -c -g -O2 conftest.c >&5 +conftest.c:2:3: error: unknown type name 'choke' + 2 | choke me + | ^~~~~ +conftest.c:2:3: error: expected '=', ',', ';', 'asm' or '__attribute__' at end of input +configure:1835: $? = 1 +configure: failed program was: +#ifndef __cplusplus + choke me +#endif +configure:1936: checking version of gcc +configure:1940: result: 11.1.0 +configure:1949: checking if this is really Intel C compiler +configure:1971: gcc -c -g -O2 -no-gcc conftest.c >&5 +gcc: error: unrecognized command-line option '-no-gcc' +configure:1974: $? = 1 +configure: failed program was: +#line 1954 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __INTEL_COMPILER +#else +make an error +#endif + + ; + return 0; +} +configure:1991: result: no +configure:2000: checking if this is really Clang C compiler +configure:2022: gcc -c -g -O2 -Qunused-arguments conftest.c >&5 +gcc: error: unrecognized command-line option '-Qunused-arguments' +configure:2025: $? = 1 +configure: failed program was: +#line 2005 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __clang__ +#else +make an error +#endif + + ; + return 0; +} +configure:2042: result: no +configure:2046: checking for gcc option to accept ANSI C +configure:2103: gcc -c -g -O2 conftest.c >&5 +configure:2106: $? = 0 +configure:2109: test -s conftest.o +configure:2112: $? = 0 +configure:2129: result: none needed +configure:2140: checking $CFLAGS variable +configure:2254: result: ok +configure:2259: checking $CC variable +configure:2394: result: ok +configure:2405: checking how to run the C preprocessor +configure:2431: gcc -E conftest.c +configure:2437: $? = 0 +configure:2464: gcc -E conftest.c +configure:2461:10: fatal error: ac_nonexistent.h: No such file or directory + 2461 | #include "confdefs.h" + | ^~~~~~~~~~~~ +compilation terminated. +configure:2470: $? = 1 +configure: failed program was: +#line 2460 "configure" +#include "confdefs.h" +#include +configure:2507: result: gcc -E +configure:2522: gcc -E conftest.c +configure:2528: $? = 0 +configure:2555: gcc -E conftest.c +configure:2552:10: fatal error: ac_nonexistent.h: No such file or directory + 2552 | #include "confdefs.h" + | ^~~~~~~~~~~~ +compilation terminated. +configure:2561: $? = 1 +configure: failed program was: +#line 2551 "configure" +#include "confdefs.h" +#include +configure:2605: checking for mawk +configure:2631: result: no +configure:2605: checking for gawk +configure:2631: result: no +configure:2605: checking for nawk +configure:2631: result: no +configure:2605: checking for awk +configure:2620: found /bin/awk +configure:2628: result: awk +configure:2650: checking for a BSD compatible install +configure:2699: result: /bin/install -c +configure:2710: checking whether ln -s works +configure:2714: result: yes +configure:2738: checking for lint +configure:2764: result: no +configure:2738: checking for cppcheck +configure:2764: result: no +configure:2738: checking for splint +configure:2764: result: no +configure:2779: checking if the POSIX test-macros are already defined +configure:2805: gcc -c -g -O2 conftest.c >&5 +configure:2808: $? = 0 +configure:2811: test -s conftest.o +configure:2814: $? = 0 +configure:2825: result: no +configure:2870: checking if this is the GNU C library +configure:2896: gcc -c -g -O2 conftest.c >&5 +configure:2899: $? = 0 +configure:2902: test -s conftest.o +configure:2905: $? = 0 +configure:2916: result: yes +configure:2924: checking if _DEFAULT_SOURCE can be used as a basis +configure:2955: gcc -c -g -O2 -D_DEFAULT_SOURCE conftest.c >&5 +configure:2958: $? = 0 +configure:2961: test -s conftest.o +configure:2964: $? = 0 +configure:2976: result: yes +configure:2981: checking if _XOPEN_SOURCE=700 works with _DEFAULT_SOURCE +configure:3106: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:3109: $? = 0 +configure:3112: test -s conftest.o +configure:3115: $? = 0 +configure:3126: result: yes +configure:4263: checking if _XOPEN_SOURCE really is set +configure:4281: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:4284: $? = 0 +configure:4287: test -s conftest.o +configure:4290: $? = 0 +configure:4299: result: yes +configure:4319: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:4322: $? = 0 +configure:4325: test -s conftest.o +configure:4328: $? = 0 +configure:4553: checking if SIGWINCH is defined +configure:4575: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:4578: $? = 0 +configure:4581: test -s conftest.o +configure:4584: $? = 0 +configure:4632: result: yes +configure:4714: checking for ncurses/curses.h +configure:4724: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:4721:10: fatal error: ncurses/curses.h: No such file or directory + 4721 | #include "confdefs.h" + | ^~~~~~~~~~~~ +compilation terminated. +configure:4730: $? = 1 +configure: failed program was: +#line 4720 "configure" +#include "confdefs.h" +#include +configure:4749: result: no +configure:4714: checking for ncurses/term.h +configure:4724: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:4721:10: fatal error: ncurses/term.h: No such file or directory + 4721 | #include "confdefs.h" + | ^~~~~~~~~~~~ +compilation terminated. +configure:4730: $? = 1 +configure: failed program was: +#line 4720 "configure" +#include "confdefs.h" +#include +configure:4749: result: no +configure:4714: checking for stdlib.h +configure:4724: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:4730: $? = 0 +configure:4749: result: yes +configure:4714: checking for sys/ptem.h +configure:4724: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:4721:10: fatal error: sys/ptem.h: No such file or directory + 4721 | #include "confdefs.h" + | ^~~~~~~~~~~~ +compilation terminated. +configure:4730: $? = 1 +configure: failed program was: +#line 4720 "configure" +#include "confdefs.h" +#include +configure:4749: result: no +configure:4714: checking for sys/ttydefaults.h +configure:4724: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:4730: $? = 0 +configure:4749: result: yes +configure:4714: checking for term.h +configure:4724: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:4730: $? = 0 +configure:4749: result: yes +configure:4714: checking for termios.h +configure:4724: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:4730: $? = 0 +configure:4749: result: yes +configure:4714: checking for unistd.h +configure:4724: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:4730: $? = 0 +configure:4749: result: yes +configure:4714: checking for wchar.h +configure:4724: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:4730: $? = 0 +configure:4749: result: yes +configure:4759: checking whether time.h and sys/time.h may both be included +configure:4781: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:4784: $? = 0 +configure:4787: test -s conftest.o +configure:4790: $? = 0 +configure:4800: result: yes +configure:4810: checking for nl_langinfo and CODESET +configure:4828: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:4831: $? = 0 +configure:4834: test -s conftest +configure:4837: $? = 0 +configure:4848: result: yes +configure:4860: checking for signal global datatype +configure:4896: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:4899: $? = 0 +configure:4902: test -s conftest.o +configure:4905: $? = 0 +configure:4919: result: volatile sig_atomic_t +configure:4926: checking for ANSI C header files +configure:4940: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:4946: $? = 0 +configure:5033: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5036: $? = 0 +configure:5038: ./conftest +configure:5041: $? = 0 +configure:5054: result: yes +configure:5070: checking for sys/types.h +configure:5082: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5085: $? = 0 +configure:5088: test -s conftest.o +configure:5091: $? = 0 +configure:5101: result: yes +configure:5070: checking for sys/stat.h +configure:5082: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5085: $? = 0 +configure:5088: test -s conftest.o +configure:5091: $? = 0 +configure:5101: result: yes +configure:5070: checking for stdlib.h +configure:5101: result: yes +configure:5070: checking for string.h +configure:5082: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5085: $? = 0 +configure:5088: test -s conftest.o +configure:5091: $? = 0 +configure:5101: result: yes +configure:5070: checking for memory.h +configure:5082: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5085: $? = 0 +configure:5088: test -s conftest.o +configure:5091: $? = 0 +configure:5101: result: yes +configure:5070: checking for strings.h +configure:5082: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5085: $? = 0 +configure:5088: test -s conftest.o +configure:5091: $? = 0 +configure:5101: result: yes +configure:5070: checking for inttypes.h +configure:5082: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5085: $? = 0 +configure:5088: test -s conftest.o +configure:5091: $? = 0 +configure:5101: result: yes +configure:5070: checking for stdint.h +configure:5082: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5085: $? = 0 +configure:5088: test -s conftest.o +configure:5091: $? = 0 +configure:5101: result: yes +configure:5070: checking for unistd.h +configure:5101: result: yes +configure:5111: checking for time_t +configure:5132: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5135: $? = 0 +configure:5138: test -s conftest.o +configure:5141: $? = 0 +configure:5151: result: yes +configure:5163: checking for cc_t in or +configure:5190: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5193: $? = 0 +configure:5196: test -s conftest.o +configure:5199: $? = 0 +configure:5211: result: yes +configure:5218: checking for mode_t +configure:5239: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5242: $? = 0 +configure:5245: test -s conftest.o +configure:5248: $? = 0 +configure:5258: result: yes +configure:5270: checking for pid_t +configure:5291: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5294: $? = 0 +configure:5297: test -s conftest.o +configure:5300: $? = 0 +configure:5310: result: yes +configure:5322: checking for uid_t in sys/types.h +configure:5342: result: yes +configure:5356: checking for off_t +configure:5377: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5380: $? = 0 +configure:5383: test -s conftest.o +configure:5386: $? = 0 +configure:5396: result: yes +configure:5428: checking for gethostname +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for getusershell +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for endusershell +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for getlogin +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for initgroups +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for mkdtemp +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for putenv +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for unsetenv +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for sched_yield +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for setpgid +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for strftime +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5445:6: warning: conflicting types for built-in function 'strftime'; expected 'long unsigned int(char *, long unsigned int, const char *, const void *)' [-Wbuiltin-declaration-mismatch] + 5445 | builtin and then its argument prototype would still apply. */ + | ^~~~~~~~ +configure:5437:1: note: 'strftime' is declared in header '' + 5436 | #define $ac_func autoconf_temporary + +++ |+#include + 5437 | #include /* least-intrusive standard header which defines gcc2 __stub macros */ +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for tcgetattr +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for waitpid +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for wcswidth +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5428: checking for wcwidth +configure:5465: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5468: $? = 0 +configure:5471: test -s conftest +configure:5474: $? = 0 +configure:5484: result: yes +configure:5497: checking for lastlog.h +configure:5507: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:5513: $? = 0 +configure:5532: result: yes +configure:5497: checking for paths.h +configure:5507: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:5513: $? = 0 +configure:5532: result: yes +configure:5542: checking for lastlog path +configure:5569: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5572: $? = 0 +configure:5575: test -s conftest.o +configure:5578: $? = 0 +configure:5593: result: _PATH_LASTLOG +configure:5600: checking for utmp implementation +configure:5633: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5621:18: error: conflicting types for 'getutxent'; have 'struct utmp *(void)' + 5621 | main (void) + | ^ +In file included from configure:5620: +/usr/include/utmpx.h:65:22: note: previous declaration of 'getutxent' with type 'struct utmpx *(void)' + 65 | extern struct utmpx *getutxent (void); + | ^~~~~~~~~ +configure:5636: $? = 1 +configure: failed program was: +#line 5617 "configure" +#include "confdefs.h" + +#include +#include +#define getutent getutxent +#ifdef USE_LASTLOG +#include /* may conflict with utmpx.h on Linux */ +#endif + +int +main (void) +{ +struct utmpx x; + char *name = x.ut_name; /* utmp.h and compatible definitions */ + (void)x; + (void)name; + + ; + return 0; +} +configure:5667: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5655:18: error: conflicting types for 'getutxent'; have 'struct utmp *(void)' + 5655 | main (void) + | ^ +In file included from configure:5654: +/usr/include/utmpx.h:65:22: note: previous declaration of 'getutxent' with type 'struct utmpx *(void)' + 65 | extern struct utmpx *getutxent (void); + | ^~~~~~~~~ +configure:5670: $? = 1 +configure: failed program was: +#line 5651 "configure" +#include "confdefs.h" + +#include +#include +#define getutent getutxent +#ifdef USE_LASTLOG +#include /* may conflict with utmpx.h on Linux */ +#endif + +int +main (void) +{ +struct utmpx x; + char *name = x.ut_user; /* utmpx.h must declare this */ + (void)x; + (void)name; + + ; + return 0; +} +configure:5633: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5636: $? = 0 +configure:5639: test -s conftest.o +configure:5642: $? = 0 +configure:5691: result: utmp +configure:5706: checking if utmp.ut_host is declared +configure:5730: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5733: $? = 0 +configure:5736: test -s conftest.o +configure:5739: $? = 0 +configure:5751: result: yes +configure:5761: checking if utmp.ut_syslen is declared +configure:5785: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure: In function 'main': +configure:5776:12: error: 'struct utmp' has no member named 'ut_syslen' + 5776 | struct $cf_cv_have_utmp x; + | ^ +configure:5788: $? = 1 +configure: failed program was: +#line 5768 "configure" +#include "confdefs.h" + +#include +#include +int +main (void) +{ +struct utmp x; + int y = x.ut_syslen; + (void)x; + (void)y + ; + return 0; +} +configure:5806: result: no +configure:5816: checking if utmp.ut_name is declared +configure:5849: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5852: $? = 0 +configure:5855: test -s conftest.o +configure:5858: $? = 0 +configure:5870: result: ut_name +configure:5890: checking for exit-status in utmp +configure:5920: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure: In function 'main': +configure:5911:22: error: 'struct exit_status' has no member named '__e_exit'; did you mean 'e_exit'? + 5911 | struct $cf_cv_have_utmp x; + | ^~~~~ + | e_exit +configure:5923: $? = 1 +configure: failed program was: +#line 5903 "configure" +#include "confdefs.h" + +#include +#include +int +main (void) +{ +struct utmp x; + long y = x.ut_exit.__e_exit = 0; + (void)x; + (void)y + ; + return 0; +} +configure:5920: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5923: $? = 0 +configure:5926: test -s conftest.o +configure:5929: $? = 0 +configure:5942: result: ut_exit.e_exit +configure:5958: checking if utmp.ut_xtime is declared +configure:5982: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:5985: $? = 0 +configure:5988: test -s conftest.o +configure:5991: $? = 0 +configure:6038: result: yes +configure:6057: checking if utmp.ut_session is declared +configure:6081: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:6084: $? = 0 +configure:6087: test -s conftest.o +configure:6090: $? = 0 +configure:6101: result: yes +configure:6112: checking if utmp is SYSV flavor +configure:6139: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:6142: $? = 0 +configure:6145: test -s conftest +configure:6148: $? = 0 +configure:6159: result: yes +configure:6171: checking for lastlog.h +configure:6206: result: yes +configure:6216: checking for struct lastlog +configure:6241: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:6244: $? = 0 +configure:6246: ./conftest +configure:6249: $? = 1 +configure: program exited with status 1 +configure: failed program was: +#line 6227 "configure" +#include "confdefs.h" + +#include +#include +#include + +int main(void) +{ + struct lastlog data; + return (sizeof(data.ll_time) != sizeof(time_t)); +} +configure:6263: result: no +configure:6276: checking for sys/param.h +configure:6286: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:6292: $? = 0 +configure:6311: result: yes +configure:6321: checking if POSIX saved-ids are supported +configure:6358: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:6361: $? = 0 +configure:6364: test -s conftest +configure:6367: $? = 0 +configure:6419: result: yes +configure:6458: checking for termcap.h +configure:6468: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:6474: $? = 0 +configure:6493: result: yes +configure:6503: checking if we want full tgetent function +configure:6520: result: yes +configure:6529: checking for full tgetent function +configure:6585: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +/bin/ld: /tmp/ccol5N2X.o: in function `main': +/var/db/kiss/repos/kiss-mfavila/ports/xterm/xterm-359/configure:6580: undefined reference to `tgetent' +collect2: error: ld returned 1 exit status +configure:6588: $? = 1 +configure: program exited with status 1 +configure: failed program was: +#line 6567 "configure" +#include "confdefs.h" + +#ifdef HAVE_TERMCAP_H +#include +#endif +/* terminfo implementations ignore the buffer argument, making it useless for + * the xterm application, which uses this information to make a new TERMCAP + * environment variable. + */ +int main(void) +{ + char buffer[1024]; + buffer[0] = 0; + tgetent(buffer, "vt100"); + return (buffer[0] == 0); } +no, there is no termcap/tgetent in +configure:6585: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lotermcap >&5 +/bin/ld: cannot find -lotermcap +collect2: error: ld returned 1 exit status +configure:6588: $? = 1 +configure: program exited with status 1 +configure: failed program was: +#line 6567 "configure" +#include "confdefs.h" + +#ifdef HAVE_TERMCAP_H +#include +#endif +/* terminfo implementations ignore the buffer argument, making it useless for + * the xterm application, which uses this information to make a new TERMCAP + * environment variable. + */ +int main(void) +{ + char buffer[1024]; + buffer[0] = 0; + tgetent(buffer, "vt100"); + return (buffer[0] == 0); } +no, there is no termcap/tgetent in otermcap +configure:6585: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -ltermcap >&5 +/bin/ld: cannot find -ltermcap +collect2: error: ld returned 1 exit status +configure:6588: $? = 1 +configure: program exited with status 1 +configure: failed program was: +#line 6567 "configure" +#include "confdefs.h" + +#ifdef HAVE_TERMCAP_H +#include +#endif +/* terminfo implementations ignore the buffer argument, making it useless for + * the xterm application, which uses this information to make a new TERMCAP + * environment variable. + */ +int main(void) +{ + char buffer[1024]; + buffer[0] = 0; + tgetent(buffer, "vt100"); + return (buffer[0] == 0); } +no, there is no termcap/tgetent in termcap +configure:6585: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -ltermlib >&5 +/bin/ld: cannot find -ltermlib +collect2: error: ld returned 1 exit status +configure:6588: $? = 1 +configure: program exited with status 1 +configure: failed program was: +#line 6567 "configure" +#include "confdefs.h" + +#ifdef HAVE_TERMCAP_H +#include +#endif +/* terminfo implementations ignore the buffer argument, making it useless for + * the xterm application, which uses this information to make a new TERMCAP + * environment variable. + */ +int main(void) +{ + char buffer[1024]; + buffer[0] = 0; + tgetent(buffer, "vt100"); + return (buffer[0] == 0); } +no, there is no termcap/tgetent in termlib +configure:6585: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +configure:6588: $? = 0 +configure:6590: ./conftest +configure:6593: $? = 1 +configure: program exited with status 1 +configure: failed program was: +#line 6567 "configure" +#include "confdefs.h" + +#ifdef HAVE_TERMCAP_H +#include +#endif +/* terminfo implementations ignore the buffer argument, making it useless for + * the xterm application, which uses this information to make a new TERMCAP + * environment variable. + */ +int main(void) +{ + char buffer[1024]; + buffer[0] = 0; + tgetent(buffer, "vt100"); + return (buffer[0] == 0); } +no, there is no termcap/tgetent in ncurses +configure:6585: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lcurses >&5 +configure:6588: $? = 0 +configure:6590: ./conftest +configure:6593: $? = 1 +configure: program exited with status 1 +configure: failed program was: +#line 6567 "configure" +#include "confdefs.h" + +#ifdef HAVE_TERMCAP_H +#include +#endif +/* terminfo implementations ignore the buffer argument, making it useless for + * the xterm application, which uses this information to make a new TERMCAP + * environment variable. + */ +int main(void) +{ + char buffer[1024]; + buffer[0] = 0; + tgetent(buffer, "vt100"); + return (buffer[0] == 0); } +no, there is no termcap/tgetent in curses +configure:6614: result: no +configure:6739: checking for partial tgetent function +configure:6761: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lotermcap >&5 +configure: In function 'main': +configure:6754:1: warning: implicit declaration of function 'tgetent' [-Wimplicit-function-declaration] + 6754 | { + | ^ +/bin/ld: cannot find -lotermcap +collect2: error: ld returned 1 exit status +configure:6764: $? = 1 +configure: failed program was: +#line 6749 "configure" +#include "confdefs.h" + +int +main (void) +{ +tgetent(0, "vt100") + ; + return 0; +} +configure:6761: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -ltermcap >&5 +configure: In function 'main': +configure:6754:1: warning: implicit declaration of function 'tgetent' [-Wimplicit-function-declaration] + 6754 | { + | ^ +/bin/ld: cannot find -ltermcap +collect2: error: ld returned 1 exit status +configure:6764: $? = 1 +configure: failed program was: +#line 6749 "configure" +#include "confdefs.h" + +int +main (void) +{ +tgetent(0, "vt100") + ; + return 0; +} +configure:6761: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -ltermlib >&5 +configure: In function 'main': +configure:6754:1: warning: implicit declaration of function 'tgetent' [-Wimplicit-function-declaration] + 6754 | { + | ^ +/bin/ld: cannot find -ltermlib +collect2: error: ld returned 1 exit status +configure:6764: $? = 1 +configure: failed program was: +#line 6749 "configure" +#include "confdefs.h" + +int +main (void) +{ +tgetent(0, "vt100") + ; + return 0; +} +configure:6761: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +configure: In function 'main': +configure:6754:1: warning: implicit declaration of function 'tgetent' [-Wimplicit-function-declaration] + 6754 | { + | ^ +configure:6764: $? = 0 +configure:6767: test -s conftest +configure:6770: $? = 0 +there is a terminfo/tgetent in ncurses +configure:6784: result: -lncurses +configure:6808: checking for termcap.h +configure:6843: result: yes +configure:6863: checking for X applications class +configure:6889: result: XTerm +configure:6892: checking for directory to install resource files +configure:6964: result: ${exec_prefix}/lib/X11/app-defaults +configure:6975: checking for the icon name +configure:6991: result: mini.xterm +configure:6994: checking for icon symlink to use +configure:7013: result: NONE +configure:7029: testing adding icons/filled-xterm to icon-list ... +configure:7029: testing adding icons/mini.xterm to icon-list ... +configure:7036: testing adding icons/mini.xterm_48x48 to icon-list ... +configure:7029: testing adding icons/xterm-color to icon-list ... +configure:7029: testing adding icons/xterm to icon-list ... +configure:7042: checking for directory to install pixmaps +configure:7100: result: ${datadir}/pixmaps +configure:7111: checking for directory to install icons +configure:7169: result: no +configure:7180: checking if icon theme should be used +configure:7198: result: no +configure:7231: checking for icon(s) to install +configure:7237: testing using .svg .png .xpm ... +configure:7312: result: icons/mini.xterm_48x48.png icons/mini.xterm_48x48.xpm +configure:7322: checking for icon name +configure:7324: result: mini.xterm +configure:7328: checking if you want to install desktop files +configure:7345: result: yes +configure:7352: checking for desktop-file-install +configure:7376: result: no +configure:7480: checking for install-permissions reference +configure:7490: result: xterm +configure:7495: checking for PATH separator +configure:7502: result: : +configure:7510: checking for xterm +configure:7527: found /bin/xterm +configure:7538: result: /bin/xterm +configure:7600: testing defining path for /bin/xterm ... +configure:7621: checking for symbolic link to create to xterm +configure:7631: result: xterm +configure:7640: checking if you want to disable openpty +configure:7657: result: no +configure:7660: checking if you want to disable setuid +configure:7677: result: no +configure:7680: checking if you want to disable setgid +configure:7697: result: no +configure:7700: checking if you want to run xterm setuid to a given user +configure:7710: result: no +configure:7723: checking if you want to run xterm setgid to match utmp/utmpx file +configure:7733: result: no +configure:7806: checking if you want to link with utempter +configure:7816: result: no +configure:7931: checking if external errno is declared +configure:7956: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:7959: $? = 0 +configure:7962: test -s conftest.o +configure:7965: $? = 0 +configure:7976: result: yes +configure:7991: checking if external errno exists +configure:8013: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +/bin/ld: errno: TLS definition in /usr/lib/libc.so.6 section .tbss mismatches non-TLS reference in /tmp/ccc7phrT.o +/bin/ld: /usr/lib/libc.so.6: error adding symbols: bad value +collect2: error: ld returned 1 exit status +configure:8016: $? = 1 +configure: failed program was: +#line 7998 "configure" +#include "confdefs.h" + +#undef errno +extern int errno; + +int +main (void) +{ +errno = 2 + ; + return 0; +} +configure:8033: result: no +configure:8046: checking for explicit tty group name +configure:8058: result: auto... +configure:8062: checking for tty group name +configure:8115: result: midfavil +configure:8135: checking if we may use the midfavil group +configure:8174: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +configure:8177: $? = 0 +configure:8179: ./conftest +configure:8182: $? = 1 +configure: program exited with status 1 +configure: failed program was: +#line 8148 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +int main(void) +{ + struct stat sb; + struct group *ttygrp = getgrnam(TTY_GROUP_NAME); + char *name = ttyname(0); + + endgrent(); + if (ttygrp != 0 + && name != 0 + && stat(name, &sb) == 0 + && sb.st_gid != getgid() + && sb.st_gid == ttygrp->gr_gid) { + return (0); + } + return (1); +} + +configure:8200: result: no +configure:8204: WARNING: Cannot use midfavil group +configure:8215: checking for X +configure:8323: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:8329: $? = 0 +configure:8431: result: libraries /usr/lib64, headers +configure:8570: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses -L/usr/lib64 -lX11 >&5 +configure:8573: $? = 0 +configure:8576: test -s conftest +configure:8579: $? = 0 +configure:8705: checking for gethostbyname +configure:8742: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +configure:8745: $? = 0 +configure:8748: test -s conftest +configure:8751: $? = 0 +configure:8761: result: yes +configure:8882: checking for connect +configure:8919: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +configure:8922: $? = 0 +configure:8925: test -s conftest +configure:8928: $? = 0 +configure:8938: result: yes +configure:8998: checking for remove +configure:9035: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +configure:9038: $? = 0 +configure:9041: test -s conftest +configure:9044: $? = 0 +configure:9054: result: yes +configure:9114: checking for shmat +configure:9151: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +configure:9154: $? = 0 +configure:9157: test -s conftest +configure:9160: $? = 0 +configure:9170: result: yes +configure:9239: checking for IceConnectionNumber in -lICE +configure:9266: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 -L/usr/lib64 conftest.c -lICE -lncurses >&5 +configure:9269: $? = 0 +configure:9272: test -s conftest +configure:9275: $? = 0 +configure:9286: result: yes +configure:9296: checking for sys/wait.h that is POSIX.1 compatible +configure:9324: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:9327: $? = 0 +configure:9330: test -s conftest.o +configure:9333: $? = 0 +configure:9343: result: yes +configure:9353: checking for POSIX wait functions +configure:9385: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +configure:9388: $? = 0 +configure:9391: test -s conftest +configure:9394: $? = 0 +configure:9405: result: yes +configure:9412: checking if external sys_nerr is declared +configure:9437: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure: In function 'main': +configure:9430:15: error: 'sys_nerr' undeclared (first use in this function) + 9430 | { + | ^ +configure:9430:15: note: each undeclared identifier is reported only once for each function it appears in +configure:9440: $? = 1 +configure: failed program was: +#line 9419 "configure" +#include "confdefs.h" + +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +int +main (void) +{ +int x = (int) sys_nerr; (void)x + ; + return 0; +} +configure:9457: result: no +configure:9472: checking if external sys_nerr exists +configure:9494: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +/bin/ld: /tmp/ccZOGNLH.o: warning: relocation against `sys_nerr' in read-only section `.text.startup' +/bin/ld: /tmp/ccZOGNLH.o: in function `main': +/var/db/kiss/repos/kiss-mfavila/ports/xterm/xterm-359/configure:9487: undefined reference to `sys_nerr' +/bin/ld: warning: creating DT_TEXTREL in a PIE +collect2: error: ld returned 1 exit status +configure:9497: $? = 1 +configure: failed program was: +#line 9479 "configure" +#include "confdefs.h" + +#undef sys_nerr +extern int sys_nerr; + +int +main (void) +{ +sys_nerr = 2 + ; + return 0; +} +configure:9514: result: no +configure:9527: checking if external sys_errlist is declared +configure:9552: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure: In function 'main': +configure:9545:15: error: 'sys_errlist' undeclared (first use in this function) + 9545 | { + | ^ +configure:9545:15: note: each undeclared identifier is reported only once for each function it appears in +configure:9555: $? = 1 +configure: failed program was: +#line 9534 "configure" +#include "confdefs.h" + +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +int +main (void) +{ +int x = (int) sys_errlist; (void)x + ; + return 0; +} +configure:9572: result: no +configure:9587: checking if external sys_errlist exists +configure:9609: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lncurses >&5 +/bin/ld: /tmp/ccgu9C5I.o: warning: relocation against `sys_errlist' in read-only section `.text.startup' +/bin/ld: /tmp/ccgu9C5I.o: in function `main': +/var/db/kiss/repos/kiss-mfavila/ports/xterm/xterm-359/configure:9602: undefined reference to `sys_errlist' +/bin/ld: warning: creating DT_TEXTREL in a PIE +collect2: error: ld returned 1 exit status +configure:9612: $? = 1 +configure: failed program was: +#line 9594 "configure" +#include "confdefs.h" + +#undef sys_errlist +extern int sys_errlist; + +int +main (void) +{ +sys_errlist = 2 + ; + return 0; +} +configure:9629: result: no +configure:9665: checking for termios.h +configure:9700: result: yes +configure:9665: checking for stdlib.h +configure:9700: result: yes +configure:9665: checking for X11/Intrinsic.h +configure:9675: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:9681: $? = 0 +configure:9700: result: yes +configure:9710: checking if we should define SYSV +configure:9761: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:9736:10: fatal error: sys/termio.h: No such file or directory + 9736 | #include /* declare sys_errlist on older systems */ + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +compilation terminated. +configure:9764: $? = 1 +configure: failed program was: +#line 9717 "configure" +#include "confdefs.h" + +#undef SYSV +#define SYSV 1 /* get Xos.h to declare sys_errlist[] */ +#ifdef HAVE_STDLIB_H +#include /* look for wchar_t */ +#endif +#ifdef HAVE_X11_INTRINSIC_H +#include /* Intrinsic.h has other traps... */ +#endif +#ifdef HAVE_TERMIOS_H /* needed for HPUX 10.20 */ +#include +#define STRUCT_TERMIOS struct termios +#else +#define STRUCT_TERMIOS struct termio +#endif +#include +#include /* eliminate most BSD hacks */ +#include /* declare sys_errlist on older systems */ +#include /* eliminate most of the remaining ones */ + +int +main (void) +{ + +static STRUCT_TERMIOS d_tio; + d_tio.c_cc[VINTR] = 0; + d_tio.c_cc[VQUIT] = 0; + d_tio.c_cc[VERASE] = 0; + d_tio.c_cc[VKILL] = 0; + d_tio.c_cc[VEOF] = 0; + d_tio.c_cc[VEOL] = 0; + d_tio.c_cc[VMIN] = 0; + d_tio.c_cc[VTIME] = 0; +#if defined(HAVE_SYS_ERRLIST) && !defined(DECL_SYS_ERRLIST) +sys_errlist[0] = ""; /* Cygwin mis-declares this */ +#endif + + ; + return 0; +} +configure:9781: result: no +configure:9792: checking for elf_begin in -lelf +configure:9819: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lelf -lncurses >&5 +configure:9822: $? = 0 +configure:9825: test -s conftest +configure:9828: $? = 0 +configure:9839: result: yes +configure:9843: checking if this is an SVR4 system +configure:9879: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:9856:10: fatal error: sys/termio.h: No such file or directory + 9856 | #include + | ^~~~~~~ +compilation terminated. +configure:9882: $? = 1 +configure: failed program was: +#line 9850 "configure" +#include "confdefs.h" + +#if defined(__CYGWIN__) +make an error +#endif +#include +#include + +int +main (void) +{ + +static struct termio d_tio; + d_tio.c_cc[VINTR] = 0; + d_tio.c_cc[VQUIT] = 0; + d_tio.c_cc[VERASE] = 0; + d_tio.c_cc[VKILL] = 0; + d_tio.c_cc[VEOF] = 0; + d_tio.c_cc[VEOL] = 0; + d_tio.c_cc[VMIN] = 0; + d_tio.c_cc[VTIME] = 0; + d_tio.c_cc[VLNEXT] = 0; + + ; + return 0; +} +configure:9899: result: no +configure:9909: checking if you want to use pkg-config +configure:9919: result: yes +configure:9971: checking for pkg-config +configure:9988: found /bin/pkg-config +configure:10000: result: /bin/pkg-config +configure:10623: testing found package xt ... +configure:10629: testing package xt CFLAGS: ... +configure:10633: testing package xt LIBS: -lXt -lX11 ... +configure:10958: checking for usable X Toolkit package +configure:10980: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:10983: $? = 0 +configure:10986: test -s conftest +configure:10989: $? = 0 +configure:10999: result: yes +configure:11745: checking for X11/DECkeysym.h +configure:11755: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:11761: $? = 0 +configure:11780: result: yes +configure:11745: checking for X11/Sunkeysym.h +configure:11755: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:11761: $? = 0 +configure:11780: result: yes +configure:11745: checking for X11/XF86keysym.h +configure:11755: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:11761: $? = 0 +configure:11780: result: yes +configure:11745: checking for X11/XKBlib.h +configure:11755: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:11761: $? = 0 +configure:11780: result: yes +configure:11745: checking for X11/TranslateI.h +configure:11755: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:11761: $? = 0 +configure:11780: result: yes +configure:11745: checking for X11/Xpoll.h +configure:11755: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:11761: $? = 0 +configure:11780: result: yes +configure:11745: checking for X11/extensions/XKB.h +configure:11755: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:11761: $? = 0 +configure:11780: result: yes +configure:11795: checking if you want to use the Xpm library for colored icon +configure:11805: result: yes +configure:11813: checking for X11/xpm.h +configure:11823: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:11829: $? = 0 +configure:11848: result: yes +configure:11852: checking for XpmCreatePixmapFromData in -lXpm +configure:11879: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lXpm -lX11 -L/usr/lib64 -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:11882: $? = 0 +configure:11885: test -s conftest +configure:11888: $? = 0 +configure:11899: result: yes +configure:11919: checking if you want to use the Xinerama extension +configure:11929: result: yes +configure:11936: testing found package xinerama ... +configure:11942: testing package xinerama CFLAGS: ... +configure:11946: testing package xinerama LIBS: -lXinerama ... +configure:12195: checking if you want to link with Xaw 3d library +configure:12209: result: no +configure:12213: checking if you want to link with Xaw 3d xft library +configure:12227: result: no +configure:12231: checking if you want to link with neXT Athena library +configure:12242: result: yes +configure:12249: checking if you want to link with Athena-Plus library +configure:12263: result: no +configure:12808: checking for XextCreateExtension in -lXext +configure:12835: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:12838: $? = 0 +configure:12841: test -s conftest +configure:12844: $? = 0 +configure:12855: result: yes +configure:13445: testing found package xt ... +configure:13451: testing package xt CFLAGS: ... +configure:13455: testing package xt LIBS: -lXt -lX11 ... +configure:13780: checking for usable X Toolkit package +configure:13821: result: yes +configure:14592: checking for X11/neXtaw/SimpleMenu.h +configure:14610: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:14613: $? = 0 +configure:14616: test -s conftest.o +configure:14619: $? = 0 +configure:14628: result: yes +configure:14709: checking for XawSimpleMenuAddGlobalActions in -lneXtaw -lXmu +configure:14728: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses -lSM -lICE -L/usr/lib64 >&5 +configure:14731: $? = 0 +configure:14734: test -s conftest +configure:14737: $? = 0 +configure:14746: result: yes +configure:14795: checking for X11/Xpoll.h +configure:14830: result: yes +configure:14840: checking for declaration of fd_set +configure:14846: testing sys/types alone ... +configure:14862: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:14865: $? = 0 +configure:14868: test -s conftest.o +configure:14871: $? = 0 +configure:14952: result: sys/types.h +configure:14962: checking for declaration of fd_mask +configure:15041: result: sys/types.h +configure:15051: checking for IRIX 6.5 baud-rate redefinitions +configure:15077: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:15061:10: fatal error: sys/termio.h: No such file or directory +15061 | #include + | ^~~~~~~~~~~~~ +compilation terminated. +configure:15080: $? = 1 +configure: failed program was: +#line 15058 "configure" +#include "confdefs.h" + +#include +#include +int +main (void) +{ + +struct termio foo; +foo.c_ispeed = B38400; +foo.c_ospeed = B9600; +(void)foo; + + ; + return 0; +} +configure:15098: result: no +configure:15105: checking for termios type tcflag_t +configure:15125: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:15128: $? = 0 +configure:15131: test -s conftest.o +configure:15134: $? = 0 +configure:15145: result: yes +configure:15152: checking for termios type speed_t +configure:15172: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:15175: $? = 0 +configure:15178: test -s conftest.o +configure:15181: $? = 0 +configure:15192: result: yes +configure:15199: checking for termios type cc_t +configure:15219: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:15222: $? = 0 +configure:15225: test -s conftest.o +configure:15228: $? = 0 +configure:15239: result: yes +configure:15247: checking for XcursorGetTheme in -lXcursor +configure:15274: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lXcursor -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:15277: $? = 0 +configure:15280: test -s conftest +configure:15283: $? = 0 +configure:15294: result: yes +configure:15311: checking for stropts.h +configure:15321: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:15318:10: fatal error: stropts.h: No such file or directory +15318 | #include "confdefs.h" + | ^~~~~~~~~~~ +compilation terminated. +configure:15327: $? = 1 +configure: failed program was: +#line 15317 "configure" +#include "confdefs.h" +#include +configure:15346: result: no +configure:15376: checking for grantpt +configure:15413: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:15416: $? = 0 +configure:15419: test -s conftest +configure:15422: $? = 0 +configure:15432: result: yes +configure:15376: checking for ptsname +configure:15413: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:15416: $? = 0 +configure:15419: test -s conftest +configure:15422: $? = 0 +configure:15432: result: yes +configure:15376: checking for posix_openpt +configure:15413: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:15416: $? = 0 +configure:15419: test -s conftest +configure:15422: $? = 0 +configure:15432: result: yes +configure:15444: checking if grantpt really works +configure:15548: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:15551: $? = 0 +configure:15554: test -s conftest +configure:15557: $? = 0 +configure:15663: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:15666: $? = 0 +configure:15668: ./conftest +configure:15671: $? = 0 +configure:15690: result: yes +configure:15696: checking for pty features +configure:15712: testing pty feature test 4:5 ... +configure:15821: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:15824: $? = 0 +configure:15826: ./conftest +configure:15829: $? = 0 +configure:15712: testing pty feature test 5:5 ... +configure:15821: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:15824: $? = 0 +configure:15826: ./conftest +configure:15829: $? = 0 +configure:15712: testing pty feature test 6:5 ... +configure:15821: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:15824: $? = 0 +configure:15826: ./conftest +configure:15829: $? = 0 +configure:15880: result: pty_isatty pty_tcsetattr tty_tcsetattr +configure:15893: checking for openpty in -lutil +configure:15920: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:15923: $? = 0 +configure:15926: test -s conftest +configure:15929: $? = 0 +configure:15940: result: yes +configure:15963: checking for util.h +configure:15973: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:15970:10: fatal error: util.h: No such file or directory +15970 | #include "confdefs.h" + | ^~~~~~~~ +compilation terminated. +configure:15979: $? = 1 +configure: failed program was: +#line 15969 "configure" +#include "confdefs.h" +#include +configure:15998: result: no +configure:15963: checking for libutil.h +configure:15973: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:15970:10: fatal error: libutil.h: No such file or directory +15970 | #include "confdefs.h" + | ^~~~~~~~~~~ +compilation terminated. +configure:15979: $? = 1 +configure: failed program was: +#line 15969 "configure" +#include "confdefs.h" +#include +configure:15998: result: no +configure:15963: checking for pty.h +configure:15973: gcc -E -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c +configure:15979: $? = 0 +configure:15998: result: yes +configure:16041: testing will rely upon openpty ... +configure:16045: checking if we can use XkbQueryExtension +configure:16081: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:16084: $? = 0 +configure:16087: test -s conftest.o +configure:16090: $? = 0 +configure:16105: result: yes +configure:16114: checking for XkbQueryExtension +configure:16151: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:16154: $? = 0 +configure:16157: test -s conftest +configure:16160: $? = 0 +configure:16170: result: yes +configure:16182: checking if we can use XkbKeycodeToKeysym +configure:16207: gcc -c -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c >&5 +configure:16210: $? = 0 +configure:16213: test -s conftest.o +configure:16216: $? = 0 +configure:16231: result: yes +configure:16240: checking for XkbKeycodeToKeysym +configure:16277: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:16280: $? = 0 +configure:16283: test -s conftest +configure:16286: $? = 0 +configure:16296: result: yes +configure:16324: checking for XKB Bell extension +configure:16352: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses -lSM -lICE -L/usr/lib64 >&5 +configure: In function 'main': +configure:16344:31: warning: passing argument 2 of 'XkbBell' makes integer from pointer without a cast [-Wint-conversion] +16344 | (void)x; + | ^ + | | + | struct _WidgetRec * +In file included from configure:16334: +/usr/include/X11/XKBlib.h:457:9: note: expected 'Window' {aka 'long unsigned int'} but argument is of type 'struct _WidgetRec *' + 457 | Window /* win */, + | ^~~~~~ +configure:16355: $? = 0 +configure:16358: test -s conftest +configure:16361: $? = 0 +configure:16372: result: yes +configure:16386: checking for Xutf8LookupString +configure:16423: gcc -o conftest -g -O2 -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=700 conftest.c -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:16426: $? = 0 +configure:16429: test -s conftest +configure:16432: $? = 0 +configure:16442: result: yes +configure:16458: checking if you want narrow prototypes for X libraries +configure:16484: result: yes +configure:16487: checking if we should use imake to help +configure:16504: result: yes +configure:16513: checking for xmkmf +configure:16530: found /bin/xmkmf +configure:16541: result: /bin/xmkmf +configure:16604: testing Using /bin/xmkmf ... +configure:16699: testing IMAKE_CFLAGS -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DUSE_TERMINFO -DHAVE_TIGETSTR -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -DPROJECTROOT='"/usr"' -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -D__vendorversion__='"Version 7.7.0 X.Org"' -I/usr/include ... +configure:16703: testing IMAKE_LOADFLAGS ... +configure:16959: checking for groff +configure:16976: found /bin/groff +configure:16988: result: /bin/groff +configure:16999: checking for nroff +configure:17016: found /bin/nroff +configure:17027: result: /bin/nroff +configure:17040: checking for tbl +configure:17057: found /bin/tbl +configure:17069: result: /bin/tbl +configure:17092: checking for man2html +configure:17121: result: no +configure:17148: checking for program to convert manpage to html +configure:17207: result: /bin/groff +configure:17356: testing removing terminfo flags from IMAKE_CFLAGS ... +configure:17361: testing ...result -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -DPROJECTROOT='"/usr"' -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -D__vendorversion__='"Version 7.7.0 X.Org"' -I/usr/include ... +configure:17365: testing removing terminfo flags from CPPFLAGS ... +configure:17370: testing ...result -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include ... +configure:17376: checking for default terminal-id +configure:17386: result: vt420 +configure:17397: checking for default terminal-type +configure:17407: result: xterm +configure:17415: checking if backarrow-key should be BS +configure:17433: result: yes +configure:17454: checking if backarrow-key should be treated as erase +configure:17472: result: no +configure:17493: checking for default backspace/DEL setting +configure:17504: result: maybe +configure:17525: checking for default pty initial erase setting +configure:17536: result: False +configure:17557: checking if alt should send ESC +configure:17575: result: no +configure:17596: checking if meta should send ESC +configure:17614: result: no +configure:17638: checking for tic +configure:17653: found /bin/tic +configure:17662: result: yes +configure:17681: checking for private terminfo-directory +configure:17691: result: none +configure:17746: checking if you want active-icons +configure:17763: result: yes +configure:17773: checking if you want ANSI color +configure:17790: result: yes +configure:17799: checking if you want 16 colors like aixterm +configure:17816: result: yes +configure:17823: checking if you want 256 colors +configure:17840: result: yes +configure:17852: checking if you want direct-color support +configure:17869: result: yes +configure:17914: checking if you want blinking cursor +configure:17931: result: yes +configure:17938: checking if you want to ignore Linux's broken palette-strings +configure:17962: result: yes +configure:17978: checking if you want to allow broken string-terminators +configure:17995: result: yes +configure:18002: checking if you want to compile-in icon data +configure:18019: result: no +configure:18026: checking if you want printable 128-159 +configure:18043: result: yes +configure:18052: checking if you want bold colors mapped like IBM PC +configure:18069: result: yes +configure:18076: checking if you want separate color-classes +configure:18093: result: yes +configure:18100: checking if you want color-mode enabled by default +configure:18117: result: yes +configure:18126: checking if you want support for color highlighting +configure:18143: result: yes +configure:18150: checking if you want support for doublesize characters +configure:18167: result: yes +configure:18174: checking if you want fallback-support for box characters +configure:18191: result: yes +configure:18198: checking if you want to allow spawning new xterms +configure:18215: result: no +configure:18391: checking for XextCreateExtension in -lXext +configure:18438: result: yes +configure:18462: checking for X11/extensions/Xdbe.h +configure:18472: gcc -E -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include conftest.c +configure:18478: $? = 0 +configure:18497: result: yes +configure:18505: checking for XdbeSwapBuffers +configure:18542: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include conftest.c -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:18545: $? = 0 +configure:18548: test -s conftest +configure:18551: $? = 0 +configure:18561: result: yes +configure:18576: checking if you want to enable double-buffering in default resources +configure:18593: result: no +configure:18605: checking if you want to use FreeType library +configure:18622: result: yes +configure:18632: checking for FreeType configuration script +configure:18644: result: auto +configure:18824: checking for FreeType config +configure:18826: result: /bin/pkg-config xft +configure:18830: checking for /bin/pkg-config cflags +configure:18833: result: -I/usr/include/freetype2 -I/usr/include/libpng16 +configure:18838: checking for /bin/pkg-config libs +configure:18841: result: -lXft +configure:18854: checking if we can link with FreeType libraries +configure:18895: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:18898: $? = 0 +configure:18901: test -s conftest +configure:18904: $? = 0 +configure:18913: result: yes +configure:19046: checking for XftDrawCharSpec +configure:19083: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:19086: $? = 0 +configure:19089: test -s conftest +configure:19092: $? = 0 +configure:19102: result: yes +configure:19046: checking for XftDrawSetClip +configure:19083: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:19086: $? = 0 +configure:19089: test -s conftest +configure:19092: $? = 0 +configure:19102: result: yes +configure:19046: checking for XftDrawSetClipRectangles +configure:19083: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:19086: $? = 0 +configure:19089: test -s conftest +configure:19092: $? = 0 +configure:19102: result: yes +configure:19121: checking for usable Xft/fontconfig package +configure:19147: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +/bin/ld: /tmp/ccaVmhzp.o: undefined reference to symbol 'FcPatternBuild' +/bin/ld: /usr/lib/libfontconfig.so.1: error adding symbols: DSO missing from command line +collect2: error: ld returned 1 exit status +configure:19150: $? = 1 +configure: failed program was: +#line 19128 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + XftPattern *pat = 0; + XftPatternBuild(pat, + XFT_FAMILY, XftTypeString, "mono", + (void *) 0); + + ; + return 0; +} +configure:19167: result: no +configure:19179: testing work around broken package ... +configure:19186: testing found package fontconfig ... +configure:19192: testing package fontconfig CFLAGS: -I/usr/include/freetype2 -I/usr/include/libpng16 ... +configure:19196: testing package fontconfig LIBS: -lfontconfig -lfreetype ... +configure:19414: testing ...before -lXft -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses ... +configure:19419: testing ...after -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses ... +configure:19445: checking if you want support for HP-style function keys +configure:19462: result: no +configure:19472: checking if you want support for SCO-style function keys +configure:19489: result: no +configure:19499: checking if you want support for Sun-style function keys +configure:19516: result: yes +configure:19526: checking if you want saved-lines stored as a FIFO +configure:19543: result: yes +configure:19553: checking if you want support for internationalization +configure:19570: result: yes +configure:19580: checking if you want support for initial-erase setup +configure:19597: result: yes +configure:19607: checking if you want support for input-method +configure:19624: result: yes +configure:19627: checking if X libraries support input-method +configure:19668: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:19671: $? = 0 +configure:19674: test -s conftest +configure:19677: $? = 0 +configure:19687: result: yes +configure:19706: checking if you want support for load-vt-fonts +configure:19723: result: no +configure:19733: checking if you want support for logging +configure:19750: result: no +configure:19786: checking if you want support for iconify/maximize translations +configure:19803: result: yes +configure:19810: checking if you want NumLock to override keyboard tables +configure:19827: result: yes +configure:19834: checking if you want support for get/set of base64 selection data +configure:19851: result: yes +configure:19867: checking if you want support for pty-handshaking +configure:19884: result: yes +configure:19900: checking if you want support for mouse in readline applications +configure:19917: result: no +configure:19927: checking if you want support for regular-expression selections +configure:19944: result: yes +configure:19948: checking if you want to use PCRE2 for regular-expressions +configure:19957: result: no +configure:20446: checking if you want to use PCRE for regular-expressions +configure:20455: result: no +configure:20832: checking for regcomp +configure:20869: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:20872: $? = 0 +configure:20875: test -s conftest +configure:20878: $? = 0 +configure:20888: result: yes +configure:21114: checking for regular-expression headers +configure:21189: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:21192: $? = 0 +configure:21195: test -s conftest +configure:21198: $? = 0 +configure:21214: result: regex.h +configure:21251: checking if you want support for right-scrollbar +configure:21268: result: yes +configure:21278: checking if you want check for redundant name-change +configure:21295: result: yes +configure:21302: checking if you want support for selection-actions +configure:21319: result: yes +configure:21326: checking if you want support for session management +configure:21343: result: yes +configure:21350: checking if you want to use termcap function-keys +configure:21367: result: yes +configure:21374: checking if you want to use termcap-query/report +configure:21391: result: yes +configure:21398: checking if you want support for tek4014 +configure:21415: result: yes +configure:21429: checking if you want pulldown menus with a toolbar +configure:21446: result: yes +configure:21456: checking if you want VT52 emulation +configure:21473: result: yes +configure:21480: checking if you want wide-attribute support +configure:21497: result: yes +configure:21506: checking if you want wide-character support +configure:21523: result: yes +configure:21530: checking if you want only 16-bit character support +configure:21547: result: no +configure:21561: checking if you want to use mini-luit/Latin9 built-in support +configure:21578: result: no +configure:21588: checking if you want to use luit +configure:21605: result: yes +configure:21618: checking for xterm-filter +configure:21649: result: no +configure:21618: checking for xterm-filter +configure:21649: result: no +configure:21618: checking for bluit +configure:21649: result: no +configure:21618: checking for luit +configure:21649: result: no +configure:21732: checking if you want dynamic-abbreviation support +configure:21749: result: no +configure:21759: checking if you want DECterm Locator support +configure:21776: result: no +configure:21786: checking if you want XHTML and SVG screen dump support +configure:21803: result: yes +configure:21816: checking if you want ReGIS graphics support +configure:21833: result: no +configure:21912: checking if you want sixel graphics support +configure:21929: result: yes +configure:21953: checking if you want VT420 rectangle support +configure:21970: result: yes +configure:21980: checking if you want -ziconbeep option +configure:21997: result: yes +configure:22006: checking if you want debugging traces +configure:22023: result: no +configure:22035: checking if you want to use dmalloc for testing +configure:22052: result: no +configure:22267: checking if you want to use dbmalloc for testing +configure:22284: result: no +configure:22499: checking if you want to use valgrind for testing +configure:22516: result: no +configure:22629: checking if you want to perform memory-leak testing +configure:22639: result: no +configure:22654: checking if you want to see long compiling messages +configure:22688: result: yes +configure:22691: checking if you want magic cookie emulation +configure:22708: result: no +configure:22723: checking for tigetstr +configure:22760: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:22763: $? = 0 +configure:22766: test -s conftest +configure:22769: $? = 0 +configure:22779: result: yes +configure:22794: checking for use_extended_names +configure:22831: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:22834: $? = 0 +configure:22837: test -s conftest +configure:22840: $? = 0 +configure:22850: result: yes +configure:22863: checking if you want to turn on gcc warnings +configure:22880: result: no +configure:23287: checking if filesystem supports mixed-case filenames +configure:23314: result: yes +configure:23325: checking for exctags +configure:23351: result: no +configure:23325: checking for ctags +configure:23351: result: no +configure:23362: checking for exetags +configure:23388: result: no +configure:23362: checking for etags +configure:23388: result: no +configure:23397: checking for ctags +configure:23421: result: no +configure:23431: checking for etags +configure:23455: result: no +configure:23481: checking for an rpath option +configure:23512: result: -Wl,-rpath, +configure:23576: checking if rpath-hack should be disabled +configure:23593: result: no +configure:23597: checking for updated LDFLAGS +configure:23600: result: maybe +configure:23607: checking for ldd +configure:23622: found /bin/ldd +configure:23630: result: ldd +configure:23659: gcc -o conftest -g -O2 -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16 conftest.c -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses >&5 +configure:23662: $? = 0 +configure:23665: test -s conftest +configure:23668: $? = 0 +configure:23708: testing ...checking EXTRA_LDFLAGS ... +configure:23712: testing ...checking LDFLAGS ... +configure:23762: testing ...checked LDFLAGS ... +configure:23766: testing ...checking LIBS -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses ... +configure:23816: testing ...checked LIBS -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses ... +configure:23820: testing ...checked EXTRA_LDFLAGS ... +configure:23918: creating ./config.status + +## ----------------------- ## +## Running config.status. ## +## ----------------------- ## + +This file was extended by config.status 2.52.20200802, executed with + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + > ./config.status +on commandante + +config.status:24464: creating Makefile +config.status:24464: creating df-install +config.status:24464: creating minstall +config.status:24617: creating xtermcfg.h + +## ----------------- ## +## Cache variables. ## +## ----------------- ## + +ac_cv_build=x86_64-pc-linux-gnu +ac_cv_build_alias=x86_64-pc-linux-gnu +ac_cv_c_compiler_gnu=yes +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_LDFLAGS_set= +ac_cv_env_LDFLAGS_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set= +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_func_XdbeSwapBuffers=yes +ac_cv_func_XftDrawCharSpec=yes +ac_cv_func_XftDrawSetClip=yes +ac_cv_func_XftDrawSetClipRectangles=yes +ac_cv_func_XkbKeycodeToKeysym=yes +ac_cv_func_XkbQueryExtension=yes +ac_cv_func_Xutf8LookupString=yes +ac_cv_func_connect=yes +ac_cv_func_endusershell=yes +ac_cv_func_gethostbyname=yes +ac_cv_func_gethostname=yes +ac_cv_func_getlogin=yes +ac_cv_func_getusershell=yes +ac_cv_func_grantpt=no +ac_cv_func_initgroups=yes +ac_cv_func_mkdtemp=yes +ac_cv_func_posix_openpt=yes +ac_cv_func_ptsname=yes +ac_cv_func_putenv=yes +ac_cv_func_regcomp=yes +ac_cv_func_remove=yes +ac_cv_func_sched_yield=yes +ac_cv_func_setpgid=yes +ac_cv_func_shmat=yes +ac_cv_func_strftime=yes +ac_cv_func_tcgetattr=yes +ac_cv_func_tigetstr=yes +ac_cv_func_unsetenv=yes +ac_cv_func_use_extended_names=yes +ac_cv_func_waitpid=yes +ac_cv_func_wcswidth=yes +ac_cv_func_wcwidth=yes +ac_cv_have_x='have_x=yes ac_x_includes= ac_x_libraries=/usr/lib64' +ac_cv_header_X11_DECkeysym_h=yes +ac_cv_header_X11_Intrinsic_h=yes +ac_cv_header_X11_Sunkeysym_h=yes +ac_cv_header_X11_TranslateI_h=yes +ac_cv_header_X11_XF86keysym_h=yes +ac_cv_header_X11_XKBlib_h=yes +ac_cv_header_X11_Xpoll_h=yes +ac_cv_header_X11_extensions_XKB_h=yes +ac_cv_header_X11_extensions_Xdbe_h=yes +ac_cv_header_X11_xpm_h=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_lastlog_h=yes +ac_cv_header_libutil_h=no +ac_cv_header_memory_h=yes +ac_cv_header_ncurses_curses_h=no +ac_cv_header_ncurses_term_h=no +ac_cv_header_paths_h=yes +ac_cv_header_pty_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_stropts_h=no +ac_cv_header_sys_param_h=yes +ac_cv_header_sys_ptem_h=no +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_ttydefaults_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_sys_wait_h=yes +ac_cv_header_term_h=yes +ac_cv_header_termcap_h=yes +ac_cv_header_termios_h=yes +ac_cv_header_time=yes +ac_cv_header_unistd_h=yes +ac_cv_header_util_h=no +ac_cv_header_wchar_h=yes +ac_cv_host=x86_64-pc-linux-gnu +ac_cv_host_alias=x86_64-pc-linux-gnu +ac_cv_lib_ICE_IceConnectionNumber=yes +ac_cv_lib_Xcursor_XcursorGetTheme=yes +ac_cv_lib_Xext_XextCreateExtension=yes +ac_cv_lib_Xpm_XpmCreatePixmapFromData=yes +ac_cv_lib_elf_elf_begin=yes +ac_cv_lib_util_openpty=yes +ac_cv_objext=o +ac_cv_path_GROFF_PATH=/bin/groff +ac_cv_path_IMAKE=/bin/xmkmf +ac_cv_path_NROFF_PATH=/bin/nroff +ac_cv_path_TBL_PATH=/bin/tbl +ac_cv_path_XTERM_PATH=/bin/xterm +ac_cv_path_ac_pt_PKG_CONFIG=/bin/pkg-config +ac_cv_path_cf_man2html=no +ac_cv_path_install='/bin/install -c' +ac_cv_prog_AWK=awk +ac_cv_prog_CPP='gcc -E' +ac_cv_prog_MAKE_LOWER_TAGS=no +ac_cv_prog_MAKE_UPPER_TAGS=no +ac_cv_prog_ac_ct_CC=gcc +ac_cv_prog_cc_g=yes +ac_cv_prog_cc_stdc= +ac_cv_prog_cf_ldd_prog=ldd +ac_cv_prog_cf_tic_prog=yes +ac_cv_prog_desktop_utils=no +ac_cv_type_mode_t=yes +ac_cv_type_off_t=yes +ac_cv_type_pid_t=yes +ac_cv_type_time_t=yes +ac_cv_type_uid_t=yes +am_cv_langinfo_codeset=yes +cf_cv_dcl_errno=yes +cf_cv_dcl_sys_errlist=no +cf_cv_dcl_sys_nerr=no +cf_cv_define_sigwinch=yes +cf_cv_found_freetype=yes +cf_cv_gnu_dftsrc_219=yes +cf_cv_gnu_library=yes +cf_cv_gnu_library_219=yes +cf_cv_have_errno=no +cf_cv_have_sys_errlist=no +cf_cv_have_sys_nerr=no +cf_cv_have_utmp=utmp +cf_cv_have_utmp_ut_host=yes +cf_cv_have_utmp_ut_name=ut_name +cf_cv_have_utmp_ut_session=yes +cf_cv_have_utmp_ut_syslen=no +cf_cv_have_utmp_ut_xstatus=ut_exit.e_exit +cf_cv_have_utmp_ut_xtime=yes +cf_cv_havetype_cc_t=yes +cf_cv_havetype_speed_t=yes +cf_cv_havetype_tcflag_t=yes +cf_cv_icon_list=' icons/filled-xterm icons/mini.xterm icons/mini.xterm_48x48 icons/xterm-color icons/xterm' +cf_cv_input_method=yes +cf_cv_lib_part_tgetent=-lncurses +cf_cv_lib_tgetent=no +cf_cv_mixedcase=yes +cf_cv_path_lastlog=_PATH_LASTLOG +cf_cv_posix_saved_ids=yes +cf_cv_posix_visible=no +cf_cv_posix_wait=yes +cf_cv_regex_hdrs=regex.h +cf_cv_sig_atomic_t='volatile sig_atomic_t' +cf_cv_struct_lastlog=no +cf_cv_svr4=no +cf_cv_system_name=linux-gnu +cf_cv_sysv=no +cf_cv_sysv_utmp=yes +cf_cv_termio_c_ispeed=no +cf_cv_tty_group=no +cf_cv_tty_group_name=midfavil +cf_cv_type_cc_t=yes +cf_cv_type_fd_mask=sys/types.h +cf_cv_type_fd_set=sys/types.h +cf_cv_x_freetype_cfgs=auto +cf_cv_x_freetype_incs='-I/usr/include/freetype2 -I/usr/include/libpng16 ' +cf_cv_x_freetype_libs=' -lXft ' +cf_cv_xft_compat=no +cf_cv_xkb_bell_ext=yes +cf_cv_xkb_keycode_to_keysym=yes +cf_cv_xkb_query_extension=yes +cf_cv_xt_ice_compat=yes + +## ------------ ## +## confdefs.h. ## +## ------------ ## + +#define SYSTEM_NAME "linux-gnu" +#define HAVE_STDLIB_H 1 +#define HAVE_SYS_TTYDEFAULTS_H 1 +#define HAVE_TERM_H 1 +#define HAVE_TERMIOS_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_WCHAR_H 1 +#define TIME_WITH_SYS_TIME 1 +#define HAVE_LANGINFO_CODESET 1 +#define SIG_ATOMIC_T volatile sig_atomic_t +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_GETHOSTNAME 1 +#define HAVE_GETUSERSHELL 1 +#define HAVE_ENDUSERSHELL 1 +#define HAVE_GETLOGIN 1 +#define HAVE_INITGROUPS 1 +#define HAVE_MKDTEMP 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_SCHED_YIELD 1 +#define HAVE_SETPGID 1 +#define HAVE_STRFTIME 1 +#define HAVE_TCGETATTR 1 +#define HAVE_WAITPID 1 +#define HAVE_WCSWIDTH 1 +#define HAVE_WCWIDTH 1 +#define HAVE_LASTLOG_H 1 +#define HAVE_PATHS_H 1 +#define USE_LASTLOG 1 +#define HAVE_UTMP 1 +#define HAVE_UTMP_UT_HOST 1 +#define HAVE_UTMP_UT_XSTATUS 1 +#define ut_xstatus ut_exit.e_exit +#define HAVE_UTMP_UT_XTIME 1 +#define HAVE_UTMP_UT_SESSION 1 +#define USE_SYSV_UTMP 1 +#define HAVE_LASTLOG_H 1 +#define HAVE_SYS_PARAM_H 1 +#define HAVE_POSIX_SAVED_IDS 1 +#define HAVE_TERMCAP_H 1 +#define HAVE_TERMCAP_H 1 +#define USE_TERMINFO 1 +#define XTERM_PATH_PATH "/bin/xterm" +#define TTY_GROUP_NAME "midfavil" +#define HAVE_SYS_WAIT_H 1 +#define USE_POSIX_WAIT 1 +#define DECL_SYS_NERR 1 +#define DECL_SYS_ERRLIST 1 +#define HAVE_TERMIOS_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_X11_INTRINSIC_H 1 +#define HAVE_X11_DECKEYSYM_H 1 +#define HAVE_X11_SUNKEYSYM_H 1 +#define HAVE_X11_XF86KEYSYM_H 1 +#define HAVE_X11_XKBLIB_H 1 +#define HAVE_X11_TRANSLATEI_H 1 +#define HAVE_X11_XPOLL_H 1 +#define HAVE_X11_EXTENSIONS_XKB_H 1 +#define HAVE_LIBXPM 1 +#define HAVE_X11_EXTENSIONS_XINERAMA_H 1 +#define HAVE_LIB_NEXTAW 1 +#define HAVE_X11_XPOLL_H 1 +#define HAVE_LIB_XCURSOR 1 +#define HAVE_GRANTPT 1 +#define HAVE_PTSNAME 1 +#define HAVE_POSIX_OPENPT 1 +#define HAVE_OPENPTY 1 +#define HAVE_PTY_H 1 +#define HAVE_XKBQUERYEXTENSION 1 +#define HAVE_XKBKEYCODETOKEYSYM 1 +#define HAVE_XKB_BELL_EXT 1 +#define HAVE_XUTF8LOOKUPSTRING 1 +#define DFT_DECID "420" +#define DFT_TERMTYPE "xterm" +#define DEF_BACKARO_BS True +#define DEF_BACKARO_ERASE False +#define DEFDELETE_DEL Maybe +#define DEF_INITIAL_ERASE False +#define DEF_ALT_SENDS_ESC False +#define DEF_META_SENDS_ESC False +#define OPT_256_COLORS 1 +#define OPT_DIRECT_COLOR 1 +#define OPT_BROKEN_OSC 1 +#define HAVE_X11_EXTENSIONS_XDBE_H 1 +#define HAVE_XDBESWAPBUFFERS 1 +#define XRENDERFONT 1 +#define HAVE_XFTDRAWCHARSPEC 1 +#define HAVE_XFTDRAWSETCLIP 1 +#define HAVE_XFTDRAWSETCLIPRECTANGLES 1 +#define OPT_FIFO_LINES 1 +#define OPT_PASTE64 1 +#define OPT_PTY_HANDSHAKE 1 +#define HAVE_REGEX_H_FUNCS 1 +#define OPT_SELECT_REGEX 1 +#define SCROLLBAR_RIGHT 1 +#define OPT_TCAP_FKEYS 1 +#define OPT_TCAP_QUERY 1 +#define OPT_TOOLBAR 1 +#define OPT_LUIT_PROG 1 +#define OPT_WIDE_CHARS 1 +#define OPT_SIXEL_GRAPHICS 1 +#define OPT_GRAPHICS 1 +#define OPT_DEC_RECTOPS 1 +#define HAVE_TIGETSTR 1 +#define HAVE_USE_EXTENDED_NAMES 1 +#define MIXEDCASE_FILENAMES 1 + + +configure: exit 0 diff --git a/ports/xterm/xterm-359/config.status b/ports/xterm/xterm-359/config.status new file mode 100755 index 0000000..8eb13d9 --- /dev/null +++ b/ports/xterm/xterm-359/config.status @@ -0,0 +1,1180 @@ +#! /bin/sh +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +SHELL=${CONFIG_SHELL-/bin/sh} +ac_cs_invocation="$0 $@" + +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +exec 6>&1 + +config_files=" Makefile df-install minstall:minstall.in" +config_headers=" xtermcfg.h:xtermcfg.hin" + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to ." +ac_cs_version="\ +config.status +configured by ./configure, generated by GNU Autoconf 2.52.20200802, + with options \"--with-neXtaw --enable-toolbar\" + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=. +INSTALL="/bin/install -c" +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + shift + set dummy "$ac_option" "$ac_optarg" ${1+"$@"} + shift + ;; + -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_need_defaults=false;; + esac + + case $1 in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running /bin/sh ./configure " --with-neXtaw --enable-toolbar " --no-create --no-recursion" + exec /bin/sh ./configure --with-neXtaw --enable-toolbar --no-create --no-recursion ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:24093: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + shift + CONFIG_FILES="$CONFIG_FILES $1" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + shift + CONFIG_HEADERS="$CONFIG_HEADERS $1" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:24112: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +exec 5>>config.log +cat >&5 << _ACEOF + +## ----------------------- ## +## Running config.status. ## +## ----------------------- ## + +This file was extended by $as_me 2.52.20200802, executed with + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + > $ac_cs_invocation +on `(hostname || uname -n) 2>/dev/null | sed 1q` + +_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "df-install" ) CONFIG_FILES="$CONFIG_FILES df-install" ;; + "minstall" ) CONFIG_FILES="$CONFIG_FILES minstall:minstall.in" ;; + "xtermcfg.h" ) CONFIG_HEADERS="$CONFIG_HEADERS xtermcfg.h:xtermcfg.hin" ;; + *) { { echo "$as_me:24151: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t$/@;t t/; /@;t t$/s/[\\&,]/\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t$/,;t t/' >$tmp/subs.sed <<\CEOF +s,@SHELL@,/bin/sh,;t t +s,@exec_prefix@,${prefix},;t t +s,@prefix@,/usr/local,;t t +s,@program_transform_name@,s,x,x,,;t t +s,@bindir@,${exec_prefix}/bin,;t t +s,@sbindir@,${exec_prefix}/sbin,;t t +s,@libexecdir@,${exec_prefix}/libexec,;t t +s,@datarootdir@,${prefix}/share,;t t +s,@datadir@,${datarootdir},;t t +s,@sysconfdir@,${prefix}/etc,;t t +s,@sharedstatedir@,${prefix}/com,;t t +s,@localstatedir@,${prefix}/var,;t t +s,@runstatedir@,${localstatedir}/run,;t t +s,@libdir@,${exec_prefix}/lib,;t t +s,@includedir@,${prefix}/include,;t t +s,@oldincludedir@,/usr/include,;t t +s,@infodir@,${datarootdir}/info,;t t +s,@mandir@,${datarootdir}/man,;t t +s,@PACKAGE_NAME@,,;t t +s,@PACKAGE_TARNAME@,,;t t +s,@PACKAGE_VERSION@,,;t t +s,@PACKAGE_STRING@,,;t t +s,@PACKAGE_BUGREPORT@,,;t t +s,@build_alias@,,;t t +s,@host_alias@,,;t t +s,@target_alias@,,;t t +s,@ECHO_C@,\c,;t t +s,@ECHO_N@,,;t t +s,@ECHO_T@,,;t t +s,@PATH_SEPARATOR@,:,;t t +s,@DEFS@,-DHAVE_CONFIG_H,;t t +s,@LIBS@, -lXft -lfontconfig -lfreetype -lutil -lneXtaw -lXmu -lSM -lICE -lXext -lXinerama -lXpm -lXt -lX11 -lSM -lICE -lncurses,;t t +s,@build@,x86_64-pc-linux-gnu,;t t +s,@build_cpu@,x86_64,;t t +s,@build_vendor@,pc,;t t +s,@build_os@,linux-gnu,;t t +s,@host@,x86_64-pc-linux-gnu,;t t +s,@host_cpu@,x86_64,;t t +s,@host_vendor@,pc,;t t +s,@host_os@,linux-gnu,;t t +s,@CC@,gcc,;t t +s,@CFLAGS@,-g -O2,;t t +s,@LDFLAGS@,,;t t +s,@CPPFLAGS@, -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DXFREE86_FT2 -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/freetype2 -I/usr/include/libpng16,;t t +s,@ac_ct_CC@,gcc,;t t +s,@EXEEXT@,,;t t +s,@OBJEXT@,o,;t t +s,@EXTRA_CPPFLAGS@,-DPROJECTROOT='"/usr"' -D__vendorversion__='"Version 7.7.0 X.Org"',;t t +s,@CPP@,gcc -E,;t t +s,@AWK@,awk,;t t +s,@INSTALL_PROGRAM@,${INSTALL},;t t +s,@INSTALL_SCRIPT@,${INSTALL},;t t +s,@INSTALL_DATA@,${INSTALL} -m 644,;t t +s,@LN_S@,ln -s,;t t +s,@LINT@,,;t t +s,@LINT_OPTS@,,;t t +s,@APP_CLASS@,XTerm,;t t +s,@APPSDIR@,${exec_prefix}/lib/X11/app-defaults,;t t +s,@no_appsdir@,,;t t +s,@ICON_NAME@,mini.xterm,;t t +s,@ICON_SYMLINK@,NONE,;t t +s,@PIXMAPDIR@,${datadir}/pixmaps,;t t +s,@no_pixmapdir@,,;t t +s,@ICONDIR@,no,;t t +s,@no_icondir@,#,;t t +s,@ICON_FORMAT@,.svg .png .xpm,;t t +s,@ICON_THEME@,no,;t t +s,@ICON_LIST@,icons/mini.xterm_48x48.png icons/mini.xterm_48x48.xpm,;t t +s,@desktop_utils@,#,;t t +s,@DESKTOP_FLAGS@,,;t t +s,@DESKTOP_CATEGORY@,,;t t +s,@XTERM_PATH@,/bin/xterm,;t t +s,@XTERM_SYMLINK@,NONE,;t t +s,@SINSTALL_OPTS@,,;t t +s,@X_CFLAGS@,,;t t +s,@X_PRE_LIBS@, -lSM -lICE,;t t +s,@X_LIBS@, -L/usr/lib64,;t t +s,@X_EXTRA_LIBS@,,;t t +s,@PKG_CONFIG@,/bin/pkg-config,;t t +s,@ac_pt_PKG_CONFIG@,/bin/pkg-config,;t t +s,@ICON_SUFFIX@,.xpm,;t t +s,@IMAKE@,/bin/xmkmf,;t t +s,@IMAKE_CFLAGS@, -I. -I/usr/include/freetype2 -I/usr/include/freetype2/config -Dlinux -D__amd64__ -D_POSIX_C_SOURCE=199309L -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DFUNCPROTO=15 -DNARROWPROTO -DHAVE_TERM_H -DSCROLLBAR_RIGHT -DOPT_WIDE_CHARS -DOPT_LUIT_PROG -DXRENDERFONT -DXFREE86_FT2 -DPROJECTROOT='"/usr"' -D_DEFAULT_SOURCE -U_XOPEN_SOURCE -D_XOPEN_SOURCE=600 -DUTMP -DUSE_TTY_GROUP -DOSMAJORVERSION=5 -DOSMINORVERSION=11 -D__vendorversion__='"Version 7.7.0 X.Org"' -I/usr/include,;t t +s,@IMAKE_LOADFLAGS@,,;t t +s,@GROFF_PATH@,/bin/groff,;t t +s,@NROFF_PATH@,/bin/nroff,;t t +s,@TBL_PATH@,/bin/tbl,;t t +s,@GROFF_NOTE@,,;t t +s,@NROFF_NOTE@,#,;t t +s,@cf_man2html@,/bin/groff,;t t +s,@MAN2HTML_NOTE@,,;t t +s,@MAN2HTML_PATH@,/bin/groff,;t t +s,@MAN2HTML_TEMP@,man2html.tmp,;t t +s,@default_termid@,420,;t t +s,@default_TERM@,xterm,;t t +s,@backarrow_is_bs@,True,;t t +s,@backarrow_is_erase@,False,;t t +s,@delete_is_del@,Maybe,;t t +s,@initial_erase@,False,;t t +s,@alt_sends_esc@,False,;t t +s,@meta_sends_esc@,False,;t t +s,@cf_tic_prog@,yes,;t t +s,@no_ticprog@,,;t t +s,@TERMINFO_DIR@,$(DESTDIR)/usr/lib/terminfo,;t t +s,@SET_TERMINFO@,TERMINFO=$(TERMINFO_DIR),;t t +s,@double_buffer@,False,;t t +s,@FREETYPE_CONFIG@,/bin/pkg-config,;t t +s,@FREETYPE_OLD_CONFIG@,,;t t +s,@FREETYPE_XFT_CONFIG@,,;t t +s,@HAVE_TYPE_FCCHAR32@,,;t t +s,@HAVE_TYPE_XFTCHARSPEC@,,;t t +s,@LUIT@,,;t t +s,@ECHO_LT@,,;t t +s,@ECHO_LD@,,;t t +s,@RULE_CC@,,;t t +s,@SHOW_CC@,,;t t +s,@ECHO_CC@,,;t t +s,@EXTRA_CFLAGS@,,;t t +s,@CHARPROC_DEPS@, 256colres.h,;t t +s,@EXTRAHDRS@, 256colres.h Tekparse.h charclass.h precompose.h wcwidth.h graphics_sixel.h graphics.h,;t t +s,@EXTRASRCS@, TekPrsTbl.c Tekproc.c charclass.c precompose.c wcwidth.c html.c svg.c graphics_sixel.c graphics.c,;t t +s,@EXTRAOBJS@, TekPrsTbl.o Tekproc.o charclass.o precompose.o wcwidth.o html.o svg.o graphics_sixel.o graphics.o,;t t +s,@MAY_SETUID@,,;t t +s,@NOT_SETUID@,#,;t t +s,@CTAGS@,,;t t +s,@ETAGS@,,;t t +s,@MAKE_LOWER_TAGS@,#,;t t +s,@MAKE_UPPER_TAGS@,#,;t t +s,@cf_ldd_prog@,ldd,;t t +s,@EXTRA_LDFLAGS@,,;t t +CEOF + + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + # It is possible to make a multiline substitution using escaped newlines. + # Ensure that we do not split the substitution between script fragments. + ac_BEG=$ac_end + ac_END=`expr $ac_end + $ac_max_sed_lines` + sed "1,${ac_BEG}d; ${ac_END}p; q" $tmp/subs.sed >$tmp/subs.next + if test -s $tmp/subs.next; then + grep '^s,@[^@,][^@,]*@,.*\\$' $tmp/subs.next >$tmp/subs.edit + if test ! -s $tmp/subs.edit; then + grep "^s,@[^@,][^@,]*@,.*,;t t$" $tmp/subs.next >$tmp/subs.edit + if test ! -s $tmp/subs.edit; then + if test $ac_beg -gt 1; then + ac_end=`expr $ac_end - 1` + continue + fi + fi + fi + fi + + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + ac_dir_suffix="/`echo $ac_dir|sed 's,^\./,,'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'` + else + ac_dir_suffix= ac_dots= + fi + + case $srcdir in + .) ac_srcdir=. + if test -z "$ac_dots"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_dots | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_dots$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_dots$srcdir ;; + esac + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_dots$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:24464: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + configure_input="Generated automatically from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:24482: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:24495: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + ac_warn_datarootdir=no + if test x"$ac_file" != x-; then + for ac_item in $ac_file_inputs + do + ac_seen=`grep '@\(datadir\|mandir\|infodir\)@' $ac_item` + if test -n "$ac_seen"; then + ac_used=`grep '@datarootdir@' $ac_item` + if test -z "$ac_used"; then + { echo "$as_me:24511: WARNING: datarootdir was used implicitly but not set: +$ac_seen" >&5 +echo "$as_me: WARNING: datarootdir was used implicitly but not set: +$ac_seen" >&2;} + ac_warn_datarootdir=yes + fi + fi + ac_seen=`grep '${datarootdir}' $ac_item` + if test -n "$ac_seen"; then + { echo "$as_me:24520: WARNING: datarootdir was used explicitly but not set: +$ac_seen" >&5 +echo "$as_me: WARNING: datarootdir was used explicitly but not set: +$ac_seen" >&2;} + ac_warn_datarootdir=yes + fi + done + fi + +if test "x$ac_warn_datarootdir" = xyes; then + ac_sed_cmds="$ac_sed_cmds | sed -e 's,@datarootdir@,\${prefix}/share,g' -e 's,\${datarootdir},\${prefix}/share,g'" +fi + + sed "/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +} + +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + cp $tmp/out $ac_file + + for ac_name in prefix exec_prefix datarootdir + do + ac_seen=`fgrep -n '${'$ac_name'[:=].*}' $ac_file` + if test -n "$ac_seen"; then + ac_init=`egrep '[ ]*'$ac_name'[ ]*=' $ac_file` + if test -z "$ac_init"; then + ac_seen=`echo "$ac_seen" |sed -e 's,^,'$ac_file':,'` + { echo "$as_me:24557: WARNING: Variable $ac_name is used but was not set: +$ac_seen" >&5 +echo "$as_me: WARNING: Variable $ac_name is used but was not set: +$ac_seen" >&2;} + fi + fi + done + egrep -n '@[a-z_][a-z_0-9]+@' $ac_file >$tmp/out + egrep -n '@[A-Z_][A-Z_0-9]+@' $ac_file >>$tmp/out + if test -s $tmp/out; then + ac_seen=`sed -e 's,^,'$ac_file':,' < $tmp/out` + { echo "$as_me:24568: WARNING: Some variables may not be substituted: +$ac_seen" >&5 +echo "$as_me: WARNING: Some variables may not be substituted: +$ac_seen" >&2;} + fi + else + cat $tmp/out + fi + rm -f $tmp/out + +done + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_iA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_iB='\([ ]\),\1#\2define\3' +ac_iC=' ' +ac_iD='\4,;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:24617: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:24628: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:24641: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + + # Handle all the #define templates only if necessary. + if egrep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then + # If there are no defines, we may have an empty if/fi + : + cat >$tmp/defines.sed <$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in + + cat >$tmp/defines.sed <$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in + + cat >$tmp/defines.sed <$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in + + fi # egrep + + # Handle all the #undef templates + cat >$tmp/undefs.sed <$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in + + cat >$tmp/undefs.sed <$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in + + cat >$tmp/undefs.sed <$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in + + cat >$tmp/undefs.sed <$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in + + cat >$tmp/undefs.sed <$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in + + cat >$tmp/undefs.sed <$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in + + cat >$tmp/undefs.sed <$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated automatically by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated automatically by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if cmp -s $ac_file $tmp/config.h 2>/dev/null; then + { echo "$as_me:24759: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + fi + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +done + +{ (exit 0); exit 0; } diff --git a/ports/xterm/xterm-359/config.sub b/ports/xterm/xterm-359/config.sub new file mode 100755 index 0000000..3d9a8dc --- /dev/null +++ b/ports/xterm/xterm-359/config.sub @@ -0,0 +1,1851 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-07-10' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x$basic_os != x ] +then + +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo $basic_os | sed -e 's|gnu/linux|gnu|'` + ;; + nto-qnx*) + kernel=nto + os=`echo $basic_os | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + IFS="-" read kernel os <&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + nto-qnx*) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/ports/xterm/xterm-359/configure b/ports/xterm/xterm-359/configure new file mode 100755 index 0000000..3d377c6 --- /dev/null +++ b/ports/xterm/xterm-359/configure @@ -0,0 +1,24825 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by Autoconf 2.52.20200802. +# +# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +cross_compiling=no +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +ac_unique_file="charproc.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +runstatedir='${localstatedir}/run' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${datarootdir}/info' +mandir='${datarootdir}/man' + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst \ + | --runs | --run | --ru) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* \ + | --runs=* | --run=* | --ru=*) + runstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: should be removed in autoconf 3.0. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat < if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +EOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue + cd $ac_subdir + # A "../" for each directory in /$ac_subdir. + ac_dots=`echo $ac_subdir | + sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'` + + case $srcdir in + .) # No --srcdir option. We are building in place. + ac_sub_srcdir=$srcdir ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_sub_srcdir=$srcdir/$ac_subdir ;; + *) # Relative path. + ac_sub_srcdir=$ac_dots$srcdir/$ac_subdir ;; + esac + + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_sub_srcdir/configure.gnu; then + echo + $SHELL $ac_sub_srcdir/configure.gnu --help=recursive + elif test -f $ac_sub_srcdir/configure; then + echo + $SHELL $ac_sub_srcdir/configure --help=recursive + elif test -f $ac_sub_srcdir/configure.ac || + test -f $ac_sub_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\EOF + +Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +EOF + exit 0 +fi +exec 5>config.log +cat >&5 </dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +PATH = $PATH + +_ASUNAME +} >&5 + +cat >&5 <\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + ac_sep=" " ;; + *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg" + ac_sep=" " ;; + esac + # Get rid of the leading space. +done + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + echo >&5 + echo "## ----------------- ##" >&5 + echo "## Cache variables. ##" >&5 + echo "## ----------------- ##" >&5 + echo >&5 + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} >&5 + sed "/^$/d" confdefs.h >conftest.log + if test -s conftest.log; then + echo >&5 + echo "## ------------ ##" >&5 + echo "## confdefs.h. ##" >&5 + echo "## ------------ ##" >&5 + echo >&5 + cat conftest.log >&5 + fi + (echo; echo) >&5 + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" >&5 + echo "$as_me: exit $exit_status" >&5 + rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:1012: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + cat "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:1023: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:1031: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:1047: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:1051: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:1057: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:1059: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:1061: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. It doesn't matter if + # we pass some twice (in addition to the command line arguments). + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val" + ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:1080: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:1082: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return=return + +case `echo "testing\c" 2>/dev/null; echo 1,2,3`,`echo -n testing 2>/dev/null; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C= # newlines do not sed ;-) only broken shells would use this case anyway + ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac +echo "#! $SHELL" >conftest.sh +echo "exit 0" >>conftest.sh +chmod +x conftest.sh +if { (echo "$as_me:1103: PATH=\".;.\"; conftest.sh") >&5 + (PATH=".;."; conftest.sh) 2>&5 + ac_status=$? + echo "$as_me:1106: \$? = $ac_status" >&5 + (exit $ac_status); }; then + ac_path_separator=';' +else + ac_path_separator=: +fi +PATH_SEPARATOR="$ac_path_separator" +rm -f conftest.sh + +ac_config_headers="$ac_config_headers xtermcfg.h:xtermcfg.hin" + +ac_aux_dir= +for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:1134: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 +echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:1144: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:1148: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:1157: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:1161: error: $ac_config_sub $ac_cv_build_alias failed." >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1166: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +if test -f $srcdir/config.guess || test -f $ac_aux_dir/config.guess ; then + echo "$as_me:1174: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:1183: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:1188: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + system_name="$host_os" +else + system_name="`(uname -s -r) 2>/dev/null`" + if test -z "$system_name" ; then + system_name="`(hostname) 2>/dev/null`" + fi +fi +test -n "$system_name" && +cat >>confdefs.h <&6 +else + cf_cv_system_name="$system_name" +fi + +test -z "$system_name" && system_name="$cf_cv_system_name" +test -n "$cf_cv_system_name" && echo "$as_me:1214: result: Configuring for $cf_cv_system_name" >&5 +echo "${ECHO_T}Configuring for $cf_cv_system_name" >&6 + +if test ".$system_name" != ".$cf_cv_system_name" ; then + echo "$as_me:1218: result: Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&5 +echo "${ECHO_T}Cached system name ($system_name) does not agree with actual ($cf_cv_system_name)" >&6 + { { echo "$as_me:1220: error: \"Please remove config.cache and try again.\"" >&5 +echo "$as_me: error: \"Please remove config.cache and try again.\"" >&2;} + { (exit 1); exit 1; }; } +fi + +### checks for alternative programs + +case "$host_os" in +(openedition) : ${CFLAGS="-O2 -Wc,dll -Wl,EDIT=NO"} + : ${CPPFLAGS="-D_ALL_SOURCE"} + : ${LIBS="/usr/lib/Xaw.x /usr/lib/SM.x /usr/lib/ICE.x /usr/lib/X11.x"} + : ${CC=c89};; +(darwin*) + : ${LDFLAGS}="${LDFLAGS} -Wl,-bind_at_load";; +esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return=return +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:1245: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="${ac_tool_prefix}gcc" +echo "$as_me:1260: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1268: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1271: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:1280: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="gcc" +echo "$as_me:1295: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:1303: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:1306: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:1319: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="${ac_tool_prefix}cc" +echo "$as_me:1334: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1342: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1345: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:1354: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="cc" +echo "$as_me:1369: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:1377: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:1380: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +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 "$as_me:1393: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue +fi +ac_cv_prog_CC="cc" +echo "$as_me:1413: found $ac_dir/$ac_word" >&5 +break +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" ${1+"$@"} + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1435: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1438: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:1449: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CC="$ac_tool_prefix$ac_prog" +echo "$as_me:1464: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:1472: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:1475: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +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 "$as_me:1488: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ac_ct_CC="$ac_prog" +echo "$as_me:1503: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:1511: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:1514: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + +test -z "$CC" && { { echo "$as_me:1526: error: no acceptable cc found in \$PATH" >&5 +echo "$as_me: error: no acceptable cc found in \$PATH" >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:1531:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:1534: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:1537: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:1539: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:1542: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:1544: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:1547: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +#line 1551 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:1567: checking for C compiler default output" >&5 +echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:1570: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:1573: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. +for ac_file in `ls a.exe conftest.exe 2>/dev/null; + ls a.out conftest 2>/dev/null; + ls a.* conftest.* 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + a.out ) # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool --akim. + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +{ { echo "$as_me:1596: error: C compiler cannot create executables" >&5 +echo "$as_me: error: C compiler cannot create executables" >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:1602: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:1607: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:1613: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1616: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:1623: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:1631: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:1638: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:1640: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:1643: checking for executable suffix" >&5 +echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6 +if { (eval echo "$as_me:1645: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:1648: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:1664: error: cannot compute EXEEXT: cannot compile and link" >&5 +echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:1670: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:1676: checking for object suffix" >&5 +echo $ECHO_N "checking for object suffix... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 1682 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:1694: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1697: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.dbg | *.pdb | *.xSYM | *.map | *.inf ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +{ { echo "$as_me:1709: error: cannot compute OBJEXT: cannot compile" >&5 +echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:1716: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:1720: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 1726 "configure" +#include "confdefs.h" + +int +main (void) +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1741: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1744: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1747: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1750: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_compiler_gnu=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:1762: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:1768: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 1774 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1786: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1789: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1792: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1795: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_prog_cc_g=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:1805: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1832: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1835: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1838: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1841: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + ''\ + '#include ' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +#line 1853 "configure" +#include "confdefs.h" +#include +$ac_declaration +int +main (void) +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1866: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1869: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1872: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1875: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +continue +fi +rm -f conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +#line 1885 "configure" +#include "confdefs.h" +$ac_declaration +int +main (void) +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1897: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1900: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1903: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1906: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done +rm -rf conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return=return + +GCC_VERSION=none +if test "$GCC" = yes ; then + echo "$as_me:1936: checking version of $CC" >&5 +echo $ECHO_N "checking version of $CC... $ECHO_C" >&6 + GCC_VERSION="`${CC} --version 2>/dev/null | sed -e '2,$d' -e 's/^.*(GCC[^)]*) //' -e 's/^.*(Debian[^)]*) //' -e 's/^[^0-9.]*//' -e 's/[^0-9.].*//'`" + test -z "$GCC_VERSION" && GCC_VERSION=unknown + echo "$as_me:1940: result: $GCC_VERSION" >&5 +echo "${ECHO_T}$GCC_VERSION" >&6 +fi + +INTEL_COMPILER=no + +if test "$GCC" = yes ; then + case $host_os in + (linux*|gnu*) + echo "$as_me:1949: checking if this is really Intel C compiler" >&5 +echo $ECHO_N "checking if this is really Intel C compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -no-gcc" + cat >conftest.$ac_ext <<_ACEOF +#line 1954 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __INTEL_COMPILER +#else +make an error +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:1971: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:1974: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:1977: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:1980: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + INTEL_COMPILER=yes +cf_save_CFLAGS="$cf_save_CFLAGS -we147" + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$cf_save_CFLAGS" + echo "$as_me:1991: result: $INTEL_COMPILER" >&5 +echo "${ECHO_T}$INTEL_COMPILER" >&6 + ;; + esac +fi + +CLANG_COMPILER=no + +if test "$GCC" = yes ; then + echo "$as_me:2000: checking if this is really Clang C compiler" >&5 +echo $ECHO_N "checking if this is really Clang C compiler... $ECHO_C" >&6 + cf_save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -Qunused-arguments" + cat >conftest.$ac_ext <<_ACEOF +#line 2005 "configure" +#include "confdefs.h" + +int +main (void) +{ + +#ifdef __clang__ +#else +make an error +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:2022: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2025: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2028: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2031: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + CLANG_COMPILER=yes +cf_save_CFLAGS="$cf_save_CFLAGS -Qunused-arguments" + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$cf_save_CFLAGS" + echo "$as_me:2042: result: $CLANG_COMPILER" >&5 +echo "${ECHO_T}$CLANG_COMPILER" >&6 +fi + +echo "$as_me:2046: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +#line 2054 "configure" +#include "confdefs.h" +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main (void) +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:2103: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2106: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2109: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2112: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:2129: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:2132: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# This should have been defined by AC_PROG_CC +: ${CC:=cc} + +echo "$as_me:2140: checking \$CFLAGS variable" >&5 +echo $ECHO_N "checking \$CFLAGS variable... $ECHO_C" >&6 +case "x$CFLAGS" in +(*-[IUD]*) + echo "$as_me:2144: result: broken" >&5 +echo "${ECHO_T}broken" >&6 + { echo "$as_me:2146: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&5 +echo "$as_me: WARNING: your environment uses the CFLAGS variable to hold CPPFLAGS options" >&2;} + cf_flags="$CFLAGS" + CFLAGS= + for cf_arg in $cf_flags + do + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_arg +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + done + ;; +(*) + echo "$as_me:2254: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + ;; +esac + +echo "$as_me:2259: checking \$CC variable" >&5 +echo $ECHO_N "checking \$CC variable... $ECHO_C" >&6 +case "$CC" in +(*[\ \ ]-*) + echo "$as_me:2263: result: broken" >&5 +echo "${ECHO_T}broken" >&6 + { echo "$as_me:2265: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&5 +echo "$as_me: WARNING: your environment uses the CC variable to hold CFLAGS/CPPFLAGS options" >&2;} + # humor him... + cf_prog=`echo "$CC" | sed -e 's/ / /g' -e 's/[ ]* / /g' -e 's/[ ]*[ ]-[^ ].*//'` + cf_flags=`echo "$CC" | ${AWK:-awk} -v prog="$cf_prog" '{ printf("%s", substr($0,1+length(prog))); }'` + CC="$cf_prog" + for cf_arg in $cf_flags + do + case "x$cf_arg" in + (x-[IUDfgOW]*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_arg +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + (*) + CC="$CC $cf_arg" + ;; + esac + done + test -n "$verbose" && echo " resulting CC: '$CC'" 1>&6 + +echo "${as_me:-configure}:2382: testing resulting CC: '$CC' ..." 1>&5 + + test -n "$verbose" && echo " resulting CFLAGS: '$CFLAGS'" 1>&6 + +echo "${as_me:-configure}:2386: testing resulting CFLAGS: '$CFLAGS' ..." 1>&5 + + test -n "$verbose" && echo " resulting CPPFLAGS: '$CPPFLAGS'" 1>&6 + +echo "${as_me:-configure}:2390: testing resulting CPPFLAGS: '$CPPFLAGS' ..." 1>&5 + + ;; +(*) + echo "$as_me:2394: result: ok" >&5 +echo "${ECHO_T}ok" >&6 + ;; +esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return=return +echo "$as_me:2405: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line 2426 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:2431: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2437: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line 2460 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:2464: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2470: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:2507: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +#line 2517 "configure" +#include "confdefs.h" +#include + Syntax error +_ACEOF +if { (eval echo "$as_me:2522: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2528: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +#line 2551 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:2555: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:2561: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:2589: error: C preprocessor \"$CPP\" fails sanity check" >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +ac_main_return=return + +for ac_prog in mawk gawk nawk awk +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 "$as_me:2605: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_AWK="$ac_prog" +echo "$as_me:2620: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:2628: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:2631: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:2650: checking for a BSD compatible install" >&5 +echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_save_IFS=$IFS; IFS=$ac_path_separator + for ac_dir in $PATH; do + IFS=$ac_save_IFS + # Account for people who put trailing slashes in PATH elements. + case $ac_dir/ in + / | ./ | .// | /cC/* \ + | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \ + | /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + if $as_executable_p "$ac_dir/$ac_prog"; then + if test $ac_prog = install && + grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$ac_dir/$ac_prog -c" + break 2 + fi + fi + done + ;; + esac + done + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:2699: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:2710: checking whether ln -s works" >&5 +echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6 +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + echo "$as_me:2714: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:2717: result: no, using $LN_S" >&5 +echo "${ECHO_T}no, using $LN_S" >&6 +fi + +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +for ac_prog in lint cppcheck splint +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 "$as_me:2738: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LINT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LINT"; then + ac_cv_prog_LINT="$LINT" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_LINT="$ac_prog" +echo "$as_me:2753: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +LINT=$ac_cv_prog_LINT +if test -n "$LINT"; then + echo "$as_me:2761: result: $LINT" >&5 +echo "${ECHO_T}$LINT" >&6 +else + echo "$as_me:2764: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LINT" && break +done + +case "x$LINT" in +(xcppcheck|x*/cppcheck) + test -z "$LINT_OPTS" && LINT_OPTS="--enable=all" + ;; +esac + +### checks for compiler characteristics + +echo "$as_me:2779: checking if the POSIX test-macros are already defined" >&5 +echo $ECHO_N "checking if the POSIX test-macros are already defined... $ECHO_C" >&6 +if test "${cf_cv_posix_visible+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 2786 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#if defined(__POSIX_VISIBLE) && ((__POSIX_VISIBLE - 0L) > 0) \ + && defined(__XSI_VISIBLE) && ((__XSI_VISIBLE - 0L) > 0) \ + && defined(__BSD_VISIBLE) && ((__BSD_VISIBLE - 0L) > 0) \ + && defined(__ISO_C_VISIBLE) && ((__ISO_C_VISIBLE - 0L) > 0) +#error conflicting symbols found +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:2805: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2808: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2811: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2814: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_posix_visible=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_visible=yes +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:2825: result: $cf_cv_posix_visible" >&5 +echo "${ECHO_T}$cf_cv_posix_visible" >&6 + +if test "$cf_cv_posix_visible" = no; then + +cf_XOPEN_SOURCE=700 +cf_POSIX_C_SOURCE=199506L +cf_xopen_source= + +case $host_os in +(aix[4-7]*) + cf_xopen_source="-D_ALL_SOURCE" + ;; +(msys) + cf_XOPEN_SOURCE=600 + ;; +(darwin[0-8].*) + cf_xopen_source="-D_APPLE_C_SOURCE" + ;; +(darwin*) + cf_xopen_source="-D_DARWIN_C_SOURCE" + cf_XOPEN_SOURCE= + ;; +(freebsd*|dragonfly*|midnightbsd*) + # 5.x headers associate + # _XOPEN_SOURCE=600 with _POSIX_C_SOURCE=200112L + # _XOPEN_SOURCE=500 with _POSIX_C_SOURCE=199506L + cf_POSIX_C_SOURCE=200112L + cf_XOPEN_SOURCE=600 + cf_xopen_source="-D_BSD_TYPES -D__BSD_VISIBLE -D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE -D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + ;; +(hpux11*) + cf_xopen_source="-D_HPUX_SOURCE -D_XOPEN_SOURCE=500" + ;; +(hpux*) + cf_xopen_source="-D_HPUX_SOURCE" + ;; +(irix[56].*) + cf_xopen_source="-D_SGI_SOURCE" + cf_XOPEN_SOURCE= + ;; +(linux*|uclinux*|gnu*|mint*|k*bsd*-gnu|cygwin) + +cf_gnu_xopen_source=$cf_XOPEN_SOURCE + +echo "$as_me:2870: checking if this is the GNU C library" >&5 +echo $ECHO_N "checking if this is the GNU C library... $ECHO_C" >&6 +if test "${cf_cv_gnu_library+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 2877 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #if __GLIBC__ > 0 && __GLIBC_MINOR__ >= 0 + return 0; + #elif __NEWLIB__ > 0 && __NEWLIB_MINOR__ >= 0 + return 0; + #else + # error not GNU C library + #endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:2896: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2899: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2902: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2905: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_gnu_library=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_gnu_library=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:2916: result: $cf_cv_gnu_library" >&5 +echo "${ECHO_T}$cf_cv_gnu_library" >&6 + +if test x$cf_cv_gnu_library = xyes; then + + # With glibc 2.19 (13 years after this check was begun), _DEFAULT_SOURCE + # was changed to help a little. newlib incorporated the change about 4 + # years later. + echo "$as_me:2924: checking if _DEFAULT_SOURCE can be used as a basis" >&5 +echo $ECHO_N "checking if _DEFAULT_SOURCE can be used as a basis... $ECHO_C" >&6 +if test "${cf_cv_gnu_library_219+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE" + + cat >conftest.$ac_ext <<_ACEOF +#line 2936 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 19) || (__GLIBC__ > 2) + return 0; + #elif (__NEWLIB__ == 2 && __NEWLIB_MINOR__ >= 4) || (__GLIBC__ > 3) + return 0; + #else + # error GNU C library __GLIBC__.__GLIBC_MINOR__ is too old + #endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:2955: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:2958: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:2961: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:2964: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_gnu_library_219=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_gnu_library_219=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$cf_save" + +fi +echo "$as_me:2976: result: $cf_cv_gnu_library_219" >&5 +echo "${ECHO_T}$cf_cv_gnu_library_219" >&6 + + if test "x$cf_cv_gnu_library_219" = xyes; then + cf_save="$CPPFLAGS" + echo "$as_me:2981: checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE" >&5 +echo $ECHO_N "checking if _XOPEN_SOURCE=$cf_gnu_xopen_source works with _DEFAULT_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_gnu_dftsrc_219+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=$cf_gnu_xopen_source +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + cat >conftest.$ac_ext <<_ACEOF +#line 3086 "configure" +#include "confdefs.h" + + #include + #include + +int +main (void) +{ + + #if (_XOPEN_SOURCE >= $cf_gnu_xopen_source) && (MB_LEN_MAX > 1) + return 0; + #else + # error GNU C library is too old + #endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3106: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3109: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3112: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3115: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_gnu_dftsrc_219=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_gnu_dftsrc_219=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:3126: result: $cf_cv_gnu_dftsrc_219" >&5 +echo "${ECHO_T}$cf_cv_gnu_dftsrc_219" >&6 + test "x$cf_cv_gnu_dftsrc_219" = "xyes" || CPPFLAGS="$cf_save" + else + cf_cv_gnu_dftsrc_219=maybe + fi + + if test "x$cf_cv_gnu_dftsrc_219" != xyes; then + + echo "$as_me:3135: checking if we must define _GNU_SOURCE" >&5 +echo $ECHO_N "checking if we must define _GNU_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_gnu_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 3142 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifndef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be defined + #endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3157: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3160: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3163: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3166: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_gnu_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_save="$CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -D_GNU_SOURCE +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + cat >conftest.$ac_ext <<_ACEOF +#line 3273 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifdef _XOPEN_SOURCE + #error expected _XOPEN_SOURCE to be undefined + #endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3288: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3291: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3294: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3297: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_gnu_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_gnu_source=yes +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$cf_save" + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:3312: result: $cf_cv_gnu_source" >&5 +echo "${ECHO_T}$cf_cv_gnu_source" >&6 + + if test "$cf_cv_gnu_source" = yes + then + echo "$as_me:3317: checking if we should also define _DEFAULT_SOURCE" >&5 +echo $ECHO_N "checking if we should also define _DEFAULT_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_default_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_GNU_SOURCE" + + cat >conftest.$ac_ext <<_ACEOF +#line 3327 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + #ifdef _DEFAULT_SOURCE + #error expected _DEFAULT_SOURCE to be undefined + #endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3342: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3345: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3348: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3351: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_default_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_default_source=yes +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:3362: result: $cf_cv_default_source" >&5 +echo "${ECHO_T}$cf_cv_default_source" >&6 + if test "$cf_cv_default_source" = yes + then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_DEFAULT_SOURCE" + + fi + fi + fi + +fi + + ;; +(minix*) + cf_xopen_source="-D_NETBSD_SOURCE" # POSIX.1-2001 features are ifdef'd with this... + ;; +(mirbsd*) + # setting _XOPEN_SOURCE or _POSIX_SOURCE breaks and other headers which use u_int / u_short types + cf_XOPEN_SOURCE= + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +echo "$as_me:3399: checking if we should define _POSIX_C_SOURCE" >&5 +echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_posix_c_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:3405: testing if the symbol is already defined go no further ..." 1>&5 + + cat >conftest.$ac_ext <<_ACEOF +#line 3408 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3423: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3426: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3429: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3432: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_posix_c_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[12]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + cat >conftest.$ac_ext <<_ACEOF +#line 3453 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifdef _POSIX_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3468: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3471: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3474: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3477: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE" +fi +rm -f conftest.$ac_objext conftest.$ac_ext + fi + +echo "${as_me:-configure}:3488: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5 + + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source" + +echo "${as_me:-configure}:3496: testing if the second compile does not leave our definition intact error ..." 1>&5 + + cat >conftest.$ac_ext <<_ACEOF +#line 3499 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3514: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3517: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3520: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3523: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_c_source=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:3539: result: $cf_cv_posix_c_source" >&5 +echo "${ECHO_T}$cf_cv_posix_c_source" >&6 + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_posix_c_source +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +fi # cf_cv_posix_visible + + ;; +(netbsd*) + cf_xopen_source="-D_NETBSD_SOURCE" # setting _XOPEN_SOURCE breaks IPv6 for lynx on NetBSD 1.6, breaks xterm, is not needed for ncursesw + ;; +(openbsd[4-9]*) + # setting _XOPEN_SOURCE lower than 500 breaks g++ compile with wchar.h, needed for ncursesw + cf_xopen_source="-D_BSD_SOURCE" + cf_XOPEN_SOURCE=600 + ;; +(openbsd*) + # setting _XOPEN_SOURCE breaks xterm on OpenBSD 2.8, is not needed for ncursesw + ;; +(osf[45]*) + cf_xopen_source="-D_OSF_SOURCE" + ;; +(nto-qnx*) + cf_xopen_source="-D_QNX_SOURCE" + ;; +(sco*) + # setting _XOPEN_SOURCE breaks Lynx on SCO Unix / OpenServer + ;; +(solaris2.*) + cf_xopen_source="-D__EXTENSIONS__" + cf_cv_xopen_source=broken + ;; +(sysv4.2uw2.*) # Novell/SCO UnixWare 2.x (tested on 2.1.2) + cf_XOPEN_SOURCE= + cf_POSIX_C_SOURCE= + ;; +(*) + +echo "$as_me:3679: checking if we should define _XOPEN_SOURCE" >&5 +echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_xopen_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 3686 "configure" +#include "confdefs.h" + +#include +#include +#include + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3705: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3708: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3711: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3714: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + + cat >conftest.$ac_ext <<_ACEOF +#line 3726 "configure" +#include "confdefs.h" + +#include +#include +#include + +int +main (void) +{ + +#ifdef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3745: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3748: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3751: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3754: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xopen_source=$cf_XOPEN_SOURCE +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$cf_save" + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:3769: result: $cf_cv_xopen_source" >&5 +echo "${ECHO_T}$cf_cv_xopen_source" >&6 + +if test "$cf_cv_xopen_source" != no ; then + +CFLAGS=`echo "$CFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_temp_xopen_source +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +if test "$cf_cv_posix_visible" = no; then + +cf_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE + +cf_save_CFLAGS="$CFLAGS" +cf_save_CPPFLAGS="$CPPFLAGS" + +cf_trim_CFLAGS=`echo "$cf_save_CFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +cf_trim_CPPFLAGS=`echo "$cf_save_CPPFLAGS" | \ + sed -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_POSIX_C_SOURCE"'\(=[^ ]*\)\?$//g'` + +echo "$as_me:3899: checking if we should define _POSIX_C_SOURCE" >&5 +echo $ECHO_N "checking if we should define _POSIX_C_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_posix_c_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:3905: testing if the symbol is already defined go no further ..." 1>&5 + + cat >conftest.$ac_ext <<_ACEOF +#line 3908 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3923: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3926: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3929: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3932: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_posix_c_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_want_posix_source=no + case .$cf_POSIX_C_SOURCE in + (.[12]??*) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + ;; + (.2) + cf_cv_posix_c_source="-D_POSIX_C_SOURCE=$cf_POSIX_C_SOURCE" + cf_want_posix_source=yes + ;; + (.*) + cf_want_posix_source=yes + ;; + esac + if test "$cf_want_posix_source" = yes ; then + cat >conftest.$ac_ext <<_ACEOF +#line 3953 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifdef _POSIX_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:3968: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:3971: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:3974: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:3977: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_c_source="$cf_cv_posix_c_source -D_POSIX_SOURCE" +fi +rm -f conftest.$ac_objext conftest.$ac_ext + fi + +echo "${as_me:-configure}:3988: testing ifdef from value $cf_POSIX_C_SOURCE ..." 1>&5 + + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_cv_posix_c_source" + +echo "${as_me:-configure}:3996: testing if the second compile does not leave our definition intact error ..." 1>&5 + + cat >conftest.$ac_ext <<_ACEOF +#line 3999 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _POSIX_C_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4014: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4017: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4020: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4023: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_c_source=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CFLAGS="$cf_save_CFLAGS" + CPPFLAGS="$cf_save_CPPFLAGS" + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:4039: result: $cf_cv_posix_c_source" >&5 +echo "${ECHO_T}$cf_cv_posix_c_source" >&6 + +if test "$cf_cv_posix_c_source" != no ; then + CFLAGS="$cf_trim_CFLAGS" + CPPFLAGS="$cf_trim_CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_posix_c_source +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +fi # cf_cv_posix_visible + + ;; +esac + +if test -n "$cf_xopen_source" ; then + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_xopen_source +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6 + +echo "${as_me:-configure}:4233: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6 + +echo "${as_me:-configure}:4243: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5 + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6 + +echo "${as_me:-configure}:4253: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5 + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +if test -n "$cf_XOPEN_SOURCE" && test -z "$cf_cv_xopen_source" ; then + echo "$as_me:4263: checking if _XOPEN_SOURCE really is set" >&5 +echo $ECHO_N "checking if _XOPEN_SOURCE really is set... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line 4266 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4281: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4284: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4287: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4290: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_XOPEN_SOURCE_set=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_XOPEN_SOURCE_set=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + echo "$as_me:4299: result: $cf_XOPEN_SOURCE_set" >&5 +echo "${ECHO_T}$cf_XOPEN_SOURCE_set" >&6 + if test $cf_XOPEN_SOURCE_set = yes + then + cat >conftest.$ac_ext <<_ACEOF +#line 4304 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + +#if (_XOPEN_SOURCE - 0) < $cf_XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4319: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4322: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4325: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4328: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_XOPEN_SOURCE_set_ok=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_XOPEN_SOURCE_set_ok=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + if test $cf_XOPEN_SOURCE_set_ok = no + then + { echo "$as_me:4339: WARNING: _XOPEN_SOURCE is lower than requested" >&5 +echo "$as_me: WARNING: _XOPEN_SOURCE is lower than requested" >&2;} + fi + else + +echo "$as_me:4344: checking if we should define _XOPEN_SOURCE" >&5 +echo $ECHO_N "checking if we should define _XOPEN_SOURCE... $ECHO_C" >&6 +if test "${cf_cv_xopen_source+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 4351 "configure" +#include "confdefs.h" + +#include +#include +#include + +int +main (void) +{ + +#ifndef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4370: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4373: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4376: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4379: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_save="$CPPFLAGS" + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_XOPEN_SOURCE=$cf_XOPEN_SOURCE" + + cat >conftest.$ac_ext <<_ACEOF +#line 4391 "configure" +#include "confdefs.h" + +#include +#include +#include + +int +main (void) +{ + +#ifdef _XOPEN_SOURCE +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4410: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4413: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4416: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4419: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xopen_source=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xopen_source=$cf_XOPEN_SOURCE +fi +rm -f conftest.$ac_objext conftest.$ac_ext + CPPFLAGS="$cf_save" + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:4434: result: $cf_cv_xopen_source" >&5 +echo "${ECHO_T}$cf_cv_xopen_source" >&6 + +if test "$cf_cv_xopen_source" != no ; then + +CFLAGS=`echo "$CFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"_XOPEN_SOURCE"'\(=[^ ]*\)\?$//g'` + + cf_temp_xopen_source="-D_XOPEN_SOURCE=$cf_cv_xopen_source" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_temp_xopen_source +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + + fi +fi +fi # cf_cv_posix_visible + +echo "$as_me:4553: checking if SIGWINCH is defined" >&5 +echo $ECHO_N "checking if SIGWINCH is defined... $ECHO_C" >&6 +if test "${cf_cv_define_sigwinch+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 4560 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ +int x = SIGWINCH; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4575: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4578: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4581: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4584: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_define_sigwinch=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cat >conftest.$ac_ext <<_ACEOF +#line 4591 "configure" +#include "confdefs.h" + +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include + +int +main (void) +{ +int x = SIGWINCH; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4609: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4612: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4615: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4618: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_define_sigwinch=maybe +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_define_sigwinch=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:4632: result: $cf_cv_define_sigwinch" >&5 +echo "${ECHO_T}$cf_cv_define_sigwinch" >&6 + +if test "$cf_cv_define_sigwinch" = maybe ; then +echo "$as_me:4636: checking for actual SIGWINCH definition" >&5 +echo $ECHO_N "checking for actual SIGWINCH definition... $ECHO_C" >&6 +if test "${cf_cv_fixup_sigwinch+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_fixup_sigwinch=unknown +cf_sigwinch=32 +while test $cf_sigwinch != 1 +do + cat >conftest.$ac_ext <<_ACEOF +#line 4647 "configure" +#include "confdefs.h" + +#undef _XOPEN_SOURCE +#undef _POSIX_SOURCE +#undef _POSIX_C_SOURCE +#include +#include + +int +main (void) +{ + +#if SIGWINCH != $cf_sigwinch +make an error +#endif +int x = SIGWINCH; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4669: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4672: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4675: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4678: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_fixup_sigwinch=$cf_sigwinch + break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +cf_sigwinch=`expr $cf_sigwinch - 1` +done + +fi +echo "$as_me:4692: result: $cf_cv_fixup_sigwinch" >&5 +echo "${ECHO_T}$cf_cv_fixup_sigwinch" >&6 + + if test "$cf_cv_fixup_sigwinch" != unknown ; then + CPPFLAGS="$CPPFLAGS -DSIGWINCH=$cf_cv_fixup_sigwinch" + fi +fi + +### checks for header files + +for ac_header in \ +ncurses/curses.h \ +ncurses/term.h \ +stdlib.h \ +sys/ptem.h sys/ttydefaults.h \ +term.h \ +termios.h \ +unistd.h \ +wchar.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:4714: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 4720 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:4724: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:4730: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:4749: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6 +if test "${ac_cv_header_time+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 4765 "configure" +#include "confdefs.h" +#include +#include +#include + +int +main (void) +{ +if ((struct tm *) 0) +return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4781: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4784: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4787: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4790: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_time=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_header_time=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:4800: result: $ac_cv_header_time" >&5 +echo "${ECHO_T}$ac_cv_header_time" >&6 +if test $ac_cv_header_time = yes; then + +cat >>confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + +echo "$as_me:4810: checking for nl_langinfo and CODESET" >&5 +echo $ECHO_N "checking for nl_langinfo and CODESET... $ECHO_C" >&6 +if test "${am_cv_langinfo_codeset+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 4816 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +char* cs = nl_langinfo(CODESET); (void)cs + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:4828: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:4831: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:4834: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4837: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + am_cv_langinfo_codeset=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +am_cv_langinfo_codeset=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:4848: result: $am_cv_langinfo_codeset" >&5 +echo "${ECHO_T}$am_cv_langinfo_codeset" >&6 + if test $am_cv_langinfo_codeset = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_LANGINFO_CODESET 1 +EOF + + fi + +### checks for typedefs + +echo "$as_me:4860: checking for signal global datatype" >&5 +echo $ECHO_N "checking for signal global datatype... $ECHO_C" >&6 +if test "${cf_cv_sig_atomic_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + for cf_type in \ + "volatile sig_atomic_t" \ + "sig_atomic_t" \ + "int" + do + cat >conftest.$ac_ext <<_ACEOF +#line 4872 "configure" +#include "confdefs.h" + +#include +#include +#include + +extern $cf_type x; +$cf_type x; +static void handler(int sig) +{ + (void)sig; + x = 5; +} +int +main (void) +{ +signal(SIGINT, handler); + x = 1 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:4896: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:4899: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:4902: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:4905: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_sig_atomic_t=$cf_type +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_sig_atomic_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + test "$cf_cv_sig_atomic_t" != no && break + done + +fi + +echo "$as_me:4919: result: $cf_cv_sig_atomic_t" >&5 +echo "${ECHO_T}$cf_cv_sig_atomic_t" >&6 +test "$cf_cv_sig_atomic_t" != no && +cat >>confdefs.h <&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 4932 "configure" +#include "confdefs.h" +#include +#include +#include +#include + +_ACEOF +if { (eval echo "$as_me:4940: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:4946: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +#line 4968 "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -rf conftest* + +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 <<_ACEOF +#line 4986 "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -rf conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +#line 5007 "configure" +#include "confdefs.h" +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main (void) +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + $ac_main_return(2); + $ac_main_return (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:5033: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:5036: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:5038: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5041: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_header_stdc=no +fi +rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:5054: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:5070: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 5076 "configure" +#include "confdefs.h" +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5082: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5085: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5088: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5091: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_Header=no" +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:5101: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for time_t... $ECHO_C" >&6 +if test "${ac_cv_type_time_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 5117 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +if ((time_t *) 0) + return 0; +if (sizeof (time_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5132: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5135: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5138: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5141: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_time_t=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_type_time_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:5151: result: $ac_cv_type_time_t" >&5 +echo "${ECHO_T}$ac_cv_type_time_t" >&6 +if test $ac_cv_type_time_t = yes; then + : +else + +cat >>confdefs.h < or " >&5 +echo $ECHO_N "checking for cc_t in or ... $ECHO_C" >&6 +if test "${cf_cv_type_cc_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 5170 "configure" +#include "confdefs.h" + +#include +#if defined(HAVE_TERMIOS_H) +#include +#else +#include +#include +#endif + +int +main (void) +{ +cc_t x; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5190: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5193: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5196: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5199: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_type_cc_t=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_type_cc_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi + +echo "$as_me:5211: result: $cf_cv_type_cc_t" >&5 +echo "${ECHO_T}$cf_cv_type_cc_t" >&6 +test $cf_cv_type_cc_t = no && +cat >>confdefs.h <<\EOF +#define cc_t unsigned char +EOF + +echo "$as_me:5218: checking for mode_t" >&5 +echo $ECHO_N "checking for mode_t... $ECHO_C" >&6 +if test "${ac_cv_type_mode_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 5224 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +if ((mode_t *) 0) + return 0; +if (sizeof (mode_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5239: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5242: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5245: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5248: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_mode_t=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_type_mode_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:5258: result: $ac_cv_type_mode_t" >&5 +echo "${ECHO_T}$ac_cv_type_mode_t" >&6 +if test $ac_cv_type_mode_t = yes; then + : +else + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for pid_t... $ECHO_C" >&6 +if test "${ac_cv_type_pid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 5276 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +if ((pid_t *) 0) + return 0; +if (sizeof (pid_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5291: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5294: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5297: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5300: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_pid_t=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_type_pid_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:5310: result: $ac_cv_type_pid_t" >&5 +echo "${ECHO_T}$ac_cv_type_pid_t" >&6 +if test $ac_cv_type_pid_t = yes; then + : +else + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for uid_t in sys/types.h... $ECHO_C" >&6 +if test "${ac_cv_type_uid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 5328 "configure" +#include "confdefs.h" +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "uid_t" >/dev/null 2>&1; then + ac_cv_type_uid_t=yes +else + ac_cv_type_uid_t=no +fi +rm -rf conftest* + +fi +echo "$as_me:5342: result: $ac_cv_type_uid_t" >&5 +echo "${ECHO_T}$ac_cv_type_uid_t" >&6 +if test $ac_cv_type_uid_t = no; then + +cat >>confdefs.h <<\EOF +#define uid_t int +EOF + +cat >>confdefs.h <<\EOF +#define gid_t int +EOF + +fi + +echo "$as_me:5356: checking for off_t" >&5 +echo $ECHO_N "checking for off_t... $ECHO_C" >&6 +if test "${ac_cv_type_off_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 5362 "configure" +#include "confdefs.h" +$ac_includes_default +int +main (void) +{ +if ((off_t *) 0) + return 0; +if (sizeof (off_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5377: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5380: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5383: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5386: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_off_t=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_type_off_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:5396: result: $ac_cv_type_off_t" >&5 +echo "${ECHO_T}$ac_cv_type_off_t" >&6 +if test $ac_cv_type_off_t = yes; then + : +else + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 5434 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:5465: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:5468: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:5471: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5474: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:5484: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 5503 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:5507: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:5513: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:5532: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for lastlog path... $ECHO_C" >&6 +if test "${cf_cv_path_lastlog+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 5549 "configure" +#include "confdefs.h" + +#include +#ifdef HAVE_LASTLOG_H +#include +#else +#ifdef HAVE_PATHS_H +#include +#endif +#endif +int +main (void) +{ +char *path = _PATH_LASTLOG; (void)path + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5569: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5572: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5575: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5578: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_path_lastlog="_PATH_LASTLOG" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +if test -f /usr/adm/lastlog ; then + cf_cv_path_lastlog=/usr/adm/lastlog + else + cf_cv_path_lastlog=no + fi +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:5593: result: $cf_cv_path_lastlog" >&5 +echo "${ECHO_T}$cf_cv_path_lastlog" >&6 +test $cf_cv_path_lastlog != no && +cat >>confdefs.h <<\EOF +#define USE_LASTLOG 1 +EOF + +echo "$as_me:5600: checking for utmp implementation" >&5 +echo $ECHO_N "checking for utmp implementation... $ECHO_C" >&6 +if test "${cf_cv_have_utmp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_have_utmp=no +for cf_header in utmpx utmp ; do +cf_utmp_includes=" +#include +#include <${cf_header}.h> +#define getutent getutxent +#ifdef USE_LASTLOG +#include /* may conflict with utmpx.h on Linux */ +#endif +" + cat >conftest.$ac_ext <<_ACEOF +#line 5617 "configure" +#include "confdefs.h" +$cf_utmp_includes +int +main (void) +{ +struct $cf_header x; + char *name = x.ut_name; /* utmp.h and compatible definitions */ + (void)x; + (void)name; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5633: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5636: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5639: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5642: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_utmp=$cf_header + break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +#line 5651 "configure" +#include "confdefs.h" +$cf_utmp_includes +int +main (void) +{ +struct $cf_header x; + char *name = x.ut_user; /* utmpx.h must declare this */ + (void)x; + (void)name; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5667: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5670: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5673: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5676: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_utmp=$cf_header + break + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done + +fi +echo "$as_me:5691: result: $cf_cv_have_utmp" >&5 +echo "${ECHO_T}$cf_cv_have_utmp" >&6 + +if test $cf_cv_have_utmp != no ; then + +cat >>confdefs.h <<\EOF +#define HAVE_UTMP 1 +EOF + + test $cf_cv_have_utmp = utmpx && +cat >>confdefs.h <<\EOF +#define UTMPX_FOR_UTMP 1 +EOF + +if test $cf_cv_have_utmp != no ; then +echo "$as_me:5706: checking if ${cf_cv_have_utmp}.ut_host is declared" >&5 +echo $ECHO_N "checking if ${cf_cv_have_utmp}.ut_host is declared... $ECHO_C" >&6 +if test "${cf_cv_have_utmp_ut_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 5713 "configure" +#include "confdefs.h" + +#include +#include <${cf_cv_have_utmp}.h> +int +main (void) +{ +struct $cf_cv_have_utmp x; + char *y = &x.ut_host[0]; + (void)x; + (void)y + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5730: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5733: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5736: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5739: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_utmp_ut_host=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_have_utmp_ut_host=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi + +echo "$as_me:5751: result: $cf_cv_have_utmp_ut_host" >&5 +echo "${ECHO_T}$cf_cv_have_utmp_ut_host" >&6 +test $cf_cv_have_utmp_ut_host != no && +cat >>confdefs.h <<\EOF +#define HAVE_UTMP_UT_HOST 1 +EOF + +fi + +if test $cf_cv_have_utmp != no ; then +echo "$as_me:5761: checking if ${cf_cv_have_utmp}.ut_syslen is declared" >&5 +echo $ECHO_N "checking if ${cf_cv_have_utmp}.ut_syslen is declared... $ECHO_C" >&6 +if test "${cf_cv_have_utmp_ut_syslen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 5768 "configure" +#include "confdefs.h" + +#include +#include <${cf_cv_have_utmp}.h> +int +main (void) +{ +struct $cf_cv_have_utmp x; + int y = x.ut_syslen; + (void)x; + (void)y + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5785: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5788: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5791: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5794: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_utmp_ut_syslen=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_have_utmp_ut_syslen=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi + +echo "$as_me:5806: result: $cf_cv_have_utmp_ut_syslen" >&5 +echo "${ECHO_T}$cf_cv_have_utmp_ut_syslen" >&6 +test $cf_cv_have_utmp_ut_syslen != no && +cat >>confdefs.h <<\EOF +#define HAVE_UTMP_UT_SYSLEN 1 +EOF + +fi + +if test $cf_cv_have_utmp != no ; then +echo "$as_me:5816: checking if ${cf_cv_have_utmp}.ut_name is declared" >&5 +echo $ECHO_N "checking if ${cf_cv_have_utmp}.ut_name is declared... $ECHO_C" >&6 +if test "${cf_cv_have_utmp_ut_name+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_have_utmp_ut_name=no +cf_utmp_includes=" +#include +#include <${cf_cv_have_utmp}.h> +#define getutent getutxent +#ifdef USE_LASTLOG +#include /* may conflict with utmpx.h on Linux */ +#endif +" +for cf_header in ut_name ut_user ; do + cat >conftest.$ac_ext <<_ACEOF +#line 5833 "configure" +#include "confdefs.h" +$cf_utmp_includes +int +main (void) +{ +struct $cf_cv_have_utmp x; + char *name = x.$cf_header; + (void)x; + (void)name; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5849: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5852: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5855: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5858: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_utmp_ut_name=$cf_header + break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done + +fi +echo "$as_me:5870: result: $cf_cv_have_utmp_ut_name" >&5 +echo "${ECHO_T}$cf_cv_have_utmp_ut_name" >&6 + +case $cf_cv_have_utmp_ut_name in +(no) + { { echo "$as_me:5875: error: Cannot find declaration for ut.ut_name" >&5 +echo "$as_me: error: Cannot find declaration for ut.ut_name" >&2;} + { (exit 1); exit 1; }; } + ;; +(ut_user) + +cat >>confdefs.h <<\EOF +#define ut_name ut_user +EOF + + ;; +esac +fi + +if test $cf_cv_have_utmp != no ; then +echo "$as_me:5890: checking for exit-status in $cf_cv_have_utmp" >&5 +echo $ECHO_N "checking for exit-status in $cf_cv_have_utmp... $ECHO_C" >&6 +if test "${cf_cv_have_utmp_ut_xstatus+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +for cf_result in \ + ut_exit.__e_exit \ + ut_exit.e_exit \ + ut_exit.ut_e_exit \ + ut_exit.ut_exit +do +cat >conftest.$ac_ext <<_ACEOF +#line 5903 "configure" +#include "confdefs.h" + +#include +#include <${cf_cv_have_utmp}.h> +int +main (void) +{ +struct $cf_cv_have_utmp x; + long y = x.$cf_result = 0; + (void)x; + (void)y + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5920: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5923: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5926: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5929: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_utmp_ut_xstatus=$cf_result + break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_have_utmp_ut_xstatus=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +done + +fi +echo "$as_me:5942: result: $cf_cv_have_utmp_ut_xstatus" >&5 +echo "${ECHO_T}$cf_cv_have_utmp_ut_xstatus" >&6 +if test $cf_cv_have_utmp_ut_xstatus != no ; then + +cat >>confdefs.h <<\EOF +#define HAVE_UTMP_UT_XSTATUS 1 +EOF + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if ${cf_cv_have_utmp}.ut_xtime is declared... $ECHO_C" >&6 +if test "${cf_cv_have_utmp_ut_xtime+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 5965 "configure" +#include "confdefs.h" + +#include +#include <${cf_cv_have_utmp}.h> +int +main (void) +{ +struct $cf_cv_have_utmp x; + long y = x.ut_xtime = 0; + (void)x; + (void)y + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:5982: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:5985: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:5988: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:5991: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_utmp_ut_xtime=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cat >conftest.$ac_ext <<_ACEOF +#line 5998 "configure" +#include "confdefs.h" + +#include +#include <${cf_cv_have_utmp}.h> +int +main (void) +{ +struct $cf_cv_have_utmp x; + long y = x.ut_tv.tv_sec; + (void)x; + (void)y + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:6015: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6018: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:6021: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6024: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_utmp_ut_xtime=define +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_have_utmp_ut_xtime=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:6038: result: $cf_cv_have_utmp_ut_xtime" >&5 +echo "${ECHO_T}$cf_cv_have_utmp_ut_xtime" >&6 +if test $cf_cv_have_utmp_ut_xtime != no ; then + +cat >>confdefs.h <<\EOF +#define HAVE_UTMP_UT_XTIME 1 +EOF + + if test $cf_cv_have_utmp_ut_xtime = define ; then + +cat >>confdefs.h <<\EOF +#define ut_xtime ut_tv.tv_sec +EOF + + fi +fi +fi + +if test $cf_cv_have_utmp != no ; then +echo "$as_me:6057: checking if ${cf_cv_have_utmp}.ut_session is declared" >&5 +echo $ECHO_N "checking if ${cf_cv_have_utmp}.ut_session is declared... $ECHO_C" >&6 +if test "${cf_cv_have_utmp_ut_session+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 6064 "configure" +#include "confdefs.h" + +#include +#include <${cf_cv_have_utmp}.h> +int +main (void) +{ +struct $cf_cv_have_utmp x; + long y = x.ut_session; + (void)x; + (void)y + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:6081: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6084: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:6087: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6090: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_utmp_ut_session=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_have_utmp_ut_session=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:6101: result: $cf_cv_have_utmp_ut_session" >&5 +echo "${ECHO_T}$cf_cv_have_utmp_ut_session" >&6 +if test $cf_cv_have_utmp_ut_session != no ; then + +cat >>confdefs.h <<\EOF +#define HAVE_UTMP_UT_SESSION 1 +EOF + +fi +fi + +echo "$as_me:6112: checking if $cf_cv_have_utmp is SYSV flavor" >&5 +echo $ECHO_N "checking if $cf_cv_have_utmp is SYSV flavor... $ECHO_C" >&6 +if test "${cf_cv_sysv_utmp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +test "$cf_cv_have_utmp" = "utmp" && cf_prefix="ut" || cf_prefix="utx" +cat >conftest.$ac_ext <<_ACEOF +#line 6120 "configure" +#include "confdefs.h" + +#include +#include <${cf_cv_have_utmp}.h> +int +main (void) +{ + +struct $cf_cv_have_utmp x; + set${cf_prefix}ent (); + get${cf_prefix}id(&x); + put${cf_prefix}line(&x); + end${cf_prefix}ent(); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:6139: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6142: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:6145: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6148: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_sysv_utmp=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_sysv_utmp=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:6159: result: $cf_cv_sysv_utmp" >&5 +echo "${ECHO_T}$cf_cv_sysv_utmp" >&6 +test $cf_cv_sysv_utmp = yes && +cat >>confdefs.h <<\EOF +#define USE_SYSV_UTMP 1 +EOF + +fi + +for ac_header in lastlog.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:6171: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 6177 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:6181: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:6187: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:6206: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for struct lastlog... $ECHO_C" >&6 +if test "${cf_cv_struct_lastlog+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes; then + +cf_cv_struct_lastlog=unknown +else + cat >conftest.$ac_ext <<_ACEOF +#line 6227 "configure" +#include "confdefs.h" + +#include +#include +#include + +int main(void) +{ + struct lastlog data; + return (sizeof(data.ll_time) != sizeof(time_t)); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:6241: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6244: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:6246: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6249: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cf_cv_struct_lastlog=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + +cf_cv_struct_lastlog=no +fi +rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:6263: result: $cf_cv_struct_lastlog" >&5 +echo "${ECHO_T}$cf_cv_struct_lastlog" >&6 + +test $cf_cv_struct_lastlog != no && +cat >>confdefs.h <<\EOF +#define USE_STRUCT_LASTLOG 1 +EOF + +for ac_header in \ +sys/param.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:6276: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 6282 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:6286: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:6292: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:6311: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if POSIX saved-ids are supported... $ECHO_C" >&6 +if test "${cf_cv_posix_saved_ids+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 6328 "configure" +#include "confdefs.h" + +#include +#ifdef HAVE_SYS_PARAM_H +#include /* this may define "BSD" */ +#endif + +int +main (void) +{ + +#if defined(_POSIX_SAVED_IDS) && (_POSIX_SAVED_IDS > 0) + void *p = (void *) seteuid; + int x = seteuid(geteuid()); + (void)p; + (void)x; +#elif defined(BSD) && (BSD >= 199103) +/* The BSD's may implement the runtime check - and it fails. + * However, saved-ids work almost like POSIX (close enough for most uses). + */ +#else +make an error +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:6358: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6361: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:6364: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6367: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_posix_saved_ids=yes + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + +if test "$cross_compiling" = yes; then + cf_cv_posix_saved_ids=unknown +else + cat >conftest.$ac_ext <<_ACEOF +#line 6379 "configure" +#include "confdefs.h" + +#ifdef HAVE_STDLIB_H +#include +#endif +#include +int main(void) +{ + void *p = (void *) seteuid; + long code = sysconf(_SC_SAVED_IDS); + (void)p; + ${cf_cv_main_return:-return} ((code > 0) ? 0 : 1); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:6395: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6398: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:6400: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6403: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_posix_saved_ids=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_saved_ids=no +fi +rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:6419: result: $cf_cv_posix_saved_ids" >&5 +echo "${ECHO_T}$cf_cv_posix_saved_ids" >&6 + +test "$cf_cv_posix_saved_ids" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_POSIX_SAVED_IDS 1 +EOF + +# compute a reasonable value for $TERM to give tgetent(), since we may be +# running in 'screen', which sets $TERMCAP to a specific entry that is not +# necessarily in /etc/termcap - unsetenv is not portable, so we cannot simply +# discard $TERMCAP. +cf_TERMVAR=vt100 +if test -n "$TERMCAP" +then + cf_TERMCAP=`echo "$TERMCAP" | tr '\n' ' ' | sed -e 's/^..|//' -e 's/|.*//'` + case "$cf_TERMCAP" in + (screen*.*) + ;; + (*) + cf_TERMVAR="$cf_TERMCAP" + ;; + esac +fi +test -z "$cf_TERMVAR" && cf_TERMVAR=vt100 + +# BSD termcap used no header file +# SVr4 provided termcap prototypes as a legacy feature in term.h +# GNU termcap provided termcap prototypes in termcap.h +# ncurses provides termcap prototypes in both term.h and termcap.h +# +# The terminfo-based termcap interfaces do not provide a full tgetent (i.e., do +# not return the text of the termcap entry in the buffer), but as a special +# case, FreeBSD provides ncurses' termcap.h with a modified termcap reader that +# returns the termcap text. + +for ac_header in termcap.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:6458: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 6464 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:6468: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:6474: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:6493: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if we want full tgetent function... $ECHO_C" >&6 + +# Check whether --enable-full-tgetent or --disable-full-tgetent was given. +if test "${enable_full_tgetent+set}" = set; then + enableval="$enable_full_tgetent" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + cf_full_tgetent=no + else + cf_full_tgetent=yes + fi +else + enableval=yes + cf_full_tgetent=yes + +fi; +echo "$as_me:6520: result: $cf_full_tgetent" >&5 +echo "${ECHO_T}$cf_full_tgetent" >&6 + +if test "$cf_full_tgetent" = yes ; then + cf_test_message="full tgetent" +else + cf_test_message="tgetent" +fi + +echo "$as_me:6529: checking for $cf_test_message function" >&5 +echo $ECHO_N "checking for $cf_test_message function... $ECHO_C" >&6 +if test "${cf_cv_lib_tgetent+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_save_LIBS="$LIBS" +cf_cv_lib_tgetent=no +if test "$cf_full_tgetent" = yes ; then + cf_TERMLIB="otermcap termcap termlib ncurses curses" + cf_TERMTST="buffer[0] == 0" +else + cf_TERMLIB="termlib ncurses curses" + cf_TERMTST="0" +fi +for cf_termlib in '' $cf_TERMLIB ; do + LIBS="$cf_save_LIBS" + test -n "$cf_termlib" && { +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_termlib; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + } + if test "$cross_compiling" = yes; then + echo "cross-compiling, cannot verify if a termcap/tgetent is present in $cf_termlib" 1>&5 +else + cat >conftest.$ac_ext <<_ACEOF +#line 6567 "configure" +#include "confdefs.h" + +#ifdef HAVE_TERMCAP_H +#include +#endif +/* terminfo implementations ignore the buffer argument, making it useless for + * the xterm application, which uses this information to make a new TERMCAP + * environment variable. + */ +int main(void) +{ + char buffer[1024]; + buffer[0] = 0; + tgetent(buffer, "$cf_TERMVAR"); + ${cf_cv_main_return:-return} ($cf_TERMTST); } +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:6585: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6588: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:6590: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6593: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "yes, there is a termcap/tgetent in $cf_termlib" 1>&5 + if test -n "$cf_termlib" ; then + cf_cv_lib_tgetent="-l$cf_termlib" + else + cf_cv_lib_tgetent=yes + fi + break +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +echo "no, there is no termcap/tgetent in $cf_termlib" 1>&5 +fi +rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +done +LIBS="$cf_save_LIBS" + +fi +echo "$as_me:6614: result: $cf_cv_lib_tgetent" >&5 +echo "${ECHO_T}$cf_cv_lib_tgetent" >&6 + +# If we found a working tgetent(), set LIBS and check for termcap.h. +# (LIBS cannot be set inside AC_CACHE_CHECK; the commands there should +# not have side effects other than setting the cache variable, because +# they are not executed when a cached value exists.) +if test "x$cf_cv_lib_tgetent" != xno ; then + test "x$cf_cv_lib_tgetent" != xyes && { +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_cv_lib_tgetent; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + } + +cat >>confdefs.h <<\EOF +#define USE_TERMCAP 1 +EOF + + if test "$cf_full_tgetent" = no ; then + cat >conftest.$ac_ext <<_ACEOF +#line 6646 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ + +#ifdef NCURSES_VERSION +make an error +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:6662: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:6665: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:6668: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6671: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cat >>confdefs.h <<\EOF +#define HAVE_TERMCAP_H 1 +EOF + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext + else + +for ac_header in termcap.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:6687: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 6693 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:6697: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:6703: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:6722: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for partial tgetent function... $ECHO_C" >&6 +if test "${cf_cv_lib_part_tgetent+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cf_cv_lib_part_tgetent=no + for cf_termlib in $cf_TERMLIB ; do + LIBS="$cf_save_LIBS -l$cf_termlib" + cat >conftest.$ac_ext <<_ACEOF +#line 6749 "configure" +#include "confdefs.h" + +int +main (void) +{ +tgetent(0, "$cf_TERMVAR") + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:6761: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:6764: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:6767: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:6770: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo "there is a terminfo/tgetent in $cf_termlib" 1>&5 + cf_cv_lib_part_tgetent="-l$cf_termlib" + break +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done + LIBS="$cf_save_LIBS" + +fi +echo "$as_me:6784: result: $cf_cv_lib_part_tgetent" >&5 +echo "${ECHO_T}$cf_cv_lib_part_tgetent" >&6 + + if test "$cf_cv_lib_part_tgetent" != no ; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_cv_lib_part_tgetent; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +for ac_header in termcap.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:6808: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 6814 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:6818: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:6824: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:6843: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <>confdefs.h <<\EOF +#define USE_TERMINFO 1 +EOF + + fi +fi + +echo "$as_me:6863: checking for X applications class" >&5 +echo $ECHO_N "checking for X applications class... $ECHO_C" >&6 + +# Check whether --with-app-class or --without-app-class was given. +if test "${with_app_class+set}" = set; then + withval="$with_app_class" + APP_CLASS=$withval +else + APP_CLASS=XTerm +fi; + +case x$APP_CLASS in +(*[/@,%]*) + { echo "$as_me:6876: WARNING: X applications class cannot contain punctuation" >&5 +echo "$as_me: WARNING: X applications class cannot contain punctuation" >&2;} + APP_CLASS=XTerm + ;; +(x[A-Z]*) + ;; +(*) + { echo "$as_me:6883: WARNING: X applications class must start with capital, ignoring $APP_CLASS" >&5 +echo "$as_me: WARNING: X applications class must start with capital, ignoring $APP_CLASS" >&2;} + APP_CLASS=XTerm + ;; +esac + +echo "$as_me:6889: result: $APP_CLASS" >&5 +echo "${ECHO_T}$APP_CLASS" >&6 + +echo "$as_me:6892: checking for directory to install resource files" >&5 +echo $ECHO_N "checking for directory to install resource files... $ECHO_C" >&6 + +# Check whether --with-app-defaults or --without-app-defaults was given. +if test "${with_app_defaults+set}" = set; then + withval="$with_app_defaults" + APPSDIR=$withval +else + APPSDIR='${exec_prefix}/lib/X11/app-defaults' +fi; + +if test "x$APPSDIR" = xauto +then + APPSDIR='${exec_prefix}/lib/X11/app-defaults' + for cf_path in \ + /opt/local/share/X11/app-defaults \ + /opt/X11/share/X11/app-defaults \ + /usr/share/X11/app-defaults \ + /usr/X11/share/X11/app-defaults \ + /usr/X11/lib/X11/app-defaults \ + /usr/lib/X11/app-defaults \ + /etc/X11/app-defaults \ + /usr/pkg/lib/X11/app-defaults \ + /usr/X11R7/lib/X11/app-defaults \ + /usr/X11R6/lib/X11/app-defaults \ + /usr/X11R5/lib/X11/app-defaults \ + /usr/X11R4/lib/X11/app-defaults \ + /usr/local/lib/X11/app-defaults \ + /usr/local/share/X11/app-defaults \ + /usr/lib64/X11/app-defaults + do + if test -d "$cf_path" ; then + APPSDIR="$cf_path" + break + fi + done +else + cf_path=$APPSDIR + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case ".$cf_path" in +(.\$\(*\)*|.\'*\'*) + ;; +(..|./*|.\\*) + ;; +(.[a-zA-Z]:[\\/]*) # OS/2 EMX + ;; +(.\${*prefix}*|.\${*dir}*) + eval cf_path="$cf_path" + case ".$cf_path" in + (.NONE/*) + cf_path=`echo $cf_path | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(.no|.NONE/*) + cf_path=`echo $cf_path | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:6956: error: expected a pathname, not \"$cf_path\"" >&5 +echo "$as_me: error: expected a pathname, not \"$cf_path\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +fi + +echo "$as_me:6964: result: $APPSDIR" >&5 +echo "${ECHO_T}$APPSDIR" >&6 + +no_appsdir= +if test "$APPSDIR" = no +then + no_appsdir="#" +else + EXTRA_INSTALL_DIRS="$EXTRA_INSTALL_DIRS \$(APPSDIR)" +fi + +echo "$as_me:6975: checking for the icon name" >&5 +echo $ECHO_N "checking for the icon name... $ECHO_C" >&6 + +# Check whether --with-icon-name or --without-icon-name was given. +if test "${with_icon_name+set}" = set; then + withval="$with_icon_name" + ICON_NAME="$withval" +else + ICON_NAME=mini.xterm +fi; +case "x$ICON_NAME" in +(xyes|xno|x) + ICON_NAME=mini.xterm + ;; +esac + +echo "$as_me:6991: result: $ICON_NAME" >&5 +echo "${ECHO_T}$ICON_NAME" >&6 + +echo "$as_me:6994: checking for icon symlink to use" >&5 +echo $ECHO_N "checking for icon symlink to use... $ECHO_C" >&6 + +# Check whether --with-icon-symlink or --without-icon-symlink was given. +if test "${with_icon_symlink+set}" = set; then + withval="$with_icon_symlink" + ICON_SYMLINK="$withval" +else + ICON_SYMLINK=NONE +fi; +case "x$ICON_SYMLINK" in +(xyes) + ICON_SYMLINK=xterm + ;; +(xno|x) + ICON_SYMLINK=NONE + ;; +esac + +echo "$as_me:7013: result: $ICON_SYMLINK" >&5 +echo "${ECHO_T}$ICON_SYMLINK" >&6 + +# Install all icons except for the overused "terminal". +cf_cv_icon_list= +for my_item in $srcdir/icons/*.svg +do + test -f "$my_item" || continue + cf_icon_name=`echo $my_item |sed -e "s,.svg,," -e "s,^$srcdir/,,"` + case $cf_icon_name in + (*_48x48) + continue + ;; + esac + test -n "$verbose" && echo " adding $cf_icon_name to icon-list" 1>&6 + +echo "${as_me:-configure}:7029: testing adding $cf_icon_name to icon-list ..." 1>&5 + + cf_cv_icon_list="$cf_cv_icon_list $cf_icon_name" + if test -f "${cf_icon_name}_48x48.png" + then + test -n "$verbose" && echo " adding ${cf_icon_name}_48x48 to icon-list" 1>&6 + +echo "${as_me:-configure}:7036: testing adding ${cf_icon_name}_48x48 to icon-list ..." 1>&5 + + cf_cv_icon_list="$cf_cv_icon_list ${cf_icon_name}_48x48" + fi +done + +echo "$as_me:7042: checking for directory to install pixmaps" >&5 +echo $ECHO_N "checking for directory to install pixmaps... $ECHO_C" >&6 + +# Check whether --with-pixmapdir or --without-pixmapdir was given. +if test "${with_pixmapdir+set}" = set; then + withval="$with_pixmapdir" + PIXMAPDIR=$withval +else + test -z "$PIXMAPDIR" && PIXMAPDIR='${datadir}/pixmaps' +fi; + +if test "x$PIXMAPDIR" = xauto +then + PIXMAPDIR='${datadir}/pixmaps' + for cf_path in \ + /usr/share/pixmaps \ + /usr/X11R6/share/pixmaps + do + if test -d "$cf_path" ; then + PIXMAPDIR="$cf_path" + break + fi + done +else + cf_path=$PIXMAPDIR + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case ".$cf_path" in +(.\$\(*\)*|.\'*\'*) + ;; +(..|./*|.\\*) + ;; +(.[a-zA-Z]:[\\/]*) # OS/2 EMX + ;; +(.\${*prefix}*|.\${*dir}*) + eval cf_path="$cf_path" + case ".$cf_path" in + (.NONE/*) + cf_path=`echo $cf_path | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(.no|.NONE/*) + cf_path=`echo $cf_path | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:7093: error: expected a pathname, not \"$cf_path\"" >&5 +echo "$as_me: error: expected a pathname, not \"$cf_path\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +fi +echo "$as_me:7100: result: $PIXMAPDIR" >&5 +echo "${ECHO_T}$PIXMAPDIR" >&6 + +no_pixmapdir= +if test "$PIXMAPDIR" = no +then + no_pixmapdir="#" +else + EXTRA_INSTALL_DIRS="$EXTRA_INSTALL_DIRS \$(PIXMAPDIR)" +fi + +echo "$as_me:7111: checking for directory to install icons" >&5 +echo $ECHO_N "checking for directory to install icons... $ECHO_C" >&6 + +# Check whether --with-icondir or --without-icondir was given. +if test "${with_icondir+set}" = set; then + withval="$with_icondir" + ICONDIR=$withval +else + test -z "$ICONDIR" && ICONDIR=no +fi; + +if test "x$ICONDIR" = xauto +then + ICONDIR='${datadir}/icons' + for cf_path in \ + /usr/share/icons \ + /usr/X11R6/share/icons + do + if test -d "$cf_path" ; then + ICONDIR="$cf_path" + break + fi + done +else + cf_path=$ICONDIR + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case ".$cf_path" in +(.\$\(*\)*|.\'*\'*) + ;; +(..|./*|.\\*) + ;; +(.[a-zA-Z]:[\\/]*) # OS/2 EMX + ;; +(.\${*prefix}*|.\${*dir}*) + eval cf_path="$cf_path" + case ".$cf_path" in + (.NONE/*) + cf_path=`echo $cf_path | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(.no|.NONE/*) + cf_path=`echo $cf_path | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:7162: error: expected a pathname, not \"$cf_path\"" >&5 +echo "$as_me: error: expected a pathname, not \"$cf_path\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +fi +echo "$as_me:7169: result: $ICONDIR" >&5 +echo "${ECHO_T}$ICONDIR" >&6 + +no_icondir= +if test "$ICONDIR" = no +then + no_icondir="#" +else + EXTRA_INSTALL_DIRS="$EXTRA_INSTALL_DIRS \$(ICONDIR)" +fi + +echo "$as_me:7180: checking if icon theme should be used" >&5 +echo $ECHO_N "checking if icon theme should be used... $ECHO_C" >&6 + +# Check whether --with-icon-theme or --without-icon-theme was given. +if test "${with_icon_theme+set}" = set; then + withval="$with_icon_theme" + ICON_THEME=$withval +else + ICON_THEME=no +fi; + +case "x$ICON_THEME" in +(xno) + ;; +(x|xyes) + ICON_THEME=hicolor + ;; +esac +echo "$as_me:7198: result: $ICON_THEME" >&5 +echo "${ECHO_T}$ICON_THEME" >&6 + +if test "x$ICON_THEME" = xno +then + if test "x$ICONDIR" != xno + then + test -n "$verbose" && echo " ignoring icondir without theme" 1>&6 + +echo "${as_me:-configure}:7207: testing ignoring icondir without theme ..." 1>&5 + + no_icondir="#" + fi +else + if test "x$ICONDIR" = xno + then + { { echo "$as_me:7214: error: icondir must be set for icon theme" >&5 +echo "$as_me: error: icondir must be set for icon theme" >&2;} + { (exit 1); exit 1; }; } + fi +fi + +: ${ICON_FORMAT:=".svg .png .xpm"} + +ICON_LIST= + +if test "x$ICON_THEME" != xno +then + cf_icon_list="$cf_cv_icon_list" +else + cf_icon_list="icons/${ICON_NAME}_48x48" +fi + +echo "$as_me:7231: checking for icon(s) to install" >&5 +echo $ECHO_N "checking for icon(s) to install... $ECHO_C" >&6 +for cf_name in $cf_icon_list +do + test -n "$verbose" && echo " using $ICON_FORMAT" 1>&6 + +echo "${as_me:-configure}:7237: testing using $ICON_FORMAT ..." 1>&5 + + for cf_suffix in $ICON_FORMAT + do + cf_icon="${cf_name}${cf_suffix}" + cf_left=`echo "$cf_icon" | sed -e 's/:.*//'` + if test ! -f "${cf_left}" + then + if test "x$srcdir" != "x." + then + cf_icon="${srcdir}/${cf_left}" + cf_left=`echo "$cf_icon" | sed -e 's/:.*//'` + if test ! -f "${cf_left}" + then + continue + fi + else + continue + fi + fi + if test "x$ICON_THEME" != xno + then + cf_base=`basename $cf_left` + cf_trim=`echo "$cf_base" | sed -e 's/_[0-9][0-9]x[0-9][0-9]\././'` + case "x${cf_base}" in + (*:*) + cf_next=$cf_base + # user-defined mapping + ;; + (*.png) + cf_size=`file "$cf_left"|sed -e 's/^[^:]*://' -e 's/^.*[^0-9]\([0-9][0-9]* x [0-9][0-9]*\)[^0-9].*$/\1/' -e 's/ //g'` + if test -z "$cf_size" + then + { echo "$as_me:7270: WARNING: cannot determine size of $cf_left" >&5 +echo "$as_me: WARNING: cannot determine size of $cf_left" >&2;} + continue + fi + cf_next="$cf_size/apps/$cf_trim" + ;; + (*.svg) + cf_next="scalable/apps/$cf_trim" + ;; + (*.xpm) + test -n "$verbose" && echo " ignored XPM file in icon theme" 1>&6 + +echo "${as_me:-configure}:7282: testing ignored XPM file in icon theme ..." 1>&5 + + continue + ;; + (*_[0-9][0-9]*x[0-9][0-9]*.*) + cf_size=`echo "$cf_left"|sed -e 's/^.*_\([0-9][0-9]*x[0-9][0-9]*\)\..*$/\1/'` + cf_left=`echo "$cf_left"|sed -e 's/^\(.*\)_\([0-9][0-9]*x[0-9][0-9]*\)\(\..*\)$/\1\3/'` + cf_next="$cf_size/apps/$cf_base" + ;; + esac + test -n "$verbose" && echo " adding $cf_next" 1>&6 + +echo "${as_me:-configure}:7294: testing adding $cf_next ..." 1>&5 + + cf_icon="${cf_icon}:${cf_next}" + fi + test -n "$ICON_LIST" && ICON_LIST="$ICON_LIST " + ICON_LIST="$ICON_LIST${cf_icon}" + if test -z "$ICON_NAME" + then + ICON_NAME=`basename $cf_icon | sed -e 's/[.:].*//'` + fi + done +done + +if test -n "$verbose" +then + echo "$as_me:7309: checking result" >&5 +echo $ECHO_N "checking result... $ECHO_C" >&6 +fi +echo "$as_me:7312: result: $ICON_LIST" >&5 +echo "${ECHO_T}$ICON_LIST" >&6 + +if test -z "$ICON_LIST" +then + { { echo "$as_me:7317: error: no icons found" >&5 +echo "$as_me: error: no icons found" >&2;} + { (exit 1); exit 1; }; } +fi + +echo "$as_me:7322: checking for icon name" >&5 +echo $ECHO_N "checking for icon name... $ECHO_C" >&6 +echo "$as_me:7324: result: $ICON_NAME" >&5 +echo "${ECHO_T}$ICON_NAME" >&6 + +# Comment-out the install-desktop rule if the desktop-utils are not found. +echo "$as_me:7328: checking if you want to install desktop files" >&5 +echo $ECHO_N "checking if you want to install desktop files... $ECHO_C" >&6 + +# Check whether --enable-desktop or --disable-desktop was given. +if test "${enable_desktop+set}" = set; then + enableval="$enable_desktop" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_desktop=$enableval + else + enable_desktop=$enableval + fi +else + enableval=yes + enable_desktop=$enableval + +fi; +echo "$as_me:7345: result: $enable_desktop" >&5 +echo "${ECHO_T}$enable_desktop" >&6 + +desktop_utils= +if test "$enable_desktop" = yes ; then +# Extract the first word of "desktop-file-install", so it can be a program name with args. +set dummy desktop-file-install; ac_word=$2 +echo "$as_me:7352: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_desktop_utils+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$desktop_utils"; then + ac_cv_prog_desktop_utils="$desktop_utils" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_desktop_utils="yes" +echo "$as_me:7367: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_desktop_utils" && ac_cv_prog_desktop_utils="no" +fi +fi +desktop_utils=$ac_cv_prog_desktop_utils +if test -n "$desktop_utils"; then + echo "$as_me:7376: result: $desktop_utils" >&5 +echo "${ECHO_T}$desktop_utils" >&6 +else + echo "$as_me:7379: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi + +test "$desktop_utils" = yes && desktop_utils= || desktop_utils="#" + +if test -z "$desktop_utils" +then + echo "$as_me:7389: checking for requested desktop-category" >&5 +echo $ECHO_N "checking for requested desktop-category... $ECHO_C" >&6 + +# Check whether --with-desktop-category or --without-desktop-category was given. +if test "${with_desktop_category+set}" = set; then + withval="$with_desktop_category" + cf_desktop_want=$withval +else + cf_desktop_want=auto +fi; + echo "$as_me:7399: result: $cf_desktop_want" >&5 +echo "${ECHO_T}$cf_desktop_want" >&6 + + if test "$cf_desktop_want" = auto + then + rm -rf conftest* + cf_desktop_also= + for cf_desktop_dir in \ + /usr/share/app-install \ + /usr/share/applications + do + if test -d $cf_desktop_dir + then + find $cf_desktop_dir -name '*.desktop' | \ + while true + do + read cf_desktop_path + test -z "$cf_desktop_path" && break + cf_desktop_name=`basename $cf_desktop_path .desktop` + case $cf_desktop_name in + (xterm|*-xterm|*rxvt*|*konsole|*[Tt]erminal) + test -n "$verbose" && echo " inspect $cf_desktop_path" 1>&6 + +echo "${as_me:-configure}:7422: testing inspect $cf_desktop_path ..." 1>&5 + + egrep '^Categories=' $cf_desktop_path | \ + tr ';' '\n' | \ + sed -e 's%^.*=%%' -e '/^$/d' >>conftest.1 + ;; + esac + done + fi + done + if test -s conftest.1 + then + cf_desktop_last= + sort conftest.1 | \ + while true + do + read cf_desktop_this + test -z "$cf_desktop_this" && break + case $cf_desktop_this in + (Qt*|GTK*|KDE*|GNOME*|*XFCE*|*Xfce*) + ;; + (System|TerminalEmulator|*) + test "x$cf_desktop_last" != "x$cf_desktop_this" && echo $cf_desktop_this >>conftest.2 + ;; + esac + cf_desktop_last=$cf_desktop_this + done + cf_desktop_want=`cat conftest.2 | tr '\n' ';'` + fi + if test -n "$cf_desktop_want" + then + if test "$cf_desktop_want" = auto + then + cf_desktop_want= + else + # do a sanity check on the semicolon-separated list, ignore on failure + cf_desktop_test=`echo "$cf_desktop_want" | sed -e 's/[^;]//g'` + test -z "$cf_desktop_test" && cf_desktop_want= + cf_desktop_test=`echo "$cf_desktop_want" | sed -e 's/^.*;$/./g'` + test -z "$cf_desktop_test" && cf_desktop_want= + fi + fi + if test -z "$cf_desktop_want" + then + cf_desktop_want="`echo "System|TerminalEmulator|*" | sed -e 's/\*//g' -e 's/|/;/g' -e 's/;*$/;/g'`" + test -n "$verbose" && echo " no usable value found for desktop category" 1>&6 + +echo "${as_me:-configure}:7469: testing no usable value found for desktop category ..." 1>&5 + + fi + fi + DESKTOP_CATEGORY=`echo "$cf_desktop_want" | sed -e 's/[ ,]/;/g'` + test -n "$verbose" && echo " will use Categories=$DESKTOP_CATEGORY" 1>&6 + +echo "${as_me:-configure}:7476: testing will use Categories=$DESKTOP_CATEGORY ..." 1>&5 + +fi + +echo "$as_me:7480: checking for install-permissions reference" >&5 +echo $ECHO_N "checking for install-permissions reference... $ECHO_C" >&6 + +# Check whether --with-reference or --without-reference was given. +if test "${with_reference+set}" = set; then + withval="$with_reference" + with_reference=$withval +else + with_reference=xterm +fi; +echo "$as_me:7490: result: $with_reference" >&5 +echo "${ECHO_T}$with_reference" >&6 + +with_full_paths=yes + + echo "$as_me:7495: checking for PATH separator" >&5 +echo $ECHO_N "checking for PATH separator... $ECHO_C" >&6 + case $cf_cv_system_name in + (os2*) PATH_SEPARATOR=';' ;; + (*) ${PATH_SEPARATOR:=':'} ;; + esac + + echo "$as_me:7502: result: $PATH_SEPARATOR" >&5 +echo "${ECHO_T}$PATH_SEPARATOR" >&6 + +test -z "$XTERM_PATH" && XTERM_PATH=$with_reference +for ac_prog in $XTERM_PATH $with_reference +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 "$as_me:7510: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_XTERM_PATH+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $XTERM_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_XTERM_PATH="$XTERM_PATH" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_XTERM_PATH="$ac_dir/$ac_word" + echo "$as_me:7527: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +XTERM_PATH=$ac_cv_path_XTERM_PATH + +if test -n "$XTERM_PATH"; then + echo "$as_me:7538: result: $XTERM_PATH" >&5 +echo "${ECHO_T}$XTERM_PATH" >&6 +else + echo "$as_me:7541: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$XTERM_PATH" && break +done +test -n "$XTERM_PATH" || XTERM_PATH="$XTERM_PATH" + +cf_path_prog="" +cf_path_args="" +IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR" +for cf_temp in $ac_cv_path_XTERM_PATH +do + if test -z "$cf_path_prog" ; then + if test "$with_full_paths" = yes ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case ".$cf_temp" in +(.\$\(*\)*|.\'*\'*) + ;; +(..|./*|.\\*) + ;; +(.[a-zA-Z]:[\\/]*) # OS/2 EMX + ;; +(.\${*prefix}*|.\${*dir}*) + eval cf_temp="$cf_temp" + case ".$cf_temp" in + (.NONE/*) + cf_temp=`echo $cf_temp | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(.no|.NONE/*) + cf_temp=`echo $cf_temp | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + break + ;; +esac + + cf_path_prog="$cf_temp" + else + cf_path_prog="`basename $cf_temp`" + fi + elif test -z "$cf_path_args" ; then + cf_path_args="$cf_temp" + else + cf_path_args="$cf_path_args $cf_temp" + fi +done +IFS="$cf_save_ifs" + +if test -n "$cf_path_prog" ; then + +echo "${as_me:-configure}:7600: testing defining path for ${cf_path_prog} ..." 1>&5 + +cat >>confdefs.h <>confdefs.h <&5 +echo $ECHO_N "checking for symbolic link to create to $cf_name... $ECHO_C" >&6 + +# Check whether --with-xterm-symlink or --without-xterm-symlink was given. +if test "${with_xterm_symlink+set}" = set; then + withval="$with_xterm_symlink" + with_symlink=$withval +else + with_symlink=xterm +fi; +echo "$as_me:7631: result: $with_symlink" >&5 +echo "${ECHO_T}$with_symlink" >&6 +test "$with_symlink" = yes && with_symlink=xterm +test -n "$with_symlink" && \ + test "$with_symlink" != no && \ + test "$with_symlink" != $cf_name && \ + XTERM_SYMLINK="$with_symlink" +fi + +echo "$as_me:7640: checking if you want to disable openpty" >&5 +echo $ECHO_N "checking if you want to disable openpty... $ECHO_C" >&6 + +# Check whether --enable-openpty or --disable-openpty was given. +if test "${enable_openpty+set}" = set; then + enableval="$enable_openpty" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + disable_openpty=yes + else + disable_openpty=no + fi +else + enableval=yes + disable_openpty=no + +fi; +echo "$as_me:7657: result: $disable_openpty" >&5 +echo "${ECHO_T}$disable_openpty" >&6 + +echo "$as_me:7660: checking if you want to disable setuid" >&5 +echo $ECHO_N "checking if you want to disable setuid... $ECHO_C" >&6 + +# Check whether --enable-setuid or --disable-setuid was given. +if test "${enable_setuid+set}" = set; then + enableval="$enable_setuid" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + disable_setuid=yes + else + disable_setuid=no + fi +else + enableval=yes + disable_setuid=no + +fi; +echo "$as_me:7677: result: $disable_setuid" >&5 +echo "${ECHO_T}$disable_setuid" >&6 + +echo "$as_me:7680: checking if you want to disable setgid" >&5 +echo $ECHO_N "checking if you want to disable setgid... $ECHO_C" >&6 + +# Check whether --enable-setgid or --disable-setgid was given. +if test "${enable_setgid+set}" = set; then + enableval="$enable_setgid" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + disable_setgid=yes + else + disable_setgid=no + fi +else + enableval=yes + disable_setgid=no + +fi; +echo "$as_me:7697: result: $disable_setgid" >&5 +echo "${ECHO_T}$disable_setgid" >&6 + +echo "$as_me:7700: checking if you want to run xterm setuid to a given user" >&5 +echo $ECHO_N "checking if you want to run xterm setuid to a given user... $ECHO_C" >&6 + +# Check whether --with-setuid or --without-setuid was given. +if test "${with_setuid+set}" = set; then + withval="$with_setuid" + use_given_setuid=$withval +else + use_given_setuid=no +fi; +echo "$as_me:7710: result: $use_given_setuid" >&5 +echo "${ECHO_T}$use_given_setuid" >&6 + +if test "$use_given_setuid" != no ; then + if test "$use_given_setuid" = yes ; then + cf_cv_given_setuid=root + else + cf_cv_given_setuid=$use_given_setuid + fi + # inherit SINSTALL_OPTS from environment to allow packager to customize it. + SINSTALL_OPTS="$SINSTALL_OPTS u+s -u $cf_cv_given_setuid" +fi + +echo "$as_me:7723: checking if you want to run xterm setgid to match utmp/utmpx file" >&5 +echo $ECHO_N "checking if you want to run xterm setgid to match utmp/utmpx file... $ECHO_C" >&6 + +# Check whether --with-utmp-setgid or --without-utmp-setgid was given. +if test "${with_utmp_setgid+set}" = set; then + withval="$with_utmp_setgid" + use_utmp_setgid=$withval +else + use_utmp_setgid=no +fi; +echo "$as_me:7733: result: $use_utmp_setgid" >&5 +echo "${ECHO_T}$use_utmp_setgid" >&6 + +if test "$use_utmp_setgid" != no ; then + if test "$use_utmp_setgid" = yes ; then + +if test $cf_cv_have_utmp != no ; then +echo "$as_me:7740: checking for utmp/utmpx group" >&5 +echo $ECHO_N "checking for utmp/utmpx group... $ECHO_C" >&6 +if test "${cf_cv_utmp_group+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +for cf_utmp_path in /var/adm /var/run +do + for cf_utmp_file in utmpx utmp + do + if test -f $cf_utmp_path/$cf_utmp_file + then + cf_cv_utmp_group=root + + cf_option="-l -L" + + # Expect listing to have fields like this: + #-r--r--r-- 1 user group 34293 Jul 18 16:29 pathname + ls $cf_option $cf_utmp_path/$cf_utmp_file >conftest + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest conftest + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest &5 +echo "${ECHO_T}$cf_cv_utmp_group" >&6 +else + { { echo "$as_me:7785: error: cannot find utmp group" >&5 +echo "$as_me: error: cannot find utmp group" >&2;} + { (exit 1); exit 1; }; } +fi + + else + cf_cv_utmp_group=$use_utmp_setgid + fi + if test "$cf_cv_posix_saved_ids" != yes ; then + { { echo "$as_me:7794: error: Your system does not support POSIX saved-ids" >&5 +echo "$as_me: error: Your system does not support POSIX saved-ids" >&2;} + { (exit 1); exit 1; }; } + fi + +cat >>confdefs.h <<\EOF +#define USE_UTMP_SETGID 1 +EOF + + SINSTALL_OPTS="$SINSTALL_OPTS g+s -g $cf_cv_utmp_group" +fi + +echo "$as_me:7806: checking if you want to link with utempter" >&5 +echo $ECHO_N "checking if you want to link with utempter... $ECHO_C" >&6 + +# Check whether --with-utempter or --without-utempter was given. +if test "${with_utempter+set}" = set; then + withval="$with_utempter" + use_utempter=$withval +else + use_utempter=no +fi; +echo "$as_me:7816: result: $use_utempter" >&5 +echo "${ECHO_T}$use_utempter" >&6 + +if test "$use_utempter" = yes ; then + +echo "$as_me:7821: checking if we can link with utempter library" >&5 +echo $ECHO_N "checking if we can link with utempter library... $ECHO_C" >&6 +if test "${cf_cv_have_utempter+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_save_LIBS="$LIBS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lutempter; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +cat >conftest.$ac_ext <<_ACEOF +#line 7846 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + addToUtmp("/dev/tty", 0, 1); + removeFromUtmp(); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:7863: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:7866: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:7869: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7872: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + cf_cv_have_utempter=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + + cf_cv_have_utempter=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS="$cf_save_LIBS" + +fi +echo "$as_me:7886: result: $cf_cv_have_utempter" >&5 +echo "${ECHO_T}$cf_cv_have_utempter" >&6 +if test "$cf_cv_have_utempter" = yes ; then + +cat >>confdefs.h <<\EOF +#define USE_UTEMPTER 1 +EOF + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lutempter; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + + test "$cf_cv_have_utempter" != yes && use_utempter=no +else + use_utempter=no +fi + +# Some configurations permit (or require) either setuid or setgid mode. +# Let the user decide. +if test "$use_utempter" = yes ; then + if test "${enable_setuid+set}" != set ; then + disable_setuid=yes + test -n "$verbose" && echo " No --disable-setuid option given, force to yes" 1>&6 + +echo "${as_me:-configure}:7924: testing No --disable-setuid option given, force to yes ..." 1>&5 + + fi +fi + +### checks for external data + +echo "$as_me:7931: checking if external errno is declared" >&5 +echo $ECHO_N "checking if external errno is declared... $ECHO_C" >&6 +if test "${cf_cv_dcl_errno+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 7938 "configure" +#include "confdefs.h" + +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +int +main (void) +{ +int x = (int) errno; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:7956: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:7959: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:7962: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:7965: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_dcl_errno=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_dcl_errno=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:7976: result: $cf_cv_dcl_errno" >&5 +echo "${ECHO_T}$cf_cv_dcl_errno" >&6 + +if test "$cf_cv_dcl_errno" = no ; then + +cf_result=`echo "decl_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking if external errno exists... $ECHO_C" >&6 +if test "${cf_cv_have_errno+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 7998 "configure" +#include "confdefs.h" + +#undef errno +extern int errno; + +int +main (void) +{ +errno = 2 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8013: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8016: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8019: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8022: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_errno=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_have_errno=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:8033: result: $cf_cv_have_errno" >&5 +echo "${ECHO_T}$cf_cv_have_errno" >&6 + +if test "$cf_cv_have_errno" = yes ; then + +cf_result=`echo "have_errno" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking for explicit tty group name... $ECHO_C" >&6 + +# Check whether --with-tty-group or --without-tty-group was given. +if test "${with_tty_group+set}" = set; then + withval="$with_tty_group" + cf_tty_group=$withval +else + cf_tty_group=auto... +fi; +test -z "$cf_tty_group" && cf_tty_group=auto... +test "$cf_tty_group" = yes && cf_tty_group=auto... +echo "$as_me:8058: result: $cf_tty_group" >&5 +echo "${ECHO_T}$cf_tty_group" >&6 + +if test "$cf_tty_group" = "auto..." ; then +echo "$as_me:8062: checking for tty group name" >&5 +echo $ECHO_N "checking for tty group name... $ECHO_C" >&6 +if test "${cf_cv_tty_group_name+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +# If we are configuring as root, it is hard to get a clue about the tty group. +# But we'll guess based on how our connection is set up - assuming it is done +# properly. + +cf_uid=`id | sed -e 's/^^=*=//' -e 's/(.*$//'` +# )vi +if test "$cf_uid" != 0 ; then +cf_cv_tty_group_name= +cf_tty_name=`tty` +test "$cf_tty_name" = "not a tty" && cf_tty_name=/dev/tty +test -z "$cf_tty_name" && cf_tty_name=/dev/tty +if test -c "$cf_tty_name" +then + cf_option="-l -L" + + # Expect listing to have fields like this: + #-rwxrwxrwx 1 user group 34293 Jul 18 16:29 pathname + ls $cf_option $cf_tty_name >conftest.out + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest conftest.out + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest /dev/null 1>/dev/null ) then + cf_cv_tty_group_name="tty" + fi + ;; +esac +fi + +fi +echo "$as_me:8115: result: $cf_cv_tty_group_name" >&5 +echo "${ECHO_T}$cf_cv_tty_group_name" >&6 +cf_tty_group="$cf_cv_tty_group_name" +else + # if configure option, always do this + +cat >>confdefs.h <<\EOF +#define USE_TTY_GROUP 1 +EOF + +fi + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if we may use the $cf_tty_group group... $ECHO_C" >&6 +if test "${cf_cv_tty_group+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_tty_name=`tty` +if test "$cf_tty_name" != "not a tty" +then +if test "$cross_compiling" = yes; then + cf_cv_tty_group=unknown +else + cat >conftest.$ac_ext <<_ACEOF +#line 8148 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +int main(void) +{ + struct stat sb; + struct group *ttygrp = getgrnam(TTY_GROUP_NAME); + char *name = ttyname(0); + + endgrent(); + if (ttygrp != 0 + && name != 0 + && stat(name, &sb) == 0 + && sb.st_gid != getgid() + && sb.st_gid == ttygrp->gr_gid) { + ${cf_cv_main_return:-return} (0); + } + ${cf_cv_main_return:-return} (1); +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:8174: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8177: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:8179: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8182: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_tty_group=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_tty_group=no +fi +rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +elif test "$cross_compiling" = yes; then + cf_cv_tty_group=unknown +else + cf_cv_tty_group=yes +fi + +fi +echo "$as_me:8200: result: $cf_cv_tty_group" >&5 +echo "${ECHO_T}$cf_cv_tty_group" >&6 + +if test $cf_cv_tty_group = no ; then + { echo "$as_me:8204: WARNING: Cannot use $cf_tty_group group" >&5 +echo "$as_me: WARNING: Cannot use $cf_tty_group group" >&2;} +else + cat >>confdefs.h <<\EOF +#define USE_TTY_GROUP 1 +EOF + +fi + +### checks for system services and user specified options + +echo "$as_me:8215: checking for X" >&5 +echo $ECHO_N "checking for X... $ECHO_C" >&6 + +# Check whether --with-x or --without-x was given. +if test "${with_x+set}" = set; then + withval="$with_x" + +fi; +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then + # Both variables are already set. + have_x=yes + else + if test "${ac_cv_have_x+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -fr conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + # Make sure to not put "make" in the Imakefile rules, since we grep it out. + cat >Imakefile <<'EOF' +acfindx: + @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' +EOF + if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl dylib dll; do + if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && + test -f $ac_im_libdir/libX11.$ac_extension; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /lib) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -fr conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R7/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/opt/local/include +/opt/X11/include + +/usr/include/X11 +/usr/include/X11R7 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R7/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R7 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Intrinsic.h. + # First, try using that file with no special directory specified. + cat >conftest.$ac_ext <<_ACEOF +#line 8319 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:8323: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:8329: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # We can compile using X headers with no special include directory. +ac_x_includes= +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Intrinsic.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lXt $LIBS" + cat >conftest.$ac_ext <<_ACEOF +#line 8362 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +XtMalloc (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8374: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8377: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8380: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8383: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +LIBS=$ac_save_LIBS +for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib dll; do + if test -r $ac_dir/libXt.$ac_extension; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then + # Didn't find X anywhere. Cache the known absence of X. + ac_cv_have_x="have_x=no" +else + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" +fi +fi + + fi + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + echo "$as_me:8421: result: $have_x" >&5 +echo "${ECHO_T}$have_x" >&6 + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes \ + ac_x_includes=$x_includes ac_x_libraries=$x_libraries" + echo "$as_me:8431: result: libraries $x_libraries, headers $x_includes" >&5 +echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6 +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +cat >>confdefs.h <<\EOF +#define X_DISPLAY_MISSING 1 +EOF + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + case `(uname -sr) 2>/dev/null` in + "SunOS 5"*) + echo "$as_me:8455: checking whether -R must be followed by a space" >&5 +echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6 + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + cat >conftest.$ac_ext <<_ACEOF +#line 8459 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8471: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8474: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8477: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8480: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_nospace=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_R_nospace=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + if test $ac_R_nospace = yes; then + echo "$as_me:8490: result: no" >&5 +echo "${ECHO_T}no" >&6 + X_LIBS="$X_LIBS -R$x_libraries" + else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat >conftest.$ac_ext <<_ACEOF +#line 8496 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8508: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8511: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8514: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8517: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_R_space=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_R_space=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + if test $ac_R_space = yes; then + echo "$as_me:8527: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + X_LIBS="$X_LIBS -R $x_libraries" + else + echo "$as_me:8531: result: neither works" >&5 +echo "${ECHO_T}neither works" >&6 + fi + fi + LIBS=$ac_xsave_LIBS + esac + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat >conftest.$ac_ext <<_ACEOF +#line 8551 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (); +int +main (void) +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8570: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8573: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8576: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8579: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +echo "$as_me:8585: checking for dnet_ntoa in -ldnet" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 8593 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main (void) +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8612: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8615: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8618: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8621: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:8632: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + echo "$as_me:8639: checking for dnet_ntoa in -ldnet_stub" >&5 +echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6 +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 8647 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dnet_ntoa (); +int +main (void) +{ +dnet_ntoa (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8666: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8669: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8672: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8675: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:8686: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6 +if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + echo "$as_me:8705: checking for gethostbyname" >&5 +echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6 +if test "${ac_cv_func_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 8711 "configure" +#include "confdefs.h" +#define gethostbyname autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef gethostbyname + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_gethostbyname) || defined (__stub___gethostbyname) +#error found stub for gethostbyname +#endif + + return gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8742: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8745: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8748: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8751: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:8761: result: $ac_cv_func_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6 + + if test $ac_cv_func_gethostbyname = no; then + echo "$as_me:8765: checking for gethostbyname in -lnsl" >&5 +echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6 +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 8773 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main (void) +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8792: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8795: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8798: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8801: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_nsl_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_nsl_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:8812: result: $ac_cv_lib_nsl_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6 +if test $ac_cv_lib_nsl_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + echo "$as_me:8819: checking for gethostbyname in -lbsd" >&5 +echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6 +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 8827 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char gethostbyname (); +int +main (void) +{ +gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8846: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8849: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8852: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8855: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_bsd_gethostbyname=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_bsd_gethostbyname=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:8866: result: $ac_cv_lib_bsd_gethostbyname" >&5 +echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6 +if test $ac_cv_lib_bsd_gethostbyname = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the nameserver (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + echo "$as_me:8882: checking for connect" >&5 +echo $ECHO_N "checking for connect... $ECHO_C" >&6 +if test "${ac_cv_func_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 8888 "configure" +#include "confdefs.h" +#define connect autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef connect + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_connect) || defined (__stub___connect) +#error found stub for connect +#endif + + return connect (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8919: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8922: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8925: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8928: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_connect=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_connect=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:8938: result: $ac_cv_func_connect" >&5 +echo "${ECHO_T}$ac_cv_func_connect" >&6 + + if test $ac_cv_func_connect = no; then + echo "$as_me:8942: checking for connect in -lsocket" >&5 +echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6 +if test "${ac_cv_lib_socket_connect+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 8950 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char connect (); +int +main (void) +{ +connect (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:8969: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:8972: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:8975: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:8978: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_socket_connect=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_socket_connect=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:8989: result: $ac_cv_lib_socket_connect" >&5 +echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6 +if test $ac_cv_lib_socket_connect = yes; then + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + echo "$as_me:8998: checking for remove" >&5 +echo $ECHO_N "checking for remove... $ECHO_C" >&6 +if test "${ac_cv_func_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 9004 "configure" +#include "confdefs.h" +#define remove autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef remove + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_remove) || defined (__stub___remove) +#error found stub for remove +#endif + + return remove (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:9035: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9038: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:9041: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9044: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_remove=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_remove=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:9054: result: $ac_cv_func_remove" >&5 +echo "${ECHO_T}$ac_cv_func_remove" >&6 + + if test $ac_cv_func_remove = no; then + echo "$as_me:9058: checking for remove in -lposix" >&5 +echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6 +if test "${ac_cv_lib_posix_remove+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 9066 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char remove (); +int +main (void) +{ +remove (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:9085: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9088: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:9091: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9094: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_posix_remove=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_posix_remove=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:9105: result: $ac_cv_lib_posix_remove" >&5 +echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6 +if test $ac_cv_lib_posix_remove = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + echo "$as_me:9114: checking for shmat" >&5 +echo $ECHO_N "checking for shmat... $ECHO_C" >&6 +if test "${ac_cv_func_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 9120 "configure" +#include "confdefs.h" +#define shmat autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef shmat + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_shmat) || defined (__stub___shmat) +#error found stub for shmat +#endif + + return shmat (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:9151: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9154: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:9157: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9160: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_shmat=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_shmat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:9170: result: $ac_cv_func_shmat" >&5 +echo "${ECHO_T}$ac_cv_func_shmat" >&6 + + if test $ac_cv_func_shmat = no; then + echo "$as_me:9174: checking for shmat in -lipc" >&5 +echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6 +if test "${ac_cv_lib_ipc_shmat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 9182 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char shmat (); +int +main (void) +{ +shmat (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:9201: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9204: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:9207: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9210: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ipc_shmat=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_ipc_shmat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:9221: result: $ac_cv_lib_ipc_shmat" >&5 +echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6 +if test $ac_cv_lib_ipc_shmat = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + echo "$as_me:9239: checking for IceConnectionNumber in -lICE" >&5 +echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6 +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 9247 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char IceConnectionNumber (); +int +main (void) +{ +IceConnectionNumber (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:9266: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9269: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:9272: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9275: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_ICE_IceConnectionNumber=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:9286: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6 +if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + +echo "$as_me:9296: checking for sys/wait.h that is POSIX.1 compatible" >&5 +echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6 +if test "${ac_cv_header_sys_wait_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 9302 "configure" +#include "confdefs.h" +#include +#include +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +int +main (void) +{ + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:9324: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9327: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:9330: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9333: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_sys_wait_h=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_header_sys_wait_h=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:9343: result: $ac_cv_header_sys_wait_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6 +if test $ac_cv_header_sys_wait_h = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_SYS_WAIT_H 1 +EOF + +fi + +echo "$as_me:9353: checking for POSIX wait functions" >&5 +echo $ECHO_N "checking for POSIX wait functions... $ECHO_C" >&6 +if test "${cf_cv_posix_wait+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 9360 "configure" +#include "confdefs.h" + +#include +#include +#include +#ifdef HAVE_SYS_WAIT_H +#include +#endif + +int +main (void) +{ + + int stat_loc; + pid_t pid = waitpid(-1, &stat_loc, WNOHANG|WUNTRACED); + pid_t pid2 = wait(&stat_loc); + (void)pid; + (void)pid2; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:9385: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9388: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:9391: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9394: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_posix_wait=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_posix_wait=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:9405: result: $cf_cv_posix_wait" >&5 +echo "${ECHO_T}$cf_cv_posix_wait" >&6 +test "$cf_cv_posix_wait" = yes && +cat >>confdefs.h <<\EOF +#define USE_POSIX_WAIT 1 +EOF + +echo "$as_me:9412: checking if external sys_nerr is declared" >&5 +echo $ECHO_N "checking if external sys_nerr is declared... $ECHO_C" >&6 +if test "${cf_cv_dcl_sys_nerr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 9419 "configure" +#include "confdefs.h" + +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +int +main (void) +{ +int x = (int) sys_nerr; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:9437: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9440: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:9443: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9446: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_dcl_sys_nerr=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_dcl_sys_nerr=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:9457: result: $cf_cv_dcl_sys_nerr" >&5 +echo "${ECHO_T}$cf_cv_dcl_sys_nerr" >&6 + +if test "$cf_cv_dcl_sys_nerr" = no ; then + +cf_result=`echo "decl_sys_nerr" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking if external sys_nerr exists... $ECHO_C" >&6 +if test "${cf_cv_have_sys_nerr+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 9479 "configure" +#include "confdefs.h" + +#undef sys_nerr +extern int sys_nerr; + +int +main (void) +{ +sys_nerr = 2 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:9494: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9497: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:9500: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9503: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_sys_nerr=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_have_sys_nerr=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:9514: result: $cf_cv_have_sys_nerr" >&5 +echo "${ECHO_T}$cf_cv_have_sys_nerr" >&6 + +if test "$cf_cv_have_sys_nerr" = yes ; then + +cf_result=`echo "have_sys_nerr" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking if external sys_errlist is declared... $ECHO_C" >&6 +if test "${cf_cv_dcl_sys_errlist+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 9534 "configure" +#include "confdefs.h" + +#ifdef HAVE_STDLIB_H +#include +#endif +#include +#include +#include +int +main (void) +{ +int x = (int) sys_errlist; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:9552: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9555: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:9558: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9561: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_dcl_sys_errlist=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_dcl_sys_errlist=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:9572: result: $cf_cv_dcl_sys_errlist" >&5 +echo "${ECHO_T}$cf_cv_dcl_sys_errlist" >&6 + +if test "$cf_cv_dcl_sys_errlist" = no ; then + +cf_result=`echo "decl_sys_errlist" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking if external sys_errlist exists... $ECHO_C" >&6 +if test "${cf_cv_have_sys_errlist+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 9594 "configure" +#include "confdefs.h" + +#undef sys_errlist +extern int sys_errlist; + +int +main (void) +{ +sys_errlist = 2 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:9609: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9612: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:9615: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9618: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_have_sys_errlist=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_have_sys_errlist=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:9629: result: $cf_cv_have_sys_errlist" >&5 +echo "${ECHO_T}$cf_cv_have_sys_errlist" >&6 + +if test "$cf_cv_have_sys_errlist" = yes ; then + +cf_result=`echo "have_sys_errlist" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 9671 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:9675: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:9681: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:9700: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if we should define SYSV... $ECHO_C" >&6 +if test "${cf_cv_sysv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 9717 "configure" +#include "confdefs.h" + +#undef SYSV +#define SYSV 1 /* get Xos.h to declare sys_errlist[] */ +#ifdef HAVE_STDLIB_H +#include /* look for wchar_t */ +#endif +#ifdef HAVE_X11_INTRINSIC_H +#include /* Intrinsic.h has other traps... */ +#endif +#ifdef HAVE_TERMIOS_H /* needed for HPUX 10.20 */ +#include +#define STRUCT_TERMIOS struct termios +#else +#define STRUCT_TERMIOS struct termio +#endif +#include +#include /* eliminate most BSD hacks */ +#include /* declare sys_errlist on older systems */ +#include /* eliminate most of the remaining ones */ + +int +main (void) +{ + +static STRUCT_TERMIOS d_tio; + d_tio.c_cc[VINTR] = 0; + d_tio.c_cc[VQUIT] = 0; + d_tio.c_cc[VERASE] = 0; + d_tio.c_cc[VKILL] = 0; + d_tio.c_cc[VEOF] = 0; + d_tio.c_cc[VEOL] = 0; + d_tio.c_cc[VMIN] = 0; + d_tio.c_cc[VTIME] = 0; +#if defined(HAVE_SYS_ERRLIST) && !defined(DECL_SYS_ERRLIST) +sys_errlist[0] = ""; /* Cygwin mis-declares this */ +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:9761: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9764: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:9767: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9770: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_sysv=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_sysv=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:9781: result: $cf_cv_sysv" >&5 +echo "${ECHO_T}$cf_cv_sysv" >&6 +test "$cf_cv_sysv" = yes && +cat >>confdefs.h <<\EOF +#define SYSV 1 +EOF + +LIBS="$cf_save_LIBS_CF_SYSV" +CFLAGS="$cf_save_CFLAGS_CF_SYSV" +CPPFLAGS="$cf_save_CPPFLAGS_CF_SYSV" + +echo "$as_me:9792: checking for elf_begin in -lelf" >&5 +echo $ECHO_N "checking for elf_begin in -lelf... $ECHO_C" >&6 +if test "${ac_cv_lib_elf_elf_begin+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lelf $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 9800 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char elf_begin (); +int +main (void) +{ +elf_begin (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:9819: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:9822: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:9825: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9828: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_elf_elf_begin=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_elf_elf_begin=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:9839: result: $ac_cv_lib_elf_elf_begin" >&5 +echo "${ECHO_T}$ac_cv_lib_elf_elf_begin" >&6 +if test $ac_cv_lib_elf_elf_begin = yes; then + +echo "$as_me:9843: checking if this is an SVR4 system" >&5 +echo $ECHO_N "checking if this is an SVR4 system... $ECHO_C" >&6 +if test "${cf_cv_svr4+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 9850 "configure" +#include "confdefs.h" + +#if defined(__CYGWIN__) +make an error +#endif +#include +#include + +int +main (void) +{ + +static struct termio d_tio; + d_tio.c_cc[VINTR] = 0; + d_tio.c_cc[VQUIT] = 0; + d_tio.c_cc[VERASE] = 0; + d_tio.c_cc[VKILL] = 0; + d_tio.c_cc[VEOF] = 0; + d_tio.c_cc[VEOL] = 0; + d_tio.c_cc[VMIN] = 0; + d_tio.c_cc[VTIME] = 0; + d_tio.c_cc[VLNEXT] = 0; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:9879: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:9882: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:9885: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:9888: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_svr4=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_svr4=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:9899: result: $cf_cv_svr4" >&5 +echo "${ECHO_T}$cf_cv_svr4" >&6 + +fi + +test "$cf_cv_svr4" = yes && +cat >>confdefs.h <<\EOF +#define SVR4 1 +EOF + +echo "$as_me:9909: checking if you want to use pkg-config" >&5 +echo $ECHO_N "checking if you want to use pkg-config... $ECHO_C" >&6 + +# Check whether --with-pkg-config or --without-pkg-config was given. +if test "${with_pkg_config+set}" = set; then + withval="$with_pkg_config" + cf_pkg_config=$withval +else + cf_pkg_config=yes +fi; +echo "$as_me:9919: result: $cf_pkg_config" >&5 +echo "${ECHO_T}$cf_pkg_config" >&6 + +case $cf_pkg_config in +(no) + PKG_CONFIG=none + ;; +(yes) + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +echo "$as_me:9931: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word" + echo "$as_me:9948: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG + +if test -n "$PKG_CONFIG"; then + echo "$as_me:9959: result: $PKG_CONFIG" >&5 +echo "${ECHO_T}$PKG_CONFIG" >&6 +else + echo "$as_me:9962: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +echo "$as_me:9971: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_ac_pt_PKG_CONFIG="$ac_dir/$ac_word" + echo "$as_me:9988: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_ac_pt_PKG_CONFIG" && ac_cv_path_ac_pt_PKG_CONFIG="none" + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG + +if test -n "$ac_pt_PKG_CONFIG"; then + echo "$as_me:10000: result: $ac_pt_PKG_CONFIG" >&5 +echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6 +else + echo "$as_me:10003: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + PKG_CONFIG=$ac_pt_PKG_CONFIG +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + + ;; +(*) + PKG_CONFIG=$withval + ;; +esac + +test -z "$PKG_CONFIG" && PKG_CONFIG=none +if test "$PKG_CONFIG" != none ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case ".$PKG_CONFIG" in +(.\$\(*\)*|.\'*\'*) + ;; +(..|./*|.\\*) + ;; +(.[a-zA-Z]:[\\/]*) # OS/2 EMX + ;; +(.\${*prefix}*|.\${*dir}*) + eval PKG_CONFIG="$PKG_CONFIG" + case ".$PKG_CONFIG" in + (.NONE/*) + PKG_CONFIG=`echo $PKG_CONFIG | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(.no|.NONE/*) + PKG_CONFIG=`echo $PKG_CONFIG | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + { { echo "$as_me:10046: error: expected a pathname, not \"$PKG_CONFIG\"" >&5 +echo "$as_me: error: expected a pathname, not \"$PKG_CONFIG\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + +elif test "x$cf_pkg_config" != xno ; then + { echo "$as_me:10053: WARNING: pkg-config is not installed" >&5 +echo "$as_me: WARNING: pkg-config is not installed" >&2;} +fi + +# OSX is schizoid about who owns /usr/X11 (old) versus /opt/X11 (new) (and +# in some cases has installed dummy files in the former, other cases replaced +# it with a link to the new location). This complicates the configure script. +# Check for that pitfall, and recover using pkg-config +# +# If none of these are set, the configuration is almost certainly broken. +if test -z "${X_CFLAGS}${X_PRE_LIBS}${X_LIBS}${X_EXTRA_LIBS}" +then + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists x11; then + test -n "$verbose" && echo " found package x11" 1>&6 + +echo "${as_me:-configure}:10069: testing found package x11 ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags x11 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs x11 2>/dev/null`" + test -n "$verbose" && echo " package x11 CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:10075: testing package x11 CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package x11 LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:10079: testing package x11 LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:10199: WARNING: unable to find X11 library" >&5 +echo "$as_me: WARNING: unable to find X11 library" >&2;} +fi + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists ice; then + test -n "$verbose" && echo " found package ice" 1>&6 + +echo "${as_me:-configure}:10206: testing found package ice ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags ice 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs ice 2>/dev/null`" + test -n "$verbose" && echo " package ice CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:10212: testing package ice CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package ice LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:10216: testing package ice LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:10336: WARNING: unable to find ICE library" >&5 +echo "$as_me: WARNING: unable to find ICE library" >&2;} +fi + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists sm; then + test -n "$verbose" && echo " found package sm" 1>&6 + +echo "${as_me:-configure}:10343: testing found package sm ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags sm 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs sm 2>/dev/null`" + test -n "$verbose" && echo " package sm CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:10349: testing package sm CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package sm LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:10353: testing package sm LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:10473: WARNING: unable to find SM library" >&5 +echo "$as_me: WARNING: unable to find SM library" >&2;} +fi + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists xt; then + test -n "$verbose" && echo " found package xt" 1>&6 + +echo "${as_me:-configure}:10480: testing found package xt ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags xt 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs xt 2>/dev/null`" + test -n "$verbose" && echo " package xt CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:10486: testing package xt CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package xt LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:10490: testing package xt LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:10610: WARNING: unable to find Xt library" >&5 +echo "$as_me: WARNING: unable to find Xt library" >&2;} +fi + +else + LIBS="$X_PRE_LIBS $LIBS $X_EXTRA_LIBS" +fi + +cf_have_X_LIBS=no + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists xt; then + test -n "$verbose" && echo " found package xt" 1>&6 + +echo "${as_me:-configure}:10623: testing found package xt ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags xt 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs xt 2>/dev/null`" + test -n "$verbose" && echo " package xt CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:10629: testing package xt CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package xt LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:10633: testing package xt LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + case "x$LIBS" in + (*-lX11*) + ;; + (*) +# we have an "xt" package, but it may omit Xt's dependency on X11 +echo "$as_me:10754: checking for usable X dependency" >&5 +echo $ECHO_N "checking for usable X dependency... $ECHO_C" >&6 +if test "${cf_cv_xt_x11_compat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 10761 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + int rc1 = XDrawLine((Display*) 0, (Drawable) 0, (GC) 0, 0, 0, 0, 0); + int rc2 = XClearWindow((Display*) 0, (Window) 0); + int rc3 = XMoveWindow((Display*) 0, (Window) 0, 0, 0); + int rc4 = XMoveResizeWindow((Display*)0, (Window)0, 0, 0, 0, 0); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:10780: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10783: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:10786: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10789: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xt_x11_compat=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xt_x11_compat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:10799: result: $cf_cv_xt_x11_compat" >&5 +echo "${ECHO_T}$cf_cv_xt_x11_compat" >&6 + if test "$cf_cv_xt_x11_compat" = no + then + test -n "$verbose" && echo " work around broken X11 dependency" 1>&6 + +echo "${as_me:-configure}:10805: testing work around broken X11 dependency ..." 1>&5 + + # 2010/11/19 - good enough until a working Xt on Xcb is delivered. + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists x11; then + test -n "$verbose" && echo " found package x11" 1>&6 + +echo "${as_me:-configure}:10812: testing found package x11 ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags x11 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs x11 2>/dev/null`" + test -n "$verbose" && echo " package x11 CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:10818: testing package x11 CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package x11 LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:10822: testing package x11 LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:10945: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%-lXt %-lXt -lX11 %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:10950: testing ...after $LIBS ..." 1>&5 + +fi + + fi + ;; + esac + +echo "$as_me:10958: checking for usable X Toolkit package" >&5 +echo $ECHO_N "checking for usable X Toolkit package... $ECHO_C" >&6 +if test "${cf_cv_xt_ice_compat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 10965 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ +int num = IceConnectionNumber(0); (void) num + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:10980: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:10983: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:10986: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:10989: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xt_ice_compat=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xt_ice_compat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:10999: result: $cf_cv_xt_ice_compat" >&5 +echo "${ECHO_T}$cf_cv_xt_ice_compat" >&6 + + if test "$cf_cv_xt_ice_compat" = no + then + # workaround for broken ".pc" files used for X Toolkit. + case "x$X_PRE_LIBS" in + (*-lICE*) + case "x$LIBS" in + (*-lICE*) + ;; + (*) + test -n "$verbose" && echo " work around broken ICE dependency" 1>&6 + +echo "${as_me:-configure}:11013: testing work around broken ICE dependency ..." 1>&5 + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists ice; then + test -n "$verbose" && echo " found package ice" 1>&6 + +echo "${as_me:-configure}:11018: testing found package ice ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags ice 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs ice 2>/dev/null`" + test -n "$verbose" && echo " package ice CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:11024: testing package ice CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package ice LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:11028: testing package ice LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists sm; then + test -n "$verbose" && echo " found package sm" 1>&6 + +echo "${as_me:-configure}:11147: testing found package sm ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags sm 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs sm 2>/dev/null`" + test -n "$verbose" && echo " package sm CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:11153: testing package sm CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package sm LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:11157: testing package sm LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + : +fi + +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:11286: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%-lXt %-lXt $X_PRE_LIBS %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:11291: testing ...after $LIBS ..." 1>&5 + +fi + + ;; + esac + ;; + esac + fi + + cf_have_X_LIBS=yes + +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + + LDFLAGS="$X_LIBS $LDFLAGS" + +test -n "$verbose" && echo " checking additions to CFLAGS" 1>&6 + +echo "${as_me:-configure}:11311: testing checking additions to CFLAGS ..." 1>&5 + +cf_check_cflags="$CFLAGS" +cf_check_cppflags="$CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $X_CFLAGS +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6 + +echo "${as_me:-configure}:11396: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6 + +echo "${as_me:-configure}:11406: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5 + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6 + +echo "${as_me:-configure}:11416: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5 + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +if test "x$cf_check_cflags" != "x$CFLAGS" ; then +cat >conftest.$ac_ext <<_ACEOF +#line 11425 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello world"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:11437: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11440: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:11443: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11446: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +test -n "$verbose" && echo " test-compile failed. Undoing change to \$CFLAGS" 1>&6 + +echo "${as_me:-configure}:11454: testing test-compile failed. Undoing change to \$CFLAGS ..." 1>&5 + + if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then + test -n "$verbose" && echo " but keeping change to \$CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:11459: testing but keeping change to \$CPPFLAGS ..." 1>&5 + + fi + CFLAGS="$cf_check_flags" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi + + echo "$as_me:11467: checking for XOpenDisplay" >&5 +echo $ECHO_N "checking for XOpenDisplay... $ECHO_C" >&6 +if test "${ac_cv_func_XOpenDisplay+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 11473 "configure" +#include "confdefs.h" +#define XOpenDisplay autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef XOpenDisplay + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_XOpenDisplay) || defined (__stub___XOpenDisplay) +#error found stub for XOpenDisplay +#endif + + return XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:11504: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11507: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:11510: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11513: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_XOpenDisplay=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_XOpenDisplay=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:11523: result: $ac_cv_func_XOpenDisplay" >&5 +echo "${ECHO_T}$ac_cv_func_XOpenDisplay" >&6 +if test $ac_cv_func_XOpenDisplay = yes; then + : +else + + echo "$as_me:11529: checking for XOpenDisplay in -lX11" >&5 +echo $ECHO_N "checking for XOpenDisplay in -lX11... $ECHO_C" >&6 +if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lX11 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 11537 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (); +int +main (void) +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:11556: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11559: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:11562: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11565: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_X11_XOpenDisplay=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_X11_XOpenDisplay=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:11576: result: $ac_cv_lib_X11_XOpenDisplay" >&5 +echo "${ECHO_T}$ac_cv_lib_X11_XOpenDisplay" >&6 +if test $ac_cv_lib_X11_XOpenDisplay = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lX11; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +fi + + echo "$as_me:11600: checking for XtAppInitialize" >&5 +echo $ECHO_N "checking for XtAppInitialize... $ECHO_C" >&6 +if test "${ac_cv_func_XtAppInitialize+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 11606 "configure" +#include "confdefs.h" +#define XtAppInitialize autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef XtAppInitialize + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XtAppInitialize (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_XtAppInitialize) || defined (__stub___XtAppInitialize) +#error found stub for XtAppInitialize +#endif + + return XtAppInitialize (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:11637: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11640: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:11643: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11646: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_XtAppInitialize=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_XtAppInitialize=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:11656: result: $ac_cv_func_XtAppInitialize" >&5 +echo "${ECHO_T}$ac_cv_func_XtAppInitialize" >&6 +if test $ac_cv_func_XtAppInitialize = yes; then + : +else + + echo "$as_me:11662: checking for XtAppInitialize in -lXt" >&5 +echo $ECHO_N "checking for XtAppInitialize in -lXt... $ECHO_C" >&6 +if test "${ac_cv_lib_Xt_XtAppInitialize+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXt $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 11670 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XtAppInitialize (); +int +main (void) +{ +XtAppInitialize (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:11689: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11692: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:11695: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11698: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xt_XtAppInitialize=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_Xt_XtAppInitialize=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:11709: result: $ac_cv_lib_Xt_XtAppInitialize" >&5 +echo "${ECHO_T}$ac_cv_lib_Xt_XtAppInitialize" >&6 +if test $ac_cv_lib_Xt_XtAppInitialize = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_LIBXT 1 +EOF + + cf_have_X_LIBS=Xt + LIBS="-lXt $LIBS" +fi + +fi + +fi + +if test $cf_have_X_LIBS = no ; then + { echo "$as_me:11726: WARNING: Unable to successfully link X Toolkit library (-lXt) with +test program. You will have to check and add the proper libraries by hand +to makefile." >&5 +echo "$as_me: WARNING: Unable to successfully link X Toolkit library (-lXt) with +test program. You will have to check and add the proper libraries by hand +to makefile." >&2;} +fi + +for ac_header in \ + X11/DECkeysym.h \ + X11/Sunkeysym.h \ + X11/XF86keysym.h \ + X11/XKBlib.h \ + X11/TranslateI.h \ + X11/Xpoll.h \ + X11/extensions/XKB.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:11745: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 11751 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:11755: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:11761: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:11780: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use the Xpm library for colored icon... $ECHO_C" >&6 + +# Check whether --with-xpm or --without-xpm was given. +if test "${with_xpm+set}" = set; then + withval="$with_xpm" + cf_Xpm_library="$withval" +else + cf_Xpm_library=yes +fi; +echo "$as_me:11805: result: $cf_Xpm_library" >&5 +echo "${ECHO_T}$cf_Xpm_library" >&6 + +if test "$cf_Xpm_library" != no ; then + if test "$cf_Xpm_library" != yes ; then + CPPFLAGS="$CPPFLAGS -I$withval/include" + LDFLAGS="$LDFLAGS -L$withval/lib" + fi + echo "$as_me:11813: checking for X11/xpm.h" >&5 +echo $ECHO_N "checking for X11/xpm.h... $ECHO_C" >&6 +if test "${ac_cv_header_X11_xpm_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 11819 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:11823: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:11829: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_X11_xpm_h=yes +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_header_X11_xpm_h=no +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:11848: result: $ac_cv_header_X11_xpm_h" >&5 +echo "${ECHO_T}$ac_cv_header_X11_xpm_h" >&6 +if test $ac_cv_header_X11_xpm_h = yes; then + + echo "$as_me:11852: checking for XpmCreatePixmapFromData in -lXpm" >&5 +echo $ECHO_N "checking for XpmCreatePixmapFromData in -lXpm... $ECHO_C" >&6 +if test "${ac_cv_lib_Xpm_XpmCreatePixmapFromData+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXpm -lX11 $X_LIBS $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 11860 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XpmCreatePixmapFromData (); +int +main (void) +{ +XpmCreatePixmapFromData (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:11879: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:11882: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:11885: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:11888: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xpm_XpmCreatePixmapFromData=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_Xpm_XpmCreatePixmapFromData=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:11899: result: $ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&5 +echo "${ECHO_T}$ac_cv_lib_Xpm_XpmCreatePixmapFromData" >&6 +if test $ac_cv_lib_Xpm_XpmCreatePixmapFromData = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_LIBXPM 1 +EOF + + ICON_SUFFIX=.xpm + LIBS="-lXpm $LIBS" +else + CPPFLAGS="${cf_save_cppflags}" LDFLAGS="${cf_save_ldflags}" +fi + +else + CPPFLAGS="${cf_save_cppflags}" LDFLAGS="${cf_save_ldflags}" +fi + +fi + +echo "$as_me:11919: checking if you want to use the Xinerama extension" >&5 +echo $ECHO_N "checking if you want to use the Xinerama extension... $ECHO_C" >&6 + +# Check whether --with-xinerama or --without-xinerama was given. +if test "${with_xinerama+set}" = set; then + withval="$with_xinerama" + cf_with_xinerama="$withval" +else + cf_with_xinerama=yes +fi; +echo "$as_me:11929: result: $cf_with_xinerama" >&5 +echo "${ECHO_T}$cf_with_xinerama" >&6 +if test "$cf_with_xinerama" = yes; then + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists xinerama; then + test -n "$verbose" && echo " found package xinerama" 1>&6 + +echo "${as_me:-configure}:11936: testing found package xinerama ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags xinerama 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs xinerama 2>/dev/null`" + test -n "$verbose" && echo " package xinerama CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:11942: testing package xinerama CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package xinerama LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:11946: testing package xinerama LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >>confdefs.h <<\EOF +#define HAVE_X11_EXTENSIONS_XINERAMA_H 1 +EOF + +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + + echo "$as_me:12070: checking for XineramaQueryScreens in -lXinerama" >&5 +echo $ECHO_N "checking for XineramaQueryScreens in -lXinerama... $ECHO_C" >&6 +if test "${ac_cv_lib_Xinerama_XineramaQueryScreens+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXinerama $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 12078 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XineramaQueryScreens (); +int +main (void) +{ +XineramaQueryScreens (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:12097: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12100: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:12103: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12106: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xinerama_XineramaQueryScreens=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_Xinerama_XineramaQueryScreens=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:12117: result: $ac_cv_lib_Xinerama_XineramaQueryScreens" >&5 +echo "${ECHO_T}$ac_cv_lib_Xinerama_XineramaQueryScreens" >&6 +if test $ac_cv_lib_Xinerama_XineramaQueryScreens = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lXinerama; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +for ac_header in \ + X11/extensions/Xinerama.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:12142: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 12148 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:12152: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:12158: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:12177: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to link with Xaw 3d library... $ECHO_C" >&6 +withval= + +# Check whether --with-Xaw3d or --without-Xaw3d was given. +if test "${with_Xaw3d+set}" = set; then + withval="$with_Xaw3d" + +fi; +if test "$withval" = yes ; then + cf_x_athena=Xaw3d + echo "$as_me:12206: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:12209: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:12213: checking if you want to link with Xaw 3d xft library" >&5 +echo $ECHO_N "checking if you want to link with Xaw 3d xft library... $ECHO_C" >&6 +withval= + +# Check whether --with-Xaw3dxft or --without-Xaw3dxft was given. +if test "${with_Xaw3dxft+set}" = set; then + withval="$with_Xaw3dxft" + +fi; +if test "$withval" = yes ; then + cf_x_athena=Xaw3dxft + echo "$as_me:12224: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:12227: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:12231: checking if you want to link with neXT Athena library" >&5 +echo $ECHO_N "checking if you want to link with neXT Athena library... $ECHO_C" >&6 +withval= + +# Check whether --with-neXtaw or --without-neXtaw was given. +if test "${with_neXtaw+set}" = set; then + withval="$with_neXtaw" + +fi; +if test "$withval" = yes ; then + cf_x_athena=neXtaw + echo "$as_me:12242: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:12245: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +echo "$as_me:12249: checking if you want to link with Athena-Plus library" >&5 +echo $ECHO_N "checking if you want to link with Athena-Plus library... $ECHO_C" >&6 +withval= + +# Check whether --with-XawPlus or --without-XawPlus was given. +if test "${with_XawPlus+set}" = set; then + withval="$with_XawPlus" + +fi; +if test "$withval" = yes ; then + cf_x_athena=XawPlus + echo "$as_me:12260: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me:12263: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +cf_x_athena_lib="" + +if test "$PKG_CONFIG" != none ; then + cf_athena_list= + test "$cf_x_athena" = Xaw && cf_athena_list="xaw8 xaw7 xaw6" + for cf_athena_pkg in \ + $cf_athena_list \ + ${cf_x_athena} \ + ${cf_x_athena}-devel \ + lib${cf_x_athena} \ + lib${cf_x_athena}-devel + do + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists $cf_athena_pkg; then + test -n "$verbose" && echo " found package $cf_athena_pkg" 1>&6 + +echo "${as_me:-configure}:12283: testing found package $cf_athena_pkg ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags $cf_athena_pkg 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs $cf_athena_pkg 2>/dev/null`" + test -n "$verbose" && echo " package $cf_athena_pkg CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:12289: testing package $cf_athena_pkg CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package $cf_athena_pkg LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:12293: testing package $cf_athena_pkg LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cf_x_athena_lib="$cf_pkgconfig_libs" + +cf_x_athena_LIBS=`echo "HAVE_LIB_$cf_x_athena" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&6 + +echo "${as_me:-configure}:12424: testing ..trimmed $LIBS ..." 1>&5 + + ;; + esac + done + +echo "$as_me:12430: checking for usable $cf_x_athena/Xmu package" >&5 +echo $ECHO_N "checking for usable $cf_x_athena/Xmu package... $ECHO_C" >&6 +if test "${cf_cv_xaw_compat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 12437 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + +int check = XmuCompareISOLatin1("big", "small"); +(void)check; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:12454: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12457: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:12460: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12463: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xaw_compat=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xaw_compat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:12473: result: $cf_cv_xaw_compat" >&5 +echo "${ECHO_T}$cf_cv_xaw_compat" >&6 + + if test "$cf_cv_xaw_compat" = no + then + # workaround for broken ".pc" files... + case "$cf_x_athena_lib" in + (*-lXmu*) + ;; + (*) + test -n "$verbose" && echo " work around broken package" 1>&6 + +echo "${as_me:-configure}:12485: testing work around broken package ..." 1>&5 + + cf_save_xmu="$LIBS" + cf_first_lib=`echo "$cf_save_xmu" | sed -e 's/^ *//' -e 's/ .*//'` + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists xmu; then + test -n "$verbose" && echo " found package xmu" 1>&6 + +echo "${as_me:-configure}:12493: testing found package xmu ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags xmu 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs xmu 2>/dev/null`" + test -n "$verbose" && echo " package xmu CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:12499: testing package xmu CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package xmu LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:12503: testing package xmu LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + LIBS="$cf_save_xmu" + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:12623: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%$cf_first_lib %$cf_first_lib $cf_pkgconfig_libs %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:12628: testing ...after $LIBS ..." 1>&5 + +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:12636: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%$cf_first_lib %$cf_first_lib -lXmu %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:12641: testing ...after $LIBS ..." 1>&5 + +fi + + for cf_trim_lib in Xmu Xt X11 + do + case "$LIBS" in + (*-l$cf_trim_lib\ *-l$cf_trim_lib*) + LIBS=`echo "$LIBS " | sed -e 's/ / /g' -e 's%-l'"$cf_trim_lib"' %%' -e 's/ $//'` + test -n "$verbose" && echo " ..trimmed $LIBS" 1>&6 + +echo "${as_me:-configure}:12652: testing ..trimmed $LIBS ..." 1>&5 + + ;; + esac + done + + ;; + esac + fi + + break +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + : +fi + + done +fi + +if test -z "$cf_x_athena_lib" ; then + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists Xext; then + test -n "$verbose" && echo " found package Xext" 1>&6 + +echo "${as_me:-configure}:12677: testing found package Xext ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags Xext 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs Xext 2>/dev/null`" + test -n "$verbose" && echo " package Xext CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:12683: testing package Xext CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package Xext LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:12687: testing package Xext LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + + echo "$as_me:12808: checking for XextCreateExtension in -lXext" >&5 +echo $ECHO_N "checking for XextCreateExtension in -lXext... $ECHO_C" >&6 +if test "${ac_cv_lib_Xext_XextCreateExtension+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXext $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 12816 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XextCreateExtension (); +int +main (void) +{ +XextCreateExtension (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:12835: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:12838: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:12841: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:12844: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xext_XextCreateExtension=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_Xext_XextCreateExtension=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:12855: result: $ac_cv_lib_Xext_XextCreateExtension" >&5 +echo "${ECHO_T}$ac_cv_lib_Xext_XextCreateExtension" >&6 +if test $ac_cv_lib_Xext_XextCreateExtension = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lXext; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +fi + +# OSX is schizoid about who owns /usr/X11 (old) versus /opt/X11 (new) (and +# in some cases has installed dummy files in the former, other cases replaced +# it with a link to the new location). This complicates the configure script. +# Check for that pitfall, and recover using pkg-config +# +# If none of these are set, the configuration is almost certainly broken. +if test -z "${X_CFLAGS}${X_PRE_LIBS}${X_LIBS}${X_EXTRA_LIBS}" +then + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists x11; then + test -n "$verbose" && echo " found package x11" 1>&6 + +echo "${as_me:-configure}:12891: testing found package x11 ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags x11 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs x11 2>/dev/null`" + test -n "$verbose" && echo " package x11 CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:12897: testing package x11 CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package x11 LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:12901: testing package x11 LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:13021: WARNING: unable to find X11 library" >&5 +echo "$as_me: WARNING: unable to find X11 library" >&2;} +fi + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists ice; then + test -n "$verbose" && echo " found package ice" 1>&6 + +echo "${as_me:-configure}:13028: testing found package ice ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags ice 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs ice 2>/dev/null`" + test -n "$verbose" && echo " package ice CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:13034: testing package ice CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package ice LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:13038: testing package ice LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:13158: WARNING: unable to find ICE library" >&5 +echo "$as_me: WARNING: unable to find ICE library" >&2;} +fi + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists sm; then + test -n "$verbose" && echo " found package sm" 1>&6 + +echo "${as_me:-configure}:13165: testing found package sm ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags sm 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs sm 2>/dev/null`" + test -n "$verbose" && echo " package sm CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:13171: testing package sm CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package sm LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:13175: testing package sm LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:13295: WARNING: unable to find SM library" >&5 +echo "$as_me: WARNING: unable to find SM library" >&2;} +fi + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists xt; then + test -n "$verbose" && echo " found package xt" 1>&6 + +echo "${as_me:-configure}:13302: testing found package xt ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags xt 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs xt 2>/dev/null`" + test -n "$verbose" && echo " package xt CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:13308: testing package xt CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package xt LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:13312: testing package xt LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + { echo "$as_me:13432: WARNING: unable to find Xt library" >&5 +echo "$as_me: WARNING: unable to find Xt library" >&2;} +fi + +else + LIBS="$X_PRE_LIBS $LIBS $X_EXTRA_LIBS" +fi + +cf_have_X_LIBS=no + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists xt; then + test -n "$verbose" && echo " found package xt" 1>&6 + +echo "${as_me:-configure}:13445: testing found package xt ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags xt 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs xt 2>/dev/null`" + test -n "$verbose" && echo " package xt CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:13451: testing package xt CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package xt LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:13455: testing package xt LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + case "x$LIBS" in + (*-lX11*) + ;; + (*) +# we have an "xt" package, but it may omit Xt's dependency on X11 +echo "$as_me:13576: checking for usable X dependency" >&5 +echo $ECHO_N "checking for usable X dependency... $ECHO_C" >&6 +if test "${cf_cv_xt_x11_compat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 13583 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + int rc1 = XDrawLine((Display*) 0, (Drawable) 0, (GC) 0, 0, 0, 0, 0); + int rc2 = XClearWindow((Display*) 0, (Window) 0); + int rc3 = XMoveWindow((Display*) 0, (Window) 0, 0, 0); + int rc4 = XMoveResizeWindow((Display*)0, (Window)0, 0, 0, 0, 0); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:13602: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13605: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:13608: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13611: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xt_x11_compat=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xt_x11_compat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:13621: result: $cf_cv_xt_x11_compat" >&5 +echo "${ECHO_T}$cf_cv_xt_x11_compat" >&6 + if test "$cf_cv_xt_x11_compat" = no + then + test -n "$verbose" && echo " work around broken X11 dependency" 1>&6 + +echo "${as_me:-configure}:13627: testing work around broken X11 dependency ..." 1>&5 + + # 2010/11/19 - good enough until a working Xt on Xcb is delivered. + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists x11; then + test -n "$verbose" && echo " found package x11" 1>&6 + +echo "${as_me:-configure}:13634: testing found package x11 ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags x11 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs x11 2>/dev/null`" + test -n "$verbose" && echo " package x11 CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:13640: testing package x11 CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package x11 LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:13644: testing package x11 LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:13767: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%-lXt %-lXt -lX11 %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:13772: testing ...after $LIBS ..." 1>&5 + +fi + + fi + ;; + esac + +echo "$as_me:13780: checking for usable X Toolkit package" >&5 +echo $ECHO_N "checking for usable X Toolkit package... $ECHO_C" >&6 +if test "${cf_cv_xt_ice_compat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 13787 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ +int num = IceConnectionNumber(0); (void) num + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:13802: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:13805: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:13808: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:13811: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xt_ice_compat=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xt_ice_compat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:13821: result: $cf_cv_xt_ice_compat" >&5 +echo "${ECHO_T}$cf_cv_xt_ice_compat" >&6 + + if test "$cf_cv_xt_ice_compat" = no + then + # workaround for broken ".pc" files used for X Toolkit. + case "x$X_PRE_LIBS" in + (*-lICE*) + case "x$LIBS" in + (*-lICE*) + ;; + (*) + test -n "$verbose" && echo " work around broken ICE dependency" 1>&6 + +echo "${as_me:-configure}:13835: testing work around broken ICE dependency ..." 1>&5 + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists ice; then + test -n "$verbose" && echo " found package ice" 1>&6 + +echo "${as_me:-configure}:13840: testing found package ice ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags ice 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs ice 2>/dev/null`" + test -n "$verbose" && echo " package ice CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:13846: testing package ice CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package ice LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:13850: testing package ice LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists sm; then + test -n "$verbose" && echo " found package sm" 1>&6 + +echo "${as_me:-configure}:13969: testing found package sm ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags sm 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs sm 2>/dev/null`" + test -n "$verbose" && echo " package sm CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:13975: testing package sm CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package sm LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:13979: testing package sm LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + : +fi + +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:14108: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%-lXt %-lXt $X_PRE_LIBS %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:14113: testing ...after $LIBS ..." 1>&5 + +fi + + ;; + esac + ;; + esac + fi + + cf_have_X_LIBS=yes + +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + + LDFLAGS="$X_LIBS $LDFLAGS" + +test -n "$verbose" && echo " checking additions to CFLAGS" 1>&6 + +echo "${as_me:-configure}:14133: testing checking additions to CFLAGS ..." 1>&5 + +cf_check_cflags="$CFLAGS" +cf_check_cppflags="$CPPFLAGS" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $X_CFLAGS +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + test -n "$verbose" && echo " add to \$CFLAGS $cf_new_cflags" 1>&6 + +echo "${as_me:-configure}:14218: testing add to \$CFLAGS $cf_new_cflags ..." 1>&5 + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + test -n "$verbose" && echo " add to \$CPPFLAGS $cf_new_cppflags" 1>&6 + +echo "${as_me:-configure}:14228: testing add to \$CPPFLAGS $cf_new_cppflags ..." 1>&5 + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + test -n "$verbose" && echo " add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags" 1>&6 + +echo "${as_me:-configure}:14238: testing add to \$EXTRA_CPPFLAGS $cf_new_extra_cppflags ..." 1>&5 + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +if test "x$cf_check_cflags" != "x$CFLAGS" ; then +cat >conftest.$ac_ext <<_ACEOF +#line 14247 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello world"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:14259: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:14262: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:14265: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14268: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +test -n "$verbose" && echo " test-compile failed. Undoing change to \$CFLAGS" 1>&6 + +echo "${as_me:-configure}:14276: testing test-compile failed. Undoing change to \$CFLAGS ..." 1>&5 + + if test "x$cf_check_cppflags" != "x$CPPFLAGS" ; then + test -n "$verbose" && echo " but keeping change to \$CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:14281: testing but keeping change to \$CPPFLAGS ..." 1>&5 + + fi + CFLAGS="$cf_check_flags" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi + + echo "$as_me:14289: checking for XOpenDisplay" >&5 +echo $ECHO_N "checking for XOpenDisplay... $ECHO_C" >&6 +if test "${ac_cv_func_XOpenDisplay+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 14295 "configure" +#include "confdefs.h" +#define XOpenDisplay autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef XOpenDisplay + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_XOpenDisplay) || defined (__stub___XOpenDisplay) +#error found stub for XOpenDisplay +#endif + + return XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:14326: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:14329: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:14332: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14335: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_XOpenDisplay=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_XOpenDisplay=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:14345: result: $ac_cv_func_XOpenDisplay" >&5 +echo "${ECHO_T}$ac_cv_func_XOpenDisplay" >&6 +if test $ac_cv_func_XOpenDisplay = yes; then + : +else + + echo "$as_me:14351: checking for XOpenDisplay in -lX11" >&5 +echo $ECHO_N "checking for XOpenDisplay in -lX11... $ECHO_C" >&6 +if test "${ac_cv_lib_X11_XOpenDisplay+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lX11 $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 14359 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XOpenDisplay (); +int +main (void) +{ +XOpenDisplay (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:14378: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:14381: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:14384: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14387: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_X11_XOpenDisplay=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_X11_XOpenDisplay=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:14398: result: $ac_cv_lib_X11_XOpenDisplay" >&5 +echo "${ECHO_T}$ac_cv_lib_X11_XOpenDisplay" >&6 +if test $ac_cv_lib_X11_XOpenDisplay = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lX11; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +fi + + echo "$as_me:14422: checking for XtAppInitialize" >&5 +echo $ECHO_N "checking for XtAppInitialize... $ECHO_C" >&6 +if test "${ac_cv_func_XtAppInitialize+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 14428 "configure" +#include "confdefs.h" +#define XtAppInitialize autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef XtAppInitialize + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XtAppInitialize (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_XtAppInitialize) || defined (__stub___XtAppInitialize) +#error found stub for XtAppInitialize +#endif + + return XtAppInitialize (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:14459: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:14462: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:14465: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14468: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_XtAppInitialize=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_XtAppInitialize=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:14478: result: $ac_cv_func_XtAppInitialize" >&5 +echo "${ECHO_T}$ac_cv_func_XtAppInitialize" >&6 +if test $ac_cv_func_XtAppInitialize = yes; then + : +else + + echo "$as_me:14484: checking for XtAppInitialize in -lXt" >&5 +echo $ECHO_N "checking for XtAppInitialize in -lXt... $ECHO_C" >&6 +if test "${ac_cv_lib_Xt_XtAppInitialize+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXt $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 14492 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XtAppInitialize (); +int +main (void) +{ +XtAppInitialize (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:14511: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:14514: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:14517: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14520: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xt_XtAppInitialize=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_Xt_XtAppInitialize=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:14531: result: $ac_cv_lib_Xt_XtAppInitialize" >&5 +echo "${ECHO_T}$ac_cv_lib_Xt_XtAppInitialize" >&6 +if test $ac_cv_lib_Xt_XtAppInitialize = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_LIBXT 1 +EOF + + cf_have_X_LIBS=Xt + LIBS="-lXt $LIBS" +fi + +fi + +fi + +if test $cf_have_X_LIBS = no ; then + { echo "$as_me:14548: WARNING: Unable to successfully link X Toolkit library (-lXt) with +test program. You will have to check and add the proper libraries by hand +to makefile." >&5 +echo "$as_me: WARNING: Unable to successfully link X Toolkit library (-lXt) with +test program. You will have to check and add the proper libraries by hand +to makefile." >&2;} +fi + +cf_x_athena_root=$cf_x_athena +cf_x_athena_inc="" + +for cf_path in default \ + /usr/contrib/X11R6 \ + /usr/contrib/X11R5 \ + /usr/lib/X11R5 \ + /usr/local +do + if test -z "$cf_x_athena_inc" ; then + +cf_save_LIBS_CF_X_ATHENA_CPPFLAGS="$LIBS" +cf_save_CFLAGS_CF_X_ATHENA_CPPFLAGS="$CFLAGS" +cf_save_CPPFLAGS_CF_X_ATHENA_CPPFLAGS="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[IUD]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done + + cf_test=X11/$cf_x_athena_root/SimpleMenu.h + if test $cf_path != default ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_path/include" + + echo "$as_me:14589: checking for $cf_test in $cf_path" >&5 +echo $ECHO_N "checking for $cf_test in $cf_path... $ECHO_C" >&6 + else + echo "$as_me:14592: checking for $cf_test" >&5 +echo $ECHO_N "checking for $cf_test... $ECHO_C" >&6 + fi + cat >conftest.$ac_ext <<_ACEOF +#line 14596 "configure" +#include "confdefs.h" + +#include +#include <$cf_test> +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:14610: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14613: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:14616: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14619: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_result=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + echo "$as_me:14628: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + +LIBS="$cf_save_LIBS_CF_X_ATHENA_CPPFLAGS" +CFLAGS="$cf_save_CFLAGS_CF_X_ATHENA_CPPFLAGS" +CPPFLAGS="$cf_save_CPPFLAGS_CF_X_ATHENA_CPPFLAGS" + + if test "$cf_result" = yes ; then + test "$cf_path" = default && cf_x_athena_inc=default + test "$cf_path" != default && cf_x_athena_inc=$cf_path/include + break + fi + fi +done + +if test -z "$cf_x_athena_inc" ; then + { echo "$as_me:14644: WARNING: Unable to find Athena header files" >&5 +echo "$as_me: WARNING: Unable to find Athena header files" >&2;} +elif test "$cf_x_athena_inc" != default ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-I$cf_x_athena_inc" + +fi + +cf_x_athena_root=$cf_x_athena +cf_x_athena_lib="" + +for cf_path in default \ + /usr/contrib/X11R6 \ + /usr/contrib/X11R5 \ + /usr/lib/X11R5 \ + /usr/local +do + for cf_lib in \ + ${cf_x_athena_root} \ + ${cf_x_athena_root}7 \ + ${cf_x_athena_root}6 + do + for cf_libs in \ + "-l$cf_lib -lXmu" \ + "-l$cf_lib -lXpm -lXmu" \ + "-l${cf_lib}_s -lXmu_s" + do + test -n "$cf_x_athena_lib" && break + +cf_save_LIBS_CF_X_ATHENA_LIBS="$LIBS" +cf_save_CFLAGS_CF_X_ATHENA_LIBS="$CFLAGS" +cf_save_CPPFLAGS_CF_X_ATHENA_LIBS="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[IUD]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done + + cf_test=XawSimpleMenuAddGlobalActions + test "$cf_path" != default && cf_libs="-L$cf_path/lib $cf_libs" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + echo "$as_me:14709: checking for $cf_test in $cf_libs" >&5 +echo $ECHO_N "checking for $cf_test in $cf_libs... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line 14712 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ + +$cf_test((XtAppContext) 0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:14728: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:14731: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:14734: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14737: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_result=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_result=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + echo "$as_me:14746: result: $cf_result" >&5 +echo "${ECHO_T}$cf_result" >&6 + +LIBS="$cf_save_LIBS_CF_X_ATHENA_LIBS" +CFLAGS="$cf_save_CFLAGS_CF_X_ATHENA_LIBS" +CPPFLAGS="$cf_save_CPPFLAGS_CF_X_ATHENA_LIBS" + + if test "$cf_result" = yes ; then + cf_x_athena_lib="$cf_libs" + break + fi + done # cf_libs + test -n "$cf_x_athena_lib" && break + done # cf_lib +done + +if test -z "$cf_x_athena_lib" ; then + { { echo "$as_me:14763: error: Unable to successfully link Athena library (-l$cf_x_athena_root) with test program" >&5 +echo "$as_me: error: Unable to successfully link Athena library (-l$cf_x_athena_root) with test program" >&2;} + { (exit 1); exit 1; }; } +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_x_athena_lib; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +cf_x_athena_LIBS=`echo "HAVE_LIB_$cf_x_athena" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 14801 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:14805: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:14811: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:14830: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for declaration of fd_set... $ECHO_C" >&6 +if test "${cf_cv_type_fd_set+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +echo "${as_me:-configure}:14846: testing sys/types alone ..." 1>&5 + +cat >conftest.$ac_ext <<_ACEOF +#line 14849 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +fd_set x; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:14862: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14865: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:14868: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14871: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_type_fd_set=sys/types.h +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + +echo "${as_me:-configure}:14878: testing X11/Xpoll.h ..." 1>&5 + +cat >conftest.$ac_ext <<_ACEOF +#line 14881 "configure" +#include "confdefs.h" + +#ifdef HAVE_X11_XPOLL_H +#include +#endif +int +main (void) +{ +fd_set x; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:14896: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14899: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:14902: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14905: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_type_fd_set=X11/Xpoll.h +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + +echo "${as_me:-configure}:14912: testing sys/select.h ..." 1>&5 + +cat >conftest.$ac_ext <<_ACEOF +#line 14915 "configure" +#include "confdefs.h" + +#include +#include +int +main (void) +{ +fd_set x; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:14929: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14932: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:14935: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14938: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_type_fd_set=sys/select.h +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_type_fd_set=unknown +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:14952: result: $cf_cv_type_fd_set" >&5 +echo "${ECHO_T}$cf_cv_type_fd_set" >&6 +if test $cf_cv_type_fd_set = sys/select.h ; then + +cat >>confdefs.h <<\EOF +#define USE_SYS_SELECT_H 1 +EOF + +fi + +echo "$as_me:14962: checking for declaration of fd_mask" >&5 +echo $ECHO_N "checking for declaration of fd_mask... $ECHO_C" >&6 +if test "${cf_cv_type_fd_mask+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + if test x$cf_cv_type_fd_set = xX11/Xpoll.h ; then + cat >conftest.$ac_ext <<_ACEOF +#line 14970 "configure" +#include "confdefs.h" + +#include +int +main (void) +{ +fd_mask x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:14983: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:14986: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:14989: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:14992: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + +echo "${as_me:-configure}:14999: testing if we must define CSRG_BASED ..." 1>&5 + +# Xosdefs.h on Mac OS X may not define this (but it should). + cat >conftest.$ac_ext <<_ACEOF +#line 15003 "configure" +#include "confdefs.h" + +#define CSRG_BASED +#include +int +main (void) +{ +fd_mask x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:15017: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15020: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:15023: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15026: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_type_fd_mask=CSRG_BASED +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.$ac_objext conftest.$ac_ext + else + cf_cv_type_fd_mask=$cf_cv_type_fd_set + fi + +fi +echo "$as_me:15041: result: $cf_cv_type_fd_mask" >&5 +echo "${ECHO_T}$cf_cv_type_fd_mask" >&6 +if test x$cf_cv_type_fd_mask = xCSRG_BASED ; then + +cat >>confdefs.h <<\EOF +#define CSRG_BASED 1 +EOF + +fi + +echo "$as_me:15051: checking for IRIX 6.5 baud-rate redefinitions" >&5 +echo $ECHO_N "checking for IRIX 6.5 baud-rate redefinitions... $ECHO_C" >&6 +if test "${cf_cv_termio_c_ispeed+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 15058 "configure" +#include "confdefs.h" + +#include +#include +int +main (void) +{ + +struct termio foo; +foo.c_ispeed = B38400; +foo.c_ospeed = B9600; +(void)foo; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:15077: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15080: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:15083: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15086: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_termio_c_ispeed=yes + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_termio_c_ispeed=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:15098: result: $cf_cv_termio_c_ispeed" >&5 +echo "${ECHO_T}$cf_cv_termio_c_ispeed" >&6 +test "$cf_cv_termio_c_ispeed" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_TERMIO_C_ISPEED 1 +EOF + +echo "$as_me:15105: checking for termios type tcflag_t" >&5 +echo $ECHO_N "checking for termios type tcflag_t... $ECHO_C" >&6 +if test "${cf_cv_havetype_tcflag_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 15112 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + tcflag_t x = 0; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:15125: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15128: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:15131: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15134: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_havetype_tcflag_t=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_havetype_tcflag_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:15145: result: $cf_cv_havetype_tcflag_t" >&5 +echo "${ECHO_T}$cf_cv_havetype_tcflag_t" >&6 +test "$cf_cv_havetype_tcflag_t" = no && +cat >>confdefs.h <<\EOF +#define tcflag_t unsigned long +EOF + +echo "$as_me:15152: checking for termios type speed_t" >&5 +echo $ECHO_N "checking for termios type speed_t... $ECHO_C" >&6 +if test "${cf_cv_havetype_speed_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 15159 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + speed_t x = 0; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:15172: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15175: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:15178: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15181: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_havetype_speed_t=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_havetype_speed_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:15192: result: $cf_cv_havetype_speed_t" >&5 +echo "${ECHO_T}$cf_cv_havetype_speed_t" >&6 +test "$cf_cv_havetype_speed_t" = no && +cat >>confdefs.h <<\EOF +#define speed_t unsigned short +EOF + +echo "$as_me:15199: checking for termios type cc_t" >&5 +echo $ECHO_N "checking for termios type cc_t... $ECHO_C" >&6 +if test "${cf_cv_havetype_cc_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 15206 "configure" +#include "confdefs.h" +#include +int +main (void) +{ + + cc_t x = 0; (void)x + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:15219: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:15222: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:15225: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15228: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_havetype_cc_t=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_havetype_cc_t=no +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:15239: result: $cf_cv_havetype_cc_t" >&5 +echo "${ECHO_T}$cf_cv_havetype_cc_t" >&6 +test "$cf_cv_havetype_cc_t" = no && +cat >>confdefs.h <<\EOF +#define cc_t unsigned char +EOF + +# If we notice Xcursor, there is a workaround needed. +echo "$as_me:15247: checking for XcursorGetTheme in -lXcursor" >&5 +echo $ECHO_N "checking for XcursorGetTheme in -lXcursor... $ECHO_C" >&6 +if test "${ac_cv_lib_Xcursor_XcursorGetTheme+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXcursor $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 15255 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XcursorGetTheme (); +int +main (void) +{ +XcursorGetTheme (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:15274: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15277: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:15280: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15283: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xcursor_XcursorGetTheme=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_Xcursor_XcursorGetTheme=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:15294: result: $ac_cv_lib_Xcursor_XcursorGetTheme" >&5 +echo "${ECHO_T}$ac_cv_lib_Xcursor_XcursorGetTheme" >&6 +if test $ac_cv_lib_Xcursor_XcursorGetTheme = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_LIB_XCURSOR 1 +EOF + +fi + +LIBS="$LIBS $X_EXTRA_LIBS" + +for ac_header in \ +stropts.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:15311: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 15317 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:15321: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:15327: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:15346: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 15382 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:15413: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15416: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:15419: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15422: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:15432: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if grantpt really works... $ECHO_C" >&6 + cat >conftest.$ac_ext <<_ACEOF +#line 15447 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +#include +#include +#include + +#ifndef HAVE_POSIX_OPENPT +#undef posix_openpt +#define posix_openpt(mode) open("/dev/ptmx", mode) +#endif + +#ifdef HAVE_STROPTS_H +#include +#endif + +static void failed(int code) +{ + perror("conftest"); + exit(code); +} + +static void my_timeout(int sig) +{ + (void)sig; + exit(99); +} + +int +main (void) +{ + + int code = 0; + int rc; + int pty; + int tty; + char *slave; + struct termios tio; + + (void)tio; + signal(SIGALRM, my_timeout); + + if (alarm(2) == 9) + failed(9); + else if ((pty = posix_openpt(O_RDWR)) < 0) + failed(1); + else if ((rc = grantpt(pty)) < 0) + failed(2); + else if ((rc = unlockpt(pty)) < 0) + failed(3); + else if ((slave = ptsname(pty)) == 0) + failed(4); +#if (CONFTEST == 3) || defined(CONFTEST_isatty) + else if (!isatty(pty)) + failed(4); +#endif +#if CONFTEST >= 4 + else if ((rc = tcgetattr(pty, &tio)) < 0) + failed(20); + else if ((rc = tcsetattr(pty, TCSAFLUSH, &tio)) < 0) + failed(21); +#endif + /* BSD posix_openpt does not treat pty as a terminal until slave is opened. + * Linux does treat it that way. + */ + else if ((tty = open(slave, O_RDWR)) < 0) + failed(5); +#ifdef CONFTEST +#ifdef I_PUSH +#if (CONFTEST == 0) || defined(CONFTEST_ptem) + else if ((rc = ioctl(tty, I_PUSH, "ptem")) < 0) + failed(10); +#endif +#if (CONFTEST == 1) || defined(CONFTEST_ldterm) + else if ((rc = ioctl(tty, I_PUSH, "ldterm")) < 0) + failed(11); +#endif +#if (CONFTEST == 2) || defined(CONFTEST_ttcompat) + else if ((rc = ioctl(tty, I_PUSH, "ttcompat")) < 0) + failed(12); +#endif +#endif /* I_PUSH */ +#if CONFTEST >= 5 + else if ((rc = tcgetattr(tty, &tio)) < 0) + failed(30); + else if ((rc = tcsetattr(tty, TCSAFLUSH, &tio)) < 0) + failed(31); +#endif +#endif /* CONFTEST */ + + ${cf_cv_main_return:-return}(code); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:15548: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15551: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:15554: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15557: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + if test "$cross_compiling" = yes; then + ac_cv_func_grantpt=maybe +else + cat >conftest.$ac_ext <<_ACEOF +#line 15564 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +#include +#include +#include + +#ifndef HAVE_POSIX_OPENPT +#undef posix_openpt +#define posix_openpt(mode) open("/dev/ptmx", mode) +#endif + +#ifdef HAVE_STROPTS_H +#include +#endif + +static void failed(int code) +{ + perror("conftest"); + exit(code); +} + +static void my_timeout(int sig) +{ + (void)sig; + exit(99); +} + +int main(void) +{ + + int code = 0; + int rc; + int pty; + int tty; + char *slave; + struct termios tio; + + (void)tio; + signal(SIGALRM, my_timeout); + + if (alarm(2) == 9) + failed(9); + else if ((pty = posix_openpt(O_RDWR)) < 0) + failed(1); + else if ((rc = grantpt(pty)) < 0) + failed(2); + else if ((rc = unlockpt(pty)) < 0) + failed(3); + else if ((slave = ptsname(pty)) == 0) + failed(4); +#if (CONFTEST == 3) || defined(CONFTEST_isatty) + else if (!isatty(pty)) + failed(4); +#endif +#if CONFTEST >= 4 + else if ((rc = tcgetattr(pty, &tio)) < 0) + failed(20); + else if ((rc = tcsetattr(pty, TCSAFLUSH, &tio)) < 0) + failed(21); +#endif + /* BSD posix_openpt does not treat pty as a terminal until slave is opened. + * Linux does treat it that way. + */ + else if ((tty = open(slave, O_RDWR)) < 0) + failed(5); +#ifdef CONFTEST +#ifdef I_PUSH +#if (CONFTEST == 0) || defined(CONFTEST_ptem) + else if ((rc = ioctl(tty, I_PUSH, "ptem")) < 0) + failed(10); +#endif +#if (CONFTEST == 1) || defined(CONFTEST_ldterm) + else if ((rc = ioctl(tty, I_PUSH, "ldterm")) < 0) + failed(11); +#endif +#if (CONFTEST == 2) || defined(CONFTEST_ttcompat) + else if ((rc = ioctl(tty, I_PUSH, "ttcompat")) < 0) + failed(12); +#endif +#endif /* I_PUSH */ +#if CONFTEST >= 5 + else if ((rc = tcgetattr(tty, &tio)) < 0) + failed(30); + else if ((rc = tcsetattr(tty, TCSAFLUSH, &tio)) < 0) + failed(31); +#endif +#endif /* CONFTEST */ + + ${cf_cv_main_return:-return}(code); + +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:15663: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15666: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:15668: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15671: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_grantpt=no + +fi +rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_grantpt=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + echo "$as_me:15690: result: $ac_cv_func_grantpt" >&5 +echo "${ECHO_T}$ac_cv_func_grantpt" >&6 + + if test "x$ac_cv_func_grantpt" != "xno" ; then + + if test "x$ac_cv_func_grantpt" = "xyes" ; then + echo "$as_me:15696: checking for pty features" >&5 +echo $ECHO_N "checking for pty features... $ECHO_C" >&6 + if test "x$ac_cv_header_stropts_h" = xyes + then + cf_pty_this=0 + else + cf_pty_this=3 + fi + + cf_pty_defines= + while test $cf_pty_this != 6 + do + + cf_pty_feature= + cf_pty_next=`expr $cf_pty_this + 1` + +echo "${as_me:-configure}:15712: testing pty feature test $cf_pty_next:5 ..." 1>&5 + + if test "$cross_compiling" = yes; then + { { echo "$as_me:15715: error: cannot run test program while cross compiling" >&5 +echo "$as_me: error: cannot run test program while cross compiling" >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +#line 15720 "configure" +#include "confdefs.h" +#define CONFTEST $cf_pty_this +$cf_pty_defines + +#include +#include +#include +#include +#include +#include +#include + +#ifndef HAVE_POSIX_OPENPT +#undef posix_openpt +#define posix_openpt(mode) open("/dev/ptmx", mode) +#endif + +#ifdef HAVE_STROPTS_H +#include +#endif + +static void failed(int code) +{ + perror("conftest"); + exit(code); +} + +static void my_timeout(int sig) +{ + (void)sig; + exit(99); +} + +int main(void) +{ + + int code = 0; + int rc; + int pty; + int tty; + char *slave; + struct termios tio; + + (void)tio; + signal(SIGALRM, my_timeout); + + if (alarm(2) == 9) + failed(9); + else if ((pty = posix_openpt(O_RDWR)) < 0) + failed(1); + else if ((rc = grantpt(pty)) < 0) + failed(2); + else if ((rc = unlockpt(pty)) < 0) + failed(3); + else if ((slave = ptsname(pty)) == 0) + failed(4); +#if (CONFTEST == 3) || defined(CONFTEST_isatty) + else if (!isatty(pty)) + failed(4); +#endif +#if CONFTEST >= 4 + else if ((rc = tcgetattr(pty, &tio)) < 0) + failed(20); + else if ((rc = tcsetattr(pty, TCSAFLUSH, &tio)) < 0) + failed(21); +#endif + /* BSD posix_openpt does not treat pty as a terminal until slave is opened. + * Linux does treat it that way. + */ + else if ((tty = open(slave, O_RDWR)) < 0) + failed(5); +#ifdef CONFTEST +#ifdef I_PUSH +#if (CONFTEST == 0) || defined(CONFTEST_ptem) + else if ((rc = ioctl(tty, I_PUSH, "ptem")) < 0) + failed(10); +#endif +#if (CONFTEST == 1) || defined(CONFTEST_ldterm) + else if ((rc = ioctl(tty, I_PUSH, "ldterm")) < 0) + failed(11); +#endif +#if (CONFTEST == 2) || defined(CONFTEST_ttcompat) + else if ((rc = ioctl(tty, I_PUSH, "ttcompat")) < 0) + failed(12); +#endif +#endif /* I_PUSH */ +#if CONFTEST >= 5 + else if ((rc = tcgetattr(tty, &tio)) < 0) + failed(30); + else if ((rc = tcsetattr(tty, TCSAFLUSH, &tio)) < 0) + failed(31); +#endif +#endif /* CONFTEST */ + + ${cf_cv_main_return:-return}(code); + +} + +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:15821: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15824: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:15826: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15829: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + case $cf_pty_next in + (1) # - streams + cf_pty_feature=ptem + ;; + (2) # - streams + cf_pty_feature=ldterm + ;; + (3) # - streams + cf_pty_feature=ttcompat + ;; + (4) + cf_pty_feature=pty_isatty + ;; + (5) + cf_pty_feature=pty_tcsetattr + ;; + (6) + cf_pty_feature=tty_tcsetattr + ;; + esac + +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + + case $cf_pty_next in + (1|2|3) + +echo "${as_me:-configure}:15861: testing skipping remaining streams features $cf_pty_this..2 ..." 1>&5 + + cf_pty_next=3 + ;; + esac + +fi +rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + if test -n "$cf_pty_feature" + then + cf_pty_defines="$cf_pty_defines +#define CONFTEST_$cf_pty_feature 1 +" + cf_grantpt_opts="$cf_grantpt_opts $cf_pty_feature" + fi + + cf_pty_this=$cf_pty_next + done + echo "$as_me:15880: result: $cf_grantpt_opts" >&5 +echo "${ECHO_T}$cf_grantpt_opts" >&6 + cf_grantpt_opts=`echo "$cf_grantpt_opts" | sed -e 's/ isatty//'` + fi + fi +fi + +if test "x$cf_prefer_posix_openpt" = "xyes" && test "x$ac_cv_func_posix_openpt" = "xyes" ; then + test -n "$verbose" && echo " prefer posix_openpt over openpty" 1>&6 + +echo "${as_me:-configure}:15890: testing prefer posix_openpt over openpty ..." 1>&5 + +elif test "x$disable_openpty" != "xyes" || test -z "$cf_grantpt_opts" ; then + echo "$as_me:15893: checking for openpty in -lutil" >&5 +echo $ECHO_N "checking for openpty in -lutil... $ECHO_C" >&6 +if test "${ac_cv_lib_util_openpty+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lutil $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 15901 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char openpty (); +int +main (void) +{ +openpty (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:15920: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:15923: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:15926: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:15929: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_util_openpty=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_util_openpty=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:15940: result: $ac_cv_lib_util_openpty" >&5 +echo "${ECHO_T}$ac_cv_lib_util_openpty" >&6 +if test $ac_cv_lib_util_openpty = yes; then + cf_have_openpty=yes +else + cf_have_openpty=no +fi + + if test "$cf_have_openpty" = yes ; then + ac_cv_func_grantpt=no + LIBS="-lutil $LIBS" + +cat >>confdefs.h <<\EOF +#define HAVE_OPENPTY 1 +EOF + +for ac_header in \ + util.h \ + libutil.h \ + pty.h \ + +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:15963: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 15969 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:15973: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:15979: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:15998: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&6 + +echo "${as_me:-configure}:16015: testing will rely upon grantpt ..." 1>&5 + +cat >>confdefs.h <<\EOF +#define HAVE_WORKING_GRANTPT 1 +EOF + + for cf_feature in $cf_grantpt_opts + do + cf_feature=`echo "$cf_feature" | sed -e 's/ //g'` + +cf_FEATURE=`echo "$cf_feature" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + + cat >>confdefs.h <&6 + +echo "${as_me:-configure}:16036: testing will rely upon BSD-pseudoterminals ..." 1>&5 + +else + test -n "$verbose" && echo " will rely upon openpty" 1>&6 + +echo "${as_me:-configure}:16041: testing will rely upon openpty ..." 1>&5 + +fi + +echo "$as_me:16045: checking if we can use XkbQueryExtension" >&5 +echo $ECHO_N "checking if we can use XkbQueryExtension... $ECHO_C" >&6 +if test "${cf_cv_xkb_query_extension+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 16052 "configure" +#include "confdefs.h" + +#include +#include +#include + +int +main (void) +{ + + int xkbmajor = XkbMajorVersion; + int xkbminor = XkbMinorVersion; + int xkbopcode, xkbevent, xkberror; + + if (XkbLibraryVersion(&xkbmajor, &xkbminor) + && XkbQueryExtension((Display *)0, + &xkbopcode, + &xkbevent, + &xkberror, + &xkbmajor, + &xkbminor)) + return 0; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:16081: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:16084: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:16087: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16090: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cf_cv_xkb_query_extension=yes + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + +cf_cv_xkb_query_extension=no + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:16105: result: $cf_cv_xkb_query_extension" >&5 +echo "${ECHO_T}$cf_cv_xkb_query_extension" >&6 + +if test $cf_cv_xkb_query_extension = yes +then + +for ac_func in XkbQueryExtension +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:16114: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 16120 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:16151: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16154: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:16157: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16160: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:16170: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if we can use XkbKeycodeToKeysym... $ECHO_C" >&6 +if test "${cf_cv_xkb_keycode_to_keysym+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 16189 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ + + KeySym keysym = XkbKeycodeToKeysym((Display *)0, 0, 0, 0); + (void)keysym; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:16207: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:16210: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:16213: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16216: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +cf_cv_xkb_keycode_to_keysym=yes + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + +cf_cv_xkb_keycode_to_keysym=no + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:16231: result: $cf_cv_xkb_keycode_to_keysym" >&5 +echo "${ECHO_T}$cf_cv_xkb_keycode_to_keysym" >&6 + +if test $cf_cv_xkb_keycode_to_keysym = yes +then + +for ac_func in XkbKeycodeToKeysym +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:16240: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 16246 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:16277: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16280: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:16283: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16286: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:16296: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for XKB Bell extension... $ECHO_C" >&6 +if test "${cf_cv_xkb_bell_ext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 16331 "configure" +#include "confdefs.h" + +#include +#include /* has the prototype */ +#include /* has the XkbBI_xxx definitions */ + +int +main (void) +{ + + int x = (XkbBI_Info |XkbBI_MinorError |XkbBI_MajorError |XkbBI_TerminalBell |XkbBI_MarginBell); + Atom y = 0; + (void)x; + XkbBell((Display *)0, (Widget)0, 0, y); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:16352: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16355: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:16358: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16361: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xkb_bell_ext=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xkb_bell_ext=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:16372: result: $cf_cv_xkb_bell_ext" >&5 +echo "${ECHO_T}$cf_cv_xkb_bell_ext" >&6 +test "$cf_cv_xkb_bell_ext" = yes && +cat >>confdefs.h <<\EOF +#define HAVE_XKB_BELL_EXT 1 +EOF + +LIBS="$cf_save_LIBS_CF_XKB_BELL_EXT" +CFLAGS="$cf_save_CFLAGS_CF_XKB_BELL_EXT" +CPPFLAGS="$cf_save_CPPFLAGS_CF_XKB_BELL_EXT" + +for ac_func in Xutf8LookupString +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:16386: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 16392 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:16423: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:16426: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:16429: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:16432: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:16442: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want narrow prototypes for X libraries... $ECHO_C" >&6 + +case `$ac_config_guess` in +(*freebsd*|*gnu*|*irix5*|*irix6*|*linux-gnu*|*netbsd*|*openbsd*|*qnx*|*sco*|*sgi*) + cf_default_narrowproto=yes + ;; +(*) + cf_default_narrowproto=no + ;; +esac + +# Check whether --enable-narrowproto or --disable-narrowproto was given. +if test "${enable_narrowproto+set}" = set; then + enableval="$enable_narrowproto" + test "$enableval" != no && enableval=yes + if test "$enableval" != "$cf_default_narrowproto" ; then + enable_narrowproto=$enableval + else + enable_narrowproto=$cf_default_narrowproto + fi +else + enableval=$cf_default_narrowproto + enable_narrowproto=$cf_default_narrowproto + +fi; +echo "$as_me:16484: result: $enable_narrowproto" >&5 +echo "${ECHO_T}$enable_narrowproto" >&6 + +echo "$as_me:16487: checking if we should use imake to help" >&5 +echo $ECHO_N "checking if we should use imake to help... $ECHO_C" >&6 + +# Check whether --enable-imake or --disable-imake was given. +if test "${enable_imake+set}" = set; then + enableval="$enable_imake" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_imake=no + else + enable_imake=yes + fi +else + enableval=yes + enable_imake=yes + +fi; +echo "$as_me:16504: result: $enable_imake" >&5 +echo "${ECHO_T}$enable_imake" >&6 + +if test "$enable_imake" = yes ; then + +for ac_prog in xmkmf imake +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 "$as_me:16513: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_IMAKE+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $IMAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_IMAKE="$IMAKE" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_IMAKE="$ac_dir/$ac_word" + echo "$as_me:16530: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +IMAKE=$ac_cv_path_IMAKE + +if test -n "$IMAKE"; then + echo "$as_me:16541: result: $IMAKE" >&5 +echo "${ECHO_T}$IMAKE" >&6 +else + echo "$as_me:16544: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$IMAKE" && break +done + +if test -n "$IMAKE" ; then + +case $IMAKE in +(*/imake) + cf_imake_opts="-DUseInstalled=YES" + ;; +(*/util/xmkmf) + # A single parameter tells xmkmf where the config-files are: + cf_imake_opts="`echo $IMAKE|sed -e s,/config/util/xmkmf,,`" + ;; +(*) + cf_imake_opts= + ;; +esac + +# If it's installed properly, imake (or its wrapper, xmkmf) will point to the +# config directory. +if mkdir conftestdir; then + CDPATH=; export CDPATH + cf_makefile=`cd $srcdir;pwd`/Imakefile + cd conftestdir + + cat >fix_cflags.sed <<'CF_EOF' +s/\\//g +s/[ ][ ]*/ /g +s/"//g +:pack +s/\(=[^ ][^ ]*\) \([^-]\)/\1 \2/g +t pack +s/\(-D[a-zA-Z0-9_][a-zA-Z0-9_]*\)=\([^\'0-9 ][^ ]*\)/\1='\\"\2\\"'/g +s/^IMAKE[ ]/IMAKE_CFLAGS="/ +s/ / /g +s/$/"/ +CF_EOF + + cat >fix_lflags.sed <<'CF_EOF' +s/^IMAKE[ ]*/IMAKE_LOADFLAGS="/ +s/$/"/ +CF_EOF + + echo >./Imakefile + test -f $cf_makefile && cat $cf_makefile >>./Imakefile + + cat >> ./Imakefile <<'CF_EOF' +findstddefs: + @echo IMAKE ${ALLDEFINES} $(MAIN_DEFINES) $(VENDORMANDEFS) | sed -f fix_cflags.sed + @echo IMAKE ${EXTRA_LOAD_FLAGS} | sed -f fix_lflags.sed +CF_EOF + + if ( $IMAKE $cf_imake_opts 1>/dev/null 2>&5 && test -f Makefile) + then + test -n "$verbose" && echo " Using $IMAKE $cf_imake_opts" 1>&6 + +echo "${as_me:-configure}:16604: testing Using $IMAKE $cf_imake_opts ..." 1>&5 + + else + # sometimes imake doesn't have the config path compiled in. Find it. + cf_config= + for cf_libpath in $X_LIBS $LIBS ; do + case $cf_libpath in + (-L*) + cf_libpath=`echo .$cf_libpath | sed -e 's/^...//'` + cf_libpath=$cf_libpath/X11/config + if test -d $cf_libpath ; then + cf_config=$cf_libpath + break + fi + ;; + esac + done + if test -z "$cf_config" ; then + { echo "$as_me:16622: WARNING: Could not find imake config-directory" >&5 +echo "$as_me: WARNING: Could not find imake config-directory" >&2;} + else + cf_imake_opts="$cf_imake_opts -I$cf_config" + if ( $IMAKE -v $cf_imake_opts 2>&5) + then + test -n "$verbose" && echo " Using $IMAKE $cf_config" 1>&6 + +echo "${as_me:-configure}:16630: testing Using $IMAKE $cf_config ..." 1>&5 + + else + { echo "$as_me:16633: WARNING: Cannot run $IMAKE" >&5 +echo "$as_me: WARNING: Cannot run $IMAKE" >&2;} + fi + fi + fi + + # GNU make sometimes prints "make[1]: Entering...", which + # would confuse us. + eval `make findstddefs 2>/dev/null | grep -v make` + + cd .. + rm -rf conftestdir + + # We use ${ALLDEFINES} rather than ${STD_DEFINES} because the former + # declares XTFUNCPROTO there. However, some vendors (e.g., SGI) have + # modified it to support site.cf, adding a kludge for the /usr/include + # directory. Try to filter that out, otherwise gcc won't find its + # headers. + if test -n "$GCC" ; then + if test -n "$IMAKE_CFLAGS" ; then + cf_nostdinc="" + cf_std_incl="" + cf_cpp_opts="" + for cf_opt in $IMAKE_CFLAGS + do + case "$cf_opt" in + (-nostdinc) + cf_nostdinc="$cf_opt" + ;; + (-I/usr/include) + cf_std_incl="$cf_opt" + ;; + (*) + cf_cpp_opts="$cf_cpp_opts $cf_opt" + ;; + esac + done + if test -z "$cf_nostdinc" ; then + IMAKE_CFLAGS="$cf_cpp_opts $cf_std_incl" + elif test -z "$cf_std_incl" ; then + IMAKE_CFLAGS="$cf_cpp_opts $cf_nostdinc" + else + test -n "$verbose" && echo " suppressed \"$cf_nostdinc\" and \"$cf_std_incl\"" 1>&6 + +echo "${as_me:-configure}:16677: testing suppressed \"$cf_nostdinc\" and \"$cf_std_incl\" ..." 1>&5 + + IMAKE_CFLAGS="$cf_cpp_opts" + fi + fi + fi +fi + +# Some imake configurations define PROJECTROOT with an empty value. Remove +# the empty definition. +case $IMAKE_CFLAGS in +(*-DPROJECTROOT=/*) + ;; +(*) + IMAKE_CFLAGS=`echo "$IMAKE_CFLAGS" |sed -e "s,-DPROJECTROOT=[ ], ,"` + ;; +esac + +fi + +test -n "$verbose" && echo " IMAKE_CFLAGS $IMAKE_CFLAGS" 1>&6 + +echo "${as_me:-configure}:16699: testing IMAKE_CFLAGS $IMAKE_CFLAGS ..." 1>&5 + +test -n "$verbose" && echo " IMAKE_LOADFLAGS $IMAKE_LOADFLAGS" 1>&6 + +echo "${as_me:-configure}:16703: testing IMAKE_LOADFLAGS $IMAKE_LOADFLAGS ..." 1>&5 + +fi + +if test -n "$IMAKE" && test -n "$IMAKE_CFLAGS" ; then + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $IMAKE_CFLAGS +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +else + IMAKE_CFLAGS= + IMAKE_LOADFLAGS= + test -n "$verbose" && echo " make fallback definitions" 1>&6 + +echo "${as_me:-configure}:16812: testing make fallback definitions ..." 1>&5 + + # We prefer config.guess' values when we can get them, to avoid + # inconsistent results with uname (AIX for instance). However, + # config.guess is not always consistent either. + case $host_os in + (*[0-9].[0-9]*) + UNAME_RELEASE="$host_os" + ;; + (*) + UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown + ;; + esac + + case .$UNAME_RELEASE in + (*[0-9].[0-9]*) + OSMAJORVERSION=`echo "$UNAME_RELEASE" |sed -e 's/^[^0-9]*//' -e 's/\..*//'` + OSMINORVERSION=`echo "$UNAME_RELEASE" |sed -e 's/^[^0-9]*//' -e 's/^[^.]*\.//' -e 's/\..*//' -e 's/[^0-9].*//' ` + test -z "$OSMAJORVERSION" && OSMAJORVERSION=1 + test -z "$OSMINORVERSION" && OSMINORVERSION=0 + IMAKE_CFLAGS="-DOSMAJORVERSION=$OSMAJORVERSION -DOSMINORVERSION=$OSMINORVERSION $IMAKE_CFLAGS" + ;; + esac + + # FUNCPROTO is standard with X11R6, but XFree86 drops it, leaving some + # fallback/fragments for NeedPrototypes, etc. + IMAKE_CFLAGS="-DFUNCPROTO=15 $IMAKE_CFLAGS" + + # If this is not set properly, Xaw's scrollbars will not work + if test "$enable_narrowproto" = yes ; then + IMAKE_CFLAGS="-DNARROWPROTO=1 $IMAKE_CFLAGS" + fi + + # Other special definitions: + case $host_os in + (aix*) + # imake on AIX 5.1 defines AIXV3. really. + IMAKE_CFLAGS="-DAIXV3 -DAIXV4 $IMAKE_CFLAGS" + ;; + (irix[56].*) + # these are needed to make SIGWINCH work in xterm + IMAKE_CFLAGS="-DSYSV -DSVR4 $IMAKE_CFLAGS" + ;; + esac + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $IMAKE_CFLAGS +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +fi + +# Extract the first word of "groff", so it can be a program name with args. +set dummy groff; ac_word=$2 +echo "$as_me:16959: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_GROFF_PATH+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $GROFF_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_GROFF_PATH="$GROFF_PATH" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_GROFF_PATH="$ac_dir/$ac_word" + echo "$as_me:16976: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_GROFF_PATH" && ac_cv_path_GROFF_PATH="no" + ;; +esac +fi +GROFF_PATH=$ac_cv_path_GROFF_PATH + +if test -n "$GROFF_PATH"; then + echo "$as_me:16988: result: $GROFF_PATH" >&5 +echo "${ECHO_T}$GROFF_PATH" >&6 +else + echo "$as_me:16991: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +for ac_prog in nroff mandoc +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 "$as_me:16999: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_NROFF_PATH+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $NROFF_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_NROFF_PATH="$NROFF_PATH" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_NROFF_PATH="$ac_dir/$ac_word" + echo "$as_me:17016: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +NROFF_PATH=$ac_cv_path_NROFF_PATH + +if test -n "$NROFF_PATH"; then + echo "$as_me:17027: result: $NROFF_PATH" >&5 +echo "${ECHO_T}$NROFF_PATH" >&6 +else + echo "$as_me:17030: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$NROFF_PATH" && break +done +test -n "$NROFF_PATH" || NROFF_PATH="no" + +# Extract the first word of "tbl", so it can be a program name with args. +set dummy tbl; ac_word=$2 +echo "$as_me:17040: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_TBL_PATH+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $TBL_PATH in + [\\/]* | ?:[\\/]*) + ac_cv_path_TBL_PATH="$TBL_PATH" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_TBL_PATH="$ac_dir/$ac_word" + echo "$as_me:17057: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_TBL_PATH" && ac_cv_path_TBL_PATH="cat" + ;; +esac +fi +TBL_PATH=$ac_cv_path_TBL_PATH + +if test -n "$TBL_PATH"; then + echo "$as_me:17069: result: $TBL_PATH" >&5 +echo "${ECHO_T}$TBL_PATH" >&6 +else + echo "$as_me:17072: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test "x$GROFF_PATH" = xno +then + NROFF_NOTE= + GROFF_NOTE="#" +else + NROFF_NOTE="#" + GROFF_NOTE= +fi + +case "x${with_man2html}" in +(xno) + cf_man2html=no + ;; +(x|xyes) + # Extract the first word of "man2html", so it can be a program name with args. +set dummy man2html; ac_word=$2 +echo "$as_me:17092: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_cf_man2html+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $cf_man2html in + [\\/]* | ?:[\\/]*) + ac_cv_path_cf_man2html="$cf_man2html" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_cf_man2html="$ac_dir/$ac_word" + echo "$as_me:17109: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_cf_man2html" && ac_cv_path_cf_man2html="no" + ;; +esac +fi +cf_man2html=$ac_cv_path_cf_man2html + +if test -n "$cf_man2html"; then + echo "$as_me:17121: result: $cf_man2html" >&5 +echo "${ECHO_T}$cf_man2html" >&6 +else + echo "$as_me:17124: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + case "x$cf_man2html" in + (x/*) + echo "$as_me:17130: checking for the modified Earl Hood script" >&5 +echo $ECHO_N "checking for the modified Earl Hood script... $ECHO_C" >&6 + if ( $cf_man2html -help 2>&1 | grep 'Make an index of headers at the end' >/dev/null ) + then + cf_man2html_ok=yes + else + cf_man2html=no + cf_man2html_ok=no + fi + echo "$as_me:17139: result: $cf_man2html_ok" >&5 +echo "${ECHO_T}$cf_man2html_ok" >&6 + ;; + (*) + cf_man2html=no + ;; + esac +esac + +echo "$as_me:17148: checking for program to convert manpage to html" >&5 +echo $ECHO_N "checking for program to convert manpage to html... $ECHO_C" >&6 + +# Check whether --with-man2html or --without-man2html was given. +if test "${with_man2html+set}" = set; then + withval="$with_man2html" + cf_man2html=$withval +else + cf_man2html=$cf_man2html +fi; + +cf_with_groff=no + +case $cf_man2html in +(yes) + echo "$as_me:17163: result: man2html" >&5 +echo "${ECHO_T}man2html" >&6 + # Extract the first word of "man2html", so it can be a program name with args. +set dummy man2html; ac_word=$2 +echo "$as_me:17167: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_cf_man2html+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $cf_man2html in + [\\/]* | ?:[\\/]*) + ac_cv_path_cf_man2html="$cf_man2html" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_cf_man2html="$ac_dir/$ac_word" + echo "$as_me:17184: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_cf_man2html" && ac_cv_path_cf_man2html="no" + ;; +esac +fi +cf_man2html=$ac_cv_path_cf_man2html + +if test -n "$cf_man2html"; then + echo "$as_me:17196: result: $cf_man2html" >&5 +echo "${ECHO_T}$cf_man2html" >&6 +else + echo "$as_me:17199: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + ;; +(no|groff|*/groff*) + cf_with_groff=yes + cf_man2html=$GROFF_PATH + echo "$as_me:17207: result: $cf_man2html" >&5 +echo "${ECHO_T}$cf_man2html" >&6 + ;; +(*) + echo "$as_me:17211: result: $cf_man2html" >&5 +echo "${ECHO_T}$cf_man2html" >&6 + ;; +esac + +MAN2HTML_TEMP="man2html.tmp" + cat >$MAN2HTML_TEMP <>$MAN2HTML_TEMP <&5 +echo "$as_me: error: expected a pathname, not \"$cf_man2html\"" >&2;} + { (exit 1); exit 1; }; } + ;; +esac + + MAN2HTML_PATH="$cf_man2html" + echo "$as_me:17282: checking for $cf_man2html top/bottom margins" >&5 +echo $ECHO_N "checking for $cf_man2html top/bottom margins... $ECHO_C" >&6 + + # for this example, expect 3 lines of content, the remainder is head/foot + cat >conftest.in <conftest.out + + cf_man2html_1st=`fgrep -n MARKER conftest.out |sed -e 's/^[^0-9]*://' -e 's/:.*//'` + cf_man2html_top=`expr $cf_man2html_1st - 2` + cf_man2html_bot=`wc -l conftest.out |sed -e 's/[^0-9]//g'` + cf_man2html_bot=`expr $cf_man2html_bot - 2 - $cf_man2html_top` + cf_man2html_top_bot="-topm=$cf_man2html_top -botm=$cf_man2html_bot" + + echo "$as_me:17300: result: $cf_man2html_top_bot" >&5 +echo "${ECHO_T}$cf_man2html_top_bot" >&6 + + echo "$as_me:17303: checking for pagesize to use" >&5 +echo $ECHO_N "checking for pagesize to use... $ECHO_C" >&6 + for cf_block in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + do + cat >>conftest.in <conftest.out + cf_man2html_page=`fgrep -n HEAD1 conftest.out |sed -n '$p' |sed -e 's/^[^0-9]*://' -e 's/:.*//'` + test -z "$cf_man2html_page" && cf_man2html_page=99999 + test "$cf_man2html_page" -gt 100 && cf_man2html_page=99999 + + rm -rf conftest* + echo "$as_me:17328: result: $cf_man2html_page" >&5 +echo "${ECHO_T}$cf_man2html_page" >&6 + + cat >>$MAN2HTML_TEMP <&6 + +echo "${as_me:-configure}:17356: testing removing terminfo flags from IMAKE_CFLAGS ..." 1>&5 + + IMAKE_CFLAGS=`echo "$IMAKE_CFLAGS" | sed -e 's/-DUSE_TERMINFO[ ]*-DHAVE_TIGETSTR[ ]*//'` + test -n "$verbose" && echo " ...result $IMAKE_CFLAGS" 1>&6 + +echo "${as_me:-configure}:17361: testing ...result $IMAKE_CFLAGS ..." 1>&5 + + test -n "$verbose" && echo " removing terminfo flags from CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:17365: testing removing terminfo flags from CPPFLAGS ..." 1>&5 + + CPPFLAGS=`echo "$CPPFLAGS" | sed -e 's/-DUSE_TERMINFO[ ]*-DHAVE_TIGETSTR[ ]*//'` + test -n "$verbose" && echo " ...result $CPPFLAGS" 1>&6 + +echo "${as_me:-configure}:17370: testing ...result $CPPFLAGS ..." 1>&5 + + ;; + esac +fi + +echo "$as_me:17376: checking for default terminal-id" >&5 +echo $ECHO_N "checking for default terminal-id... $ECHO_C" >&6 + +# Check whether --with-terminal-id or --without-terminal-id was given. +if test "${with_terminal_id+set}" = set; then + withval="$with_terminal_id" + default_termid=$withval +else + default_termid=vt420 +fi; +echo "$as_me:17386: result: $default_termid" >&5 +echo "${ECHO_T}$default_termid" >&6 +case $default_termid in +(vt*) default_termid=`echo $default_termid | sed -e 's/^..//'` + ;; +esac + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for default terminal-type... $ECHO_C" >&6 + +# Check whether --with-terminal-type or --without-terminal-type was given. +if test "${with_terminal_type+set}" = set; then + withval="$with_terminal_type" + default_TERM=$withval +else + default_TERM=xterm +fi; +echo "$as_me:17407: result: $default_TERM" >&5 +echo "${ECHO_T}$default_TERM" >&6 + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if backarrow-key should be BS... $ECHO_C" >&6 + +# Check whether --enable-backarrow-key or --disable-backarrow-key was given. +if test "${enable_backarrow_key+set}" = set; then + enableval="$enable_backarrow_key" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + backarrow_is_bs=$enableval + else + backarrow_is_bs=yes + fi +else + enableval=yes + backarrow_is_bs=yes + +fi; + +echo "$as_me:17433: result: $backarrow_is_bs" >&5 +echo "${ECHO_T}$backarrow_is_bs" >&6 +case $backarrow_is_bs in +(yes) + backarrow_is_bs=true + ;; +(no) + backarrow_is_bs=false + ;; +esac +cf_xbool1=`echo "$backarrow_is_bs"|sed -e 's/^\(.\).*/\1/'` + +cf_xbool1=`echo "$cf_xbool1" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cf_xbool2=`echo "$backarrow_is_bs"|sed -e 's/^.//'` +backarrow_is_bs=${cf_xbool1}${cf_xbool2} + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if backarrow-key should be treated as erase... $ECHO_C" >&6 + +# Check whether --enable-backarrow-is-erase or --disable-backarrow-is-erase was given. +if test "${enable_backarrow_is_erase+set}" = set; then + enableval="$enable_backarrow_is_erase" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + backarrow_is_erase=$enableval + else + backarrow_is_erase=no + fi +else + enableval=no + backarrow_is_erase=no + +fi; + +echo "$as_me:17472: result: $backarrow_is_erase" >&5 +echo "${ECHO_T}$backarrow_is_erase" >&6 +case $backarrow_is_erase in +(yes) + backarrow_is_erase=true + ;; +(no) + backarrow_is_erase=false + ;; +esac +cf_xbool1=`echo "$backarrow_is_erase"|sed -e 's/^\(.\).*/\1/'` + +cf_xbool1=`echo "$cf_xbool1" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cf_xbool2=`echo "$backarrow_is_erase"|sed -e 's/^.//'` +backarrow_is_erase=${cf_xbool1}${cf_xbool2} + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for default backspace/DEL setting... $ECHO_C" >&6 + +# Check whether --enable-delete-is-del or --disable-delete-is-del was given. +if test "${enable_delete_is_del+set}" = set; then + enableval="$enable_delete_is_del" + delete_is_del=$enableval +else + delete_is_del=maybe +fi; + +echo "$as_me:17504: result: $delete_is_del" >&5 +echo "${ECHO_T}$delete_is_del" >&6 +case $delete_is_del in +(yes) + delete_is_del=true + ;; +(no) + delete_is_del=false + ;; +esac +cf_xbool1=`echo "$delete_is_del"|sed -e 's/^\(.\).*/\1/'` + +cf_xbool1=`echo "$cf_xbool1" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cf_xbool2=`echo "$delete_is_del"|sed -e 's/^.//'` +delete_is_del=${cf_xbool1}${cf_xbool2} + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for default pty initial erase setting... $ECHO_C" >&6 + +# Check whether --enable-pty-erase or --disable-pty-erase was given. +if test "${enable_pty_erase+set}" = set; then + enableval="$enable_pty_erase" + initial_erase=$enableval +else + initial_erase=False +fi; + +echo "$as_me:17536: result: $initial_erase" >&5 +echo "${ECHO_T}$initial_erase" >&6 +case $initial_erase in +(yes) + initial_erase=true + ;; +(no) + initial_erase=false + ;; +esac +cf_xbool1=`echo "$initial_erase"|sed -e 's/^\(.\).*/\1/'` + +cf_xbool1=`echo "$cf_xbool1" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cf_xbool2=`echo "$initial_erase"|sed -e 's/^.//'` +initial_erase=${cf_xbool1}${cf_xbool2} + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if alt should send ESC... $ECHO_C" >&6 + +# Check whether --enable-alt-sends-esc or --disable-alt-sends-esc was given. +if test "${enable_alt_sends_esc+set}" = set; then + enableval="$enable_alt_sends_esc" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + alt_sends_esc=$enableval + else + alt_sends_esc=no + fi +else + enableval=no + alt_sends_esc=no + +fi; + +echo "$as_me:17575: result: $alt_sends_esc" >&5 +echo "${ECHO_T}$alt_sends_esc" >&6 +case $alt_sends_esc in +(yes) + alt_sends_esc=true + ;; +(no) + alt_sends_esc=false + ;; +esac +cf_xbool1=`echo "$alt_sends_esc"|sed -e 's/^\(.\).*/\1/'` + +cf_xbool1=`echo "$cf_xbool1" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cf_xbool2=`echo "$alt_sends_esc"|sed -e 's/^.//'` +alt_sends_esc=${cf_xbool1}${cf_xbool2} + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if meta should send ESC... $ECHO_C" >&6 + +# Check whether --enable-meta-sends-esc or --disable-meta-sends-esc was given. +if test "${enable_meta_sends_esc+set}" = set; then + enableval="$enable_meta_sends_esc" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + meta_sends_esc=$enableval + else + meta_sends_esc=no + fi +else + enableval=no + meta_sends_esc=no + +fi; + +echo "$as_me:17614: result: $meta_sends_esc" >&5 +echo "${ECHO_T}$meta_sends_esc" >&6 +case $meta_sends_esc in +(yes) + meta_sends_esc=true + ;; +(no) + meta_sends_esc=false + ;; +esac +cf_xbool1=`echo "$meta_sends_esc"|sed -e 's/^\(.\).*/\1/'` + +cf_xbool1=`echo "$cf_xbool1" | sed y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%` + +cf_xbool2=`echo "$meta_sends_esc"|sed -e 's/^.//'` +meta_sends_esc=${cf_xbool1}${cf_xbool2} + +cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_cf_tic_prog+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$cf_tic_prog"; then + ac_cv_prog_cf_tic_prog="$cf_tic_prog" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_cf_tic_prog="yes" +echo "$as_me:17653: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_cf_tic_prog" && ac_cv_prog_cf_tic_prog="no" +fi +fi +cf_tic_prog=$ac_cv_prog_cf_tic_prog +if test -n "$cf_tic_prog"; then + echo "$as_me:17662: result: $cf_tic_prog" >&5 +echo "${ECHO_T}$cf_tic_prog" >&6 +else + echo "$as_me:17665: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test "$cf_tic_prog" = yes ; then + if test -n "$TERMINFO" + then + case "$TERMINFO" in + (/*) + test -d "$TERMINFO" || unset TERMINFO + ;; + (*) + unset TERMINFO + ;; + esac + fi + echo "$as_me:17681: checking for private terminfo-directory" >&5 +echo $ECHO_N "checking for private terminfo-directory... $ECHO_C" >&6 + +# Check whether --with-own-terminfo or --without-own-terminfo was given. +if test "${with_own_terminfo+set}" = set; then + withval="$with_own_terminfo" + TERMINFO_DIR=$withval +else + TERMINFO_DIR=${TERMINFO-none} +fi; + echo "$as_me:17691: result: $TERMINFO_DIR" >&5 +echo "${ECHO_T}$TERMINFO_DIR" >&6 + if test "$TERMINFO_DIR" = yes ; then + { echo "$as_me:17694: WARNING: no value given" >&5 +echo "$as_me: WARNING: no value given" >&2;} + elif test "$TERMINFO_DIR" != none ; then + if test -d $TERMINFO_DIR ; then + +cat >>confdefs.h <&5 +echo $ECHO_N "checking if \$TERMINFO should also be set... $ECHO_C" >&6 + +# Check whether --enable-env-terminfo or --disable-env-terminfo was given. +if test "${enable_env_terminfo+set}" = set; then + enableval="$enable_env_terminfo" + cf_env_terminfo=yes +else + cf_env_terminfo=no +fi; + echo "$as_me:17713: result: $cf_env_terminfo" >&5 +echo "${ECHO_T}$cf_env_terminfo" >&6 + test $cf_env_terminfo = yes && + +cat >>confdefs.h <<\EOF +#define OWN_TERMINFO_ENV 1 +EOF + + else + { echo "$as_me:17722: WARNING: not a directory" >&5 +echo "$as_me: WARNING: not a directory" >&2;} + fi + elif test "$prefix" != NONE ; then + TERMINFO_DIR='${prefix}/lib/terminfo' + elif test -d /usr/lib/terminfo ; then + TERMINFO_DIR=/usr/lib/terminfo + else + TERMINFO_DIR= + fi + SET_TERMINFO= + if test -n "$TERMINFO_DIR" ; then + TERMINFO_DIR='$(DESTDIR)'$TERMINFO_DIR + SET_TERMINFO='TERMINFO=$(TERMINFO_DIR)' + fi + no_ticprog= +else + no_ticprog="#" + TERMINFO_DIR= + SET_TERMINFO= +fi + +############################################################################### + +echo "$as_me:17746: checking if you want active-icons" >&5 +echo $ECHO_N "checking if you want active-icons... $ECHO_C" >&6 + +# Check whether --enable-active-icon or --disable-active-icon was given. +if test "${enable_active_icon+set}" = set; then + enableval="$enable_active_icon" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_active_icon=no + else + enable_active_icon=yes + fi +else + enableval=yes + enable_active_icon=yes + +fi; +echo "$as_me:17763: result: $enable_active_icon" >&5 +echo "${ECHO_T}$enable_active_icon" >&6 +if test "$enable_active_icon" = no ; then + +cat >>confdefs.h <<\EOF +#define NO_ACTIVE_ICON 1 +EOF + +fi + +echo "$as_me:17773: checking if you want ANSI color" >&5 +echo $ECHO_N "checking if you want ANSI color... $ECHO_C" >&6 + +# Check whether --enable-ansi-color or --disable-ansi-color was given. +if test "${enable_ansi_color+set}" = set; then + enableval="$enable_ansi_color" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_ansi_color=no + else + enable_ansi_color=yes + fi +else + enableval=yes + enable_ansi_color=yes + +fi; +echo "$as_me:17790: result: $enable_ansi_color" >&5 +echo "${ECHO_T}$enable_ansi_color" >&6 +test "$enable_ansi_color" = no && +cat >>confdefs.h <<\EOF +#define OPT_ISO_COLORS 0 +EOF + +if test "$enable_ansi_color" = yes ; then + + echo "$as_me:17799: checking if you want 16 colors like aixterm" >&5 +echo $ECHO_N "checking if you want 16 colors like aixterm... $ECHO_C" >&6 + +# Check whether --enable-16-color or --disable-16-color was given. +if test "${enable_16_color+set}" = set; then + enableval="$enable_16_color" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_16_color=no + else + enable_16_color=yes + fi +else + enableval=yes + enable_16_color=yes + +fi; + echo "$as_me:17816: result: $enable_16_color" >&5 +echo "${ECHO_T}$enable_16_color" >&6 + test "$enable_16_color" = no && +cat >>confdefs.h <<\EOF +#define OPT_AIX_COLORS 0 +EOF + + echo "$as_me:17823: checking if you want 256 colors" >&5 +echo $ECHO_N "checking if you want 256 colors... $ECHO_C" >&6 + +# Check whether --enable-256-color or --disable-256-color was given. +if test "${enable_256_color+set}" = set; then + enableval="$enable_256_color" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_256_color=no + else + enable_256_color=yes + fi +else + enableval=yes + enable_256_color=yes + +fi; + echo "$as_me:17840: result: $enable_256_color" >&5 +echo "${ECHO_T}$enable_256_color" >&6 + + if test "$enable_256_color" = yes ; then + + CHARPROC_DEPS="$CHARPROC_DEPS 256colres.h" + EXTRAHDRS="$EXTRAHDRS 256colres.h" + +cat >>confdefs.h <<\EOF +#define OPT_256_COLORS 1 +EOF + + echo "$as_me:17852: checking if you want direct-color support" >&5 +echo $ECHO_N "checking if you want direct-color support... $ECHO_C" >&6 + +# Check whether --enable-direct-color or --disable-direct-color was given. +if test "${enable_direct_color+set}" = set; then + enableval="$enable_direct_color" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_direct_color=no + else + enable_direct_color=yes + fi +else + enableval=yes + enable_direct_color=yes + +fi; + echo "$as_me:17869: result: $enable_direct_color" >&5 +echo "${ECHO_T}$enable_direct_color" >&6 + if test "$enable_direct_color" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_DIRECT_COLOR 1 +EOF + + fi + + else + + echo "$as_me:17881: checking if you want 88 colors" >&5 +echo $ECHO_N "checking if you want 88 colors... $ECHO_C" >&6 + +# Check whether --enable-88-color or --disable-88-color was given. +if test "${enable_88_color+set}" = set; then + enableval="$enable_88_color" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_88_color=no + else + enable_88_color=yes + fi +else + enableval=yes + enable_88_color=yes + +fi; + echo "$as_me:17898: result: $enable_88_color" >&5 +echo "${ECHO_T}$enable_88_color" >&6 + if test "$enable_88_color" = yes ; then + CHARPROC_DEPS="$CHARPROC_DEPS 88colres.h" + EXTRAHDRS="$EXTRAHDRS 88colres.h" + +cat >>confdefs.h <<\EOF +#define OPT_88_COLORS 1 +EOF + + fi + + fi + +fi + +echo "$as_me:17914: checking if you want blinking cursor" >&5 +echo $ECHO_N "checking if you want blinking cursor... $ECHO_C" >&6 + +# Check whether --enable-blink-cursor or --disable-blink-cursor was given. +if test "${enable_blink_cursor+set}" = set; then + enableval="$enable_blink_cursor" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_blink_curs=no + else + enable_blink_curs=yes + fi +else + enableval=yes + enable_blink_curs=yes + +fi; +echo "$as_me:17931: result: $enable_blink_curs" >&5 +echo "${ECHO_T}$enable_blink_curs" >&6 +test "$enable_blink_curs" = no && +cat >>confdefs.h <<\EOF +#define OPT_BLINK_CURS 0 +EOF + +echo "$as_me:17938: checking if you want to ignore Linux's broken palette-strings" >&5 +echo $ECHO_N "checking if you want to ignore Linux's broken palette-strings... $ECHO_C" >&6 + +case $host_os in +(linux*) + assume_broken_osc=yes ;; +(*) + assume_broken_osc=no ;; +esac + +# Check whether --enable-broken-osc or --disable-broken-osc was given. +if test "${enable_broken_osc+set}" = set; then + enableval="$enable_broken_osc" + test "$enableval" != no && enableval=yes + if test "$enableval" != "$assume_broken_osc" ; then + enable_broken_osc=$enableval + else + enable_broken_osc=$enableval + fi +else + enableval=$assume_broken_osc + enable_broken_osc=$enableval + +fi; +echo "$as_me:17962: result: $enable_broken_osc" >&5 +echo "${ECHO_T}$enable_broken_osc" >&6 +if test "$enable_broken_osc" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_BROKEN_OSC 1 +EOF + +else + +cat >>confdefs.h <<\EOF +#define OPT_BROKEN_OSC 0 +EOF + +fi + +echo "$as_me:17978: checking if you want to allow broken string-terminators" >&5 +echo $ECHO_N "checking if you want to allow broken string-terminators... $ECHO_C" >&6 + +# Check whether --enable-broken-st or --disable-broken-st was given. +if test "${enable_broken_st+set}" = set; then + enableval="$enable_broken_st" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_broken_st=no + else + enable_broken_st=yes + fi +else + enableval=no + enable_broken_st=yes + +fi; +echo "$as_me:17995: result: $enable_broken_st" >&5 +echo "${ECHO_T}$enable_broken_st" >&6 +test "$enable_broken_st" = no && +cat >>confdefs.h <<\EOF +#define OPT_BROKEN_ST 0 +EOF + +echo "$as_me:18002: checking if you want to compile-in icon data" >&5 +echo $ECHO_N "checking if you want to compile-in icon data... $ECHO_C" >&6 + +# Check whether --enable-builtin-xpms or --disable-builtin-xpms was given. +if test "${enable_builtin_xpms+set}" = set; then + enableval="$enable_builtin_xpms" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_builtin_xpms=yes + else + enable_builtin_xpms=no + fi +else + enableval=no + enable_builtin_xpms=no + +fi; +echo "$as_me:18019: result: $enable_builtin_xpms" >&5 +echo "${ECHO_T}$enable_builtin_xpms" >&6 +test "$enable_builtin_xpms" = yes && +cat >>confdefs.h <<\EOF +#define OPT_BUILTIN_XPMS 1 +EOF + +echo "$as_me:18026: checking if you want printable 128-159" >&5 +echo $ECHO_N "checking if you want printable 128-159... $ECHO_C" >&6 + +# Check whether --enable-c1-print or --disable-c1-print was given. +if test "${enable_c1_print+set}" = set; then + enableval="$enable_c1_print" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_c1_print=no + else + enable_c1_print=yes + fi +else + enableval=yes + enable_c1_print=yes + +fi; +echo "$as_me:18043: result: $enable_c1_print" >&5 +echo "${ECHO_T}$enable_c1_print" >&6 +test "$enable_c1_print" = no && +cat >>confdefs.h <<\EOF +#define OPT_C1_PRINT 0 +EOF + +if test "$enable_ansi_color" = yes ; then + + echo "$as_me:18052: checking if you want bold colors mapped like IBM PC" >&5 +echo $ECHO_N "checking if you want bold colors mapped like IBM PC... $ECHO_C" >&6 + +# Check whether --enable-bold-color or --disable-bold-color was given. +if test "${enable_bold_color+set}" = set; then + enableval="$enable_bold_color" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_pc_color=no + else + enable_pc_color=yes + fi +else + enableval=yes + enable_pc_color=yes + +fi; + echo "$as_me:18069: result: $enable_pc_color" >&5 +echo "${ECHO_T}$enable_pc_color" >&6 + test "$enable_pc_color" = no && +cat >>confdefs.h <<\EOF +#define OPT_PC_COLORS 0 +EOF + + echo "$as_me:18076: checking if you want separate color-classes" >&5 +echo $ECHO_N "checking if you want separate color-classes... $ECHO_C" >&6 + +# Check whether --enable-color-class or --disable-color-class was given. +if test "${enable_color_class+set}" = set; then + enableval="$enable_color_class" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_color_class=no + else + enable_color_class=yes + fi +else + enableval=yes + enable_color_class=yes + +fi; + echo "$as_me:18093: result: $enable_color_class" >&5 +echo "${ECHO_T}$enable_color_class" >&6 + test "$enable_color_class" = no && +cat >>confdefs.h <<\EOF +#define OPT_COLOR_CLASS 0 +EOF + + echo "$as_me:18100: checking if you want color-mode enabled by default" >&5 +echo $ECHO_N "checking if you want color-mode enabled by default... $ECHO_C" >&6 + +# Check whether --enable-color-mode or --disable-color-mode was given. +if test "${enable_color_mode+set}" = set; then + enableval="$enable_color_mode" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + default_colormode=no + else + default_colormode=yes + fi +else + enableval=yes + default_colormode=yes + +fi; + echo "$as_me:18117: result: $default_colormode" >&5 +echo "${ECHO_T}$default_colormode" >&6 + test "$default_colormode" = no && +cat >>confdefs.h <<\EOF +#define DFT_COLORMODE 0 +EOF + +fi + +echo "$as_me:18126: checking if you want support for color highlighting" >&5 +echo $ECHO_N "checking if you want support for color highlighting... $ECHO_C" >&6 + +# Check whether --enable-highlighting or --disable-highlighting was given. +if test "${enable_highlighting+set}" = set; then + enableval="$enable_highlighting" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + default_highlight=no + else + default_highlight=yes + fi +else + enableval=yes + default_highlight=yes + +fi; +echo "$as_me:18143: result: $default_highlight" >&5 +echo "${ECHO_T}$default_highlight" >&6 +test "$default_highlight" = no && +cat >>confdefs.h <<\EOF +#define OPT_HIGHLIGHT_COLOR 0 +EOF + +echo "$as_me:18150: checking if you want support for doublesize characters" >&5 +echo $ECHO_N "checking if you want support for doublesize characters... $ECHO_C" >&6 + +# Check whether --enable-doublechars or --disable-doublechars was given. +if test "${enable_doublechars+set}" = set; then + enableval="$enable_doublechars" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_doublechars=no + else + enable_doublechars=yes + fi +else + enableval=yes + enable_doublechars=yes + +fi; +echo "$as_me:18167: result: $enable_doublechars" >&5 +echo "${ECHO_T}$enable_doublechars" >&6 +test "$enable_doublechars" = no && +cat >>confdefs.h <<\EOF +#define OPT_DEC_CHRSET 0 +EOF + +echo "$as_me:18174: checking if you want fallback-support for box characters" >&5 +echo $ECHO_N "checking if you want fallback-support for box characters... $ECHO_C" >&6 + +# Check whether --enable-boxchars or --disable-boxchars was given. +if test "${enable_boxchars+set}" = set; then + enableval="$enable_boxchars" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_boxchars=no + else + enable_boxchars=yes + fi +else + enableval=yes + enable_boxchars=yes + +fi; +echo "$as_me:18191: result: $enable_boxchars" >&5 +echo "${ECHO_T}$enable_boxchars" >&6 +test "$enable_boxchars" = no && +cat >>confdefs.h <<\EOF +#define OPT_BOX_CHARS 0 +EOF + +echo "$as_me:18198: checking if you want to allow spawning new xterms" >&5 +echo $ECHO_N "checking if you want to allow spawning new xterms... $ECHO_C" >&6 + +# Check whether --enable-exec-xterm or --disable-exec-xterm was given. +if test "${enable_exec_xterm+set}" = set; then + enableval="$enable_exec_xterm" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_exec_xterm=yes + else + enable_exec_xterm=no + fi +else + enableval=no + enable_exec_xterm=no + +fi; +echo "$as_me:18215: result: $enable_exec_xterm" >&5 +echo "${ECHO_T}$enable_exec_xterm" >&6 +if test "$enable_exec_xterm" = yes ; then + +echo "$as_me:18219: checking for proc tree with cwd-support" >&5 +echo $ECHO_N "checking for proc tree with cwd-support... $ECHO_C" >&6 +if test "${cf_cv_procfs_cwd+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_procfs_cwd=no +for cf_path in /proc /compat/linux/proc /usr/compat/linux/proc +do + if test -d $cf_path && \ + test -d $cf_path/$$ && \ + ( test -d $cf_path/$$/cwd || \ + test -L $cf_path/$$/cwd ); then + cf_cv_procfs_cwd=$cf_path + break + fi +done + +fi +echo "$as_me:18238: result: $cf_cv_procfs_cwd" >&5 +echo "${ECHO_T}$cf_cv_procfs_cwd" >&6 + + if test "$cf_cv_procfs_cwd" = no ; then + { echo "$as_me:18242: WARNING: no suitable proc filesystem found" >&5 +echo "$as_me: WARNING: no suitable proc filesystem found" >&2;} + else + +cat >>confdefs.h <>confdefs.h <<\EOF +#define OPT_EXEC_XTERM 1 +EOF + + fi +fi + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists Xext; then + test -n "$verbose" && echo " found package Xext" 1>&6 + +echo "${as_me:-configure}:18260: testing found package Xext ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags Xext 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs Xext 2>/dev/null`" + test -n "$verbose" && echo " package Xext CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:18266: testing package Xext CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package Xext LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:18270: testing package Xext LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + + echo "$as_me:18391: checking for XextCreateExtension in -lXext" >&5 +echo $ECHO_N "checking for XextCreateExtension in -lXext... $ECHO_C" >&6 +if test "${ac_cv_lib_Xext_XextCreateExtension+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXext $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 18399 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XextCreateExtension (); +int +main (void) +{ +XextCreateExtension (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:18418: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18421: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:18424: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18427: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_Xext_XextCreateExtension=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_Xext_XextCreateExtension=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:18438: result: $ac_cv_lib_Xext_XextCreateExtension" >&5 +echo "${ECHO_T}$ac_cv_lib_Xext_XextCreateExtension" >&6 +if test $ac_cv_lib_Xext_XextCreateExtension = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lXext; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +fi + +echo "$as_me:18462: checking for X11/extensions/Xdbe.h" >&5 +echo $ECHO_N "checking for X11/extensions/Xdbe.h... $ECHO_C" >&6 +if test "${ac_cv_header_X11_extensions_Xdbe_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 18468 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:18472: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:18478: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_X11_extensions_Xdbe_h=yes +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_header_X11_extensions_Xdbe_h=no +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:18497: result: $ac_cv_header_X11_extensions_Xdbe_h" >&5 +echo "${ECHO_T}$ac_cv_header_X11_extensions_Xdbe_h" >&6 +if test $ac_cv_header_X11_extensions_Xdbe_h = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_X11_EXTENSIONS_XDBE_H 1 +EOF + + echo "$as_me:18505: checking for XdbeSwapBuffers" >&5 +echo $ECHO_N "checking for XdbeSwapBuffers... $ECHO_C" >&6 +if test "${ac_cv_func_XdbeSwapBuffers+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 18511 "configure" +#include "confdefs.h" +#define XdbeSwapBuffers autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef XdbeSwapBuffers + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char XdbeSwapBuffers (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_XdbeSwapBuffers) || defined (__stub___XdbeSwapBuffers) +#error found stub for XdbeSwapBuffers +#endif + + return XdbeSwapBuffers (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:18542: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18545: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:18548: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18551: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_XdbeSwapBuffers=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_XdbeSwapBuffers=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:18561: result: $ac_cv_func_XdbeSwapBuffers" >&5 +echo "${ECHO_T}$ac_cv_func_XdbeSwapBuffers" >&6 +if test $ac_cv_func_XdbeSwapBuffers = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_XDBESWAPBUFFERS 1 +EOF + + cf_x_ext_double_buffer=yes +fi + +fi + +double_buffer=False +if test "$cf_x_ext_double_buffer" = yes ; then + echo "$as_me:18576: checking if you want to enable double-buffering in default resources" >&5 +echo $ECHO_N "checking if you want to enable double-buffering in default resources... $ECHO_C" >&6 + +# Check whether --enable-double-buffer or --disable-double-buffer was given. +if test "${enable_double_buffer+set}" = set; then + enableval="$enable_double_buffer" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_double_bfr=yes + else + enable_double_bfr=no + fi +else + enableval=no + enable_double_bfr=no + +fi; + echo "$as_me:18593: result: $enable_double_bfr" >&5 +echo "${ECHO_T}$enable_double_bfr" >&6 + if test "$enable_double_bfr" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_DOUBLE_BUFFER 1 +EOF + + double_buffer=True + fi +fi + +echo "$as_me:18605: checking if you want to use FreeType library" >&5 +echo $ECHO_N "checking if you want to use FreeType library... $ECHO_C" >&6 + +# Check whether --enable-freetype or --disable-freetype was given. +if test "${enable_freetype+set}" = set; then + enableval="$enable_freetype" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_freetype=no + else + enable_freetype=yes + fi +else + enableval=yes + enable_freetype=yes + +fi; +echo "$as_me:18622: result: $enable_freetype" >&5 +echo "${ECHO_T}$enable_freetype" >&6 +if test "$enable_freetype" = yes ; then + +cf_cv_x_freetype_incs=no +cf_cv_x_freetype_libs=no +cf_extra_freetype_libs= +FREETYPE_CONFIG=none +FREETYPE_PARAMS= + +echo "$as_me:18632: checking for FreeType configuration script" >&5 +echo $ECHO_N "checking for FreeType configuration script... $ECHO_C" >&6 + +# Check whether --with-freetype-config or --without-freetype-config was given. +if test "${with_freetype_config+set}" = set; then + withval="$with_freetype_config" + cf_cv_x_freetype_cfgs="$withval" +else + cf_cv_x_freetype_cfgs=auto +fi; +test -z $cf_cv_x_freetype_cfgs && cf_cv_x_freetype_cfgs=auto +test $cf_cv_x_freetype_cfgs = no && cf_cv_x_freetype_cfgs=none +echo "$as_me:18644: result: $cf_cv_x_freetype_cfgs" >&5 +echo "${ECHO_T}$cf_cv_x_freetype_cfgs" >&6 + +case $cf_cv_x_freetype_cfgs in +(none) + echo "$as_me:18649: checking if you specified -D/-I options for FreeType" >&5 +echo $ECHO_N "checking if you specified -D/-I options for FreeType... $ECHO_C" >&6 + +# Check whether --with-freetype-cflags or --without-freetype-cflags was given. +if test "${with_freetype_cflags+set}" = set; then + withval="$with_freetype_cflags" + cf_cv_x_freetype_incs="$with_freetype_cflags" +else + cf_cv_x_freetype_incs=no +fi; + echo "$as_me:18659: result: $cf_cv_x_freetype_incs" >&5 +echo "${ECHO_T}$cf_cv_x_freetype_incs" >&6 + + echo "$as_me:18662: checking if you specified -L/-l options for FreeType" >&5 +echo $ECHO_N "checking if you specified -L/-l options for FreeType... $ECHO_C" >&6 + +# Check whether --with-freetype-libs or --without-freetype-libs was given. +if test "${with_freetype_libs+set}" = set; then + withval="$with_freetype_libs" + cf_cv_x_freetype_libs="$with_freetype_libs" +else + cf_cv_x_freetype_libs=no +fi; + echo "$as_me:18672: result: $cf_cv_x_freetype_libs" >&5 +echo "${ECHO_T}$cf_cv_x_freetype_libs" >&6 + ;; +(auto) + if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists xft; then + FREETYPE_CONFIG=$PKG_CONFIG + FREETYPE_PARAMS=xft + else + # Extract the first word of "freetype-config", so it can be a program name with args. +set dummy freetype-config; ac_word=$2 +echo "$as_me:18682: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_FREETYPE_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $FREETYPE_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_FREETYPE_CONFIG="$ac_dir/$ac_word" + echo "$as_me:18699: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_FREETYPE_CONFIG" && ac_cv_path_FREETYPE_CONFIG="none" + ;; +esac +fi +FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG + +if test -n "$FREETYPE_CONFIG"; then + echo "$as_me:18711: result: $FREETYPE_CONFIG" >&5 +echo "${ECHO_T}$FREETYPE_CONFIG" >&6 +else + echo "$as_me:18714: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "$FREETYPE_CONFIG" != none; then + FREETYPE_CONFIG=$FREETYPE_CONFIG + cf_extra_freetype_libs="-lXft" + else + # Extract the first word of "xft-config", so it can be a program name with args. +set dummy xft-config; ac_word=$2 +echo "$as_me:18724: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_FREETYPE_OLD_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $FREETYPE_OLD_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FREETYPE_OLD_CONFIG="$FREETYPE_OLD_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_FREETYPE_OLD_CONFIG="$ac_dir/$ac_word" + echo "$as_me:18741: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_FREETYPE_OLD_CONFIG" && ac_cv_path_FREETYPE_OLD_CONFIG="none" + ;; +esac +fi +FREETYPE_OLD_CONFIG=$ac_cv_path_FREETYPE_OLD_CONFIG + +if test -n "$FREETYPE_OLD_CONFIG"; then + echo "$as_me:18753: result: $FREETYPE_OLD_CONFIG" >&5 +echo "${ECHO_T}$FREETYPE_OLD_CONFIG" >&6 +else + echo "$as_me:18756: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "$FREETYPE_OLD_CONFIG" != none; then + FREETYPE_CONFIG=$FREETYPE_OLD_CONFIG + fi + fi + fi + ;; +(pkg*) + if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists xft; then + FREETYPE_CONFIG=$cf_cv_x_freetype_cfgs + FREETYPE_PARAMS=xft + else + { echo "$as_me:18771: WARNING: cannot find pkg-config for Xft" >&5 +echo "$as_me: WARNING: cannot find pkg-config for Xft" >&2;} + fi + ;; +(*) + # Extract the first word of "$cf_cv_x_freetype_cfgs", so it can be a program name with args. +set dummy $cf_cv_x_freetype_cfgs; ac_word=$2 +echo "$as_me:18778: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_FREETYPE_XFT_CONFIG+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $FREETYPE_XFT_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FREETYPE_XFT_CONFIG="$FREETYPE_XFT_CONFIG" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_FREETYPE_XFT_CONFIG="$ac_dir/$ac_word" + echo "$as_me:18795: found $ac_dir/$ac_word" >&5 + break +fi +done + + test -z "$ac_cv_path_FREETYPE_XFT_CONFIG" && ac_cv_path_FREETYPE_XFT_CONFIG="none" + ;; +esac +fi +FREETYPE_XFT_CONFIG=$ac_cv_path_FREETYPE_XFT_CONFIG + +if test -n "$FREETYPE_XFT_CONFIG"; then + echo "$as_me:18807: result: $FREETYPE_XFT_CONFIG" >&5 +echo "${ECHO_T}$FREETYPE_XFT_CONFIG" >&6 +else + echo "$as_me:18810: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + if test "$FREETYPE_XFT_CONFIG" != none; then + FREETYPE_CONFIG=$FREETYPE_XFT_CONFIG + else + { echo "$as_me:18817: WARNING: cannot find config script for Xft" >&5 +echo "$as_me: WARNING: cannot find config script for Xft" >&2;} + fi + ;; +esac + +if test "$FREETYPE_CONFIG" != none ; then + echo "$as_me:18824: checking for FreeType config" >&5 +echo $ECHO_N "checking for FreeType config... $ECHO_C" >&6 + echo "$as_me:18826: result: $FREETYPE_CONFIG $FREETYPE_PARAMS" >&5 +echo "${ECHO_T}$FREETYPE_CONFIG $FREETYPE_PARAMS" >&6 + + if test "$cf_cv_x_freetype_incs" = no ; then + echo "$as_me:18830: checking for $FREETYPE_CONFIG cflags" >&5 +echo $ECHO_N "checking for $FREETYPE_CONFIG cflags... $ECHO_C" >&6 + cf_cv_x_freetype_incs="`$FREETYPE_CONFIG $FREETYPE_PARAMS --cflags 2>/dev/null`" + echo "$as_me:18833: result: $cf_cv_x_freetype_incs" >&5 +echo "${ECHO_T}$cf_cv_x_freetype_incs" >&6 + fi + + if test "$cf_cv_x_freetype_libs" = no ; then + echo "$as_me:18838: checking for $FREETYPE_CONFIG libs" >&5 +echo $ECHO_N "checking for $FREETYPE_CONFIG libs... $ECHO_C" >&6 + cf_cv_x_freetype_libs="$cf_extra_freetype_libs `$FREETYPE_CONFIG $FREETYPE_PARAMS --libs 2>/dev/null`" + echo "$as_me:18841: result: $cf_cv_x_freetype_libs" >&5 +echo "${ECHO_T}$cf_cv_x_freetype_libs" >&6 + fi +fi + +if test "$cf_cv_x_freetype_incs" = no ; then + cf_cv_x_freetype_incs= +fi + +if test "$cf_cv_x_freetype_libs" = no ; then + cf_cv_x_freetype_libs=-lXft +fi + +echo "$as_me:18854: checking if we can link with FreeType libraries" >&5 +echo $ECHO_N "checking if we can link with FreeType libraries... $ECHO_C" >&6 + +cf_save_LIBS="$LIBS" +cf_save_INCS="$CPPFLAGS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_cv_x_freetype_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +CPPFLAGS="$CPPFLAGS $cf_cv_x_freetype_incs" + +cat >conftest.$ac_ext <<_ACEOF +#line 18879 "configure" +#include "confdefs.h" + +#include +#include +#include +int +main (void) +{ + + XftPattern *pat = XftNameParse ("name"); (void)pat + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:18895: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:18898: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:18901: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:18904: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_found_freetype=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_found_freetype=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +echo "$as_me:18913: result: $cf_cv_found_freetype" >&5 +echo "${ECHO_T}$cf_cv_found_freetype" >&6 + +LIBS="$cf_save_LIBS" +CPPFLAGS="$cf_save_INCS" + +if test "$cf_cv_found_freetype" = yes ; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_cv_x_freetype_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_cv_x_freetype_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cat >>confdefs.h <<\EOF +#define XRENDERFONT 1 +EOF + +for ac_func in \ + XftDrawCharSpec \ + XftDrawSetClip \ + XftDrawSetClipRectangles \ + +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:19046: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 19052 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:19083: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19086: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:19089: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19092: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:19102: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <&5 +echo "$as_me: WARNING: No libraries found for FreeType" >&2;} + CPPFLAGS=`echo "$CPPFLAGS" | sed -e s/-DXRENDERFONT//` +fi + +# FIXME: revisit this if needed + +if test "$cf_cv_found_freetype" = yes ; then +echo "$as_me:19121: checking for usable Xft/fontconfig package" >&5 +echo $ECHO_N "checking for usable Xft/fontconfig package... $ECHO_C" >&6 +if test "${cf_cv_xft_compat+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 19128 "configure" +#include "confdefs.h" + +#include + +int +main (void) +{ + + XftPattern *pat = 0; + XftPatternBuild(pat, + XFT_FAMILY, XftTypeString, "mono", + (void *) 0); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:19147: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19150: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:19153: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19156: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_xft_compat=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_xft_compat=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + +fi +echo "$as_me:19167: result: $cf_cv_xft_compat" >&5 +echo "${ECHO_T}$cf_cv_xft_compat" >&6 + +if test "$cf_cv_xft_compat" = no +then + # workaround for broken ".pc" files used for Xft. + case "$cf_cv_x_freetype_libs" in + (*-lfontconfig*) + ;; + (*) + test -n "$verbose" && echo " work around broken package" 1>&6 + +echo "${as_me:-configure}:19179: testing work around broken package ..." 1>&5 + + cf_save_fontconfig="$LIBS" + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists fontconfig; then + test -n "$verbose" && echo " found package fontconfig" 1>&6 + +echo "${as_me:-configure}:19186: testing found package fontconfig ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags fontconfig 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs fontconfig 2>/dev/null`" + test -n "$verbose" && echo " package fontconfig CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:19192: testing package fontconfig CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package fontconfig LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:19196: testing package fontconfig LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + LIBS="$cf_save_fontconfig" + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:19414: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%-lXft %-lXft $cf_pkgconfig_libs %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:19419: testing ...after $LIBS ..." 1>&5 + +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +test -n "$verbose" && echo " ...before $LIBS" 1>&6 + +echo "${as_me:-configure}:19427: testing ...before $LIBS ..." 1>&5 + +LIBS=`echo "$LIBS" | sed -e "s/[ ][ ]*/ /g" -e "s%-lXft %-lXft -lfontconfig %" -e 's% % %g'` +test -n "$verbose" && echo " ...after $LIBS" 1>&6 + +echo "${as_me:-configure}:19432: testing ...after $LIBS ..." 1>&5 + +fi + + ;; + esac +fi +fi + +else + CPPFLAGS=`echo "$CPPFLAGS" | sed -e s/-DXRENDERFONT//` +fi + +echo "$as_me:19445: checking if you want support for HP-style function keys" >&5 +echo $ECHO_N "checking if you want support for HP-style function keys... $ECHO_C" >&6 + +# Check whether --enable-hp-fkeys or --disable-hp-fkeys was given. +if test "${enable_hp_fkeys+set}" = set; then + enableval="$enable_hp_fkeys" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_hp_fkeys=yes + else + enable_hp_fkeys=no + fi +else + enableval=no + enable_hp_fkeys=no + +fi; +echo "$as_me:19462: result: $enable_hp_fkeys" >&5 +echo "${ECHO_T}$enable_hp_fkeys" >&6 +if test "$enable_hp_fkeys" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_HP_FUNC_KEYS 1 +EOF + +fi + +echo "$as_me:19472: checking if you want support for SCO-style function keys" >&5 +echo $ECHO_N "checking if you want support for SCO-style function keys... $ECHO_C" >&6 + +# Check whether --enable-sco-fkeys or --disable-sco-fkeys was given. +if test "${enable_sco_fkeys+set}" = set; then + enableval="$enable_sco_fkeys" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_sco_fkeys=yes + else + enable_sco_fkeys=no + fi +else + enableval=no + enable_sco_fkeys=no + +fi; +echo "$as_me:19489: result: $enable_sco_fkeys" >&5 +echo "${ECHO_T}$enable_sco_fkeys" >&6 +if test "$enable_sco_fkeys" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_SCO_FUNC_KEYS 1 +EOF + +fi + +echo "$as_me:19499: checking if you want support for Sun-style function keys" >&5 +echo $ECHO_N "checking if you want support for Sun-style function keys... $ECHO_C" >&6 + +# Check whether --enable-sun-fkeys or --disable-sun-fkeys was given. +if test "${enable_sun_fkeys+set}" = set; then + enableval="$enable_sun_fkeys" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_sun_fkeys=no + else + enable_sun_fkeys=yes + fi +else + enableval=yes + enable_sun_fkeys=yes + +fi; +echo "$as_me:19516: result: $enable_sun_fkeys" >&5 +echo "${ECHO_T}$enable_sun_fkeys" >&6 +if test "$enable_sun_fkeys" = no ; then + +cat >>confdefs.h <<\EOF +#define OPT_SUN_FUNC_KEYS 0 +EOF + +fi + +echo "$as_me:19526: checking if you want saved-lines stored as a FIFO" >&5 +echo $ECHO_N "checking if you want saved-lines stored as a FIFO... $ECHO_C" >&6 + +# Check whether --enable-fifo-lines or --disable-fifo-lines was given. +if test "${enable_fifo_lines+set}" = set; then + enableval="$enable_fifo_lines" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_fifo_lines=no + else + enable_fifo_lines=yes + fi +else + enableval=yes + enable_fifo_lines=yes + +fi; +echo "$as_me:19543: result: $enable_fifo_lines" >&5 +echo "${ECHO_T}$enable_fifo_lines" >&6 +if test "$enable_fifo_lines" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_FIFO_LINES 1 +EOF + +fi + +echo "$as_me:19553: checking if you want support for internationalization" >&5 +echo $ECHO_N "checking if you want support for internationalization... $ECHO_C" >&6 + +# Check whether --enable-i18n or --disable-i18n was given. +if test "${enable_i18n+set}" = set; then + enableval="$enable_i18n" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_i18n=no + else + enable_i18n=yes + fi +else + enableval=yes + enable_i18n=yes + +fi; +echo "$as_me:19570: result: $enable_i18n" >&5 +echo "${ECHO_T}$enable_i18n" >&6 +if test "$enable_i18n" = no ; then + +cat >>confdefs.h <<\EOF +#define OPT_I18N_SUPPORT 0 +EOF + +fi + +echo "$as_me:19580: checking if you want support for initial-erase setup" >&5 +echo $ECHO_N "checking if you want support for initial-erase setup... $ECHO_C" >&6 + +# Check whether --enable-initial-erase or --disable-initial-erase was given. +if test "${enable_initial_erase+set}" = set; then + enableval="$enable_initial_erase" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_ie=no + else + enable_ie=yes + fi +else + enableval=yes + enable_ie=yes + +fi; +echo "$as_me:19597: result: $enable_ie" >&5 +echo "${ECHO_T}$enable_ie" >&6 +if test "$enable_ie" = no ; then + +cat >>confdefs.h <<\EOF +#define OPT_INITIAL_ERASE 0 +EOF + +fi + +echo "$as_me:19607: checking if you want support for input-method" >&5 +echo $ECHO_N "checking if you want support for input-method... $ECHO_C" >&6 + +# Check whether --enable-input-method or --disable-input-method was given. +if test "${enable_input_method+set}" = set; then + enableval="$enable_input_method" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_ximp=no + else + enable_ximp=$enable_i18n + fi +else + enableval=yes + enable_ximp=$enable_i18n + +fi; +echo "$as_me:19624: result: $enable_ximp" >&5 +echo "${ECHO_T}$enable_ximp" >&6 + +echo "$as_me:19627: checking if X libraries support input-method" >&5 +echo $ECHO_N "checking if X libraries support input-method... $ECHO_C" >&6 +if test "${cf_cv_input_method+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +#line 19634 "configure" +#include "confdefs.h" + +#include +#include +#include +#include +#include +#include + +int +main (void) +{ + +{ + XIM xim; + XIMStyles *xim_styles = 0; + XIMStyle input_style; + Widget w = 0; + + XSetLocaleModifiers("@im=none"); + xim = XOpenIM(XtDisplay(w), NULL, NULL, NULL); + XGetIMValues(xim, XNQueryInputStyle, &xim_styles, NULL); + XCloseIM(xim); + input_style = (XIMPreeditNothing | XIMStatusNothing); + (void)xim_styles; + (void)input_style; +} + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:19668: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:19671: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:19674: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:19677: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_input_method=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_input_method=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:19687: result: $cf_cv_input_method" >&5 +echo "${ECHO_T}$cf_cv_input_method" >&6 + +test "$cf_cv_input_method" = no && enable_ximp=no +if test "$enable_ximp" != no ; then + if test "$enable_i18n" = no ; then + { echo "$as_me:19693: WARNING: input-methor relies upon internationalization" >&5 +echo "$as_me: WARNING: input-methor relies upon internationalization" >&2;} + enable_ximp=no + fi +fi +if test "$enable_ximp" = no ; then + +cat >>confdefs.h <<\EOF +#define OPT_INPUT_METHOD 0 +EOF + +fi + +echo "$as_me:19706: checking if you want support for load-vt-fonts" >&5 +echo $ECHO_N "checking if you want support for load-vt-fonts... $ECHO_C" >&6 + +# Check whether --enable-load-vt-fonts or --disable-load-vt-fonts was given. +if test "${enable_load_vt_fonts+set}" = set; then + enableval="$enable_load_vt_fonts" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_load_vt_fonts=yes + else + enable_load_vt_fonts=no + fi +else + enableval=no + enable_load_vt_fonts=no + +fi; +echo "$as_me:19723: result: $enable_load_vt_fonts" >&5 +echo "${ECHO_T}$enable_load_vt_fonts" >&6 +if test "$enable_load_vt_fonts" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_LOAD_VTFONTS 1 +EOF + +fi + +echo "$as_me:19733: checking if you want support for logging" >&5 +echo $ECHO_N "checking if you want support for logging... $ECHO_C" >&6 + +# Check whether --enable-logging or --disable-logging was given. +if test "${enable_logging+set}" = set; then + enableval="$enable_logging" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_logging=yes + else + enable_logging=no + fi +else + enableval=no + enable_logging=no + +fi; +echo "$as_me:19750: result: $enable_logging" >&5 +echo "${ECHO_T}$enable_logging" >&6 +if test "$enable_logging" = yes ; then + +cat >>confdefs.h <<\EOF +#define ALLOWLOGGING 1 +EOF + + echo "$as_me:19758: checking if you want to allow logging via a pipe" >&5 +echo $ECHO_N "checking if you want to allow logging via a pipe... $ECHO_C" >&6 + +# Check whether --enable-logfile-exec or --disable-logfile-exec was given. +if test "${enable_logfile_exec+set}" = set; then + enableval="$enable_logfile_exec" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_log_exec=yes + else + enable_log_exec=no + fi +else + enableval=no + enable_log_exec=no + +fi; + echo "$as_me:19775: result: $enable_log_exec" >&5 +echo "${ECHO_T}$enable_log_exec" >&6 + if test "$enable_log_exec" = yes ; then + +cat >>confdefs.h <<\EOF +#define ALLOWLOGFILEEXEC 1 +EOF + + fi +fi + +echo "$as_me:19786: checking if you want support for iconify/maximize translations" >&5 +echo $ECHO_N "checking if you want support for iconify/maximize translations... $ECHO_C" >&6 + +# Check whether --enable-maximize or --disable-maximize was given. +if test "${enable_maximize+set}" = set; then + enableval="$enable_maximize" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_maximize=no + else + enable_maximize=yes + fi +else + enableval=yes + enable_maximize=yes + +fi; +echo "$as_me:19803: result: $enable_maximize" >&5 +echo "${ECHO_T}$enable_maximize" >&6 +test "$enable_maximize" = no && +cat >>confdefs.h <<\EOF +#define OPT_MAXIMIZE 0 +EOF + +echo "$as_me:19810: checking if you want NumLock to override keyboard tables" >&5 +echo $ECHO_N "checking if you want NumLock to override keyboard tables... $ECHO_C" >&6 + +# Check whether --enable-num-lock or --disable-num-lock was given. +if test "${enable_num_lock+set}" = set; then + enableval="$enable_num_lock" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_numlock=no + else + enable_numlock=yes + fi +else + enableval=yes + enable_numlock=yes + +fi; +echo "$as_me:19827: result: $enable_numlock" >&5 +echo "${ECHO_T}$enable_numlock" >&6 +test "$enable_numlock" = no && +cat >>confdefs.h <<\EOF +#define OPT_NUM_LOCK 0 +EOF + +echo "$as_me:19834: checking if you want support for get/set of base64 selection data" >&5 +echo $ECHO_N "checking if you want support for get/set of base64 selection data... $ECHO_C" >&6 + +# Check whether --enable-paste64 or --disable-paste64 was given. +if test "${enable_paste64+set}" = set; then + enableval="$enable_paste64" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_paste64=no + else + enable_paste64=yes + fi +else + enableval=yes + enable_paste64=yes + +fi; +echo "$as_me:19851: result: $enable_paste64" >&5 +echo "${ECHO_T}$enable_paste64" >&6 +if test "$enable_paste64" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_PASTE64 1 +EOF + +else + +cat >>confdefs.h <<\EOF +#define OPT_PASTE64 0 +EOF + +fi + +echo "$as_me:19867: checking if you want support for pty-handshaking" >&5 +echo $ECHO_N "checking if you want support for pty-handshaking... $ECHO_C" >&6 + +# Check whether --enable-pty-handshake or --disable-pty-handshake was given. +if test "${enable_pty_handshake+set}" = set; then + enableval="$enable_pty_handshake" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_pty_handshake=no + else + enable_pty_handshake=yes + fi +else + enableval=yes + enable_pty_handshake=yes + +fi; +echo "$as_me:19884: result: $enable_pty_handshake" >&5 +echo "${ECHO_T}$enable_pty_handshake" >&6 +if test "$enable_pty_handshake" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_PTY_HANDSHAKE 1 +EOF + +else + +cat >>confdefs.h <<\EOF +#define OPT_PTY_HANDSHAKE 0 +EOF + +fi + +echo "$as_me:19900: checking if you want support for mouse in readline applications" >&5 +echo $ECHO_N "checking if you want support for mouse in readline applications... $ECHO_C" >&6 + +# Check whether --enable-readline-mouse or --disable-readline-mouse was given. +if test "${enable_readline_mouse+set}" = set; then + enableval="$enable_readline_mouse" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_readline_mouse=yes + else + enable_readline_mouse=no + fi +else + enableval=no + enable_readline_mouse=no + +fi; +echo "$as_me:19917: result: $enable_readline_mouse" >&5 +echo "${ECHO_T}$enable_readline_mouse" >&6 +if test "$enable_readline_mouse" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_READLINE 1 +EOF + +fi + +echo "$as_me:19927: checking if you want support for regular-expression selections" >&5 +echo $ECHO_N "checking if you want support for regular-expression selections... $ECHO_C" >&6 + +# Check whether --enable-regex or --disable-regex was given. +if test "${enable_regex+set}" = set; then + enableval="$enable_regex" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_regex=no + else + enable_regex=yes + fi +else + enableval=yes + enable_regex=yes + +fi; +echo "$as_me:19944: result: $enable_regex" >&5 +echo "${ECHO_T}$enable_regex" >&6 +if test "$enable_regex" = yes ; then + +echo "$as_me:19948: checking if you want to use PCRE2 for regular-expressions" >&5 +echo $ECHO_N "checking if you want to use PCRE2 for regular-expressions... $ECHO_C" >&6 + +# Check whether --with-pcre2 or --without-pcre2 was given. +if test "${with_pcre2+set}" = set; then + withval="$with_pcre2" + +fi; +test -z "$with_pcre2" && with_pcre2=no +echo "$as_me:19957: result: $with_pcre2" >&5 +echo "${ECHO_T}$with_pcre2" >&6 + +if test "x$with_pcre2" != xno ; then + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists libpcre2; then + test -n "$verbose" && echo " found package libpcre2" 1>&6 + +echo "${as_me:-configure}:19965: testing found package libpcre2 ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags libpcre2 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs libpcre2 2>/dev/null`" + test -n "$verbose" && echo " package libpcre2 CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:19971: testing package libpcre2 CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package libpcre2 LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:19975: testing package libpcre2 LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists libpcre; then + test -n "$verbose" && echo " found package libpcre" 1>&6 + +echo "${as_me:-configure}:20099: testing found package libpcre ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags libpcre 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs libpcre 2>/dev/null`" + test -n "$verbose" && echo " package libpcre CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:20105: testing package libpcre CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package libpcre LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:20109: testing package libpcre LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + + { { echo "$as_me:20230: error: Cannot find PCRE2 library" >&5 +echo "$as_me: error: Cannot find PCRE2 library" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + +cat >>confdefs.h <<\EOF +#define HAVE_LIB_PCRE2 1 +EOF + + # if pkgconfig gave no results, look for the libraries directly + case $LIBS in + (*pcre2-posix*|*pcreposix*) + ;; + (*) + echo "$as_me:20246: checking for regcomp in -lpcre2-posix" >&5 +echo $ECHO_N "checking for regcomp in -lpcre2-posix... $ECHO_C" >&6 +if test "${ac_cv_lib_pcre2_posix_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcre2-posix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 20254 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (); +int +main (void) +{ +regcomp (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:20273: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20276: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:20279: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20282: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pcre2_posix_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_pcre2_posix_regcomp=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:20293: result: $ac_cv_lib_pcre2_posix_regcomp" >&5 +echo "${ECHO_T}$ac_cv_lib_pcre2_posix_regcomp" >&6 +if test $ac_cv_lib_pcre2_posix_regcomp = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpcre2-posix; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + echo "$as_me:20314: checking for regcomp in -lpcreposix" >&5 +echo $ECHO_N "checking for regcomp in -lpcreposix... $ECHO_C" >&6 +if test "${ac_cv_lib_pcreposix_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcreposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 20322 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (); +int +main (void) +{ +regcomp (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:20341: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20344: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:20347: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20350: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pcreposix_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_pcreposix_regcomp=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:20361: result: $ac_cv_lib_pcreposix_regcomp" >&5 +echo "${ECHO_T}$ac_cv_lib_pcreposix_regcomp" >&6 +if test $ac_cv_lib_pcreposix_regcomp = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpcreposix; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + { { echo "$as_me:20382: error: Cannot find PCRE2 POSIX library" >&5 +echo "$as_me: error: Cannot find PCRE2 POSIX library" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + + ;; + esac + + # either way, check for the library header files + +for ac_header in pcre2posix.h pcreposix.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:20397: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 20403 "configure" +#include "confdefs.h" +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:20407: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:20413: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:20432: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use PCRE for regular-expressions... $ECHO_C" >&6 + +# Check whether --with-pcre or --without-pcre was given. +if test "${with_pcre+set}" = set; then + withval="$with_pcre" + +fi; +test -z "$with_pcre" && with_pcre=no +echo "$as_me:20455: result: $with_pcre" >&5 +echo "${ECHO_T}$with_pcre" >&6 + +if test "$with_pcre" != no ; then + +if test "$PKG_CONFIG" != none && "$PKG_CONFIG" --exists libpcre; then + test -n "$verbose" && echo " found package libpcre" 1>&6 + +echo "${as_me:-configure}:20463: testing found package libpcre ..." 1>&5 + + cf_pkgconfig_incs="`$PKG_CONFIG --cflags libpcre 2>/dev/null`" + cf_pkgconfig_libs="`$PKG_CONFIG --libs libpcre 2>/dev/null`" + test -n "$verbose" && echo " package libpcre CFLAGS: $cf_pkgconfig_incs" 1>&6 + +echo "${as_me:-configure}:20469: testing package libpcre CFLAGS: $cf_pkgconfig_incs ..." 1>&5 + + test -n "$verbose" && echo " package libpcre LIBS: $cf_pkgconfig_libs" 1>&6 + +echo "${as_me:-configure}:20473: testing package libpcre LIBS: $cf_pkgconfig_libs ..." 1>&5 + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in $cf_pkgconfig_incs +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in $cf_pkgconfig_libs; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + : +else + cf_pkgconfig_incs= + cf_pkgconfig_libs= + +echo "$as_me:20594: checking for pcre_compile in -lpcre" >&5 +echo $ECHO_N "checking for pcre_compile in -lpcre... $ECHO_C" >&6 +if test "${ac_cv_lib_pcre_pcre_compile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcre $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 20602 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pcre_compile (); +int +main (void) +{ +pcre_compile (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:20621: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20624: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:20627: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20630: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pcre_pcre_compile=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_pcre_pcre_compile=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:20641: result: $ac_cv_lib_pcre_pcre_compile" >&5 +echo "${ECHO_T}$ac_cv_lib_pcre_pcre_compile" >&6 +if test $ac_cv_lib_pcre_pcre_compile = yes; then + cat >>confdefs.h <&5 +echo "$as_me: error: Cannot find PCRE library" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + +cat >>confdefs.h <<\EOF +#define HAVE_LIB_PCRE 1 +EOF + + case $LIBS in + (*pcreposix*) + ;; + (*) + echo "$as_me:20666: checking for pcreposix_regcomp in -lpcreposix" >&5 +echo $ECHO_N "checking for pcreposix_regcomp in -lpcreposix... $ECHO_C" >&6 +if test "${ac_cv_lib_pcreposix_pcreposix_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcreposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 20674 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pcreposix_regcomp (); +int +main (void) +{ +pcreposix_regcomp (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:20693: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20696: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:20699: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20702: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pcreposix_pcreposix_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_pcreposix_pcreposix_regcomp=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:20713: result: $ac_cv_lib_pcreposix_pcreposix_regcomp" >&5 +echo "${ECHO_T}$ac_cv_lib_pcreposix_pcreposix_regcomp" >&6 +if test $ac_cv_lib_pcreposix_pcreposix_regcomp = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_PCREPOSIX_H 1 +EOF + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpcreposix; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + echo "$as_me:20738: checking for regcomp in -lpcreposix" >&5 +echo $ECHO_N "checking for regcomp in -lpcreposix... $ECHO_C" >&6 +if test "${ac_cv_lib_pcreposix_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpcreposix $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 20746 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (); +int +main (void) +{ +regcomp (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:20765: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20768: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:20771: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20774: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_pcreposix_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_pcreposix_regcomp=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:20785: result: $ac_cv_lib_pcreposix_regcomp" >&5 +echo "${ECHO_T}$ac_cv_lib_pcreposix_regcomp" >&6 +if test $ac_cv_lib_pcreposix_regcomp = yes; then + +cat >>confdefs.h <<\EOF +#define HAVE_PCREPOSIX_H 1 +EOF + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lpcreposix; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +else + { { echo "$as_me:20810: error: Cannot find PCRE POSIX library" >&5 +echo "$as_me: error: Cannot find PCRE POSIX library" >&2;} + { (exit 1); exit 1; }; } +fi + +fi + + ;; + esac +fi + + if test "$with_pcre" = no ; then + +cf_regex_func=no + +cf_regex_libs="regex re" +case $host_os in +(mingw*) + cf_regex_libs="systre gnurx $cf_regex_libs" + ;; +esac + +echo "$as_me:20832: checking for regcomp" >&5 +echo $ECHO_N "checking for regcomp... $ECHO_C" >&6 +if test "${ac_cv_func_regcomp+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 20838 "configure" +#include "confdefs.h" +#define regcomp autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef regcomp + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_regcomp) || defined (__stub___regcomp) +#error found stub for regcomp +#endif + + return regcomp (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:20869: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20872: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:20875: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20878: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_regcomp=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_regcomp=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:20888: result: $ac_cv_func_regcomp" >&5 +echo "${ECHO_T}$ac_cv_func_regcomp" >&6 +if test $ac_cv_func_regcomp = yes; then + cf_regex_func=regcomp +else + + for cf_regex_lib in $cf_regex_libs + do + as_ac_Lib=`echo "ac_cv_lib_$cf_regex_lib''_regcomp" | $as_tr_sh` +echo "$as_me:20897: checking for regcomp in -l$cf_regex_lib" >&5 +echo $ECHO_N "checking for regcomp in -l$cf_regex_lib... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Lib+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-l$cf_regex_lib $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 20905 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char regcomp (); +int +main (void) +{ +regcomp (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:20924: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:20927: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:20930: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:20933: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Lib=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_Lib=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:20944: result: `eval echo '${'$as_ac_Lib'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Lib'}'`" >&6 +if test `eval echo '${'$as_ac_Lib'}'` = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -l$cf_regex_lib; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cf_regex_func=regcomp + break +fi + + done + +fi + +if test "$cf_regex_func" = no ; then + echo "$as_me:20973: checking for compile" >&5 +echo $ECHO_N "checking for compile... $ECHO_C" >&6 +if test "${ac_cv_func_compile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 20979 "configure" +#include "confdefs.h" +#define compile autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef compile + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char compile (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_compile) || defined (__stub___compile) +#error found stub for compile +#endif + + return compile (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:21010: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21013: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:21016: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21019: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_compile=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_func_compile=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:21029: result: $ac_cv_func_compile" >&5 +echo "${ECHO_T}$ac_cv_func_compile" >&6 +if test $ac_cv_func_compile = yes; then + cf_regex_func=compile +else + + echo "$as_me:21035: checking for compile in -lgen" >&5 +echo $ECHO_N "checking for compile in -lgen... $ECHO_C" >&6 +if test "${ac_cv_lib_gen_compile+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgen $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 21043 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char compile (); +int +main (void) +{ +compile (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:21062: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21065: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:21068: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21071: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_gen_compile=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_gen_compile=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:21082: result: $ac_cv_lib_gen_compile" >&5 +echo "${ECHO_T}$ac_cv_lib_gen_compile" >&6 +if test $ac_cv_lib_gen_compile = yes; then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lgen; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cf_regex_func=compile +fi + +fi + +fi + +if test "$cf_regex_func" = no ; then + { echo "$as_me:21110: WARNING: cannot find regular expression library" >&5 +echo "$as_me: WARNING: cannot find regular expression library" >&2;} +fi + +echo "$as_me:21114: checking for regular-expression headers" >&5 +echo $ECHO_N "checking for regular-expression headers... $ECHO_C" >&6 +if test "${cf_cv_regex_hdrs+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +cf_cv_regex_hdrs=no +case $cf_regex_func in +(compile) + for cf_regex_hdr in regexp.h regexpr.h + do + cat >conftest.$ac_ext <<_ACEOF +#line 21126 "configure" +#include "confdefs.h" +#include <$cf_regex_hdr> +int +main (void) +{ + + char *p = compile("", "", "", 0); + int x = step("", ""); + (void)p; + (void)x; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:21143: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21146: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:21149: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21152: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + cf_cv_regex_hdrs=$cf_regex_hdr + break + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done + ;; +(*) + for cf_regex_hdr in regex.h + do + cat >conftest.$ac_ext <<_ACEOF +#line 21169 "configure" +#include "confdefs.h" +#include +#include <$cf_regex_hdr> +int +main (void) +{ + + regex_t *p = 0; + int x = regcomp(p, "", 0); + int y = regexec(p, "", 0, 0, 0); + (void)x; + (void)y; + regfree(p); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:21189: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21192: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:21195: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21198: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + cf_cv_regex_hdrs=$cf_regex_hdr + break + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + done + ;; +esac + +fi +echo "$as_me:21214: result: $cf_cv_regex_hdrs" >&5 +echo "${ECHO_T}$cf_cv_regex_hdrs" >&6 + +case $cf_cv_regex_hdrs in + (no) { echo "$as_me:21218: WARNING: no regular expression header found" >&5 +echo "$as_me: WARNING: no regular expression header found" >&2;} ;; + (regex.h) +cat >>confdefs.h <<\EOF +#define HAVE_REGEX_H_FUNCS 1 +EOF + ;; + (regexp.h) +cat >>confdefs.h <<\EOF +#define HAVE_REGEXP_H_FUNCS 1 +EOF + ;; + (regexpr.h) +cat >>confdefs.h <<\EOF +#define HAVE_REGEXPR_H_FUNCS 1 +EOF + ;; +esac + + if test "X$cf_cv_regex_hdrs" != "Xregex.h" ; then + { { echo "$as_me:21238: error: Only POSIX, PCRE, or PCRE2 regular expressions are supported" >&5 +echo "$as_me: error: Only POSIX, PCRE, or PCRE2 regular expressions are supported" >&2;} + { (exit 1); exit 1; }; } + fi + fi + fi + +cat >>confdefs.h <<\EOF +#define OPT_SELECT_REGEX 1 +EOF + +fi + +echo "$as_me:21251: checking if you want support for right-scrollbar" >&5 +echo $ECHO_N "checking if you want support for right-scrollbar... $ECHO_C" >&6 + +# Check whether --enable-rightbar or --disable-rightbar was given. +if test "${enable_rightbar+set}" = set; then + enableval="$enable_rightbar" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_rightbar=no + else + enable_rightbar=yes + fi +else + enableval=yes + enable_rightbar=yes + +fi; +echo "$as_me:21268: result: $enable_rightbar" >&5 +echo "${ECHO_T}$enable_rightbar" >&6 +if test "$enable_rightbar" = yes ; then + +cat >>confdefs.h <<\EOF +#define SCROLLBAR_RIGHT 1 +EOF + +fi + +echo "$as_me:21278: checking if you want check for redundant name-change" >&5 +echo $ECHO_N "checking if you want check for redundant name-change... $ECHO_C" >&6 + +# Check whether --enable-samename or --disable-samename was given. +if test "${enable_samename+set}" = set; then + enableval="$enable_samename" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_samename=no + else + enable_samename=yes + fi +else + enableval=yes + enable_samename=yes + +fi; +echo "$as_me:21295: result: $enable_samename" >&5 +echo "${ECHO_T}$enable_samename" >&6 +test "$enable_samename" = no && +cat >>confdefs.h <<\EOF +#define OPT_SAME_NAME 0 +EOF + +echo "$as_me:21302: checking if you want support for selection-actions" >&5 +echo $ECHO_N "checking if you want support for selection-actions... $ECHO_C" >&6 + +# Check whether --enable-selection-ops or --disable-selection-ops was given. +if test "${enable_selection_ops+set}" = set; then + enableval="$enable_selection_ops" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_selection_ops=no + else + enable_selection_ops=yes + fi +else + enableval=yes + enable_selection_ops=yes + +fi; +echo "$as_me:21319: result: $enable_selection_ops" >&5 +echo "${ECHO_T}$enable_selection_ops" >&6 +test "$enable_selection_ops" = no && +cat >>confdefs.h <<\EOF +#define OPT_SELECTION_OPS 0 +EOF + +echo "$as_me:21326: checking if you want support for session management" >&5 +echo $ECHO_N "checking if you want support for session management... $ECHO_C" >&6 + +# Check whether --enable-session-mgt or --disable-session-mgt was given. +if test "${enable_session_mgt+set}" = set; then + enableval="$enable_session_mgt" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_session_mgt=no + else + enable_session_mgt=yes + fi +else + enableval=yes + enable_session_mgt=yes + +fi; +echo "$as_me:21343: result: $enable_session_mgt" >&5 +echo "${ECHO_T}$enable_session_mgt" >&6 +test "$enable_session_mgt" = no && +cat >>confdefs.h <<\EOF +#define OPT_SESSION_MGT 0 +EOF + +echo "$as_me:21350: checking if you want to use termcap function-keys" >&5 +echo $ECHO_N "checking if you want to use termcap function-keys... $ECHO_C" >&6 + +# Check whether --enable-tcap-fkeys or --disable-tcap-fkeys was given. +if test "${enable_tcap_fkeys+set}" = set; then + enableval="$enable_tcap_fkeys" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_tcap_fkeys=no + else + enable_tcap_fkeys=yes + fi +else + enableval=yes + enable_tcap_fkeys=yes + +fi; +echo "$as_me:21367: result: $enable_tcap_fkeys" >&5 +echo "${ECHO_T}$enable_tcap_fkeys" >&6 +test "$enable_tcap_fkeys" = yes && +cat >>confdefs.h <<\EOF +#define OPT_TCAP_FKEYS 1 +EOF + +echo "$as_me:21374: checking if you want to use termcap-query/report" >&5 +echo $ECHO_N "checking if you want to use termcap-query/report... $ECHO_C" >&6 + +# Check whether --enable-tcap-query or --disable-tcap-query was given. +if test "${enable_tcap_query+set}" = set; then + enableval="$enable_tcap_query" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_tcap_query=no + else + enable_tcap_query=yes + fi +else + enableval=yes + enable_tcap_query=yes + +fi; +echo "$as_me:21391: result: $enable_tcap_query" >&5 +echo "${ECHO_T}$enable_tcap_query" >&6 +test "$enable_tcap_query" = yes && +cat >>confdefs.h <<\EOF +#define OPT_TCAP_QUERY 1 +EOF + +echo "$as_me:21398: checking if you want support for tek4014" >&5 +echo $ECHO_N "checking if you want support for tek4014... $ECHO_C" >&6 + +# Check whether --enable-tek4014 or --disable-tek4014 was given. +if test "${enable_tek4014+set}" = set; then + enableval="$enable_tek4014" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_tek4014=no + else + enable_tek4014=yes + fi +else + enableval=yes + enable_tek4014=yes + +fi; +echo "$as_me:21415: result: $enable_tek4014" >&5 +echo "${ECHO_T}$enable_tek4014" >&6 +if test "$enable_tek4014" = no ; then + +cat >>confdefs.h <<\EOF +#define OPT_TEK4014 0 +EOF + +else + EXTRAHDRS="$EXTRAHDRS Tekparse.h" + EXTRASRCS="$EXTRASRCS TekPrsTbl.c Tekproc.c" + EXTRAOBJS="$EXTRAOBJS TekPrsTbl.o Tekproc.o" +fi + +echo "$as_me:21429: checking if you want pulldown menus with a toolbar" >&5 +echo $ECHO_N "checking if you want pulldown menus with a toolbar... $ECHO_C" >&6 + +# Check whether --enable-toolbar or --disable-toolbar was given. +if test "${enable_toolbar+set}" = set; then + enableval="$enable_toolbar" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_toolbar=yes + else + enable_toolbar=no + fi +else + enableval=no + enable_toolbar=no + +fi; +echo "$as_me:21446: result: $enable_toolbar" >&5 +echo "${ECHO_T}$enable_toolbar" >&6 +if test "$enable_toolbar" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_TOOLBAR 1 +EOF + +fi + +echo "$as_me:21456: checking if you want VT52 emulation" >&5 +echo $ECHO_N "checking if you want VT52 emulation... $ECHO_C" >&6 + +# Check whether --enable-vt52 or --disable-vt52 was given. +if test "${enable_vt52+set}" = set; then + enableval="$enable_vt52" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_vt52=no + else + enable_vt52=yes + fi +else + enableval=yes + enable_vt52=yes + +fi; +echo "$as_me:21473: result: $enable_vt52" >&5 +echo "${ECHO_T}$enable_vt52" >&6 +test "$enable_vt52" = no && +cat >>confdefs.h <<\EOF +#define OPT_VT52_MODE 0 +EOF + +echo "$as_me:21480: checking if you want wide-attribute support" >&5 +echo $ECHO_N "checking if you want wide-attribute support... $ECHO_C" >&6 + +# Check whether --enable-wide-attrs or --disable-wide-attrs was given. +if test "${enable_wide_attrs+set}" = set; then + enableval="$enable_wide_attrs" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_wattr=no + else + enable_wattr=yes + fi +else + enableval=yes + enable_wattr=yes + +fi; +echo "$as_me:21497: result: $enable_wattr" >&5 +echo "${ECHO_T}$enable_wattr" >&6 + +if test x$enable_wattr = xno && test x$enable_direct_color = xyes ; then + { echo "$as_me:21501: WARNING: overriding wide-attributes to support direct color" >&5 +echo "$as_me: WARNING: overriding wide-attributes to support direct color" >&2;} + enable_wattr=yes +fi + +echo "$as_me:21506: checking if you want wide-character support" >&5 +echo $ECHO_N "checking if you want wide-character support... $ECHO_C" >&6 + +# Check whether --enable-wide-chars or --disable-wide-chars was given. +if test "${enable_wide_chars+set}" = set; then + enableval="$enable_wide_chars" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_wchar=no + else + enable_wchar=yes + fi +else + enableval=yes + enable_wchar=yes + +fi; +echo "$as_me:21523: result: $enable_wchar" >&5 +echo "${ECHO_T}$enable_wchar" >&6 +test "x$enable_wattr" = xno && +cat >>confdefs.h <<\EOF +#define OPT_WIDE_ATTRS 0 +EOF + +echo "$as_me:21530: checking if you want only 16-bit character support" >&5 +echo $ECHO_N "checking if you want only 16-bit character support... $ECHO_C" >&6 + +# Check whether --enable-16bit-chars or --disable-16bit-chars was given. +if test "${enable_16bit_chars+set}" = set; then + enableval="$enable_16bit_chars" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_16bit_chars=yes + else + enable_16bit_chars=no + fi +else + enableval=no + enable_16bit_chars=no + +fi; +echo "$as_me:21547: result: $enable_16bit_chars" >&5 +echo "${ECHO_T}$enable_16bit_chars" >&6 + +if test "$enable_16bit_chars" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_WIDER_ICHAR 0 +EOF + + enable_wchar=yes +fi + +if test "$enable_wchar" = yes ; then + +echo "$as_me:21561: checking if you want to use mini-luit/Latin9 built-in support" >&5 +echo $ECHO_N "checking if you want to use mini-luit/Latin9 built-in support... $ECHO_C" >&6 + +# Check whether --enable-mini-luit or --disable-mini-luit was given. +if test "${enable_mini_luit+set}" = set; then + enableval="$enable_mini_luit" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_mini_luit=yes + else + enable_mini_luit=no + fi +else + enableval=no + enable_mini_luit=no + +fi; +echo "$as_me:21578: result: $enable_mini_luit" >&5 +echo "${ECHO_T}$enable_mini_luit" >&6 +if test "$enable_mini_luit" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_MINI_LUIT 1 +EOF + +fi + +echo "$as_me:21588: checking if you want to use luit" >&5 +echo $ECHO_N "checking if you want to use luit... $ECHO_C" >&6 + +# Check whether --enable-luit or --disable-luit was given. +if test "${enable_luit+set}" = set; then + enableval="$enable_luit" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_luit=no + else + enable_luit=yes + fi +else + enableval=yes + enable_luit=yes + +fi; +echo "$as_me:21605: result: $enable_luit" >&5 +echo "${ECHO_T}$enable_luit" >&6 +if test "$enable_luit" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_LUIT_PROG 1 +EOF + +test -z "$LUIT" && LUIT=xterm-filter +for ac_prog in $LUIT xterm-filter bluit luit +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 "$as_me:21618: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_LUIT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $LUIT in + [\\/]* | ?:[\\/]*) + ac_cv_path_LUIT="$LUIT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + if $as_executable_p "$ac_dir/$ac_word"; then + ac_cv_path_LUIT="$ac_dir/$ac_word" + echo "$as_me:21635: found $ac_dir/$ac_word" >&5 + break +fi +done + + ;; +esac +fi +LUIT=$ac_cv_path_LUIT + +if test -n "$LUIT"; then + echo "$as_me:21646: result: $LUIT" >&5 +echo "${ECHO_T}$LUIT" >&6 +else + echo "$as_me:21649: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LUIT" && break +done +test -n "$LUIT" || LUIT="$LUIT" + +cf_path_prog="" +cf_path_args="" +IFS="${IFS:- }"; cf_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR" +for cf_temp in $ac_cv_path_LUIT +do + if test -z "$cf_path_prog" ; then + if test "$with_full_paths" = yes ; then + +if test "x$prefix" != xNONE; then + cf_path_syntax="$prefix" +else + cf_path_syntax="$ac_default_prefix" +fi + +case ".$cf_temp" in +(.\$\(*\)*|.\'*\'*) + ;; +(..|./*|.\\*) + ;; +(.[a-zA-Z]:[\\/]*) # OS/2 EMX + ;; +(.\${*prefix}*|.\${*dir}*) + eval cf_temp="$cf_temp" + case ".$cf_temp" in + (.NONE/*) + cf_temp=`echo $cf_temp | sed -e s%NONE%$cf_path_syntax%` + ;; + esac + ;; +(.no|.NONE/*) + cf_temp=`echo $cf_temp | sed -e s%NONE%$cf_path_syntax%` + ;; +(*) + break + ;; +esac + + cf_path_prog="$cf_temp" + else + cf_path_prog="`basename $cf_temp`" + fi + elif test -z "$cf_path_args" ; then + cf_path_args="$cf_temp" + else + cf_path_args="$cf_path_args $cf_temp" + fi +done +IFS="$cf_save_ifs" + +if test -n "$cf_path_prog" ; then + +echo "${as_me:-configure}:21708: testing defining path for ${cf_path_prog} ..." 1>&5 + +cat >>confdefs.h <>confdefs.h <>confdefs.h <<\EOF +#define OPT_WIDE_CHARS 1 +EOF + + EXTRAHDRS="$EXTRAHDRS charclass.h precompose.h wcwidth.h" + EXTRASRCS="$EXTRASRCS charclass.c precompose.c wcwidth.c" + EXTRAOBJS="$EXTRAOBJS charclass.o precompose.o wcwidth.o" +fi + +echo "$as_me:21732: checking if you want dynamic-abbreviation support" >&5 +echo $ECHO_N "checking if you want dynamic-abbreviation support... $ECHO_C" >&6 + +# Check whether --enable-dabbrev or --disable-dabbrev was given. +if test "${enable_dabbrev+set}" = set; then + enableval="$enable_dabbrev" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_dabbrev=yes + else + enable_dabbrev=no + fi +else + enableval=no + enable_dabbrev=no + +fi; +echo "$as_me:21749: result: $enable_dabbrev" >&5 +echo "${ECHO_T}$enable_dabbrev" >&6 +if test "$enable_dabbrev" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_DABBREV 1 +EOF + +fi + +echo "$as_me:21759: checking if you want DECterm Locator support" >&5 +echo $ECHO_N "checking if you want DECterm Locator support... $ECHO_C" >&6 + +# Check whether --enable-dec-locator or --disable-dec-locator was given. +if test "${enable_dec_locator+set}" = set; then + enableval="$enable_dec_locator" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_dec_locator=yes + else + enable_dec_locator=no + fi +else + enableval=no + enable_dec_locator=no + +fi; +echo "$as_me:21776: result: $enable_dec_locator" >&5 +echo "${ECHO_T}$enable_dec_locator" >&6 +if test "$enable_dec_locator" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_DEC_LOCATOR 1 +EOF + +fi + +echo "$as_me:21786: checking if you want XHTML and SVG screen dump support" >&5 +echo $ECHO_N "checking if you want XHTML and SVG screen dump support... $ECHO_C" >&6 + +# Check whether --enable-screen-dumps or --disable-screen-dumps was given. +if test "${enable_screen_dumps+set}" = set; then + enableval="$enable_screen_dumps" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_screen_dumps=no + else + enable_screen_dumps=yes + fi +else + enableval=yes + enable_screen_dumps=yes + +fi; +echo "$as_me:21803: result: $enable_screen_dumps" >&5 +echo "${ECHO_T}$enable_screen_dumps" >&6 +if test "$enable_screen_dumps" = yes ; then + EXTRASRCS="$EXTRASRCS html.c svg.c" + EXTRAOBJS="$EXTRAOBJS html.o svg.o" +else + +cat >>confdefs.h <<\EOF +#define OPT_SCREEN_DUMPS 0 +EOF + +fi + +echo "$as_me:21816: checking if you want ReGIS graphics support" >&5 +echo $ECHO_N "checking if you want ReGIS graphics support... $ECHO_C" >&6 + +# Check whether --enable-regis-graphics or --disable-regis-graphics was given. +if test "${enable_regis_graphics+set}" = set; then + enableval="$enable_regis_graphics" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_regis_graphics=yes + else + enable_regis_graphics=no + fi +else + enableval=no + enable_regis_graphics=no + +fi; +echo "$as_me:21833: result: $enable_regis_graphics" >&5 +echo "${ECHO_T}$enable_regis_graphics" >&6 +if test "$enable_regis_graphics" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_REGIS_GRAPHICS 1 +EOF + + EXTRAHDRS="$EXTRAHDRS graphics_regis.h" + EXTRASRCS="$EXTRASRCS graphics_regis.c" + EXTRAOBJS="$EXTRAOBJS graphics_regis.o" + +echo "$as_me:21845: checking if -lm needed for math functions" >&5 +echo $ECHO_N "checking if -lm needed for math functions... $ECHO_C" >&6 +if test "${cf_cv_need_libm+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 21852 "configure" +#include "confdefs.h" + + #include + #include + #include + +int +main (void) +{ +double x = rand(); printf("result = %g\n", sin(x)) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:21868: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:21871: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:21874: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:21877: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_cv_need_libm=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_cv_need_libm=yes +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:21887: result: $cf_cv_need_libm" >&5 +echo "${ECHO_T}$cf_cv_need_libm" >&6 +if test "$cf_cv_need_libm" = yes +then + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in -lm; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + +fi + +fi + +echo "$as_me:21912: checking if you want sixel graphics support" >&5 +echo $ECHO_N "checking if you want sixel graphics support... $ECHO_C" >&6 + +# Check whether --enable-sixel-graphics or --disable-sixel-graphics was given. +if test "${enable_sixel_graphics+set}" = set; then + enableval="$enable_sixel_graphics" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_sixel_graphics=no + else + enable_sixel_graphics=yes + fi +else + enableval=yes + enable_sixel_graphics=yes + +fi; +echo "$as_me:21929: result: $enable_sixel_graphics" >&5 +echo "${ECHO_T}$enable_sixel_graphics" >&6 +if test "$enable_sixel_graphics" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_SIXEL_GRAPHICS 1 +EOF + + EXTRAHDRS="$EXTRAHDRS graphics_sixel.h" + EXTRASRCS="$EXTRASRCS graphics_sixel.c" + EXTRAOBJS="$EXTRAOBJS graphics_sixel.o" +fi + +if test "$enable_regis_graphics" = yes || test "$enable_sixel_graphics" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_GRAPHICS 1 +EOF + + EXTRAHDRS="$EXTRAHDRS graphics.h" + EXTRASRCS="$EXTRASRCS graphics.c" + EXTRAOBJS="$EXTRAOBJS graphics.o" +fi + +echo "$as_me:21953: checking if you want VT420 rectangle support" >&5 +echo $ECHO_N "checking if you want VT420 rectangle support... $ECHO_C" >&6 + +# Check whether --enable-rectangles or --disable-rectangles was given. +if test "${enable_rectangles+set}" = set; then + enableval="$enable_rectangles" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_rectangles=no + else + enable_rectangles=yes + fi +else + enableval=yes + enable_rectangles=yes + +fi; +echo "$as_me:21970: result: $enable_rectangles" >&5 +echo "${ECHO_T}$enable_rectangles" >&6 +if test "$enable_rectangles" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_DEC_RECTOPS 1 +EOF + +fi + +echo "$as_me:21980: checking if you want -ziconbeep option" >&5 +echo $ECHO_N "checking if you want -ziconbeep option... $ECHO_C" >&6 + +# Check whether --enable-ziconbeep or --disable-ziconbeep was given. +if test "${enable_ziconbeep+set}" = set; then + enableval="$enable_ziconbeep" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + enable_ziconbeep=no + else + enable_ziconbeep=yes + fi +else + enableval=yes + enable_ziconbeep=yes + +fi; +echo "$as_me:21997: result: $enable_ziconbeep" >&5 +echo "${ECHO_T}$enable_ziconbeep" >&6 +test "$enable_ziconbeep" = no && +cat >>confdefs.h <<\EOF +#define OPT_ZICONBEEP 0 +EOF + +############################################################################### + +echo "$as_me:22006: checking if you want debugging traces" >&5 +echo $ECHO_N "checking if you want debugging traces... $ECHO_C" >&6 + +# Check whether --enable-trace or --disable-trace was given. +if test "${enable_trace+set}" = set; then + enableval="$enable_trace" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_trace=yes + else + enable_trace=no + fi +else + enableval=no + enable_trace=no + +fi; +echo "$as_me:22023: result: $enable_trace" >&5 +echo "${ECHO_T}$enable_trace" >&6 +if test "$enable_trace" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_TRACE 1 +EOF + + EXTRASRCS="$EXTRASRCS trace.c" + EXTRAOBJS="$EXTRAOBJS trace.o" +fi + +echo "$as_me:22035: checking if you want to use dmalloc for testing" >&5 +echo $ECHO_N "checking if you want to use dmalloc for testing... $ECHO_C" >&6 + +# Check whether --with-dmalloc or --without-dmalloc was given. +if test "${with_dmalloc+set}" = set; then + withval="$with_dmalloc" + +cat >>confdefs.h <&5 +echo "${ECHO_T}${with_dmalloc:-no}" >&6 + +case .$with_cflags in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + esac + ;; +esac + +if test "$with_dmalloc" = yes ; then + echo "$as_me:22166: checking for dmalloc.h" >&5 +echo $ECHO_N "checking for dmalloc.h... $ECHO_C" >&6 +if test "${ac_cv_header_dmalloc_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 22172 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:22176: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:22182: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_dmalloc_h=yes +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_header_dmalloc_h=no +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:22201: result: $ac_cv_header_dmalloc_h" >&5 +echo "${ECHO_T}$ac_cv_header_dmalloc_h" >&6 +if test $ac_cv_header_dmalloc_h = yes; then + +echo "$as_me:22205: checking for dmalloc_debug in -ldmalloc" >&5 +echo $ECHO_N "checking for dmalloc_debug in -ldmalloc... $ECHO_C" >&6 +if test "${ac_cv_lib_dmalloc_dmalloc_debug+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldmalloc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 22213 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char dmalloc_debug (); +int +main (void) +{ +dmalloc_debug (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:22232: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22235: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:22238: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22241: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dmalloc_dmalloc_debug=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_dmalloc_dmalloc_debug=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:22252: result: $ac_cv_lib_dmalloc_dmalloc_debug" >&5 +echo "${ECHO_T}$ac_cv_lib_dmalloc_dmalloc_debug" >&6 +if test $ac_cv_lib_dmalloc_dmalloc_debug = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use dbmalloc for testing... $ECHO_C" >&6 + +# Check whether --with-dbmalloc or --without-dbmalloc was given. +if test "${with_dbmalloc+set}" = set; then + withval="$with_dbmalloc" + +cat >>confdefs.h <&5 +echo "${ECHO_T}${with_dbmalloc:-no}" >&6 + +case .$with_cflags in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + esac + ;; +esac + +if test "$with_dbmalloc" = yes ; then + echo "$as_me:22398: checking for dbmalloc.h" >&5 +echo $ECHO_N "checking for dbmalloc.h... $ECHO_C" >&6 +if test "${ac_cv_header_dbmalloc_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 22404 "configure" +#include "confdefs.h" +#include +_ACEOF +if { (eval echo "$as_me:22408: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + egrep -v '^ *\+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:22414: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_cv_header_dbmalloc_h=yes +else + echo "$as_me: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_header_dbmalloc_h=no +fi +rm -f conftest.err conftest.$ac_ext +fi +echo "$as_me:22433: result: $ac_cv_header_dbmalloc_h" >&5 +echo "${ECHO_T}$ac_cv_header_dbmalloc_h" >&6 +if test $ac_cv_header_dbmalloc_h = yes; then + +echo "$as_me:22437: checking for debug_malloc in -ldbmalloc" >&5 +echo $ECHO_N "checking for debug_malloc in -ldbmalloc... $ECHO_C" >&6 +if test "${ac_cv_lib_dbmalloc_debug_malloc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldbmalloc $LIBS" +cat >conftest.$ac_ext <<_ACEOF +#line 22445 "configure" +#include "confdefs.h" + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char debug_malloc (); +int +main (void) +{ +debug_malloc (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:22464: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22467: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:22470: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22473: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_dbmalloc_debug_malloc=yes +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +ac_cv_lib_dbmalloc_debug_malloc=no +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:22484: result: $ac_cv_lib_dbmalloc_debug_malloc" >&5 +echo "${ECHO_T}$ac_cv_lib_dbmalloc_debug_malloc" >&6 +if test $ac_cv_lib_dbmalloc_debug_malloc = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to use valgrind for testing... $ECHO_C" >&6 + +# Check whether --with-valgrind or --without-valgrind was given. +if test "${with_valgrind+set}" = set; then + withval="$with_valgrind" + +cat >>confdefs.h <&5 +echo "${ECHO_T}${with_valgrind:-no}" >&6 + +case .$with_cflags in +(.*-g*) + case .$CFLAGS in + (.*-g*) + ;; + (*) + +cf_fix_cppflags=no +cf_new_cflags= +cf_new_cppflags= +cf_new_extra_cppflags= + +for cf_add_cflags in -g +do +case $cf_fix_cppflags in +(no) + case $cf_add_cflags in + (-undef|-nostdinc*|-I*|-D*|-U*|-E|-P|-C) + case $cf_add_cflags in + (-D*) + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^-D[^=]*='\''\"[^"]*//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=yes + + if test $cf_fix_cppflags = yes ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + elif test "${cf_tst_cflags}" = "\"'" ; then + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + continue + fi + ;; + esac + case "$CPPFLAGS" in + (*$cf_add_cflags) + ;; + (*) + case $cf_add_cflags in + (-D*) + cf_tst_cppflags=`echo "x$cf_add_cflags" | sed -e 's/^...//' -e 's/=.*//'` + +CPPFLAGS=`echo "$CPPFLAGS" | \ + sed -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?[ ]/ /g' \ + -e 's/-[UD]'"$cf_tst_cppflags"'\(=[^ ]*\)\?$//g'` + + ;; + esac + + test -n "$cf_new_cppflags" && cf_new_cppflags="$cf_new_cppflags " + cf_new_cppflags="${cf_new_cppflags}$cf_add_cflags" + + ;; + esac + ;; + (*) + + test -n "$cf_new_cflags" && cf_new_cflags="$cf_new_cflags " + cf_new_cflags="${cf_new_cflags}$cf_add_cflags" + + ;; + esac + ;; +(yes) + + test -n "$cf_new_extra_cppflags" && cf_new_extra_cppflags="$cf_new_extra_cppflags " + cf_new_extra_cppflags="${cf_new_extra_cppflags}$cf_add_cflags" + + cf_tst_cflags=`echo ${cf_add_cflags} |sed -e 's/^[^"]*"'\''//'` + + test "x${cf_add_cflags}" != "x${cf_tst_cflags}" \ + && test -z "${cf_tst_cflags}" \ + && cf_fix_cppflags=no + ;; +esac +done + +if test -n "$cf_new_cflags" ; then + + test -n "$CFLAGS" && CFLAGS="$CFLAGS " + CFLAGS="${CFLAGS}$cf_new_cflags" + +fi + +if test -n "$cf_new_cppflags" ; then + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}$cf_new_cppflags" + +fi + +if test -n "$cf_new_extra_cppflags" ; then + + test -n "$EXTRA_CPPFLAGS" && EXTRA_CPPFLAGS="$EXTRA_CPPFLAGS " + EXTRA_CPPFLAGS="${EXTRA_CPPFLAGS}$cf_new_extra_cppflags" + +fi + + ;; + esac + ;; +esac + +echo "$as_me:22629: checking if you want to perform memory-leak testing" >&5 +echo $ECHO_N "checking if you want to perform memory-leak testing... $ECHO_C" >&6 + +# Check whether --enable-leaks or --disable-leaks was given. +if test "${enable_leaks+set}" = set; then + enableval="$enable_leaks" + if test "x$enableval" = xno; then with_no_leaks=yes; else with_no_leaks=no; fi +else + : ${with_no_leaks:=no} +fi; +echo "$as_me:22639: result: $with_no_leaks" >&5 +echo "${ECHO_T}$with_no_leaks" >&6 + +if test "$with_no_leaks" = yes ; then + +cat >>confdefs.h <<\EOF +#define NO_LEAKS 1 +EOF + +cat >>confdefs.h <<\EOF +#define YY_NO_LEAKS 1 +EOF + +fi + +echo "$as_me:22654: checking if you want to see long compiling messages" >&5 +echo $ECHO_N "checking if you want to see long compiling messages... $ECHO_C" >&6 + +# Check whether --enable-echo or --disable-echo was given. +if test "${enable_echo+set}" = set; then + enableval="$enable_echo" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + + ECHO_LT='--silent' + ECHO_LD='@echo linking $@;' + RULE_CC='@echo compiling $<' + SHOW_CC='@echo compiling $@' + ECHO_CC='@' + + else + + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' + + fi +else + enableval=yes + + ECHO_LT='' + ECHO_LD='' + RULE_CC='' + SHOW_CC='' + ECHO_CC='' + +fi; +echo "$as_me:22688: result: $enableval" >&5 +echo "${ECHO_T}$enableval" >&6 + +echo "$as_me:22691: checking if you want magic cookie emulation" >&5 +echo $ECHO_N "checking if you want magic cookie emulation... $ECHO_C" >&6 + +# Check whether --enable-xmc-glitch or --disable-xmc-glitch was given. +if test "${enable_xmc_glitch+set}" = set; then + enableval="$enable_xmc_glitch" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + enable_xmc=yes + else + enable_xmc=no + fi +else + enableval=no + enable_xmc=no + +fi; +echo "$as_me:22708: result: $enable_xmc" >&5 +echo "${ECHO_T}$enable_xmc" >&6 +if test "$enable_xmc" = yes ; then + +cat >>confdefs.h <<\EOF +#define OPT_XMC_GLITCH 1 +EOF + + EXTRASRCS="$EXTRASRCS testxmc.c" + EXTRAOBJS="$EXTRAOBJS testxmc.o" +fi + +for ac_func in tigetstr +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:22723: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 22729 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:22760: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22763: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:22766: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22769: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:22779: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +#line 22800 "configure" +#include "confdefs.h" +#define $ac_func autoconf_temporary +#include /* least-intrusive standard header which defines gcc2 __stub macros */ +#undef $ac_func + +#ifdef __cplusplus +extern "C" +#endif + +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (void); + +int +main (void) +{ + +/* The GNU C library defines stubs 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_$ac_func) || defined (__stub___$ac_func) +#error found stub for $ac_func +#endif + + return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:22831: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:22834: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:22837: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:22840: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +eval "$as_ac_var=no" +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:22850: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <&5 +echo $ECHO_N "checking if you want to turn on gcc warnings... $ECHO_C" >&6 + +# Check whether --enable-warnings or --disable-warnings was given. +if test "${enable_warnings+set}" = set; then + enableval="$enable_warnings" + test "$enableval" != yes && enableval=no + if test "$enableval" != "no" ; then + with_warnings=yes + else + with_warnings=no + fi +else + enableval=no + with_warnings=no + +fi; +echo "$as_me:22880: result: $with_warnings" >&5 +echo "${ECHO_T}$with_warnings" >&6 +if test "$with_warnings" = yes +then + +if test "$GCC" = yes +then +cat > conftest.i <&5 +echo "$as_me: checking for $CC __attribute__ directives..." >&6;} +cat > conftest.$ac_ext <&5 + + case $cf_attribute in + (printf) + cf_printf_attribute=yes + cat >conftest.h <conftest.h <conftest.h <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:22958: \$? = $ac_status" >&5 + (exit $ac_status); }; then + test -n "$verbose" && echo "$as_me:22960: result: ... $cf_attribute" >&5 +echo "${ECHO_T}... $cf_attribute" >&6 + cat conftest.h >>confdefs.h + case $cf_attribute in + (noreturn) + +cat >>confdefs.h <>confdefs.h <<\EOF +#define GCC_PRINTF 1 +EOF + + fi + +cat >>confdefs.h <>confdefs.h <<\EOF +#define GCC_SCANF 1 +EOF + + fi + +cat >>confdefs.h <>confdefs.h <>confdefs.h +fi +rm -rf conftest* +fi + +if test "x$have_x" = xyes; then + +cf_save_LIBS_CF_CONST_X_STRING="$LIBS" +cf_save_CFLAGS_CF_CONST_X_STRING="$CFLAGS" +cf_save_CPPFLAGS_CF_CONST_X_STRING="$CPPFLAGS" +LIBS="$LIBS ${X_PRE_LIBS} ${X_LIBS} ${X_EXTRA_LIBS}" +for cf_X_CFLAGS in $X_CFLAGS +do + case "x$cf_X_CFLAGS" in + x-[IUD]*) + CPPFLAGS="$CPPFLAGS $cf_X_CFLAGS" + ;; + *) + CFLAGS="$CFLAGS $cf_X_CFLAGS" + ;; + esac +done + +cat >conftest.$ac_ext <<_ACEOF +#line 23038 "configure" +#include "confdefs.h" + +#include +#include + +int +main (void) +{ +String foo = malloc(1); (void)foo + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:23053: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:23056: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:23059: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23062: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + +echo "$as_me:23065: checking for X11/Xt const-feature" >&5 +echo $ECHO_N "checking for X11/Xt const-feature... $ECHO_C" >&6 +if test "${cf_cv_const_x_string+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +#line 23072 "configure" +#include "confdefs.h" + +#define _CONST_X_STRING /* X11R7.8 (perhaps) */ +#undef XTSTRINGDEFINES /* X11R5 and later */ +#include +#include + +int +main (void) +{ +String foo = malloc(1); *foo = 0 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:23089: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:23092: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:23095: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23098: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + cf_cv_const_x_string=no + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 + + cf_cv_const_x_string=yes + +fi +rm -f conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:23113: result: $cf_cv_const_x_string" >&5 +echo "${ECHO_T}$cf_cv_const_x_string" >&6 + +LIBS="$cf_save_LIBS_CF_CONST_X_STRING" +CFLAGS="$cf_save_CFLAGS_CF_CONST_X_STRING" +CPPFLAGS="$cf_save_CPPFLAGS_CF_CONST_X_STRING" + +case $cf_cv_const_x_string in +(no) + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-DXTSTRINGDEFINES" + + ;; +(*) + + test -n "$CPPFLAGS" && CPPFLAGS="$CPPFLAGS " + CPPFLAGS="${CPPFLAGS}-D_CONST_X_STRING" + + ;; +esac + +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest.$ac_ext + fi +cat > conftest.$ac_ext <&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CFLAGS="$CFLAGS" + EXTRA_CFLAGS="-Wall" + for cf_opt in \ + wd1419 \ + wd1683 \ + wd1684 \ + wd193 \ + wd593 \ + wd279 \ + wd810 \ + wd869 \ + wd981 + do + CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt" + if { (eval echo "$as_me:23174: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:23177: \$? = $ac_status" >&5 + (exit $ac_status); }; then + test -n "$verbose" && echo "$as_me:23179: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt" + fi + done + CFLAGS="$cf_save_CFLAGS" +elif test "$GCC" = yes && test "$GCC_VERSION" != "unknown" +then + { echo "$as_me:23187: checking for $CC warning options..." >&5 +echo "$as_me: checking for $CC warning options..." >&6;} + cf_save_CFLAGS="$CFLAGS" + EXTRA_CFLAGS= + cf_warn_CONST="" + test "$with_ext_const" = yes && cf_warn_CONST="Wwrite-strings" + cf_gcc_warnings="Wignored-qualifiers Wlogical-op Wvarargs" + test "x$CLANG_COMPILER" = xyes && cf_gcc_warnings= + for cf_opt in W Wall \ + Wbad-function-cast \ + Wcast-align \ + Wcast-qual \ + Wdeclaration-after-statement \ + Wextra \ + Winline \ + Wmissing-declarations \ + Wmissing-prototypes \ + Wnested-externs \ + Wpointer-arith \ + Wshadow \ + Wstrict-prototypes \ + Wundef Wno-inline $cf_gcc_warnings $cf_warn_CONST Wdeclaration-after-statement Wextra Wno-unknown-pragmas Wswitch-enum Wno-cast-qual + do + CFLAGS="$cf_save_CFLAGS $EXTRA_CFLAGS -$cf_opt" + if { (eval echo "$as_me:23211: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:23214: \$? = $ac_status" >&5 + (exit $ac_status); }; then + test -n "$verbose" && echo "$as_me:23216: result: ... -$cf_opt" >&5 +echo "${ECHO_T}... -$cf_opt" >&6 + case $cf_opt in + (Winline) + case $GCC_VERSION in + ([34].*) + test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6 + +echo "${as_me:-configure}:23224: testing feature is broken in gcc $GCC_VERSION ..." 1>&5 + + continue;; + esac + ;; + (Wpointer-arith) + case $GCC_VERSION in + ([12].*) + test -n "$verbose" && echo " feature is broken in gcc $GCC_VERSION" 1>&6 + +echo "${as_me:-configure}:23234: testing feature is broken in gcc $GCC_VERSION ..." 1>&5 + + continue;; + esac + ;; + esac + EXTRA_CFLAGS="$EXTRA_CFLAGS -$cf_opt" + fi + done + CFLAGS="$cf_save_CFLAGS" +fi +rm -rf conftest* + +fi +fi + +test "$disable_setuid" = yes && +cat >>confdefs.h <<\EOF +#define DISABLE_SETUID 1 +EOF + +test "$disable_setgid" = yes && +cat >>confdefs.h <<\EOF +#define DISABLE_SETGID 1 +EOF + +if test $disable_setuid = yes ; then + MAY_SETUID="#" + NOT_SETUID= +elif test $disable_setgid = yes ; then + MAY_SETUID="#" + NOT_SETUID= +else + MAY_SETUID= + NOT_SETUID="#" +fi + +### remove from CPPFLAGS the optional features we define in xtermcfg.h +### or other conflicting symbols that may be defined via imake: +for cf_def in \ + __STDC__ \ + ALLOWLOGGING \ + ALLOWLOGFILEEXEC \ + OPT_LUIT_PROG \ + OPT_WIDE_CHARS \ + SCROLLBAR_RIGHT \ + USE_TTY_GROUP \ + USE_UTEMPTER \ + XRENDERFONT +do + CPPFLAGS=`echo "$CPPFLAGS" | sed -e s/-D$cf_def//` +done + +echo "$as_me:23287: checking if filesystem supports mixed-case filenames" >&5 +echo $ECHO_N "checking if filesystem supports mixed-case filenames... $ECHO_C" >&6 +if test "${cf_cv_mixedcase+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + +if test "$cross_compiling" = yes ; then + case $target_alias in + (*-os2-emx*|*-msdosdjgpp*|*-cygwin*|*-msys*|*-mingw*|*-uwin*) + cf_cv_mixedcase=no + ;; + (*) + cf_cv_mixedcase=yes + ;; + esac +else + rm -f conftest CONFTEST + echo test >conftest + if test -f CONFTEST ; then + cf_cv_mixedcase=no + else + cf_cv_mixedcase=yes + fi + rm -f conftest CONFTEST +fi + +fi +echo "$as_me:23314: result: $cf_cv_mixedcase" >&5 +echo "${ECHO_T}$cf_cv_mixedcase" >&6 +test "$cf_cv_mixedcase" = yes && +cat >>confdefs.h <<\EOF +#define MIXEDCASE_FILENAMES 1 +EOF + +for ac_prog in exctags ctags +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 "$as_me:23325: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CTAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CTAGS"; then + ac_cv_prog_CTAGS="$CTAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_CTAGS="$ac_prog" +echo "$as_me:23340: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +CTAGS=$ac_cv_prog_CTAGS +if test -n "$CTAGS"; then + echo "$as_me:23348: result: $CTAGS" >&5 +echo "${ECHO_T}$CTAGS" >&6 +else + echo "$as_me:23351: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CTAGS" && break +done + +for ac_prog in exetags etags +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 "$as_me:23362: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ETAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ETAGS"; then + ac_cv_prog_ETAGS="$ETAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_ETAGS="$ac_prog" +echo "$as_me:23377: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +ETAGS=$ac_cv_prog_ETAGS +if test -n "$ETAGS"; then + echo "$as_me:23385: result: $ETAGS" >&5 +echo "${ECHO_T}$ETAGS" >&6 +else + echo "$as_me:23388: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ETAGS" && break +done + +# Extract the first word of "${CTAGS:-ctags}", so it can be a program name with args. +set dummy ${CTAGS:-ctags}; ac_word=$2 +echo "$as_me:23397: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MAKE_LOWER_TAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKE_LOWER_TAGS"; then + ac_cv_prog_MAKE_LOWER_TAGS="$MAKE_LOWER_TAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_MAKE_LOWER_TAGS="yes" +echo "$as_me:23412: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_MAKE_LOWER_TAGS" && ac_cv_prog_MAKE_LOWER_TAGS="no" +fi +fi +MAKE_LOWER_TAGS=$ac_cv_prog_MAKE_LOWER_TAGS +if test -n "$MAKE_LOWER_TAGS"; then + echo "$as_me:23421: result: $MAKE_LOWER_TAGS" >&5 +echo "${ECHO_T}$MAKE_LOWER_TAGS" >&6 +else + echo "$as_me:23424: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +if test "$cf_cv_mixedcase" = yes ; then + # Extract the first word of "${ETAGS:-etags}", so it can be a program name with args. +set dummy ${ETAGS:-etags}; ac_word=$2 +echo "$as_me:23431: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_MAKE_UPPER_TAGS+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$MAKE_UPPER_TAGS"; then + ac_cv_prog_MAKE_UPPER_TAGS="$MAKE_UPPER_TAGS" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_MAKE_UPPER_TAGS="yes" +echo "$as_me:23446: found $ac_dir/$ac_word" >&5 +break +done + + test -z "$ac_cv_prog_MAKE_UPPER_TAGS" && ac_cv_prog_MAKE_UPPER_TAGS="no" +fi +fi +MAKE_UPPER_TAGS=$ac_cv_prog_MAKE_UPPER_TAGS +if test -n "$MAKE_UPPER_TAGS"; then + echo "$as_me:23455: result: $MAKE_UPPER_TAGS" >&5 +echo "${ECHO_T}$MAKE_UPPER_TAGS" >&6 +else + echo "$as_me:23458: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +else + MAKE_UPPER_TAGS=no +fi + +if test "$MAKE_UPPER_TAGS" = yes ; then + MAKE_UPPER_TAGS= +else + MAKE_UPPER_TAGS="#" +fi + +if test "$MAKE_LOWER_TAGS" = yes ; then + MAKE_LOWER_TAGS= +else + MAKE_LOWER_TAGS="#" +fi + +LD_RPATH_OPT= +if test "x$cf_cv_enable_rpath" != xno +then + echo "$as_me:23481: checking for an rpath option" >&5 +echo $ECHO_N "checking for an rpath option... $ECHO_C" >&6 + case $cf_cv_system_name in + (irix*) + if test "$GCC" = yes; then + LD_RPATH_OPT="-Wl,-rpath," + else + LD_RPATH_OPT="-rpath " + fi + ;; + (linux*|gnu*|k*bsd*-gnu|freebsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (openbsd[2-9].*|mirbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (dragonfly*) + LD_RPATH_OPT="-rpath " + ;; + (netbsd*) + LD_RPATH_OPT="-Wl,-rpath," + ;; + (osf*|mls+*) + LD_RPATH_OPT="-rpath " + ;; + (solaris2*) + LD_RPATH_OPT="-R" + ;; + (*) + ;; + esac + echo "$as_me:23512: result: $LD_RPATH_OPT" >&5 +echo "${ECHO_T}$LD_RPATH_OPT" >&6 + + case "x$LD_RPATH_OPT" in + (x-R*) + echo "$as_me:23517: checking if we need a space after rpath option" >&5 +echo $ECHO_N "checking if we need a space after rpath option... $ECHO_C" >&6 + cf_save_LIBS="$LIBS" + +cf_add_libs="$LIBS" +# reverse order +cf_add_0lib= +for cf_add_1lib in ${LD_RPATH_OPT}$libdir; do cf_add_0lib="$cf_add_1lib $cf_add_0lib"; done +# filter duplicates +for cf_add_1lib in $cf_add_0lib; do + for cf_add_2lib in $cf_add_libs; do + if test "x$cf_add_1lib" = "x$cf_add_2lib"; then + cf_add_1lib= + break + fi + done + test -n "$cf_add_1lib" && cf_add_libs="$cf_add_1lib $cf_add_libs" +done +LIBS="$cf_add_libs" + + cat >conftest.$ac_ext <<_ACEOF +#line 23538 "configure" +#include "confdefs.h" + +int +main (void) +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:23550: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23553: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:23556: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23559: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_rpath_space=no +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +cf_rpath_space=yes +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + LIBS="$cf_save_LIBS" + echo "$as_me:23569: result: $cf_rpath_space" >&5 +echo "${ECHO_T}$cf_rpath_space" >&6 + test "$cf_rpath_space" = yes && LD_RPATH_OPT="$LD_RPATH_OPT " + ;; + esac +fi + +echo "$as_me:23576: checking if rpath-hack should be disabled" >&5 +echo $ECHO_N "checking if rpath-hack should be disabled... $ECHO_C" >&6 + +# Check whether --enable-rpath-hack or --disable-rpath-hack was given. +if test "${enable_rpath_hack+set}" = set; then + enableval="$enable_rpath_hack" + test "$enableval" != no && enableval=yes + if test "$enableval" != "yes" ; then + cf_disable_rpath_hack=yes + else + cf_disable_rpath_hack=no + fi +else + enableval=yes + cf_disable_rpath_hack=no + +fi; +echo "$as_me:23593: result: $cf_disable_rpath_hack" >&5 +echo "${ECHO_T}$cf_disable_rpath_hack" >&6 +if test "$cf_disable_rpath_hack" = no ; then + +echo "$as_me:23597: checking for updated LDFLAGS" >&5 +echo $ECHO_N "checking for updated LDFLAGS... $ECHO_C" >&6 +if test -n "$LD_RPATH_OPT" ; then + echo "$as_me:23600: result: maybe" >&5 +echo "${ECHO_T}maybe" >&6 + + for ac_prog in ldd +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 "$as_me:23607: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_cf_ldd_prog+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$cf_ldd_prog"; then + ac_cv_prog_cf_ldd_prog="$cf_ldd_prog" # Let the user override the test. +else + ac_save_IFS=$IFS; IFS=$ac_path_separator +ac_dummy="$PATH" +for ac_dir in $ac_dummy; do + IFS=$ac_save_IFS + test -z "$ac_dir" && ac_dir=. + $as_executable_p "$ac_dir/$ac_word" || continue +ac_cv_prog_cf_ldd_prog="$ac_prog" +echo "$as_me:23622: found $ac_dir/$ac_word" >&5 +break +done + +fi +fi +cf_ldd_prog=$ac_cv_prog_cf_ldd_prog +if test -n "$cf_ldd_prog"; then + echo "$as_me:23630: result: $cf_ldd_prog" >&5 +echo "${ECHO_T}$cf_ldd_prog" >&6 +else + echo "$as_me:23633: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$cf_ldd_prog" && break +done +test -n "$cf_ldd_prog" || cf_ldd_prog="no" + + cf_rpath_list="/usr/lib /lib" + if test "$cf_ldd_prog" != no + then + cf_rpath_oops= + +cat >conftest.$ac_ext <<_ACEOF +#line 23647 "configure" +#include "confdefs.h" +#include +int +main (void) +{ +printf("Hello"); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:23659: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:23662: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:23665: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:23668: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cf_rpath_oops=`$cf_ldd_prog conftest$ac_exeext | fgrep ' not found' | sed -e 's% =>.*$%%' |sort | uniq` + cf_rpath_list=`$cf_ldd_prog conftest$ac_exeext | fgrep / | sed -e 's%^.*[ ]/%/%' -e 's%/[^/][^/]*$%%' |sort | uniq` +else + echo "$as_me: failed program was:" >&5 +cat conftest.$ac_ext >&5 +fi +rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext + + # If we passed the link-test, but get a "not found" on a given library, + # this could be due to inept reconfiguration of gcc to make it only + # partly honor /usr/local/lib (or whatever). Sometimes this behavior + # is intentional, e.g., installing gcc in /usr/bin and suppressing the + # /usr/local libraries. + if test -n "$cf_rpath_oops" + then + for cf_rpath_src in $cf_rpath_oops + do + for cf_rpath_dir in \ + /usr/local \ + /usr/pkg \ + /opt/sfw + do + if test -f $cf_rpath_dir/lib/$cf_rpath_src + then + test -n "$verbose" && echo " ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src" 1>&6 + +echo "${as_me:-configure}:23696: testing ...adding -L$cf_rpath_dir/lib to LDFLAGS for $cf_rpath_src ..." 1>&5 + + LDFLAGS="$LDFLAGS -L$cf_rpath_dir/lib" + break + fi + done + done + fi + fi + + test -n "$verbose" && echo " ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6 + +echo "${as_me:-configure}:23708: testing ...checking EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5 + +test -n "$verbose" && echo " ...checking LDFLAGS $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:23712: testing ...checking LDFLAGS $LDFLAGS ..." 1>&5 + +cf_rpath_dst= +for cf_rpath_src in $LDFLAGS +do + case $cf_rpath_src in + (-L*) + + # check if this refers to a directory which we will ignore + cf_rpath_skip=no + if test -n "$cf_rpath_list" + then + for cf_rpath_item in $cf_rpath_list + do + if test "x$cf_rpath_src" = "x-L$cf_rpath_item" + then + cf_rpath_skip=yes + break + fi + done + fi + + if test "$cf_rpath_skip" = no + then + # transform the option + if test "$LD_RPATH_OPT" = "-R " ; then + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"` + else + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"` + fi + + # if we have not already added this, add it now + cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"` + if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS" + then + test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6 + +echo "${as_me:-configure}:23749: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5 + + EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS" + fi + fi + ;; + esac + cf_rpath_dst="$cf_rpath_dst $cf_rpath_src" +done +LDFLAGS=$cf_rpath_dst + +test -n "$verbose" && echo " ...checked LDFLAGS $LDFLAGS" 1>&6 + +echo "${as_me:-configure}:23762: testing ...checked LDFLAGS $LDFLAGS ..." 1>&5 + +test -n "$verbose" && echo " ...checking LIBS $LIBS" 1>&6 + +echo "${as_me:-configure}:23766: testing ...checking LIBS $LIBS ..." 1>&5 + +cf_rpath_dst= +for cf_rpath_src in $LIBS +do + case $cf_rpath_src in + (-L*) + + # check if this refers to a directory which we will ignore + cf_rpath_skip=no + if test -n "$cf_rpath_list" + then + for cf_rpath_item in $cf_rpath_list + do + if test "x$cf_rpath_src" = "x-L$cf_rpath_item" + then + cf_rpath_skip=yes + break + fi + done + fi + + if test "$cf_rpath_skip" = no + then + # transform the option + if test "$LD_RPATH_OPT" = "-R " ; then + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%-R %"` + else + cf_rpath_tmp=`echo "$cf_rpath_src" |sed -e "s%-L%$LD_RPATH_OPT%"` + fi + + # if we have not already added this, add it now + cf_rpath_tst=`echo "$EXTRA_LDFLAGS" | sed -e "s%$cf_rpath_tmp %%"` + if test "x$cf_rpath_tst" = "x$EXTRA_LDFLAGS" + then + test -n "$verbose" && echo " ...Filter $cf_rpath_src ->$cf_rpath_tmp" 1>&6 + +echo "${as_me:-configure}:23803: testing ...Filter $cf_rpath_src ->$cf_rpath_tmp ..." 1>&5 + + EXTRA_LDFLAGS="$cf_rpath_tmp $EXTRA_LDFLAGS" + fi + fi + ;; + esac + cf_rpath_dst="$cf_rpath_dst $cf_rpath_src" +done +LIBS=$cf_rpath_dst + +test -n "$verbose" && echo " ...checked LIBS $LIBS" 1>&6 + +echo "${as_me:-configure}:23816: testing ...checked LIBS $LIBS ..." 1>&5 + + test -n "$verbose" && echo " ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS" 1>&6 + +echo "${as_me:-configure}:23820: testing ...checked EXTRA_LDFLAGS $EXTRA_LDFLAGS ..." 1>&5 + +else + echo "$as_me:23823: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi + +# Force plink.sh to not trim pcre's libraries, which have the same symbol +# names as the system regexp. +if test "$with_pcre" != no +then + LIBS=`echo "$LIBS" | sed -e 's/-lpcre/-kpcre/g'` +fi + +### output xtermcfg.h, etc +ac_config_files="$ac_config_files Makefile df-install minstall:minstall.in" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overriden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if cmp -s $cache_file confcache; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:23918: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +SHELL=\${CONFIG_SHELL-$SHELL} +ac_cs_invocation="\$0 \$@" + +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi + +# Name of the executable. +as_me=`echo "$0" |sed 's,.*[\\/],,'` + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +as_executable_p="test -f" + +# Support unset when possible. +if (FOO=FOO; unset FOO) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + +# NLS nuisances. +$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; } +$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; } +$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; } +$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; } +$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; } +$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; } +$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; } +$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; } + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; } + +exec 6>&1 + +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\EOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to ." +EOF + +cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + shift + set dummy "$ac_option" "$ac_optarg" ${1+"$@"} + shift + ;; + -*);; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_need_defaults=false;; + esac + + case $1 in + # Handling of the options. +EOF +cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:24093: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + shift + CONFIG_FILES="$CONFIG_FILES $1" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + shift + CONFIG_HEADERS="$CONFIG_HEADERS $1" + ac_need_defaults=false;; + + # This is an error. + -*) { { echo "$as_me:24112: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +exec 5>>config.log +cat >&5 << _ACEOF + +## ----------------------- ## +## Running config.status. ## +## ----------------------- ## + +This file was extended by $as_me 2.52.20200802, executed with + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + > $ac_cs_invocation +on `(hostname || uname -n) 2>/dev/null | sed 1q` + +_ACEOF +EOF + +cat >>$CONFIG_STATUS <<\EOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "df-install" ) CONFIG_FILES="$CONFIG_FILES df-install" ;; + "minstall" ) CONFIG_FILES="$CONFIG_FILES minstall:minstall.in" ;; + "xtermcfg.h" ) CONFIG_HEADERS="$CONFIG_HEADERS xtermcfg.h:xtermcfg.hin" ;; + *) { { echo "$as_me:24151: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. +: ${TMPDIR=/tmp} +{ + tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=$TMPDIR/cs$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in $TMPDIR" >&2 + { (exit 1); exit 1; } +} + +EOF + +cat >>$CONFIG_STATUS <\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datarootdir@,$datarootdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@runstatedir@,$runstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@DEFS@,$DEFS,;t t +s,@LIBS@,$LIBS,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@EXTRA_CPPFLAGS@,$EXTRA_CPPFLAGS,;t t +s,@CPP@,$CPP,;t t +s,@AWK@,$AWK,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@LN_S@,$LN_S,;t t +s,@LINT@,$LINT,;t t +s,@LINT_OPTS@,$LINT_OPTS,;t t +s,@APP_CLASS@,$APP_CLASS,;t t +s,@APPSDIR@,$APPSDIR,;t t +s,@no_appsdir@,$no_appsdir,;t t +s,@ICON_NAME@,$ICON_NAME,;t t +s,@ICON_SYMLINK@,$ICON_SYMLINK,;t t +s,@PIXMAPDIR@,$PIXMAPDIR,;t t +s,@no_pixmapdir@,$no_pixmapdir,;t t +s,@ICONDIR@,$ICONDIR,;t t +s,@no_icondir@,$no_icondir,;t t +s,@ICON_FORMAT@,$ICON_FORMAT,;t t +s,@ICON_THEME@,$ICON_THEME,;t t +s,@ICON_LIST@,$ICON_LIST,;t t +s,@desktop_utils@,$desktop_utils,;t t +s,@DESKTOP_FLAGS@,$DESKTOP_FLAGS,;t t +s,@DESKTOP_CATEGORY@,$DESKTOP_CATEGORY,;t t +s,@XTERM_PATH@,$XTERM_PATH,;t t +s,@XTERM_SYMLINK@,$XTERM_SYMLINK,;t t +s,@SINSTALL_OPTS@,$SINSTALL_OPTS,;t t +s,@X_CFLAGS@,$X_CFLAGS,;t t +s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t +s,@X_LIBS@,$X_LIBS,;t t +s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t +s,@PKG_CONFIG@,$PKG_CONFIG,;t t +s,@ac_pt_PKG_CONFIG@,$ac_pt_PKG_CONFIG,;t t +s,@ICON_SUFFIX@,$ICON_SUFFIX,;t t +s,@IMAKE@,$IMAKE,;t t +s,@IMAKE_CFLAGS@,$IMAKE_CFLAGS,;t t +s,@IMAKE_LOADFLAGS@,$IMAKE_LOADFLAGS,;t t +s,@GROFF_PATH@,$GROFF_PATH,;t t +s,@NROFF_PATH@,$NROFF_PATH,;t t +s,@TBL_PATH@,$TBL_PATH,;t t +s,@GROFF_NOTE@,$GROFF_NOTE,;t t +s,@NROFF_NOTE@,$NROFF_NOTE,;t t +s,@cf_man2html@,$cf_man2html,;t t +s,@MAN2HTML_NOTE@,$MAN2HTML_NOTE,;t t +s,@MAN2HTML_PATH@,$MAN2HTML_PATH,;t t +s,@MAN2HTML_TEMP@,$MAN2HTML_TEMP,;t t +s,@default_termid@,$default_termid,;t t +s,@default_TERM@,$default_TERM,;t t +s,@backarrow_is_bs@,$backarrow_is_bs,;t t +s,@backarrow_is_erase@,$backarrow_is_erase,;t t +s,@delete_is_del@,$delete_is_del,;t t +s,@initial_erase@,$initial_erase,;t t +s,@alt_sends_esc@,$alt_sends_esc,;t t +s,@meta_sends_esc@,$meta_sends_esc,;t t +s,@cf_tic_prog@,$cf_tic_prog,;t t +s,@no_ticprog@,$no_ticprog,;t t +s,@TERMINFO_DIR@,$TERMINFO_DIR,;t t +s,@SET_TERMINFO@,$SET_TERMINFO,;t t +s,@double_buffer@,$double_buffer,;t t +s,@FREETYPE_CONFIG@,$FREETYPE_CONFIG,;t t +s,@FREETYPE_OLD_CONFIG@,$FREETYPE_OLD_CONFIG,;t t +s,@FREETYPE_XFT_CONFIG@,$FREETYPE_XFT_CONFIG,;t t +s,@HAVE_TYPE_FCCHAR32@,$HAVE_TYPE_FCCHAR32,;t t +s,@HAVE_TYPE_XFTCHARSPEC@,$HAVE_TYPE_XFTCHARSPEC,;t t +s,@LUIT@,$LUIT,;t t +s,@ECHO_LT@,$ECHO_LT,;t t +s,@ECHO_LD@,$ECHO_LD,;t t +s,@RULE_CC@,$RULE_CC,;t t +s,@SHOW_CC@,$SHOW_CC,;t t +s,@ECHO_CC@,$ECHO_CC,;t t +s,@EXTRA_CFLAGS@,$EXTRA_CFLAGS,;t t +s,@CHARPROC_DEPS@,$CHARPROC_DEPS,;t t +s,@EXTRAHDRS@,$EXTRAHDRS,;t t +s,@EXTRASRCS@,$EXTRASRCS,;t t +s,@EXTRAOBJS@,$EXTRAOBJS,;t t +s,@MAY_SETUID@,$MAY_SETUID,;t t +s,@NOT_SETUID@,$NOT_SETUID,;t t +s,@CTAGS@,$CTAGS,;t t +s,@ETAGS@,$ETAGS,;t t +s,@MAKE_LOWER_TAGS@,$MAKE_LOWER_TAGS,;t t +s,@MAKE_UPPER_TAGS@,$MAKE_UPPER_TAGS,;t t +s,@cf_ldd_prog@,$cf_ldd_prog,;t t +s,@EXTRA_LDFLAGS@,$EXTRA_LDFLAGS,;t t +CEOF + +EOF + + cat >>$CONFIG_STATUS <<\EOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + # It is possible to make a multiline substitution using escaped newlines. + # Ensure that we do not split the substitution between script fragments. + ac_BEG=$ac_end + ac_END=`expr $ac_end + $ac_max_sed_lines` + sed "1,${ac_BEG}d; ${ac_END}p; q" $tmp/subs.sed >$tmp/subs.next + if test -s $tmp/subs.next; then + grep '^s,@[^@,][^@,]*@,.*\\$' $tmp/subs.next >$tmp/subs.edit + if test ! -s $tmp/subs.edit; then + grep "^s,@[^@,][^@,]*@,.*,;t t$" $tmp/subs.next >$tmp/subs.edit + if test ! -s $tmp/subs.edit; then + if test $ac_beg -gt 1; then + ac_end=`expr $ac_end - 1` + continue + fi + fi + fi + fi + + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +EOF +cat >>$CONFIG_STATUS <<\EOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + ac_dir_suffix="/`echo $ac_dir|sed 's,^\./,,'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'` + else + ac_dir_suffix= ac_dots= + fi + + case $srcdir in + .) ac_srcdir=. + if test -z "$ac_dots"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_dots | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_dots$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_dots$srcdir ;; + esac + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_dots$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:24464: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + configure_input="Generated automatically from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:24482: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:24495: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +EOF +cat >>$CONFIG_STATUS <<\EOF + ac_warn_datarootdir=no + if test x"$ac_file" != x-; then + for ac_item in $ac_file_inputs + do + ac_seen=`grep '@\(datadir\|mandir\|infodir\)@' $ac_item` + if test -n "$ac_seen"; then + ac_used=`grep '@datarootdir@' $ac_item` + if test -z "$ac_used"; then + { echo "$as_me:24511: WARNING: datarootdir was used implicitly but not set: +$ac_seen" >&5 +echo "$as_me: WARNING: datarootdir was used implicitly but not set: +$ac_seen" >&2;} + ac_warn_datarootdir=yes + fi + fi + ac_seen=`grep '${datarootdir}' $ac_item` + if test -n "$ac_seen"; then + { echo "$as_me:24520: WARNING: datarootdir was used explicitly but not set: +$ac_seen" >&5 +echo "$as_me: WARNING: datarootdir was used explicitly but not set: +$ac_seen" >&2;} + ac_warn_datarootdir=yes + fi + done + fi + +if test "x$ac_warn_datarootdir" = xyes; then + ac_sed_cmds="$ac_sed_cmds | sed -e 's,@datarootdir@,\${prefix}/share,g' -e 's,\${datarootdir},\${prefix}/share,g'" +fi + +EOF +cat >>$CONFIG_STATUS <>$CONFIG_STATUS <<\EOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + cp $tmp/out $ac_file + + for ac_name in prefix exec_prefix datarootdir + do + ac_seen=`fgrep -n '${'$ac_name'[:=].*}' $ac_file` + if test -n "$ac_seen"; then + ac_init=`egrep '[ ]*'$ac_name'[ ]*=' $ac_file` + if test -z "$ac_init"; then + ac_seen=`echo "$ac_seen" |sed -e 's,^,'$ac_file':,'` + { echo "$as_me:24557: WARNING: Variable $ac_name is used but was not set: +$ac_seen" >&5 +echo "$as_me: WARNING: Variable $ac_name is used but was not set: +$ac_seen" >&2;} + fi + fi + done + egrep -n '@[a-z_][a-z_0-9]+@' $ac_file >$tmp/out + egrep -n '@[A-Z_][A-Z_0-9]+@' $ac_file >>$tmp/out + if test -s $tmp/out; then + ac_seen=`sed -e 's,^,'$ac_file':,' < $tmp/out` + { echo "$as_me:24568: WARNING: Some variables may not be substituted: +$ac_seen" >&5 +echo "$as_me: WARNING: Some variables may not be substituted: +$ac_seen" >&2;} + fi + else + cat $tmp/out + fi + rm -f $tmp/out + +done +EOF +cat >>$CONFIG_STATUS <<\EOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_i turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_iA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_iB='\([ ]\),\1#\2define\3' +ac_iC=' ' +ac_iD='\4,;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:24617: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:24628: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo $f;; + *) # Relative + if test -f "$f"; then + # Build tree + echo $f + elif test -f "$srcdir/$f"; then + # Source tree + echo $srcdir/$f + else + # /dev/null tree + { { echo "$as_me:24641: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +EOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\EOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\(\([^ (][^ (]*\)([^)]*)\)[ ]*\(.*\)$,${ac_dA}\2${ac_dB}\1${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +EOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +sed 's/ac_d/ac_i/g' conftest.defines >>conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >>conftest.undefs <<\EOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +EOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if egrep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # egrep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\EOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated automatically by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated automatically by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated automatically by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if cmp -s $ac_file $tmp/config.h 2>/dev/null; then + { echo "$as_me:24759: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + { case "$ac_dir" in + [\\/]* | ?:[\\/]* ) as_incr_dir=;; + *) as_incr_dir=.;; +esac +as_dummy="$ac_dir" +for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do + case $as_mkdir_dir in + # Skip DOS drivespec + ?:) as_incr_dir=$as_mkdir_dir ;; + *) + as_incr_dir=$as_incr_dir/$as_mkdir_dir + test -d "$as_incr_dir" || mkdir "$as_incr_dir" + ;; + esac +done; } + + fi + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +done +EOF + +cat >>$CONFIG_STATUS <<\EOF + +{ (exit 0); exit 0; } +EOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + exec 5>/dev/null + $SHELL $CONFIG_STATUS || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/ports/xterm/xterm-359/configure.in b/ports/xterm/xterm-359/configure.in new file mode 100644 index 0000000..8d59b07 --- /dev/null +++ b/ports/xterm/xterm-359/configure.in @@ -0,0 +1,1179 @@ +dnl $XTermId: configure.in,v 1.369 2020/07/25 17:52:31 tom Exp $ +dnl +dnl ----------------------------------------------------------------------------- +dnl this file is part of xterm +dnl +dnl Copyright 1997-2019,2020 by Thomas E. Dickey +dnl +dnl All Rights Reserved +dnl +dnl Permission is hereby granted, free of charge, to any person obtaining a +dnl copy of this software and associated documentation files (the +dnl "Software"), to deal in the Software without restriction, including +dnl without limitation the rights to use, copy, modify, merge, publish, +dnl distribute, sublicense, and/or sell copies of the Software, and to +dnl permit persons to whom the Software is furnished to do so, subject to +dnl the following conditions: +dnl +dnl The above copyright notice and this permission notice shall be included +dnl in all copies or substantial portions of the Software. +dnl +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +dnl IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +dnl CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +dnl TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +dnl SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +dnl +dnl Except as contained in this notice, the name(s) of the above copyright +dnl holders shall not be used in advertising or otherwise to promote the +dnl sale, use or other dealings in this Software without prior written +dnl authorization. +dnl --------------------------------------------------------------------------- +dnl Process this file with autoconf to produce a configure script. +dnl +AC_PREREQ(2.52.20200111) +AC_INIT +AC_CONFIG_SRCDIR([charproc.c]) +AC_CONFIG_HEADER(xtermcfg.h:xtermcfg.hin) +CF_CHECK_CACHE + +### checks for alternative programs + +dnl Only add to this case statement when a system has a compiler that is not +dnl detected by AC_PROG_CC. +case "$host_os" in +(openedition) : ${CFLAGS="-O2 -Wc,dll -Wl,EDIT=NO"} + : ${CPPFLAGS="-D_ALL_SOURCE"} + : ${LIBS="/usr/lib/Xaw.x /usr/lib/SM.x /usr/lib/ICE.x /usr/lib/X11.x"} + : ${CC=c89};; +(darwin*) + : ${LDFLAGS}="${LDFLAGS} -Wl,-bind_at_load";; +esac + +CF_PROG_CC +AC_PROG_CPP +AC_PROG_AWK +AC_PROG_INSTALL +AC_PROG_LN_S +AC_ARG_PROGRAM +CF_PROG_LINT + +### checks for compiler characteristics +CF_XOPEN_SOURCE(700) +CF_SIGWINCH + +### checks for header files +AC_CHECK_HEADERS( \ +ncurses/curses.h \ +ncurses/term.h \ +stdlib.h \ +sys/ptem.h sys/ttydefaults.h \ +term.h \ +termios.h \ +unistd.h \ +wchar.h \ +) +AC_HEADER_TIME +AM_LANGINFO_CODESET + +### checks for typedefs +CF_SIG_ATOMIC_T +AC_CHECK_TYPE(time_t, long) +CF_TYPE_CC_T +AC_TYPE_MODE_T +AC_TYPE_PID_T +AC_TYPE_UID_T +AC_TYPE_OFF_T + +### checks for library functions +AC_CHECK_FUNCS( \ + gethostname \ + getusershell \ + endusershell \ + getlogin \ + initgroups \ + mkdtemp \ + putenv \ + unsetenv \ + sched_yield \ + setpgid \ + strftime \ + tcgetattr \ + waitpid \ + wcswidth \ + wcwidth ) +CF_UTMP +CF_STRUCT_LASTLOG +CF_POSIX_SAVED_IDS + +CF_HELP_MESSAGE(Compile/Install Options:) +CF_FUNC_TGETENT + +CF_WITH_APP_CLASS(XTerm) +CF_WITH_APP_DEFAULTS +CF_WITH_ICON_NAME(mini.xterm) +CF_WITH_ICON_SYMLINK(xterm) + +# Install all icons except for the overused "terminal". +cf_cv_icon_list= +for my_item in $srcdir/icons/*.svg +do + test -f "$my_item" || continue + cf_icon_name=`echo $my_item |sed -e "s,.svg,," -e "s,^$srcdir/,,"` + case $cf_icon_name in + (*_48x48) + continue + ;; + esac + CF_VERBOSE(adding $cf_icon_name to icon-list) + cf_cv_icon_list="$cf_cv_icon_list $cf_icon_name" + if test -f "${cf_icon_name}_48x48.png" + then + CF_VERBOSE(adding ${cf_icon_name}_48x48 to icon-list) + cf_cv_icon_list="$cf_cv_icon_list ${cf_icon_name}_48x48" + fi +done +CF_WITH_ICON_THEME([$cf_cv_icon_list],,,icons/${ICON_NAME}_48x48) + +CF_DISABLE_DESKTOP(xterm) +CF_WITH_DESKTOP_CATEGORY(xterm, + [*rxvt*|*konsole|*[[Tt]]erminal], + [System|TerminalEmulator|*]) + +AC_MSG_CHECKING(for install-permissions reference) +AC_ARG_WITH(reference, + [ --with-reference=XXX program to use as permissions-reference], + [with_reference=$withval], + [with_reference=xterm]) +AC_MSG_RESULT($with_reference) + +with_full_paths=yes +CF_PATH_PROG(XTERM_PATH,$with_reference) + +# If any of --program-prefix, --program-suffix or --program-transform-name is +# given, accept an option tell the makefile to create a symbolic link, e.g., +# to "xterm" on install. +XTERM_SYMLINK=NONE +AC_SUBST(XTERM_SYMLINK) +if test "$program_transform_name" != "'s,,,'" ; then +cf_name=`echo "$program_transform_name" | sed -e '[s,\\$\\$,$,g]'` +cf_name=`echo xterm |sed -e "$cf_name"` +AC_MSG_CHECKING(for symbolic link to create to $cf_name) +AC_ARG_WITH(xterm-symlink, + [ --with-xterm-symlink=XXX make symbolic link to installed xterm], + [with_symlink=$withval], + [with_symlink=xterm]) +AC_MSG_RESULT($with_symlink) +test "$with_symlink" = yes && with_symlink=xterm +test -n "$with_symlink" && \ + test "$with_symlink" != no && \ + test "$with_symlink" != $cf_name && \ + XTERM_SYMLINK="$with_symlink" +fi + +AC_MSG_CHECKING(if you want to disable openpty) +CF_ARG_DISABLE(openpty, + [ --disable-openpty disable openpty, prefer other interfaces], + [disable_openpty=yes], + [disable_openpty=no], + no) +AC_MSG_RESULT($disable_openpty) + +AC_MSG_CHECKING(if you want to disable setuid) +CF_ARG_DISABLE(setuid, + [ --disable-setuid disable setuid in xterm, do not install setuid/setgid], + [disable_setuid=yes], + [disable_setuid=no], + no) +AC_MSG_RESULT($disable_setuid) + +AC_MSG_CHECKING(if you want to disable setgid) +CF_ARG_DISABLE(setgid, + [ --disable-setgid disable setgid in xterm, do not install setuid/setgid], + [disable_setgid=yes], + [disable_setgid=no], + no) +AC_MSG_RESULT($disable_setgid) + +AC_MSG_CHECKING(if you want to run xterm setuid to a given user) +AC_ARG_WITH(setuid, + [ --with-setuid=XXX use the given setuid user], + [use_given_setuid=$withval], + [use_given_setuid=no]) +AC_MSG_RESULT($use_given_setuid) + +if test "$use_given_setuid" != no ; then + if test "$use_given_setuid" = yes ; then + cf_cv_given_setuid=root + else + cf_cv_given_setuid=$use_given_setuid + fi + # inherit SINSTALL_OPTS from environment to allow packager to customize it. + SINSTALL_OPTS="$SINSTALL_OPTS u+s -u $cf_cv_given_setuid" +fi + +AC_MSG_CHECKING(if you want to run xterm setgid to match utmp/utmpx file) +AC_ARG_WITH(utmp-setgid, + [ --with-utmp-setgid=XXX use setgid to match utmp/utmpx file], + [use_utmp_setgid=$withval], + [use_utmp_setgid=no]) +AC_MSG_RESULT($use_utmp_setgid) + +if test "$use_utmp_setgid" != no ; then + if test "$use_utmp_setgid" = yes ; then + CF_UTMP_GROUP + else + cf_cv_utmp_group=$use_utmp_setgid + fi + if test "$cf_cv_posix_saved_ids" != yes ; then + AC_MSG_ERROR(Your system does not support POSIX saved-ids) + fi + AC_DEFINE(USE_UTMP_SETGID,1,[Define to 1 if we should use setgid to access utmp/utmpx]) + SINSTALL_OPTS="$SINSTALL_OPTS g+s -g $cf_cv_utmp_group" +fi + +AC_SUBST(SINSTALL_OPTS) + +AC_MSG_CHECKING(if you want to link with utempter) +AC_ARG_WITH(utempter, + [ --with-utempter use utempter library for access to utmp], + [use_utempter=$withval], + [use_utempter=no]) +AC_MSG_RESULT($use_utempter) + +if test "$use_utempter" = yes ; then + CF_UTEMPTER + test "$cf_cv_have_utempter" != yes && use_utempter=no +else + use_utempter=no +fi + +# Some configurations permit (or require) either setuid or setgid mode. +# Let the user decide. +if test "$use_utempter" = yes ; then + if test "${enable_setuid+set}" != set ; then + disable_setuid=yes + CF_VERBOSE([No --disable-setuid option given, force to yes]) + fi +fi + +### checks for external data +CF_ERRNO +CF_TTY_GROUP + +### checks for system services and user specified options + +AC_PATH_XTRA +CF_POSIX_WAIT +CF_SYSV +CF_SVR4 +CF_X_TOOLKIT + +AC_CHECK_HEADERS( \ + X11/DECkeysym.h \ + X11/Sunkeysym.h \ + X11/XF86keysym.h \ + X11/XKBlib.h \ + X11/TranslateI.h \ + X11/Xpoll.h \ + X11/extensions/XKB.h \ + ) + +CF_WITH_XPM +CF_WITH_XINERAMA +CF_X_ATHENA +CF_TYPE_FD_MASK +CF_TERMIO_C_ISPEED +CF_TERMIOS_TYPES + +# If we notice Xcursor, there is a workaround needed. +AC_CHECK_LIB(Xcursor, XcursorGetTheme,[AC_DEFINE(HAVE_LIB_XCURSOR,1,[Define to 1 if we have the Xcursor library])]) + +LIBS="$LIBS $X_EXTRA_LIBS" + +CF_FUNC_GRANTPT +CF_XKB_QUERY_EXTENSION +CF_XKB_KEYCODE_TO_KEYSYM +CF_XKB_BELL_EXT + +AC_CHECK_FUNCS(Xutf8LookupString, [],[ + EXTRAHDRS="$EXTRAHDRS xutf8.h" + EXTRASRCS="$EXTRASRCS xutf8.c" + EXTRAOBJS="$EXTRAOBJS xutf8.o" +]) + +CF_WITH_IMAKE_CFLAGS($(MAIN_DEFINES) $(VENDORMANDEFS)) +CF_WITH_MAN2HTML + +# If we have already established that there is a full termcap implementation, +# suppress the definitions for terminfo that we make have imported from the +# imake-file. +if test "x$cf_cv_lib_tgetent" != xno || test "x$cf_cv_lib_part_tgetent" != xno ; then + case "$IMAKE_CFLAGS" in + (*-DUSE_TERMINFO\ -DHAVE_TIGETSTR*) + CF_UNDO_CFLAGS(IMAKE_CFLAGS,terminfo,[-DUSE_TERMINFO[[ ]]*-DHAVE_TIGETSTR[[ ]]*]) + CF_UNDO_CFLAGS(CPPFLAGS,terminfo,[-DUSE_TERMINFO[[ ]]*-DHAVE_TIGETSTR[[ ]]*]) + ;; + esac +fi + +CF_HELP_MESSAGE(Terminal Configuration:) + +AC_MSG_CHECKING(for default terminal-id) +AC_ARG_WITH(terminal-id, + [ --with-terminal-id=V set default decTerminalID (default: vt420)], + [default_termid=$withval], + [default_termid=vt420]) +AC_MSG_RESULT($default_termid) +case $default_termid in +(vt*) default_termid=`echo $default_termid | sed -e 's/^..//'` + ;; +esac +AC_DEFINE_UNQUOTED(DFT_DECID,"$default_termid",[default terminal-id]) +AC_SUBST(default_termid) + +AC_MSG_CHECKING(for default terminal-type) +AC_ARG_WITH(terminal-type, + [ --with-terminal-type=T set default $TERM (default: xterm)], + [default_TERM=$withval], + [default_TERM=xterm]) +AC_MSG_RESULT($default_TERM) +AC_DEFINE_UNQUOTED(DFT_TERMTYPE,"$default_TERM",[default terminal-type]) +AC_SUBST(default_TERM) + +############################################################################### +AC_MSG_CHECKING(if backarrow-key should be BS) +CF_ARG_DISABLE(backarrow-key, + [ --enable-backarrow-key set default backarrowKey resource (default: true)], + [backarrow_is_bs=$enableval], + [backarrow_is_bs=yes]) +CF_XBOOL_RESULT(DEF_BACKARO_BS,backarrow_is_bs,[Define to 1 if backarrow-key should be BS]) + +AC_MSG_CHECKING(if backarrow-key should be treated as erase) +CF_ARG_ENABLE(backarrow-is-erase, + [ --enable-backarrow-is-erase set default backarrowKeyIsErase resource (default: false)], + [backarrow_is_erase=$enableval], + [backarrow_is_erase=no]) +CF_XBOOL_RESULT(DEF_BACKARO_ERASE,backarrow_is_erase,[Define to 1 if backarrow-key should be treated as erase]) + +AC_MSG_CHECKING(for default backspace/DEL setting) +AC_ARG_ENABLE(delete-is-del, + [ --enable-delete-is-del set default deleteIsDEL resource (default: maybe)], + [delete_is_del=$enableval], + [delete_is_del=maybe]) +CF_XBOOL_RESULT(DEFDELETE_DEL,delete_is_del,[Define to 1 if default backspace/DEL setting is DEL]) + +AC_MSG_CHECKING(for default pty initial erase setting) +AC_ARG_ENABLE(pty-erase, + [ --enable-pty-erase set default ptyInitialErase resource (default: maybe)], + [initial_erase=$enableval], + [initial_erase=False]) +CF_XBOOL_RESULT(DEF_INITIAL_ERASE,initial_erase,[Define to 1 if default pty initial erase setting is TRUE]) + +AC_MSG_CHECKING(if alt should send ESC) +CF_ARG_ENABLE(alt-sends-esc, + [ --enable-alt-sends-esc set default altSendsEscape resource (default: no)], + [alt_sends_esc=$enableval], + [alt_sends_esc=no]) +CF_XBOOL_RESULT(DEF_ALT_SENDS_ESC,alt_sends_esc,[Define to 1 if alt should send ESC]) + +AC_MSG_CHECKING(if meta should send ESC) +CF_ARG_ENABLE(meta-sends-esc, + [ --enable-meta-sends-esc set default metaSendsEscape resource (default: no)], + [meta_sends_esc=$enableval], + [meta_sends_esc=no]) +CF_XBOOL_RESULT(DEF_META_SENDS_ESC,meta_sends_esc,[Define to 1 if meta should send ESC]) + +############################################################################### +AC_CHECK_PROG(cf_tic_prog,tic,yes,no) +if test "$cf_tic_prog" = yes ; then + if test -n "$TERMINFO" + then + case "$TERMINFO" in + (/*) + test -d "$TERMINFO" || unset TERMINFO + ;; + (*) + unset TERMINFO + ;; + esac + fi + AC_MSG_CHECKING(for private terminfo-directory) + AC_ARG_WITH(own-terminfo, + [ --with-own-terminfo=P set default $TERMINFO (default: from environment)], + [TERMINFO_DIR=$withval], + [TERMINFO_DIR=${TERMINFO-none}]) + AC_MSG_RESULT($TERMINFO_DIR) + if test "$TERMINFO_DIR" = yes ; then + AC_MSG_WARN(no value given) + elif test "$TERMINFO_DIR" != none ; then + if test -d $TERMINFO_DIR ; then + AC_DEFINE_UNQUOTED(OWN_TERMINFO_DIR,"$TERMINFO_DIR",[Define to override default TERMINFO value]) + AC_MSG_CHECKING(if \$TERMINFO should also be set) + AC_ARG_ENABLE(env-terminfo, + [ --enable-env-terminfo setenv $TERMINFO if --with-own-terminfo gives value], + [cf_env_terminfo=yes], + [cf_env_terminfo=no]) + AC_MSG_RESULT($cf_env_terminfo) + test $cf_env_terminfo = yes && + AC_DEFINE(OWN_TERMINFO_ENV,1,[Define to 1 to enable setenv of $TERMINFO value]) + else + AC_MSG_WARN(not a directory) + fi + elif test "$prefix" != NONE ; then + TERMINFO_DIR='${prefix}/lib/terminfo' + elif test -d /usr/lib/terminfo ; then + TERMINFO_DIR=/usr/lib/terminfo + else + TERMINFO_DIR= + fi + SET_TERMINFO= + if test -n "$TERMINFO_DIR" ; then + TERMINFO_DIR='$(DESTDIR)'$TERMINFO_DIR + SET_TERMINFO='TERMINFO=$(TERMINFO_DIR)' + fi + no_ticprog= +else + no_ticprog="#" + TERMINFO_DIR= + SET_TERMINFO= +fi +AC_SUBST(no_ticprog) +AC_SUBST(TERMINFO_DIR) +AC_SUBST(SET_TERMINFO) + +############################################################################### +CF_HELP_MESSAGE(Optional Features:) + +AC_MSG_CHECKING(if you want active-icons) +CF_ARG_DISABLE(active-icon, + [ --disable-active-icon disable X11R6.3 active-icon feature], + [enable_active_icon=no], + [enable_active_icon=yes]) +AC_MSG_RESULT($enable_active_icon) +if test "$enable_active_icon" = no ; then + AC_DEFINE(NO_ACTIVE_ICON,1,[Define to 1 to disable X11R6.3 active-icon feature]) +fi + +AC_MSG_CHECKING(if you want ANSI color) +CF_ARG_DISABLE(ansi-color, + [ --disable-ansi-color disable ANSI color], + [enable_ansi_color=no], + [enable_ansi_color=yes]) +AC_MSG_RESULT($enable_ansi_color) +test "$enable_ansi_color" = no && AC_DEFINE(OPT_ISO_COLORS,0,[Define to 0 to disable ANSI color]) + +if test "$enable_ansi_color" = yes ; then + + AC_MSG_CHECKING(if you want 16 colors like aixterm) + CF_ARG_DISABLE(16-color, + [ --disable-16-color disable 16-color support], + [enable_16_color=no], + [enable_16_color=yes]) + AC_MSG_RESULT($enable_16_color) + test "$enable_16_color" = no && AC_DEFINE(OPT_AIX_COLORS,0,[Define to 0 to disable 16-color support]) + + AC_MSG_CHECKING(if you want 256 colors) + CF_ARG_DISABLE(256-color, + [ --disable-256-color disable 256-color support], + [enable_256_color=no], + [enable_256_color=yes]) + AC_MSG_RESULT($enable_256_color) + + if test "$enable_256_color" = yes ; then + + CHARPROC_DEPS="$CHARPROC_DEPS 256colres.h" + EXTRAHDRS="$EXTRAHDRS 256colres.h" + AC_DEFINE(OPT_256_COLORS,1,[Define to 1 to enable 256-color support]) + + AC_MSG_CHECKING(if you want direct-color support) + CF_ARG_DISABLE(direct-color, + [ --disable-direct-color disable direct-color support], + [enable_direct_color=no], + [enable_direct_color=yes]) + AC_MSG_RESULT($enable_direct_color) + if test "$enable_direct_color" = yes ; then + AC_DEFINE(OPT_DIRECT_COLOR,1,[Define to 1 to enable direct-color support]) + fi + + else + + AC_MSG_CHECKING(if you want 88 colors) + CF_ARG_DISABLE(88-color, + [ --disable-88-color disable 88-color support], + [enable_88_color=no], + [enable_88_color=yes]) + AC_MSG_RESULT($enable_88_color) + if test "$enable_88_color" = yes ; then + CHARPROC_DEPS="$CHARPROC_DEPS 88colres.h" + EXTRAHDRS="$EXTRAHDRS 88colres.h" + AC_DEFINE(OPT_88_COLORS,1,[Define to 1 to enable 88-color support]) + fi + + fi + +fi + +AC_MSG_CHECKING(if you want blinking cursor) +CF_ARG_DISABLE(blink-cursor, + [ --disable-blink-cursor disable support for blinking cursor], + [enable_blink_curs=no], + [enable_blink_curs=yes]) +AC_MSG_RESULT($enable_blink_curs) +test "$enable_blink_curs" = no && AC_DEFINE(OPT_BLINK_CURS,0,[Define to 0 to disable support for blinking cursor]) + +AC_MSG_CHECKING(if you want to ignore Linux's broken palette-strings) + +case $host_os in +(linux*) + assume_broken_osc=yes ;; +(*) + assume_broken_osc=no ;; +esac + +CF_ARG_OPTION(broken-osc, + [ --enable-broken-osc allow broken Linux OSC-strings], + [enable_broken_osc=$enableval], + [enable_broken_osc=$enableval], + [$assume_broken_osc]) +AC_MSG_RESULT($enable_broken_osc) +if test "$enable_broken_osc" = yes ; then + AC_DEFINE(OPT_BROKEN_OSC,1,[Define to 1 to allow broken Linux OSC-strings]) +else + AC_DEFINE(OPT_BROKEN_OSC,0,[Define to 0 to allow broken Linux OSC-strings]) +fi + +AC_MSG_CHECKING(if you want to allow broken string-terminators) +CF_ARG_ENABLE(broken-st, + [ --disable-broken-st disallow broken string-terminators], + [enable_broken_st=no], + [enable_broken_st=yes]) +AC_MSG_RESULT($enable_broken_st) +test "$enable_broken_st" = no && AC_DEFINE(OPT_BROKEN_ST,0,[Define to 0 to disallow broken string-terminators]) + +AC_MSG_CHECKING(if you want to compile-in icon data) +CF_ARG_ENABLE(builtin-xpms, + [ --enable-builtin-xpms compile-in icon data], + [enable_builtin_xpms=yes], + [enable_builtin_xpms=no]) +AC_MSG_RESULT($enable_builtin_xpms) +test "$enable_builtin_xpms" = yes && AC_DEFINE(OPT_BUILTIN_XPMS,1,[Define to 1 to compile-in icon data]) + +AC_MSG_CHECKING(if you want printable 128-159) +CF_ARG_DISABLE(c1-print, + [ --disable-c1-print disallow -k8 option for printable 128-159], + [enable_c1_print=no], + [enable_c1_print=yes]) +AC_MSG_RESULT($enable_c1_print) +test "$enable_c1_print" = no && AC_DEFINE(OPT_C1_PRINT,0,[Define to 0 to disallow -k8 option for printable 128-159]) + +if test "$enable_ansi_color" = yes ; then + + AC_MSG_CHECKING(if you want bold colors mapped like IBM PC) + CF_ARG_DISABLE(bold-color, + [ --disable-bold-color disable PC-style mapping of bold colors], + [enable_pc_color=no], + [enable_pc_color=yes]) + AC_MSG_RESULT($enable_pc_color) + test "$enable_pc_color" = no && AC_DEFINE(OPT_PC_COLORS,0,[Define to 0 to disable PC-style mapping of bold colors]) + + AC_MSG_CHECKING(if you want separate color-classes) + CF_ARG_DISABLE(color-class, + [ --disable-color-class disable separate color class resources], + [enable_color_class=no], + [enable_color_class=yes]) + AC_MSG_RESULT($enable_color_class) + test "$enable_color_class" = no && AC_DEFINE(OPT_COLOR_CLASS,0,[Define to 0 to disable separate color class resources]) + + AC_MSG_CHECKING(if you want color-mode enabled by default) + CF_ARG_DISABLE(color-mode, + [ --disable-color-mode disable default colorMode resource], + [default_colormode=no], + [default_colormode=yes]) + AC_MSG_RESULT($default_colormode) + test "$default_colormode" = no && AC_DEFINE(DFT_COLORMODE,0,[Define to 0 if you want color-mode enabled by default]) + +fi + +AC_MSG_CHECKING(if you want support for color highlighting) +CF_ARG_DISABLE(highlighting, + [ --disable-highlighting disable support for color highlighting], + [default_highlight=no], + [default_highlight=yes]) +AC_MSG_RESULT($default_highlight) +test "$default_highlight" = no && AC_DEFINE(OPT_HIGHLIGHT_COLOR,0,[Define to 1 if you want support for color highlighting]) + +AC_MSG_CHECKING(if you want support for doublesize characters) +CF_ARG_DISABLE(doublechars, + [ --disable-doublechars disable support for double-size chars], + [enable_doublechars=no], + [enable_doublechars=yes]) +AC_MSG_RESULT($enable_doublechars) +test "$enable_doublechars" = no && AC_DEFINE(OPT_DEC_CHRSET,0,[Define to 0 to disable support for double-size chars]) + +AC_MSG_CHECKING(if you want fallback-support for box characters) +CF_ARG_DISABLE(boxchars, + [ --disable-boxchars disable fallback-support for box chars], + [enable_boxchars=no], + [enable_boxchars=yes]) +AC_MSG_RESULT($enable_boxchars) +test "$enable_boxchars" = no && AC_DEFINE(OPT_BOX_CHARS,0,[Define to 0 to disable fallback-support for box chars]) + +AC_MSG_CHECKING(if you want to allow spawning new xterms) +CF_ARG_ENABLE(exec-xterm, + [ --enable-exec-xterm enable "spawn-new-terminal" action], + [enable_exec_xterm=yes], + [enable_exec_xterm=no]) +AC_MSG_RESULT($enable_exec_xterm) +if test "$enable_exec_xterm" = yes ; then + CF_PROCFS_CWD + if test "$cf_cv_procfs_cwd" = no ; then + AC_MSG_WARN(no suitable proc filesystem found) + else + AC_DEFINE_UNQUOTED(PROCFS_ROOT,"$cf_cv_procfs_cwd",[This is defined via the --enable-exec-xterm option]) + AC_DEFINE(OPT_EXEC_XTERM,1,[Define to 1 to enable "spawn-new-terminal" action]) + fi +fi + +CF_X_EXT +CF_X_EXT_DOUBLE_BUFFER +double_buffer=False +if test "$cf_x_ext_double_buffer" = yes ; then + AC_MSG_CHECKING(if you want to enable double-buffering in default resources) + CF_ARG_ENABLE(double-buffer, + [ --enable-double-buffer enable double-buffering in default resources], + [enable_double_bfr=yes], + [enable_double_bfr=no]) + AC_MSG_RESULT($enable_double_bfr) + if test "$enable_double_bfr" = yes ; then + AC_DEFINE(OPT_DOUBLE_BUFFER,1,[Define to 1 to enable double-buffering in default resources]) + double_buffer=True + fi +fi +AC_SUBST(double_buffer) + +AC_MSG_CHECKING(if you want to use FreeType library) +CF_ARG_DISABLE(freetype, + [ --disable-freetype disable freetype library-support], + [enable_freetype=no], + [enable_freetype=yes]) +AC_MSG_RESULT($enable_freetype) +if test "$enable_freetype" = yes ; then + CF_X_FONTCONFIG +else + CPPFLAGS=`echo "$CPPFLAGS" | sed -e s/-DXRENDERFONT//` +fi + +AC_MSG_CHECKING(if you want support for HP-style function keys) +CF_ARG_ENABLE(hp-fkeys, + [ --enable-hp-fkeys enable support for HP-style function keys], + [enable_hp_fkeys=yes], + [enable_hp_fkeys=no]) +AC_MSG_RESULT($enable_hp_fkeys) +if test "$enable_hp_fkeys" = yes ; then + AC_DEFINE(OPT_HP_FUNC_KEYS,1,[Define to 1 to enable support for HP-style function keys]) +fi + +AC_MSG_CHECKING(if you want support for SCO-style function keys) +CF_ARG_ENABLE(sco-fkeys, + [ --enable-sco-fkeys enable support for SCO-style function keys], + [enable_sco_fkeys=yes], + [enable_sco_fkeys=no]) +AC_MSG_RESULT($enable_sco_fkeys) +if test "$enable_sco_fkeys" = yes ; then + AC_DEFINE(OPT_SCO_FUNC_KEYS,1,[Define to 1 to enable support for SCO-style function keys]) +fi + +AC_MSG_CHECKING(if you want support for Sun-style function keys) +CF_ARG_DISABLE(sun-fkeys, + [ --disable-sun-fkeys disable support for Sun-style function keys], + [enable_sun_fkeys=no], + [enable_sun_fkeys=yes]) +AC_MSG_RESULT($enable_sun_fkeys) +if test "$enable_sun_fkeys" = no ; then + AC_DEFINE(OPT_SUN_FUNC_KEYS,0,[Define to 0 to disable support for Sun-style function keys]) +fi + +AC_MSG_CHECKING(if you want saved-lines stored as a FIFO) +CF_ARG_DISABLE(fifo-lines, + [ --disable-fifo-lines disable FIFO-storage for saved-lines], + [enable_fifo_lines=no], + [enable_fifo_lines=yes]) +AC_MSG_RESULT($enable_fifo_lines) +if test "$enable_fifo_lines" = yes ; then + AC_DEFINE(OPT_FIFO_LINES,1,[Define to 1 to disable FIFO-storage for saved-lines]) +fi + +AC_MSG_CHECKING(if you want support for internationalization) +CF_ARG_DISABLE(i18n, + [ --disable-i18n disable internationalization], + [enable_i18n=no], + [enable_i18n=yes]) +AC_MSG_RESULT($enable_i18n) +if test "$enable_i18n" = no ; then + AC_DEFINE(OPT_I18N_SUPPORT,0,[Define to 0 to disable internationalization]) +fi + +AC_MSG_CHECKING(if you want support for initial-erase setup) +CF_ARG_DISABLE(initial-erase, + [ --disable-initial-erase disable setup for stty erase], + [enable_ie=no], + [enable_ie=yes]) +AC_MSG_RESULT($enable_ie) +if test "$enable_ie" = no ; then + AC_DEFINE(OPT_INITIAL_ERASE,0,[Define to 0 to disable setup for stty erase]) +fi + +AC_MSG_CHECKING(if you want support for input-method) +CF_ARG_DISABLE(input-method, + [ --disable-input-method disable input-method], + [enable_ximp=no], + [enable_ximp=$enable_i18n]) +AC_MSG_RESULT($enable_ximp) +CF_INPUT_METHOD +test "$cf_cv_input_method" = no && enable_ximp=no +if test "$enable_ximp" != no ; then + if test "$enable_i18n" = no ; then + AC_MSG_WARN(input-methor relies upon internationalization) + enable_ximp=no + fi +fi +if test "$enable_ximp" = no ; then + AC_DEFINE(OPT_INPUT_METHOD,0,[Define to 0 to disable input-method]) +fi + +AC_MSG_CHECKING(if you want support for load-vt-fonts) +CF_ARG_ENABLE(load-vt-fonts, + [ --enable-load-vt-fonts enable load-vt-fonts() action], + [enable_load_vt_fonts=yes], + [enable_load_vt_fonts=no]) +AC_MSG_RESULT($enable_load_vt_fonts) +if test "$enable_load_vt_fonts" = yes ; then + AC_DEFINE(OPT_LOAD_VTFONTS,1,[Define to 1 to enable load-vt-fonts() action]) +fi + +AC_MSG_CHECKING(if you want support for logging) +CF_ARG_ENABLE(logging, + [ --enable-logging enable logging], + [enable_logging=yes], + [enable_logging=no]) +AC_MSG_RESULT($enable_logging) +if test "$enable_logging" = yes ; then + AC_DEFINE(ALLOWLOGGING,1,[if you want support for logging]) + AC_MSG_CHECKING(if you want to allow logging via a pipe) + CF_ARG_ENABLE(logfile-exec, + [ --enable-logfile-exec enable exec'd logfile filter], + [enable_log_exec=yes], + [enable_log_exec=no]) + AC_MSG_RESULT($enable_log_exec) + if test "$enable_log_exec" = yes ; then + AC_DEFINE(ALLOWLOGFILEEXEC,1,[if you want to allow logging via a pipe]) + fi +fi + +AC_MSG_CHECKING(if you want support for iconify/maximize translations) +CF_ARG_DISABLE(maximize, + [ --disable-maximize disable actions for iconify/deiconify/maximize/restore], + [enable_maximize=no], + [enable_maximize=yes]) +AC_MSG_RESULT($enable_maximize) +test "$enable_maximize" = no && AC_DEFINE(OPT_MAXIMIZE,0,[Define to 0 to disable actions for iconify/deiconify/maximize/restore]) + +AC_MSG_CHECKING(if you want NumLock to override keyboard tables) +CF_ARG_DISABLE(num-lock, + [ --disable-num-lock disable NumLock keypad support], + [enable_numlock=no], + [enable_numlock=yes]) +AC_MSG_RESULT($enable_numlock) +test "$enable_numlock" = no && AC_DEFINE(OPT_NUM_LOCK,0,[Define to 0 to disable NumLock keypad support]) + +AC_MSG_CHECKING(if you want support for get/set of base64 selection data) + +CF_ARG_DISABLE(paste64, + [ --disable-paste64 disable get/set base64 selection data], + [enable_paste64=no], + [enable_paste64=yes]) +AC_MSG_RESULT($enable_paste64) +if test "$enable_paste64" = yes ; then + AC_DEFINE(OPT_PASTE64,1,[Define to 1 to disable get/set base64 selection data]) +else + AC_DEFINE(OPT_PASTE64,0,[Define to 0 to disable get/set base64 selection data]) +fi + +AC_MSG_CHECKING(if you want support for pty-handshaking) + +CF_ARG_DISABLE(pty-handshake, + [ --disable-pty-handshake disable pty-handshake support], + [enable_pty_handshake=no], + [enable_pty_handshake=yes]) +AC_MSG_RESULT($enable_pty_handshake) +if test "$enable_pty_handshake" = yes ; then + AC_DEFINE(OPT_PTY_HANDSHAKE,1,[Define to 1 to disable pty-handshake support]) +else + AC_DEFINE(OPT_PTY_HANDSHAKE,0,[Define to 0 to disable pty-handshake support]) +fi + +AC_MSG_CHECKING(if you want support for mouse in readline applications) +CF_ARG_ENABLE(readline-mouse, + [ --enable-readline-mouse enable support for mouse in readline applications], + [enable_readline_mouse=yes], + [enable_readline_mouse=no]) +AC_MSG_RESULT($enable_readline_mouse) +if test "$enable_readline_mouse" = yes ; then + AC_DEFINE(OPT_READLINE,1,[Define to 1 to enable support for mouse in readline applications]) +fi + +AC_MSG_CHECKING(if you want support for regular-expression selections) +CF_ARG_DISABLE(regex, + [ --disable-regex disable regular-expression selections], + [enable_regex=no], + [enable_regex=yes]) +AC_MSG_RESULT($enable_regex) +if test "$enable_regex" = yes ; then + CF_WITH_PCRE2 + if test "$with_pcre2" = no ; then + CF_WITH_PCRE + if test "$with_pcre" = no ; then + CF_REGEX + if test "X$cf_cv_regex_hdrs" != "Xregex.h" ; then + AC_MSG_ERROR([Only POSIX, PCRE, or PCRE2 regular expressions are supported]) + fi + fi + fi + AC_DEFINE(OPT_SELECT_REGEX,1,[Define to 1 to enable regular-expression selections]) +fi + +AC_MSG_CHECKING(if you want support for right-scrollbar) +CF_ARG_DISABLE(rightbar, + [ --disable-rightbar disable right-scrollbar support], + [enable_rightbar=no], + [enable_rightbar=yes]) +AC_MSG_RESULT($enable_rightbar) +if test "$enable_rightbar" = yes ; then + AC_DEFINE(SCROLLBAR_RIGHT,1,[Define to 1 to enable right-scrollbar support]) +fi + +AC_MSG_CHECKING(if you want check for redundant name-change) +CF_ARG_DISABLE(samename, + [ --disable-samename disable check for redundant name-change], + [enable_samename=no], + [enable_samename=yes]) +AC_MSG_RESULT($enable_samename) +test "$enable_samename" = no && AC_DEFINE(OPT_SAME_NAME,0,[Define to 0 to disable check for redundant name-change]) + +AC_MSG_CHECKING(if you want support for selection-actions) +CF_ARG_DISABLE(selection-ops, + [ --disable-selection-ops disable selection-action operations], + [enable_selection_ops=no], + [enable_selection_ops=yes]) +AC_MSG_RESULT($enable_selection_ops) +test "$enable_selection_ops" = no && AC_DEFINE(OPT_SELECTION_OPS,0,[Define to 0 disable selection-action operations]) + +AC_MSG_CHECKING(if you want support for session management) +CF_ARG_DISABLE(session-mgt, + [ --disable-session-mgt disable support for session management], + [enable_session_mgt=no], + [enable_session_mgt=yes]) +AC_MSG_RESULT($enable_session_mgt) +test "$enable_session_mgt" = no && AC_DEFINE(OPT_SESSION_MGT,0,[Define to 0 to disable support for session management]) + +AC_MSG_CHECKING(if you want to use termcap function-keys) +CF_ARG_DISABLE(tcap-fkeys, + [ --disable-tcap-fkeys disable termcap function-keys support], + [enable_tcap_fkeys=no], + [enable_tcap_fkeys=yes]) +AC_MSG_RESULT($enable_tcap_fkeys) +test "$enable_tcap_fkeys" = yes && AC_DEFINE(OPT_TCAP_FKEYS,1,[Define to 1 to disable termcap function-keys support]) + +AC_MSG_CHECKING(if you want to use termcap-query/report) +CF_ARG_DISABLE(tcap-query, + [ --disable-tcap-query disable compiled-in termcap-query support], + [enable_tcap_query=no], + [enable_tcap_query=yes]) +AC_MSG_RESULT($enable_tcap_query) +test "$enable_tcap_query" = yes && AC_DEFINE(OPT_TCAP_QUERY,1,[Define to 1 to disable compiled-in termcap-query support]) + +AC_MSG_CHECKING(if you want support for tek4014) +CF_ARG_DISABLE(tek4014, + [ --disable-tek4014 disable tek4014 emulation], + [enable_tek4014=no], + [enable_tek4014=yes]) +AC_MSG_RESULT($enable_tek4014) +if test "$enable_tek4014" = no ; then + AC_DEFINE(OPT_TEK4014,0,[Define to 0 to disable tek4014 emulation]) +else + EXTRAHDRS="$EXTRAHDRS Tekparse.h" + EXTRASRCS="$EXTRASRCS TekPrsTbl.c Tekproc.c" + EXTRAOBJS="$EXTRAOBJS TekPrsTbl.o Tekproc.o" +fi + +AC_MSG_CHECKING(if you want pulldown menus with a toolbar) +CF_ARG_ENABLE(toolbar, + [ --enable-toolbar compile-in toolbar for pulldown menus], + [enable_toolbar=yes], + [enable_toolbar=no]) +AC_MSG_RESULT($enable_toolbar) +if test "$enable_toolbar" = yes ; then + AC_DEFINE(OPT_TOOLBAR,1,[Define to 1 to compile-in toolbar for pulldown menus]) +fi + +AC_MSG_CHECKING(if you want VT52 emulation) +CF_ARG_DISABLE(vt52, + [ --disable-vt52 disable VT52 emulation], + [enable_vt52=no], + [enable_vt52=yes]) +AC_MSG_RESULT($enable_vt52) +test "$enable_vt52" = no && AC_DEFINE(OPT_VT52_MODE,0,[Define to 0 to disable VT52 emulation]) + +AC_MSG_CHECKING(if you want wide-attribute support) +CF_ARG_DISABLE(wide-attrs, + [ --disable-wide-attrs disable wide-attribute support], + [enable_wattr=no], + [enable_wattr=yes]) +AC_MSG_RESULT($enable_wattr) + +if test x$enable_wattr = xno && test x$enable_direct_color = xyes ; then + AC_MSG_WARN(overriding wide-attributes to support direct color) + enable_wattr=yes +fi + +AC_MSG_CHECKING(if you want wide-character support) +CF_ARG_DISABLE(wide-chars, + [ --disable-wide-chars disable wide-character support], + [enable_wchar=no], + [enable_wchar=yes]) +AC_MSG_RESULT($enable_wchar) +test "x$enable_wattr" = xno && AC_DEFINE(OPT_WIDE_ATTRS,0,[Define to 0 to disable rarely-used SGR features]) + +AC_MSG_CHECKING(if you want only 16-bit character support) +CF_ARG_ENABLE(16bit-chars, + [ --enable-16bit-chars enable 16-bit character support], + [enable_16bit_chars=yes], + [enable_16bit_chars=no]) +AC_MSG_RESULT($enable_16bit_chars) + +if test "$enable_16bit_chars" = yes ; then + AC_DEFINE(OPT_WIDER_ICHAR,0,[Define to 0 to enable 16-bit character support]) + enable_wchar=yes +fi + +if test "$enable_wchar" = yes ; then + +AC_MSG_CHECKING(if you want to use mini-luit/Latin9 built-in support) +CF_ARG_ENABLE(mini-luit, + [ --enable-mini-luit enable mini-luit (built-in Latin9 support)], + [enable_mini_luit=yes], + [enable_mini_luit=no]) +AC_MSG_RESULT($enable_mini_luit) +if test "$enable_mini_luit" = yes ; then + AC_DEFINE(OPT_MINI_LUIT,1,[Define to 1 to enable mini-luit (built-in Latin9 support)]) +fi + +AC_MSG_CHECKING(if you want to use luit) +CF_ARG_DISABLE(luit, + [ --disable-luit enable luit filter (Unicode translation)], + [enable_luit=no], + [enable_luit=yes]) +AC_MSG_RESULT($enable_luit) +if test "$enable_luit" = yes ; then + AC_DEFINE(OPT_LUIT_PROG,1,[Define to 1 to enable luit filter (Unicode translation)]) + CF_PATH_PROG(LUIT,xterm-filter,bluit luit) +fi + + AC_DEFINE(OPT_WIDE_CHARS,1,[Define to 1 to enable wide-character support]) + EXTRAHDRS="$EXTRAHDRS charclass.h precompose.h wcwidth.h" + EXTRASRCS="$EXTRASRCS charclass.c precompose.c wcwidth.c" + EXTRAOBJS="$EXTRAOBJS charclass.o precompose.o wcwidth.o" +fi + +AC_MSG_CHECKING(if you want dynamic-abbreviation support) +CF_ARG_ENABLE(dabbrev, + [ --enable-dabbrev enable dynamic-abbreviation support], + [enable_dabbrev=yes], + [enable_dabbrev=no]) +AC_MSG_RESULT($enable_dabbrev) +if test "$enable_dabbrev" = yes ; then + AC_DEFINE(OPT_DABBREV,1,[Define to 1 to enable dynamic-abbreviation support]) +fi + +AC_MSG_CHECKING(if you want DECterm Locator support) +CF_ARG_ENABLE(dec-locator, + [ --enable-dec-locator enable DECterm Locator support], + [enable_dec_locator=yes], + [enable_dec_locator=no]) +AC_MSG_RESULT($enable_dec_locator) +if test "$enable_dec_locator" = yes ; then + AC_DEFINE(OPT_DEC_LOCATOR,1,[Define to 1 to enable DECterm Locator support]) +fi + +AC_MSG_CHECKING(if you want XHTML and SVG screen dump support) +CF_ARG_DISABLE(screen-dumps, + [ --disable-screen-dumps disable XHTML and SVG screen dumps], + [enable_screen_dumps=no], + [enable_screen_dumps=yes]) +AC_MSG_RESULT($enable_screen_dumps) +if test "$enable_screen_dumps" = yes ; then + EXTRASRCS="$EXTRASRCS html.c svg.c" + EXTRAOBJS="$EXTRAOBJS html.o svg.o" +else + AC_DEFINE(OPT_SCREEN_DUMPS,0,[Define to 0 to disable XHTML and SVG screen dump support]) +fi + +AC_MSG_CHECKING(if you want ReGIS graphics support) +CF_ARG_ENABLE(regis-graphics, + [ --enable-regis-graphics enable ReGIS graphics support], + [enable_regis_graphics=yes], + [enable_regis_graphics=no]) +AC_MSG_RESULT($enable_regis_graphics) +if test "$enable_regis_graphics" = yes ; then + AC_DEFINE(OPT_REGIS_GRAPHICS,1,[Define to 1 to enable ReGIS graphics support]) + EXTRAHDRS="$EXTRAHDRS graphics_regis.h" + EXTRASRCS="$EXTRASRCS graphics_regis.c" + EXTRAOBJS="$EXTRAOBJS graphics_regis.o" + CF_MATH_LIB +fi + +AC_MSG_CHECKING(if you want sixel graphics support) +CF_ARG_DISABLE(sixel-graphics, + [ --disable-sixel-graphics disable sixel graphics support], + [enable_sixel_graphics=no], + [enable_sixel_graphics=yes]) +AC_MSG_RESULT($enable_sixel_graphics) +if test "$enable_sixel_graphics" = yes ; then + AC_DEFINE(OPT_SIXEL_GRAPHICS,1,[Define to 1 to enable sixel graphics support]) + EXTRAHDRS="$EXTRAHDRS graphics_sixel.h" + EXTRASRCS="$EXTRASRCS graphics_sixel.c" + EXTRAOBJS="$EXTRAOBJS graphics_sixel.o" +fi + +if test "$enable_regis_graphics" = yes || test "$enable_sixel_graphics" = yes ; then + AC_DEFINE(OPT_GRAPHICS,1,[Defined to 1 to if any graphics mode is enabled]) + EXTRAHDRS="$EXTRAHDRS graphics.h" + EXTRASRCS="$EXTRASRCS graphics.c" + EXTRAOBJS="$EXTRAOBJS graphics.o" +fi + +AC_MSG_CHECKING(if you want VT420 rectangle support) +CF_ARG_DISABLE(rectangles, + [ --disable-rectangles disable VT420 rectangle support], + [enable_rectangles=no], + [enable_rectangles=yes]) +AC_MSG_RESULT($enable_rectangles) +if test "$enable_rectangles" = yes ; then + AC_DEFINE(OPT_DEC_RECTOPS,1,[Define to 1 to disable VT420 rectangle support]) +fi + +AC_MSG_CHECKING(if you want -ziconbeep option) +CF_ARG_DISABLE(ziconbeep, + [ --disable-ziconbeep disable -ziconbeep option], + [enable_ziconbeep=no], + [enable_ziconbeep=yes]) +AC_MSG_RESULT($enable_ziconbeep) +test "$enable_ziconbeep" = no && AC_DEFINE(OPT_ZICONBEEP,0,[Define to 0 to disable -ziconbeep option]) + +############################################################################### +CF_HELP_MESSAGE(Testing/development Options:) + +AC_MSG_CHECKING(if you want debugging traces) +CF_ARG_ENABLE(trace, + [ --enable-trace test: set to enable debugging traces], + [enable_trace=yes], + [enable_trace=no]) +AC_MSG_RESULT($enable_trace) +if test "$enable_trace" = yes ; then + AC_DEFINE(OPT_TRACE,1,[Define to 1 to enable debugging traces]) + EXTRASRCS="$EXTRASRCS trace.c" + EXTRAOBJS="$EXTRAOBJS trace.o" +fi + +CF_DISABLE_LEAKS +CF_DISABLE_ECHO + +AC_MSG_CHECKING(if you want magic cookie emulation) +CF_ARG_ENABLE(xmc-glitch, + [ --enable-xmc-glitch test: enable xmc magic-cookie emulation], + [enable_xmc=yes], + [enable_xmc=no]) +AC_MSG_RESULT($enable_xmc) +if test "$enable_xmc" = yes ; then + AC_DEFINE(OPT_XMC_GLITCH,1,[Define to 1 to enable xmc magic-cookie emulation]) + EXTRASRCS="$EXTRASRCS testxmc.c" + EXTRAOBJS="$EXTRAOBJS testxmc.o" +fi + +dnl FIXME - extra test needed to make tcap-fkeys work on HPUX +AC_CHECK_FUNCS(tigetstr) + +dnl only check for ncurses' use_extended_names if really not using termcap +if test -n "$cf_cv_lib_part_tgetent"; then + AC_CHECK_FUNCS(use_extended_names) +fi + +if test -n "$GCC" ; then +AC_MSG_CHECKING(if you want to turn on gcc warnings) +CF_ARG_ENABLE(warnings, + [ --enable-warnings test: turn on GCC compiler warnings], + [with_warnings=yes], + [with_warnings=no]) +AC_MSG_RESULT($with_warnings) +if test "$with_warnings" = yes +then + CF_GCC_ATTRIBUTES + CF_GCC_WARNINGS(Wdeclaration-after-statement Wextra Wno-unknown-pragmas Wswitch-enum Wno-cast-qual) +fi +fi + +AC_SUBST(EXTRA_CFLAGS) +AC_SUBST(CHARPROC_DEPS) +AC_SUBST(EXTRAHDRS) +AC_SUBST(EXTRASRCS) +AC_SUBST(EXTRAOBJS) + +test "$disable_setuid" = yes && AC_DEFINE(DISABLE_SETUID,1,[Define to 1 if you want to disable setuid]) +test "$disable_setgid" = yes && AC_DEFINE(DISABLE_SETGID,1,[Define to 1 if you want to disable setgid]) + +if test $disable_setuid = yes ; then + MAY_SETUID="#" + NOT_SETUID= +elif test $disable_setgid = yes ; then + MAY_SETUID="#" + NOT_SETUID= +else + MAY_SETUID= + NOT_SETUID="#" +fi + +AC_SUBST(MAY_SETUID) +AC_SUBST(NOT_SETUID) + +### remove from CPPFLAGS the optional features we define in xtermcfg.h +### or other conflicting symbols that may be defined via imake: +for cf_def in \ + __STDC__ \ + ALLOWLOGGING \ + ALLOWLOGFILEEXEC \ + OPT_LUIT_PROG \ + OPT_WIDE_CHARS \ + SCROLLBAR_RIGHT \ + USE_TTY_GROUP \ + USE_UTEMPTER \ + XRENDERFONT +do + CPPFLAGS=`echo "$CPPFLAGS" | sed -e s/-D$cf_def//` +done + +CF_MAKE_TAGS +CF_DISABLE_RPATH_HACK + +# Force plink.sh to not trim pcre's libraries, which have the same symbol +# names as the system regexp. +if test "$with_pcre" != no +then + LIBS=`echo "$LIBS" | sed -e 's/-lpcre/-kpcre/g'` +fi + +### output xtermcfg.h, etc +AC_CONFIG_FILES([Makefile df-install minstall:minstall.in]) +AC_OUTPUT diff --git a/ports/xterm/xterm-359/ctlseqs.ms b/ports/xterm/xterm-359/ctlseqs.ms new file mode 100644 index 0000000..fcb2f69 --- /dev/null +++ b/ports/xterm/xterm-359/ctlseqs.ms @@ -0,0 +1,4057 @@ +.\"#! troff -ms $1 -*- Nroff -*- +.\" "Xterm Control Sequences" document +.\" $XTermId: ctlseqs.ms,v 1.594 2020/08/03 23:44:47 tom Exp $ +.\" +.\" +.\" Copyright 1996-2019,2020 by Thomas E. Dickey +.\" +.\" All Rights Reserved +.\" +.\" Permission is hereby granted, free of charge, to any person obtaining a +.\" copy of this software and associated documentation files (the +.\" "Software"), to deal in the Software without restriction, including +.\" without limitation the rights to use, copy, modify, merge, publish, +.\" distribute, sublicense, and/or sell copies of the Software, and to +.\" permit persons to whom the Software is furnished to do so, subject to +.\" the following conditions: +.\" +.\" The above copyright notice and this permission notice shall be included +.\" in all copies or substantial portions of the Software. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +.\" IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +.\" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +.\" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +.\" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +.\" +.\" Except as contained in this notice, the name(s) of the above copyright +.\" holders shall not be used in advertising or otherwise to promote the +.\" sale, use or other dealings in this Software without prior written +.\" authorization. +.\" +.\" +.\" Copyright 1991, 1994 X Consortium +.\" +.\" Permission is hereby granted, free of charge, to any person obtaining +.\" a copy of this software and associated documentation files (the +.\" "Software"), to deal in the Software without restriction, including +.\" without limitation the rights to use, copy, modify, merge, publish, +.\" distribute, sublicense, and/or sell copies of the Software, and to +.\" permit persons to whom the Software is furnished to do so, subject to +.\" the following conditions: +.\" +.\" The above copyright notice and this permission notice shall be +.\" included in all copies or substantial portions of the Software. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +.\" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +.\" IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR +.\" OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +.\" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +.\" OTHER DEALINGS IN THE SOFTWARE. +.\" +.\" Except as contained in this notice, the name of the X Consortium shall +.\" not be used in advertising or otherwise to promote the sale, use or +.\" other dealings in this Software without prior written authorization +.\" from the X Consortium. +.\" +.\" X Window System is a trademark of X Consortium, Inc. +.\" +.\" Originally written by Edward Moy, University of California, +.\" Berkeley, edmoy@violet.berkeley.edu, for the X.V10R4 xterm. +.\" The X Consortium staff has since updated it for X11. +.\" Updated by Thomas E. Dickey for XFree86 3.2 - XFree86 4.3, and afterward. +.\" +.\" Run this file through troff and use the -ms macro package. +.\" +.ds XT XTerm +.ds xt xterm +.ds LF Patch #359 +.ds RF 2020/08/03 +.\" +.if n .pl 9999v \" no page breaks in nroff +.ND +.\" Start a list of controls +.de St +.nr pD \\n[PD] +.nr PD 0 +.nr PI 1.0i +.nr VS 16 +.sp +.. +.\" End a list of controls +.de Ed +.nr PD \\n[pD] +.nr VS 12 +.br +.. +.\" Bulleted paragraph +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.\" Normal leading paragraph +.de lP +.if n .sp +.LP +.. +.\" Filler before ".IP" (how to pass parameters to that?) +.de iP +.br +.if n .sp +.. +.\" Normal internal paragraph +.de sP +.br +.if n .sp +.if t .sp 0.5 +.. +.\" Section header +.de Sh +.ds RH \\$1 +.iP +.SH +\\$1 +.. +.\" Subsection header +.de Ss +.iP +.if t .sp +.LP +.B +\\$* +.br +.. +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds `` \(lq +.el .ds `` `` +.ie \n(.g .ds '' \(rq +.el .ds '' '' +.ds CH \" as nothing +.ds LH \*(XT Control Sequences +.nr s 6*\n(PS/10 +.ds L \s\nsBEL\s0 +.ds E \s\nsESC\s0 +.ds T \s\nsTAB\s0 +.ds X \s\nsETX\s0 +.ds N \s\nsENQ\s0 +.ds ET \s\nsETB\s0 +.ds C \s\nsCAN\s0 +.ds S \s\nsSUB\s0 +.\" space between chars +.ie t .ds s \| +.el .ds s " \" +.nr [W \w'\*L'u +.nr w \w'\*E'u +.if \nw>\n([W .nr [W \nw +.nr w \w'\*T'u +.if \nw>\n([W .nr [W \nw +.nr w \w'\*X'u +.if \nw>\n([W .nr [W \nw +.nr w \w'\*N'u +.if \nw>\n([W .nr [W \nw +.nr w \w'\*(ET'u +.if \nw>\n([W .nr [W \nw +.nr w \w'\*C'u +.if \nw>\n([W .nr [W \nw +.nr w \w'\*S'u +.if \nw>\n([W .nr [W \nw +.nr [W +\w'\|\|'u +.de [] +.nr w \w'\\$2' +.nr H \\n([Wu-\\nwu +.nr h \\nHu/2u +.\" do fancy box in troff +.ie t .ds \\$1 \(br\v'-1p'\(br\v'1p'\h'\\nhu'\\$2\h'\\nHu-\\nhu'\(br\l'-\\n([Wu\(ul'\v'-1p'\(br\l'-\\n([Wu\(rn'\v'1p'\*s +.el .ds \\$1 \\$2\*s +.. +.[] Et \v'-1p'\*X\v'1p' +.[] En \v'-1p'\*N\v'1p' +.[] Be \v'-1p'\*L\v'1p' +.[] AP \v'-1p'\s\nsAPC\s0\v'1p' +.[] Bs \v'-1p'\s\nsBS\s0\v'1p' +.[] Cs \v'-1p'\s\nsCSI\s0\v'1p' +.[] S2 \v'-1p'\s\nsSS2\s0\v'1p' +.[] S3 \v'-1p'\s\nsSS3\s0\v'1p' +.[] SS \v'-1p'\s\nsSOS\s0\v'1p' +.[] Eg \v'-1p'\s\nsEPA\s0\v'1p' +.[] Sg \v'-1p'\s\nsSPA\s0\v'1p' +.[] Dc \v'-1p'\s\nsDCS\s0\v'1p' +.[] Ht \v'-1p'\s\nsHTS\s0\v'1p' +.[] Id \v'-1p'\s\nsIND\s0\v'1p' +.[] Nl \v'-1p'\s\nsNEL\s0\v'1p' +.[] Os \v'-1p'\s\nsOSC\s0\v'1p' +.[] RI \v'-1p'\s\nsRI\s0\v'1p' +.[] PM \v'-1p'\s\nsPM\s0\v'1p' +.[] ST \v'-1p'\s\nsST\s0\v'1p' +.[] Ta \v'-1p'\*T\v'1p' +.[] Lf \v'-1p'\s\nsLF\s0\v'1p' +.[] Vt \v'-1p'\s\nsVT\s0\v'1p' +.[] Ff \v'-1p'\s\nsFF\s0\v'1p' +.[] Np \v'-1p'\s\nsNP\s0\v'1p' +.[] Cr \v'-1p'\s\nsCR\s0\v'1p' +.[] So \v'-1p'\s\nsSO\s0\v'1p' +.[] Sp \v'-1p'\s\nsSP\s0\v'1p' +.[] Si \v'-1p'\s\nsSI\s0\v'1p' +.[] Eb \v'-1p'\*(ET\v'1p' +.[] Ca \v'-1p'\*C\v'1p' +.[] Su \v'-1p'\*S\v'1p' +.[] Es \v'-1p'\*E\v'1p' +.[] Fs \v'-1p'\s\nsFS\s0\v'1p' +.[] Gs \v'-1p'\s\nsGS\s0\v'1p' +.[] Rs \v'-1p'\s\nsRS\s0\v'1p' +.[] Us \v'-1p'\s\nsUS\s0\v'1p' +.[] XX \v'-1p'\s\nsXX\s0\v'1p' +.[] $ $ +.[] # # +.[] % % +.[] (( ( +.[] ) ) +.[] * * +.[] + + +.[] , , +.[] - \- +.[] . . +.[] 0 0 +.[] 1 1 +.[] 2 2 +.[] 3 3 +.[] 4 4 +.[] 5 5 +.[] 6 6 +.[] 7 7 +.[] 8 8 +.[] 9 9 +.[] : : +.[] ; ; +.[] = = +.[] / / +.[] < < +.[] > > +.[] ? ? +.[] @ @ +.[] A A +.[] cB B +.[] C C +.[] D D +.[] E E +.[] F F +.[] G G +.[] H H +.[] I I +.[] J J +.[] K K +.[] L L +.[] M M +.[] N N +.[] O O +.[] P P +.[] Q Q +.[] R R +.[] S S +.[] T T +.[] V V +.[] W W +.[] XX X +.[] Y Y +.[] Z Z +.[] [[ [ +.[] ]] ] +.[] bS \\e +.[] { { +.[] ~ \(ti +.[] Dq \(dq +.[] & & +.[] ^ \(ha +.[] _ _ +.[] qu \&\(aq +.[] ` \` +.[] a a +.[] b b +.[] c c +.[] d d +.[] e e +.[] f f +.[] g g +.[] h h +.[] i i +.[] j j +.[] k k +.[] l l +.[] m m +.[] n n +.[] o o +.[] p p +.[] q q +.[] r r +.[] cs s +.[] t t +.[] u u +.[] v v +.[] w w +.[] x x +.[] y y +.[] z z +.[] | | +.[] } } +.[] ! ! +.ds Cc \fIC\fP +.ds Cb \fIC\v'.3m'\h'-.2m'\s-2b\s0\v'-.3m'\fP +.ds Cx \fIC\v'.3m'\h'-.2m'\s-2x\s0\v'-.3m'\fP +.ds Cy \fIC\v'.3m'\h'-.2m'\s-2y\s0\v'-.3m'\fP +.ds Pa \fIP\v'.3m'\h'-.2m'\s-2a\s0\v'-.3m'\fP +.ds Pb \fIP\v'.3m'\h'-.2m'\s-2b\s0\v'-.3m'\fP +.ds Pc \fIP\v'.3m'\h'-.2m'\s-2c\s0\v'-.3m'\fP +.ds Pd \fIP\v'.3m'\h'-.2m'\s-2d\s0\v'-.3m'\fP +.ds Pe \fIP\v'.3m'\h'-.2m'\s-2e\s0\v'-.3m'\fP +.ds Pg \fIP\v'.3m'\h'-.2m'\s-2g\s0\v'-.3m'\fP +.ds Ph \fIP\v'.3m'\h'-.2m'\s-2h\s0\v'-.3m'\fP +.ds Pi \fIP\v'.3m'\h'-.2m'\s-2i\s0\v'-.3m'\fP +.ds Pl \fIP\v'.3m'\h'-.2m'\s-2l\s0\v'-.3m'\fP +.ds Pm \fIP\v'.3m'\h'-.2m'\s-2m\s0\v'-.3m'\fP +.ds Pn \fIP\v'.3m'\h'-.2m'\s-2n\s0\v'-.3m'\fP +.ds Pp \fIP\v'.3m'\h'-.2m'\s-2p\s0\v'-.3m'\fP +.ds Pr \fIP\v'.3m'\h'-.2m'\s-2r\s0\v'-.3m'\fP +.ds Ps \fIP\v'.3m'\h'-.2m'\s-2s\s0\v'-.3m'\fP +.ds Pt \fIP\v'.3m'\h'-.2m'\s-2t\s0\v'-.3m'\fP +.ds Pu \fIP\v'.3m'\h'-.2m'\s-2u\s0\v'-.3m'\fP +.ds Pv \fIP\v'.3m'\h'-.2m'\s-2v\s0\v'-.3m'\fP +.ds Px \fIP\v'.3m'\h'-.2m'\s-2x\s0\v'-.3m'\fP +.ds Py \fIP\v'.3m'\h'-.2m'\s-2y\s0\v'-.3m'\fP +.ds Ix \fIx\fP +.ds Iy \fIy\fP +.ds Iw \fIw\fP +.ds Ih \fIh\fP +.ds Ir \fIr\fP +.ds Ic \fIc\fP +.ie t .nr LL 6.5i +.el .nr LL 72m +.if n .na +.TL +\*(XT Control Sequences +.AU +Edward Moy +.AI +University of California, Berkeley +.sp +Revised by +.AU +Stephen Gildea +.AI +X Consortium (1994) +.AU +Thomas Dickey +.AI +XFree86 Project (1996-2006) +invisible-island.net (2006-2020) +updated for \*(XT \*(LF (\*(RF) +.AU +. +.am BT \" add page numbers after first page +.ds CF % +.. +.Sh "Definitions" +.LP +Many controls use parameters, shown in italics. +If a control uses a single parameter, only one parameter name is listed. +Some parameters (along with separating \*; characters) may be optional. +Other characters in the control are required. +.\".iP +.IP \*(Cc +A single (required) character. +.\".iP +.IP \*(Ps +A single (usually optional) numeric parameter, composed of one or more digits. +.\".iP +.IP \*(Pm +Any number of single numeric parameters, separated by \*; character(s). +Individual values for the parameters are listed with \*(Ps . +.\".iP +.IP \*(Pt +A text parameter composed of printable characters. +. +.Sh "Control Bytes, Characters, and Sequences" +.LP +ECMA-48 (aka \*(``ISO 6429\*('') documents C1 (8-bit) and C0 (7-bit) codes. +Those are respectively codes 128 to 159 and 0 to 31. +ECMA-48 avoids referring to these codes as characters, +because that term is associated with \fIgraphic characters\fP. +Instead, it uses \*(``bytes\*('' and \*(``codes\*('', +with occasional lapses to \*(``characters\*('' +where the meaning cannot be mistaken. +.LP +Controls (including the escape code 27) are processed once: +.bP +This means that a C1 control can be mistaken for badly-formed UTF-8 +when the terminal runs +in UTF-8 mode because C1 controls are valid \fIcontinuation bytes\fP of +a UTF-8 encoded (multibyte) value. +.bP +It is not possible to use a C1 control obtained from decoding the UTF-8 text, +because that would require reprocessing the data. +Consequently there is no ambiguity in the way +this document uses the term \*(``character\*('' to refer to +bytes in a control sequence. +.LP +The order of processing is a necessary consequence of the way ECMA-48 +is designed: +.bP +Each byte sent to the terminal can be unambiguously determined to +fall into one of a few categories (C0, C1 and graphic characters). +.bP +ECMA-48 is \fImodal\fP; once it starts processing a control sequence, +the terminal continues until the sequence is complete, +or some byte is found which is not allowed in the sequence. +.bP +Intermediate, parameter and final bytes may +use the same codes as graphic characters, +but they are processed as part of a control sequence and are not actually +graphic characters. +.bP +Eight-bit controls can have intermediate, etc., bytes in the range 160 to 255. +Those can be treated as their counterparts in the range 32 to 127. +.bP +Single-byte controls can be handled separately from multi-byte +control sequences because ECMA-48's rules are unambiguous. +.IP +As a special case, ECMA-48 (section 9) mentions that the control functions +shift-in and shift-out are allowed to occur within a 7-bit multibyte control +sequence because those cannot alter the meaning of the control sequence. +.bP +Some controls (such as \*(Os) introduce a string mode, +which is ended on a \*(ST (string terminator). +.IP +ECMA-48 describes only correct behavior, +telling what types of characters are expected +at each stage of the control sequences. +It says that the action taken in error recovery is implementation-dependent. +\fI\*(XT\fP decodes control sequences using a state machine. +It handles errors in decoding +i.e., unexpected characters, +by resetting to the initial (ground) state. +That is different from the treatment of unimplemented +(but correctly formatted) features. +.IP +If an application does not send the string terminator, that is also an error +from the standpoint of a user. +To accommodate users of those applications, \fI\*(xt\fP has resource +settings which allow workarounds: +.RS +.bP +The Linux console's palette sequences do not use a string terminator. +The \fBbrokenLinuxOSC\fP resource setting tells \fI\*(xt\fP to ignore +those particular sequences. +.bP +The terminal should accept single-byte controls within the string. +But some applications omit a string terminator, +like the Linux console. +The \fBbrokenStringTerm\fP resource setting tells \fI\*(xt\fP to exit +string mode if it decodes a common control character such as carriage return +before the string terminator. +.RE +. +.Sh "C1 (8-Bit) Control Characters" +.LP +The \fI\*(xt\fP program recognizes both 8-bit and 7-bit control characters. +It generates 7-bit controls (by default) or 8-bit if S8C1T is enabled. +The following pairs of 7-bit and 8-bit control characters are equivalent: +.St +.IP \\*(Es\\*D +Index (\*(Id is 0x84). +.iP +.IP \\*(Es\\*E +Next Line (\*(Nl is 0x85). +.iP +.IP \\*(Es\\*H +Tab Set (\*(Ht is 0x88). +.iP +.IP \\*(Es\\*M +Reverse Index (\*(RI is 0x8d). +.iP +.IP \\*(Es\\*N +Single Shift Select of G2 Character Set (\*(S2 is 0x8e), VT220. +This affects next character only. +.iP +.IP \\*(Es\\*O +Single Shift Select of G3 Character Set (\*(S3 is 0x8f), VT220. +This affects next character only. +.iP +.IP \\*(Es\\*P +Device Control String (\*(Dc is 0x90). +.iP +.IP \\*(Es\\*V +Start of Guarded Area (\*(Sg is 0x96). +.iP +.IP \\*(Es\\*W +End of Guarded Area (\*(Eg is 0x97). +.iP +.IP \\*(Es\\*(XX +Start of String (\*(SS is 0x98). +.iP +.IP \\*(Es\\*Z +Return Terminal ID (DECID is 0x9a). +Obsolete form of \*(Cs\*c (DA). +.iP +.IP \\*(Es\\*([[ +Control Sequence Introducer (\*(Cs is 0x9b). +.iP +.IP \\*(Es\\*(bS +String Terminator (\*(ST is 0x9c). +.iP +.IP \\*(Es\\*(]] +Operating System Command (\*(Os is 0x9d). +.iP +.IP \\*(Es\\*^ +Privacy Message (\*(PM is 0x9e). +.iP +.IP \\*(Es\\*_ +Application Program Command (\*(AP is 0x9f). +.Ed +.sp +.LP +These control characters are used in the vtXXX emulation. +. +.Sh "VT100 Mode" +.LP +In this document, \*(``VT100\*('' refers not only to VT100/VT102, +but also to the succession of upward-compatible terminals produced +by DEC (Digital Equipment Corporation) +from the mid-1970s for about twenty years. +For brevity, the document refers to the related models: + \*(``VT200\*('' as VT220/VT240, + \*(``VT300\*('' as VT320/VT340, + \*(``VT400\*('' as VT420, and + \*(``VT500\*('' as VT510/VT520/VT525. +.LP +Most of these control sequences are standard VT102 control sequences, +but there is support for later DEC VT terminals +(i.e., VT220, VT320, VT420, VT510), +as well as ECMA-48 and \fIaixterm\fP color controls. +The only VT102 feature not supported is auto-repeat, +since the only way X provides for this will affect all windows. +.LP +There are additional control sequences to provide +\fI\*(xt-\fPdependent functions, such as the scrollbar or window size. +Where the function is specified by DEC or ECMA-48, the code assigned +to it is given in parentheses. +.LP +The escape codes to designate and invoke +character sets are specified by ISO 2022 (see that document for a +discussion of character sets). +.LP +Many of the features are optional; +\fI\*(xt\fP can be configured and built without support for them. +. +.Ss Single-character functions +.St +.IP \\*(Be +Bell (\*(Be is Ctrl-G). +. +.iP +.IP \\*(Bs +Backspace (\*(Bs is Ctrl-H). +. +.iP +.IP \\*(Cr +Carriage Return (\*(Cr is Ctrl-M). +. +.iP +.IP \\*(En +Return Terminal Status (\*(En is Ctrl-E). +Default response is an empty string, but may be overridden +by a resource \fBanswerbackString\fP. +. +.iP +.IP \\*(Ff +Form Feed or New Page (\*(Np). +(\*(Ff is Ctrl-L). +\*(Ff is treated the same as \*(Lf. +. +.iP +.IP \\*(Lf +Line Feed or New Line (NL). +(\*(Lf is Ctrl-J). +. +.iP +.IP \\*(Si +Switch to \fIStandard Character Set\fP (Ctrl-O is Shift In or LS0). +This invokes the G0 character set (the default) as GL. +.br +VT200 and up implement LS0. +. +.iP +.IP \\*(So +Switch to \fIAlternate Character Set\fP (Ctrl-N is Shift Out or LS1). +This invokes the G1 character set as GL. +.br +VT200 and up implement LS1. +. +.iP +.IP \\*(Sp +Space. +. +.iP +.IP \\*(Ta +Horizontal Tab (\*(Ht is Ctrl-I). +. +.iP +.IP \\*(Vt +Vertical Tab (\*(Vt is Ctrl-K). +This is treated the same as LF. +.Ed +. +.Ss Controls beginning with \*(Es +.LP +This excludes controls where \*(Es is part of a 7-bit +equivalent to 8-bit C1 controls, ordered by the final character(s). +.St +.IP \\*(Es\\*(Sp\\*F +7-bit controls (S7C1T), VT220. +This tells the terminal to send C1 control characters as 7-bit sequences, +e.g., its responses to queries. +DEC VT200 and up always accept 8-bit control sequences except when +configured for VT100 mode. +. +.iP +.IP \\*(Es\\*(Sp\\*G +8-bit controls (S8C1T), VT220. +This tells the terminal to send C1 control characters as 8-bit sequences, +e.g., its responses to queries. +DEC VT200 and up always accept 8-bit control sequences except when +configured for VT100 mode. +. +.iP +.IP \\*(Es\\*(Sp\\*L +Set ANSI conformance level 1, ECMA-43. +. +.iP +.IP \\*(Es\\*(Sp\\*M +Set ANSI conformance level 2, ECMA-43. +. +.iP +.IP \\*(Es\\*(Sp\\*N +Set ANSI conformance level 3, ECMA-43. +. +.iP +.IP \\*(Es\\*#\\*3 +DEC double-height line, top half (DECDHL), VT100. +. +.iP +.IP \\*(Es\\*#\\*4 +DEC double-height line, bottom half (DECDHL), VT100. +. +.iP +.IP \\*(Es\\*#\\*5 +DEC single-width line (DECSWL), VT100. +. +.iP +.IP \\*(Es\\*#\\*6 +DEC double-width line (DECDWL), VT100. +. +.iP +.IP \\*(Es\\*#\\*8 +DEC Screen Alignment Test (DECALN), VT100. +. +.iP +.IP \\*(Es\\*%\\*@ +Select default character set. +That is ISO 8859-1 (ISO 2022). +. +.iP +.IP \\*(Es\\*%\\*G +Select UTF-8 character set, ISO 2022. +. +.iP +.IP \\*(Es\\*(((\\*(Cc +Designate G0 Character Set, VT100, ISO 2022. +.br +Final character \*(Cc for designating 94-character sets. +In this list, +.RS +.bP +\*0, \*A and \*(cB were introduced in the VT100, +.bP +most were introduced in the VT200 series, +.bP +a few were introduced in the VT300 series, and +.bP +a few more were introduced in the VT500 series. +.RE +.br +The VT220 character sets, +together with a few others (such as Portuguese) are activated by +the National Replacement Character Set (NRCS) controls. +The term \*(``replacement\*('' says that the character set is formed +by replacing some of the characters in a set +(termed the \fIMultinational Character Set\fP) +with more useful ones for a given language. +The ASCII and DEC Supplemental character sets make up the two +halves of the Multinational Character set, +initially mapped to GL and GR. +.br +The valid final characters \*(Cc for this control are: + \*(Cc = \*A \(-> United Kingdom (UK), VT100. + \*(Cc = \*(cB \(-> United States (USASCII), VT100. + \*(Cc = \*C or \*5 \(-> Finnish, VT200. + \*(Cc = \*H or \*7 \(-> Swedish, VT200. + \*(Cc = \*K \(-> German, VT200. + \*(Cc = \*Q or \*9 \(-> French Canadian, VT200. + \*(Cc = \*R or \*f \(-> French, VT200. + \*(Cc = \*Y \(-> Italian, VT200. + \*(Cc = \*Z \(-> Spanish, VT200. + \*(Cc = \*4 \(-> Dutch, VT200. + \*(Cc = \*(Dq\*> \(-> Greek, VT500. + \*(Cc = \*%\*2 \(-> Turkish, VT500. + \*(Cc = \*%\*6 \(-> Portuguese, VT300. + \*(Cc = \*%\*= \(-> Hebrew, VT500. + \*(Cc = \*= \(-> Swiss, VT200. + \*(Cc = \*`, \*E or \*6 \(-> Norwegian/Danish, VT200. +.br +The final character \*A is a special case, +since the same final character is +used by the VT300-control for the 96-character British Latin-1. +.br +There are a few other 94-character sets: + \*(Cc = \*0 \(-> DEC Special Character and Line Drawing Set, VT100. + \*(Cc = \*< \(-> DEC Supplemental, VT200. + \*(Cc = \*> \(-> DEC Technical, VT300. +.br +These are documented as NRCS: + \*(Cc = \*(Dq\*4 \(-> DEC Hebrew, VT500. + \*(Cc = \*(Dq\*? \(-> DEC Greek, VT500. + \*(Cc = \*%\*0 \(-> DEC Turkish, VT500. + \*(Cc = \*%\*5 \(-> DEC Supplemental Graphics, VT300. + \*(Cc = \*&\*4 \(-> DEC Cyrillic, VT500. +.br +The VT520 reference manual lists a few more, +but no documentation has been found for the mappings: + \*(Cc = \*%\*3 \(-> SCS NRCS, VT500. + \*(Cc = \*&\*5 \(-> DEC Russian, VT500. +.iP +.IP \\*(Es\\*)\\*(Cc +Designate G1 Character Set, ISO 2022, VT100. +.br +The same character sets apply as for \*(Es\*(((\*(Cc. +. +.iP +.IP \\*(Es\\**\\*(Cc +Designate G2 Character Set, ISO 2022, VT220. +.br +The same character sets apply as for \*(Es\*(((\*(Cc. +. +.iP +.IP \\*(Es\\*+\\*(Cc +Designate G3 Character Set, ISO 2022, VT220. +.br +The same character sets apply as for \*(Es\*(((\*(Cc. +. +.iP +.IP \\*(Es\\*-\\*(Cc +Designate G1 Character Set, VT300. +.br +These controls apply only to 96-character sets. +Unlike the 94-character sets, these can have different values than +ASCII space and DEL for the mapping of 0x20 and 0x7f. +The valid final characters \*(Cc for this control are: + \*(Cc = \*A \(-> ISO Latin-1 Supplemental, VT300. + \*(Cc = \*F \(-> ISO Greek Supplemental, VT500. + \*(Cc = \*H \(-> ISO Hebrew Supplemental, VT500. + \*(Cc = \*L \(-> ISO Latin-Cyrillic, VT500. + \*(Cc = \*M \(-> ISO Latin-5 Supplemental, VT500. +. +.iP +.IP \\*(Es\\*.\\*(Cc +Designate G2 Character Set, VT300. +.br +The same character sets apply as for \*(Es\*-\*(Cc. +. +.iP +.IP \\*(Es\\*/\\*(Cc +Designate G3 Character Set, VT300. +.br +The same character sets apply as for \*(Es\*-\*(Cc. +. +.iP +.IP \\*(Es\\*6 +Back Index (DECBI), VT420 and up. +. +.iP +.IP \\*(Es\\*7 +Save Cursor (DECSC), VT100. +. +.iP +.IP \\*(Es\\*8 +Restore Cursor (DECRC), VT100. +. +.iP +.IP \\*(Es\\*9 +Forward Index (DECFI), VT420 and up. +. +.iP +.IP \\*(Es\\*= +Application Keypad (DECKPAM). +. +.iP +.IP \\*(Es\\*> +Normal Keypad (DECKPNM), VT100. +. +.iP +.IP \\*(Es\\*F +Cursor to lower left corner of screen. +This is enabled by the \fBhpLowerleftBugCompat\fP resource. +. +.iP +.IP \\*(Es\\*c +Full Reset (RIS), VT100. +. +.iP +.IP \\*(Es\\*l +Memory Lock (per HP terminals). +Locks memory above the cursor. +. +.iP +.IP \\*(Es\\*m +Memory Unlock (per HP terminals). +. +.iP +.IP \\*(Es\\*n +Invoke the G2 Character Set as GL (LS2) as GL. +. +.iP +.IP \\*(Es\\*o +Invoke the G3 Character Set as GL (LS3) as GL. +. +.iP +.IP \\*(Es\\*| +Invoke the G3 Character Set as GR (LS3R). +. +.iP +.IP \\*(Es\\*} +Invoke the G2 Character Set as GR (LS2R). +. +.iP +.IP \\*(Es\\*~ +Invoke the G1 Character Set as GR (LS1R), VT100. +.Ed +. +.Ss Application Program-Command functions +.St +.IP \\*(AP\\*(Pt\\*s\\*(ST +None. +\fI\*(xt\fP implements no \*(AP functions; \*(Pt is ignored. +\*(Pt need not be printable characters. +.Ed +.\" +.Ss Device-Control functions +.St +.IP \\*(Dc\\*(Ps\\*s\\*;\\*(Ps\\*s\\*|\\*(Pt\\*s\\*(ST +User-Defined Keys (DECUDK), VT220 and up. +.iP +The first parameter: + \*(Ps = \*0 \(-> Clear all UDK definitions before starting (default). + \*(Ps = \*1 \(-> Erase Below (default). +.iP +The second parameter: + \*(Ps = \*0 \(<- Lock the keys (default). + \*(Ps = \*1 \(<- Do not lock. +.iP +The third parameter is a ';'-separated list of strings denoting +the key-code separated by a '/' from the hex-encoded key value. +The key codes correspond to the DEC function-key codes (e.g., F6=17). +. +.iP +.IP \\*(Dc\\*$\\*q\\*(Pt\\*s\\*(ST +Request Status String (DECRQSS), VT420 and up. +.br +The string following the \*(``q\*('' is one of the following: + \*m \(-> SGR + \*(Dq\*p \(-> DECSCL + \*(Sp\*q \(-> DECSCUSR + \*(Dq\*q \(-> DECSCA + \*r \(-> DECSTBM + \*(cs \(-> DECSLRM + \*t \(-> DECSLPP + \*$\*| \(-> DECSCPP + \**\*| \(-> DECSNLS +.br +\fI\*(xt\fP responds with +\*(Dc\*1\*$\*r\*(Pt\*s\*(ST +for valid requests, replacing the \*(Pt with the corresponding \*(Cs +string, +or +\*(Dc\*0\*$\*r\*(Pt\*s\*(ST +for invalid requests. +.iP +.IP \\*(Dc\\*(Ps\\*s\\*$\\*t\\*(Pt\\*s\\*(ST +Restore presentation status (DECRSPS), VT320 and up. +The control can be converted from a response from DECCIR or DECTABSR +by changing the first \*(``u\*('' to a \*(``t\*('' + \*(Ps = \*1 \(-> DECCIR + \*(Ps = \*2 \(-> DECTABSR +. +.iP +.IP \\*(Dc\\*+\\*Q\\*(Pt\\*s\\*(ST +Request resource values (XTGETXRES), \fI\*(xt\fP. +The string following the \*(``Q\*('' is a list of names +encoded in hexadecimal (2 digits per character) +separated by \*; +which correspond to \fI\*(xt\fP resource names. +Only boolean, numeric and string resources are supported by this query. +.sP +\fI\*(xt\fP responds with +.br +\*(Dc\*1\*+\*R\*(Pt\*s\*(ST +for valid requests, adding to \*(Pt an \*=, +and the value of the corresponding resource that \fI\*(xt\fP is using, +or +.br +\*(Dc\*0\*+\*R\*(Pt\*s\*(ST +for invalid requests. +.br +The strings are encoded in hexadecimal (2 digits per character). +.Ed +. +.iP +.IP \\*(Dc\\*+\\*p\\*(Pt\\*s\\*(ST +Set Termcap/Terminfo Data (XTSETTCAP), \fI\*(xt\fP. +The string following the \*(``p\*('' is a name to use for retrieving data from +the terminal database. +The data will be used for the \*(``tcap\*('' keyboard +configuration's function- and special-keys, as well as by the +Request Termcap/Terminfo String control. +. +.iP +.IP \\*(Dc\\*+\\*q\\*(Pt\\*s\\*(ST +Request Termcap/Terminfo String (XTGETTCAP), \fI\*(xt\fP. +The string following the \*(``q\*('' is a list of names +encoded in hexadecimal (2 digits per character) +separated by \*; +which correspond to termcap or terminfo key names. +.br +A few special features are also recognized, which are not key names: +.RS +.bP +\fICo\fP for termcap colors (or \fIcolors\fP for terminfo colors), +and +.bP +\fITN\fP for termcap name (or \fIname\fP for terminfo name). +.bP +\fIRGB\fP for the ncurses direct-color extension. +.br +Only a terminfo name is provided, +since termcap applications cannot use this information. +.RE +.sP +\fI\*(xt\fP responds with +.br +\*(Dc\*1\*+\*r\*(Pt\*s\*(ST +for valid requests, adding to \*(Pt an \*=, +and the value of the corresponding string that \fI\*(xt\fP would send, +or +.br +\*(Dc\*0\*+\*r\*(Pt\*s\*(ST +for invalid requests. +.br +The strings are encoded in hexadecimal (2 digits per character). +.Ed +.\" +.Ss Functions using \*(Cs, ordered by the final character(s) +.St +.IP \\*(Cs\\*(Ps\\*s\\*@ +Insert \*(Ps (Blank) Character(s) (default = 1) (ICH). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(Sp\\*@ +Shift left \*(Ps columns(s) (default = 1) (SL), ECMA-48. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*A +Cursor Up \*(Ps Times (default = 1) (CUU). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(Sp\\*A +Shift right \*(Ps columns(s) (default = 1) (SR), ECMA-48. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(cB +Cursor Down \*(Ps Times (default = 1) (CUD). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*C +Cursor Forward \*(Ps Times (default = 1) (CUF). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*D +Cursor Backward \*(Ps Times (default = 1) (CUB). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*E +Cursor Next Line \*(Ps Times (default = 1) (CNL). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*F +Cursor Preceding Line \*(Ps Times (default = 1) (CPL). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*G +Cursor Character Absolute [column] (default = [row,1]) (CHA). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*;\\*(Ps\\*s\\*H +Cursor Position [row;column] (default = [1,1]) (CUP). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*I +Cursor Forward Tabulation \*(Ps tab stops (default = 1) (CHT). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*J +Erase in Display (ED), VT100. + \*(Ps = \*0 \(-> Erase Below (default). + \*(Ps = \*1 \(-> Erase Above. + \*(Ps = \*2 \(-> Erase All. + \*(Ps = \*3 \(-> Erase Saved Lines, \fI\*(xt\fP. +. +.iP +.IP \\*(Cs\\*?\\*(Ps\\*s\\*J +Erase in Display (DECSED), VT220. + \*(Ps = \*0 \(-> Selective Erase Below (default). + \*(Ps = \*1 \(-> Selective Erase Above. + \*(Ps = \*2 \(-> Selective Erase All. + \*(Ps = \*3 \(-> Selective Erase Saved Lines, \fI\*(xt\fP. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*K +Erase in Line (EL), VT100. + \*(Ps = \*0 \(-> Erase to Right (default). + \*(Ps = \*1 \(-> Erase to Left. + \*(Ps = \*2 \(-> Erase All. +. +.iP +.IP \\*(Cs\\*?\\*(Ps\\*s\\*K +Erase in Line (DECSEL), VT220. + \*(Ps = \*0 \(-> Selective Erase to Right (default). + \*(Ps = \*1 \(-> Selective Erase to Left. + \*(Ps = \*2 \(-> Selective Erase All. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*L +Insert \*(Ps Line(s) (default = 1) (IL). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*M +Delete \*(Ps Line(s) (default = 1) (DL). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*P +Delete \*(Ps Character(s) (default = 1) (DCH). +. +.iP +.IP \\*(Cs\\*#\\*P +.IP \\*(Cs\\*(Pm\\*s\\*#\\*P +Push current dynamic- and ANSI-palette colors onto stack +(XTPUSHCOLORS), \fI\*(xt\fP. +Parameters (integers in the range 1 through 10, since the default 0 will push) +may be used to store the palette into the stack without pushing. +. +.iP +.IP \\*(Cs\\*#\\*Q +.IP \\*(Cs\\*(Pm\\*s\\*#\\*Q +Pop stack to set dynamic- and ANSI-palette colors +(XTPOPCOLORS), \fI\*(xt\fP. +Parameters (integers in the range 1 through 10, since the default 0 will pop) +may be used to restore the palette from the stack without popping. +. +.iP +.IP \\*(Cs\\*#\\*R +Report the current entry on the palette stack, and the number of +palettes stored on the stack, using the same form as XTPOPCOLOR +(default = 0) +(XTREPORTCOLORS), \fI\*(xt\fP. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*S +Scroll up \*(Ps lines (default = 1) (SU), VT420, ECMA-48. +. +.iP +.IP \\*(Cs\\*?\\*(Pi\\*s\\*;\\*(Pa\\*s\\*;\\*(Pv\\*s\\*S +Set or request graphics attribute (XTSMGRAPHICS), \fI\*(xt\fP. +If configured to support either \fBSixel Graphics\fP or \fBReGIS Graphics\fP, +\fI\*(xt\fP accepts a three-parameter control sequence, where \*(Pi, +\*(Pa and \*(Pv are the \fIitem\fP, \fIaction\fP and \fIvalue\fP: +.sP + \*(Pi = \*1 \(-> item is number of color registers. + \*(Pi = \*2 \(-> item is Sixel graphics geometry (in pixels). + \*(Pi = \*3 \(-> item is ReGIS graphics geometry (in pixels). +.sP + \*(Pa = \*1 \(-> read attribute. + \*(Pa = \*2 \(-> reset to default. + \*(Pa = \*3 \(-> set to value in \*(Pv. + \*(Pa = \*4 \(-> read the maximum allowed value. +.sP + \*(Pv is ignored by \fI\*(xt\fP except when setting (\*(Pa == \*3). + \*(Pv = \fIn\fP \(<- A single integer is used for color registers. + \*(Pv = \fIwidth\fP\*s\*;\fIheight\fP \(<- Two integers for graphics geometry. +.sP +\fI\*(xt\fP replies with a control sequence of the same form: +.ID +\*(Cs\*?\*(Pi\*s\*;\*(Ps\*s\*;\*(Pv\*s\*S +.DE +where \*(Ps is the status: + \*(Ps = \*0 \(<- success. + \*(Ps = \*1 \(<- error in \*(Pi. + \*(Ps = \*2 \(<- error in \*(Pa. + \*(Ps = \*3 \(<- failure. +.sP +On success, \*(Pv represents the value read or set. +.sP +\fBNotes\fP: +.RS +.bP +The current implementation allows reading the graphics sizes, +but disallows modifying those sizes because that is done once, +using resource-values. +.bP +Graphics geometry is not necessarily the same as \*(``window size\*('' +(see the dtterm window manipulation extensions). +For example, \fI\*(xt\fP limits the maximum graphics geometry at compile time +(1000x1000 as of version 328) +although the window size can be larger. +.bP +While resizing a window will always change the current +graphics geometry, the reverse is not true. +Setting graphics geometry does not affect the window size. +.RE +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*T +Scroll down \*(Ps lines (default = 1) (SD), VT420. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*;\\*(Ps\\*s\\*;\\*(Ps\\*s\\*;\\*(Ps\\*s\\*;\\*(Ps\\*s\\*T +Initiate highlight mouse tracking (XTHIMOUSE), \*(xt. +Parameters are [func;startx;starty;firstrow;lastrow]. +See the section \fBMouse Tracking\fP. +. +.iP +.IP \\*(Cs\\*>\\*(Pm\\*s\\*T +Reset title mode features to default value (XTRMTITLE), \fI\*(xt\fP. +Normally, \*(``reset\*('' disables the feature. +It is possible to disable the ability to reset features +by compiling a different default for the title modes into \fI\*(xt\fP. +.iP + \*(Ps = \*0 \(-> Do not set window/icon labels using hexadecimal. + \*(Ps = \*1 \(-> Do not query window/icon labels using hexadecimal. + \*(Ps = \*2 \(-> Do not set window/icon labels using UTF-8. + \*(Ps = \*3 \(-> Do not query window/icon labels using UTF-8. +.iP +(See discussion of \fBTitle Modes\fP). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(XX +Erase \*(Ps Character(s) (default = 1) (ECH). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*Z +Cursor Backward Tabulation \*(Ps tab stops (default = 1) (CBT). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*^ +Scroll down \*(Ps lines (default = 1) (SD), ECMA-48. +.br +This was a publication error in the original ECMA-48 5th edition (1991) +corrected in 2003. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*` +Character Position Absolute [column] (default = [row,1]) (HPA). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*a +Character Position Relative [columns] (default = [row,col+1]) (HPR). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*b +Repeat the preceding graphic character \*(Ps times (REP). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*c +Send Device Attributes (Primary DA). + \*(Ps = \*0 or omitted \(-> request attributes from terminal. +The response depends on the \fBdecTerminalID\fP resource setting. + \(->\ \*(Cs\*?\*1\*;\*2\*c (\*(``VT100 with Advanced Video Option\*('') + \(->\ \*(Cs\*?\*1\*;\*0\*c (\*(``VT101 with No Options\*('') + \(->\ \*(Cs\*?\*4\*;\*6\*c (\*(``VT132 with Advanced Video and Graphics\*('') + \(->\ \*(Cs\*?\*6\*c (\*(``VT102\*('') + \(->\ \*(Cs\*?\*7\*c (\*(``VT131\*('') + \(->\ \*(Cs\*?\*1\*2\*;\*(Ps\*s\*c (\*(``VT125\*('') + \(->\ \*(Cs\*?\*6\*2\*;\*(Ps\*s\*c (\*(``VT220\*('') + \(->\ \*(Cs\*?\*6\*3\*;\*(Ps\*s\*c (\*(``VT320\*('') + \(->\ \*(Cs\*?\*6\*4\*;\*(Ps\*s\*c (\*(``VT420\*('') +.iP +The VT100-style response parameters do not mean anything by themselves. +VT220 (and higher) parameters do, +telling the host what features the terminal supports: + \*(Ps = \*1 \(-> 132-columns. + \*(Ps = \*2 \(-> Printer. + \*(Ps = \*3 \(-> ReGIS graphics. + \*(Ps = \*4 \(-> Sixel graphics. + \*(Ps = \*6 \(-> Selective erase. + \*(Ps = \*8 \(-> User-defined keys. + \*(Ps = \*9 \(-> National Replacement Character sets. + \*(Ps = \*1\*5 \(-> Technical characters. + \*(Ps = \*1\*6 \(-> Locator port. + \*(Ps = \*1\*7 \(-> Terminal state interrogation. + \*(Ps = \*1\*8 \(-> User windows. + \*(Ps = \*2\*1 \(-> Horizontal scrolling. + \*(Ps = \*2\*2 \(-> ANSI color, e.g., VT525. + \*(Ps = \*2\*8 \(-> Rectangular editing. + \*(Ps = \*2\*9 \(-> ANSI text locator (i.e., DEC Locator mode). +.iP +\fI\*(XT\fP supports part of the \fIUser windows\fP feature, +providing a single page (which corresponds to its visible window). +Rather than resizing the font to change the number of lines/columns in +a fixed-size display, \fI\*(xt\fP uses the window extension controls +(DECSNLS, DECSCPP, DECSLPP) to adjust its visible window's size. +The \*(``cursor coupling\*('' controls (DECHCCM, DECPCCM, DECVCCM) are ignored. +. +.iP +.IP \\*(Cs\\*=\\*(Ps\\*s\\*c +Send Device Attributes (Tertiary DA). + \*(Ps = \*0 \(-> report Terminal Unit ID (default), VT400. +\*(XT uses zeros for the site code and serial number in its DECRPTUI response. +. +.iP +.IP \\*(Cs\\*>\\*(Ps\\*s\\*c +Send Device Attributes (Secondary DA). + \*(Ps = \*0 or omitted \(-> request the terminal's identification code. +The response depends on the \fBdecTerminalID\fP resource setting. +It should apply only to VT220 and up, but \fI\*(xt\fP extends this to VT100. + \(-> \*(Cs\*s\*>\*(Pp\*s\*;\*(Pv\*s\*;\*(Pc\*s\*c +.br +where \*(Pp denotes the terminal type + \*(Pp = \*0 \(-> \*(``VT100\*(''. + \*(Pp = \*1 \(-> \*(``VT220\*(''. + \*(Pp = \*2 \(-> \*(``VT240\*('' or \*(``VT241\*(''. + \*(Pp = \*1\*8 \(-> \*(``VT330\*(''. + \*(Pp = \*1\*9 \(-> \*(``VT340\*(''. + \*(Pp = \*2\*4 \(-> \*(``VT320\*(''. + \*(Pp = \*3\*2 \(-> \*(``VT382\*(''. + \*(Pp = \*4\*1 \(-> \*(``VT420\*(''. + \*(Pp = \*6\*1 \(-> \*(``VT510\*(''. + \*(Pp = \*6\*4 \(-> \*(``VT520\*(''. + \*(Pp = \*6\*5 \(-> \*(``VT525\*(''. +.iP +and \*(Pv is the firmware version (for \fI\*(xt\fP, this was originally +the XFree86 patch number, starting with 95). +In a DEC terminal, \*(Pc indicates the ROM cartridge +registration number and is always zero. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*d +Line Position Absolute [row] (default = [1,column]) (VPA). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*e +Line Position Relative [rows] (default = [row+1,column]) (VPR). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*;\\*(Ps\\*s\\*f +Horizontal and Vertical Position [row;column] (default = [1,1]) (HVP). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*g +Tab Clear (TBC). + \*(Ps = \*0 \(-> Clear Current Column (default). + \*(Ps = \*3 \(-> Clear All. +. +.iP +.IP \\*(Cs\\*(Pm\\*s\\*h +Set Mode (SM). + \*(Ps = \*2 \(-> Keyboard Action Mode (AM). + \*(Ps = \*4 \(-> Insert Mode (IRM). + \*(Ps = \*1\*2 \(-> Send/receive (SRM). + \*(Ps = \*2\*0 \(-> Automatic Newline (LNM). +. +.iP +.IP \\*(Cs\\*?\\*(Pm\\*s\\*h +DEC Private Mode Set (DECSET). + \*(Ps = \*1 \(-> Application Cursor Keys (DECCKM), VT100. + \*(Ps = \*2 \(-> Designate USASCII for character sets G0-G3 (DECANM), VT100, +and set VT100 mode. + \*(Ps = \*3 \(-> 132 Column Mode (DECCOLM), VT100. + \*(Ps = \*4 \(-> Smooth (Slow) Scroll (DECSCLM), VT100. + \*(Ps = \*5 \(-> Reverse Video (DECSCNM), VT100. + \*(Ps = \*6 \(-> Origin Mode (DECOM), VT100. + \*(Ps = \*7 \(-> Auto-wrap Mode (DECAWM), VT100. + \*(Ps = \*8 \(-> Auto-repeat Keys (DECARM), VT100. + \*(Ps = \*9 \(-> Send Mouse X & Y on button press. +See the section \fBMouse Tracking\fP. +This is the X10 \fI\*(xt\fP mouse protocol. + \*(Ps = \*1\*0 \(-> Show toolbar (rxvt). + \*(Ps = \*1\*2 \(-> Start Blinking Cursor (AT&T 610). + \*(Ps = \*1\*3 \(-> Start Blinking Cursor (set only via resource or menu). + \*(Ps = \*1\*4 \(-> Enable XOR of Blinking Cursor control sequence and menu. + \*(Ps = \*1\*8 \(-> Print form feed (DECPFF), VT220. + \*(Ps = \*1\*9 \(-> Set print extent to full screen (DECPEX), VT220. + \*(Ps = \*2\*5 \(-> Show Cursor (DECTCEM), VT220. + \*(Ps = \*3\*0 \(-> Show scrollbar (rxvt). + \*(Ps = \*3\*5 \(-> Enable font-shifting functions (rxvt). + \*(Ps = \*3\*8 \(-> Enter Tektronix Mode (DECTEK), VT240, \fI\*(xt\fP. + \*(Ps = \*4\*0 \(-> Allow 80 \z\(<-\(-> 132 Mode, \fI\*(xt\fP. + \*(Ps = \*4\*1 \(-> \fBmore\fP(1) fix (see \fBcurses\fP resource). + \*(Ps = \*4\*2 \(-> Enable National Replacement Character sets +(DECNRCM), VT220. + \*(Ps = \*4\*4 \(-> Turn On Margin Bell, \fI\*(xt\fP. + \*(Ps = \*4\*5 \(-> Reverse-wraparound Mode, \fI\*(xt\fP. + \*(Ps = \*4\*6 \(-> Start Logging, \fI\*(xt\fP. +This is normally disabled by a compile-time option. + \*(Ps = \*4\*7 \(-> Use \fIAlternate Screen Buffer\fP, \fI\*(xt\fP. +This may be disabled by the \fBtiteInhibit\fP resource. + \*(Ps = \*6\*6 \(-> Application keypad (DECNKM), VT320. + \*(Ps = \*6\*7 \(-> Backarrow key sends backspace (DECBKM), VT340, VT420. +This sets the \fBbackarrowKey\fP resource to \*(``true\*(''. + \*(Ps = \*6\*9 \(-> Enable left and right margin mode (DECLRMM), VT420 and up. + \*(Ps = \*8\*0 \(-> Enable \fISixel Scrolling\fP (DECSDM). + \*(Ps = \*9\*5 \(-> Do not clear screen when DECCOLM is set/reset +(DECNCSM), VT510 and up. + \*(Ps = \*1\*0\*0\*0 \(-> Send Mouse X & Y on button press and release. +See the section \fBMouse Tracking\fP. +This is the X11 \fI\*(xt\fP mouse protocol. + \*(Ps = \*1\*0\*0\*1 \(-> Use Hilite Mouse Tracking, \fI\*(xt\fP. + \*(Ps = \*1\*0\*0\*2 \(-> Use Cell Motion Mouse Tracking, \fI\*(xt\fP. +See the section \fBButton-event tracking\fP. + \*(Ps = \*1\*0\*0\*3 \(-> Use All Motion Mouse Tracking, \fI\*(xt\fP. +See the section \fBAny-event tracking\fP. + \*(Ps = \*1\*0\*0\*4 \(-> Send \fBFocusIn/FocusOut\fP events, \fI\*(xt\fP. + \*(Ps = \*1\*0\*0\*5 \(-> Enable UTF-8 Mouse Mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*0\*6 \(-> Enable SGR Mouse Mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*0\*7 \(-> Enable \fIAlternate Scroll Mode\fP, \fI\*(xt\fP. +This corresponds to the \fBalternateScroll\fP resource. + \*(Ps = \*1\*0\*1\*0 \(-> Scroll to bottom on tty output (rxvt). +This sets the \fBscrollTtyOutput\fP resource to \*(``true\*(''. + \*(Ps = \*1\*0\*1\*1 \(-> Scroll to bottom on key press (rxvt). +This sets the \fBscrollKey\fP resource to \*(``true\*(''. + \*(Ps = \*1\*0\*1\*5 \(-> Enable urxvt Mouse Mode. + \*(Ps = \*1\*0\*1\*6 \(-> Enable SGR Mouse PixelMode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*3\*4 \(-> Interpret \*(``meta\*('' key, \fI\*(xt\fP. +This sets the eighth bit of keyboard input +(and enables the \fBeightBitInput\fP resource). + \*(Ps = \*1\*0\*3\*5 \(-> Enable special modifiers for Alt and NumLock keys, +\fI\*(xt\fP. +This enables the \fBnumLock\fP resource. + \*(Ps = \*1\*0\*3\*6 \(-> Send \*(Es when Meta modifies a key, \fI\*(xt\fP. +This enables the \fBmetaSendsEscape\fP resource. + \*(Ps = \*1\*0\*3\*7 \(-> Send DEL from the editing-keypad Delete key, +\fI\*(xt\fP. + \*(Ps = \*1\*0\*3\*9 \(-> Send \*(Es when Alt modifies a key, \fI\*(xt\fP. +This enables the \fBaltSendsEscape\fP resource, \fI\*(xt\fP. + \*(Ps = \*1\*0\*4\*0 \(-> Keep selection even if not highlighted, \fI\*(xt\fP. +This enables the \fBkeepSelection\fP resource. + \*(Ps = \*1\*0\*4\*1 \(-> Use the CLIPBOARD selection, \fI\*(xt\fP. +This enables the \fBselectToClipboard\fP resource. + \*(Ps = \*1\*0\*4\*2 \(-> Enable Urgency window manager hint +when Control-G is received, \fI\*(xt\fP. +This enables the \fBbellIsUrgent\fP resource. + \*(Ps = \*1\*0\*4\*3 \(-> Enable raising of the window +when Control-G is received, \fI\*(xt\fP. +This enables the \fBpopOnBell\fP resource. + \*(Ps = \*1\*0\*4\*4 \(-> Reuse the most recent data copied to CLIPBOARD, +\fI\*(xt\fP. +This enables the \fBkeepClipboard\fP resource. + \*(Ps = \*1\*0\*4\*6 \(-> Enable switching to/from +\fIAlternate Screen Buffer\fP, \fI\*(xt\fP. +This works for terminfo-based systems, updating the \fBtiteInhibit\fP resource. + \*(Ps = \*1\*0\*4\*7 \(-> Use \fIAlternate Screen Buffer\fP, \fI\*(xt\fP. +This may be disabled by the \fBtiteInhibit\fP resource. + \*(Ps = \*1\*0\*4\*8 \(-> Save cursor as in DECSC, \fI\*(xt\fP. +This may be disabled by the \fBtiteInhibit\fP resource. + \*(Ps = \*1\*0\*4\*9 \(-> Save cursor as in DECSC, \fI\*(xt\fP. +After saving the cursor, switch to +the \fIAlternate Screen Buffer\fP, clearing it first. +This may be +disabled by the \fBtiteInhibit\fP resource. +This control combines the effects of the \*1\*0\*4\*7 and \*1\*0\*4\*8 modes. +Use this with terminfo-based applications rather than the \*4\*7 mode. + \*(Ps = \*1\*0\*5\*0 \(-> Set terminfo/termcap function-key mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*5\*1 \(-> Set Sun function-key mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*5\*2 \(-> Set HP function-key mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*5\*3 \(-> Set SCO function-key mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*6\*0 \(-> Set legacy keyboard emulation, i.e, X11R6, +\fI\*(xt\fP. + \*(Ps = \*1\*0\*6\*1 \(-> Set VT220 keyboard emulation, \fI\*(xt\fP. + \*(Ps = \*2\*0\*0\*4 \(-> Set bracketed paste mode, \fI\*(xt\fP. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*i +Media Copy (MC). + \*(Ps = \*0 \(-> Print screen (default). + \*(Ps = \*4 \(-> Turn off printer controller mode. + \*(Ps = \*5 \(-> Turn on printer controller mode. + \*(Ps = \*1\*0 \(-> HTML screen dump, \fI\*(xt\fP. + \*(Ps = \*1\*1 \(-> SVG screen dump, \fI\*(xt\fP. +. +.iP +.IP \\*(Cs\\*?\\*(Ps\\*s\\*i +Media Copy (MC), DEC-specific. + \*(Ps = \*1 \(-> Print line containing cursor. + \*(Ps = \*4 \(-> Turn off autoprint mode. + \*(Ps = \*5 \(-> Turn on autoprint mode. + \*(Ps = \*1\*0 \(-> Print composed display, ignores DECPEX. + \*(Ps = \*1\*1 \(-> Print all pages. +. +.iP +.IP \\*(Cs\\*(Pm\\*s\\*l +Reset Mode (RM). + \*(Ps = \*2 \(-> Keyboard Action Mode (AM). + \*(Ps = \*4 \(-> Replace Mode (IRM). + \*(Ps = \*1\*2 \(-> Send/receive (SRM). + \*(Ps = \*2\*0 \(-> Normal Linefeed (LNM). +. +.iP +.IP \\*(Cs\\*?\\*(Pm\\*s\\*l +DEC Private Mode Reset (DECRST). + \*(Ps = \*1 \(-> Normal Cursor Keys (DECCKM), VT100. + \*(Ps = \*2 \(-> Designate VT52 mode (DECANM), VT100. + \*(Ps = \*3 \(-> 80 Column Mode (DECCOLM), VT100. + \*(Ps = \*4 \(-> Jump (Fast) Scroll (DECSCLM), VT100. + \*(Ps = \*5 \(-> Normal Video (DECSCNM), VT100. + \*(Ps = \*6 \(-> Normal Cursor Mode (DECOM), VT100. + \*(Ps = \*7 \(-> No Auto-wrap Mode (DECAWM), VT100. + \*(Ps = \*8 \(-> No Auto-repeat Keys (DECARM), VT100. + \*(Ps = \*9 \(-> Don't send Mouse X & Y on button press, \fI\*(xt\fP. + \*(Ps = \*1\*0 \(-> Hide toolbar (rxvt). + \*(Ps = \*1\*2 \(-> Stop Blinking Cursor (AT&T 610). + \*(Ps = \*1\*3 \(-> Disable Blinking Cursor (reset only via resource or menu). + \*(Ps = \*1\*4 \(-> Disable XOR of Blinking Cursor control sequence and menu. + \*(Ps = \*1\*8 \(-> Don't print form feed (DECPFF), VT220. + \*(Ps = \*1\*9 \(-> Limit print to scrolling region (DECPEX), VT220. + \*(Ps = \*2\*5 \(-> Hide Cursor (DECTCEM), VT220. + \*(Ps = \*3\*0 \(-> Don't show scrollbar (rxvt). + \*(Ps = \*3\*5 \(-> Disable font-shifting functions (rxvt). + \*(Ps = \*4\*0 \(-> Disallow 80 \z\(<-\(-> 132 Mode, \fI\*(xt\fP. + \*(Ps = \*4\*1 \(-> No \fBmore\fP(1) fix (see \fBcurses\fP resource). + \*(Ps = \*4\*2 \(-> Disable National Replacement Character sets (DECNRCM), +VT220. + \*(Ps = \*4\*4 \(-> Turn Off Margin Bell, \fI\*(xt\fP. + \*(Ps = \*4\*5 \(-> No Reverse-wraparound Mode, \fI\*(xt\fP. + \*(Ps = \*4\*6 \(-> Stop Logging, \fI\*(xt\fP. +This is normally disabled by a compile-time option. + \*(Ps = \*4\*7 \(-> Use Normal Screen Buffer, \fI\*(xt\fP. + \*(Ps = \*6\*6 \(-> Numeric keypad (DECNKM), VT320. + \*(Ps = \*6\*7 \(-> Backarrow key sends delete (DECBKM), VT340, VT420. +This sets the \fBbackarrowKey\fP resource to \*(``false\*(''. + \*(Ps = \*6\*9 \(-> Disable left and right margin mode (DECLRMM), +VT420 and up. + \*(Ps = \*8\*0 \(-> Disable \fISixel Scrolling\fP (DECSDM). + \*(Ps = \*9\*5 \(-> Clear screen when DECCOLM is set/reset (DECNCSM), +VT510 and up. + \*(Ps = \*1\*0\*0\*0 \(-> Don't send Mouse X & Y on button press and +release. +See the section \fBMouse Tracking\fP. + \*(Ps = \*1\*0\*0\*1 \(-> Don't use Hilite Mouse Tracking, \fI\*(xt\fP. + \*(Ps = \*1\*0\*0\*2 \(-> Don't use Cell Motion Mouse Tracking, \fI\*(xt\fP. See the section \fBButton-event tracking\fP. + \*(Ps = \*1\*0\*0\*3 \(-> Don't use All Motion Mouse Tracking, \fI\*(xt\fP. See the section \fBAny-event tracking\fP. + \*(Ps = \*1\*0\*0\*4 \(-> Don't send \fBFocusIn/FocusOut\fP events, \fI\*(xt\fP. + \*(Ps = \*1\*0\*0\*5 \(-> Disable UTF-8 Mouse Mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*0\*6 \(-> Disable SGR Mouse Mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*0\*7 \(-> Disable \fIAlternate Scroll Mode\fP, \fI\*(xt\fP. +This corresponds to the \fBalternateScroll\fP resource. + \*(Ps = \*1\*0\*1\*0 \(-> Don't scroll to bottom on tty output (rxvt). +This sets the \fBscrollTtyOutput\fP resource to \*(``false\*(''. + \*(Ps = \*1\*0\*1\*1 \(-> Don't scroll to bottom on key press (rxvt). +This sets the \fBscrollKey\fP resource to \*(``false\*(''. + \*(Ps = \*1\*0\*1\*5 \(-> Disable urxvt Mouse Mode. + \*(Ps = \*1\*0\*1\*6 \(-> Disable SGR Mouse Pixel-Mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*3\*4 \(-> Don't interpret \*(``meta\*('' key, \fI\*(xt\fP. +This disables the \fBeightBitInput\fP resource. + \*(Ps = \*1\*0\*3\*5 \(-> Disable special modifiers for +Alt and NumLock keys, \fI\*(xt\fP. +This disables the \fBnumLock\fP resource. + \*(Ps = \*1\*0\*3\*6 \(-> Don't send \*(Es when Meta modifies a key, +\fI\*(xt\fP. +This disables the \fBmetaSendsEscape\fP resource. + \*(Ps = \*1\*0\*3\*7 \(-> Send VT220 Remove from the editing-keypad +\fIDelete\fP key, \fI\*(xt\fP. + \*(Ps = \*1\*0\*3\*9 \(-> Don't send \*(Es +when Alt modifies a key, \fI\*(xt\fP. +This disables the \fBaltSendsEscape\fP resource. + \*(Ps = \*1\*0\*4\*0 \(-> Do not keep selection +when not highlighted, \fI\*(xt\fP. +This disables the \fBkeepSelection\fP resource. + \*(Ps = \*1\*0\*4\*1 \(-> Use the PRIMARY selection, \fI\*(xt\fP. +This disables the \fBselectToClipboard\fP resource. + \*(Ps = \*1\*0\*4\*2 \(-> Disable Urgency window manager hint +when Control-G is received, \fI\*(xt\fP. +This disables the \fBbellIsUrgent\fP resource. + \*(Ps = \*1\*0\*4\*3 \(-> Disable raising of the window +when Control-G is received, \fI\*(xt\fP. +This disables the \fBpopOnBell\fP resource. + \*(Ps = \*1\*0\*4\*6 \(-> Disable switching to/from +\fIAlternate Screen Buffer\fP, \fI\*(xt\fP. +This works for terminfo-based systems, updating the \fBtiteInhibit\fP resource. +If currently using the \fIAlternate Screen Buffer\fP, +\fI\*(xt\fP switches to the Normal Screen Buffer. + \*(Ps = \*1\*0\*4\*7 \(-> Use Normal Screen Buffer, \fI\*(xt\fP. +Clear the screen first if in the \fIAlternate Screen Buffer\fP. +This may be disabled by the \fBtiteInhibit\fP resource. + \*(Ps = \*1\*0\*4\*8 \(-> Restore cursor as in DECRC, \fI\*(xt\fP. +This may be disabled by the \fBtiteInhibit\fP resource. + \*(Ps = \*1\*0\*4\*9 \(-> Use Normal Screen Buffer and restore cursor +as in DECRC, \fI\*(xt\fP. +This may be disabled by the \fBtiteInhibit\fP resource. +This combines the effects of the \*1\*0\*4\*7 and \*1\*0\*4\*8 modes. +Use this with terminfo-based applications rather than the \*4\*7 mode. + \*(Ps = \*1\*0\*5\*0 \(-> Reset terminfo/termcap function-key mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*5\*1 \(-> Reset Sun function-key mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*5\*2 \(-> Reset HP function-key mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*5\*3 \(-> Reset SCO function-key mode, \fI\*(xt\fP. + \*(Ps = \*1\*0\*6\*0 \(-> Reset legacy keyboard emulation, i.e, X11R6, \fI\*(xt\fP. + \*(Ps = \*1\*0\*6\*1 \(-> Reset keyboard emulation to Sun/PC style, \fI\*(xt\fP. + \*(Ps = \*2\*0\*0\*4 \(-> Reset bracketed paste mode, \fI\*(xt\fP. +. +.iP +.IP \\*(Cs\\*(Pm\\*s\\*m +Character Attributes (SGR). + \*(Ps = \*0 \(-> Normal (default), VT100. + \*(Ps = \*1 \(-> Bold, VT100. + \*(Ps = \*2 \(-> Faint, decreased intensity, ECMA-48 2nd. + \*(Ps = \*3 \(-> Italicized, ECMA-48 2nd. + \*(Ps = \*4 \(-> Underlined, VT100. + \*(Ps = \*5 \(-> Blink, VT100. +.br +This appears as Bold in X11R6 xterm. + \*(Ps = \*7 \(-> Inverse, VT100. + \*(Ps = \*8 \(-> Invisible, i.e., hidden, ECMA-48 2nd, VT300. + \*(Ps = \*9 \(-> Crossed-out characters, ECMA-48 3rd. + \*(Ps = \*2\*1 \(-> Doubly-underlined, ECMA-48 3rd. + \*(Ps = \*2\*2 \(-> Normal (neither bold nor faint), ECMA-48 3rd. + \*(Ps = \*2\*3 \(-> Not italicized, ECMA-48 3rd. + \*(Ps = \*2\*4 \(-> Not underlined, ECMA-48 3rd. + \*(Ps = \*2\*5 \(-> Steady (not blinking), ECMA-48 3rd. + \*(Ps = \*2\*7 \(-> Positive (not inverse), ECMA-48 3rd. + \*(Ps = \*2\*8 \(-> Visible, i.e., not hidden, ECMA-48 3rd, VT300. + \*(Ps = \*2\*9 \(-> Not crossed-out, ECMA-48 3rd. + \*(Ps = \*3\*0 \(-> Set foreground color to Black. + \*(Ps = \*3\*1 \(-> Set foreground color to Red. + \*(Ps = \*3\*2 \(-> Set foreground color to Green. + \*(Ps = \*3\*3 \(-> Set foreground color to Yellow. + \*(Ps = \*3\*4 \(-> Set foreground color to Blue. + \*(Ps = \*3\*5 \(-> Set foreground color to Magenta. + \*(Ps = \*3\*6 \(-> Set foreground color to Cyan. + \*(Ps = \*3\*7 \(-> Set foreground color to White. + \*(Ps = \*3\*9 \(-> Set foreground color to default, ECMA-48 3rd. + \*(Ps = \*4\*0 \(-> Set background color to Black. + \*(Ps = \*4\*1 \(-> Set background color to Red. + \*(Ps = \*4\*2 \(-> Set background color to Green. + \*(Ps = \*4\*3 \(-> Set background color to Yellow. + \*(Ps = \*4\*4 \(-> Set background color to Blue. + \*(Ps = \*4\*5 \(-> Set background color to Magenta. + \*(Ps = \*4\*6 \(-> Set background color to Cyan. + \*(Ps = \*4\*7 \(-> Set background color to White. + \*(Ps = \*4\*9 \(-> Set background color to default, ECMA-48 3rd. +.sP +Some of the above note the edition of ECMA-48 which first describes +a feature. +In its successive editions from 1979 to 1991 +(\fI2nd\fP 1979, \fI3rd\fP 1984, \fI4th\fP 1986, and \fI5th\fP 1991), +ECMA-48 listed codes through \*6\*5 +(skipping several toward the end of the range). +Most of the ECMA-48 codes not implemented in \fI\*(xt\fP +were never implemented in a hardware terminal. +Several (such as \*3\*9 and \*4\*9) are either noted in ECMA-48 +as implementation defined, or described in vague terms. +.sP +The successive editions of ECMA-48 give little attention to +changes from one edition to the next, +except to comment on features which have become obsolete. +ECMA-48 1st (1976) is unavailable; +there is no reliable source of information which states whether +\*(``ANSI\*('' color was defined in that edition, +or later (1979). +The VT100 (1978) implemented the most commonly used non-color video attributes +which are given in the 2nd edition. +.sP +While 8-color support is described in ECMA-48 2nd edition, +the VT500 series (introduced in 1993) +were the first DEC terminals implementing \*(``ANSI\*('' color. +The DEC terminal's use of color is known to differ from \fI\*(xt\fP; +useful documentation on this series +became available too late to influence \fI\*(xt\fP. +.sP +If 16-color support is compiled, the following \fIaixterm\fP controls apply. +Assume that \fI\*(xt\fP's resources +are set so that the ISO color codes are the first 8 of a set of 16. +Then the \fIaixterm\fP colors are the bright versions of the ISO colors: +.iP + \*(Ps = \*9\*0 \(-> Set foreground color to Black. + \*(Ps = \*9\*1 \(-> Set foreground color to Red. + \*(Ps = \*9\*2 \(-> Set foreground color to Green. + \*(Ps = \*9\*3 \(-> Set foreground color to Yellow. + \*(Ps = \*9\*4 \(-> Set foreground color to Blue. + \*(Ps = \*9\*5 \(-> Set foreground color to Magenta. + \*(Ps = \*9\*6 \(-> Set foreground color to Cyan. + \*(Ps = \*9\*7 \(-> Set foreground color to White. + \*(Ps = \*1\*0\*0 \(-> Set background color to Black. + \*(Ps = \*1\*0\*1 \(-> Set background color to Red. + \*(Ps = \*1\*0\*2 \(-> Set background color to Green. + \*(Ps = \*1\*0\*3 \(-> Set background color to Yellow. + \*(Ps = \*1\*0\*4 \(-> Set background color to Blue. + \*(Ps = \*1\*0\*5 \(-> Set background color to Magenta. + \*(Ps = \*1\*0\*6 \(-> Set background color to Cyan. + \*(Ps = \*1\*0\*7 \(-> Set background color to White. +.sP +If \fI\*(xt\fP is compiled with the 16-color support disabled, it supports +the following, from \fIrxvt\fP: + \*(Ps = \*1\*0\*0 \(-> Set foreground and background color to default. +.sP +\fI\*(XT\fP maintains a color palette +whose entries are identified by an index beginning with zero. +If 88- or 256-color support is compiled, the following apply: +.RS +.bP +All parameters are decimal integers. +.bP +RGB values range from zero (0) to 255. +.bP +The 88- and 256-color support uses \fIsubparameters\fP described in ISO-8613-6 +for \fIindexed\fP color. +ISO-8613-6 also mentions \fIdirect color\fP, using a similar scheme. +\fI\*(xt\fP supports that, too. +.bP +\fI\*(xt\fP allows either colons (standard) or semicolons (legacy) +to separate the subparameters +(but after the first colon, colons must be used). +.RE +.sP +The indexed- and direct-color features are summarized in the FAQ, +which explains why semicolon is accepted as a subparameter delimiter: +.ID 2 +.\" https://invisible-island.net/xterm/xterm.faq.html#color_by_number +\fICan I set a color by its number?\fP +.DE +.sP +These ISO-8613-6 controls (marked in ECMA-48 5th edition as +\*(``reserved for future standardization\*('') +are supported by \fI\*(xt\fP: + \*(Ps = \*3\*8\*:\*2\*:\*(Pi\*s\*:\*(Pr\*s\*:\*(Pg\*s\*:\*(Pb \(-> Set foreground +color using RGB values. +If \fI\*(xt\fP is not compiled with direct-color support, +it uses the closest match in its palette +for the given RGB \*(Pr/\*(Pg/\*(Pb. +The color space identifier \*(Pi is ignored. + \*(Ps = \*3\*8\*:\*5\*:\*(Ps \(-> Set foreground color to \*(Ps, +using indexed color. + \*(Ps = \*4\*8\*:\*2\*:\*(Pi\*s\*:\*(Pr\*s\*:\*(Pg\*s\*:\*(Pb \(-> Set background +color using RGB values. +If \fI\*(xt\fP is not compiled with direct-color support, +it uses the closest match in its palette +for the given RGB \*(Pr/\*(Pg/\*(Pb. +The color space identifier \*(Pi is ignored. + \*(Ps = \*4\*8\*:\*5\*:\*(Ps \(-> Set background color to \*(Ps, +using indexed color. +.sP +This variation on ISO-8613-6 is supported for compatibility with KDE konsole: + \*(Ps = \*3\*8\*;\*2\*;\*(Pr\*s\*;\*(Pg\*s\*;\*(Pb \(-> Set foreground color +using RGB values. +If \fI\*(xt\fP is not compiled with direct-color support, +it uses the closest match in its palette +for the given RGB \*(Pr/\*(Pg/\*(Pb. + \*(Ps = \*4\*8\*;\*2\*;\*(Pr\*s\*;\*(Pg\*s\*;\*(Pb \(-> Set background color +using RGB values. +If \fI\*(xt\fP is not compiled with direct-color support, +it uses the closest match in its palette +for the given RGB \*(Pr/\*(Pg/\*(Pb. +.sP +In each case, +if \fI\*(xt\fP is compiled with direct-color support, +and the resource \fBdirectColor\fP is true, then +rather than choosing the closest match, +\fI\*(xt\fP asks the X server to directly render a given color. +. +.iP +.IP \\*(Cs\\*>\\*(Pp\\*s\\*;\*(Pv\\*s\\*m +.IP \\*(Cs\\*>\\*(Pp\\*s\\*m +Set/reset key modifier options (XTMODKEYS), \fI\*(xt\fP. +Set or reset resource-values used by \fI\*(xt\fP to decide whether to +construct escape sequences holding information about the modifiers +pressed with a given key. +.iP +.IP +The first parameter \*(Pp identifies the resource to set/reset. +The second parameter \*(Pv is the value to assign to the resource. +.iP +.IP +If the second parameter is omitted, the resource is reset to its initial value. +Values \*3 and \*5 are reserved for keypad-keys and string-keys. +.iP + \*(Pp = \*0 \(-> \fBmodifyKeyboard\fP. + \*(Pp = \*1 \(-> \fBmodifyCursorKeys\fP. + \*(Pp = \*2 \(-> \fBmodifyFunctionKeys\fP. + \*(Pp = \*4 \(-> \fBmodifyOtherKeys\fP. +.iP +.IP +If no parameters are given, all resources are reset to their initial values. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*n +Device Status Report (DSR). + \*(Ps = \*5 \(-> Status Report. +.br +Result (\*(``OK\*('') is +\*(Cs\*0\*n + \*(Ps = \*6 \(-> Report Cursor Position (CPR) [row;column]. +.br +Result is +\*(Cs\*(Ir\*s\*;\*(Ic\*s\*R +.iP +.IP +\fBNote\fP: +it is possible for this sequence to be sent by a function key. +For example, with the default keyboard configuration +the shifted F1 key may send (with shift-, control-, alt-modifiers) +.iP + \*(Cs\*1\*;\*2\*s\*R, or + \*(Cs\*1\*;\*5\*s\*R, or + \*(Cs\*1\*;\*6\*s\*R, etc. +.iP +.IP +The second parameter encodes the modifiers; values range from 2 to 16. +See the section \fBPC-Style Function Keys\fP for the codes. +The \fBmodifyFunctionKeys\fP and \fBmodifyKeyboard\fP resources +can change the form of the string sent from the modified F1 key. +. +.iP +.IP \\*(Cs\\*>\\*(Ps\\*s\\*n +Disable key modifier options, \fI\*(xt\fP. +These modifiers may be enabled via the +\*(Cs\*>\*(Pm\*s\*m +sequence. +This control sequence corresponds to a resource value of \*(``\-1\*('', +which cannot be set with the other sequence. +.iP +.IP +The parameter identifies the resource to be disabled: +.iP + \*(Ps = \*0 \(-> \fBmodifyKeyboard\fP. + \*(Ps = \*1 \(-> \fBmodifyCursorKeys\fP. + \*(Ps = \*2 \(-> \fBmodifyFunctionKeys\fP. + \*(Ps = \*4 \(-> \fBmodifyOtherKeys\fP. +.iP +If the parameter is omitted, \fBmodifyFunctionKeys\fP is disabled. +When \fBmodifyFunctionKeys\fP is disabled, \fI\*(xt\fP uses the +modifier keys to make an extended sequence of function keys rather +than adding a parameter to each function key to denote the modifiers. +. +.iP +.IP \\*(Cs\\*?\\*(Ps\\*s\\*n +Device Status Report (DSR, DEC-specific). + \*(Ps = \*6 \(-> Report Cursor Position (DECXCPR). +The response [row;column] is returned as +.br +\*(Cs\*?\*(Ir\*s\*;\*(Ic\*s\*R +.br +(assumes the default page, i.e., \*(``1\*(''). + \*(Ps = \*1\*5 \(-> Report Printer status. +The response is +.br +\*(Cs\*?\*1\*0\*n (ready). +or +.br +\*(Cs\*?\*1\*1\*n (not ready). + \*(Ps = \*2\*5 \(-> Report UDK status. +The response is +.br +\*(Cs\*?\*2\*0\*n (unlocked) +.br +or +.br +\*(Cs\*?\*2\*1\*n (locked). + \*(Ps = \*2\*6 \(-> Report Keyboard status. +The response is +.br +\*(Cs\*?\*2\*7\*;\*1\*;\*0\*;\*0\*n (North American). +.iP +.IP +The last two parameters apply to VT300 & up (keyboard ready) and +VT400 & up (LK01) respectively. +.iP + \*(Ps = \*5\*3 \(-> Report Locator status. +The response is +\*(Cs\*?\*5\*3\*n Locator available, if compiled-in, or +\*(Cs\*?\*5\*0\*n No Locator, if not. + \*(Ps = \*5\*5 \(-> Report Locator status. +The response is +\*(Cs\*?\*5\*3\*n Locator available, if compiled-in, or +\*(Cs\*?\*5\*0\*n No Locator, if not. + \*(Ps = \*5\*6 \(-> Report Locator type. +The response is +\*(Cs\*?\*5\*7\*;\*1\*n Mouse, if compiled-in, or +\*(Cs\*?\*5\*7\*;\*0\*n Cannot identify, if not. + \*(Ps = \*6\*2 \(-> Report macro space (DECMSR). +The response is +\*(Cs\*(Pn\*s\**\*s\*{. + \*(Ps = \*6\*3 \(-> Report memory checksum (DECCKSR), VT420 and up. +The response is +\*(Dc\*(Pt\*s\*!\*~x\*sx\*sx\*sx\*s\*(ST. +.br + \*(Pt is the request id (from an optional parameter to the request). + The x's are hexadecimal digits 0-9 and A-F. + \*(Ps = \*7\*5 \(-> Report data integrity. +The response is +\*(Cs\*?\*7\*0\*n (ready, no errors). + \*(Ps = \*8\*5 \(-> Report multi-session configuration. +The response is +\*(Cs\*?\*8\*3\*n (not configured for multiple-session operation). +. +.iP +.IP \\*(Cs\\*>\\*(Ps\\*s\\*p +Set resource value \fBpointerMode\fP (XTSMPOINTER), \*(xt. +This is used by \fI\*(xt\fP to decide whether to +hide the pointer cursor as the user types. +.iP +Valid values for the parameter: + \*(Ps = \*0 \(-> never hide the pointer. + \*(Ps = \*1 \(-> hide if the mouse tracking mode is not enabled. + \*(Ps = \*2 \(-> always hide the pointer, except when leaving the window. + \*(Ps = \*3 \(-> always hide the pointer, even if leaving/entering the window. +.iP +If no parameter is given, \fI\*(xt\fP uses the default, +which is \*1. +. +.iP +.IP \\*(Cs\\*!\\*p +Soft terminal reset (DECSTR), VT220 and up. +. +.iP +.IP \\*(Cs\\*(Pl\\*s\\*;\\*(Pc\\*s\\*(Dq\\*p +Set conformance level (DECSCL), VT220 and up. +.iP +The first parameter selects the conformance level. +Valid values are: + \*(Pl = \*6\*1 \(-> level 1, e.g., VT100. + \*(Pl = \*6\*2 \(-> level 2, e.g., VT200. + \*(Pl = \*6\*3 \(-> level 3, e.g., VT300. + \*(Pl = \*6\*4 \(-> level 4, e.g., VT400. + \*(Pl = \*6\*5 \(-> level 5, e.g., VT500. +.iP +The second parameter selects the C1 control transmission mode. +This is an optional parameter, ignored in conformance level 1. +Valid values are: + \*(Pc = \*0 \(-> 8-bit controls. + \*(Pc = \*1 \(-> 7-bit controls (DEC factory default). + \*(Pc = \*2 \(-> 8-bit controls. +.iP +The 7-bit and 8-bit control modes can also be set by S7C1T and S8C1T, +but DECSCL is preferred. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*$\\*p +.br +Request ANSI mode (DECRQM). +For VT300 and up, reply DECRPM is +.br + \*(Cs\*(Ps\*;\*(Pm\*s\*$\*y +.br +where \*(Ps is the mode number as in SM/RM, +and \*(Pm is the mode value: +.br + 0 - not recognized + 1 - set + 2 - reset + 3 - permanently set + 4 - permanently reset +. +.iP +.IP \\*(Cs\\*?\\*(Ps\\*s\\*$\\*p +Request DEC private mode (DECRQM). +For VT300 and up, reply DECRPM is +.br + \*(Cs\*?\*(Ps\*;\*(Pm\*s\*$\*y +.br +where \*(Ps is the mode number as in DECSET/DECSET, +\*(Pm is the mode value as in the ANSI DECRQM. +.br +Two private modes are read-only (i.e., \*1\*3 and \*1\*4), +provided only for reporting their values using this control sequence. +They correspond to the resources \fBcursorBlink\fP and \fBcursorBlinkXOR\fP. +. +.IP \\*(Cs\\*#\\*p +.br +.IP \\*(Cs\\*(Pm\\*s\\*#\\*p +Push video attributes onto stack (XTPUSHSGR), \fI\*(xt\fP. +This is an alias for \*(Cs\*#\*{, +used to work around language limitations of C#. +. +.iP +.IP \\*(Cs\\*>\\*(Ps\\*s\\*q +\*(Ps = \*0 \(-> Report \fI\*(xt\fP name and version (XTVERSION). +The response is a DSR sequence identifying the version: \*(Dc\*>\*|text \*(ST +.iP +.IP \\*(Cs\\*(Ps\\*s\\*q +Load LEDs (DECLL), VT100. + \*(Ps = \*0 \(-> Clear all LEDS (default). + \*(Ps = \*1 \(-> Light Num Lock. + \*(Ps = \*2 \(-> Light Caps Lock. + \*(Ps = \*3 \(-> Light Scroll Lock. + \*(Ps = \*2\*1 \(-> Extinguish Num Lock. + \*(Ps = \*2\*2 \(-> Extinguish Caps Lock. + \*(Ps = \*2\*3 \(-> Extinguish Scroll Lock. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(Sp\\*q +Set cursor style (DECSCUSR), VT520. + \*(Ps = \*0 \(-> blinking block. + \*(Ps = \*1 \(-> blinking block (default). + \*(Ps = \*2 \(-> steady block. + \*(Ps = \*3 \(-> blinking underline. + \*(Ps = \*4 \(-> steady underline. + \*(Ps = \*5 \(-> blinking bar, \fI\*(xt\fP. + \*(Ps = \*6 \(-> steady bar, \fI\*(xt\fP. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(Dq\\*q +Select character protection attribute (DECSCA), VT220. +Valid values for the parameter: + \*(Ps = \*0 \(-> DECSED and DECSEL can erase (default). + \*(Ps = \*1 \(-> DECSED and DECSEL cannot erase. + \*(Ps = \*2 \(-> DECSED and DECSEL can erase. +. +.iP +.IP \\*(Cs\\*#\\*q +Pop video attributes from stack (XTPOPSGR), \fI\*(xt\fP. +This is an alias for \*(Cs\*#\*}, +used to work around language limitations of C#. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*;\\*(Ps\\*s\\*r +Set Scrolling Region [top;bottom] (default = full size of window) +(DECSTBM), VT100. +. +.iP +.IP \\*(Cs\\*?\\*(Pm\\*s\\*r +Restore DEC Private Mode Values (XTRESTORE), \*(xt. +The value of \*(Ps previously saved is restored. +\*(Ps values are the same as for DECSET. +. +.iP +.IP \\*(Cs\\*(Pt\\*s\\*;\\*(Pl\\*s\\*;\\*(Pb\\*s\\*;\\*(Pr\\*s\\*;\\*(Ps\\*s\\*$\\*r +Change Attributes in Rectangular Area (DECCARA), VT400 and up. + \*(Pt\*s\*;\*(Pl\*s\*;\*(Pb\*s\*;\*(Pr denotes the rectangle. + \*(Ps denotes the SGR attributes to change: 0, 1, 4, 5, 7. +. +.iP +.IP \\*(Cs\\*(cs +Save cursor, available only when DECLRMM is disabled (SCOSC, also ANSI.SYS). +. +.iP +.IP \\*(Cs\\*(Pl\\*s\\*;\\*(Pr\\*s\\*(cs +Set left and right margins (DECSLRM), VT420 and up. +This is available only when DECLRMM is enabled. +. +.iP +.IP \\*(Cs\\*?\\*(Pm\\*s\\*(cs +Save DEC Private Mode Values (XTSAVE), \*(xt. +\*(Ps values are the same as for DECSET. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*;\\*(Ps\\*s\\*;\\*(Ps\\*s\\*t +Window manipulation (XTWINOPS), \fIdtterm\fP, extended by \fI\*(xt\fP. +These controls may be disabled using the \fBallowWindowOps\fP resource. +.iP +\fI\*(xt\fP uses \fIExtended Window Manager Hints\fP (EWMH) to maximize +the window. +Some window managers have incomplete support for EWMH. +For instance, \fIfvwm\fP, \fIflwm\fP and \fIquartz-wm\fP advertise +support for maximizing windows horizontally or vertically, but +in fact equate those to the maximize operation. +.iP +Valid values for the first (and any additional parameters) are: + \*(Ps = \*1 \(-> De-iconify window. + \*(Ps = \*2 \(-> Iconify window. + \*(Ps = \*3\*;\*s\fIx\*s\*;\*sy\fP \(-> Move window to [x, y]. + \*(Ps = \*4\*;\*s\fIheight\*s\*;\*swidth\fP \(-> Resize the \fI\*(xt\fP +window to given height and width in pixels. +Omitted parameters reuse the current height or width. +Zero parameters use the display's height or width. + \*(Ps = \*5 \(-> Raise the \fI\*(xt\fP window to the +front of the stacking order. + \*(Ps = \*6 \(-> Lower the \fI\*(xt\fP window to the +bottom of the stacking order. + \*(Ps = \*7 \(-> Refresh the \fI\*(xt\fP window. + \*(Ps = \*8\*;\*s\fIheight\*s\*;\*swidth\fP \(-> Resize the text area to +given height and width in characters. +Omitted parameters reuse the current height or width. +Zero parameters use the display's height or width. + \*(Ps = \*9\*;\*s\*0 \(-> Restore maximized window. + \*(Ps = \*9\*;\*s\*1 \(-> Maximize window (i.e., resize to screen size). + \*(Ps = \*9\*;\*s\*2 \(-> Maximize window vertically. + \*(Ps = \*9\*;\*s\*3 \(-> Maximize window horizontally. + \*(Ps = \*1\*0\*;\*s\*0 \(-> Undo full-screen mode. + \*(Ps = \*1\*0\*;\*s\*1 \(-> Change to full-screen. + \*(Ps = \*1\*0\*;\*s\*2 \(-> Toggle full-screen. + \*(Ps = \*1\*1 \(-> Report \fI\*(xt\fP window state. +.br +If the \fI\*(xt\fP window is non-iconified, it returns \*(Cs\*1\*t. +.br +If the \fI\*(xt\fP window is iconified, it returns \*(Cs\*2\*t. + \*(Ps = \*1\*3 \(-> Report \fI\*(xt\fP window position. +.br +Note: X Toolkit positions can be negative, +but the reported values are unsigned, in the range 0-65535. +Negative values correspond to 32768-65535. +.br +Result is +\*(Cs\*3\*;\*(Ix\*s\*;\*(Iy\*s\*t + \*(Ps = \*1\*3\*;\*s\*2 \(-> Report \fI\*(xt\fP text-area position. +.br +Result is +\*(Cs\*3\*;\*(Ix\*s\*;\*(Iy\*s\*t + \*(Ps = \*1\*4 \(-> Report \fI\*(xt\fP text area size in pixels. +.br +Result is +\*(Cs\*s\*4\*;\*s\fIheight\fP\*s\*;\*s\fIwidth\fP\*s\*t + \*(Ps = \*1\*4\*;\*s\*2 \(-> Report \fI\*(xt\fP window size in pixels. +.br +Normally \fI\*(xt\fP's \fIwindow\fP is larger than its \fItext area\fP, +since it includes the frame (or decoration) applied by the +window manager, as well as the area used by a scroll-bar. +.br +Result is +\*(Cs\*s\*4\*;\*s\fIheight\fP\*s\*;\*s\fIwidth\fP\*s\*t + \*(Ps = \*1\*5 \(-> Report size of the screen in pixels. +.br +Result is +\*(Cs\*s\*5\*;\*s\fIheight\fP\*s\*;\*s\fIwidth\fP\*s\*t + \*(Ps = \*1\*6 \(-> Report \fI\*(xt\fP character cell size in pixels. +.br +Result is +\*(Cs\*s\*6\*;\*s\fIheight\fP\*s\*;\*s\fIwidth\fP\*s\*t + \*(Ps = \*1\*8 \(-> Report the size of the text area in characters. +.br +Result is +\*(Cs\*s\*8\*;\*s\fIheight\fP\*s\*;\*s\fIwidth\fP\*s\*t + \*(Ps = \*1\*9 \(-> Report the size of the screen in characters. +.br +Result is +\*(Cs\*s\*9\*;\*s\fIheight\fP\*s\*;\*s\fIwidth\fP\*s\*t + \*(Ps = \*2\*0 \(-> Report \fI\*(xt\fP window's icon label. +.br +Result is +\*(Os\*s\*L\*s\fIlabel\fP\*s\*(ST + \*(Ps = \*2\*1 \(-> Report \fI\*(xt\fP window's title. +.br +Result is +\*(Os\*s\*l\*s\fIlabel\fP\*s\*(ST + \*(Ps = \*2\*2\*;\*0 \(-> Save \fI\*(xt\fP icon and window title +on stack. + \*(Ps = \*2\*2\*;\*1 \(-> Save \fI\*(xt\fP icon title on stack. + \*(Ps = \*2\*2\*;\*2 \(-> Save \fI\*(xt\fP window title on stack. + \*(Ps = \*2\*3\*;\*0 \(-> Restore \fI\*(xt\fP icon and window title +from stack. + \*(Ps = \*2\*3\*;\*1 \(-> Restore \fI\*(xt\fP icon title from stack. + \*(Ps = \*2\*3\*;\*2 \(-> Restore \fI\*(xt\fP window title from stack. + \*(Ps >= \*2\*4 \(-> Resize to \*(Ps lines (DECSLPP), VT340 and VT420. +.br +\fI\*(xt\fP adapts this by resizing its window. +. +.iP +.IP \\*(Cs\\*>\\*(Pm\\*s\\*t +This \fI\*(xt\fP control +sets one or more features of the title modes (XTSMTITLE), \*(xt. +Each parameter enables a single feature. + \*(Ps = \*0 \(-> Set window/icon labels using hexadecimal. + \*(Ps = \*1 \(-> Query window/icon labels using hexadecimal. + \*(Ps = \*2 \(-> Set window/icon labels using UTF-8. + \*(Ps = \*3 \(-> Query window/icon labels using UTF-8. +(See discussion of \fBTitle Modes\fP) +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(Sp\\*t +Set warning-bell volume (DECSWBV), VT520. + \*(Ps = \*0 or \*1 \(-> off. + \*(Ps = \*2, \*3 or \*4 \(-> low. + \*(Ps = \*5, \*6, \*7, or \*8 \(-> high. +. +.iP +.IP \\*(Cs\\*(Pt\\*s\\*;\\*(Pl\\*s\\*;\\*(Pb\\*s\\*;\\*(Pr\\*s\\*;\\*(Ps\\*s\\*$\\*t +Reverse Attributes in Rectangular Area (DECRARA), VT400 and up. + \*(Pt\*s\*;\*(Pl\*s\*;\*(Pb\*s\*;\*(Pr denotes the rectangle. + \*(Ps denotes the attributes to reverse, i.e., 1, 4, 5, 7. +. +.iP +.IP \\*(Cs\\*u +Restore cursor (SCORC, also ANSI.SYS). +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(Sp\\*u +Set margin-bell volume (DECSMBV), VT520. + \*(Ps = \*0, \*5, \*6, \*7, or \*8 \(-> high. + \*(Ps = \*1 \(-> off. + \*(Ps = \*2, \*3 or \*4 \(-> low. +. +.iP +.IP \\*(Cs\\*(Pt\\*s\\*;\\*(Pl\\*s\\*;\\*(Pb\\*s\\*;\\*(Pr\\*s\\*;\\*(Pp\\*s\\*;\\*(Pt\\*s\\*;\\*(Pl\\*s\\*;\\*(Pp\\*s\\*$\\*v +Copy Rectangular Area (DECCRA), VT400 and up. + \*(Pt\*s\*;\*(Pl\*s\*;\*(Pb\*s\*;\*(Pr denotes the rectangle. + \*(Pp denotes the source page. + \*(Pt\*s\*;\*(Pl denotes the target location. + \*(Pp denotes the target page. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*$\\*w +Request presentation state report (DECRQPSR), VT320 and up. + \*(Ps = \*0 \(-> error. + \*(Ps = \*1 \(-> cursor information report (DECCIR). +.br +Response is +.br + \*(Dc\*1\*$\*u\*(Pt\*s\*(ST +.br +Refer to the VT420 programming manual, +which requires six pages to document the data string \*(Pt, + \*(Ps = \*2 \(-> tab stop report (DECTABSR). +.br +Response is +.br + \*(Dc\*2\*$\*u\*(Pt\*s\*(ST +.br +The data string \*(Pt is a list of the tab-stops, +separated by \*(``/\*('' characters. +. +.iP +.IP \\*(Cs\\*(Pt\\*s\\*;\\*(Pl\\*s\\*;\\*(Pb\\*s\\*;\\*(Pr\\*s\\*(qu\\*w +Enable Filter Rectangle (DECEFR), VT420 and up. +.br +Parameters are [top;left;bottom;right]. +.br +Defines the coordinates of a filter rectangle and activates it. +Anytime the locator is detected outside of the filter rectangle, +an outside rectangle event is generated and the rectangle is disabled. +Filter rectangles are always treated as \*(``one-shot\*('' events. +Any parameters that are omitted default to the current locator position. +If all parameters are omitted, any locator motion will be reported. +DECELR always cancels any previous rectangle definition. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*x +Request Terminal Parameters (DECREQTPARM). +.br +if \*(Ps is a \*(``0\*('' (default) or \*(``1\*('', +and \fI\*(xt\fR is emulating VT100, +the control sequence elicits a response of the same form +whose parameters describe the terminal: + \*(Ps \(-> the given \*(Ps incremented by 2. + \*(Pn = \*1 \(<- no parity. + \*(Pn = \*1 \(<- eight bits. + \*(Pn = \*1 \(<- \*2\*8 transmit 38.4k baud. + \*(Pn = \*1 \(<- \*2\*8 receive 38.4k baud. + \*(Pn = \*1 \(<- clock multiplier. + \*(Pn = \*0 \(<- STP flags. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\**\\*x +Select Attribute Change Extent (DECSACE), VT420 and up. + \*(Ps = \*0 \(-> from start to end position, wrapped. + \*(Ps = \*1 \(-> from start to end position, wrapped. + \*(Ps = \*2 \(-> rectangle (exact). +. +.iP +.IP \\*(Cs\\*(Pc\\*s\\*;\\*(Pt\\*s\\*;\\*(Pl\\*s\\*;\\*(Pb\\*s\\*;\\*(Pr\\*s\\*$\\*x +Fill Rectangular Area (DECFRA), VT420 and up. + \*(Pc is the character to use. + \*(Pt\*s\*;\*(Pl\*s\*;\*(Pb\*s\*;\*(Pr denotes the rectangle. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*#\\*y +Select checksum extension (XTCHECKSUM), \fI\*(xt\fP. +The bits of \*(Ps modify the calculation of the checksum returned by DECRQCRA: + \*0 \(-> do not negate the result. + \*1 \(-> do not report the VT100 video attributes. + \*2 \(-> do not omit checksum for blanks. + \*3 \(-> omit checksum for cells not explicitly initialized. + \*4 \(-> do not mask cell value to 8 bits or ignore combining characters. + \*5 \(-> do not mask cell value to 7 bits. +. +.iP +.IP \\*(Cs\\*(Pi\\*s\\*;\\*(Pg\\*s\\*;\\*(Pt\\*s\\*;\\*(Pl\\*s\\*;\\*(Pb\\*s\\*;\\*(Pr\\*s\\**\\*y +Request Checksum of Rectangular Area (DECRQCRA), VT420 and up. +Response is +.br +\*(Dc\*(Pi\*s\*!\*~x\*sx\*sx\*sx\*s\*(ST +.br + \*(Pi is the request id. + \*(Pg is the page number. + \*(Pt\*s\*;\*(Pl\*s\*;\*(Pb\*s\*;\*(Pr denotes the rectangle. + The x's are hexadecimal digits 0-9 and A-F. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*;\\*(Pu\\*s\\*(qu\\*z +Enable Locator Reporting (DECELR). +.br +Valid values for the first parameter: + \*(Ps = \*0 \(-> Locator disabled (default). + \*(Ps = \*1 \(-> Locator enabled. + \*(Ps = \*2 \(-> Locator enabled for one report, then disabled. +.br +The second parameter specifies the coordinate unit for locator reports. +.br +Valid values for the second parameter: + \*(Pu = \*0 or omitted \(-> default to character cells. + \*(Pu = \*1 \(<- device physical pixels. + \*(Pu = \*2 \(<- character cells. +. +.iP +.IP \\*(Cs\\*(Pt\\*s\\*;\\*(Pl\\*s\\*;\\*(Pb\\*s\\*;\\*(Pr\\*s\\*$\\*z +Erase Rectangular Area (DECERA), VT400 and up. + \*(Pt\*s\*;\*(Pl\*s\*;\*(Pb\*s\*;\*(Pr denotes the rectangle. +. +.iP +.IP \\*(Cs\\*(Pm\\*s\\*(qu\\*{ +Select Locator Events (DECSLE). +.br +Valid values for the first (and any additional parameters) are: + \*(Ps = \*0 \(-> only respond to explicit host requests (DECRQLP). +This is default. +It also cancels any filter rectangle. + \*(Ps = \*1 \(-> report button down transitions. + \*(Ps = \*2 \(-> do not report button down transitions. + \*(Ps = \*3 \(-> report button up transitions. + \*(Ps = \*4 \(-> do not report button up transitions. +. +.iP +.IP \\*(Cs\\*#\\*{ +.br +.IP \\*(Cs\\*(Pm\\*s\\*#\\*{ +Push video attributes onto stack (XTPUSHSGR), \fI\*(xt\fP. +The optional parameters correspond to the SGR encoding for video attributes, +except for colors (which do not have a unique SGR code): + \*(Ps = \*1 \(-> Bold. + \*(Ps = \*2 \(-> Faint. + \*(Ps = \*3 \(-> Italicized. + \*(Ps = \*4 \(-> Underlined. + \*(Ps = \*5 \(-> Blink. + \*(Ps = \*7 \(-> Inverse. + \*(Ps = \*8 \(-> Invisible. + \*(Ps = \*9 \(-> Crossed-out characters. + \*(Ps = \*2\*1 \(-> Doubly-underlined. + \*(Ps = \*3\*0 \(-> Foreground color. + \*(Ps = \*3\*1 \(-> Background color. +.iP +.IP +If no parameters are given, all of the video attributes are saved. +The stack is limited to 10 levels. +. +.iP +.IP \\*(Cs\\*(Pt\\*s\\*;\\*(Pl\\*s\\*;\\*(Pb\\*s\\*;\\*(Pr\\*s\\*$\\*{ +Selective Erase Rectangular Area (DECSERA), VT400 and up. + \*(Pt\*s\*;\*(Pl\*s\*;\*(Pb\*s\*;\*(Pr denotes the rectangle. +. +.iP +.IP \\*(Cs\\*(Pt\\*s\\*;\\*(Pl\\*s\\*;\\*(Pb\\*s\\*;\\*(Pr\\*s\\*#\\*| +Report selected graphic rendition (XTREPORTSGR), \fI\*(xt\fP. +The response is an SGR sequence which contains the attributes which +are common to all cells in a rectangle. + \*(Pt\*s\*;\*(Pl\*s\*;\*(Pb\*s\*;\*(Pr denotes the rectangle. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*$\\*| +Select columns per page (DECSCPP), VT340. + \*(Ps = \*0 \(-> 80 columns, default if \*(Ps omitted. + \*(Ps = \*8\*0 \(-> 80 columns. + \*(Ps = \*1\*3\*2 \(-> 132 columns. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(qu\\*| +Request Locator Position (DECRQLP). +.br +Valid values for the parameter are: + \*(Ps = \*0, 1 or omitted \(-> transmit a single DECLRP locator report. +.sP +If Locator Reporting has been enabled by a DECELR, \fI\*(xt\fP will respond +with a DECLRP Locator Report. +This report is also generated on button +up and down events if they have been enabled with a DECSLE, or when +the locator is detected outside of a filter rectangle, if filter rectangles +have been enabled with a DECEFR. +.sP + \(<- \*(Cs\*(Pe\*s\*;\*(Pb\*s\*;\*(Pr\*s\*;\*(Pc\*s\*;\*(Pp\*s\*&\*s\*w +.sP +Parameters are [\fIevent\fP;\fIbutton\fP;\fIrow\fP;\fIcolumn\fP;\fIpage\fP]. +.br +Valid values for the event: + \*(Pe = \*0 \(<- locator unavailable - no other parameters sent. + \*(Pe = \*1 \(<- request - \fI\*(xt\fP received a DECRQLP. + \*(Pe = \*2 \(<- left button down. + \*(Pe = \*3 \(<- left button up. + \*(Pe = \*4 \(<- middle button down. + \*(Pe = \*5 \(<- middle button up. + \*(Pe = \*6 \(<- right button down. + \*(Pe = \*7 \(<- right button up. + \*(Pe = \*8 \(<- M4 button down. + \*(Pe = \*9 \(<- M4 button up. + \*(Pe = \*1\*0 \(<- locator outside filter rectangle. +.br +The \*(``\fIbutton\fP\*('' parameter is a bitmask indicating +which buttons are pressed: + \*(Pb = \*0 \(<- no buttons down. + \*(Pb & \*1 \(<- right button down. + \*(Pb & \*2 \(<- middle button down. + \*(Pb & \*4 \(<- left button down. + \*(Pb & \*8 \(<- M4 button down. +.br +The \*(``\fIrow\fP\*('' and \*(``\fIcolumn\fP\*('' parameters +are the coordinates of the locator position in the \fI\*(xt\fP window, +encoded as ASCII decimal. +.br +The \*(``\fIpage\fP\*('' parameter is not used by \*(xt. +.iP +.IP \\*(Cs\\*(Ps\\*s\\**\\*| +Select number of lines per screen (DECSNLS), VT420 and up. +.iP +.IP \\*(Cs\\*#\\*} +Pop video attributes from stack (XTPOPSGR), \fI\*(xt\fP. +Popping restores the video-attributes which were saved using XTPUSHSGR +to their previous state. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(qu\\*} +Insert \*(Ps Column(s) (default = 1) (DECIC), VT420 and up. +. +.iP +.IP \\*(Cs\\*(Ps\\*s\\*(qu\\*~ +Delete \*(Ps Column(s) (default = 1) (DECDC), VT420 and up. +. +.Ed +. +.Ss Operating System Commands +.St +. +.IP \\*(Os\\*(Ps\\*s\\*;\\*(Pt\\*s\\*(Be +.iP +.IP \\*(Os\\*(Ps\\*s\\*;\\*(Pt\\*s\\*(ST +Set Text Parameters. +Some control sequences return information: +.RS +.bP +For colors and font, +if \*(Pt is a \*(``?\*('', +the control sequence elicits a response which consists +of the control sequence which would set the corresponding value. +.bP +The \fIdtterm\fP control sequences allow you to determine the icon name +and window title. +.RE +.sP +\*(XT accepts either \*(Be or \*(ST for terminating \*(Os sequences, +and when returning information, uses the same terminator used in a query. +While the latter is preferred, +the former is supported for legacy applications: +.RS +.bP +Although documented in the changes for X.V10R4 (December 1986), +\*(Be as a string terminator dates from X11R4 (December 1989). +.bP +Since XFree86-3.1.2Ee (August 1996), \*(xt has accepted \*(ST +(the documented string terminator in ECMA-48). +.RE +.sP +\*(Ps specifies the type of operation to perform: + \*(Ps = \*0 \(-> Change Icon Name and Window Title to \*(Pt. + \*(Ps = \*1 \(-> Change Icon Name to \*(Pt. + \*(Ps = \*2 \(-> Change Window Title to \*(Pt. + \*(Ps = \*3 \(-> Set X property on top-level window. +\*(Pt should be in the form +\*(``\fIprop=value\fP\*('', or just +\*(``\fIprop\fP\*('' to delete the property. + \*(Ps = \*4\*;\fIc\fP\*s\*;\fIspec\fP \(-> Change Color Number \fIc\fP to +the color specified by \fIspec\fP. +This can be a name or RGB specification as per \fIXParseColor\fP. +Any number of \fIc\fP/\fIspec\fP pairs may be given. +The color numbers correspond to the ANSI colors 0-7, +their bright versions 8-15, +and if supported, the remainder of the 88-color or 256-color table. +.sP +If a \*(``?\*('' is given rather than a name or RGB specification, +\fI\*(xt\fP replies with a control sequence of the same form which can be used +to set the corresponding color. +Because more than one pair of color number and specification can +be given in one control sequence, \fI\*(xt\fR can make more than one reply. +.sP + \*(Ps = \*5\*;\fIc\fP\*s\*;\fIspec\fP \(-> Change Special Color Number \fIc\fP to +the color specified by \fIspec\fP. +This can be a name or RGB specification as per \fIXParseColor\fP. +Any number of \fIc\fP/\fIspec\fP pairs may be given. +The special colors can also be set by adding the maximum number of colors +to these codes in an \*(Os\*4 control: +.sP +.in +2n + \*(Pc = \*0 \(<- resource \fBcolorBD\fP (BOLD). + \*(Pc = \*1 \(<- resource \fBcolorUL\fP (UNDERLINE). + \*(Pc = \*2 \(<- resource \fBcolorBL\fP (BLINK). + \*(Pc = \*3 \(<- resource \fBcolorRV\fP (REVERSE). + \*(Pc = \*4 \(<- resource \fBcolorIT\fP (ITALIC). +.in -2n +.sP + \*(Ps = \*6\*;\fIc\fP\*s\*;\fIf\fP \(-> Enable/disable Special Color Number \fIc\fP. +The second parameter tells \fI\*(xt\fP to enable the corresponding color +mode if nonzero, disable it if zero. +\*(Os\*6 is the same as \*(Os\*1\*0\*6. +.sP +The 10 colors (below) which may be set or queried +using \*1\*0 through \*1\*9 are +denoted \fIdynamic colors\fR, since the corresponding control sequences +were the first means for setting \fI\*(xt\fR's colors dynamically, +i.e., after it was started. +They are not the same as the ANSI colors +(however, the dynamic text foreground and background colors +are used when ANSI colors are reset using SGR \*3\*9 and \*4\*9, respectively). +These controls may be disabled using the \fBallowColorOps\fP resource. +At least one parameter is expected for \*(Pt. +Each successive parameter changes the next color in the list. +The value of \*(Ps tells the starting point in the list. +The colors are specified by name or RGB specification as per \fIXParseColor\fP. +.sP +If a \*(``?\*('' is given rather than a name or RGB specification, +\fI\*(xt\fP replies with a control sequence of the same form which can be used +to set the corresponding dynamic color. +Because more than one pair of color number and specification can +be given in one control sequence, \fI\*(xt\fR can make more than one reply. +.sP + \*(Ps = \*1\*0 \(-> Change VT100 text foreground color to \*(Pt. + \*(Ps = \*1\*1 \(-> Change VT100 text background color to \*(Pt. + \*(Ps = \*1\*2 \(-> Change text cursor color to \*(Pt. + \*(Ps = \*1\*3 \(-> Change pointer foreground color to \*(Pt. + \*(Ps = \*1\*4 \(-> Change pointer background color to \*(Pt. + \*(Ps = \*1\*5 \(-> Change Tektronix foreground color to \*(Pt. + \*(Ps = \*1\*6 \(-> Change Tektronix background color to \*(Pt. + \*(Ps = \*1\*7 \(-> Change highlight background color to \*(Pt. + \*(Ps = \*1\*8 \(-> Change Tektronix cursor color to \*(Pt. + \*(Ps = \*1\*9 \(-> Change highlight foreground color to \*(Pt. +.sP + \*(Ps = \*4\*6 \(-> Change Log File to \*(Pt. +This is normally disabled by a compile-time option. +.sP + \*(Ps = \*5\*0 \(-> Set Font to \*(Pt. +These controls may be disabled using the \fBallowFontOps\fP resource. +If \*(Pt begins with a \*(``#\*('', index in the font menu, relative (if the +next character is a plus or minus sign) or absolute. +A number is +expected but not required after the sign (the default is the current +entry for relative, zero for absolute indexing). +.sP +The same rule (plus or minus sign, optional number) is used when +querying the font. +The remainder of \*(Pt is ignored. +.sP +A font can be specified after a \*(``#\*('' index expression, +by adding a space and then the font specifier. +.sP +If the \fBTrueType Fonts\fP menu entry is set (the \fBrenderFont\fP resource), +then this control sets/queries the \fBfaceName\fP resource. +.sP + \*(Ps = \*5\*1 \(-> reserved for Emacs shell. +.sP + \*(Ps = \*5\*2 \(-> Manipulate Selection Data. +These controls may be disabled using the \fBallowWindowOps\fP resource. +The parameter \*(Pt is parsed as +.br + \*(Pc\*s\*;\*(Pd +.br +The first, \*(Pc, may contain zero or more characters from the +set \*c, \*p, \*q, \*(cs, \*0, \*1, \*2, \*3, \*4, \*5, \*6, and \*7. +It is used to construct a list of selection parameters for +clipboard, +primary, +secondary, +select, +or cut buffers 0 through 7 respectively, +in the order given. +If the parameter is empty, \fI\*(xt\fP uses \*(cs\*0, +to specify the configurable primary/clipboard selection and cut buffer 0. +.sP +The second parameter, \*(Pd, gives the selection data. +Normally this is a string encoded in base64 (RFC-4648). +The data becomes the new selection, +which is then available for pasting by other applications. +.sP +If the second parameter is a \*?, +\fI\*(xt\fP replies to the host with the selection +data encoded using the same protocol. +It uses the first selection +found by asking successively +for each item from the list of selection parameters. +.sP +If the second parameter is neither a base64 string nor \*?, +then the selection is cleared. +.sP + \*(Ps = \*1\*0\*4\*;\fIc\fP \(-> Reset Color Number \fIc\fP. It is reset to +the color specified by the corresponding X resource. +Any number of \fIc\fP parameters may be given. +These parameters correspond to the ANSI colors 0-7, +their bright versions 8-15, +and if supported, the remainder of the 88-color or 256-color table. +If no parameters are given, the entire table will be reset. +.sP + \*(Ps = \*1\*0\*5\*;\fIc\fP \(-> Reset Special Color Number \fIc\fP. +It is reset to the color specified by the corresponding X resource. +Any number of \fIc\fP parameters may be given. +These parameters correspond to the special colors which can be set +using an \*(Os\*5 control (or by adding the maximum number of colors +using an \*(Os\*4 control). +.sP + \*(Ps = \*1\*0\*6\*;\fIc\fP\*s\*;\fIf\fP \(-> Enable/disable Special Color Number \fIc\fP. +The second parameter tells \fI\*(xt\fP to enable the corresponding color +mode if nonzero, disable it if zero. +.sP +.in +2n + \*(Pc = \*0 \(<- resource \fBcolorBDMode\fP (BOLD). + \*(Pc = \*1 \(<- resource \fBcolorULMode\fP (UNDERLINE). + \*(Pc = \*2 \(<- resource \fBcolorBLMode\fP (BLINK). + \*(Pc = \*3 \(<- resource \fBcolorRVMode\fP (REVERSE). + \*(Pc = \*4 \(<- resource \fBcolorITMode\fP (ITALIC). + \*(Pc = \*5 \(<- resource \fBcolorAttrMode\fP (Override ANSI). +.in -2n +.sP +The \fIdynamic colors\fR can also be reset to their default (resource) values: + \*(Ps = \*1\*1\*0 \(-> Reset VT100 text foreground color. + \*(Ps = \*1\*1\*1 \(-> Reset VT100 text background color. + \*(Ps = \*1\*1\*2 \(-> Reset text cursor color. + \*(Ps = \*1\*1\*3 \(-> Reset pointer foreground color. + \*(Ps = \*1\*1\*4 \(-> Reset pointer background color. + \*(Ps = \*1\*1\*5 \(-> Reset Tektronix foreground color. + \*(Ps = \*1\*1\*6 \(-> Reset Tektronix background color. + \*(Ps = \*1\*1\*7 \(-> Reset highlight color. + \*(Ps = \*1\*1\*8 \(-> Reset Tektronix cursor color. + \*(Ps = \*1\*1\*9 \(-> Reset highlight foreground color. +.sP + \*(Ps = \*I\*s\*;\fIc\fP \(-> Set icon to file. +Sun shelltool, CDE dtterm. +.br +The file is expected to be XPM format, +and uses the same search logic as the \fBiconHint\fP resource. +.sP + \*(Ps = \*l\*s\*;\fIc\fP \(-> Set window title. +Sun shelltool, CDE dtterm. +.sP + \*(Ps = \*L\*s\*;\fIc\fP \(-> Set icon label. +Sun shelltool, CDE dtterm. +.Ed +. +.Ss Privacy Message +.St +.IP \\*(PM\\*(Pt\\*s\\*(ST +\fI\*(xt\fP implements no \*(PM functions; \*(Pt is ignored. +\*(Pt need not be printable characters. +.Ed +. +.Sh "Alt and Meta Keys" +.LP +Many keyboards have keys labeled \*(``Alt\*(''. +Few have keys labeled \*(``Meta\*(''. +However, \fI\*(xt\fP's default translations use the \fIMeta\fP modifier. +Common keyboard configurations assign the \fIMeta\fP modifier +to an \*(``Alt\*('' key. +By using \fIxmodmap\fP one may have the modifier assigned to a different key, +and have \*(``real\*('' alt and meta keys. +Here is an example: +.ID +.ft CW +! put meta on mod3 to distinguish it from alt +keycode 64 = Alt_L +clear mod1 +add mod1 = Alt_L +keycode 115 = Meta_L +clear mod3 +add mod3 = Meta_L +.ft 1 +.DE +.LP +The \fBmetaSendsEscape\fP resource +(and \fBaltSendsEscape\fP if \fBaltIsNotMeta\fP is set) +can be used to control the way the \fIMeta\fP modifier applies to ordinary +keys unless the \fBmodifyOtherKeys\fP resource is set: +.bP +prefix a key with the \*(Es character. +.bP +shift the key from codes 0-127 to 128-255 by adding 128. +.LP +When \fBmodifyOtherKeys\fP is set, +ordinary keys may be sent as escape sequences: +.bP +When \fBmodifyOtherKeys\fP is set to 1, +only the alt- and meta-modifiers apply. +For example, \fIalt-Tab\fP sends +\*(Cs\*2\*7\*;\*3\*;\*9\*~ +(the second parameter is \*(``3\*('' for \fIalt\fP, +and the third parameter is the ASCII value of tab, \*(``9\*(''). +.bP +When \fBmodifyOtherKeys\fP is set to 2, +all of the modifiers apply. +For example, \fIshift-Tab\fP sends +\*(Cs\*2\*7\*;\*2\*;\*9\*~ +rather than +\*(Cs\*Z +(the second parameter is \*(``2\*('' for \fIshift\fP). +.LP +The \fBformatOtherKeys\fP resource tells \fI\*n\fP to change the +format of the escape sequences sent when \fBmodifyOtherKeys\fP applies. +When \fBmodifyOtherKeys\fP is set to 1, +for example \fIalt-Tab\fP sends +\*(Cs\*9\*;\*3\*u +(changing the order of parameters). +One drawback to this format is that applications may confuse it with +\*(Cs\*u (restore-cursor). +.LP +The \fI\*(xt\fP FAQ sections +.br +.ID 3 +.\" https://invisible-island.net/xterm/xterm.faq.html#xterm_modother +\fIHow can my program distinguish control-I from tab?\fP +.ID 3 +.\" https://invisible-island.net/xterm/modified-keys.html +\fIXTerm - \*(``Other\*('' Modified Keys\fP +.DE +.br +go into greater detail on this topic. +.LP +The table shows the result for a given character \*(``x\*('' with modifiers +according to the default translations with the resources set on or off. +This assumes \fBaltIsNotMeta\fP is set: +.\" page-eject to work around grohtml bugs +.if t .bp +.TS H +center; +lf3w(2c) lf3w(2c) lf3w(2c) lf3w(2c) . +_ +.TH +.T& +l | l | l | l . +key altSendsEscape metaSendsEscape result +_ +x off off x +Meta-x off off shift +Alt-x off off shift +Alt+Meta-x off off shift +x ON off x +Meta-x ON off shift +Alt-x ON off \*(Es x +Alt+Meta-x ON off \*(Es shift +x off ON x +Meta-x off ON \*(Es x +Alt-x off ON shift +Alt+Meta-x off ON \*(Es shift +x ON ON x +Meta-x ON ON \*(Es x +Alt-x ON ON \*(Es x +Alt+Meta-x ON ON \*(Es x +_ +.TE +.Sh "PC-Style Function Keys" +.LP +If \fI\*(xt\fP does minimal translation of the function keys, +it usually does this +with a PC-style keyboard, so PC-style function keys result. +Sun keyboards are similar to PC keyboards. +Both have cursor and scrolling operations printed on the keypad, +which duplicate the smaller cursor and scrolling keypads. +.LP +X does not predefine NumLock (used for VT220 keyboards) or Alt (used as +an extension for the Sun/PC keyboards) as modifiers. +These keys are recognized as modifiers when enabled +by the \fBnumLock\fP resource, +or by the \*(``DECSET \*1\*0\*3\*5\*('' control sequence. +.LP +The cursor keys transmit the following escape sequences depending on the +mode specified via the DECCKM escape sequence. +.TS H +center; +lf3w(2c) lf3w(2c) lf3w(2c) . +Key Normal Application +_ +.TH +.T& +l | l | l . +Cursor Up \*(Cs\*A \*(S3\*A +Cursor Down \*(Cs\*(cB \*(S3\*(cB +Cursor Right \*(Cs\*C \*(S3\*C +Cursor Left \*(Cs\*D \*(S3\*D +_ +.TE +The home- and end-keys +(unlike PageUp and other keys also on the 6-key editing keypad) +are considered \*(``cursor keys\*('' by \fI\*(xt\fP. +Their mode is also controlled by the DECCKM escape sequence: +.TS H +center; +lf3w(2c) lf3w(2c) lf3w(2c) . +Key Normal Application +_ +.TH +.T& +l | l | l . +Home \*(Cs\*H \*(S3\*H +End \*(Cs\*F \*(S3\*F +_ +.TE +.LP +The application keypad transmits the following escape sequences depending on the +mode specified via the DECKPNM and DECKPAM escape sequences. +Use the NumLock key to override the application mode. +.LP +Not all keys are present on the Sun/PC keypad (e.g., PF1, Tab), +but are supported by +the program. +.TS H +center; +lf3w(2c) lf3w(2c) lf3w(2c) lf3w(2c) lf3w(2c) . +Key Numeric Application Terminfo Termcap +_ +.TH +.T& +l | l | l | l | l . +Space \*(Sp \*(S3\*(Sp - - +Tab \*(Ta \*(S3\*I - - +Enter \*(Cr \*(S3\*M kent @8 +PF1 \*(S3\*P \*(S3\*P kf1 k1 +PF2 \*(S3\*Q \*(S3\*Q kf2 k2 +PF3 \*(S3\*R \*(S3\*R kf3 k3 +PF4 \*(S3\*S \*(S3\*S kf4 k4 +* \f1(multiply)\fP \** \*(S3\*j - - ++ \f1(add)\fP \*+ \*(S3\*k - - +, \f1(comma)\fP \*, \*(S3\*l - - +- \f1(minus)\fP \*- \*(S3\*m - - +\&. \f1(Delete)\fP \*. \*(Cs\*3\*~ - - +/ \f1(divide)\fP \*/ \*(S3\*o - - +0 \f1(Insert)\fP \*0 \*(Cs\*2\*~ - - +1 \f1(End)\fP \*1 \*(S3\*F kc1 K4 +2 \f1(DownArrow)\fP \*2 \*(Cs\*(cB - - +3 \f1(PageDown)\fP \*3 \*(Cs\*6\*~ kc3 K5 +4 \f1(LeftArrow)\fP \*4 \*(Cs\*D - - +5 \f1(Begin)\fP \*5 \*(Cs\*E kb2 K2 +6 \f1(RightArrow)\fP \*6 \*(Cs\*C - - +7 \f1(Home)\fP \*7 \*(S3\*H ka1 K1 +8 \f1(UpArrow)\fP \*8 \*(Cs\*A - - +9 \f1(PageUp)\fP \*9 \*(Cs\*5\*~ ka3 K3 += (equal) \*= \*(S3\*(XX - - +_ +.TE +.br +They also provide 12 function keys, as well as a few other special-purpose keys: +.TS H +center; +lf3w(2c) lf3w(2c) . +Key Escape Sequence +_ +.TH +.T& +l | l . +F1 \*(S3\*P +F2 \*(S3\*Q +F3 \*(S3\*R +F4 \*(S3\*S +F5 \*(Cs\*1\*5\*~ +F6 \*(Cs\*1\*7\*~ +F7 \*(Cs\*1\*8\*~ +F8 \*(Cs\*1\*9\*~ +F9 \*(Cs\*2\*0\*~ +F10 \*(Cs\*2\*1\*~ +F11 \*(Cs\*2\*3\*~ +F12 \*(Cs\*2\*4\*~ +_ +.TE +.sP +Note that F1 through F4 are prefixed with \*(S3, +while the other keys are prefixed with \*(Cs. +Older versions of \fI\*(xt\fP implement different escape sequences +for F1 through F4, with a \*(Cs prefix. +These can be activated by setting the \fBoldXtermFKeys\fP resource. +However, since they do not correspond to any hardware terminal, +they have been deprecated. +(The DEC VT220 reserves F1 through F5 for local functions such as \fISetup\fP). +.TS H +center; +lf3w(2c) lf3w(2c) . +Key Escape Sequence +_ +.TH +.T& +l | l . +F1 \*(Cs\*1\*1\*~ +F2 \*(Cs\*1\*2\*~ +F3 \*(Cs\*1\*3\*~ +F4 \*(Cs\*1\*4\*~ +_ +.TE +In normal mode, i.e., a Sun/PC keyboard +when the \fBsunKeyboard\fP resource is false +(and none of the other keyboard resources +such as \fBoldXtermFKeys\fP resource is set), +\fI\*(xt\fP encodes function key modifiers +as parameters appended before the \fIfinal\fP character of the control sequence. +As a special case, +the \*(S3 sent before F1 through F4 is altered to \*(Cs when sending +a function key modifier as a parameter. +.TS H +center; +cf3w(2c) lf3w(2c) . +Code Modifiers +_ +.TH +.T& +c | l . +2 Shift +3 Alt +4 Shift + Alt +5 Control +6 Shift + Control +7 Alt + Control +8 Shift + Alt + Control +9 Meta +10 Meta + Shift +11 Meta + Alt +12 Meta + Alt + Shift +13 Meta + Ctrl +14 Meta + Ctrl + Shift +15 Meta + Ctrl + Alt +16 Meta + Ctrl + Alt + Shift +_ +.TE +For example, shift-F5 would be sent as +\*(Cs\*1\*5\*;\*2\*~ +.LP +If the \fBalwaysUseMods\fP resource is set, the Meta modifier also is +recognized, making parameters 9 through 16. +.LP +The codes used for the \fIPC-style function keys\fP were inspired +by a feature of the VT510, referred to in its reference manual as DECFNK. +In the DECFNK scheme, codes 2-8 identify modifiers for function-keys +and cursor-, editing-keypad keys. +Unlike \fI\*(xt\fP, the VT510 limits the modifiers which can be used +with cursor- and editing-keypad keys. +Although the name \*(``DECFNK\*('' implies that it is a mode, +the VT510 manual mentions it only as a feature, +which (like \fI\*(xt\fP) interacts with the DECUDK feature. +Unlike \fI\*(xt\fP, VT510/VT520 provide an extension to DECUDK +(DECPFK and DECPAK) +which apparently was the reason for the feature in those terminals, +i.e., for identifying a programmable key +rather than making it simple for applications to obtain modifier information. +It is not described in the related VT520 manual. +Neither manual was readily available +at the time the feature was added to \fI\*(xt\fP. +.LP +On the other hand, the VT510 and VT520 reference manuals +do document a related feature. +That is its emulation of the SCO console, +which is similar to the \*(``xterm-sco\*('' terminal description. +The SCO console function-keys are less useful to +applications developers than the approach used by \fI\*(xt\fP because +.bP +the relationship between modifiers and the characters sent by function-keys +is not readily apparent, and +.bP +the scheme is not extensible, i.e., it is an \fIad hoc\fP +assignment limited to two modifiers (\fIshift\fP and \fIcontrol\fP). +.Sh "VT220-Style Function Keys" +.LP +However, \fI\*(xt\fP is most useful as a DEC VT102 or VT220 emulator. +Set the \fBsunKeyboard\fP resource to true to force a Sun/PC keyboard +to act like a VT220 keyboard. +.LP +The VT102/VT220 application keypad transmits unique escape sequences in +application mode, which are distinct from the cursor and scrolling keypad: +.TS H +center; +lf3w(2c) lf3w(2c) lf3w(2c) lf3w(2c) . +Key Numeric Application VT100? +_ +.TH +.T& +l | l | l | l . +Space \*(Sp \*(S3\*(Sp no +Tab \*(Ta \*(S3\*I no +Enter \*(Cr \*(S3\*M yes +PF1 \*(S3\*P \*(S3\*P yes +PF2 \*(S3\*Q \*(S3\*Q yes +PF3 \*(S3\*R \*(S3\*R yes +PF4 \*(S3\*S \*(S3\*S yes +* \f1(multiply)\fP \** \*(S3\*j no ++ \f1(add)\fP \*+ \*(S3\*k no +, \f1(comma)\fP \*, \*(S3\*l yes +- \f1(minus)\fP \*- \*(S3\*m yes +\&. \f1(period)\fP \*. \*(S3\*n yes +/ \f1(divide)\fP \*/ \*(S3\*o no +0 \*0 \*(S3\*p yes +1 \*1 \*(S3\*q yes +2 \*2 \*(S3\*r yes +3 \*3 \*(S3\*(cs yes +4 \*4 \*(S3\*t yes +5 \*5 \*(S3\*u yes +6 \*6 \*(S3\*v yes +7 \*7 \*(S3\*w yes +8 \*8 \*(S3\*x yes +9 \*9 \*(S3\*y yes += (equal) \*= \*(S3\*(XX no +_ +.TE +.LP +The VT100/VT220 keypad did not have all of those keys. +They were implemented in \fI\*(xt\fP in X11R1 (1987), +defining a mapping of all X11 keys which might be provided on a keypad. +For instance, a Sun4/II type-4 keyboard provided +\*(``=\*('' (equal), +\*(``/\*('' (divide), and +\*(``*\*('' (multiply). +.LP +While the VT420 provided the same keypad, +the VT520 used a PC-keyboard. +Because that keyboard's keypad lacks the \*(``,\*('' (comma), +it was not possible to use EDT's delete-character function with the keypad. +\fI\*(XT\fP solves that problem for the VT220-keyboard configuration +by mapping +.sP + \fICtrl\fP \*+ to \*, and + \fICtrl\fP \*- to \*- +.LP +The VT220 provides a 6-key editing keypad, +which is analogous to that on the PC keyboard. +It is not affected by DECCKM or DECKPNM/DECKPAM: +.TS H +center; +lf3w(2c) lf3w(2c) lf3w(2c) . +Key Normal Application +_ +.TH +.T& +l | l | l . +\f1Insert\fP \*(Cs\*2\*~ \*(Cs\*2\*~ +\f1Delete\fP \*(Cs\*3\*~ \*(Cs\*3\*~ +\f1Home\fP \*(Cs\*1\*~ \*(Cs\*1\*~ +\f1End\fP \*(Cs\*4\*~ \*(Cs\*4\*~ +\f1PageUp\fP \*(Cs\*5\*~ \*(Cs\*5\*~ +\f1PageDown\fP \*(Cs\*6\*~ \*(Cs\*6\*~ +_ +.TE +.LP +The VT220 provides 8 additional function keys. +With a Sun/PC keyboard, access these keys by Control/F1 for F13, etc. +.TS H +center; +lf3w(2c) lf3w(2c) . +Key Escape Sequence +_ +.TH +.T& +l | l . +F13 \*(Cs\*2\*5\*~ +F14 \*(Cs\*2\*6\*~ +F15 \*(Cs\*2\*8\*~ +F16 \*(Cs\*2\*9\*~ +F17 \*(Cs\*3\*1\*~ +F18 \*(Cs\*3\*2\*~ +F19 \*(Cs\*3\*3\*~ +F20 \*(Cs\*3\*4\*~ +_ +.TE +.Sh "VT52-Style Function Keys" +.LP +A VT52 does not have function keys, +but it does have a numeric keypad and cursor keys. +They differ from the other emulations by the prefix. +Also, the cursor keys do not change: +.TS H +center; +lf3w(2c) lf3w(2c) . +Key Normal/Application +_ +.TH +.T& +l | l . +Cursor Up \*(Es\*A +Cursor Down \*(Es\*(cB +Cursor Right \*(Es\*C +Cursor Left \*(Es\*D +_ +.TE +The keypad is similar: +.TS H +center; +lf3w(2c) lf3w(2c) lf3w(2c) lf3w(2c) . +Key Numeric Application VT52? +_ +.TH +.T& +l | l | l | l . +Space \*(Sp \*(Es\*?\*(Sp no +Tab \*(Ta \*(Es\*?\*I no +Enter \*(Cr \*(Es\*?\*M no +PF1 \*(Es\*P \*(Es\*P yes +PF2 \*(Es\*Q \*(Es\*Q yes +PF3 \*(Es\*R \*(Es\*R yes +PF4 \*(Es\*S \*(Es\*S no +* \f1(multiply)\fP \** \*(Es\*?\*j no ++ \f1(add)\fP \*+ \*(Es\*?\*k no +, \f1(comma)\fP \*, \*(Es\*?\*l no +- \f1(minus)\fP \*- \*(Es\*?\*m no +\&. \f1(period)\fP \*. \*(Es\*?\*n yes +/ \f1(divide)\fP \*/ \*(Es\*?\*o no +0 \*0 \*(Es\*?\*p yes +1 \*1 \*(Es\*?\*q yes +2 \*2 \*(Es\*?\*r yes +3 \*3 \*(Es\*?\*(cs yes +4 \*4 \*(Es\*?\*t yes +5 \*5 \*(Es\*?\*u yes +6 \*6 \*(Es\*?\*v yes +7 \*7 \*(Es\*?\*w yes +8 \*8 \*(Es\*?\*x yes +9 \*9 \*(Es\*?\*y yes += (equal) \*= \*(Es\*?\*(XX no +_ +.TE +.Sh "Sun-Style Function Keys" +.LP +The \fI\*(xt\fP program provides support for Sun keyboards more directly, by +a menu toggle that causes it to send Sun-style function key codes +rather than VT220. +Note, however, that the \fIsun\fP and \fIVT100\fP emulations are not really +compatible. +For example, their wrap-margin behavior differs. +.LP +Only function keys are altered; keypad and cursor keys are the same. +The emulation responds identically. +See the xterm-sun terminfo entry for details. +.Sh "HP-Style Function Keys" +.LP +Similarly, \fI\*(xt\fP can be compiled to support HP keyboards. +See the xterm-hp terminfo entry for details. +.Sh "The Alternate Screen Buffer" +.LP +\fI\*(XT\fP maintains two screen buffers. +The Normal Screen Buffer allows you to scroll back to view saved lines +of output up to the maximum set by the \fBsaveLines\fP resource. +The \fIAlternate Screen Buffer\fP is exactly as large as the display, +contains no additional saved lines. +When the \fIAlternate Screen Buffer\fP is active, +you cannot scroll back to view saved lines. +\fI\*(XT\fP provides control sequences and menu entries +for switching between the two. +.LP +Most full-screen applications use terminfo or termcap to obtain +strings used to start/stop full-screen mode, +i.e., \fIsmcup\fP and \fIrmcup\fP for terminfo, +or the corresponding \fIti\fP and \fIte\fP for termcap. +The \fBtiteInhibit\fP resource removes the \fIti\fP and \fIte\fP strings +from the TERMCAP string which is set in the environment for some platforms. +That is not done when \fI\*(xt\fP is built with terminfo libraries because +terminfo does not provide the whole text of the termcap data in one piece. +It would not work for terminfo anyway, since terminfo data is not passed +in environment variables; +setting an environment variable in this manner would have no effect on +the application's ability to switch +between \fINormal\fP and \fIAlternate Screen\fP buffers. +Instead, the newer private mode controls +(such as \*1\*0\*4\*9) +for switching between \fINormal\fP +and \fIAlternate Screen\fP buffers simply disable the switching. +They add other features such as clearing the display for the same reason: +to make the details of switching independent of the application that +requests the switch. +. +.Sh "Bracketed Paste Mode" +.LP +When bracketed paste mode is set, +pasted text is bracketed with control sequences +so that the program can differentiate pasted text from typed-in text. +When bracketed paste mode is set, +the program will receive: + \*(Es\*([[\*2\*0\*0\*~, +.br +followed by the pasted text, followed by + \*(Es\*([[\*2\*0\*1\*~. +. +.Sh "Title Modes" +.LP +The window- and icon-labels can be set or queried using control sequences. +As a VT220-emulator, \fI\*(xt\fP \*(``should\*('' limit +the character encoding for +the corresponding strings to ISO-8859-1. +Indeed, it used to be the case (and was documented) that +window titles had to be ISO-8859-1. +This is no longer the case. +However, there are many applications which still assume that titles are +set using ISO-8859-1. +So that is the default behavior. +.LP +If \fI\*(xt\fP is running with UTF-8 encoding, +it is possible to use window- and icon-labels encoded using UTF-8. +That is because the underlying X libraries (and many, but not all) +window managers support this feature. +.LP +The \fButf8Title\fP X resource setting tells \fI\*(xt\fP to disable +a reconversion of the title string back to ISO-8859-1, +allowing the title strings to be interpreted as UTF-8. +The same feature can be enabled using the title mode control sequence +described in this summary. +.LP +Separate from the ability to set the titles, +\fI\*(xt\fP provides the ability to query the titles, +returning them either in ISO-8859-1 or UTF-8. +This choice is available only while \fI\*(xt\fP is using UTF-8 encoding. +.LP +Finally, the characters sent to, or returned by a title control +are less constrained than the rest of the control sequences. +To make them more manageable (and constrained), for use in shell scripts, +\fI\*(xt\fP has an optional feature which decodes the string from hexadecimal +(for setting titles) or for encoding the title into hexadecimal when querying +the value. +. +.Sh "Mouse Tracking" +.LP +The VT widget can be set to send the mouse position and other +information on button presses. +These modes are typically used by +editors and other full-screen applications that want to make use of +the mouse. +.LP +There are two sets of mutually exclusive modes: +.bP +mouse protocol +.bP +protocol encoding +.LP +The mouse protocols include +DEC Locator mode, enabled by the +DECELR \*(Cs\*(Ps\*s\*;\*(Ps\*s\*(qu\*s\*z +control sequence, and is not described here +(control sequences are summarized above). +The remaining five modes of the mouse protocols +are each enabled (or disabled) by a different parameter in +the +\*(``DECSET \*(Cs\*?\*(Pm\*s\*h\*('' +or +\*(``DECRST \*(Cs\*?\*(Pm\*s\*l\*('' +control sequence. +.LP +Manifest constants for the parameter values +are defined in \fIxcharmouse.h\fP as follows: +. +.ID +.ft CW +#define SET_X10_MOUSE 9 +#define SET_VT200_MOUSE 1000 +#define SET_VT200_HIGHLIGHT_MOUSE 1001 +#define SET_BTN_EVENT_MOUSE 1002 +#define SET_ANY_EVENT_MOUSE 1003 +.sP +#define SET_FOCUS_EVENT_MOUSE 1004 +.sP +#define SET_ALTERNATE_SCROLL 1007 +.sP +#define SET_EXT_MODE_MOUSE 1005 +#define SET_SGR_EXT_MODE_MOUSE 1006 +#define SET_URXVT_EXT_MODE_MOUSE 1015 +#define SET_PIXEL_POSITION_MOUSE 1016 +.ft 1 +.DE +.br +The motion reporting modes are strictly \fI\*(xt\fP extensions, and are not +part of any standard, though they are analogous to the DEC VT200 DECELR +locator reports. +.LP +Normally, +parameters (such as pointer position and button number) for all mouse +tracking escape sequences generated by \fI\*(xt\fP +encode numeric parameters in a single character as +\fIvalue\fP+32. +For example, \*! specifies the value 1. +The upper left character position on the terminal is denoted as 1,1. +This scheme dates back to X10, +though the normal mouse-tracking (from X11) is more elaborate. +.Ss X10 compatibility mode +.LP +X10 compatibility mode sends an escape sequence only on button press, +encoding the location and the mouse button pressed. +It is enabled by specifying parameter 9 to DECSET. +On button press, \fI\*(xt\fP sends +\*(Cs\*M\*(Cb\*(Cx\*(Cy (6 characters). +.bP +\*(Cb is \fIbutton\fP\-1, where \fIbutton\fP is 1, 2 or 3. +.bP +\*(Cx and \*(Cy are the \fIx\fP and \fIy\fP coordinates of the mouse when the +button was pressed. +.Ss Normal tracking mode +.LP +Normal tracking mode sends an escape sequence on both button press and +release. +Modifier key (shift, ctrl, meta) information is also sent. +It is enabled by specifying parameter 1000 to DECSET. +On button press or release, \fI\*(xt\fP sends +\*(Cs\*M\*(Cb\*(Cx\*(Cy. +.bP +The low two bits of \*(Cb encode button information: +0=MB1 pressed, 1=MB2 pressed, 2=MB3 pressed, 3=release. +.bP +The next three bits encode the modifiers which were down when the button was +pressed and are added together: 4=Shift, 8=Meta, 16=Control. +Note however that the shift and control bits are normally unavailable +because \fI\*(xt\fP uses the control modifier with mouse for popup menus, +and the shift modifier is used in the default translations for button events. +The \fIMeta\fP modifier recognized by \fI\*(xt\fP is the \fImod1\fP mask, +and is not necessarily the \*(``Meta\*('' key (see \fBxmodmap\fP(1)). +.bP +\*(Cx and \*(Cy are the x and y coordinates of the mouse event, encoded as +in X10 mode. +.Ss Wheel mice +.LP +Wheel mice may return buttons 4 and 5. +Those buttons are represented by the same event codes +as buttons 1 and 2 respectively, +except that 64 is added to the event code. +Release events for the wheel buttons are not reported. +.LP +By default, +the wheel mouse events (buttons 4 and 5) +are translated to \fIscroll-back\fP +and \fIscroll-forw\fP actions, respectively. +Those actions normally scroll the whole window, +as if the scrollbar was used. +.LP +However if \fIAlternate Scroll\fP mode is set, +then cursor up/down controls are sent when the terminal is displaying +the \fIAlternate Screen Buffer\fP. +The initial state of \fIAlternate Scroll\fP mode is set +using the \fBalternateScroll\fP resource. +.Ss Other buttons +.LP +Some wheel mice can send additional button events, +e.g., by tilting the scroll wheel left and right. +.LP +Additional buttons are encoded like the wheel mice, +.bP +by adding 64 (for buttons 6 and 7), or +.bP +by adding 128 (for buttons 8 through 11). +.LP +Past button 11, the encoding is ambiguous because the same code +may correspond to different button/modifier combinations. +.LP +It is not possible to use these buttons (6-11) in \fI\*(xt\fP's +\fBtranslations\fP resource because their names are not in the X Toolkit's +symbol table. +However, applications can check for the reports, e.g., +button 7 (left) and button 6 (right) with a Logitech mouse. +.Ss Highlight tracking +.LP +Mouse highlight tracking notifies a program of a button press, receives a +range of lines from the program, highlights the region covered by +the mouse within that range until button release, and then sends the +program the release coordinates. +It is enabled by specifying parameter 1001 to DECSET. +Highlighting is performed only for button 1, though other button events +can be received. +.sP +\fBWarning\fP: +this mode requires a cooperating program, else \fI\*(xt\fP will hang. +.LP +On button press, the same information as for normal tracking is +generated; \fI\*(xt\fP then waits for the program to send mouse +tracking information. +\fIAll X events are ignored until the proper escape sequence is\fP +\fIreceived from the pty:\fP +.br +\*(Cs\*(Ps\*s\*;\*(Ps\*s\*;\*(Ps\*s\*;\*(Ps\*s\*;\*(Ps\*s\*T +.LP +The parameters are \fIfunc, startx, starty, firstrow,\fP and \fIlastrow\fP: +.bP +\fIfunc\fP is non-zero to initiate highlight tracking and zero to abort. +.bP +\fIstartx\fP and \fIstarty\fP give the starting x and y location for +the highlighted region. +.bP +The ending location tracks the mouse, but +will never be above row \fIfirstrow\fP and will always be above row +\fIlastrow.\fP +(The top of the screen is row 1.) +.LP +When the button is released, \fI\*(xt\fP reports the ending position +one of two ways: +.bP +if the start and end coordinates are the same locations: +.sP +\*(Cs\*t\*(Cx\*(Cy +.bP +otherwise: +.sP +\*(Cs\*T\*(Cx\*(Cy\*(Cx\*(Cy\*(Cx\*(Cy +.LP +The parameters are \fIstartx, starty, endx, endy, mousex,\fP and \fImousey\fP: +.bP +\fIstartx, starty, endx, \fPand\fI endy\fP give the starting and +ending character positions of the region. +.bP +\fImousex\fP and \fImousey\fP +give the location of the mouse at button up, which may not be over a +character. +.Ss Button-event tracking +.LP +Button-event tracking is essentially the same as normal tracking, but +\fI\*(xt\fP also reports button-motion events. +Motion events +are reported only if the mouse pointer has moved to a different character +cell. +It is enabled by specifying parameter 1002 to DECSET. +On button press or release, \fI\*(xt\fP sends the same codes used by normal +tracking mode. +.bP +On button-motion events, \fI\*(xt\fP adds 32 to the event code +(the third character, \*(Cb). +.bP +The other bits of the event code specify +button and modifier keys as in normal mode. +For example, motion into cell x,y with button 1 +down is reported as +.sP +\*(Cs\*M\*@\*(Cx\*(Cy +.sP +(\ \*@ = 32 + 0 (button 1) + 32 (motion indicator)\ ). +Similarly, motion with button 3 +down is reported as +.sP +\*(Cs\*M\*(cB\*(Cx\*(Cy +.sP +(\ \*(cB = 32 + 2 (button 3) + 32 (motion indicator)\ ). +.Ss Any-event tracking +.LP +Any-event mode is the same as button-event mode, except that all motion +events are reported, even if no mouse button is down. +It is enabled by specifying 1003 to DECSET. +.Ss FocusIn/FocusOut +.LP +FocusIn/FocusOut can be combined with any of the mouse events since +it uses a different protocol. +When set, it causes \fI\*(xt\fP to send +\*(Cs\*I when the terminal gains focus, and +\*(Cs\*O when it loses focus. +.Ss Extended coordinates +.LP +The original X10 mouse protocol limits the \*(Cx and \*(Cy ordinates +to 223 (=255\ -\ 32). +\fI\*(XT\fP supports more than one scheme for extending this range, +by changing the protocol encoding: +.IP "UTF-8 (1005)" +This enables UTF-8 encoding for \*(Cx and \*(Cy under +all tracking modes, expanding the maximum encodable position from 223 to 2015. +For positions less than 95, the resulting output is identical under both modes. +Under extended mouse mode, positions greater than 95 +generate \*(``extra\*('' bytes which will confuse +applications which do not treat their input as a UTF-8 stream. +Likewise, \*(Cb will be UTF-8 encoded, +to reduce confusion with wheel mouse events. +.IP +Under normal mouse mode, positions outside (160,94) result in +byte pairs which can be interpreted as a single UTF-8 character; +applications +which do treat their input as UTF-8 will almost certainly be confused +unless extended mouse mode is active. +.IP +This scheme has the drawback that the encoded coordinates will not +pass through \fBluit\fP(1) unchanged, +e.g., for locales using non-UTF-8 encoding. +.IP "SGR (1006)" +The normal mouse response is altered to use +.RS +.bP +\*(Cs\*< +followed by semicolon-separated +.bP +encoded button value, +.bP +\*(Px and \*(Py ordinates and +.bP +a final character which +is \*M for button press +and \*m for button release. +.RE +.IP +The encoded button value in this case does not add 32 since +that was useful only in the X10 scheme for ensuring that the +byte containing the button value is a printable code. +.RS +.bP +The modifiers are encoded in the same way. +.bP +A different final character is used for button release +to resolve the X10 ambiguity regarding which button was released. +.RE +.IP +The highlight tracking responses are also modified to an SGR-like format, +using the same SGR-style scheme and button-encodings. +.IP "URXVT (1015)" +The normal mouse response is altered to use +.RS +.bP +\*(Cs +followed by semicolon-separated +.bP +encoded button value, +.bP +the \*(Px and \*(Py ordinates and final character \*M. +.RE +.IP +This uses the same button encoding as X10, but printing it as +a decimal integer rather than as a single byte. +.IP +However, \*(Cs\*M can be mistaken for DL (delete lines), +while the highlight tracking \*(Cs\*T can be mistaken for SD (scroll down), +and the Window manipulation controls. +For these reasons, the 1015 control is not recommended; +it is not an improvement over 1006. +.IP "SGR-Pixels (1016)" +Use the same mouse response format as the 1006 control, +but report position in \fIpixels\fP rather than character \fIcells\fP. +. +.Sh "Sixel Graphics" +.LP +If \fI\*(xt\fP is configured as +VT240, +VT241, +VT330, +VT340 or +VT382 +using the \fBdecTerminalID\fP resource, +it supports Sixel Graphics controls, a palleted bitmap graphics system +using sets of six vertical pixels as the basic element. +.St +.IP \\*(Cs\\*(Ps\\*s\\*c +Send Device Attributes (Primary DA), \fI\*(xt\fP. +\fI\*(xt\fP responds to Send Device Attributes (Primary DA) with these +additional codes: + \*(Ps = \*4 \(-> Sixel graphics. +.iP +.IP \\*(Cs\\*?\\*(Pm\\*s\\*h +Set Mode, \fI\*(xt\fP. +\fI\*(xt\fP has these additional private Set Mode values: + \*(Ps = \*8\*0 \(-> Sixel scrolling. + \*(Ps = \*1\*0\*7\*0 \(-> use private color registers for each graphic. + \*(Ps = \*8\*4\*5\*2 \(-> Sixel scrolling leaves cursor to right of graphic. +.iP +.IP \\*(Dc\\*(Pa\\*s\\*;\\*(Pb\\*s\\*;\\*(Ph\\*s\\*q\\*s\\*(Ps..\\*(Ps\fP\\*s\\*(ST +Send SIXEL image, DEC graphics terminals, \fI\*(xt\fP. +See: +.ID 3 +\fIVT330/VT340 Programmer Reference Manual Volume 2:\fP +\fIGraphics Programming\fP +.\" https://vt100.net/docs/vt3xx-gp/chapter14.html +\fIChapter 14 Graphics Programming\fP +.DE +The sixel data device control string has three positional parameters, +following the \*q with sixel data. + \*(Pa \(-> pixel aspect ratio + \*(Pb \(-> background color option + \*(Ph \(-> horizontal grid size (ignored). + \*(Ps \(-> sixel data +.Ed +. +.Sh "ReGIS Graphics" +.LP +If \fI\*(xt\fP is configured as +VT125, +VT240, +VT241, +VT330 or +VT340 +using the \fBdecTerminalID\fP resource, +it supports Remote Graphic Instruction Set, a graphics description language. +.St +.IP \\*(Cs\\*(Ps\\*s\\*c +Send Device Attributes (Primary DA), DEC graphics terminals, \fI\*(xt\fP. +\fI\*(xt\fP responds to Send Device Attributes (Primary DA) with these +additional codes: + \*(Ps = \*3 \(-> ReGIS graphics. +.iP +.IP \\*(Cs\\*?\\*(Pm\\*s\\*h +Set Mode, \fI\*(xt\fP. +\fI\*(xt\fP has these additional private Set Mode values: + \*(Ps = \*1\*0\*7\*0 \(-> use private color registers for each graphic. +.iP +.IP \\*(Dc\\*(Pm\\*s\\*p\\*(Pr..\\*(Pr\fP\\*s\\*(ST +Enter or exit ReGIS, VT300, \fI\*(xt\fP. +See: +.ID 3 +\fIVT330/VT340 Programmer Reference Manual Volume 2:\fP +\fIGraphics Programming\fP +.\" https://vt100.net/docs/vt3xx-gp/chapter1.html +\fIChapter 1 Introduction to ReGIS\fP +.DE +The ReGIS data device control string has one positional parameter +with four possible values: + \*(Pm = 0 \(-> resume command, use fullscreen mode. + \*(Pm = 1 \(-> start new command, use fullscreen mode. + \*(Pm = 2 \(-> resume command, use command display mode. + \*(Pm = 3 \(-> start new command, use command display mode. +.Ed +. +.Sh "Tektronix 4014 Mode" +.LP +Most of these sequences are standard Tektronix 4014 control sequences. +Graph mode supports the 12-bit addressing of the Tektronix 4014. +The major features missing are +the write-through and defocused modes. +This document does not describe the commands used in the various +Tektronix plotting modes but does describe the commands to switch modes. +.LP +Some of the sequences are specific to \fI\*(xt\fP. +The Tektronix emulation was added in X10R4 (1986). +The VT240, introduced two years earlier, also supported Tektronix 4010/4014. +Unlike \fI\*(xt\fP, the VT240 documentation implies +(there is an obvious error in +section 6.9 \*(``Entering and Exiting 4010/4014 Mode\*('') +that exiting back to ANSI mode is done by +resetting private mode \*3\*8 (DECTEK) +rather than \*(Es\*(Et. +A real Tektronix 4014 would not respond to either. +.St +.IP \\*(Be +Bell (Ctrl-G). +.iP +.IP \\*(Bs +Backspace (Ctrl-H). +.iP +.IP \\*(Ta +Horizontal Tab (Ctrl-I). +.iP +.IP \\*(Lf +Line Feed or New Line (Ctrl-J). +.iP +.IP \\*(Vt +Cursor up (Ctrl-K). +.iP +.IP \\*(Ff +Form Feed or New Page (Ctrl-L). +.iP +.IP \\*(Cr +Carriage Return (Ctrl-M). +.iP +.IP \\*(Es\\*(Et +Switch to VT100 Mode (\*(Es Ctrl-C). +.iP +.IP \\*(Es\\*(En +Return Terminal Status (\*(Es Ctrl-E). +.iP +.IP \\*(Es\\*(Ff +PAGE (Clear Screen) (\*(Es Ctrl-L). +.iP +.IP \\*(Es\\*(So +Begin 4015 APL mode (\*(Es Ctrl-N). +This is ignored by \fI\*(xt\fP. +.iP +.IP \\*(Es\\*(Si +End 4015 APL mode (\*(Es Ctrl-O). +This is ignored by \fI\*(xt\fP. +.iP +.IP \\*(Es\\*(Eb +COPY (Save Tektronix Codes to file COPY\fIyyyy-mm-dd.hh:mm:ss\fP). + \*(Eb (end transmission block) is the same as Ctrl-W. +.iP +.IP \\*(Es\\*(Ca +Bypass Condition (\*(Es Ctrl-X). +.iP +.IP \\*(Es\\*(Su +GIN mode (\*(Es Ctrl-Z). +.iP +.IP \\*(Es\\*(Fs +Special Point Plot Mode (\*(Es Ctrl-\e). +.iP +.IP \\*(Es\\*8 +Select Large Character Set. +.iP +.IP \\*(Es\\*9 +Select #2 Character Set. +.iP +.IP \\*(Es\\*: +Select #3 Character Set. +.iP +.IP \\*(Es\\*; +Select Small Character Set. +.iP +.IP \\*(Os\\*(Ps\\*s\\*;\\*(Pt\\*s\\*(Be +Set Text Parameters of VT window. + \*(Ps = \*0 \(-> Change Icon Name and Window Title to \*(Pt. + \*(Ps = \*1 \(-> Change Icon Name to \*(Pt. + \*(Ps = \*2 \(-> Change Window Title to \*(Pt. + \*(Ps = \*4\*6 \(-> Change Log File to \*(Pt. +This is normally disabled by a compile-time option. +.iP +.IP \\*(Es\\*` +Normal Z Axis and Normal (solid) Vectors. +.iP +.IP \\*(Es\\*a +Normal Z Axis and Dotted Line Vectors. +.iP +.IP \\*(Es\\*b +Normal Z Axis and Dot-Dashed Vectors. +.iP +.IP \\*(Es\\*c +Normal Z Axis and Short-Dashed Vectors. +.iP +.IP \\*(Es\\*d +Normal Z Axis and Long-Dashed Vectors. +.iP +.IP \\*(Es\\*h +Defocused Z Axis and Normal (solid) Vectors. +.iP +.IP \\*(Es\\*i +Defocused Z Axis and Dotted Line Vectors. +.iP +.IP \\*(Es\\*j +Defocused Z Axis and Dot-Dashed Vectors. +.iP +.IP \\*(Es\\*k +Defocused Z Axis and Short-Dashed Vectors. +.iP +.IP \\*(Es\\*l +Defocused Z Axis and Long-Dashed Vectors. +.iP +.IP \\*(Es\\*p +Write-Thru Mode and Normal (solid) Vectors. +.iP +.IP \\*(Es\\*q +Write-Thru Mode and Dotted Line Vectors. +.iP +.IP \\*(Es\\*r +Write-Thru Mode and Dot-Dashed Vectors. +.iP +.IP \\*(Es\\*(cs +Write-Thru Mode and Short-Dashed Vectors. +.iP +.IP \\*(Es\\*t +Write-Thru Mode and Long-Dashed Vectors. +.iP +.IP \\*(Fs +Point Plot Mode (Ctrl-\e). +.iP +.IP \\*(Gs +Graph Mode (Ctrl-]). +.iP +.IP \\*(Rs +Incremental Plot Mode (Ctrl-\*^). +.iP +.IP \\*(Us +Alpha Mode (Ctrl-_). +.Ed +. +. +.Sh "VT52 Mode" +.LP +Parameters for cursor movement are at the end of the \*(Es\*Y escape sequence. +Each ordinate is encoded in a single character as \fIvalue\fP+32. +For example, \*! is 1. +The screen coordinate system is 0-based. +.St +.IP \\*(Es\\*< +Exit VT52 mode (Enter VT100 mode). +.iP +.IP \\*(Es\\*= +Enter alternate keypad mode. +.iP +.IP \\*(Es\\*> +Exit alternate keypad mode. +.iP +.IP \\*(Es\\*A +Cursor up. +.iP +.IP \\*(Es\\*(cB +Cursor down. +.iP +.IP \\*(Es\\*C +Cursor right. +.iP +.IP \\*(Es\\*D +Cursor left. +.iP +.IP \\*(Es\\*F +Enter graphics mode. +.iP +.IP \\*(Es\\*G +Exit graphics mode. +.iP +.IP \\*(Es\\*H +Move the cursor to the home position. +.iP +.IP \\*(Es\\*I +Reverse line feed. +.iP +.IP \\*(Es\\*J +Erase from the cursor to the end of the screen. +.iP +.IP \\*(Es\\*K +Erase from the cursor to the end of the line. +.iP +.IP \\*(Es\\*Y\\*(Ps\\*s\\*(Ps +Move the cursor to given row and column. +.iP +.IP \\*(Es\\*Z +Identify. + \(-> \*(Es\*s\*/\*s\*Z (\*(``I am a VT52.\*(''). +.Ed +. +.Sh "Further reading" +.Ss "Technical manuals" +.LP +Manuals for \fIhardware\fP terminals are more readily available than +similarly-detailed documentation for terminal \fIemulators\fP +such as \fIaixterm\fP, \fIshelltool\fP, \fIdtterm\fP. +.LP +However long, the technical manuals have problems: +.bP +DEC's manuals did not provide a comprehensive comparison of the features +in different model. +.IP +Peter Sichel's \fIHost Interface Functions Checklist\fP +spreadsheet is useful for noting +which model introduced a given feature (although there are a few apparent +errors such as the DECRQSS feature cited for VT320 +whereas the technical manual omits it). +.bP +Sometimes the manuals disagree. +For example, DEC's standard document (DEC STD 070) for terminals says +that DECSCL performs a \fIsoft\fP reset (DECSTR), +while the VT420 manual says it does a \fIhard\fP reset (RIS). +.bP +Sometimes the manuals are simply incorrect. +For example, testing a DEC VT420 in 1996 showed that the documented +code for a valid or invalid response to DECRQSS was reversed. +.IP +The VT420 test results were incorporated into \fIvttest\fP program. +At the time, DEC STD 070 was not available, +but it also agrees with \fIvttest\fP. +Later, documentation for the DEC VT525 was shown to have the same flaw. +.bP +Not all details are clear even in DEC STD 070 +(which is more than twice the length of the +VT520 programmer's reference manual, +and almost three times longer than the VT420 reference manual). +However, as an internal standards document, +DEC STD 070 is more likely to describe the actual behavior of DEC's terminals +than the more polished user's guides. +.LP +That said, here are technical manuals +which have been used in developing \fI\*(xt\fP. +Not all were available initially. +In August 1996 for instance, the technical references were +limited to +EK-VT220-HR-002 and +EK-VT420-UG.002. +Shortly after, +Richard Shuford sent a copy of +EK-VT3XX-TP-001. +Still later (beginning in 2003), Paul Williams' vt100.net site +provided +EK-VT102-UG-003, +EK-VT220-RM-002, +EK-VT420-RM-002, +EK-VT520-RM A01, +EK-VT100-TM-003, and +EK-VT102-UG-003. +The remaining documents were found on the bitsavers site. +.bP +.\" http://www.bitsavers.org/pdf/dec/terminal/vt52/EK-VT5X-OP-001_DECscope_Users_Manual_Mar77.pdf +\fIDECscope User's Manual\fP. +.br +Digital Equipment Corporation +(EK-VT5X-OP-001 1975). +.bP +.\" http://www.bitsavers.org/pdf/dec/terminal/vt100/EK-VT100-TM-003_VT100_Technical_Manual_Jul82.pdf +\fIVT100 Series Video Terminal Technical Manual\fP. +.br +Digital Equipment Corporation +(EK-VT100-TM-003, July 1982). +.bP +.\" https://vt100.net/docs/vt100-ug/ +\fIVT100 User Guide\fP. +.br +Digital Equipment Corporation +(EK-VT100-UG-003, June 1981). +.bP +.\" https://vt100.net/docs/vt102-ug/ +\fIVT102 User Guide\fP. +.br +Digital Equipment Corporation +(EK-VT102-UG-003, February 1982). +.bP +.\" http://manx-docs.org/details.php/1,2954 +\fIVT220 Programmer Pocket Guide\fP. +.br +Digital Equipment Corporation +(EK-VT220-HR-002, July 1984). +.bP +.\" https://vt100.net/docs/vt220-rm/ +\fIVT220 Programmer Reference Manual\fP. +.br +Digital Equipment Corporation +(EK-VT220-RM-002, August 1984). +.bP +.\" http://www.bitsavers.org/pdf/dec/terminal/vt240/EK-VT240-RM-002_VT240_Programmer_Reference_Manual_Oct84.pdf +\fIVT240 Programmer Reference Manual\fP. +.br +Digital Equipment Corporation +(EK-VT240-RM-002, October 1984). +.bP +.\" http://www.bitsavers.org/pdf/dec/terminal/vt340/EK-VT3XX-TP-001_VT330_VT340_Text_Programming_Mar87.pdf +\fIVT330/VT340 Programmer Reference Manual\fP +.br +\fIVolume 1: Text Programming\fP. +.br +Digital Equipment Corporation +(EK-VT3XX-TP-001, March 1987). +.bP +.\" https://vt100.net/docs/vt3xx-gp/ +\fIVT330/VT340 Programmer Reference Manual\fP +.br +\fIVolume 2: Graphics Programming\fP. +.br +Digital Equipment Corporation +(EK-VT3XX-GP-001, March 1987). +.bP +.\" http://www.bitsavers.org/pdf/dec/terminal/vt420/EK-VT420-UG-001_Installing_and_Using_The_VT420_Video_Terminal_Nov89.pdf +\fIInstalling and Using\fP +.br +\fIThe VT420 Video Terminal\fP +.br +\fI(North American Model)\fP. +.br +Digital Equipment Corporation +(EK-VT420-UG.002, February 1990). +.bP +.\" http://manx-docs.org/collections/mds-199909/cd3/term/vt420rm2.pdf +\fIVT420 Programmer Reference Manual\fP. +.br +Digital Equipment Corporation +(EK-VT420-RM-002, February 1992). +.bP +.\" https://vt100.net/docs/vt510-rm/ +\fIVT510 Video Terminal\fP +.br +\fIProgrammer Information\fP. +.br +Digital Equipment Corporation +(EK-VT510-RM B01, November 1993). +.bP +.\" http://www.bitsavers.org/pdf/dec/terminal/vt5xx/EK-VT520-RM_VT520_VT525_Programmer_Information_Jul94.pdf +\fIVT520/VT525 Video Terminal\fP +.br +\fIProgrammer Information\fP. +.br +Digital Equipment Corporation +(EK-VT520-RM A01, July 1994). +.bP +.\" http://www.vaxhaven.com/images/f/f7/EK-PPLV2-PM-B01.pdf +\fIDigital ANSI-Compliant Printing Protocol\fP +.br +\fILevel 2 Programming Reference Manual\fP +.br +Digital Equipment Corporation +(EK-PPLV2-PM B01, August 1994). +.bP +.\" https://vt100.net/manx/details/5,5479 +\fI4014 and 4014-1 Computer Display Terminal\fP +.br +\fIUser's Manual\fP. +.br +Tektronix, Inc. +(070-1647-00, November 1979). +.Ss "Standards" +.LP +The DEC terminal family (VT100 through VT525) is upward-compatible, +using standards plus \fIextensions\fP, e.g., \*(``private modes\*(''. +Not all commonly-used features are standard. +For example, scrolling regions are not found in ECMA-48. +.LP +Again, it is possible to find discrepancies in the standards: +.bP +The printed ECMA-48 5th edition (1991) +and the first PDF produced for that edition (April 1998) +state that SD (scroll down) ends with 05/14, i.e., \*^, +which disagrees with DEC's VT420 hardware implementation and +DEC's manuals which use 05/04 \*T. +(A few other terminals such as AT&T 5620 and IBM 5151 also used 05/04, +but the documentation and dates are lacking). +.IP +ECMA created a new PDF in April 2003 which changed that detail to use \*T, +and later in 2008 provided PDFs of the earlier editions which used \*T. +.bP +The VT320, VT420, VT520 manuals claim that DECSCL does a +hard reset (RIS). +.IP +Both the VT220 manual and DEC STD 070 (which documents +levels 1-4 in detail) state that it is a soft reset, e.g., DECSTR. +.LP +Here are the relevant standards: +.bP +.\" https://www.ecma-international.org/publications/standards/Ecma-035.htm +\fIECMA-35: Character Code Structure and Extension Techniques\fP +.br +(6th Edition, December 1994). +.bP +.\" http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-043.pdf +\fIECMA-43: 8-bit Coded Character Set Structure and Rules\fP +.br +(3rd Edition, December 1991). +.\" same as dpANS X3.134.1 +.bP +.\" https://www.ecma-international.org/publications/standards/Ecma-048.htm +\fIECMA-48: Control Functions for Coded Character Sets\fP +.br +(5th Edition, June 1991). +.bP +.\" http://www.bitsavers.org/pdf/dec/standards/EL-SM070-00_DEC_STD_070_Video_Systems_Reference_Manual_Dec91.pdf +\fIDEC STD 070 Video Systems Reference Manual\fP. +.br +Digital Equipment Corporation +(A-MN-ELSM070-00-0000 Rev H, December 3, 1991). +.Ss "Miscellaneous" +.LP +A few hardware terminals survived into the 1990s only as terminal emulators. +Documentation for these and other terminal emulators +which have influenced \fI\*(xt\fP +are generally available only in +less-accessible and less-detailed manual pages. +.bP +\fI\*(XT\fP supports control sequences for manipulating its \fIwindow\fP +which were implemented by Sun's \fIshelltool\fP program. +This was part of SunView (SunOS 3.0, 1986). +The change-notes for \fI\*(xt\fP's \fIresize\fP program in X10.4 (1986) +mention its use of these \*(``Sun tty emulation escape sequences\*('' +for resizing the window. +The X10.4 \fI\*(xt\fP program recognized these sequences for resizing +the terminal, except for the iconify/deiconify pair. +SunView also introduced the SIGWINCH signal, +used by the X10.4 \fI\*(xt\fP and mentioned in its \fICHANGES\fP file: +.iP +.RS +The window size is passed to the operating system via TIOCSWINSZ (4.3) or +TIOCSSIZE (sun). +A SIGWINCH signal is sent if the vtXXX window is resized. +.RE +.IP +While support for the Sun control-sequences remained in \fIresize\fP, +the next release of \fI\*(xt\fP (X11R1 in 1987) +omitted the code for interpreting them. +.IP +Later, the SunView program was adapted for +the \fIOPEN LOOK\fP environment introduced 1988-1990. +.IP +Still later, in 1995, \fIOPEN LOOK\fP was abandoned in favor of \fICDE\fP. +The \fICDE\fP terminal emulator \fIdtterm\fP implemented those controls, +with a couple of additions. +.IP +Starting in July 1996, +\fI\*(xt\fP re-implemented those control sequences +(based on the \fIdtterm\fP manual pages) +and further extended the group of window controls. +.IP +There were two sets of controls +(\*(Cs\*(Ps\*s\fI[\fP\*s\*;\*(Pm\*s\*;\*(Pm\*s\fI]\fP\*s\*t, +and \*(Os\*(Ps\*s\fItext\fP\*s\*(ST) implemented +by \fIshelltool\fP, documented in appendix E of both +\fIPHIGS Programming Manual\fP (1992), and the unpublished +\fIX Window System User's Guide (OPEN LOOK Edition)\fP (1995). +The \fICDE\fP program kept those, +and added a few new ones. +.TS +l l l l l +_ _ _ _ _ +l c c c l. +\fBCode\fR \fBSun\fR \fBCDE \*(XT Description\fP +\*(Cs\*1\*t yes yes yes de-iconify +\*(Cs\*2\*t yes yes yes iconify +\*(Cs\*3\*t yes yes yes move window to pixel-position +\*(Cs\*4\*t yes yes yes resize window in pixels +\*(Cs\*5\*t yes yes yes raise window to front of stack +\*(Cs\*6\*t yes yes yes raise window to back of stack +\*(Cs\*7\*t yes yes yes refresh window +\*(Cs\*8\*t yes yes yes resize window in chars +\*(Cs\*9\*t - - yes maximize/unmaximize window +\*(Cs\*1\*0\*t - - yes to/from full-screen +\*(Cs\*1\*1\*t yes yes yes report if window is iconified +\*(Cs\*1\*2\*t - - - - +\*(Cs\*1\*3\*t yes yes yes report window position +\*(Cs\*1\*4\*t yes yes yes report window size in pixels +\*(Cs\*1\*5\*t - - yes report screen size in pixels +\*(Cs\*1\*6\*t - - yes report character cell in pixels +\*(Cs\*1\*7\*t - - - - +\*(Cs\*1\*8\*t yes yes yes report window size in chars +\*(Cs\*1\*9\*t - - yes report screen size in chars +\*(Cs\*2\*0\*t - yes yes report icon label +\*(Cs\*2\*1\*t - yes yes report window title +\*(Cs\*2\*2\*t - - yes save window/icon title +\*(Cs\*2\*3\*t - - yes restore window/icon title +\*(Cs\*2\*4\*t - - yes resize window (DECSLPP) +\*(Os\*0\*(ST - yes yes set window and icon title +\*(Os\*1\*(ST - yes yes set icon label +\*(Os\*2\*(ST - yes yes set window title +\*(Os\*3\*(ST - n/a yes set X server property +\*(Os\*I\*(ST yes yes yes set icon to file +\*(Os\*l\*(ST yes yes yes set window title +\*(Os\*L\*(ST yes yes yes set icon label +.TE +.br +Besides the Sun-derived OSC controls for setting window title and icon label, +\fIdtterm\fP also supported the \fI\*(xt\fP controls for the same feature. +.IP +The \fICDE\fP source was unavailable for inspection until 2012, +so that clarification of the details of the window operations +relied upon \fIvttest\fP. +.bP +The control sequences for saving/restoring the cursor and +for saving/restoring \*(``DEC Private Mode Values\*('' may appear to be +related (since the \*(``save\*('' controls both end with \*(cs), +but that is coincidental. +The latter was introduced in X10.4: +.iP +.RS +.ft C +.na +.hy 0 +Most Dec Private mode settings can be saved away internally using \\E[?ns, +where n is the same number to set or reset the Dec Private mode. The +mode can be restored using \\E[?nr. This can be used in termcap for vi, for +example, to turn off saving of lines, but restore whatever the original +state was on exit. +.hy +.ad +.ft R +.RE +.IP +while the SCOSC/SCORC pair was added in 1995 by XFree86 +(and documented long afterwards). +.bP +The \fIaixterm\fP manual page gives the format of the control sequence +for foreground and background colors 8-15, +but does not specify what those colors are. +That is implied by the description's mention of \fIHFT\fP: +.iP +.RS +.na +.hy 0 +.ft C +The aixterm command provides a standard terminal type for programs that +do not interact directly with Enhanced X-Windows. +This command provides +an emulation for a VT102 terminal or a high function terminal (HFT). +The VT102 mode is activated by the -v flag. +.ft R +.ad +.RE +.hy +.IP +Unlike \fI\*(xt\fP, there are no resource names for the 16 colors, +leaving the reader to assume that the mapping is hard-coded. +The control sequences for colors 8-15 are not specified by ECMA-48, +but rather (as done in other instances by \fI\*(xt\fP) chosen to +not conflict with current or future standards. +. +.if n .pl \n(nlu+1v diff --git a/ports/xterm/xterm-359/ctlseqs.txt b/ports/xterm/xterm-359/ctlseqs.txt new file mode 100644 index 0000000..efc7cf4 --- /dev/null +++ b/ports/xterm/xterm-359/ctlseqs.txt @@ -0,0 +1,3032 @@ + + + + + + + + + + XTerm Control Sequences + + + Edward Moy + University of California, Berkeley + + Revised by + + Stephen Gildea + X Consortium (1994) + + Thomas Dickey + XFree86 Project (1996-2006) + invisible-island.net (2006-2020) + updated for XTerm Patch #359 (2020/08/03) + + + + +Definitions + +Many controls use parameters, shown in italics. If a control uses a +single parameter, only one parameter name is listed. Some parameters +(along with separating ; characters) may be optional. Other characters +in the control are required. + +C A single (required) character. + +Ps A single (usually optional) numeric parameter, composed of one or + more digits. + +Pm Any number of single numeric parameters, separated by ; charac- + ter(s). Individual values for the parameters are listed with Ps . + +Pt A text parameter composed of printable characters. + + +Control Bytes, Characters, and Sequences + +ECMA-48 (aka "ISO 6429") documents C1 (8-bit) and C0 (7-bit) codes. +Those are respectively codes 128 to 159 and 0 to 31. ECMA-48 avoids +referring to these codes as characters, because that term is associated +with graphic characters. Instead, it uses "bytes" and "codes", with +occasional lapses to "characters" where the meaning cannot be mistaken. + +Controls (including the escape code 27) are processed once: + +o This means that a C1 control can be mistaken for badly-formed UTF-8 + when the terminal runs in UTF-8 mode because C1 controls are valid + continuation bytes of a UTF-8 encoded (multibyte) value. + +o It is not possible to use a C1 control obtained from decoding the + UTF-8 text, because that would require reprocessing the data. Con- + sequently there is no ambiguity in the way this document uses the + term "character" to refer to bytes in a control sequence. + +The order of processing is a necessary consequence of the way ECMA-48 is +designed: + +o Each byte sent to the terminal can be unambiguously determined to + fall into one of a few categories (C0, C1 and graphic characters). + +o ECMA-48 is modal; once it starts processing a control sequence, the + terminal continues until the sequence is complete, or some byte is + found which is not allowed in the sequence. + +o Intermediate, parameter and final bytes may use the same codes as + graphic characters, but they are processed as part of a control + sequence and are not actually graphic characters. + +o Eight-bit controls can have intermediate, etc., bytes in the range + 160 to 255. Those can be treated as their counterparts in the range + 32 to 127. + +o Single-byte controls can be handled separately from multi-byte con- + trol sequences because ECMA-48's rules are unambiguous. + + As a special case, ECMA-48 (section 9) mentions that the control + functions shift-in and shift-out are allowed to occur within a 7-bit + multibyte control sequence because those cannot alter the meaning of + the control sequence. + +o Some controls (such as OSC ) introduce a string mode, which is ended + on a ST (string terminator). + + ECMA-48 describes only correct behavior, telling what types of char- + acters are expected at each stage of the control sequences. It says + that the action taken in error recovery is implementation-dependent. + XTerm decodes control sequences using a state machine. It handles + errors in decoding i.e., unexpected characters, by resetting to the + initial (ground) state. That is different from the treatment of + unimplemented (but correctly formatted) features. + + If an application does not send the string terminator, that is also + an error from the standpoint of a user. To accommodate users of + those applications, xterm has resource settings which allow work- + arounds: + + o The Linux console's palette sequences do not use a string termi- + nator. The brokenLinuxOSC resource setting tells xterm to + ignore those particular sequences. + + o The terminal should accept single-byte controls within the + string. But some applications omit a string terminator, like + the Linux console. The brokenStringTerm resource setting tells + xterm to exit string mode if it decodes a common control charac- + ter such as carriage return before the string terminator. + + +C1 (8-Bit) Control Characters + +The xterm program recognizes both 8-bit and 7-bit control characters. +It generates 7-bit controls (by default) or 8-bit if S8C1T is enabled. +The following pairs of 7-bit and 8-bit control characters are equiva- +lent: + +ESC D + Index (IND is 0x84). + +ESC E + Next Line (NEL is 0x85). + +ESC H + Tab Set (HTS is 0x88). + +ESC M + Reverse Index (RI is 0x8d). + +ESC N + Single Shift Select of G2 Character Set (SS2 is 0x8e), VT220. + This affects next character only. + +ESC O + Single Shift Select of G3 Character Set (SS3 is 0x8f), VT220. + This affects next character only. + +ESC P + Device Control String (DCS is 0x90). + +ESC V + Start of Guarded Area (SPA is 0x96). + +ESC W + End of Guarded Area (EPA is 0x97). + +ESC X + Start of String (SOS is 0x98). + +ESC Z + Return Terminal ID (DECID is 0x9a). Obsolete form of CSI c (DA). + +ESC [ + Control Sequence Introducer (CSI is 0x9b). + +ESC \ + String Terminator (ST is 0x9c). + +ESC ] + Operating System Command (OSC is 0x9d). + +ESC ^ + Privacy Message (PM is 0x9e). + +ESC _ + Application Program Command (APC is 0x9f). + + +These control characters are used in the vtXXX emulation. + + +VT100 Mode + +In this document, "VT100" refers not only to VT100/VT102, but also to +the succession of upward-compatible terminals produced by DEC (Digital +Equipment Corporation) from the mid-1970s for about twenty years. For +brevity, the document refers to the related models: + "VT200" as VT220/VT240, + "VT300" as VT320/VT340, + "VT400" as VT420, and + "VT500" as VT510/VT520/VT525. + +Most of these control sequences are standard VT102 control sequences, +but there is support for later DEC VT terminals (i.e., VT220, VT320, +VT420, VT510), as well as ECMA-48 and aixterm color controls. The only +VT102 feature not supported is auto-repeat, since the only way X pro- +vides for this will affect all windows. + +There are additional control sequences to provide xterm-dependent func- +tions, such as the scrollbar or window size. Where the function is +specified by DEC or ECMA-48, the code assigned to it is given in paren- +theses. + +The escape codes to designate and invoke character sets are specified by +ISO 2022 (see that document for a discussion of character sets). + +Many of the features are optional; xterm can be configured and built +without support for them. + + +Single-character functions + +BEL Bell (BEL is Ctrl-G). + +BS Backspace (BS is Ctrl-H). + +CR Carriage Return (CR is Ctrl-M). + +ENQ Return Terminal Status (ENQ is Ctrl-E). Default response is + an empty string, but may be overridden by a resource answer- + backString. + +FF Form Feed or New Page (NP ). (FF is Ctrl-L). FF is treated + the same as LF . + +LF Line Feed or New Line (NL). (LF is Ctrl-J). + +SI Switch to Standard Character Set (Ctrl-O is Shift In or LS0). + This invokes the G0 character set (the default) as GL. + VT200 and up implement LS0. + +SO Switch to Alternate Character Set (Ctrl-N is Shift Out or + LS1). This invokes the G1 character set as GL. + VT200 and up implement LS1. + +SP Space. + +TAB Horizontal Tab (HTS is Ctrl-I). + +VT Vertical Tab (VT is Ctrl-K). This is treated the same as LF. + + +Controls beginning with ESC + +This excludes controls where ESC is part of a 7-bit equivalent to 8-bit +C1 controls, ordered by the final character(s). + +ESC SP F 7-bit controls (S7C1T), VT220. This tells the terminal to + send C1 control characters as 7-bit sequences, e.g., its + responses to queries. DEC VT200 and up always accept 8-bit + control sequences except when configured for VT100 mode. + +ESC SP G 8-bit controls (S8C1T), VT220. This tells the terminal to + send C1 control characters as 8-bit sequences, e.g., its + responses to queries. DEC VT200 and up always accept 8-bit + control sequences except when configured for VT100 mode. + +ESC SP L Set ANSI conformance level 1, ECMA-43. + +ESC SP M Set ANSI conformance level 2, ECMA-43. + +ESC SP N Set ANSI conformance level 3, ECMA-43. + +ESC # 3 DEC double-height line, top half (DECDHL), VT100. + +ESC # 4 DEC double-height line, bottom half (DECDHL), VT100. + +ESC # 5 DEC single-width line (DECSWL), VT100. + +ESC # 6 DEC double-width line (DECDWL), VT100. + +ESC # 8 DEC Screen Alignment Test (DECALN), VT100. + +ESC % @ Select default character set. That is ISO 8859-1 (ISO 2022). + +ESC % G Select UTF-8 character set, ISO 2022. + +ESC ( C Designate G0 Character Set, VT100, ISO 2022. + Final character C for designating 94-character sets. In this + list, + o 0 , A and B were introduced in the VT100, + o most were introduced in the VT200 series, + o a few were introduced in the VT300 series, and + o a few more were introduced in the VT500 series. + The VT220 character sets, together with a few others (such as + Portuguese) are activated by the National Replacement Charac- + ter Set (NRCS) controls. The term "replacement" says that the + character set is formed by replacing some of the characters in + a set (termed the Multinational Character Set) with more use- + ful ones for a given language. The ASCII and DEC Supplemental + character sets make up the two halves of the Multinational + Character set, initially mapped to GL and GR. + The valid final characters C for this control are: + C = A -> United Kingdom (UK), VT100. + C = B -> United States (USASCII), VT100. + C = C or 5 -> Finnish, VT200. + C = H or 7 -> Swedish, VT200. + C = K -> German, VT200. + C = Q or 9 -> French Canadian, VT200. + C = R or f -> French, VT200. + C = Y -> Italian, VT200. + C = Z -> Spanish, VT200. + C = 4 -> Dutch, VT200. + C = " > -> Greek, VT500. + C = % 2 -> Turkish, VT500. + C = % 6 -> Portuguese, VT300. + C = % = -> Hebrew, VT500. + C = = -> Swiss, VT200. + C = ` , E or 6 -> Norwegian/Danish, VT200. + The final character A is a special case, since the same final + character is used by the VT300-control for the 96-character + British Latin-1. + There are a few other 94-character sets: + C = 0 -> DEC Special Character and Line Drawing Set, VT100. + C = < -> DEC Supplemental, VT200. + C = > -> DEC Technical, VT300. + These are documented as NRCS: + C = " 4 -> DEC Hebrew, VT500. + C = " ? -> DEC Greek, VT500. + C = % 0 -> DEC Turkish, VT500. + C = % 5 -> DEC Supplemental Graphics, VT300. + C = & 4 -> DEC Cyrillic, VT500. + The VT520 reference manual lists a few more, but no documenta- + tion has been found for the mappings: + C = % 3 -> SCS NRCS, VT500. + C = & 5 -> DEC Russian, VT500. + +ESC ) C Designate G1 Character Set, ISO 2022, VT100. + The same character sets apply as for ESC ( C. + +ESC * C Designate G2 Character Set, ISO 2022, VT220. + The same character sets apply as for ESC ( C. + +ESC + C Designate G3 Character Set, ISO 2022, VT220. + The same character sets apply as for ESC ( C. + +ESC - C Designate G1 Character Set, VT300. + These controls apply only to 96-character sets. Unlike the + 94-character sets, these can have different values than ASCII + space and DEL for the mapping of 0x20 and 0x7f. The valid + final characters C for this control are: + C = A -> ISO Latin-1 Supplemental, VT300. + C = F -> ISO Greek Supplemental, VT500. + C = H -> ISO Hebrew Supplemental, VT500. + C = L -> ISO Latin-Cyrillic, VT500. + C = M -> ISO Latin-5 Supplemental, VT500. + +ESC . C Designate G2 Character Set, VT300. + The same character sets apply as for ESC - C. + +ESC / C Designate G3 Character Set, VT300. + The same character sets apply as for ESC - C. + +ESC 6 Back Index (DECBI), VT420 and up. + +ESC 7 Save Cursor (DECSC), VT100. + +ESC 8 Restore Cursor (DECRC), VT100. + +ESC 9 Forward Index (DECFI), VT420 and up. + +ESC = Application Keypad (DECKPAM). + +ESC > Normal Keypad (DECKPNM), VT100. + +ESC F Cursor to lower left corner of screen. This is enabled by the + hpLowerleftBugCompat resource. + +ESC c Full Reset (RIS), VT100. + +ESC l Memory Lock (per HP terminals). Locks memory above the cur- + sor. + +ESC m Memory Unlock (per HP terminals). + +ESC n Invoke the G2 Character Set as GL (LS2) as GL. + +ESC o Invoke the G3 Character Set as GL (LS3) as GL. + +ESC | Invoke the G3 Character Set as GR (LS3R). + +ESC } Invoke the G2 Character Set as GR (LS2R). + +ESC ~ Invoke the G1 Character Set as GR (LS1R), VT100. + + +Application Program-Command functions + +APC Pt ST None. xterm implements no APC functions; Pt is ignored. Pt + need not be printable characters. + + +Device-Control functions + +DCS Ps ; Ps | Pt ST + User-Defined Keys (DECUDK), VT220 and up. + + The first parameter: + Ps = 0 -> Clear all UDK definitions before starting + (default). + Ps = 1 -> Erase Below (default). + + The second parameter: + Ps = 0 <- Lock the keys (default). + Ps = 1 <- Do not lock. + + The third parameter is a ';'-separated list of strings denot- + ing the key-code separated by a '/' from the hex-encoded key + value. The key codes correspond to the DEC function-key codes + (e.g., F6=17). + +DCS $ q Pt ST + Request Status String (DECRQSS), VT420 and up. + The string following the "q" is one of the following: + m -> SGR + " p -> DECSCL + SP q -> DECSCUSR + " q -> DECSCA + r -> DECSTBM + s -> DECSLRM + t -> DECSLPP + $ | -> DECSCPP + * | -> DECSNLS + xterm responds with DCS 1 $ r Pt ST for valid requests, + replacing the Pt with the corresponding CSI string, or DCS 0 $ + r Pt ST for invalid requests. + +DCS Ps $ t Pt ST + Restore presentation status (DECRSPS), VT320 and up. The con- + trol can be converted from a response from DECCIR or DECTABSR + by changing the first "u" to a "t" + Ps = 1 -> DECCIR + Ps = 2 -> DECTABSR + +DCS + Q Pt ST + Request resource values (XTGETXRES), xterm. The string fol- + lowing the "Q" is a list of names encoded in hexadecimal (2 + digits per character) separated by ; which correspond to xterm + resource names. Only boolean, numeric and string resources + are supported by this query. + + xterm responds with + DCS 1 + R Pt ST for valid requests, adding to Pt an = , and + the value of the corresponding resource that xterm is using, + or + DCS 0 + R Pt ST for invalid requests. + The strings are encoded in hexadecimal (2 digits per charac- + ter). + + +DCS + p Pt ST + Set Termcap/Terminfo Data (XTSETTCAP), xterm. The string fol- + lowing the "p" is a name to use for retrieving data from the + terminal database. The data will be used for the "tcap" key- + board configuration's function- and special-keys, as well as + by the Request Termcap/Terminfo String control. + + +DCS + q Pt ST + Request Termcap/Terminfo String (XTGETTCAP), xterm. The + string following the "q" is a list of names encoded in hexa- + decimal (2 digits per character) separated by ; which corre- + spond to termcap or terminfo key names. + A few special features are also recognized, which are not key + names: + + o Co for termcap colors (or colors for terminfo colors), and + + o TN for termcap name (or name for terminfo name). + + o RGB for the ncurses direct-color extension. + Only a terminfo name is provided, since termcap applica- + tions cannot use this information. + + xterm responds with + DCS 1 + r Pt ST for valid requests, adding to Pt an = , and + the value of the corresponding string that xterm would send, + or + DCS 0 + r Pt ST for invalid requests. + The strings are encoded in hexadecimal (2 digits per charac- + ter). + + +Functions using CSI , ordered by the final character(s) + +CSI Ps @ Insert Ps (Blank) Character(s) (default = 1) (ICH). + +CSI Ps SP @ + Shift left Ps columns(s) (default = 1) (SL), ECMA-48. + +CSI Ps A Cursor Up Ps Times (default = 1) (CUU). + +CSI Ps SP A + Shift right Ps columns(s) (default = 1) (SR), ECMA-48. + +CSI Ps B Cursor Down Ps Times (default = 1) (CUD). + +CSI Ps C Cursor Forward Ps Times (default = 1) (CUF). + +CSI Ps D Cursor Backward Ps Times (default = 1) (CUB). + +CSI Ps E Cursor Next Line Ps Times (default = 1) (CNL). + +CSI Ps F Cursor Preceding Line Ps Times (default = 1) (CPL). + +CSI Ps G Cursor Character Absolute [column] (default = [row,1]) (CHA). + +CSI Ps ; Ps H + Cursor Position [row;column] (default = [1,1]) (CUP). + +CSI Ps I Cursor Forward Tabulation Ps tab stops (default = 1) (CHT). + +CSI Ps J Erase in Display (ED), VT100. + Ps = 0 -> Erase Below (default). + Ps = 1 -> Erase Above. + Ps = 2 -> Erase All. + Ps = 3 -> Erase Saved Lines, xterm. + +CSI ? Ps J + Erase in Display (DECSED), VT220. + Ps = 0 -> Selective Erase Below (default). + Ps = 1 -> Selective Erase Above. + Ps = 2 -> Selective Erase All. + Ps = 3 -> Selective Erase Saved Lines, xterm. + +CSI Ps K Erase in Line (EL), VT100. + Ps = 0 -> Erase to Right (default). + Ps = 1 -> Erase to Left. + Ps = 2 -> Erase All. + +CSI ? Ps K + Erase in Line (DECSEL), VT220. + Ps = 0 -> Selective Erase to Right (default). + Ps = 1 -> Selective Erase to Left. + Ps = 2 -> Selective Erase All. + +CSI Ps L Insert Ps Line(s) (default = 1) (IL). + +CSI Ps M Delete Ps Line(s) (default = 1) (DL). + +CSI Ps P Delete Ps Character(s) (default = 1) (DCH). + +CSI # P +CSI Pm # P + Push current dynamic- and ANSI-palette colors onto stack + (XTPUSHCOLORS), xterm. Parameters (integers in the range 1 + through 10, since the default 0 will push) may be used to + store the palette into the stack without pushing. + +CSI # Q +CSI Pm # Q + Pop stack to set dynamic- and ANSI-palette colors (XTPOPCOL- + ORS), xterm. Parameters (integers in the range 1 through 10, + since the default 0 will pop) may be used to restore the pal- + ette from the stack without popping. + +CSI # R Report the current entry on the palette stack, and the number + of palettes stored on the stack, using the same form as XTPOP- + COLOR (default = 0) (XTREPORTCOLORS), xterm. + +CSI Ps S Scroll up Ps lines (default = 1) (SU), VT420, ECMA-48. + +CSI ? Pi ; Pa ; Pv S + Set or request graphics attribute (XTSMGRAPHICS), xterm. If + configured to support either Sixel Graphics or ReGIS Graphics, + xterm accepts a three-parameter control sequence, where Pi, Pa + and Pv are the item, action and value: + + Pi = 1 -> item is number of color registers. + Pi = 2 -> item is Sixel graphics geometry (in pixels). + Pi = 3 -> item is ReGIS graphics geometry (in pixels). + + Pa = 1 -> read attribute. + Pa = 2 -> reset to default. + Pa = 3 -> set to value in Pv. + Pa = 4 -> read the maximum allowed value. + + Pv is ignored by xterm except when setting (Pa == 3 ). + Pv = n <- A single integer is used for color registers. + Pv = width ; height <- Two integers for graphics geometry. + + xterm replies with a control sequence of the same form: + + CSI ? Pi ; Ps ; Pv S + + where Ps is the status: + Ps = 0 <- success. + Ps = 1 <- error in Pi. + Ps = 2 <- error in Pa. + Ps = 3 <- failure. + + On success, Pv represents the value read or set. + + Notes: + o The current implementation allows reading the graphics + sizes, but disallows modifying those sizes because that is + done once, using resource-values. + o Graphics geometry is not necessarily the same as "window + size" (see the dtterm window manipulation extensions). + For example, xterm limits the maximum graphics geometry at + compile time (1000x1000 as of version 328) although the + window size can be larger. + o While resizing a window will always change the current + graphics geometry, the reverse is not true. Setting + graphics geometry does not affect the window size. + +CSI Ps T Scroll down Ps lines (default = 1) (SD), VT420. + +CSI Ps ; Ps ; Ps ; Ps ; Ps T + Initiate highlight mouse tracking (XTHIMOUSE), xterm. Parame- + ters are [func;startx;starty;firstrow;lastrow]. See the sec- + tion Mouse Tracking. + +CSI > Pm T + Reset title mode features to default value (XTRMTITLE), xterm. + Normally, "reset" disables the feature. It is possible to + disable the ability to reset features by compiling a different + default for the title modes into xterm. + + Ps = 0 -> Do not set window/icon labels using hexadecimal. + Ps = 1 -> Do not query window/icon labels using hexadeci- + mal. + Ps = 2 -> Do not set window/icon labels using UTF-8. + Ps = 3 -> Do not query window/icon labels using UTF-8. + + (See discussion of Title Modes). + +CSI Ps X Erase Ps Character(s) (default = 1) (ECH). + +CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT). + +CSI Ps ^ Scroll down Ps lines (default = 1) (SD), ECMA-48. + This was a publication error in the original ECMA-48 5th edi- + tion (1991) corrected in 2003. + +CSI Ps ` Character Position Absolute [column] (default = [row,1]) + (HPA). + +CSI Ps a Character Position Relative [columns] (default = [row,col+1]) + (HPR). + +CSI Ps b Repeat the preceding graphic character Ps times (REP). + +CSI Ps c Send Device Attributes (Primary DA). + Ps = 0 or omitted -> request attributes from terminal. The + response depends on the decTerminalID resource setting. + -> CSI ? 1 ; 2 c ("VT100 with Advanced Video Option") + -> CSI ? 1 ; 0 c ("VT101 with No Options") + -> CSI ? 4 ; 6 c ("VT132 with Advanced Video and Graphics") + -> CSI ? 6 c ("VT102") + -> CSI ? 7 c ("VT131") + -> CSI ? 1 2 ; Ps c ("VT125") + -> CSI ? 6 2 ; Ps c ("VT220") + -> CSI ? 6 3 ; Ps c ("VT320") + -> CSI ? 6 4 ; Ps c ("VT420") + + The VT100-style response parameters do not mean anything by + themselves. VT220 (and higher) parameters do, telling the + host what features the terminal supports: + Ps = 1 -> 132-columns. + Ps = 2 -> Printer. + Ps = 3 -> ReGIS graphics. + Ps = 4 -> Sixel graphics. + Ps = 6 -> Selective erase. + Ps = 8 -> User-defined keys. + Ps = 9 -> National Replacement Character sets. + Ps = 1 5 -> Technical characters. + Ps = 1 6 -> Locator port. + Ps = 1 7 -> Terminal state interrogation. + Ps = 1 8 -> User windows. + Ps = 2 1 -> Horizontal scrolling. + Ps = 2 2 -> ANSI color, e.g., VT525. + Ps = 2 8 -> Rectangular editing. + Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode). + + XTerm supports part of the User windows feature, providing a + single page (which corresponds to its visible window). Rather + than resizing the font to change the number of lines/columns + in a fixed-size display, xterm uses the window extension con- + trols (DECSNLS, DECSCPP, DECSLPP) to adjust its visible win- + dow's size. The "cursor coupling" controls (DECHCCM, DECPCCM, + DECVCCM) are ignored. + +CSI = Ps c + Send Device Attributes (Tertiary DA). + Ps = 0 -> report Terminal Unit ID (default), VT400. XTerm + uses zeros for the site code and serial number in its DECRPTUI + response. + +CSI > Ps c + Send Device Attributes (Secondary DA). + Ps = 0 or omitted -> request the terminal's identification + code. The response depends on the decTerminalID resource set- + ting. It should apply only to VT220 and up, but xterm extends + this to VT100. + -> CSI > Pp ; Pv ; Pc c + where Pp denotes the terminal type + Pp = 0 -> "VT100". + Pp = 1 -> "VT220". + Pp = 2 -> "VT240" or "VT241". + Pp = 1 8 -> "VT330". + Pp = 1 9 -> "VT340". + Pp = 2 4 -> "VT320". + Pp = 3 2 -> "VT382". + Pp = 4 1 -> "VT420". + Pp = 6 1 -> "VT510". + Pp = 6 4 -> "VT520". + Pp = 6 5 -> "VT525". + + and Pv is the firmware version (for xterm, this was originally + the XFree86 patch number, starting with 95). In a DEC termi- + nal, Pc indicates the ROM cartridge registration number and is + always zero. + +CSI Ps d Line Position Absolute [row] (default = [1,column]) (VPA). + +CSI Ps e Line Position Relative [rows] (default = [row+1,column]) + (VPR). + +CSI Ps ; Ps f + Horizontal and Vertical Position [row;column] (default = + [1,1]) (HVP). + +CSI Ps g Tab Clear (TBC). + Ps = 0 -> Clear Current Column (default). + Ps = 3 -> Clear All. + +CSI Pm h Set Mode (SM). + Ps = 2 -> Keyboard Action Mode (AM). + Ps = 4 -> Insert Mode (IRM). + Ps = 1 2 -> Send/receive (SRM). + Ps = 2 0 -> Automatic Newline (LNM). + +CSI ? Pm h + DEC Private Mode Set (DECSET). + Ps = 1 -> Application Cursor Keys (DECCKM), VT100. + Ps = 2 -> Designate USASCII for character sets G0-G3 + (DECANM), VT100, and set VT100 mode. + Ps = 3 -> 132 Column Mode (DECCOLM), VT100. + Ps = 4 -> Smooth (Slow) Scroll (DECSCLM), VT100. + Ps = 5 -> Reverse Video (DECSCNM), VT100. + Ps = 6 -> Origin Mode (DECOM), VT100. + Ps = 7 -> Auto-wrap Mode (DECAWM), VT100. + Ps = 8 -> Auto-repeat Keys (DECARM), VT100. + Ps = 9 -> Send Mouse X & Y on button press. See the sec- + tion Mouse Tracking. This is the X10 xterm mouse protocol. + Ps = 1 0 -> Show toolbar (rxvt). + Ps = 1 2 -> Start Blinking Cursor (AT&T 610). + Ps = 1 3 -> Start Blinking Cursor (set only via resource or + menu). + Ps = 1 4 -> Enable XOR of Blinking Cursor control sequence + and menu. + Ps = 1 8 -> Print form feed (DECPFF), VT220. + Ps = 1 9 -> Set print extent to full screen (DECPEX), + VT220. + Ps = 2 5 -> Show Cursor (DECTCEM), VT220. + Ps = 3 0 -> Show scrollbar (rxvt). + Ps = 3 5 -> Enable font-shifting functions (rxvt). + Ps = 3 8 -> Enter Tektronix Mode (DECTEK), VT240, xterm. + Ps = 4 0 -> Allow 80 -> 132 Mode, xterm. + Ps = 4 1 -> more(1) fix (see curses resource). + Ps = 4 2 -> Enable National Replacement Character sets + (DECNRCM), VT220. + Ps = 4 4 -> Turn On Margin Bell, xterm. + Ps = 4 5 -> Reverse-wraparound Mode, xterm. + Ps = 4 6 -> Start Logging, xterm. This is normally dis- + abled by a compile-time option. + Ps = 4 7 -> Use Alternate Screen Buffer, xterm. This may + be disabled by the titeInhibit resource. + Ps = 6 6 -> Application keypad (DECNKM), VT320. + Ps = 6 7 -> Backarrow key sends backspace (DECBKM), VT340, + VT420. This sets the backarrowKey resource to "true". + Ps = 6 9 -> Enable left and right margin mode (DECLRMM), + VT420 and up. + Ps = 8 0 -> Enable Sixel Scrolling (DECSDM). + Ps = 9 5 -> Do not clear screen when DECCOLM is set/reset + (DECNCSM), VT510 and up. + Ps = 1 0 0 0 -> Send Mouse X & Y on button press and + release. See the section Mouse Tracking. This is the X11 + xterm mouse protocol. + Ps = 1 0 0 1 -> Use Hilite Mouse Tracking, xterm. + Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking, xterm. See + the section Button-event tracking. + Ps = 1 0 0 3 -> Use All Motion Mouse Tracking, xterm. See + the section Any-event tracking. + Ps = 1 0 0 4 -> Send FocusIn/FocusOut events, xterm. + Ps = 1 0 0 5 -> Enable UTF-8 Mouse Mode, xterm. + Ps = 1 0 0 6 -> Enable SGR Mouse Mode, xterm. + Ps = 1 0 0 7 -> Enable Alternate Scroll Mode, xterm. This + corresponds to the alternateScroll resource. + Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt). + This sets the scrollTtyOutput resource to "true". + Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt). This + sets the scrollKey resource to "true". + Ps = 1 0 1 5 -> Enable urxvt Mouse Mode. + Ps = 1 0 1 6 -> Enable SGR Mouse PixelMode, xterm. + Ps = 1 0 3 4 -> Interpret "meta" key, xterm. This sets the + eighth bit of keyboard input (and enables the eightBitInput + resource). + Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num- + Lock keys, xterm. This enables the numLock resource. + Ps = 1 0 3 6 -> Send ESC when Meta modifies a key, xterm. + This enables the metaSendsEscape resource. + Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete + key, xterm. + Ps = 1 0 3 9 -> Send ESC when Alt modifies a key, xterm. + This enables the altSendsEscape resource, xterm. + Ps = 1 0 4 0 -> Keep selection even if not highlighted, + xterm. This enables the keepSelection resource. + Ps = 1 0 4 1 -> Use the CLIPBOARD selection, xterm. This + enables the selectToClipboard resource. + Ps = 1 0 4 2 -> Enable Urgency window manager hint when + Control-G is received, xterm. This enables the bellIsUrgent + resource. + Ps = 1 0 4 3 -> Enable raising of the window when Control-G + is received, xterm. This enables the popOnBell resource. + Ps = 1 0 4 4 -> Reuse the most recent data copied to CLIP- + BOARD, xterm. This enables the keepClipboard resource. + Ps = 1 0 4 6 -> Enable switching to/from Alternate Screen + Buffer, xterm. This works for terminfo-based systems, updat- + ing the titeInhibit resource. + Ps = 1 0 4 7 -> Use Alternate Screen Buffer, xterm. This + may be disabled by the titeInhibit resource. + Ps = 1 0 4 8 -> Save cursor as in DECSC, xterm. This may + be disabled by the titeInhibit resource. + Ps = 1 0 4 9 -> Save cursor as in DECSC, xterm. After sav- + ing the cursor, switch to the Alternate Screen Buffer, clear- + ing it first. This may be disabled by the titeInhibit + resource. This control combines the effects of the 1 0 4 7 + and 1 0 4 8 modes. Use this with terminfo-based applications + rather than the 4 7 mode. + Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode, + xterm. + Ps = 1 0 5 1 -> Set Sun function-key mode, xterm. + Ps = 1 0 5 2 -> Set HP function-key mode, xterm. + Ps = 1 0 5 3 -> Set SCO function-key mode, xterm. + Ps = 1 0 6 0 -> Set legacy keyboard emulation, i.e, X11R6, + xterm. + Ps = 1 0 6 1 -> Set VT220 keyboard emulation, xterm. + Ps = 2 0 0 4 -> Set bracketed paste mode, xterm. + +CSI Ps i Media Copy (MC). + Ps = 0 -> Print screen (default). + Ps = 4 -> Turn off printer controller mode. + Ps = 5 -> Turn on printer controller mode. + Ps = 1 0 -> HTML screen dump, xterm. + Ps = 1 1 -> SVG screen dump, xterm. + +CSI ? Ps i + Media Copy (MC), DEC-specific. + Ps = 1 -> Print line containing cursor. + Ps = 4 -> Turn off autoprint mode. + Ps = 5 -> Turn on autoprint mode. + Ps = 1 0 -> Print composed display, ignores DECPEX. + Ps = 1 1 -> Print all pages. + +CSI Pm l Reset Mode (RM). + Ps = 2 -> Keyboard Action Mode (AM). + Ps = 4 -> Replace Mode (IRM). + Ps = 1 2 -> Send/receive (SRM). + Ps = 2 0 -> Normal Linefeed (LNM). + +CSI ? Pm l + DEC Private Mode Reset (DECRST). + Ps = 1 -> Normal Cursor Keys (DECCKM), VT100. + Ps = 2 -> Designate VT52 mode (DECANM), VT100. + Ps = 3 -> 80 Column Mode (DECCOLM), VT100. + Ps = 4 -> Jump (Fast) Scroll (DECSCLM), VT100. + Ps = 5 -> Normal Video (DECSCNM), VT100. + Ps = 6 -> Normal Cursor Mode (DECOM), VT100. + Ps = 7 -> No Auto-wrap Mode (DECAWM), VT100. + Ps = 8 -> No Auto-repeat Keys (DECARM), VT100. + Ps = 9 -> Don't send Mouse X & Y on button press, xterm. + Ps = 1 0 -> Hide toolbar (rxvt). + Ps = 1 2 -> Stop Blinking Cursor (AT&T 610). + Ps = 1 3 -> Disable Blinking Cursor (reset only via + resource or menu). + Ps = 1 4 -> Disable XOR of Blinking Cursor control sequence + and menu. + Ps = 1 8 -> Don't print form feed (DECPFF), VT220. + Ps = 1 9 -> Limit print to scrolling region (DECPEX), + VT220. + Ps = 2 5 -> Hide Cursor (DECTCEM), VT220. + Ps = 3 0 -> Don't show scrollbar (rxvt). + Ps = 3 5 -> Disable font-shifting functions (rxvt). + Ps = 4 0 -> Disallow 80 -> 132 Mode, xterm. + Ps = 4 1 -> No more(1) fix (see curses resource). + Ps = 4 2 -> Disable National Replacement Character sets + (DECNRCM), VT220. + Ps = 4 4 -> Turn Off Margin Bell, xterm. + Ps = 4 5 -> No Reverse-wraparound Mode, xterm. + Ps = 4 6 -> Stop Logging, xterm. This is normally disabled + by a compile-time option. + Ps = 4 7 -> Use Normal Screen Buffer, xterm. + Ps = 6 6 -> Numeric keypad (DECNKM), VT320. + Ps = 6 7 -> Backarrow key sends delete (DECBKM), VT340, + VT420. This sets the backarrowKey resource to "false". + Ps = 6 9 -> Disable left and right margin mode (DECLRMM), + VT420 and up. + Ps = 8 0 -> Disable Sixel Scrolling (DECSDM). + Ps = 9 5 -> Clear screen when DECCOLM is set/reset (DEC- + NCSM), VT510 and up. + Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and + release. See the section Mouse Tracking. + Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking, xterm. + Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking, + xterm. See the section Button-event tracking. + Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking, xterm. + See the section Any-event tracking. + Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events, xterm. + Ps = 1 0 0 5 -> Disable UTF-8 Mouse Mode, xterm. + Ps = 1 0 0 6 -> Disable SGR Mouse Mode, xterm. + Ps = 1 0 0 7 -> Disable Alternate Scroll Mode, xterm. This + corresponds to the alternateScroll resource. + Ps = 1 0 1 0 -> Don't scroll to bottom on tty output + (rxvt). This sets the scrollTtyOutput resource to "false". + Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt). + This sets the scrollKey resource to "false". + Ps = 1 0 1 5 -> Disable urxvt Mouse Mode. + Ps = 1 0 1 6 -> Disable SGR Mouse Pixel-Mode, xterm. + Ps = 1 0 3 4 -> Don't interpret "meta" key, xterm. This + disables the eightBitInput resource. + Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num- + Lock keys, xterm. This disables the numLock resource. + Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key, + xterm. This disables the metaSendsEscape resource. + Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad + Delete key, xterm. + Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key, + xterm. This disables the altSendsEscape resource. + Ps = 1 0 4 0 -> Do not keep selection when not highlighted, + xterm. This disables the keepSelection resource. + Ps = 1 0 4 1 -> Use the PRIMARY selection, xterm. This + disables the selectToClipboard resource. + Ps = 1 0 4 2 -> Disable Urgency window manager hint when + Control-G is received, xterm. This disables the bellIsUrgent + resource. + Ps = 1 0 4 3 -> Disable raising of the window when Control- + G is received, xterm. This disables the popOnBell resource. + Ps = 1 0 4 6 -> Disable switching to/from Alternate Screen + Buffer, xterm. This works for terminfo-based systems, updat- + ing the titeInhibit resource. If currently using the Alter- + nate Screen Buffer, xterm switches to the Normal Screen Buf- + fer. + Ps = 1 0 4 7 -> Use Normal Screen Buffer, xterm. Clear the + screen first if in the Alternate Screen Buffer. This may be + disabled by the titeInhibit resource. + Ps = 1 0 4 8 -> Restore cursor as in DECRC, xterm. This + may be disabled by the titeInhibit resource. + Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor + as in DECRC, xterm. This may be disabled by the titeInhibit + resource. This combines the effects of the 1 0 4 7 and 1 0 4 + 8 modes. Use this with terminfo-based applications rather + than the 4 7 mode. + Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode, + xterm. + Ps = 1 0 5 1 -> Reset Sun function-key mode, xterm. + Ps = 1 0 5 2 -> Reset HP function-key mode, xterm. + Ps = 1 0 5 3 -> Reset SCO function-key mode, xterm. + Ps = 1 0 6 0 -> Reset legacy keyboard emulation, i.e, + X11R6, xterm. + Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style, + xterm. + Ps = 2 0 0 4 -> Reset bracketed paste mode, xterm. + +CSI Pm m Character Attributes (SGR). + Ps = 0 -> Normal (default), VT100. + Ps = 1 -> Bold, VT100. + Ps = 2 -> Faint, decreased intensity, ECMA-48 2nd. + Ps = 3 -> Italicized, ECMA-48 2nd. + Ps = 4 -> Underlined, VT100. + Ps = 5 -> Blink, VT100. + This appears as Bold in X11R6 xterm. + Ps = 7 -> Inverse, VT100. + Ps = 8 -> Invisible, i.e., hidden, ECMA-48 2nd, VT300. + Ps = 9 -> Crossed-out characters, ECMA-48 3rd. + Ps = 2 1 -> Doubly-underlined, ECMA-48 3rd. + Ps = 2 2 -> Normal (neither bold nor faint), ECMA-48 3rd. + Ps = 2 3 -> Not italicized, ECMA-48 3rd. + Ps = 2 4 -> Not underlined, ECMA-48 3rd. + Ps = 2 5 -> Steady (not blinking), ECMA-48 3rd. + Ps = 2 7 -> Positive (not inverse), ECMA-48 3rd. + Ps = 2 8 -> Visible, i.e., not hidden, ECMA-48 3rd, VT300. + Ps = 2 9 -> Not crossed-out, ECMA-48 3rd. + Ps = 3 0 -> Set foreground color to Black. + Ps = 3 1 -> Set foreground color to Red. + Ps = 3 2 -> Set foreground color to Green. + Ps = 3 3 -> Set foreground color to Yellow. + Ps = 3 4 -> Set foreground color to Blue. + Ps = 3 5 -> Set foreground color to Magenta. + Ps = 3 6 -> Set foreground color to Cyan. + Ps = 3 7 -> Set foreground color to White. + Ps = 3 9 -> Set foreground color to default, ECMA-48 3rd. + Ps = 4 0 -> Set background color to Black. + Ps = 4 1 -> Set background color to Red. + Ps = 4 2 -> Set background color to Green. + Ps = 4 3 -> Set background color to Yellow. + Ps = 4 4 -> Set background color to Blue. + Ps = 4 5 -> Set background color to Magenta. + Ps = 4 6 -> Set background color to Cyan. + Ps = 4 7 -> Set background color to White. + Ps = 4 9 -> Set background color to default, ECMA-48 3rd. + + Some of the above note the edition of ECMA-48 which first + describes a feature. In its successive editions from 1979 to + 1991 (2nd 1979, 3rd 1984, 4th 1986, and 5th 1991), ECMA-48 + listed codes through 6 5 (skipping several toward the end of + the range). Most of the ECMA-48 codes not implemented in + xterm were never implemented in a hardware terminal. Several + (such as 3 9 and 4 9 ) are either noted in ECMA-48 as imple- + mentation defined, or described in vague terms. + + The successive editions of ECMA-48 give little attention to + changes from one edition to the next, except to comment on + features which have become obsolete. ECMA-48 1st (1976) is + unavailable; there is no reliable source of information which + states whether "ANSI" color was defined in that edition, or + later (1979). The VT100 (1978) implemented the most commonly + used non-color video attributes which are given in the 2nd + edition. + + While 8-color support is described in ECMA-48 2nd edition, the + VT500 series (introduced in 1993) were the first DEC terminals + implementing "ANSI" color. The DEC terminal's use of color is + known to differ from xterm; useful documentation on this + series became available too late to influence xterm. + + If 16-color support is compiled, the following aixterm con- + trols apply. Assume that xterm's resources are set so that + the ISO color codes are the first 8 of a set of 16. Then the + aixterm colors are the bright versions of the ISO colors: + + Ps = 9 0 -> Set foreground color to Black. + Ps = 9 1 -> Set foreground color to Red. + Ps = 9 2 -> Set foreground color to Green. + Ps = 9 3 -> Set foreground color to Yellow. + Ps = 9 4 -> Set foreground color to Blue. + Ps = 9 5 -> Set foreground color to Magenta. + Ps = 9 6 -> Set foreground color to Cyan. + Ps = 9 7 -> Set foreground color to White. + Ps = 1 0 0 -> Set background color to Black. + Ps = 1 0 1 -> Set background color to Red. + Ps = 1 0 2 -> Set background color to Green. + Ps = 1 0 3 -> Set background color to Yellow. + Ps = 1 0 4 -> Set background color to Blue. + Ps = 1 0 5 -> Set background color to Magenta. + Ps = 1 0 6 -> Set background color to Cyan. + Ps = 1 0 7 -> Set background color to White. + + If xterm is compiled with the 16-color support disabled, it + supports the following, from rxvt: + Ps = 1 0 0 -> Set foreground and background color to + default. + + XTerm maintains a color palette whose entries are identified + by an index beginning with zero. If 88- or 256-color support + is compiled, the following apply: + o All parameters are decimal integers. + o RGB values range from zero (0) to 255. + o The 88- and 256-color support uses subparameters described + in ISO-8613-6 for indexed color. ISO-8613-6 also mentions + direct color, using a similar scheme. xterm supports + that, too. + o xterm allows either colons (standard) or semicolons + (legacy) to separate the subparameters (but after the + first colon, colons must be used). + + The indexed- and direct-color features are summarized in the + FAQ, which explains why semicolon is accepted as a subparame- + ter delimiter: + + Can I set a color by its number? + + + These ISO-8613-6 controls (marked in ECMA-48 5th edition as + "reserved for future standardization") are supported by xterm: + Ps = 3 8 : 2 : Pi : Pr : Pg : Pb -> Set foreground color + using RGB values. If xterm is not compiled with direct-color + support, it uses the closest match in its palette for the + given RGB Pr/Pg/Pb. The color space identifier Pi is ignored. + Ps = 3 8 : 5 : Ps -> Set foreground color to Ps, using + indexed color. + Ps = 4 8 : 2 : Pi : Pr : Pg : Pb -> Set background color + using RGB values. If xterm is not compiled with direct-color + support, it uses the closest match in its palette for the + given RGB Pr/Pg/Pb. The color space identifier Pi is ignored. + Ps = 4 8 : 5 : Ps -> Set background color to Ps, using + indexed color. + + This variation on ISO-8613-6 is supported for compatibility + with KDE konsole: + Ps = 3 8 ; 2 ; Pr ; Pg ; Pb -> Set foreground color using + RGB values. If xterm is not compiled with direct-color sup- + port, it uses the closest match in its palette for the given + RGB Pr/Pg/Pb. + Ps = 4 8 ; 2 ; Pr ; Pg ; Pb -> Set background color using + RGB values. If xterm is not compiled with direct-color sup- + port, it uses the closest match in its palette for the given + RGB Pr/Pg/Pb. + + In each case, if xterm is compiled with direct-color support, + and the resource directColor is true, then rather than choos- + ing the closest match, xterm asks the X server to directly + render a given color. + +CSI > Pp ; Pv m +CSI > Pp m + Set/reset key modifier options (XTMODKEYS), xterm. Set or + reset resource-values used by xterm to decide whether to con- + struct escape sequences holding information about the modi- + fiers pressed with a given key. + + The first parameter Pp identifies the resource to set/reset. + The second parameter Pv is the value to assign to the + resource. + + If the second parameter is omitted, the resource is reset to + its initial value. Values 3 and 5 are reserved for keypad- + keys and string-keys. + + Pp = 0 -> modifyKeyboard. + Pp = 1 -> modifyCursorKeys. + Pp = 2 -> modifyFunctionKeys. + Pp = 4 -> modifyOtherKeys. + + If no parameters are given, all resources are reset to their + initial values. + +CSI Ps n Device Status Report (DSR). + Ps = 5 -> Status Report. + Result ("OK") is CSI 0 n + Ps = 6 -> Report Cursor Position (CPR) [row;column]. + Result is CSI r ; c R + + Note: it is possible for this sequence to be sent by a func- + tion key. For example, with the default keyboard configura- + tion the shifted F1 key may send (with shift-, control-, alt- + modifiers) + + CSI 1 ; 2 R , or + CSI 1 ; 5 R , or + CSI 1 ; 6 R , etc. + + The second parameter encodes the modifiers; values range from + 2 to 16. See the section PC-Style Function Keys for the + codes. The modifyFunctionKeys and modifyKeyboard resources + can change the form of the string sent from the modified F1 + key. + +CSI > Ps n + Disable key modifier options, xterm. These modifiers may be + enabled via the CSI > Pm m sequence. This control sequence + corresponds to a resource value of "-1", which cannot be set + with the other sequence. + + The parameter identifies the resource to be disabled: + + Ps = 0 -> modifyKeyboard. + Ps = 1 -> modifyCursorKeys. + Ps = 2 -> modifyFunctionKeys. + Ps = 4 -> modifyOtherKeys. + + If the parameter is omitted, modifyFunctionKeys is disabled. + When modifyFunctionKeys is disabled, xterm uses the modifier + keys to make an extended sequence of function keys rather than + adding a parameter to each function key to denote the modi- + fiers. + +CSI ? Ps n + Device Status Report (DSR, DEC-specific). + Ps = 6 -> Report Cursor Position (DECXCPR). The response + [row;column] is returned as + CSI ? r ; c R + (assumes the default page, i.e., "1"). + Ps = 1 5 -> Report Printer status. The response is + CSI ? 1 0 n (ready). or + CSI ? 1 1 n (not ready). + Ps = 2 5 -> Report UDK status. The response is + CSI ? 2 0 n (unlocked) + or + CSI ? 2 1 n (locked). + Ps = 2 6 -> Report Keyboard status. The response is + CSI ? 2 7 ; 1 ; 0 ; 0 n (North American). + + The last two parameters apply to VT300 & up (keyboard ready) + and VT400 & up (LK01) respectively. + + Ps = 5 3 -> Report Locator status. The response is CSI ? 5 + 3 n Locator available, if compiled-in, or CSI ? 5 0 n No + Locator, if not. + Ps = 5 5 -> Report Locator status. The response is CSI ? 5 + 3 n Locator available, if compiled-in, or CSI ? 5 0 n No + Locator, if not. + Ps = 5 6 -> Report Locator type. The response is CSI ? 5 7 + ; 1 n Mouse, if compiled-in, or CSI ? 5 7 ; 0 n Cannot iden- + tify, if not. + Ps = 6 2 -> Report macro space (DECMSR). The response is + CSI Pn * { . + Ps = 6 3 -> Report memory checksum (DECCKSR), VT420 and up. + The response is DCS Pt ! ~ x x x x ST . + Pt is the request id (from an optional parameter to the + request). + The x's are hexadecimal digits 0-9 and A-F. + Ps = 7 5 -> Report data integrity. The response is CSI ? 7 + 0 n (ready, no errors). + Ps = 8 5 -> Report multi-session configuration. The + response is CSI ? 8 3 n (not configured for multiple-session + operation). + +CSI > Ps p + Set resource value pointerMode (XTSMPOINTER), xterm. This is + used by xterm to decide whether to hide the pointer cursor as + the user types. + + Valid values for the parameter: + Ps = 0 -> never hide the pointer. + Ps = 1 -> hide if the mouse tracking mode is not enabled. + Ps = 2 -> always hide the pointer, except when leaving the + window. + Ps = 3 -> always hide the pointer, even if leaving/entering + the window. + + If no parameter is given, xterm uses the default, which is 1 . + +CSI ! p Soft terminal reset (DECSTR), VT220 and up. + +CSI Pl ; Pc " p + Set conformance level (DECSCL), VT220 and up. + + The first parameter selects the conformance level. Valid val- + ues are: + Pl = 6 1 -> level 1, e.g., VT100. + Pl = 6 2 -> level 2, e.g., VT200. + Pl = 6 3 -> level 3, e.g., VT300. + Pl = 6 4 -> level 4, e.g., VT400. + Pl = 6 5 -> level 5, e.g., VT500. + + The second parameter selects the C1 control transmission mode. + This is an optional parameter, ignored in conformance level 1. + Valid values are: + Pc = 0 -> 8-bit controls. + Pc = 1 -> 7-bit controls (DEC factory default). + Pc = 2 -> 8-bit controls. + + The 7-bit and 8-bit control modes can also be set by S7C1T and + S8C1T, but DECSCL is preferred. + +CSI Ps $ p + Request ANSI mode (DECRQM). For VT300 and up, reply DECRPM is + CSI Ps; Pm $ y + where Ps is the mode number as in SM/RM, and Pm is the mode + value: + 0 - not recognized + 1 - set + 2 - reset + 3 - permanently set + 4 - permanently reset + +CSI ? Ps $ p + Request DEC private mode (DECRQM). For VT300 and up, reply + DECRPM is + CSI ? Ps; Pm $ y + where Ps is the mode number as in DECSET/DECSET, Pm is the + mode value as in the ANSI DECRQM. + Two private modes are read-only (i.e., 1 3 and 1 4 ), pro- + vided only for reporting their values using this control + sequence. They correspond to the resources cursorBlink and + cursorBlinkXOR. +CSI # p +CSI Pm # p + Push video attributes onto stack (XTPUSHSGR), xterm. This is + an alias for CSI # { , used to work around language limita- + tions of C#. + +CSI > Ps q + Ps = 0 -> Report xterm name and version (XTVERSION). The + response is a DSR sequence identifying the version: DCS > | + text ST + +CSI Ps q Load LEDs (DECLL), VT100. + Ps = 0 -> Clear all LEDS (default). + Ps = 1 -> Light Num Lock. + Ps = 2 -> Light Caps Lock. + Ps = 3 -> Light Scroll Lock. + Ps = 2 1 -> Extinguish Num Lock. + Ps = 2 2 -> Extinguish Caps Lock. + Ps = 2 3 -> Extinguish Scroll Lock. + +CSI Ps SP q + Set cursor style (DECSCUSR), VT520. + Ps = 0 -> blinking block. + Ps = 1 -> blinking block (default). + Ps = 2 -> steady block. + Ps = 3 -> blinking underline. + Ps = 4 -> steady underline. + Ps = 5 -> blinking bar, xterm. + Ps = 6 -> steady bar, xterm. + +CSI Ps " q + Select character protection attribute (DECSCA), VT220. Valid + values for the parameter: + Ps = 0 -> DECSED and DECSEL can erase (default). + Ps = 1 -> DECSED and DECSEL cannot erase. + Ps = 2 -> DECSED and DECSEL can erase. + +CSI # q Pop video attributes from stack (XTPOPSGR), xterm. This is an + alias for CSI # } , used to work around language limitations + of C#. + +CSI Ps ; Ps r + Set Scrolling Region [top;bottom] (default = full size of win- + dow) (DECSTBM), VT100. + +CSI ? Pm r + Restore DEC Private Mode Values (XTRESTORE), xterm. The value + of Ps previously saved is restored. Ps values are the same as + for DECSET. + +CSI Pt ; Pl ; Pb ; Pr ; Ps $ r + Change Attributes in Rectangular Area (DECCARA), VT400 and up. + Pt ; Pl ; Pb ; Pr denotes the rectangle. + Ps denotes the SGR attributes to change: 0, 1, 4, 5, 7. + +CSI s Save cursor, available only when DECLRMM is disabled (SCOSC, + also ANSI.SYS). + +CSI Pl ; Pr s + Set left and right margins (DECSLRM), VT420 and up. This is + available only when DECLRMM is enabled. + +CSI ? Pm s + Save DEC Private Mode Values (XTSAVE), xterm. Ps values are + the same as for DECSET. + +CSI Ps ; Ps ; Ps t + Window manipulation (XTWINOPS), dtterm, extended by xterm. + These controls may be disabled using the allowWindowOps + resource. + + xterm uses Extended Window Manager Hints (EWMH) to maximize + the window. Some window managers have incomplete support for + EWMH. For instance, fvwm, flwm and quartz-wm advertise sup- + port for maximizing windows horizontally or vertically, but in + fact equate those to the maximize operation. + + Valid values for the first (and any additional parameters) + are: + Ps = 1 -> De-iconify window. + Ps = 2 -> Iconify window. + Ps = 3 ; x ; y -> Move window to [x, y]. + Ps = 4 ; height ; width -> Resize the xterm window to + given height and width in pixels. Omitted parameters reuse + the current height or width. Zero parameters use the dis- + play's height or width. + Ps = 5 -> Raise the xterm window to the front of the stack- + ing order. + Ps = 6 -> Lower the xterm window to the bottom of the + stacking order. + Ps = 7 -> Refresh the xterm window. + Ps = 8 ; height ; width -> Resize the text area to given + height and width in characters. Omitted parameters reuse the + current height or width. Zero parameters use the display's + height or width. + Ps = 9 ; 0 -> Restore maximized window. + Ps = 9 ; 1 -> Maximize window (i.e., resize to screen + size). + Ps = 9 ; 2 -> Maximize window vertically. + Ps = 9 ; 3 -> Maximize window horizontally. + Ps = 1 0 ; 0 -> Undo full-screen mode. + Ps = 1 0 ; 1 -> Change to full-screen. + Ps = 1 0 ; 2 -> Toggle full-screen. + Ps = 1 1 -> Report xterm window state. + If the xterm window is non-iconified, it returns CSI 1 t . + If the xterm window is iconified, it returns CSI 2 t . + Ps = 1 3 -> Report xterm window position. + Note: X Toolkit positions can be negative, but the reported + values are unsigned, in the range 0-65535. Negative values + correspond to 32768-65535. + Result is CSI 3 ; x ; y t + Ps = 1 3 ; 2 -> Report xterm text-area position. + Result is CSI 3 ; x ; y t + Ps = 1 4 -> Report xterm text area size in pixels. + Result is CSI 4 ; height ; width t + Ps = 1 4 ; 2 -> Report xterm window size in pixels. + Normally xterm's window is larger than its text area, since it + includes the frame (or decoration) applied by the window man- + ager, as well as the area used by a scroll-bar. + Result is CSI 4 ; height ; width t + Ps = 1 5 -> Report size of the screen in pixels. + Result is CSI 5 ; height ; width t + Ps = 1 6 -> Report xterm character cell size in pixels. + Result is CSI 6 ; height ; width t + Ps = 1 8 -> Report the size of the text area in characters. + Result is CSI 8 ; height ; width t + Ps = 1 9 -> Report the size of the screen in characters. + Result is CSI 9 ; height ; width t + Ps = 2 0 -> Report xterm window's icon label. + Result is OSC L label ST + Ps = 2 1 -> Report xterm window's title. + Result is OSC l label ST + Ps = 2 2 ; 0 -> Save xterm icon and window title on stack. + Ps = 2 2 ; 1 -> Save xterm icon title on stack. + Ps = 2 2 ; 2 -> Save xterm window title on stack. + Ps = 2 3 ; 0 -> Restore xterm icon and window title from + stack. + Ps = 2 3 ; 1 -> Restore xterm icon title from stack. + Ps = 2 3 ; 2 -> Restore xterm window title from stack. + Ps >= 2 4 -> Resize to Ps lines (DECSLPP), VT340 and VT420. + xterm adapts this by resizing its window. + +CSI > Pm t + This xterm control sets one or more features of the title + modes (XTSMTITLE), xterm. Each parameter enables a single + feature. + Ps = 0 -> Set window/icon labels using hexadecimal. + Ps = 1 -> Query window/icon labels using hexadecimal. + Ps = 2 -> Set window/icon labels using UTF-8. + Ps = 3 -> Query window/icon labels using UTF-8. (See dis- + cussion of Title Modes) + +CSI Ps SP t + Set warning-bell volume (DECSWBV), VT520. + Ps = 0 or 1 -> off. + Ps = 2 , 3 or 4 -> low. + Ps = 5 , 6 , 7 , or 8 -> high. + +CSI Pt ; Pl ; Pb ; Pr ; Ps $ t + Reverse Attributes in Rectangular Area (DECRARA), VT400 and + up. + Pt ; Pl ; Pb ; Pr denotes the rectangle. + Ps denotes the attributes to reverse, i.e., 1, 4, 5, 7. + +CSI u Restore cursor (SCORC, also ANSI.SYS). + +CSI Ps SP u + Set margin-bell volume (DECSMBV), VT520. + Ps = 0 , 5 , 6 , 7 , or 8 -> high. + Ps = 1 -> off. + Ps = 2 , 3 or 4 -> low. + +CSI Pt ; Pl ; Pb ; Pr ; Pp ; Pt ; Pl ; Pp $ v + Copy Rectangular Area (DECCRA), VT400 and up. + Pt ; Pl ; Pb ; Pr denotes the rectangle. + Pp denotes the source page. + Pt ; Pl denotes the target location. + Pp denotes the target page. + +CSI Ps $ w + Request presentation state report (DECRQPSR), VT320 and up. + Ps = 0 -> error. + Ps = 1 -> cursor information report (DECCIR). + Response is + DCS 1 $ u Pt ST + Refer to the VT420 programming manual, which requires six + pages to document the data string Pt, + Ps = 2 -> tab stop report (DECTABSR). + Response is + DCS 2 $ u Pt ST + The data string Pt is a list of the tab-stops, separated by + "/" characters. + +CSI Pt ; Pl ; Pb ; Pr ' w + Enable Filter Rectangle (DECEFR), VT420 and up. + Parameters are [top;left;bottom;right]. + Defines the coordinates of a filter rectangle and activates + it. Anytime the locator is detected outside of the filter + rectangle, an outside rectangle event is generated and the + rectangle is disabled. Filter rectangles are always treated + as "one-shot" events. Any parameters that are omitted default + to the current locator position. If all parameters are omit- + ted, any locator motion will be reported. DECELR always can- + cels any previous rectangle definition. + +CSI Ps x Request Terminal Parameters (DECREQTPARM). + if Ps is a "0" (default) or "1", and xterm is emulating VT100, + the control sequence elicits a response of the same form whose + parameters describe the terminal: + Ps -> the given Ps incremented by 2. + Pn = 1 <- no parity. + Pn = 1 <- eight bits. + Pn = 1 <- 2 8 transmit 38.4k baud. + Pn = 1 <- 2 8 receive 38.4k baud. + Pn = 1 <- clock multiplier. + Pn = 0 <- STP flags. + +CSI Ps * x + Select Attribute Change Extent (DECSACE), VT420 and up. + Ps = 0 -> from start to end position, wrapped. + Ps = 1 -> from start to end position, wrapped. + Ps = 2 -> rectangle (exact). + +CSI Pc ; Pt ; Pl ; Pb ; Pr $ x + Fill Rectangular Area (DECFRA), VT420 and up. + Pc is the character to use. + Pt ; Pl ; Pb ; Pr denotes the rectangle. + +CSI Ps # y + Select checksum extension (XTCHECKSUM), xterm. The bits of Ps + modify the calculation of the checksum returned by DECRQCRA: + 0 -> do not negate the result. + 1 -> do not report the VT100 video attributes. + 2 -> do not omit checksum for blanks. + 3 -> omit checksum for cells not explicitly initialized. + 4 -> do not mask cell value to 8 bits or ignore combining + characters. + 5 -> do not mask cell value to 7 bits. + +CSI Pi ; Pg ; Pt ; Pl ; Pb ; Pr * y + Request Checksum of Rectangular Area (DECRQCRA), VT420 and up. + Response is + DCS Pi ! ~ x x x x ST + Pi is the request id. + Pg is the page number. + Pt ; Pl ; Pb ; Pr denotes the rectangle. + The x's are hexadecimal digits 0-9 and A-F. + +CSI Ps ; Pu ' z + Enable Locator Reporting (DECELR). + Valid values for the first parameter: + Ps = 0 -> Locator disabled (default). + Ps = 1 -> Locator enabled. + Ps = 2 -> Locator enabled for one report, then disabled. + The second parameter specifies the coordinate unit for locator + reports. + Valid values for the second parameter: + Pu = 0 or omitted -> default to character cells. + Pu = 1 <- device physical pixels. + Pu = 2 <- character cells. + +CSI Pt ; Pl ; Pb ; Pr $ z + Erase Rectangular Area (DECERA), VT400 and up. + Pt ; Pl ; Pb ; Pr denotes the rectangle. + +CSI Pm ' { + Select Locator Events (DECSLE). + Valid values for the first (and any additional parameters) + are: + Ps = 0 -> only respond to explicit host requests (DECRQLP). + This is default. It also cancels any filter rectangle. + Ps = 1 -> report button down transitions. + Ps = 2 -> do not report button down transitions. + Ps = 3 -> report button up transitions. + Ps = 4 -> do not report button up transitions. + +CSI # { +CSI Pm # { + Push video attributes onto stack (XTPUSHSGR), xterm. The + optional parameters correspond to the SGR encoding for video + attributes, except for colors (which do not have a unique SGR + code): + Ps = 1 -> Bold. + Ps = 2 -> Faint. + Ps = 3 -> Italicized. + Ps = 4 -> Underlined. + Ps = 5 -> Blink. + Ps = 7 -> Inverse. + Ps = 8 -> Invisible. + Ps = 9 -> Crossed-out characters. + Ps = 2 1 -> Doubly-underlined. + Ps = 3 0 -> Foreground color. + Ps = 3 1 -> Background color. + + If no parameters are given, all of the video attributes are + saved. The stack is limited to 10 levels. + +CSI Pt ; Pl ; Pb ; Pr $ { + Selective Erase Rectangular Area (DECSERA), VT400 and up. + Pt ; Pl ; Pb ; Pr denotes the rectangle. + +CSI Pt ; Pl ; Pb ; Pr # | + Report selected graphic rendition (XTREPORTSGR), xterm. The + response is an SGR sequence which contains the attributes + which are common to all cells in a rectangle. + Pt ; Pl ; Pb ; Pr denotes the rectangle. + +CSI Ps $ | + Select columns per page (DECSCPP), VT340. + Ps = 0 -> 80 columns, default if Ps omitted. + Ps = 8 0 -> 80 columns. + Ps = 1 3 2 -> 132 columns. + +CSI Ps ' | + Request Locator Position (DECRQLP). + Valid values for the parameter are: + Ps = 0 , 1 or omitted -> transmit a single DECLRP locator + report. + + If Locator Reporting has been enabled by a DECELR, xterm will + respond with a DECLRP Locator Report. This report is also + generated on button up and down events if they have been + enabled with a DECSLE, or when the locator is detected outside + of a filter rectangle, if filter rectangles have been enabled + with a DECEFR. + + <- CSI Pe ; Pb ; Pr ; Pc ; Pp & w + + Parameters are [event;button;row;column;page]. + Valid values for the event: + Pe = 0 <- locator unavailable - no other parameters sent. + Pe = 1 <- request - xterm received a DECRQLP. + Pe = 2 <- left button down. + Pe = 3 <- left button up. + Pe = 4 <- middle button down. + Pe = 5 <- middle button up. + Pe = 6 <- right button down. + Pe = 7 <- right button up. + Pe = 8 <- M4 button down. + Pe = 9 <- M4 button up. + Pe = 1 0 <- locator outside filter rectangle. + The "button" parameter is a bitmask indicating which buttons + are pressed: + Pb = 0 <- no buttons down. + Pb & 1 <- right button down. + Pb & 2 <- middle button down. + Pb & 4 <- left button down. + Pb & 8 <- M4 button down. + The "row" and "column" parameters are the coordinates of the + locator position in the xterm window, encoded as ASCII deci- + mal. + The "page" parameter is not used by xterm. + +CSI Ps * | + Select number of lines per screen (DECSNLS), VT420 and up. + +CSI # } Pop video attributes from stack (XTPOPSGR), xterm. Popping + restores the video-attributes which were saved using XTPUSHSGR + to their previous state. + +CSI Ps ' } + Insert Ps Column(s) (default = 1) (DECIC), VT420 and up. + +CSI Ps ' ~ + Delete Ps Column(s) (default = 1) (DECDC), VT420 and up. + + +Operating System Commands + +OSC Ps ; Pt BEL + +OSC Ps ; Pt ST + Set Text Parameters. Some control sequences return informa- + tion: + o For colors and font, if Pt is a "?", the control sequence + elicits a response which consists of the control sequence + which would set the corresponding value. + o The dtterm control sequences allow you to determine the + icon name and window title. + + XTerm accepts either BEL or ST for terminating OSC + sequences, and when returning information, uses the same ter- + minator used in a query. While the latter is preferred, the + former is supported for legacy applications: + o Although documented in the changes for X.V10R4 (December + 1986), BEL as a string terminator dates from X11R4 + (December 1989). + o Since XFree86-3.1.2Ee (August 1996), xterm has accepted ST + (the documented string terminator in ECMA-48). + + Ps specifies the type of operation to perform: + Ps = 0 -> Change Icon Name and Window Title to Pt. + Ps = 1 -> Change Icon Name to Pt. + Ps = 2 -> Change Window Title to Pt. + Ps = 3 -> Set X property on top-level window. Pt should be + in the form "prop=value", or just "prop" to delete the prop- + erty. + Ps = 4 ; c ; spec -> Change Color Number c to the color + specified by spec. This can be a name or RGB specification as + per XParseColor. Any number of c/spec pairs may be given. + The color numbers correspond to the ANSI colors 0-7, their + bright versions 8-15, and if supported, the remainder of the + 88-color or 256-color table. + + If a "?" is given rather than a name or RGB specification, + xterm replies with a control sequence of the same form which + can be used to set the corresponding color. Because more than + one pair of color number and specification can be given in one + control sequence, xterm can make more than one reply. + + Ps = 5 ; c ; spec -> Change Special Color Number c to the + color specified by spec. This can be a name or RGB specifica- + tion as per XParseColor. Any number of c/spec pairs may be + given. The special colors can also be set by adding the maxi- + mum number of colors to these codes in an OSC 4 control: + + Pc = 0 <- resource colorBD (BOLD). + Pc = 1 <- resource colorUL (UNDERLINE). + Pc = 2 <- resource colorBL (BLINK). + Pc = 3 <- resource colorRV (REVERSE). + Pc = 4 <- resource colorIT (ITALIC). + + Ps = 6 ; c ; f -> Enable/disable Special Color Number c. + The second parameter tells xterm to enable the corresponding + color mode if nonzero, disable it if zero. OSC 6 is the same + as OSC 1 0 6 . + + The 10 colors (below) which may be set or queried using 1 0 + through 1 9 are denoted dynamic colors, since the correspond- + ing control sequences were the first means for setting xterm's + colors dynamically, i.e., after it was started. They are not + the same as the ANSI colors (however, the dynamic text fore- + ground and background colors are used when ANSI colors are + reset using SGR 3 9 and 4 9 , respectively). These controls + may be disabled using the allowColorOps resource. At least + one parameter is expected for Pt. Each successive parameter + changes the next color in the list. The value of Ps tells the + starting point in the list. The colors are specified by name + or RGB specification as per XParseColor. + + If a "?" is given rather than a name or RGB specification, + xterm replies with a control sequence of the same form which + can be used to set the corresponding dynamic color. Because + more than one pair of color number and specification can be + given in one control sequence, xterm can make more than one + reply. + + Ps = 1 0 -> Change VT100 text foreground color to Pt. + Ps = 1 1 -> Change VT100 text background color to Pt. + Ps = 1 2 -> Change text cursor color to Pt. + Ps = 1 3 -> Change pointer foreground color to Pt. + Ps = 1 4 -> Change pointer background color to Pt. + Ps = 1 5 -> Change Tektronix foreground color to Pt. + Ps = 1 6 -> Change Tektronix background color to Pt. + Ps = 1 7 -> Change highlight background color to Pt. + Ps = 1 8 -> Change Tektronix cursor color to Pt. + Ps = 1 9 -> Change highlight foreground color to Pt. + + Ps = 4 6 -> Change Log File to Pt. This is normally dis- + abled by a compile-time option. + + Ps = 5 0 -> Set Font to Pt. These controls may be disabled + using the allowFontOps resource. If Pt begins with a "#", + index in the font menu, relative (if the next character is a + plus or minus sign) or absolute. A number is expected but not + required after the sign (the default is the current entry for + relative, zero for absolute indexing). + + The same rule (plus or minus sign, optional number) is used + when querying the font. The remainder of Pt is ignored. + + A font can be specified after a "#" index expression, by + adding a space and then the font specifier. + + If the TrueType Fonts menu entry is set (the renderFont + resource), then this control sets/queries the faceName + resource. + + Ps = 5 1 -> reserved for Emacs shell. + + Ps = 5 2 -> Manipulate Selection Data. These controls may + be disabled using the allowWindowOps resource. The parameter + Pt is parsed as + Pc ; Pd + The first, Pc, may contain zero or more characters from the + set c , p , q , s , 0 , 1 , 2 , 3 , 4 , 5 , 6 , and 7 . It is + used to construct a list of selection parameters for clip- + board, primary, secondary, select, or cut buffers 0 through 7 + respectively, in the order given. If the parameter is empty, + xterm uses s 0 , to specify the configurable primary/clipboard + selection and cut buffer 0. + + The second parameter, Pd, gives the selection data. Normally + this is a string encoded in base64 (RFC-4648). The data + becomes the new selection, which is then available for pasting + by other applications. + + If the second parameter is a ? , xterm replies to the host + with the selection data encoded using the same protocol. It + uses the first selection found by asking successively for each + item from the list of selection parameters. + + If the second parameter is neither a base64 string nor ? , + then the selection is cleared. + + Ps = 1 0 4 ; c -> Reset Color Number c. It is reset to the + color specified by the corresponding X resource. Any number + of c parameters may be given. These parameters correspond to + the ANSI colors 0-7, their bright versions 8-15, and if sup- + ported, the remainder of the 88-color or 256-color table. If + no parameters are given, the entire table will be reset. + + Ps = 1 0 5 ; c -> Reset Special Color Number c. It is reset + to the color specified by the corresponding X resource. Any + number of c parameters may be given. These parameters corre- + spond to the special colors which can be set using an OSC 5 + control (or by adding the maximum number of colors using an + OSC 4 control). + + Ps = 1 0 6 ; c ; f -> Enable/disable Special Color Number c. + The second parameter tells xterm to enable the corresponding + color mode if nonzero, disable it if zero. + + Pc = 0 <- resource colorBDMode (BOLD). + Pc = 1 <- resource colorULMode (UNDERLINE). + Pc = 2 <- resource colorBLMode (BLINK). + Pc = 3 <- resource colorRVMode (REVERSE). + Pc = 4 <- resource colorITMode (ITALIC). + Pc = 5 <- resource colorAttrMode (Override ANSI). + + The dynamic colors can also be reset to their default + (resource) values: + Ps = 1 1 0 -> Reset VT100 text foreground color. + Ps = 1 1 1 -> Reset VT100 text background color. + Ps = 1 1 2 -> Reset text cursor color. + Ps = 1 1 3 -> Reset pointer foreground color. + Ps = 1 1 4 -> Reset pointer background color. + Ps = 1 1 5 -> Reset Tektronix foreground color. + Ps = 1 1 6 -> Reset Tektronix background color. + Ps = 1 1 7 -> Reset highlight color. + Ps = 1 1 8 -> Reset Tektronix cursor color. + Ps = 1 1 9 -> Reset highlight foreground color. + + Ps = I ; c -> Set icon to file. Sun shelltool, CDE dtterm. + The file is expected to be XPM format, and uses the same + search logic as the iconHint resource. + + Ps = l ; c -> Set window title. Sun shelltool, CDE dtterm. + + Ps = L ; c -> Set icon label. Sun shelltool, CDE dtterm. + + +Privacy Message + +PM Pt ST xterm implements no PM functions; Pt is ignored. Pt need not + be printable characters. + + +Alt and Meta Keys + +Many keyboards have keys labeled "Alt". Few have keys labeled "Meta". +However, xterm's default translations use the Meta modifier. Common +keyboard configurations assign the Meta modifier to an "Alt" key. By +using xmodmap one may have the modifier assigned to a different key, and +have "real" alt and meta keys. Here is an example: + + ! put meta on mod3 to distinguish it from alt + keycode 64 = Alt_L + clear mod1 + add mod1 = Alt_L + keycode 115 = Meta_L + clear mod3 + add mod3 = Meta_L + + +The metaSendsEscape resource (and altSendsEscape if altIsNotMeta is set) +can be used to control the way the Meta modifier applies to ordinary +keys unless the modifyOtherKeys resource is set: + +o prefix a key with the ESC character. + +o shift the key from codes 0-127 to 128-255 by adding 128. + +When modifyOtherKeys is set, ordinary keys may be sent as escape +sequences: + +o When modifyOtherKeys is set to 1, only the alt- and meta-modifiers + apply. For example, alt-Tab sends CSI 2 7 ; 3 ; 9 ~ (the second + parameter is "3" for alt, and the third parameter is the ASCII value + of tab, "9"). + +o When modifyOtherKeys is set to 2, all of the modifiers apply. For + example, shift-Tab sends CSI 2 7 ; 2 ; 9 ~ rather than CSI Z (the + second parameter is "2" for shift). + +The formatOtherKeys resource tells n to change the format of the escape +sequences sent when modifyOtherKeys applies. When modifyOtherKeys is +set to 1, for example alt-Tab sends CSI 9 ; 3 u (changing the order of +parameters). One drawback to this format is that applications may con- +fuse it with CSI u (restore-cursor). + +The xterm FAQ sections + + How can my program distinguish control-I from tab? + + XTerm - "Other" Modified Keys + +go into greater detail on this topic. + +The table shows the result for a given character "x" with modifiers +according to the default translations with the resources set on or off. +This assumes altIsNotMeta is set: + + ----------------------------------------------------------- + key altSendsEscape metaSendsEscape result + -----------+----------------+-----------------+------------ + x | off | off | x + Meta-x | off | off | shift + Alt-x | off | off | shift + Alt+Meta-x | off | off | shift + x | ON | off | x + Meta-x | ON | off | shift + Alt-x | ON | off | ESC x + Alt+Meta-x | ON | off | ESC shift + x | off | ON | x + Meta-x | off | ON | ESC x + Alt-x | off | ON | shift + Alt+Meta-x | off | ON | ESC shift + x | ON | ON | x + Meta-x | ON | ON | ESC x + Alt-x | ON | ON | ESC x + Alt+Meta-x | ON | ON | ESC x + -----------+----------------+-----------------+------------ + + + +PC-Style Function Keys + +If xterm does minimal translation of the function keys, it usually does +this with a PC-style keyboard, so PC-style function keys result. Sun +keyboards are similar to PC keyboards. Both have cursor and scrolling +operations printed on the keypad, which duplicate the smaller cursor and +scrolling keypads. + +X does not predefine NumLock (used for VT220 keyboards) or Alt (used as +an extension for the Sun/PC keyboards) as modifiers. These keys are +recognized as modifiers when enabled by the numLock resource, or by the +"DECSET 1 0 3 5 " control sequence. + +The cursor keys transmit the following escape sequences depending on the +mode specified via the DECCKM escape sequence. + + Key Normal Application + -------------+----------+------------- + Cursor Up | CSI A | SS3 A + Cursor Down | CSI B | SS3 B + Cursor Right | CSI C | SS3 C + Cursor Left | CSI D | SS3 D + -------------+----------+------------- + +The home- and end-keys (unlike PageUp and other keys also on the 6-key +editing keypad) are considered "cursor keys" by xterm. Their mode is +also controlled by the DECCKM escape sequence: + + Key Normal Application + ---------+----------+------------- + Home | CSI H | SS3 H + End | CSI F | SS3 F + ---------+----------+------------- + + +The application keypad transmits the following escape sequences depend- +ing on the mode specified via the DECKPNM and DECKPAM escape sequences. +Use the NumLock key to override the application mode. + +Not all keys are present on the Sun/PC keypad (e.g., PF1, Tab), but are +supported by the program. + + Key Numeric Application Terminfo Termcap + ---------------+----------+-------------+----------+---------- + Space | SP | SS3 SP | - | - + Tab | TAB | SS3 I | - | - + Enter | CR | SS3 M | kent | @8 + PF1 | SS3 P | SS3 P | kf1 | k1 + PF2 | SS3 Q | SS3 Q | kf2 | k2 + PF3 | SS3 R | SS3 R | kf3 | k3 + PF4 | SS3 S | SS3 S | kf4 | k4 + * (multiply) | * | SS3 j | - | - + + (add) | + | SS3 k | - | - + , (comma) | , | SS3 l | - | - + - (minus) | - | SS3 m | - | - + . (Delete) | . | CSI 3 ~ | - | - + / (divide) | / | SS3 o | - | - + 0 (Insert) | 0 | CSI 2 ~ | - | - + 1 (End) | 1 | SS3 F | kc1 | K4 + 2 (DownArrow) | 2 | CSI B | - | - + 3 (PageDown) | 3 | CSI 6 ~ | kc3 | K5 + 4 (LeftArrow) | 4 | CSI D | - | - + 5 (Begin) | 5 | CSI E | kb2 | K2 + 6 (RightArrow) | 6 | CSI C | - | - + 7 (Home) | 7 | SS3 H | ka1 | K1 + 8 (UpArrow) | 8 | CSI A | - | - + 9 (PageUp) | 9 | CSI 5 ~ | ka3 | K3 + = (equal) | = | SS3 X | - | - + ---------------+----------+-------------+----------+---------- + +They also provide 12 function keys, as well as a few other special-pur- +pose keys: + + Key Escape Sequence + ---------+----------------- + F1 | SS3 P + F2 | SS3 Q + F3 | SS3 R + F4 | SS3 S + F5 | CSI 1 5 ~ + F6 | CSI 1 7 ~ + F7 | CSI 1 8 ~ + F8 | CSI 1 9 ~ + F9 | CSI 2 0 ~ + F10 | CSI 2 1 ~ + F11 | CSI 2 3 ~ + F12 | CSI 2 4 ~ + ---------+----------------- + + +Note that F1 through F4 are prefixed with SS3 , while the other keys are +prefixed with CSI . Older versions of xterm implement different escape +sequences for F1 through F4, with a CSI prefix. These can be activated +by setting the oldXtermFKeys resource. However, since they do not cor- +respond to any hardware terminal, they have been deprecated. (The DEC +VT220 reserves F1 through F5 for local functions such as Setup). + + Key Escape Sequence + ---------+----------------- + F1 | CSI 1 1 ~ + F2 | CSI 1 2 ~ + F3 | CSI 1 3 ~ + F4 | CSI 1 4 ~ + ---------+----------------- + +In normal mode, i.e., a Sun/PC keyboard when the sunKeyboard resource is +false (and none of the other keyboard resources such as oldXtermFKeys +resource is set), xterm encodes function key modifiers as parameters +appended before the final character of the control sequence. As a spe- +cial case, the SS3 sent before F1 through F4 is altered to CSI when +sending a function key modifier as a parameter. + + Code Modifiers + ---------+--------------------------- + 2 | Shift + 3 | Alt + 4 | Shift + Alt + 5 | Control + 6 | Shift + Control + 7 | Alt + Control + 8 | Shift + Alt + Control + 9 | Meta + 10 | Meta + Shift + 11 | Meta + Alt + 12 | Meta + Alt + Shift + 13 | Meta + Ctrl + 14 | Meta + Ctrl + Shift + 15 | Meta + Ctrl + Alt + 16 | Meta + Ctrl + Alt + Shift + ---------+--------------------------- + +For example, shift-F5 would be sent as CSI 1 5 ; 2 ~ + +If the alwaysUseMods resource is set, the Meta modifier also is recog- +nized, making parameters 9 through 16. + +The codes used for the PC-style function keys were inspired by a feature +of the VT510, referred to in its reference manual as DECFNK. In the +DECFNK scheme, codes 2-8 identify modifiers for function-keys and cur- +sor-, editing-keypad keys. Unlike xterm, the VT510 limits the modifiers +which can be used with cursor- and editing-keypad keys. Although the +name "DECFNK" implies that it is a mode, the VT510 manual mentions it +only as a feature, which (like xterm) interacts with the DECUDK feature. +Unlike xterm, VT510/VT520 provide an extension to DECUDK (DECPFK and +DECPAK) which apparently was the reason for the feature in those termi- +nals, i.e., for identifying a programmable key rather than making it +simple for applications to obtain modifier information. It is not +described in the related VT520 manual. Neither manual was readily +available at the time the feature was added to xterm. + +On the other hand, the VT510 and VT520 reference manuals do document a +related feature. That is its emulation of the SCO console, which is +similar to the "xterm-sco" terminal description. The SCO console func- +tion-keys are less useful to applications developers than the approach +used by xterm because + +o the relationship between modifiers and the characters sent by func- + tion-keys is not readily apparent, and + +o the scheme is not extensible, i.e., it is an ad hoc assignment lim- + ited to two modifiers (shift and control). + + +VT220-Style Function Keys + +However, xterm is most useful as a DEC VT102 or VT220 emulator. Set the +sunKeyboard resource to true to force a Sun/PC keyboard to act like a +VT220 keyboard. + +The VT102/VT220 application keypad transmits unique escape sequences in +application mode, which are distinct from the cursor and scrolling key- +pad: + + Key Numeric Application VT100? + -------------+----------+-------------+---------- + Space | SP | SS3 SP | no + Tab | TAB | SS3 I | no + Enter | CR | SS3 M | yes + PF1 | SS3 P | SS3 P | yes + PF2 | SS3 Q | SS3 Q | yes + PF3 | SS3 R | SS3 R | yes + PF4 | SS3 S | SS3 S | yes + * (multiply) | * | SS3 j | no + + (add) | + | SS3 k | no + , (comma) | , | SS3 l | yes + - (minus) | - | SS3 m | yes + . (period) | . | SS3 n | yes + / (divide) | / | SS3 o | no + 0 | 0 | SS3 p | yes + 1 | 1 | SS3 q | yes + 2 | 2 | SS3 r | yes + 3 | 3 | SS3 s | yes + 4 | 4 | SS3 t | yes + 5 | 5 | SS3 u | yes + 6 | 6 | SS3 v | yes + 7 | 7 | SS3 w | yes + 8 | 8 | SS3 x | yes + 9 | 9 | SS3 y | yes + = (equal) | = | SS3 X | no + -------------+----------+-------------+---------- + + +The VT100/VT220 keypad did not have all of those keys. They were imple- +mented in xterm in X11R1 (1987), defining a mapping of all X11 keys +which might be provided on a keypad. For instance, a Sun4/II type-4 +keyboard provided "=" (equal), "/" (divide), and "*" (multiply). + +While the VT420 provided the same keypad, the VT520 used a PC-keyboard. +Because that keyboard's keypad lacks the "," (comma), it was not possi- +ble to use EDT's delete-character function with the keypad. XTerm +solves that problem for the VT220-keyboard configuration by mapping + + Ctrl + to , and + Ctrl - to - + +The VT220 provides a 6-key editing keypad, which is analogous to that on +the PC keyboard. It is not affected by DECCKM or DECKPNM/DECKPAM: + + Key Normal Application + ---------+----------+------------- + Insert | CSI 2 ~ | CSI 2 ~ + Delete | CSI 3 ~ | CSI 3 ~ + Home | CSI 1 ~ | CSI 1 ~ + End | CSI 4 ~ | CSI 4 ~ + PageUp | CSI 5 ~ | CSI 5 ~ + PageDown | CSI 6 ~ | CSI 6 ~ + ---------+----------+------------- + + +The VT220 provides 8 additional function keys. With a Sun/PC keyboard, +access these keys by Control/F1 for F13, etc. + + Key Escape Sequence + ---------+----------------- + F13 | CSI 2 5 ~ + F14 | CSI 2 6 ~ + F15 | CSI 2 8 ~ + F16 | CSI 2 9 ~ + F17 | CSI 3 1 ~ + F18 | CSI 3 2 ~ + F19 | CSI 3 3 ~ + F20 | CSI 3 4 ~ + ---------+----------------- + + + +VT52-Style Function Keys + +A VT52 does not have function keys, but it does have a numeric keypad +and cursor keys. They differ from the other emulations by the prefix. +Also, the cursor keys do not change: + + Key Normal/Application + -------------+-------------------- + Cursor Up | ESC A + Cursor Down | ESC B + Cursor Right | ESC C + Cursor Left | ESC D + -------------+-------------------- + +The keypad is similar: + + Key Numeric Application VT52? + -------------+----------+-------------+---------- + Space | SP | ESC ? SP | no + Tab | TAB | ESC ? I | no + Enter | CR | ESC ? M | no + PF1 | ESC P | ESC P | yes + PF2 | ESC Q | ESC Q | yes + PF3 | ESC R | ESC R | yes + PF4 | ESC S | ESC S | no + * (multiply) | * | ESC ? j | no + + (add) | + | ESC ? k | no + , (comma) | , | ESC ? l | no + - (minus) | - | ESC ? m | no + . (period) | . | ESC ? n | yes + / (divide) | / | ESC ? o | no + 0 | 0 | ESC ? p | yes + 1 | 1 | ESC ? q | yes + 2 | 2 | ESC ? r | yes + 3 | 3 | ESC ? s | yes + 4 | 4 | ESC ? t | yes + 5 | 5 | ESC ? u | yes + 6 | 6 | ESC ? v | yes + 7 | 7 | ESC ? w | yes + 8 | 8 | ESC ? x | yes + 9 | 9 | ESC ? y | yes + = (equal) | = | ESC ? X | no + -------------+----------+-------------+---------- + + + +Sun-Style Function Keys + +The xterm program provides support for Sun keyboards more directly, by a +menu toggle that causes it to send Sun-style function key codes rather +than VT220. Note, however, that the sun and VT100 emulations are not +really compatible. For example, their wrap-margin behavior differs. + +Only function keys are altered; keypad and cursor keys are the same. +The emulation responds identically. See the xterm-sun terminfo entry +for details. + + +HP-Style Function Keys + +Similarly, xterm can be compiled to support HP keyboards. See the +xterm-hp terminfo entry for details. + + +The Alternate Screen Buffer + +XTerm maintains two screen buffers. The Normal Screen Buffer allows you +to scroll back to view saved lines of output up to the maximum set by +the saveLines resource. The Alternate Screen Buffer is exactly as large +as the display, contains no additional saved lines. When the Alternate +Screen Buffer is active, you cannot scroll back to view saved lines. +XTerm provides control sequences and menu entries for switching between +the two. + +Most full-screen applications use terminfo or termcap to obtain strings +used to start/stop full-screen mode, i.e., smcup and rmcup for terminfo, +or the corresponding ti and te for termcap. The titeInhibit resource +removes the ti and te strings from the TERMCAP string which is set in +the environment for some platforms. That is not done when xterm is +built with terminfo libraries because terminfo does not provide the +whole text of the termcap data in one piece. It would not work for ter- +minfo anyway, since terminfo data is not passed in environment vari- +ables; setting an environment variable in this manner would have no +effect on the application's ability to switch between Normal and Alter- +nate Screen buffers. Instead, the newer private mode controls (such as +1 0 4 9 ) for switching between Normal and Alternate Screen buffers sim- +ply disable the switching. They add other features such as clearing the +display for the same reason: to make the details of switching indepen- +dent of the application that requests the switch. + + +Bracketed Paste Mode + +When bracketed paste mode is set, pasted text is bracketed with control +sequences so that the program can differentiate pasted text from typed- +in text. When bracketed paste mode is set, the program will receive: + ESC [ 2 0 0 ~ , +followed by the pasted text, followed by + ESC [ 2 0 1 ~ . + + +Title Modes + +The window- and icon-labels can be set or queried using control +sequences. As a VT220-emulator, xterm "should" limit the character +encoding for the corresponding strings to ISO-8859-1. Indeed, it used +to be the case (and was documented) that window titles had to be +ISO-8859-1. This is no longer the case. However, there are many appli- +cations which still assume that titles are set using ISO-8859-1. So +that is the default behavior. + +If xterm is running with UTF-8 encoding, it is possible to use window- +and icon-labels encoded using UTF-8. That is because the underlying X +libraries (and many, but not all) window managers support this feature. + +The utf8Title X resource setting tells xterm to disable a reconversion +of the title string back to ISO-8859-1, allowing the title strings to be +interpreted as UTF-8. The same feature can be enabled using the title +mode control sequence described in this summary. + +Separate from the ability to set the titles, xterm provides the ability +to query the titles, returning them either in ISO-8859-1 or UTF-8. This +choice is available only while xterm is using UTF-8 encoding. + +Finally, the characters sent to, or returned by a title control are less +constrained than the rest of the control sequences. To make them more +manageable (and constrained), for use in shell scripts, xterm has an +optional feature which decodes the string from hexadecimal (for setting +titles) or for encoding the title into hexadecimal when querying the +value. + + +Mouse Tracking + +The VT widget can be set to send the mouse position and other informa- +tion on button presses. These modes are typically used by editors and +other full-screen applications that want to make use of the mouse. + +There are two sets of mutually exclusive modes: + +o mouse protocol + +o protocol encoding + +The mouse protocols include DEC Locator mode, enabled by the DECELR CSI +Ps ; Ps ' z control sequence, and is not described here (control +sequences are summarized above). The remaining five modes of the mouse +protocols are each enabled (or disabled) by a different parameter in the +"DECSET CSI ? Pm h " or "DECRST CSI ? Pm l " control sequence. + +Manifest constants for the parameter values are defined in xcharmouse.h +as follows: + + #define SET_X10_MOUSE 9 + #define SET_VT200_MOUSE 1000 + #define SET_VT200_HIGHLIGHT_MOUSE 1001 + #define SET_BTN_EVENT_MOUSE 1002 + #define SET_ANY_EVENT_MOUSE 1003 + + #define SET_FOCUS_EVENT_MOUSE 1004 + + #define SET_ALTERNATE_SCROLL 1007 + + #define SET_EXT_MODE_MOUSE 1005 + #define SET_SGR_EXT_MODE_MOUSE 1006 + #define SET_URXVT_EXT_MODE_MOUSE 1015 + #define SET_PIXEL_POSITION_MOUSE 1016 + +The motion reporting modes are strictly xterm extensions, and are not +part of any standard, though they are analogous to the DEC VT200 DECELR +locator reports. + +Normally, parameters (such as pointer position and button number) for +all mouse tracking escape sequences generated by xterm encode numeric +parameters in a single character as value+32. For example, ! specifies +the value 1. The upper left character position on the terminal is +denoted as 1,1. This scheme dates back to X10, though the normal mouse- +tracking (from X11) is more elaborate. + + +X10 compatibility mode + +X10 compatibility mode sends an escape sequence only on button press, +encoding the location and the mouse button pressed. It is enabled by +specifying parameter 9 to DECSET. On button press, xterm sends CSI M +CbCxCy (6 characters). + +o Cb is button-1, where button is 1, 2 or 3. + +o Cx and Cy are the x and y coordinates of the mouse when the button + was pressed. + + +Normal tracking mode + +Normal tracking mode sends an escape sequence on both button press and +release. Modifier key (shift, ctrl, meta) information is also sent. It +is enabled by specifying parameter 1000 to DECSET. On button press or +release, xterm sends CSI M CbCxCy. + +o The low two bits of Cb encode button information: 0=MB1 pressed, + 1=MB2 pressed, 2=MB3 pressed, 3=release. + +o The next three bits encode the modifiers which were down when the + button was pressed and are added together: 4=Shift, 8=Meta, 16=Con- + trol. Note however that the shift and control bits are normally + unavailable because xterm uses the control modifier with mouse for + popup menus, and the shift modifier is used in the default transla- + tions for button events. The Meta modifier recognized by xterm is + the mod1 mask, and is not necessarily the "Meta" key (see + xmodmap(1)). + +o Cx and Cy are the x and y coordinates of the mouse event, encoded as + in X10 mode. + + +Wheel mice + +Wheel mice may return buttons 4 and 5. Those buttons are represented by +the same event codes as buttons 1 and 2 respectively, except that 64 is +added to the event code. Release events for the wheel buttons are not +reported. + +By default, the wheel mouse events (buttons 4 and 5) are translated to +scroll-back and scroll-forw actions, respectively. Those actions nor- +mally scroll the whole window, as if the scrollbar was used. + +However if Alternate Scroll mode is set, then cursor up/down controls +are sent when the terminal is displaying the Alternate Screen Buffer. +The initial state of Alternate Scroll mode is set using the alternate- +Scroll resource. + + +Other buttons + +Some wheel mice can send additional button events, e.g., by tilting the +scroll wheel left and right. + +Additional buttons are encoded like the wheel mice, + +o by adding 64 (for buttons 6 and 7), or + +o by adding 128 (for buttons 8 through 11). + +Past button 11, the encoding is ambiguous because the same code may cor- +respond to different button/modifier combinations. + +It is not possible to use these buttons (6-11) in xterm's translations +resource because their names are not in the X Toolkit's symbol table. +However, applications can check for the reports, e.g., button 7 (left) +and button 6 (right) with a Logitech mouse. + + +Highlight tracking + +Mouse highlight tracking notifies a program of a button press, receives +a range of lines from the program, highlights the region covered by the +mouse within that range until button release, and then sends the program +the release coordinates. It is enabled by specifying parameter 1001 to +DECSET. Highlighting is performed only for button 1, though other but- +ton events can be received. + +Warning: this mode requires a cooperating program, else xterm will hang. + +On button press, the same information as for normal tracking is gener- +ated; xterm then waits for the program to send mouse tracking informa- +tion. All X events are ignored until the proper escape sequence is +received from the pty: +CSI Ps ; Ps ; Ps ; Ps ; Ps T + +The parameters are func, startx, starty, firstrow, and lastrow: + +o func is non-zero to initiate highlight tracking and zero to abort. + +o startx and starty give the starting x and y location for the high- + lighted region. + +o The ending location tracks the mouse, but will never be above row + firstrow and will always be above row lastrow. (The top of the + screen is row 1.) + +When the button is released, xterm reports the ending position one of +two ways: + +o if the start and end coordinates are the same locations: + + CSI t CxCy + +o otherwise: + + CSI T CxCyCxCyCxCy + +The parameters are startx, starty, endx, endy, mousex, and mousey: + +o startx, starty, endx, and endy give the starting and ending charac- + ter positions of the region. + +o mousex and mousey give the location of the mouse at button up, which + may not be over a character. + + +Button-event tracking + +Button-event tracking is essentially the same as normal tracking, but +xterm also reports button-motion events. Motion events are reported +only if the mouse pointer has moved to a different character cell. It +is enabled by specifying parameter 1002 to DECSET. On button press or +release, xterm sends the same codes used by normal tracking mode. + +o On button-motion events, xterm adds 32 to the event code (the third + character, Cb). + +o The other bits of the event code specify button and modifier keys as + in normal mode. For example, motion into cell x,y with button 1 + down is reported as + + CSI M @ CxCy + + ( @ = 32 + 0 (button 1) + 32 (motion indicator) ). Similarly, + motion with button 3 down is reported as + + CSI M B CxCy + + ( B = 32 + 2 (button 3) + 32 (motion indicator) ). + + +Any-event tracking + +Any-event mode is the same as button-event mode, except that all motion +events are reported, even if no mouse button is down. It is enabled by +specifying 1003 to DECSET. + + +FocusIn/FocusOut + +FocusIn/FocusOut can be combined with any of the mouse events since it +uses a different protocol. When set, it causes xterm to send CSI I +when the terminal gains focus, and CSI O when it loses focus. + + +Extended coordinates + +The original X10 mouse protocol limits the Cx and Cy ordinates to 223 +(=255 - 32). XTerm supports more than one scheme for extending this +range, by changing the protocol encoding: + +UTF-8 (1005) + This enables UTF-8 encoding for Cx and Cy under all tracking + modes, expanding the maximum encodable position from 223 to + 2015. For positions less than 95, the resulting output is + identical under both modes. Under extended mouse mode, posi- + tions greater than 95 generate "extra" bytes which will con- + fuse applications which do not treat their input as a UTF-8 + stream. Likewise, Cb will be UTF-8 encoded, to reduce confu- + sion with wheel mouse events. + + Under normal mouse mode, positions outside (160,94) result in + byte pairs which can be interpreted as a single UTF-8 charac- + ter; applications which do treat their input as UTF-8 will + almost certainly be confused unless extended mouse mode is + active. + + This scheme has the drawback that the encoded coordinates will + not pass through luit(1) unchanged, e.g., for locales using + non-UTF-8 encoding. + +SGR (1006) + The normal mouse response is altered to use + + o CSI < followed by semicolon-separated + + o encoded button value, + + o Px and Py ordinates and + + o a final character which is M for button press and m for + button release. + + The encoded button value in this case does not add 32 since + that was useful only in the X10 scheme for ensuring that the + byte containing the button value is a printable code. + + o The modifiers are encoded in the same way. + + o A different final character is used for button release to + resolve the X10 ambiguity regarding which button was + released. + + The highlight tracking responses are also modified to an SGR- + like format, using the same SGR-style scheme and button-encod- + ings. + +URXVT (1015) + The normal mouse response is altered to use + + o CSI followed by semicolon-separated + + o encoded button value, + + o the Px and Py ordinates and final character M . + + This uses the same button encoding as X10, but printing it as + a decimal integer rather than as a single byte. + + However, CSI M can be mistaken for DL (delete lines), while + the highlight tracking CSI T can be mistaken for SD (scroll + down), and the Window manipulation controls. For these rea- + sons, the 1015 control is not recommended; it is not an + improvement over 1006. + +SGR-Pixels (1016) + Use the same mouse response format as the 1006 control, but + report position in pixels rather than character cells. + + +Sixel Graphics + +If xterm is configured as VT240, VT241, VT330, VT340 or VT382 using the +decTerminalID resource, it supports Sixel Graphics controls, a palleted +bitmap graphics system using sets of six vertical pixels as the basic +element. + +CSI Ps c Send Device Attributes (Primary DA), xterm. xterm responds to + Send Device Attributes (Primary DA) with these additional + codes: + Ps = 4 -> Sixel graphics. + +CSI ? Pm h + Set Mode, xterm. xterm has these additional private Set Mode + values: + Ps = 8 0 -> Sixel scrolling. + Ps = 1 0 7 0 -> use private color registers for each + graphic. + Ps = 8 4 5 2 -> Sixel scrolling leaves cursor to right of + graphic. + +DCS Pa ; Pb ; Ph q Ps..Ps ST + Send SIXEL image, DEC graphics terminals, xterm. See: + + VT330/VT340 Programmer Reference Manual Volume 2: + Graphics Programming + Chapter 14 Graphics Programming + + The sixel data device control string has three positional + parameters, following the q with sixel data. + Pa -> pixel aspect ratio + Pb -> background color option + Ph -> horizontal grid size (ignored). + Ps -> sixel data + + +ReGIS Graphics + +If xterm is configured as VT125, VT240, VT241, VT330 or VT340 using the +decTerminalID resource, it supports Remote Graphic Instruction Set, a +graphics description language. + +CSI Ps c Send Device Attributes (Primary DA), DEC graphics terminals, + xterm. xterm responds to Send Device Attributes (Primary DA) + with these additional codes: + Ps = 3 -> ReGIS graphics. + +CSI ? Pm h + Set Mode, xterm. xterm has these additional private Set Mode + values: + Ps = 1 0 7 0 -> use private color registers for each + graphic. + +DCS Pm p Pr..Pr ST + Enter or exit ReGIS, VT300, xterm. See: + + VT330/VT340 Programmer Reference Manual Volume 2: + Graphics Programming + Chapter 1 Introduction to ReGIS + + The ReGIS data device control string has one positional param- + eter with four possible values: + Pm = 0 -> resume command, use fullscreen mode. + Pm = 1 -> start new command, use fullscreen mode. + Pm = 2 -> resume command, use command display mode. + Pm = 3 -> start new command, use command display mode. + + +Tektronix 4014 Mode + +Most of these sequences are standard Tektronix 4014 control sequences. +Graph mode supports the 12-bit addressing of the Tektronix 4014. The +major features missing are the write-through and defocused modes. This +document does not describe the commands used in the various Tektronix +plotting modes but does describe the commands to switch modes. + +Some of the sequences are specific to xterm. The Tektronix emulation +was added in X10R4 (1986). The VT240, introduced two years earlier, +also supported Tektronix 4010/4014. Unlike xterm, the VT240 documenta- +tion implies (there is an obvious error in section 6.9 "Entering and +Exiting 4010/4014 Mode") that exiting back to ANSI mode is done by +resetting private mode 3 8 (DECTEK) rather than ESC ETX . A real Tek- +tronix 4014 would not respond to either. + +BEL Bell (Ctrl-G). + +BS Backspace (Ctrl-H). + +TAB Horizontal Tab (Ctrl-I). + +LF Line Feed or New Line (Ctrl-J). + +VT Cursor up (Ctrl-K). + +FF Form Feed or New Page (Ctrl-L). + +CR Carriage Return (Ctrl-M). + +ESC ETX Switch to VT100 Mode (ESC Ctrl-C). + +ESC ENQ Return Terminal Status (ESC Ctrl-E). + +ESC FF PAGE (Clear Screen) (ESC Ctrl-L). + +ESC SO Begin 4015 APL mode (ESC Ctrl-N). This is ignored by xterm. + +ESC SI End 4015 APL mode (ESC Ctrl-O). This is ignored by xterm. + +ESC ETB COPY (Save Tektronix Codes to file COPYyyyy-mm-dd.hh:mm:ss). + ETB (end transmission block) is the same as Ctrl-W. + +ESC CAN Bypass Condition (ESC Ctrl-X). + +ESC SUB GIN mode (ESC Ctrl-Z). + +ESC FS Special Point Plot Mode (ESC Ctrl-\). + +ESC 8 Select Large Character Set. + +ESC 9 Select #2 Character Set. + +ESC : Select #3 Character Set. + +ESC ; Select Small Character Set. + +OSC Ps ; Pt BEL + Set Text Parameters of VT window. + Ps = 0 -> Change Icon Name and Window Title to Pt. + Ps = 1 -> Change Icon Name to Pt. + Ps = 2 -> Change Window Title to Pt. + Ps = 4 6 -> Change Log File to Pt. This is normally dis- + abled by a compile-time option. + +ESC ` Normal Z Axis and Normal (solid) Vectors. + +ESC a Normal Z Axis and Dotted Line Vectors. + +ESC b Normal Z Axis and Dot-Dashed Vectors. + +ESC c Normal Z Axis and Short-Dashed Vectors. + +ESC d Normal Z Axis and Long-Dashed Vectors. + +ESC h Defocused Z Axis and Normal (solid) Vectors. + +ESC i Defocused Z Axis and Dotted Line Vectors. + +ESC j Defocused Z Axis and Dot-Dashed Vectors. + +ESC k Defocused Z Axis and Short-Dashed Vectors. + +ESC l Defocused Z Axis and Long-Dashed Vectors. + +ESC p Write-Thru Mode and Normal (solid) Vectors. + +ESC q Write-Thru Mode and Dotted Line Vectors. + +ESC r Write-Thru Mode and Dot-Dashed Vectors. + +ESC s Write-Thru Mode and Short-Dashed Vectors. + +ESC t Write-Thru Mode and Long-Dashed Vectors. + +FS Point Plot Mode (Ctrl-\). + +GS Graph Mode (Ctrl-]). + +RS Incremental Plot Mode (Ctrl-^ ). + +US Alpha Mode (Ctrl-_). + + +VT52 Mode + +Parameters for cursor movement are at the end of the ESC Y escape +sequence. Each ordinate is encoded in a single character as value+32. +For example, ! is 1. The screen coordinate system is 0-based. + +ESC < Exit VT52 mode (Enter VT100 mode). + +ESC = Enter alternate keypad mode. + +ESC > Exit alternate keypad mode. + +ESC A Cursor up. + +ESC B Cursor down. + +ESC C Cursor right. + +ESC D Cursor left. + +ESC F Enter graphics mode. + +ESC G Exit graphics mode. + +ESC H Move the cursor to the home position. + +ESC I Reverse line feed. + +ESC J Erase from the cursor to the end of the screen. + +ESC K Erase from the cursor to the end of the line. + +ESC Y Ps Ps + Move the cursor to given row and column. + +ESC Z Identify. + -> ESC / Z ("I am a VT52."). + + +Further reading + + +Technical manuals + +Manuals for hardware terminals are more readily available than simi- +larly-detailed documentation for terminal emulators such as aixterm, +shelltool, dtterm. + +However long, the technical manuals have problems: + +o DEC's manuals did not provide a comprehensive comparison of the fea- + tures in different model. + + Peter Sichel's Host Interface Functions Checklist spreadsheet is + useful for noting which model introduced a given feature (although + there are a few apparent errors such as the DECRQSS feature cited + for VT320 whereas the technical manual omits it). + +o Sometimes the manuals disagree. For example, DEC's standard docu- + ment (DEC STD 070) for terminals says that DECSCL performs a soft + reset (DECSTR), while the VT420 manual says it does a hard reset + (RIS). + +o Sometimes the manuals are simply incorrect. For example, testing a + DEC VT420 in 1996 showed that the documented code for a valid or + invalid response to DECRQSS was reversed. + + The VT420 test results were incorporated into vttest program. At + the time, DEC STD 070 was not available, but it also agrees with + vttest. Later, documentation for the DEC VT525 was shown to have + the same flaw. + +o Not all details are clear even in DEC STD 070 (which is more than + twice the length of the VT520 programmer's reference manual, and + almost three times longer than the VT420 reference manual). How- + ever, as an internal standards document, DEC STD 070 is more likely + to describe the actual behavior of DEC's terminals than the more + polished user's guides. + +That said, here are technical manuals which have been used in developing +xterm. Not all were available initially. In August 1996 for instance, +the technical references were limited to EK-VT220-HR-002 and EK- +VT420-UG.002. Shortly after, Richard Shuford sent a copy of EK-VT3XX- +TP-001. Still later (beginning in 2003), Paul Williams' vt100.net site +provided EK-VT102-UG-003, EK-VT220-RM-002, EK-VT420-RM-002, EK-VT520-RM +A01, EK-VT100-TM-003, and EK-VT102-UG-003. The remaining documents were +found on the bitsavers site. + +o DECscope User's Manual. + Digital Equipment Corporation (EK-VT5X-OP-001 1975). + +o VT100 Series Video Terminal Technical Manual. + Digital Equipment Corporation (EK-VT100-TM-003, July 1982). + +o VT100 User Guide. + Digital Equipment Corporation (EK-VT100-UG-003, June 1981). + +o VT102 User Guide. + Digital Equipment Corporation (EK-VT102-UG-003, February 1982). + +o VT220 Programmer Pocket Guide. + Digital Equipment Corporation (EK-VT220-HR-002, July 1984). + +o VT220 Programmer Reference Manual. + Digital Equipment Corporation (EK-VT220-RM-002, August 1984). + +o VT240 Programmer Reference Manual. + Digital Equipment Corporation (EK-VT240-RM-002, October 1984). + +o VT330/VT340 Programmer Reference Manual + Volume 1: Text Programming. + Digital Equipment Corporation (EK-VT3XX-TP-001, March 1987). + +o VT330/VT340 Programmer Reference Manual + Volume 2: Graphics Programming. + Digital Equipment Corporation (EK-VT3XX-GP-001, March 1987). + +o Installing and Using + The VT420 Video Terminal + (North American Model). + Digital Equipment Corporation (EK-VT420-UG.002, February 1990). + +o VT420 Programmer Reference Manual. + Digital Equipment Corporation (EK-VT420-RM-002, February 1992). + +o VT510 Video Terminal + Programmer Information. + Digital Equipment Corporation (EK-VT510-RM B01, November 1993). + +o VT520/VT525 Video Terminal + Programmer Information. + Digital Equipment Corporation (EK-VT520-RM A01, July 1994). + +o Digital ANSI-Compliant Printing Protocol + Level 2 Programming Reference Manual + Digital Equipment Corporation (EK-PPLV2-PM B01, August 1994). + +o 4014 and 4014-1 Computer Display Terminal + User's Manual. + Tektronix, Inc. (070-1647-00, November 1979). + + +Standards + +The DEC terminal family (VT100 through VT525) is upward-compatible, +using standards plus extensions, e.g., "private modes". Not all com- +monly-used features are standard. For example, scrolling regions are +not found in ECMA-48. + +Again, it is possible to find discrepancies in the standards: + +o The printed ECMA-48 5th edition (1991) and the first PDF produced + for that edition (April 1998) state that SD (scroll down) ends with + 05/14, i.e., ^ , which disagrees with DEC's VT420 hardware implemen- + tation and DEC's manuals which use 05/04 T . (A few other terminals + such as AT&T 5620 and IBM 5151 also used 05/04, but the documenta- + tion and dates are lacking). + + ECMA created a new PDF in April 2003 which changed that detail to + use T , and later in 2008 provided PDFs of the earlier editions + which used T . + +o The VT320, VT420, VT520 manuals claim that DECSCL does a hard reset + (RIS). + + Both the VT220 manual and DEC STD 070 (which documents levels 1-4 in + detail) state that it is a soft reset, e.g., DECSTR. + +Here are the relevant standards: + +o ECMA-35: Character Code Structure and Extension Techniques + (6th Edition, December 1994). + +o ECMA-43: 8-bit Coded Character Set Structure and Rules + (3rd Edition, December 1991). + +o ECMA-48: Control Functions for Coded Character Sets + (5th Edition, June 1991). + +o DEC STD 070 Video Systems Reference Manual. + Digital Equipment Corporation (A-MN-ELSM070-00-0000 Rev H, December + 3, 1991). + + +Miscellaneous + +A few hardware terminals survived into the 1990s only as terminal emula- +tors. Documentation for these and other terminal emulators which have +influenced xterm are generally available only in less-accessible and +less-detailed manual pages. + +o XTerm supports control sequences for manipulating its window which + were implemented by Sun's shelltool program. This was part of Sun- + View (SunOS 3.0, 1986). The change-notes for xterm's resize program + in X10.4 (1986) mention its use of these "Sun tty emulation escape + sequences" for resizing the window. The X10.4 xterm program recog- + nized these sequences for resizing the terminal, except for the + iconify/deiconify pair. SunView also introduced the SIGWINCH sig- + nal, used by the X10.4 xterm and mentioned in its CHANGES file: + + The window size is passed to the operating system via TIOCSWINSZ + (4.3) or TIOCSSIZE (sun). A SIGWINCH signal is sent if the + vtXXX window is resized. + + While support for the Sun control-sequences remained in resize, the + next release of xterm (X11R1 in 1987) omitted the code for inter- + preting them. + + Later, the SunView program was adapted for the OPEN LOOK environment + introduced 1988-1990. + + Still later, in 1995, OPEN LOOK was abandoned in favor of CDE. The + CDE terminal emulator dtterm implemented those controls, with a cou- + ple of additions. + + Starting in July 1996, xterm re-implemented those control sequences + (based on the dtterm manual pages) and further extended the group of + window controls. + + There were two sets of controls (CSI Ps [ ; Pm ; Pm ] t , and OSC Ps + text ST ) implemented by shelltool, documented in appendix E of both + PHIGS Programming Manual (1992), and the unpublished X Window System + User's Guide (OPEN LOOK Edition) (1995). The CDE program kept + those, and added a few new ones. + + Code Sun CDE XTerm Description + ----------------------------------------------------------------- + CSI 1 t yes yes yes de-iconify + CSI 2 t yes yes yes iconify + CSI 3 t yes yes yes move window to pixel-position + CSI 4 t yes yes yes resize window in pixels + CSI 5 t yes yes yes raise window to front of stack + CSI 6 t yes yes yes raise window to back of stack + CSI 7 t yes yes yes refresh window + CSI 8 t yes yes yes resize window in chars + CSI 9 t - - yes maximize/unmaximize window + CSI 1 0 t - - yes to/from full-screen + CSI 1 1 t yes yes yes report if window is iconified + CSI 1 2 t - - - - + CSI 1 3 t yes yes yes report window position + CSI 1 4 t yes yes yes report window size in pixels + CSI 1 5 t - - yes report screen size in pixels + CSI 1 6 t - - yes report character cell in pixels + CSI 1 7 t - - - - + CSI 1 8 t yes yes yes report window size in chars + CSI 1 9 t - - yes report screen size in chars + CSI 2 0 t - yes yes report icon label + CSI 2 1 t - yes yes report window title + CSI 2 2 t - - yes save window/icon title + CSI 2 3 t - - yes restore window/icon title + CSI 2 4 t - - yes resize window (DECSLPP) + OSC 0 ST - yes yes set window and icon title + OSC 1 ST - yes yes set icon label + OSC 2 ST - yes yes set window title + OSC 3 ST - n/a yes set X server property + OSC I ST yes yes yes set icon to file + OSC l ST yes yes yes set window title + OSC L ST yes yes yes set icon label + + Besides the Sun-derived OSC controls for setting window title and + icon label, dtterm also supported the xterm controls for the same + feature. + + The CDE source was unavailable for inspection until 2012, so that + clarification of the details of the window operations relied upon + vttest. + +o The control sequences for saving/restoring the cursor and for sav- + ing/restoring "DEC Private Mode Values" may appear to be related + (since the "save" controls both end with s ), but that is coinciden- + tal. The latter was introduced in X10.4: + + Most Dec Private mode settings can be saved away internally + using \E[?ns, where n is the same number to set or reset the Dec + Private mode. The mode can be restored using \E[?nr. This can + be used in termcap for vi, for example, to turn off saving of + lines, but restore whatever the original state was on exit. + + while the SCOSC/SCORC pair was added in 1995 by XFree86 (and docu- + mented long afterwards). + +o The aixterm manual page gives the format of the control sequence for + foreground and background colors 8-15, but does not specify what + those colors are. That is implied by the description's mention of + HFT: + + The aixterm command provides a standard terminal type for + programs that do not interact directly with Enhanced X-Windows. + This command provides an emulation for a VT102 terminal or a + high function terminal (HFT). The VT102 mode is activated by + the -v flag. + + Unlike xterm, there are no resource names for the 16 colors, leaving + the reader to assume that the mapping is hard-coded. The control + sequences for colors 8-15 are not specified by ECMA-48, but rather + (as done in other instances by xterm) chosen to not conflict with + current or future standards. diff --git a/ports/xterm/xterm-359/cursor.c b/ports/xterm/xterm-359/cursor.c new file mode 100644 index 0000000..6867c0f --- /dev/null +++ b/ports/xterm/xterm-359/cursor.c @@ -0,0 +1,468 @@ +/* $XTermId: cursor.c,v 1.77 2019/07/12 01:11:59 tom Exp $ */ + +/* + * Copyright 2002-2018,2019 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* cursor.c */ + +#include +#include +#include + +#include + +/* + * Moves the cursor to the specified position, checking for bounds. + * (this includes scrolling regions) + * The origin is considered to be 0, 0 for this procedure. + */ +void +CursorSet(TScreen *screen, int row, int col, unsigned flags) +{ + int use_row = row; + int use_col = col; + int max_col = screen->max_col; + int max_row = screen->max_row; + + if (flags & ORIGIN) { + use_col += screen->lft_marg; + max_col = screen->rgt_marg; + } + use_col = (use_col < 0 ? 0 : use_col); + set_cur_col(screen, (use_col <= max_col ? use_col : max_col)); + + if (flags & ORIGIN) { + use_row += screen->top_marg; + max_row = screen->bot_marg; + } + use_row = (use_row < 0 ? 0 : use_row); + set_cur_row(screen, (use_row <= max_row ? use_row : max_row)); + + ResetWrap(screen); + + TRACE(("CursorSet(%d,%d) margins V[%d..%d] H[%d..%d] -> %d,%d %s\n", + row, col, + screen->top_marg, + screen->bot_marg, + screen->lft_marg, + screen->rgt_marg, + screen->cur_row, + screen->cur_col, + ((flags & ORIGIN) ? "origin" : "normal"))); +} + +/* + * moves the cursor left n, no wrap around + */ +void +CursorBack(XtermWidget xw, int n) +{ +#define WRAP_MASK (REVERSEWRAP | WRAPAROUND) + TScreen *screen = TScreenOf(xw); + int rev; + int left = ScrnLeftMargin(xw); + int before = screen->cur_col; + + if ((rev = ((xw->flags & WRAP_MASK) == WRAP_MASK)) != 0 + && screen->do_wrap) { + n--; + } + + /* if the cursor is already before the left-margin, we have to let it go */ + if (before < left) + left = 0; + + if ((screen->cur_col -= n) < left) { + if (rev) { + int in_row = ScrnRightMargin(xw) - left + 1; + int offset = (in_row * screen->cur_row) + screen->cur_col - left; + if ((before == left) && + ScrnIsColInMargins(screen, before) && + ScrnIsRowInMargins(screen, screen->cur_row) && + screen->cur_row == screen->top_marg) { + offset = (screen->bot_marg + 1) * in_row - 1; + } else if (offset < 0) { + int length = in_row * MaxRows(screen); + offset += ((-offset) / length + 1) * length; + } + set_cur_row(screen, (offset / in_row)); + set_cur_col(screen, (offset % in_row) + left); + do_xevents(xw); + } else { + set_cur_col(screen, left); + } + } + ResetWrap(screen); +} + +/* + * moves the cursor forward n, no wraparound + */ +void +CursorForward(XtermWidget xw, int n) +{ + TScreen *screen = TScreenOf(xw); +#if OPT_DEC_CHRSET + LineData *ld = getLineData(screen, screen->cur_row); +#endif + int next = screen->cur_col + n; + int max; + + if (IsLeftRightMode(xw)) { + max = screen->rgt_marg; + if (screen->cur_col > max) + max = screen->max_col; + } else { + max = LineMaxCol(screen, ld); + } + + if (next > max) + next = max; + + set_cur_col(screen, next); + ResetWrap(screen); +} + +/* + * moves the cursor down n, no scrolling. + * Won't pass bottom margin or bottom of screen. + */ +void +CursorDown(TScreen *screen, int n) +{ + int max; + int next = screen->cur_row + n; + + max = (screen->cur_row > screen->bot_marg ? + screen->max_row : screen->bot_marg); + if (next > max) + next = max; + if (next > screen->max_row) + next = screen->max_row; + + set_cur_row(screen, next); + ResetWrap(screen); +} + +/* + * moves the cursor up n, no linestarving. + * Won't pass top margin or top of screen. + */ +void +CursorUp(TScreen *screen, int n) +{ + int min; + int next = screen->cur_row - n; + + min = ((screen->cur_row < screen->top_marg) + ? 0 + : screen->top_marg); + if (next < min) + next = min; + if (next < 0) + next = 0; + + set_cur_row(screen, next); + ResetWrap(screen); +} + +/* + * Moves cursor down amount lines, scrolls if necessary. + * Won't leave scrolling region. No carriage return. + */ +void +xtermIndex(XtermWidget xw, int amount) +{ + TScreen *screen = TScreenOf(xw); + + /* + * indexing when below scrolling region is cursor down. + * if cursor high enough, no scrolling necessary. + */ + if (screen->cur_row > screen->bot_marg + || screen->cur_row + amount <= screen->bot_marg + || (IsLeftRightMode(xw) + && !ScrnIsColInMargins(screen, screen->cur_col))) { + CursorDown(screen, amount); + } else { + int j; + CursorDown(screen, j = screen->bot_marg - screen->cur_row); + xtermScroll(xw, amount - j); + } +} + +/* + * Moves cursor up amount lines, reverse scrolls if necessary. + * Won't leave scrolling region. No carriage return. + */ +void +RevIndex(XtermWidget xw, int amount) +{ + TScreen *screen = TScreenOf(xw); + + /* + * reverse indexing when above scrolling region is cursor up. + * if cursor low enough, no reverse indexing needed + */ + if (screen->cur_row < screen->top_marg + || screen->cur_row - amount >= screen->top_marg + || (IsLeftRightMode(xw) + && !ScrnIsColInMargins(screen, screen->cur_col))) { + CursorUp(screen, amount); + } else { + RevScroll(xw, amount - (screen->cur_row - screen->top_marg)); + CursorUp(screen, screen->cur_row - screen->top_marg); + } +} + +/* + * Moves Cursor To First Column In Line + * (Note: xterm doesn't implement SLH, SLL which would affect use of this) + */ +void +CarriageReturn(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int left = ScrnLeftMargin(xw); + int col; + + if (xw->flags & ORIGIN) { + col = left; + } else if (screen->cur_col >= left) { + col = left; + } else { + /* + * If origin-mode is not active, it is possible to use cursor + * addressing outside the margins. In that case we will go to the + * first column rather than following the margin. + */ + col = 0; + } + + set_cur_col(screen, col); + ResetWrap(screen); + do_xevents(xw); +} + +/* + * When resizing the window, if we're showing the alternate screen, we still + * have to adjust the saved cursor from the normal screen to account for + * shifting of the saved-line region in/out of the viewable window. + */ +void +AdjustSavedCursor(XtermWidget xw, int adjust) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->whichBuf) { + SavedCursor *sc = &screen->sc[0]; + + if (adjust > 0) { + TRACE(("AdjustSavedCursor %d -> %d\n", sc->row, sc->row - adjust)); + sc->row += adjust; + } + } +} + +/* + * Save Cursor and Attributes + */ +void +CursorSave(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + SavedCursor *sc = &screen->sc[screen->whichBuf]; + + sc->saved = True; + sc->row = screen->cur_row; + sc->col = screen->cur_col; + sc->flags = xw->flags; + sc->curgl = screen->curgl; + sc->curgr = screen->curgr; + sc->wrap_flag = screen->do_wrap; +#if OPT_ISO_COLORS + sc->cur_foreground = xw->cur_foreground; + sc->cur_background = xw->cur_background; + sc->sgr_foreground = xw->sgr_foreground; + sc->sgr_38_xcolors = xw->sgr_38_xcolors; +#endif + saveCharsets(screen, sc->gsets); +} + +/* + * We save/restore all visible attributes, plus wrapping, origin mode, and the + * selective erase attribute. + */ +#define DECSC_FLAGS (ATTRIBUTES|ORIGIN|PROTECTED) + +/* + * Restore Cursor and Attributes + */ +void +CursorRestore(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + SavedCursor *sc = &screen->sc[screen->whichBuf]; + + /* Restore the character sets, unless we never did a save-cursor op. + * In that case, we'll reset the character sets. + */ + if (sc->saved) { + restoreCharsets(screen, sc->gsets); + screen->curgl = sc->curgl; + screen->curgr = sc->curgr; + } else { + resetCharsets(screen); + } + + UIntClr(xw->flags, DECSC_FLAGS); + UIntSet(xw->flags, sc->flags & DECSC_FLAGS); + if ((xw->flags & ORIGIN)) { + CursorSet(screen, + sc->row - screen->top_marg, + ((xw->flags & LEFT_RIGHT) + ? sc->col - screen->lft_marg + : sc->col), + xw->flags); + } else { + CursorSet(screen, sc->row, sc->col, xw->flags); + } + screen->do_wrap = sc->wrap_flag; /* after CursorSet/ResetWrap */ + +#if OPT_ISO_COLORS + xw->sgr_foreground = sc->sgr_foreground; + xw->sgr_38_xcolors = sc->sgr_38_xcolors; + SGR_Foreground(xw, (xw->flags & FG_COLOR) ? sc->cur_foreground : -1); + SGR_Background(xw, (xw->flags & BG_COLOR) ? sc->cur_background : -1); +#endif +} + +/* + * Move the cursor to the first column of the n-th next line. + */ +void +CursorNextLine(XtermWidget xw, int count) +{ + TScreen *screen = TScreenOf(xw); + + CursorDown(screen, count < 1 ? 1 : count); + CarriageReturn(xw); + do_xevents(xw); +} + +/* + * Move the cursor to the first column of the n-th previous line. + */ +void +CursorPrevLine(XtermWidget xw, int count) +{ + TScreen *screen = TScreenOf(xw); + + CursorUp(screen, count < 1 ? 1 : count); + CarriageReturn(xw); + do_xevents(xw); +} + +/* + * Return col/row values which can be passed to CursorSet() preserving the + * current col/row, e.g., accounting for DECOM. + */ +int +CursorCol(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int result = screen->cur_col; + if (xw->flags & ORIGIN) { + result -= ScrnLeftMargin(xw); + if (result < 0) + result = 0; + } + return result; +} + +int +CursorRow(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int result = screen->cur_row; + if (xw->flags & ORIGIN) { + result -= screen->top_marg; + if (result < 0) + result = 0; + } + return result; +} + +#if OPT_TRACE +int +set_cur_row(TScreen *screen, int value) +{ + TRACE(("set_cur_row %d vs %d\n", value, screen ? screen->max_row : -1)); + + assert(screen != 0); + assert(value >= 0); + assert(value <= screen->max_row); + screen->cur_row = value; + return value; +} + +int +set_cur_col(TScreen *screen, int value) +{ + TRACE(("set_cur_col %d vs %d\n", value, screen ? screen->max_col : -1)); + + assert(screen != 0); + assert(value >= 0); + assert(value <= screen->max_col); + screen->cur_col = value; + return value; +} +#endif /* OPT_TRACE */ diff --git a/ports/xterm/xterm-359/cursor.o b/ports/xterm/xterm-359/cursor.o new file mode 100644 index 0000000000000000000000000000000000000000..14a4b1b6c336b123eb9a34ee3cdbd7730f946e77 GIT binary patch literal 69824 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∓gI>jp0P>IU{ct?DKB8U)w?+E6G!Y1; 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 #8Z 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 WA20m3=cg6aN@nKN^8f$i=l?%4ZS?H` literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/data.c b/ports/xterm/xterm-359/data.c new file mode 100644 index 0000000..deb8358 --- /dev/null +++ b/ports/xterm/xterm-359/data.c @@ -0,0 +1,128 @@ +/* $XTermId: data.c,v 1.98 2017/12/18 23:38:05 tom Exp $ */ + +/* + * Copyright 2002-2016,2017 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +#include + +Widget toplevel; /* top-most widget in xterm */ + +#if OPT_TEK4014 +Char *Tpushb; +Char *Tpushback; +TekLink *tekRefreshList; +TekWidget tekWidget; +Widget tekshellwidget; +int T_lastx = -1; +int T_lasty = -1; +int Ttoggled = 0; +jmp_buf Tekend; +#endif + +char *ProgramName; + +Arg ourTopLevelShellArgs[] = +{ + {XtNallowShellResize, (XtArgVal) True}, + {XtNinput, (XtArgVal) True}, +}; +Cardinal number_ourTopLevelShellArgs = 2; + +Atom wm_delete_window; /* for ICCCM delete window */ + +Boolean guard_keyboard_type = False; +XTERM_RESOURCE resource; + +PtyData *VTbuffer; + +jmp_buf VTend; + +#ifdef DEBUG +int debug = 0; /* true causes error messages to be displayed */ +#endif /* DEBUG */ + +XtAppContext app_con; +XtermWidget term; /* master data structure for client */ + +int hold_screen; +SIG_ATOMIC_T need_cleanup = False; +SIG_ATOMIC_T caught_intr = False; + +int am_slave = -1; /* set to file-descriptor if we're a slave process */ +int max_plus1; +PtySelect Select_mask; +PtySelect X_mask; +PtySelect pty_mask; +char *ptydev; +char *ttydev; + +#if HANDLE_STRUCT_NOTIFY +int mapstate = -1; +#endif /* HANDLE_STRUCT_NOTIFY */ + +#ifdef HAVE_LIB_XCURSOR +char *xterm_cursor_theme; +#endif + +#if OPT_SESSION_MGT +int ice_fd = -1; +#endif + +#ifdef USE_IGNORE_RC +int ignore_unused; +#endif + +#if OPT_DIRECT_COLOR +CellColor initCColor = +{0, 0}; +#else +CellColor initCColor = 0; +#endif diff --git a/ports/xterm/xterm-359/data.h b/ports/xterm/xterm-359/data.h new file mode 100644 index 0000000..6ff2b38 --- /dev/null +++ b/ports/xterm/xterm-359/data.h @@ -0,0 +1,260 @@ +/* $XTermId: data.h,v 1.138 2019/10/06 20:16:02 tom Exp $ */ + +/* + * Copyright 2002-2018,2019 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +#ifndef included_data_h +#define included_data_h 1 + +#include + +extern Widget toplevel; + +extern XtAppContext app_con; + +#ifdef VMS +/* actually in vms.c */ +extern int tt_width; +extern int tt_length; +extern int tt_changed; +extern int tt_pasting; +extern int tt_new_output; +#define VMS_TERM_BUFFER_SIZE 500 +struct q_head { + int flink; + int blink; +}; +extern struct q_head read_queue; +#endif + +#if OPT_TEK4014 +extern Char *Tpushb; +extern Char *Tpushback; +extern TekLink *tekRefreshList; +extern TekWidget tekWidget; +extern Widget tekshellwidget; +extern int T_lastx; +extern int T_lasty; +extern int Ttoggled; +extern jmp_buf Tekend; +#endif + +extern char *ptydev; +extern char *ttydev; +extern int hold_screen; + +extern PtyData *VTbuffer; +extern int am_slave; +extern int max_plus1; +extern jmp_buf VTend; + +#ifdef DEBUG +extern int debug; +#endif /* DEBUG */ + +extern PtySelect Select_mask; +extern PtySelect X_mask; +extern PtySelect pty_mask; + +extern int ice_fd; + +extern XtermWidget term; + +extern SIG_ATOMIC_T need_cleanup; +extern SIG_ATOMIC_T caught_intr; + +#if defined(HAVE_XKB_BELL_EXT) +#include /* has the prototype */ +#include /* has the XkbBI_xxx definitions */ +#endif + +#ifndef XkbBI_Info +#define XkbBI_Info 0 +#define XkbBI_MinorError 1 +#define XkbBI_MajorError 2 +#define XkbBI_TerminalBell 9 +#define XkbBI_MarginBell 10 +#endif + +extern char *ProgramName; +extern Arg ourTopLevelShellArgs[]; +extern Cardinal number_ourTopLevelShellArgs; +extern Atom wm_delete_window; + +extern CellColor initCColor; + +#if HANDLE_STRUCT_NOTIFY +/* Flag icon name with "*** " on window output when iconified. + * I'd like to do something like reverse video, but I don't + * know how to tell this to window managers in general. + * + * mapstate can be IsUnmapped, !IsUnmapped, or -1; + * -1 means no change; the other two are set by event handlers + * and indicate a new mapstate. !IsMapped is done in the handler. + * we worry about IsUnmapped when output occurs. -IAN! + */ +extern int mapstate; +#endif /* HANDLE_STRUCT_NOTIFY */ + +#ifdef HAVE_LIB_XCURSOR +extern char *xterm_cursor_theme; +#endif + +typedef struct XTERM_RESOURCE { + char *icon_geometry; + char *title; + char *icon_hint; + char *icon_name; + char *term_name; + char *tty_modes; + char *valid_shells; + + int minBufSize; + int maxBufSize; + + Boolean hold_screen; /* true if we keep window open */ + Boolean utmpInhibit; + Boolean utmpDisplayId; + Boolean messages; + + String menuLocale; + String omitTranslation; + + String keyboardType; + +#if OPT_PRINT_ON_EXIT + int printModeNow; + int printModeOnXError; + int printOptsNow; + int printOptsOnXError; + String printFileNow; + String printFileOnXError; +#endif + + Boolean oldKeyboard; /* placeholder for decode_keyboard_type */ +#if OPT_SUNPC_KBD + Boolean sunKeyboard; +#endif +#if OPT_HP_FUNC_KEYS + Boolean hpFunctionKeys; +#endif +#if OPT_SCO_FUNC_KEYS + Boolean scoFunctionKeys; +#endif +#if OPT_SUN_FUNC_KEYS + Boolean sunFunctionKeys; /* %%% should be VT100 widget resource? */ +#endif +#if OPT_TCAP_FKEYS + Boolean termcapKeys; +#endif + +#if OPT_INITIAL_ERASE + Boolean ptyInitialErase; /* if true, use pty's sense of erase char */ + Boolean backarrow_is_erase; /* override backspace/delete */ +#endif + Boolean useInsertMode; +#if OPT_ZICONBEEP + int zIconBeep; /* beep level when output while iconified */ + char *zIconFormat; /* format for icon name */ +#endif +#if OPT_PTY_HANDSHAKE + Boolean wait_for_map; + Boolean wait_for_map0; /* ...initial value of .wait_for_map */ + Boolean ptyHandshake; /* use pty-handshaking */ + Boolean ptySttySize; /* reset TTY size after pty handshake */ +#endif +#if OPT_REPORT_CCLASS + Boolean reportCClass; /* show character-class information */ +#endif +#if OPT_REPORT_COLORS + Boolean reportColors; /* show color information as allocated */ +#endif +#if OPT_REPORT_FONTS + Boolean reportFonts; /* show bitmap-font information as loaded */ +#endif +#if OPT_XRES_QUERY + Boolean reportXRes; /* show vt100 resources after initialization */ +#endif +#if OPT_REPORT_ICONS + Boolean reportIcons; /* show icon information as loaded */ +#endif +#if OPT_SAME_NAME + Boolean sameName; /* Don't change the title or icon name if it is + * the same. This prevents flicker on the + * screen at the cost of an extra request to + * the server. + */ +#endif +#if OPT_SESSION_MGT + Boolean sessionMgt; +#endif +#if OPT_TOOLBAR + Boolean toolBar; +#endif +#if OPT_MAXIMIZE + Boolean maximized; + String fullscreen_s; /* resource for "fullscreen" */ + int fullscreen; /* derived from fullscreen_s */ +#endif +#if USE_DOUBLE_BUFFER + Boolean buffered; + int buffered_fps; +#endif +} XTERM_RESOURCE; + +extern Boolean guard_keyboard_type; +extern XTERM_RESOURCE resource; + +#ifdef USE_IGNORE_RC +extern int ignore_unused; +#endif + +#endif /* included_data_h */ diff --git a/ports/xterm/xterm-359/data.o b/ports/xterm/xterm-359/data.o new file mode 100644 index 0000000000000000000000000000000000000000..2072966908ba80c6cdc6286ad2b0d13bd9b523ba GIT binary patch literal 65344 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 z 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 LPN`@ATmSzL0>&f? literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/df-install b/ports/xterm/xterm-359/df-install new file mode 100644 index 0000000..0ddd965 --- /dev/null +++ b/ports/xterm/xterm-359/df-install @@ -0,0 +1,162 @@ +#!/bin/sh +# $XTermId: df-install.in,v 1.16 2020/08/02 19:47:55 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2011-2018,2020 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Install desktop-files, substituting the category to customize the file +# to the current system's conventions. +# +# Parameters are passed to the desktop-file-install program. The last +# parameter is the name of the ".desktop" file to install. + +failed() { + echo "? $*" >&2 + exit 1 +} + +OPTS= + +if test $# != 0 +then + APP_NAME=$1 + shift 1 +fi + +if test $# != 0 +then + ICON_NAME=$1 + shift 1 +fi + +TOOL=desktop-file-install + +CDPATH=: +export CDPATH + +while test $# != 0 +do + case .$1 in #(vi + *.desktop) #(vi + if test $# = 1 + then + OLD_FILE=$1 + else + OPTS="$OPTS $1" + fi + ;; + .DESTDIR=*) #(vi + if test "$1" != "DESTDIR=" + then + DESTDIR=`echo "$1" | sed -e 's,^DESTDIR=,,'` + fi + ;; + *) + OPTS="$OPTS $1" + ;; + esac + shift 1 +done + +# If DESTDIR is set (either as an environment variable, or command-line +# parameter), attempt to determine the full pathname (needed by the installer) +# to tell it to use the alternate location. Because the installer has no +# useful options for this purpose, we search along the path to find the tool, +# and from that get the prefix, and assume that was the extent of customization +# when the tool was configured/installed. +if test -n "$DESTDIR" +then + if test -d "$DESTDIR" + then + prefix= + + save_IFS="$IFS" + IFS=':' + for P in $PATH + do + test -z "$P" && P=. + if test -f "$P/$TOOL" + then + prefix=`echo "$P" | sed -e 's,/[^/]*$,,'` + break + fi + done + IFS="$save_IFS" + + test -z "$prefix" && failed "could not find $TOOL in PATH" + + TARGET="${DESTDIR}${prefix}/share/applications" + mkdir -p "$TARGET" + + OPTS="$OPTS --dir=${TARGET}" + else + failed "DESTDIR is not a directory: $DESTDIR" + fi +fi + +MY_TEMP=tempdir$$ +rm -rf $MY_TEMP + +if test -z "$OLD_FILE" +then + failed "not found: $OLD_FILE" +elif ! mkdir $MY_TEMP +then + failed "cannot mkdir: $MY_TEMP" +fi + +# The newer dfi whines about deprecation of encoding, but no release provides +# --version or equivalent. really. +if desktop-file-install --help-all >/dev/null 2>&1 +then + NO_ENCODING="#Encoding" +else + NO_ENCODING="Encoding" +fi + +NEW_FILE=`basename "$OLD_FILE"` +sed \ + -e '/^Encoding=/s%Encoding%'"$NO_ENCODING"'%' \ + -e '/^[^#]*Icon=/s%=.*%='"$ICON_NAME"'%' \ + -e '/^[^#]*Category=/s%=.*%=%' \ + -e '/^[^#]*Categories=/s%=.*%=%' \ + -e '/^[^#]/s%xterm%'"$APP_NAME"'%g' \ + -e '/^[^#]/s%XTerm%XTerm%g' \ + "$OLD_FILE" >"$MY_TEMP/$NEW_FILE" +diff -u "$OLD_FILE" "$MY_TEMP/$NEW_FILE" +cd $MY_TEMP || exit 1 + +"$TOOL" $OPTS "$NEW_FILE" + +cd .. +rm -rf $MY_TEMP + +# vi:ts=4 sw=4 diff --git a/ports/xterm/xterm-359/df-install.in b/ports/xterm/xterm-359/df-install.in new file mode 100644 index 0000000..a1d5535 --- /dev/null +++ b/ports/xterm/xterm-359/df-install.in @@ -0,0 +1,162 @@ +#!/bin/sh +# $XTermId: df-install.in,v 1.16 2020/08/02 19:47:55 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2011-2018,2020 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Install desktop-files, substituting the category to customize the file +# to the current system's conventions. +# +# Parameters are passed to the desktop-file-install program. The last +# parameter is the name of the ".desktop" file to install. + +failed() { + echo "? $*" >&2 + exit 1 +} + +OPTS= + +if test $# != 0 +then + APP_NAME=$1 + shift 1 +fi + +if test $# != 0 +then + ICON_NAME=$1 + shift 1 +fi + +TOOL=desktop-file-install + +CDPATH=: +export CDPATH + +while test $# != 0 +do + case .$1 in #(vi + *.desktop) #(vi + if test $# = 1 + then + OLD_FILE=$1 + else + OPTS="$OPTS $1" + fi + ;; + .DESTDIR=*) #(vi + if test "$1" != "DESTDIR=" + then + DESTDIR=`echo "$1" | sed -e 's,^DESTDIR=,,'` + fi + ;; + *) + OPTS="$OPTS $1" + ;; + esac + shift 1 +done + +# If DESTDIR is set (either as an environment variable, or command-line +# parameter), attempt to determine the full pathname (needed by the installer) +# to tell it to use the alternate location. Because the installer has no +# useful options for this purpose, we search along the path to find the tool, +# and from that get the prefix, and assume that was the extent of customization +# when the tool was configured/installed. +if test -n "$DESTDIR" +then + if test -d "$DESTDIR" + then + prefix= + + save_IFS="$IFS" + IFS=':' + for P in $PATH + do + test -z "$P" && P=. + if test -f "$P/$TOOL" + then + prefix=`echo "$P" | sed -e 's,/[^/]*$,,'` + break + fi + done + IFS="$save_IFS" + + test -z "$prefix" && failed "could not find $TOOL in PATH" + + TARGET="${DESTDIR}${prefix}/share/applications" + mkdir -p "$TARGET" + + OPTS="$OPTS --dir=${TARGET}" + else + failed "DESTDIR is not a directory: $DESTDIR" + fi +fi + +MY_TEMP=tempdir$$ +rm -rf $MY_TEMP + +if test -z "$OLD_FILE" +then + failed "not found: $OLD_FILE" +elif ! mkdir $MY_TEMP +then + failed "cannot mkdir: $MY_TEMP" +fi + +# The newer dfi whines about deprecation of encoding, but no release provides +# --version or equivalent. really. +if desktop-file-install --help-all >/dev/null 2>&1 +then + NO_ENCODING="#Encoding" +else + NO_ENCODING="Encoding" +fi + +NEW_FILE=`basename "$OLD_FILE"` +sed \ + -e '/^Encoding=/s%Encoding%'"$NO_ENCODING"'%' \ + -e '/^[^#]*Icon=/s%=.*%='"$ICON_NAME"'%' \ + -e '/^[^#]*Category=/s%=.*%=@DESKTOP_CATEGORY@%' \ + -e '/^[^#]*Categories=/s%=.*%=@DESKTOP_CATEGORY@%' \ + -e '/^[^#]/s%xterm%'"$APP_NAME"'%g' \ + -e '/^[^#]/s%XTerm%@APP_CLASS@%g' \ + "$OLD_FILE" >"$MY_TEMP/$NEW_FILE" +diff -u "$OLD_FILE" "$MY_TEMP/$NEW_FILE" +cd $MY_TEMP || exit 1 + +"$TOOL" $OPTS "$NEW_FILE" + +cd .. +rm -rf $MY_TEMP + +# vi:ts=4 sw=4 diff --git a/ports/xterm/xterm-359/doublechr.c b/ports/xterm/xterm-359/doublechr.c new file mode 100644 index 0000000..ce5a0cd --- /dev/null +++ b/ports/xterm/xterm-359/doublechr.c @@ -0,0 +1,379 @@ +/* $XTermId: doublechr.c,v 1.102 2020/06/02 23:51:56 tom Exp $ */ + +/* + * Copyright 1997-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +#include +#include +#include + +#include + +#define WhichCgsId(flag) (((flag) & BOLD) ? gcCBold : gcCNorm) + +/* + * The first column is all that matters for double-size characters (since the + * controls apply to a whole line). However, it's easier to maintain the + * information for special fonts by writing to all cells. + */ +#if OPT_DEC_CHRSET + +static void +repaint_line(XtermWidget xw, unsigned newChrSet) +{ + TScreen *screen = TScreenOf(xw); + LineData *ld; + int curcol = screen->cur_col; + int currow = screen->cur_row; + int width = MaxCols(screen); + unsigned len = (unsigned) width; + + assert(width > 0); + + /* + * Ignore repetition. + */ + if (!IsLeftRightMode(xw) + && (ld = getLineData(screen, currow)) != 0) { + unsigned oldChrSet = GetLineDblCS(ld); + + if (oldChrSet != newChrSet) { + TRACE(("repaint_line(%2d,%2d) (%s -> %s)\n", currow, screen->cur_col, + visibleDblChrset(oldChrSet), + visibleDblChrset(newChrSet))); + HideCursor(); + + /* If switching from single-width, keep the cursor in the visible part + * of the line. + */ + if (CSET_DOUBLE(newChrSet)) { + width /= 2; + if (curcol > width) + curcol = width; + } + + /* + * ScrnRefresh won't paint blanks for us if we're switching between a + * single-size and double-size font. So we paint our own. + */ + ClearCurBackground(xw, + currow, + 0, + 1, + len, + (unsigned) LineFontWidth(screen, ld)); + + SetLineDblCS(ld, newChrSet); + + set_cur_col(screen, 0); + ScrnUpdate(xw, currow, 0, 1, (int) len, True); + set_cur_col(screen, curcol); + } + } +} +#endif + +/* + * Set the line to double-height characters. The 'top' flag denotes whether + * we'll be using it for the top (true) or bottom (false) of the line. + */ +void +xterm_DECDHL(XtermWidget xw, Bool top) +{ +#if OPT_DEC_CHRSET + repaint_line(xw, (unsigned) (top ? CSET_DHL_TOP : CSET_DHL_BOT)); +#else + (void) xw; + (void) top; +#endif +} + +/* + * Set the line to single-width characters (the normal state). + */ +void +xterm_DECSWL(XtermWidget xw) +{ +#if OPT_DEC_CHRSET + repaint_line(xw, CSET_SWL); +#else + (void) xw; +#endif +} + +/* + * Set the line to double-width characters + */ +void +xterm_DECDWL(XtermWidget xw) +{ +#if OPT_DEC_CHRSET + repaint_line(xw, CSET_DWL); +#else + (void) xw; +#endif +} + +/* + * Reset all lines on the screen to single-width/single-height. + */ +void +xterm_ResetDouble(XtermWidget xw) +{ +#if OPT_DEC_CHRSET + TScreen *screen = TScreenOf(xw); + Boolean changed = False; + unsigned code; + int row; + + for (row = 0; row < screen->max_row; ++row) { + LineData *ld; + + if ((ld = getLineData(screen, ROW2INX(screen, row))) != 0) { + code = GetLineDblCS(ld); + if (code != CSET_SWL) { + SetLineDblCS(ld, CSET_SWL); + changed = True; + } + } + } + if (changed) { + xtermRepaint(xw); + } +#else + (void) xw; +#endif +} + +#if OPT_DEC_CHRSET +static void +discard_font(XtermWidget xw, int n) +{ + TScreen *screen = TScreenOf(xw); + XTermFonts *data = getDoubleFont(screen, n); + + TRACE(("discard_font chrset=%d %s\n", data->chrset, + (data->fn != 0) ? data->fn : "")); + + data->chrset = 0; + data->flags = 0; + if (data->fn != 0) { + free(data->fn); + data->fn = 0; + } + xtermCloseFont(xw, data); + + screen->fonts_used -= 1; + while (n < screen->fonts_used) { + screen->double_fonts[n] = screen->double_fonts[n + 1]; + ++n; + } +} + +/* push back existing fonts and create a new entry */ +static XTermFonts * +pushback_font(XtermWidget xw, XTermFonts * source) +{ + TScreen *screen = TScreenOf(xw); + XTermFonts *data = getDoubleFont(screen, 0); + int n; + + if (screen->fonts_used >= screen->cache_doublesize) { + TRACE(("pushback_font: discard oldest\n")); + discard_font(xw, screen->fonts_used - 1); + } else { + screen->fonts_used += 1; + } + + for (n = screen->fonts_used; n > 0; n--) + data[n] = data[n - 1]; + data[0] = *source; + + TRACE(("pushback_font -> (NEW:%d)\n", screen->fonts_used)); + + return data; +} + +static int +xterm_Double_index(XTermDraw * params) +{ + XTermDraw local = *params; + int n; + int result = -1; + TScreen *screen = TScreenOf(local.xw); + XTermFonts *data = getDoubleFont(screen, 0); + + local.attr_flags &= BOLD; + TRACE(("xterm_Double_index chrset=%#x, flags=%#x\n", local.this_chrset, local.attr_flags)); + + for (n = 0; n < screen->fonts_used; n++) { + if (data[n].chrset == (unsigned) local.this_chrset + && data[n].flags == local.attr_flags) { + if (n != 0) { + XTermFonts save; + TRACE(("...xterm_Double_index -> %d (OLD:%d)\n", n, screen->fonts_used)); + save = data[n]; + while (n > 0) { + data[n] = data[n - 1]; + n--; + } + data[n] = save; + } + result = n; + break; + } + } + + return result; +} + +/* + * Lookup/cache a GC for the double-size character display. We save up to + * NUM_CHRSET values. + */ +GC +xterm_DoubleGC(XTermDraw * params, GC old_gc, int *inxp) +{ + TScreen *screen = TScreenOf(params->xw); + VTwin *cgsWin = WhichVWin(screen); + char *name; + GC result = 0; + + if ((name = xtermSpecialFont(params)) + != 0) { + CgsEnum cgsId = WhichCgsId(params->attr_flags); + Boolean found = False; + XTermFonts *data = 0; + int n; + + if ((n = xterm_Double_index(params)) >= 0) { + data = getDoubleFont(screen, n); + if (data->fn != 0) { + if (!strcmp(data->fn, name) + && data->fs != 0) { + found = True; + free(name); + name = NULL; + } else { + discard_font(params->xw, n); + } + } + } + + if (!found && name != NULL) { + XTermFonts temp; + + TRACE(("xterm_DoubleGC %s %d: %s\n", + (params->attr_flags & BOLD) ? "BOLD" : "NORM", n, name)); + + memset(&temp, 0, sizeof(temp)); + temp.fn = name; + temp.chrset = params->this_chrset; + temp.flags = (params->attr_flags & BOLD); + temp.warn = fwResource; + + if (!xtermOpenFont(params->xw, name, &temp, False)) { + XTermDraw local = *params; + char *nname; + + /* Retry with * in resolutions */ + local.draw_flags |= NORESOLUTION; + nname = xtermSpecialFont(&local); + if (nname != 0) { + found = (Boolean) xtermOpenFont(params->xw, nname, &temp, + False); + free(nname); + } + } else { + found = True; + } + free(name); + + if (found) { + n = 0; + data = pushback_font(params->xw, &temp); + } + + TRACE(("-> %s\n", found ? "OK" : "FAIL")); + } + + if (found) { + setCgsCSet(params->xw, cgsWin, cgsId, params->this_chrset); + setCgsFont(params->xw, cgsWin, cgsId, data); + setCgsFore(params->xw, cgsWin, cgsId, getCgsFore(params->xw, + cgsWin, old_gc)); + setCgsBack(params->xw, cgsWin, cgsId, getCgsBack(params->xw, + cgsWin, old_gc)); + result = getCgsGC(params->xw, cgsWin, cgsId); + *inxp = n; + } else if (params->attr_flags & BOLD) { + UIntClr(params->attr_flags, BOLD); + result = xterm_DoubleGC(params, old_gc, inxp); + } + } + + return result; +} + +#if OPT_RENDERFONT +/* + * Like xterm_DoubleGC(), but returning an Xft font. + */ +XftFont * +xterm_DoubleFT(XTermDraw * params, unsigned chrset, unsigned attr_flags) +{ + XftFont *result; + TScreen *screen = TScreenOf(params->xw); + unsigned num = (chrset & CSET_DWL); + + if ((attr_flags &= BOLD) != 0) + num |= 4; + + if ((result = screen->double_xft_fonts[num]) == 0) { + result = getDoubleXftFont(params, chrset, attr_flags); + screen->double_xft_fonts[num] = result; + } + return result; +} + +void +freeall_DoubleFT(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + unsigned num; + + for (num = 0; num < XtNumber(screen->double_xft_fonts); ++num) { + closeCachedXft(screen, screen->double_xft_fonts[num]); + screen->double_xft_fonts[num] = 0; + } +} +#endif /* OPT_RENDERFONT */ + +#endif /* OPT_DEC_CHRSET */ diff --git a/ports/xterm/xterm-359/doublechr.o b/ports/xterm/xterm-359/doublechr.o new file mode 100644 index 0000000000000000000000000000000000000000..63e3e25732f4d15e69db1b4c42b332709c1044bf GIT binary patch literal 68824 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ν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 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/error.h b/ports/xterm/xterm-359/error.h new file mode 100644 index 0000000..d2aabd7 --- /dev/null +++ b/ports/xterm/xterm-359/error.h @@ -0,0 +1,105 @@ +/* $XTermId: error.h,v 1.26 2012/10/05 00:17:51 tom Exp $ */ + +/* + * Copyright 1997-2011,2012 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* @(#)error.h X10/6.6 11/6/86 */ + +/* main.c */ +#define ERROR_FIONBIO 11 /* main: ioctl() failed on FIONBIO */ +#define ERROR_F_GETFL 12 /* main: ioctl() failed on F_GETFL */ +#define ERROR_F_SETFL 13 /* main: ioctl() failed on F_SETFL */ +#define ERROR_OPDEVTTY 14 /* spawn: open() failed on /dev/tty */ +#define ERROR_TIOCGETP 15 /* spawn: ioctl() failed on TIOCGETP */ +#define ERROR_PTSNAME 17 /* spawn: ptsname() failed */ +#define ERROR_OPPTSNAME 18 /* spawn: open() failed on ptsname */ +#define ERROR_PTEM 19 /* spawn: ioctl() failed on I_PUSH/"ptem" */ +#define ERROR_CONSEM 20 /* spawn: ioctl() failed on I_PUSH/"consem" */ +#define ERROR_LDTERM 21 /* spawn: ioctl() failed on I_PUSH/"ldterm" */ +#define ERROR_TTCOMPAT 22 /* spawn: ioctl() failed on I_PUSH/"ttcompat" */ +#define ERROR_TIOCSETP 23 /* spawn: ioctl() failed on TIOCSETP */ +#define ERROR_TIOCSETC 24 /* spawn: ioctl() failed on TIOCSETC */ +#define ERROR_TIOCSETD 25 /* spawn: ioctl() failed on TIOCSETD */ +#define ERROR_TIOCSLTC 26 /* spawn: ioctl() failed on TIOCSLTC */ +#define ERROR_TIOCLSET 27 /* spawn: ioctl() failed on TIOCLSET */ +#define ERROR_INIGROUPS 28 /* spawn: initgroups() failed */ +#define ERROR_FORK 29 /* spawn: fork() failed */ +#define ERROR_EXEC 30 /* spawn: exec() failed */ +#define ERROR_PTYS 32 /* get_pty: not enough ptys */ +#define ERROR_PTY_EXEC 34 /* waiting for initial map */ +#define ERROR_SETUID 35 /* spawn: setuid() failed */ +#define ERROR_INIT 36 /* spawn: can't initialize window */ +#define ERROR_TIOCKSET 46 /* spawn: ioctl() failed on TIOCKSET */ +#define ERROR_TIOCKSETC 47 /* spawn: ioctl() failed on TIOCKSETC */ +#define ERROR_LUMALLOC 49 /* luit: command-line malloc failed */ + +/* charproc.c */ +#define ERROR_SELECT 50 /* in_put: select() failed */ +#define ERROR_VINIT 54 /* VTInit: can't initialize window */ +#define ERROR_KMMALLOC1 57 /* HandleKeymapChange: malloc failed */ + +/* Tekproc.c */ +#define ERROR_TSELECT 60 /* Tinput: select() failed */ +#define ERROR_TINIT 64 /* TekInit: can't initialize window */ + +/* button.c */ +#define ERROR_BMALLOC2 71 /* SaltTextAway: malloc() failed */ + +/* misc.c */ +#define ERROR_LOGEXEC 80 /* StartLog: exec() failed */ +#define ERROR_XERROR 83 /* xerror: XError event */ +#define ERROR_XIOERROR 84 /* xioerror: X I/O error */ +#define ERROR_ICEERROR 85 /* ice_error: ICE I/O error */ + +/* screen.c */ +#define ERROR_SCALLOC 90 /* Alloc: calloc() failed on base */ +#define ERROR_SCALLOC2 91 /* Alloc: calloc() failed on rows */ +#define ERROR_SAVE_PTR 102 /* ScrnPointers: malloc/realloc() failed */ diff --git a/ports/xterm/xterm-359/fontutils.c b/ports/xterm/xterm-359/fontutils.c new file mode 100644 index 0000000..1d9e1fb --- /dev/null +++ b/ports/xterm/xterm-359/fontutils.c @@ -0,0 +1,5525 @@ +/* $XTermId: fontutils.c,v 1.687 2020/06/26 23:27:42 tom Exp $ */ + +/* + * Copyright 1998-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +/* + * A portion of this module (for FontNameProperties) was adapted from EMU 1.3; + * it constructs font names with specific properties changed, e.g., for bold + * and double-size characters. + */ + +#define RES_OFFSET(field) XtOffsetOf(SubResourceRec, field) + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +#define NoFontWarning(data) (data)->warn = fwAlways + +#define SetFontWidth(screen,dst,src) (dst)->f_width = (src) +#define SetFontHeight(screen,dst,src) (dst)->f_height = dimRound((double)((screen)->scale_height * (float) (src))) + +/* from X11/Xlibint.h - not all vendors install this file */ +#define CI_NONEXISTCHAR(cs) (((cs)->width == 0) && \ + (((cs)->rbearing|(cs)->lbearing| \ + (cs)->ascent|(cs)->descent) == 0)) + +#define CI_GET_CHAR_INFO_1D(fs,col,cs) \ +{ \ + cs = 0; \ + if (col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \ + if (fs->per_char == NULL) { \ + cs = &fs->min_bounds; \ + } else { \ + cs = &fs->per_char[(col - fs->min_char_or_byte2)]; \ + } \ + if (CI_NONEXISTCHAR(cs)) cs = 0; \ + } \ +} + +#define CI_GET_CHAR_INFO_2D(fs,row,col,cs) \ +{ \ + cs = 0; \ + if (row >= fs->min_byte1 && row <= fs->max_byte1 && \ + col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \ + if (fs->per_char == NULL) { \ + cs = &fs->min_bounds; \ + } else { \ + cs = &fs->per_char[((row - fs->min_byte1) * \ + (fs->max_char_or_byte2 - \ + fs->min_char_or_byte2 + 1)) + \ + (col - fs->min_char_or_byte2)]; \ + } \ + if (CI_NONEXISTCHAR(cs)) cs = 0; \ + } \ +} + +#define FREE_FNAME(field) \ + if (fonts == 0 || myfonts.field != fonts->field) { \ + FREE_STRING(myfonts.field); \ + myfonts.field = 0; \ + } + +/* + * A structure to hold the relevant properties from a font + * we need to make a well formed font name for it. + */ +typedef struct { + /* registry, foundry, family */ + const char *beginning; + /* weight */ + const char *weight; + /* slant */ + const char *slant; + /* wideness */ + const char *wideness; + /* add style */ + const char *add_style; + int pixel_size; + const char *point_size; + int res_x; + int res_y; + const char *spacing; + int average_width; + /* charset registry, charset encoding */ + char *end; +} FontNameProperties; + +#if OPT_WIDE_CHARS && (OPT_RENDERFONT || (OPT_TRACE > 1)) +#define MY_UCS(code,high,wide,name) { code, high, wide, #name } +static const struct { + unsigned code, high, wide; + const char *name; +} unicode_boxes[] = { + + MY_UCS(0x2500, 0, 1, box drawings light horizontal), + MY_UCS(0x2502, 1, 0, box drawings light vertical), + MY_UCS(0x250c, 2, 2, box drawings light down and right), + MY_UCS(0x2510, 2, 2, box drawings light down and left), + MY_UCS(0x2514, 2, 2, box drawings light up and right), + MY_UCS(0x2518, 2, 2, box drawings light up and left), + MY_UCS(0x251c, 1, 2, box drawings light vertical and right), + MY_UCS(0x2524, 1, 2, box drawings light vertical and left), + MY_UCS(0x252c, 2, 1, box drawings light down and horizontal), + MY_UCS(0x2534, 2, 1, box drawings light up and horizontal), + MY_UCS(0x253c, 1, 1, box drawings light vertical and horizontal), + { + 0, 0, 0, NULL + } +}; + +#undef MY_UCS +#endif /* OPT_WIDE_CHARS */ + +#if OPT_LOAD_VTFONTS || OPT_WIDE_CHARS +static Boolean merge_sublist(char ***, char **); +#endif + +static void save2FontList(XtermWidget, const char *, XtermFontNames *, + VTFontEnum, const char *, Bool); + +#if OPT_RENDERFONT +static void fillInFaceSize(XtermWidget, int); +#endif + +#if OPT_SHIFT_FONTS +static int lookupOneFontSize(XtermWidget, int); +#endif + +#if OPT_TRACE +static void +set_font_height(TScreen *screen, VTwin *win, int height) +{ + SetFontHeight(screen, win, height); + TRACE(("SetFontHeight %d\n", win->f_height)); +#undef SetFontHeight +#define SetFontHeight(screen, win, height) set_font_height(screen, win, height) +} + +static void +set_font_width(TScreen *screen, VTwin *win, int width) +{ + (void) screen; + SetFontWidth(screen, win, width); + TRACE(("SetFontWidth %d\n", win->f_width)); +#undef SetFontWidth +#define SetFontWidth(screen, win, height) set_font_width(screen, win, height) +} +#endif + +#if OPT_REPORT_FONTS || OPT_WIDE_CHARS +static unsigned +countGlyphs(XFontStruct *fp) +{ + unsigned count = 0; + + if (fp != 0) { + if (fp->min_byte1 == 0 && fp->max_byte1 == 0) { + count = fp->max_char_or_byte2 - fp->min_char_or_byte2 + 1; + } else if (fp->min_char_or_byte2 < 256 + && fp->max_char_or_byte2 < 256) { + unsigned first = (fp->min_byte1 << 8) + fp->min_char_or_byte2; + unsigned last = (fp->max_byte1 << 8) + fp->max_char_or_byte2; + count = last + 1 - first; + } + } + return count; +} +#endif + +#if OPT_WIDE_CHARS +/* + * Verify that the wide-bold font is at least a bold font with roughly as many + * glyphs as the wide font. The counts should be the same, but settle for + * filtering out the worst of the font mismatches. + */ +static Bool +compatibleWideCounts(XFontStruct *wfs, XFontStruct *wbfs) +{ + unsigned count_w = countGlyphs(wfs); + unsigned count_wb = countGlyphs(wbfs); + if (count_w <= 256 || + count_wb <= 256 || + ((count_w / 4) * 3) > count_wb) { + TRACE(("...font server lied (count wide %u vs wide-bold %u)\n", + count_w, count_wb)); + return False; + } + return True; +} +#endif /* OPT_WIDE_CHARS */ + +#if OPT_BOX_CHARS +static void +setupPackedFonts(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Bool value = False; + +#if OPT_RENDERFONT + if (xw->work.render_font == True) { + int e; + + for (e = 0; e < fMAX; ++e) { + XTermXftFonts *data = getMyXftFont(xw, e, screen->menu_font_number); + if (data != 0) { + if (data->map.mixed) { + screen->allow_packing = True; + break; + } + } + } + } +#endif /* OPT_RENDERFONT */ + + value = screen->allow_packing; + + SetItemSensitivity(fontMenuEntries[fontMenu_font_packedfont].widget, value); +} +#endif + +typedef struct _nameList { + struct _nameList *next; + char *name; +} NameList; + +static NameList *derived_fonts; + +static Boolean +is_derived_font_name(const char *name) +{ + Boolean result = False; + NameList *list; + if (!IsEmpty(name)) { + for (list = derived_fonts; list != 0; list = list->next) { + if (!x_strcasecmp(name, list->name)) { + result = True; + break; + } + } + } + return result; +} + +void +xtermDerivedFont(const char *name) +{ + if (!IsEmpty(name) && !is_derived_font_name(name)) { + NameList *list = TypeCalloc(NameList); + list->name = x_strdup(name); + list->next = derived_fonts; + derived_fonts = list; + } +} + +/* + * Returns the fields from start to stop in a dash- separated string. This + * function will modify the source, putting '\0's in the appropriate place and + * moving the beginning forward to after the '\0' + * + * This will NOT work for the last field (but we won't need it). + */ +static char * +n_fields(char **source, int start, int stop) +{ + int i; + char *str, *str1; + + /* + * find the start-1th dash + */ + for (i = start - 1, str = *source; i; i--, str++) { + if ((str = strchr(str, '-')) == 0) + return 0; + } + + /* + * find the stopth dash + */ + for (i = stop - start + 1, str1 = str; i; i--, str1++) { + if ((str1 = strchr(str1, '-')) == 0) + return 0; + } + + /* + * put a \0 at the end of the fields + */ + *(str1 - 1) = '\0'; + + /* + * move source forward + */ + *source = str1; + + return str; +} + +static Boolean +check_fontname(const char *name) +{ + Boolean result = True; + + if (IsEmpty(name)) { + TRACE(("fontname missing\n")); + result = False; + } + return result; +} + +/* + * Gets the font properties from a given font structure. We use the FONT name + * to find them out, since that seems easier. + * + * Returns a pointer to a static FontNameProperties structure + * or NULL on error. + */ +static FontNameProperties * +get_font_name_props(Display *dpy, XFontStruct *fs, char **result) +{ + static FontNameProperties props; + static char *last_name; + + Atom fontatom; + char *name; + char *str; + + if (fs == NULL) + return NULL; + + /* + * first get the full font name + */ + name = 0; + fontatom = XInternAtom(dpy, "FONT", False); + if (fontatom != 0) { + XFontProp *fp; + int i; + + for (i = 0, fp = fs->properties; i < fs->n_properties; i++, fp++) { + if (fp->name == fontatom) { + name = XGetAtomName(dpy, fp->card32); + break; + } + } + } + + if (name == 0) + return 0; + + /* + * XGetAtomName allocates memory - don't leak + */ + if (last_name != 0) + XFree(last_name); + last_name = name; + + if (result != 0) { + if (!check_fontname(name)) + return 0; + if (*result != 0) + free(*result); + *result = x_strdup(name); + } + + /* + * Now split it up into parts and put them in + * their places. Since we are using parts of + * the original string, we must not free the Atom Name + */ + + /* registry, foundry, family */ + if ((props.beginning = n_fields(&name, 1, 3)) == 0) + return 0; + + /* weight is the next */ + if ((props.weight = n_fields(&name, 1, 1)) == 0) + return 0; + + /* slant */ + if ((props.slant = n_fields(&name, 1, 1)) == 0) + return 0; + + /* width */ + if ((props.wideness = n_fields(&name, 1, 1)) == 0) + return 0; + + /* add style */ + if ((props.add_style = n_fields(&name, 1, 1)) == 0) + return 0; + + /* pixel size */ + if ((str = n_fields(&name, 1, 1)) == 0) + return 0; + if ((props.pixel_size = atoi(str)) == 0) + return 0; + + /* point size */ + if ((props.point_size = n_fields(&name, 1, 1)) == 0) + return 0; + + /* res_x */ + if ((str = n_fields(&name, 1, 1)) == 0) + return 0; + if ((props.res_x = atoi(str)) == 0) + return 0; + + /* res_y */ + if ((str = n_fields(&name, 1, 1)) == 0) + return 0; + if ((props.res_y = atoi(str)) == 0) + return 0; + + /* spacing */ + if ((props.spacing = n_fields(&name, 1, 1)) == 0) + return 0; + + /* average width */ + if ((str = n_fields(&name, 1, 1)) == 0) + return 0; + if ((props.average_width = atoi(str)) == 0) + return 0; + + /* the rest: charset registry and charset encoding */ + props.end = name; + + return &props; +} + +#define ALLOCHUNK(n) ((n | 127) + 1) + +static void +alloca_fontname(char **result, size_t next) +{ + size_t last = (*result != 0) ? strlen(*result) : 0; + size_t have = (*result != 0) ? ALLOCHUNK(last) : 0; + size_t want = last + next + 2; + + if (want >= have) { + want = ALLOCHUNK(want); + if (last != 0) { + char *save = *result; + *result = TypeRealloc(char, want, *result); + if (*result == 0) + free(save); + } else { + if ((*result = TypeMallocN(char, want)) != 0) + **result = '\0'; + } + } +} + +static void +append_fontname_str(char **result, const char *value) +{ + if (value == 0) + value = "*"; + alloca_fontname(result, strlen(value)); + if (*result != 0) { + if (**result != '\0') + strcat(*result, "-"); + strcat(*result, value); + } +} + +static void +append_fontname_num(char **result, int value) +{ + if (value < 0) { + append_fontname_str(result, "*"); + } else { + char temp[100]; + sprintf(temp, "%d", value); + append_fontname_str(result, temp); + } +} + +/* + * Take the given font props and try to make a well formed font name specifying + * the same base font and size and everything, but with different weight/width + * according to the parameters. The return value is allocated, should be freed + * by the caller. + */ +static char * +derive_font_name(FontNameProperties *props, + const char *use_weight, + int use_average_width, + const char *use_encoding) +{ + char *result = 0; + + append_fontname_str(&result, props->beginning); + append_fontname_str(&result, use_weight); + append_fontname_str(&result, props->slant); + append_fontname_str(&result, 0); + append_fontname_str(&result, 0); + append_fontname_num(&result, props->pixel_size); + append_fontname_str(&result, props->point_size); + append_fontname_num(&result, props->res_x); + append_fontname_num(&result, props->res_y); + append_fontname_str(&result, props->spacing); + append_fontname_num(&result, use_average_width); + append_fontname_str(&result, use_encoding); + + xtermDerivedFont(result); + return result; +} + +static char * +bold_font_name(FontNameProperties *props, int use_average_width) +{ + return derive_font_name(props, "bold", use_average_width, props->end); +} + +#if OPT_WIDE_ATTRS +static char * +italic_font_name(FontNameProperties *props, const char *slant) +{ + FontNameProperties myprops = *props; + myprops.slant = slant; + return derive_font_name(&myprops, props->weight, myprops.average_width, props->end); +} + +static Boolean +open_italic_font(XtermWidget xw, int n, FontNameProperties *fp, XTermFonts * data) +{ + static const char *slant[] = + { + "o", + "i" + }; + Cardinal pass; + Boolean result = False; + + NoFontWarning(data); + for (pass = 0; pass < XtNumber(slant); ++pass) { + char *name; + if ((name = italic_font_name(fp, slant[pass])) != 0) { + TRACE(("open_italic_font %s %s\n", + whichFontEnum((VTFontEnum) n), name)); + if (xtermOpenFont(xw, name, data, False)) { + result = (data->fs != 0); +#if OPT_REPORT_FONTS + if (resource.reportFonts) { + printf("opened italic version of %s:\n\t%s\n", + whichFontEnum((VTFontEnum) n), + name); + } +#endif + } + free(name); + if (result) + break; + } + } +#if OPT_TRACE + if (result) { + XFontStruct *fs = data->fs; + if (fs != 0) { + TRACE(("...actual size %dx%d (ascent %d, descent %d)\n", + fs->ascent + + fs->descent, + fs->max_bounds.width, + fs->ascent, + fs->descent)); + } + } +#endif + return result; +} +#endif + +#if OPT_WIDE_CHARS +#define derive_wide_font(props, weight) \ + derive_font_name(props, weight, props->average_width * 2, "ISO10646-1") + +static char * +wide_font_name(FontNameProperties *props) +{ + return derive_wide_font(props, "medium"); +} + +static char * +widebold_font_name(FontNameProperties *props) +{ + return derive_wide_font(props, "bold"); +} +#endif /* OPT_WIDE_CHARS */ + +#if OPT_DEC_CHRSET +/* + * Take the given font props and try to make a well formed font name specifying + * the same base font but changed depending on the given attributes and chrset. + * + * For double width fonts, we just double the X-resolution, for double height + * fonts we double the pixel-size and Y-resolution + */ +char * +xtermSpecialFont(XTermDraw * params) +{ + TScreen *screen = TScreenOf(params->xw); +#if OPT_TRACE + static char old_spacing[80]; + static FontNameProperties old_props; +#endif + FontNameProperties *props; + char *result = 0; + const char *weight; + int pixel_size; + int res_x; + int res_y; + + props = get_font_name_props(screen->display, + GetNormalFont(screen, fNorm)->fs, 0); + if (props == 0) + return result; + + pixel_size = props->pixel_size; + res_x = props->res_x; + res_y = props->res_y; + if (params->attr_flags & BOLD) + weight = "bold"; + else + weight = props->weight; + + if (CSET_DOUBLE(params->this_chrset)) + res_x *= 2; + + if (params->this_chrset == CSET_DHL_TOP + || params->this_chrset == CSET_DHL_BOT) { + res_y *= 2; + pixel_size *= 2; + } +#if OPT_TRACE + if (old_props.res_x != res_x + || old_props.res_x != res_y + || old_props.pixel_size != pixel_size + || strcmp(old_props.spacing, props->spacing)) { + TRACE(("xtermSpecialFont(atts = %#x, draw = %#x, chrset = %#x)\n", + params->attr_flags, params->draw_flags, params->this_chrset)); + TRACE(("res_x = %d\n", res_x)); + TRACE(("res_y = %d\n", res_y)); + TRACE(("point_size = %s\n", props->point_size)); + TRACE(("pixel_size = %d\n", pixel_size)); + TRACE(("spacing = %s\n", props->spacing)); + old_props.res_x = res_x; + old_props.res_y = res_y; + old_props.pixel_size = pixel_size; + old_props.spacing = old_spacing; + sprintf(old_spacing, "%.*s", (int) sizeof(old_spacing) - 2, props->spacing); + } +#endif + + append_fontname_str(&result, props->beginning); + append_fontname_str(&result, weight); + append_fontname_str(&result, props->slant); + append_fontname_str(&result, props->wideness); + append_fontname_str(&result, props->add_style); + append_fontname_num(&result, pixel_size); + append_fontname_str(&result, props->point_size); + append_fontname_num(&result, (params->draw_flags & NORESOLUTION) ? -1 : res_x); + append_fontname_num(&result, (params->draw_flags & NORESOLUTION) ? -1 : res_y); + append_fontname_str(&result, props->spacing); + append_fontname_str(&result, 0); + append_fontname_str(&result, props->end); + + xtermDerivedFont(result); + return result; +} +#endif /* OPT_DEC_CHRSET */ + +/* + * Case-independent comparison for font-names, including wildcards. + * XLFD allows '?' as a wildcard, but we do not handle that (no one seems + * to use it). + */ +static Bool +same_font_name(const char *pattern, const char *match) +{ + Bool result = False; + + if (pattern && match) { + while (*pattern && *match) { + if (*pattern == *match) { + pattern++; + match++; + } else if (*pattern == '*' || *match == '*') { + if (same_font_name(pattern + 1, match)) { + return True; + } else if (same_font_name(pattern, match + 1)) { + return True; + } else { + return False; + } + } else { + int p = x_toupper(*pattern++); + int m = x_toupper(*match++); + if (p != m) + return False; + } + } + result = (*pattern == *match); /* both should be NUL */ + } + return result; +} + +/* + * Double-check the fontname that we asked for versus what the font server + * actually gave us. The larger fixed fonts do not always have a matching bold + * font, and the font server may try to scale another font or otherwise + * substitute a mismatched font. + * + * If we cannot get what we requested, we will fallback to the original + * behavior, which simulates bold by overstriking each character at one pixel + * offset. + */ +static int +got_bold_font(Display *dpy, XFontStruct *fs, String requested) +{ + char *actual = 0; + int got; + + if (get_font_name_props(dpy, fs, &actual) == 0) + got = 0; + else + got = same_font_name(requested, actual); + free(actual); + return got; +} + +/* + * Check normal/bold (or wide/wide-bold) font pairs to see if we will be able + * to check for missing glyphs in a comparable manner. + */ +static int +comparable_metrics(XFontStruct *normal, XFontStruct *bold) +{ +#define DATA "comparable_metrics: " + int result = 0; + + if (normal == 0 || bold == 0) { + ; + } else if (normal->all_chars_exist) { + if (bold->all_chars_exist) { + result = 1; + } else { + TRACE((DATA "all chars exist in normal font, but not in bold\n")); + } + } else if (normal->per_char != 0) { + if (bold->per_char != 0) { + result = 1; + } else { + TRACE((DATA "normal font has per-char metrics, but not bold\n")); + } + } else { + TRACE((DATA "normal font is not very good!\n")); + result = 1; /* give in (we're not going in reverse) */ + } + return result; +#undef DATA +} + +/* + * If the font server tries to adjust another font, it may not adjust it + * properly. Check that the bounding boxes are compatible. Otherwise we'll + * leave trash on the display when we mix normal and bold fonts. + */ +static int +same_font_size(XtermWidget xw, XFontStruct *nfs, XFontStruct *bfs) +{ + TScreen *screen = TScreenOf(xw); + int result = 0; + + if (nfs != 0 && bfs != 0) { + TRACE(("same_font_size height %d/%d, min %d/%d max %d/%d\n", + nfs->ascent + nfs->descent, + bfs->ascent + bfs->descent, + nfs->min_bounds.width, bfs->min_bounds.width, + nfs->max_bounds.width, bfs->max_bounds.width)); + result = screen->free_bold_box + || ((nfs->ascent + nfs->descent) == (bfs->ascent + bfs->descent) + && (nfs->min_bounds.width == bfs->min_bounds.width + || nfs->min_bounds.width == bfs->min_bounds.width + 1) + && (nfs->max_bounds.width == bfs->max_bounds.width + || nfs->max_bounds.width == bfs->max_bounds.width + 1)); + } + return result; +} + +/* + * Check if the font looks like it has fixed width + */ +static int +is_fixed_font(XFontStruct *fs) +{ + if (fs) + return (fs->min_bounds.width == fs->max_bounds.width); + return 1; +} + +static int +differing_widths(XFontStruct *a, XFontStruct *b) +{ + int result = 0; + if (a != NULL && b != NULL && a->max_bounds.width != b->max_bounds.width) + result = 1; + return result; +} + +/* + * Check if the font looks like a double width font (i.e. contains + * characters of width X and 2X + */ +#if OPT_WIDE_CHARS +static int +is_double_width_font(XFontStruct *fs) +{ + return (fs != NULL && ((2 * fs->min_bounds.width) == fs->max_bounds.width)); +} +#else +#define is_double_width_font(fs) 0 +#endif + +#if OPT_WIDE_CHARS && OPT_RENDERFONT && defined(HAVE_TYPE_FCCHAR32) +#define HALF_WIDTH_TEST_STRING "1234567890" + +/* '1234567890' in Chinese characters in UTF-8 */ +#define FULL_WIDTH_TEST_STRING "\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89" \ + "\xe5\x9b\x9b\xe4\xba\x94" \ + "\xef\xa7\x91\xe4\xb8\x83\xe5\x85\xab" \ + "\xe4\xb9\x9d\xef\xa6\xb2" + +/* '1234567890' in Korean script in UTF-8 */ +#define FULL_WIDTH_TEST_STRING2 "\xec\x9d\xbc\xec\x9d\xb4\xec\x82\xbc" \ + "\xec\x82\xac\xec\x98\xa4" \ + "\xec\x9c\xa1\xec\xb9\xa0\xed\x8c\x94" \ + "\xea\xb5\xac\xec\x98\x81" + +#define HALF_WIDTH_CHAR1 0x0031 /* '1' */ +#define HALF_WIDTH_CHAR2 0x0057 /* 'W' */ +#define FULL_WIDTH_CHAR1 0x4E00 /* CJK Ideograph 'number one' */ +#define FULL_WIDTH_CHAR2 0xAC00 /* Korean script syllable 'Ka' */ + +static Bool +is_double_width_font_xft(Display *dpy, XftFont *font) +{ + XGlyphInfo gi1, gi2; + FcChar32 c1 = HALF_WIDTH_CHAR1, c2 = HALF_WIDTH_CHAR2; + String fwstr = FULL_WIDTH_TEST_STRING; + String hwstr = HALF_WIDTH_TEST_STRING; + + /* Some Korean fonts don't have Chinese characters at all. */ + if (!XftCharExists(dpy, font, FULL_WIDTH_CHAR1)) { + if (!XftCharExists(dpy, font, FULL_WIDTH_CHAR2)) + return False; /* Not a CJK font */ + else /* a Korean font without CJK Ideographs */ + fwstr = FULL_WIDTH_TEST_STRING2; + } + + XftTextExtents32(dpy, font, &c1, 1, &gi1); + XftTextExtents32(dpy, font, &c2, 1, &gi2); + if (gi1.xOff != gi2.xOff) /* Not a fixed-width font */ + return False; + + XftTextExtentsUtf8(dpy, + font, + (_Xconst FcChar8 *) hwstr, + (int) strlen(hwstr), + &gi1); + XftTextExtentsUtf8(dpy, + font, + (_Xconst FcChar8 *) fwstr, + (int) strlen(fwstr), + &gi2); + + /* + * fontconfig and Xft prior to 2.2(?) set the width of half-width + * characters identical to that of full-width character in CJK double-width + * (bi-width / monospace) font even though the former is half as wide as + * the latter. This was fixed sometime before the release of fontconfig + * 2.2 in early 2003. See + * http://bugzilla.mozilla.org/show_bug.cgi?id=196312 + * In the meantime, we have to check both possibilities. + */ + return ((2 * gi1.xOff == gi2.xOff) || (gi1.xOff == gi2.xOff)); +} +#else +#define is_double_width_font_xft(dpy, xftfont) 0 +#endif + +#define EmptyFont(fs) (fs != 0 \ + && ((fs)->ascent + (fs)->descent == 0 \ + || (fs)->max_bounds.width == 0)) + +#define FontSize(fs) (((fs)->ascent + (fs)->descent) \ + * (fs)->max_bounds.width) + +const VTFontNames * +xtermFontName(const char *normal) +{ + static VTFontNames data; + FREE_STRING(data.f_n); + memset(&data, 0, sizeof(data)); + if (normal) + data.f_n = x_strdup(normal); + return &data; +} + +const VTFontNames * +defaultVTFontNames(XtermWidget xw) +{ + static VTFontNames data; + memset(&data, 0, sizeof(data)); + data.f_n = DefaultFontN(xw); + data.f_b = DefaultFontB(xw); +#if OPT_WIDE_CHARS + data.f_w = DefaultFontW(xw); + data.f_wb = DefaultFontWB(xw); +#endif + return &data; +} + +static void +cache_menu_font_name(TScreen *screen, int fontnum, int which, const char *name) +{ + if (name != 0) { + String last = screen->menu_font_names[fontnum][which]; + if (last != 0) { + if (strcmp(last, name)) { + FREE_STRING(last); + TRACE(("caching menu fontname %d.%d %s\n", fontnum, which, name)); + screen->menu_font_names[fontnum][which] = x_strdup(name); + } + } else { + TRACE(("caching menu fontname %d.%d %s\n", fontnum, which, name)); + screen->menu_font_names[fontnum][which] = x_strdup(name); + } + } +} + +static void +cannotFont(XtermWidget xw, const char *who, const char *tag, const char *name) +{ + static NameList *reported; + NameList *list; + + switch (xw->misc.fontWarnings) { + case fwNever: + return; + case fwResource: + if (is_derived_font_name(name)) + return; + break; + case fwAlways: + break; + } + for (list = reported; list != 0; list = list->next) { + if (!x_strcasecmp(name, list->name)) { + return; + } + } + if ((list = TypeMalloc(NameList)) != 0) { + list->name = x_strdup(name); + list->next = reported; + reported = list; + } + xtermWarning("cannot %s%s%s %sfont \"%s\"\n", + who, *tag ? " " : "", tag, + is_derived_font_name(name) ? "derived " : "", + name); +} + +#if OPT_RENDERFONT +static void +noUsableXft(XtermWidget xw, const char *name) +{ + switch (xw->misc.fontWarnings) { + case fwNever: + return; + case fwResource: + /* these combinations of wide/bold/italic are all "derived" */ + return; + case fwAlways: + break; + } + xtermWarning("did not find a usable %s TrueType font\n", name); +} +#endif + +/* + * Open the given font and verify that it is non-empty. Return a null on + * failure. + */ +Bool +xtermOpenFont(XtermWidget xw, + const char *name, + XTermFonts * result, + Bool force) +{ + Bool code = False; + TScreen *screen = TScreenOf(xw); + + TRACE(("xtermOpenFont %d:%d '%s'\n", + result->warn, xw->misc.fontWarnings, NonNull(name))); + if (!IsEmpty(name)) { + if ((result->fs = XLoadQueryFont(screen->display, name)) != 0) { + code = True; + if (EmptyFont(result->fs)) { + xtermCloseFont(xw, result); + code = False; + } else { + result->fn = x_strdup(name); + } + } else if (XmuCompareISOLatin1(name, DEFFONT) != 0) { + if (result->warn <= xw->misc.fontWarnings +#if OPT_RENDERFONT + && !UsingRenderFont(xw) +#endif + ) { + cannotFont(xw, "load", "", name); + } else { + TRACE(("xtermOpenFont: cannot load font '%s'\n", name)); + } + if (force) { + NoFontWarning(result); + code = xtermOpenFont(xw, DEFFONT, result, True); + } + } + } + NoFontWarning(result); + return code; +} + +/* + * Close the font and free the font info. + */ +void +xtermCloseFont(XtermWidget xw, XTermFonts * fnt) +{ + if (fnt != 0 && fnt->fs != 0) { + TScreen *screen = TScreenOf(xw); + + clrCgsFonts(xw, WhichVWin(screen), fnt); + XFreeFont(screen->display, fnt->fs); + xtermFreeFontInfo(fnt); + } +} + +/* + * Close and free the font (as well as any aliases). + */ +static void +xtermCloseFont2(XtermWidget xw, XTermFonts * fnts, int which) +{ + XFontStruct *thisFont = fnts[which].fs; + + if (thisFont != 0) { + int k; + + xtermCloseFont(xw, &fnts[which]); + for (k = 0; k < fMAX; ++k) { + if (k != which) { + if (thisFont == fnts[k].fs) { + xtermFreeFontInfo(&fnts[k]); + } + } + } + } +} + +/* + * Close the listed fonts, noting that some may use copies of the pointer. + */ +void +xtermCloseFonts(XtermWidget xw, XTermFonts * fnts) +{ + int j; + + for (j = 0; j < fMAX; ++j) { + xtermCloseFont2(xw, fnts, j); + } +} + +/* + * Make a copy of the source, assuming the XFontStruct's to be unique, but + * ensuring that the names are reallocated to simplify freeing. + */ +void +xtermCopyFontInfo(XTermFonts * target, XTermFonts * source) +{ + xtermFreeFontInfo(target); + target->chrset = source->chrset; + target->flags = source->flags; + target->fn = x_strdup(source->fn); + target->fs = source->fs; + target->warn = source->warn; +} + +void +xtermFreeFontInfo(XTermFonts * target) +{ + target->chrset = 0; + target->flags = 0; + if (target->fn != 0) { + free(target->fn); + target->fn = 0; + } + target->fs = 0; +} + +#if OPT_REPORT_FONTS +static void +reportXCharStruct(const char *tag, XCharStruct * cs) +{ + printf("\t\t%s:\n", tag); + printf("\t\t\tlbearing: %d\n", cs->lbearing); + printf("\t\t\trbearing: %d\n", cs->rbearing); + printf("\t\t\twidth: %d\n", cs->width); + printf("\t\t\tascent: %d\n", cs->ascent); + printf("\t\t\tdescent: %d\n", cs->descent); +} + +static void +reportOneVTFont(const char *tag, + XTermFonts * fnt) +{ + if (!IsEmpty(fnt->fn) && fnt->fs != 0) { + XFontStruct *fs = fnt->fs; + unsigned first_char = 0; + unsigned last_char = 0; + + if (fs->max_byte1 == 0) { + first_char = fs->min_char_or_byte2; + last_char = fs->max_char_or_byte2; + } else { + first_char = (fs->min_byte1 * 256) + fs->min_char_or_byte2; + last_char = (fs->max_byte1 * 256) + fs->max_char_or_byte2; + } + + printf("\t%s: %s\n", tag, NonNull(fnt->fn)); + printf("\t\tall chars: %s\n", fs->all_chars_exist ? "yes" : "no"); + printf("\t\tdefault char: %d\n", fs->default_char); + printf("\t\tdirection: %d\n", fs->direction); + printf("\t\tascent: %d\n", fs->ascent); + printf("\t\tdescent: %d\n", fs->descent); + printf("\t\tfirst char: %u\n", first_char); + printf("\t\tlast char: %u\n", last_char); + printf("\t\tmaximum-chars: %u\n", countGlyphs(fs)); + if (FontLacksMetrics(fnt)) { + printf("\t\tmissing-chars: ?\n"); + printf("\t\tpresent-chars: ?\n"); + } else { + unsigned missing = 0; + unsigned ch; + for (ch = first_char; ch <= last_char; ++ch) { + if (xtermMissingChar(ch, fnt)) { + ++missing; + } + } + printf("\t\tmissing-chars: %u\n", missing); + printf("\t\tpresent-chars: %u\n", countGlyphs(fs) - missing); + } + printf("\t\tmin_byte1: %d\n", fs->min_byte1); + printf("\t\tmax_byte1: %d\n", fs->max_byte1); + printf("\t\tproperties: %d\n", fs->n_properties); + reportXCharStruct("min_bounds", &(fs->min_bounds)); + reportXCharStruct("max_bounds", &(fs->max_bounds)); + /* TODO: report fs->properties and fs->per_char */ + } +} + +static void +reportVTFontInfo(XtermWidget xw, int fontnum) +{ + if (resource.reportFonts) { + TScreen *screen = TScreenOf(xw); + + if (fontnum) { + printf("Loaded VTFonts(font%d)\n", fontnum); + } else { + printf("Loaded VTFonts(default)\n"); + } + + reportOneVTFont("fNorm", GetNormalFont(screen, fNorm)); + reportOneVTFont("fBold", GetNormalFont(screen, fBold)); +#if OPT_WIDE_CHARS + reportOneVTFont("fWide", GetNormalFont(screen, fWide)); + reportOneVTFont("fWBold", GetNormalFont(screen, fWBold)); +#endif + } +} +#endif + +void +xtermUpdateFontGCs(XtermWidget xw, MyGetFont myfunc) +{ + TScreen *screen = TScreenOf(xw); + VTwin *win = WhichVWin(screen); + Pixel new_normal = getXtermFG(xw, xw->flags, xw->cur_foreground); + Pixel new_revers = getXtermBG(xw, xw->flags, xw->cur_background); + + setCgsFore(xw, win, gcNorm, new_normal); + setCgsBack(xw, win, gcNorm, new_revers); + setCgsFont(xw, win, gcNorm, myfunc(screen, fNorm)); + + copyCgs(xw, win, gcBold, gcNorm); + setCgsFont2(xw, win, gcBold, myfunc(screen, fBold), fBold); + + setCgsFore(xw, win, gcNormReverse, new_revers); + setCgsBack(xw, win, gcNormReverse, new_normal); + setCgsFont(xw, win, gcNormReverse, myfunc(screen, fNorm)); + + copyCgs(xw, win, gcBoldReverse, gcNormReverse); + setCgsFont2(xw, win, gcBoldReverse, myfunc(screen, fBold), fBold); + + if_OPT_WIDE_CHARS(screen, { + XTermFonts *wide_xx = myfunc(screen, fWide); + XTermFonts *bold_xx = myfunc(screen, fWBold); + if (wide_xx->fs != 0 + && bold_xx->fs != 0) { + setCgsFore(xw, win, gcWide, new_normal); + setCgsBack(xw, win, gcWide, new_revers); + setCgsFont(xw, win, gcWide, wide_xx); + + copyCgs(xw, win, gcWBold, gcWide); + setCgsFont(xw, win, gcWBold, bold_xx); + + setCgsFore(xw, win, gcWideReverse, new_revers); + setCgsBack(xw, win, gcWideReverse, new_normal); + setCgsFont(xw, win, gcWideReverse, wide_xx); + + copyCgs(xw, win, gcWBoldReverse, gcWideReverse); + setCgsFont(xw, win, gcWBoldReverse, bold_xx); + } + }); +} + +#if OPT_WIDE_ATTRS +unsigned +xtermUpdateItalics(XtermWidget xw, unsigned new_attrs, unsigned old_attrs) +{ + if ((new_attrs & ATR_ITALIC) && !(old_attrs & ATR_ITALIC)) { + xtermLoadItalics(xw); + xtermUpdateFontGCs(xw, getItalicFont); + } else if (!(new_attrs & ATR_ITALIC) && (old_attrs & ATR_ITALIC)) { + xtermUpdateFontGCs(xw, getNormalFont); + } + return new_attrs; +} +#endif + +#if OPT_TRACE +static void +show_font_misses(const char *name, XTermFonts * fp) +{ + if (fp->fs != 0) { + if (FontLacksMetrics(fp)) { + TRACE(("%s font lacks metrics\n", name)); + } else if (FontIsIncomplete(fp)) { + TRACE(("%s font is incomplete\n", name)); + } else { + TRACE(("%s font is complete\n", name)); + } + } else { + TRACE(("%s font is missing\n", name)); + } +} +#endif + +static Bool +loadNormFP(XtermWidget xw, + char **nameOutP, + XTermFonts * infoOut, + int fontnum) +{ + Bool status = True; + + TRACE(("loadNormFP (%s)\n", NonNull(*nameOutP))); + + if (!xtermOpenFont(xw, + *nameOutP, + infoOut, + (fontnum == fontMenu_default))) { + /* + * If we are opening the default font, and it happens to be missing, + * force that to the compiled-in default font, e.g., "fixed". If we + * cannot open the font, disable it from the menu. + */ + if (fontnum != fontMenu_fontsel) { + SetItemSensitivity(fontMenuEntries[fontnum].widget, False); + } + status = False; + } + return status; +} + +static Bool +loadBoldFP(XtermWidget xw, + char **nameOutP, + XTermFonts * infoOut, + const char *nameRef, + XTermFonts * infoRef, + int fontnum) +{ + TScreen *screen = TScreenOf(xw); + Bool status = True; + + TRACE(("loadBoldFP (%s)\n", NonNull(*nameOutP))); + + if (!check_fontname(*nameOutP)) { + FontNameProperties *fp; + char *normal = x_strdup(nameRef); + + fp = get_font_name_props(screen->display, infoRef->fs, &normal); + if (fp != 0) { + NoFontWarning(infoOut); + *nameOutP = bold_font_name(fp, fp->average_width); + if (!xtermOpenFont(xw, *nameOutP, infoOut, False)) { + free(*nameOutP); + *nameOutP = bold_font_name(fp, -1); + xtermOpenFont(xw, *nameOutP, infoOut, False); + } + TRACE(("...derived bold '%s'\n", NonNull(*nameOutP))); + } + if (fp == 0 || infoOut->fs == 0) { + xtermCopyFontInfo(infoOut, infoRef); + TRACE(("...cannot load a matching bold font\n")); + } else if (comparable_metrics(infoRef->fs, infoOut->fs) + && same_font_size(xw, infoRef->fs, infoOut->fs) + && got_bold_font(screen->display, infoOut->fs, *nameOutP)) { + TRACE(("...got a matching bold font\n")); + cache_menu_font_name(screen, fontnum, fBold, *nameOutP); + } else { + xtermCloseFont2(xw, infoOut - fBold, fBold); + *infoOut = *infoRef; + TRACE(("...did not get a matching bold font\n")); + } + free(normal); + } else if (!xtermOpenFont(xw, *nameOutP, infoOut, False)) { + xtermCopyFontInfo(infoOut, infoRef); + TRACE(("...cannot load bold font '%s'\n", NonNull(*nameOutP))); + } else { + cache_menu_font_name(screen, fontnum, fBold, *nameOutP); + } + + /* + * Most of the time this call to load the font will succeed, even if + * there is no wide font : the X server doubles the width of the + * normal font, or similar. + * + * But if it did fail for some reason, then nevermind. + */ + if (EmptyFont(infoOut->fs)) + status = False; /* can't use a 0-sized font */ + + if (!same_font_size(xw, infoRef->fs, infoOut->fs) + && (is_fixed_font(infoRef->fs) && is_fixed_font(infoOut->fs))) { + TRACE(("...ignoring mismatched normal/bold fonts\n")); + xtermCloseFont2(xw, infoOut - fBold, fBold); + xtermCopyFontInfo(infoOut, infoRef); + } + + return status; +} + +#if OPT_WIDE_CHARS +static Bool +loadWideFP(XtermWidget xw, + char **nameOutP, + XTermFonts * infoOut, + const char *nameRef, + XTermFonts * infoRef, + int fontnum) +{ + TScreen *screen = TScreenOf(xw); + Bool status = True; + + TRACE(("loadWideFP (%s)\n", NonNull(*nameOutP))); + + if (!check_fontname(*nameOutP) + && (screen->utf8_fonts && !is_double_width_font(infoRef->fs))) { + char *normal = x_strdup(nameRef); + FontNameProperties *fp = get_font_name_props(screen->display, + infoRef->fs, &normal); + if (fp != 0) { + *nameOutP = wide_font_name(fp); + NoFontWarning(infoOut); + } + free(normal); + } + + if (check_fontname(*nameOutP)) { + if (xtermOpenFont(xw, *nameOutP, infoOut, False) + && is_derived_font_name(*nameOutP) + && EmptyFont(infoOut->fs)) { + xtermCloseFont2(xw, infoOut - fWide, fWide); + } + if (infoOut->fs == 0) { + xtermCopyFontInfo(infoOut, infoRef); + } else { + TRACE(("...%s wide %s\n", + is_derived_font_name(*nameOutP) ? "derived" : "given", + NonNull(*nameOutP))); + cache_menu_font_name(screen, fontnum, fWide, *nameOutP); + } + } else { + xtermCopyFontInfo(infoOut, infoRef); + } + return status; +} + +static Bool +loadWBoldFP(XtermWidget xw, + char **nameOutP, + XTermFonts * infoOut, + const char *wideNameRef, XTermFonts * wideInfoRef, + const char *boldNameRef, XTermFonts * boldInfoRef, + int fontnum) +{ + TScreen *screen = TScreenOf(xw); + Bool status = True; + char *bold = NULL; + + TRACE(("loadWBoldFP (%s)\n", NonNull(*nameOutP))); + + if (!check_fontname(*nameOutP)) { + FontNameProperties *fp; + fp = get_font_name_props(screen->display, boldInfoRef->fs, &bold); + if (fp != 0) { + *nameOutP = widebold_font_name(fp); + NoFontWarning(infoOut); + } + } + + if (check_fontname(*nameOutP)) { + + if (xtermOpenFont(xw, *nameOutP, infoOut, False) + && is_derived_font_name(*nameOutP) + && !compatibleWideCounts(wideInfoRef->fs, infoOut->fs)) { + xtermCloseFont2(xw, infoOut - fWBold, fWBold); + } + + if (infoOut->fs == 0) { + if (is_derived_font_name(*nameOutP)) + free(*nameOutP); + if (IsEmpty(wideNameRef)) { + *nameOutP = x_strdup(boldNameRef); + xtermCopyFontInfo(infoOut, boldInfoRef); + TRACE(("...cannot load wide-bold, use bold %s\n", + NonNull(boldNameRef))); + } else { + *nameOutP = x_strdup(wideNameRef); + xtermCopyFontInfo(infoOut, wideInfoRef); + TRACE(("...cannot load wide-bold, use wide %s\n", + NonNull(wideNameRef))); + } + } else { + TRACE(("...%s wide/bold %s\n", + is_derived_font_name(*nameOutP) ? "derived" : "given", + NonNull(*nameOutP))); + cache_menu_font_name(screen, fontnum, fWBold, *nameOutP); + } + } else if (is_double_width_font(boldInfoRef->fs)) { + xtermCopyFontInfo(infoOut, boldInfoRef); + TRACE(("...bold font is double-width, use it %s\n", NonNull(boldNameRef))); + } else { + xtermCopyFontInfo(infoOut, wideInfoRef); + TRACE(("...cannot load wide bold font, use wide %s\n", NonNull(wideNameRef))); + } + + free(bold); + + if (EmptyFont(infoOut->fs)) { + status = False; /* can't use a 0-sized font */ + } else { + if ((!comparable_metrics(wideInfoRef->fs, infoOut->fs) + || (!same_font_size(xw, wideInfoRef->fs, infoOut->fs) + && is_fixed_font(wideInfoRef->fs) + && is_fixed_font(infoOut->fs)))) { + TRACE(("...ignoring mismatched normal/bold wide fonts\n")); + xtermCloseFont2(xw, infoOut - fWBold, fWBold); + xtermCopyFontInfo(infoOut, wideInfoRef); + } + } + + return status; +} +#endif + +int +xtermLoadFont(XtermWidget xw, + const VTFontNames * fonts, + Bool doresize, + int fontnum) +{ + TScreen *screen = TScreenOf(xw); + VTwin *win = WhichVWin(screen); + + VTFontNames myfonts; + XTermFonts fnts[fMAX]; + char *tmpname = NULL; + Boolean proportional = False; + + memset(&myfonts, 0, sizeof(myfonts)); + memset(fnts, 0, sizeof(fnts)); + + if (fonts != 0) + myfonts = *fonts; + if (!check_fontname(myfonts.f_n)) + return 0; + + if (fontnum == fontMenu_fontescape + && myfonts.f_n != screen->MenuFontName(fontnum)) { + if ((tmpname = x_strdup(myfonts.f_n)) == 0) + return 0; + } + + TRACE(("Begin Cgs - xtermLoadFont(%s)\n", myfonts.f_n)); + releaseWindowGCs(xw, win); + +#define DbgResource(name, field, index) \ + TRACE(("xtermLoadFont #%d "name" %s%s\n", \ + fontnum, \ + (fnts[index].warn == fwResource) ? "*" : " ", \ + NonNull(myfonts.field))) + DbgResource("normal", f_n, fNorm); + DbgResource("bold ", f_b, fBold); +#if OPT_WIDE_CHARS + DbgResource("wide ", f_w, fWide); + DbgResource("w/bold", f_wb, fWBold); +#endif + + if (!loadNormFP(xw, + &myfonts.f_n, + &fnts[fNorm], + fontnum)) + goto bad; + + if (!loadBoldFP(xw, + &myfonts.f_b, + &fnts[fBold], + myfonts.f_n, + &fnts[fNorm], + fontnum)) + goto bad; + + /* + * If there is no widefont specified, fake it by doubling AVERAGE_WIDTH + * of normal fonts XLFD, and asking for it. This plucks out 18x18ja + * and 12x13ja as the corresponding fonts for 9x18 and 6x13. + */ + if_OPT_WIDE_CHARS(screen, { + + if (!loadWideFP(xw, + &myfonts.f_w, + &fnts[fWide], + myfonts.f_n, + &fnts[fNorm], + fontnum)) + goto bad; + + if (!loadWBoldFP(xw, + &myfonts.f_wb, + &fnts[fWBold], + myfonts.f_w, + &fnts[fWide], + myfonts.f_b, + &fnts[fBold], + fontnum)) + goto bad; + + }); + + /* + * Normal/bold fonts should be the same width. Also, the min/max + * values should be the same. + */ + if (fnts[fNorm].fs != 0 + && fnts[fBold].fs != 0 + && (!is_fixed_font(fnts[fNorm].fs) + || !is_fixed_font(fnts[fBold].fs) + || differing_widths(fnts[fNorm].fs, fnts[fBold].fs))) { + TRACE(("Proportional font! normal %d/%d, bold %d/%d\n", + fnts[fNorm].fs->min_bounds.width, + fnts[fNorm].fs->max_bounds.width, + fnts[fBold].fs->min_bounds.width, + fnts[fBold].fs->max_bounds.width)); + proportional = True; + } + + if_OPT_WIDE_CHARS(screen, { + if (fnts[fWide].fs != 0 + && fnts[fWBold].fs != 0 + && (!is_fixed_font(fnts[fWide].fs) + || !is_fixed_font(fnts[fWBold].fs) + || differing_widths(fnts[fWide].fs, fnts[fWBold].fs))) { + TRACE(("Proportional font! wide %d/%d, wide bold %d/%d\n", + fnts[fWide].fs->min_bounds.width, + fnts[fWide].fs->max_bounds.width, + fnts[fWBold].fs->min_bounds.width, + fnts[fWBold].fs->max_bounds.width)); + proportional = True; + } + }); + + /* TODO : enforce that the width of the wide font is 2* the width + of the narrow font */ + + /* + * If we're switching fonts, free the old ones. Otherwise we'll leak + * the memory that is associated with the old fonts. The + * XLoadQueryFont call allocates a new XFontStruct. + */ + xtermCloseFonts(xw, screen->fnts); +#if OPT_WIDE_ATTRS + xtermCloseFonts(xw, screen->ifnts); + screen->ifnts_ok = False; +#endif + + xtermCopyFontInfo(GetNormalFont(screen, fNorm), &fnts[fNorm]); + xtermCopyFontInfo(GetNormalFont(screen, fBold), &fnts[fBold]); +#if OPT_WIDE_CHARS + xtermCopyFontInfo(GetNormalFont(screen, fWide), &fnts[fWide]); + if (fnts[fWBold].fs == NULL) + xtermCopyFontInfo(GetNormalFont(screen, fWide), &fnts[fWide]); + xtermCopyFontInfo(GetNormalFont(screen, fWBold), &fnts[fWBold]); +#endif + + xtermUpdateFontGCs(xw, getNormalFont); + +#if OPT_BOX_CHARS + screen->allow_packing = proportional; + setupPackedFonts(xw); +#endif + screen->fnt_prop = (Boolean) (proportional && !(screen->force_packed)); + screen->fnt_boxes = 1; + +#if OPT_BOX_CHARS + /* + * xterm uses character positions 1-31 of a font for the line-drawing + * characters. Check that they are all present. The null character + * (0) is special, and is not used. + */ +#if OPT_RENDERFONT + if (UsingRenderFont(xw)) { + /* + * FIXME: we shouldn't even be here if we're using Xft. + */ + screen->fnt_boxes = 0; + TRACE(("assume Xft missing line-drawing chars\n")); + } else +#endif + { + unsigned ch; + +#if OPT_TRACE +#define TRACE_MISS(index) show_font_misses(#index, &fnts[index]) + TRACE_MISS(fNorm); + TRACE_MISS(fBold); +#if OPT_WIDE_CHARS + TRACE_MISS(fWide); + TRACE_MISS(fWBold); +#endif +#endif + +#if OPT_WIDE_CHARS + if (screen->utf8_mode || screen->unicode_font) { + UIntSet(screen->fnt_boxes, 2); + for (ch = 1; ch < 32; ch++) { + unsigned n = dec2ucs(screen, ch); + if ((n != UCS_REPL) + && (n != ch) + && (screen->fnt_boxes & 2)) { + if (xtermMissingChar(n, &fnts[fNorm]) || + xtermMissingChar(n, &fnts[fBold])) { + UIntClr(screen->fnt_boxes, 2); + TRACE(("missing graphics character #%d, U+%04X\n", + ch, n)); + break; + } + } + } + } +#endif + + for (ch = 1; ch < 32; ch++) { + if (xtermMissingChar(ch, &fnts[fNorm])) { + TRACE(("missing normal char #%d\n", ch)); + UIntClr(screen->fnt_boxes, 1); + break; + } + if (xtermMissingChar(ch, &fnts[fBold])) { + TRACE(("missing bold char #%d\n", ch)); + UIntClr(screen->fnt_boxes, 1); + break; + } + } + + TRACE(("Will %suse internal line-drawing characters (mode %d)\n", + screen->fnt_boxes ? "not " : "", + screen->fnt_boxes)); + } +#endif + + if (screen->always_bold_mode) { + screen->enbolden = screen->bold_mode; + } else { + screen->enbolden = screen->bold_mode + && ((fnts[fNorm].fs == fnts[fBold].fs) + || same_font_name(myfonts.f_n, myfonts.f_b)); + } + TRACE(("Will %suse 1-pixel offset/overstrike to simulate bold\n", + screen->enbolden ? "" : "not ")); + + set_menu_font(False); + screen->menu_font_number = fontnum; + set_menu_font(True); + if (tmpname) { /* if setting escape or sel */ + if (screen->MenuFontName(fontnum)) + FREE_STRING(screen->MenuFontName(fontnum)); + screen->MenuFontName(fontnum) = tmpname; + if (fontnum == fontMenu_fontescape) { + update_font_escape(); + } +#if OPT_SHIFT_FONTS + screen->menu_font_sizes[fontnum] = FontSize(fnts[fNorm].fs); +#endif + } + set_cursor_gcs(xw); + xtermUpdateFontInfo(xw, doresize); + TRACE(("Success Cgs - xtermLoadFont\n")); +#if OPT_REPORT_FONTS + reportVTFontInfo(xw, fontnum); +#endif + FREE_FNAME(f_n); + FREE_FNAME(f_b); +#if OPT_WIDE_CHARS + FREE_FNAME(f_w); + FREE_FNAME(f_wb); +#endif + if (fnts[fNorm].fn == fnts[fBold].fn) { + free(fnts[fNorm].fn); + } else { + free(fnts[fNorm].fn); + free(fnts[fBold].fn); + } +#if OPT_WIDE_CHARS + free(fnts[fWide].fn); + free(fnts[fWBold].fn); +#endif + xtermSetWinSize(xw); + return 1; + + bad: + if (tmpname) + free(tmpname); + +#if OPT_RENDERFONT + if ((fontnum == fontMenu_fontsel) && (fontnum != screen->menu_font_number)) { + int old_fontnum = screen->menu_font_number; +#if OPT_TOOLBAR + SetItemSensitivity(fontMenuEntries[fontnum].widget, True); +#endif + Bell(xw, XkbBI_MinorError, 0); + myfonts.f_n = screen->MenuFontName(old_fontnum); + return xtermLoadFont(xw, &myfonts, doresize, old_fontnum); + } else if (x_strcasecmp(myfonts.f_n, DEFFONT)) { + int code; + + myfonts.f_n = x_strdup(DEFFONT); + TRACE(("...recovering for TrueType fonts\n")); + code = xtermLoadFont(xw, &myfonts, doresize, fontnum); + if (code) { + if (fontnum != fontMenu_fontsel) { + SetItemSensitivity(fontMenuEntries[fontnum].widget, + UsingRenderFont(xw)); + } + TRACE(("...recovered size %dx%d\n", + FontHeight(screen), + FontWidth(screen))); + } + return code; + } +#endif + + releaseWindowGCs(xw, win); + + xtermCloseFonts(xw, fnts); + TRACE(("Fail Cgs - xtermLoadFont\n")); + return 0; +} + +#if OPT_WIDE_ATTRS +/* + * (Attempt to) load matching italics for the current normal/bold/etc fonts. + * If the attempt fails for a given style, use the non-italic font. + */ +void +xtermLoadItalics(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (!screen->ifnts_ok) { + int n; + FontNameProperties *fp; + XTermFonts *data; + + screen->ifnts_ok = True; + for (n = 0; n < fMAX; ++n) { + switch (n) { + case fNorm: + /* FALLTHRU */ + case fBold: + /* FALLTHRU */ +#if OPT_WIDE_CHARS + case fWide: + /* FALLTHRU */ + case fWBold: +#endif + /* FALLTHRU */ + data = getItalicFont(screen, n); + + /* + * FIXME - need to handle font-leaks + */ + data->fs = 0; + if (getNormalFont(screen, n)->fs != 0 && + (fp = get_font_name_props(screen->display, + getNormalFont(screen, n)->fs, + 0)) != 0) { + if (!open_italic_font(xw, n, fp, data)) { + if (n > 0) { + xtermCopyFontInfo(data, + getItalicFont(screen, n - 1)); + } else { + xtermOpenFont(xw, + getNormalFont(screen, n)->fn, + data, False); + } + } + } + break; + } + } + } +} +#endif + +#if OPT_LOAD_VTFONTS || OPT_WIDE_CHARS +/* + * Collect font-names that we can modify with the load-vt-fonts() action. + */ +#define MERGE_SUBFONT(dst,src,name) \ + if (IsEmpty(dst.name)) { \ + TRACE(("MERGE_SUBFONT " #dst "." #name " merge \"%s\"\n", NonNull(src.name))); \ + dst.name = x_strdup(src.name); \ + } else { \ + TRACE(("MERGE_SUBFONT " #dst "." #name " found \"%s\"\n", NonNull(dst.name))); \ + } +#define MERGE_SUBLIST(dst,src,name) \ + if (merge_sublist(&(dst.fonts.x11.name), src.fonts.x11.name)) { \ + TRACE(("MERGE_SUBLIST " #dst "." #name " merge \"%s\"\n", src.fonts.x11.name[0])); \ + } else { \ + TRACE(("MERGE_SUBLIST " #dst "." #name " found \"%s\"\n", dst.fonts.x11.name[0])); \ + } + +#define INFER_SUBFONT(dst,src,name) \ + if (IsEmpty(dst.name)) { \ + TRACE(("INFER_SUBFONT " #dst "." #name " will infer\n")); \ + dst.name = x_strdup(""); \ + } else { \ + TRACE(("INFER_SUBFONT " #dst "." #name " found \"%s\"\n", NonNull(dst.name))); \ + } + +#define FREE_MENU_FONTS(dst) \ + TRACE(("FREE_MENU_FONTS " #dst "\n")); \ + for (n = fontMenu_default; n <= fontMenu_lastBuiltin; ++n) { \ + for (m = 0; m < fMAX; ++m) { \ + FREE_STRING(dst.menu_font_names[n][m]); \ + dst.menu_font_names[n][m] = 0; \ + } \ + } + +#define COPY_MENU_FONTS(dst,src) \ + TRACE(("COPY_MENU_FONTS " #src " to " #dst "\n")); \ + for (n = fontMenu_default; n <= fontMenu_lastBuiltin; ++n) { \ + for (m = 0; m < fMAX; ++m) { \ + FREE_STRING(dst.menu_font_names[n][m]); \ + dst.menu_font_names[n][m] = x_strdup(src.menu_font_names[n][m]); \ + } \ + TRACE((".. " #dst ".menu_fonts_names[%d] = %s\n", n, NonNull(dst.menu_font_names[n][fNorm]))); \ + } + +#define COPY_DEFAULT_FONTS(target, source) \ + TRACE(("COPY_DEFAULT_FONTS " #source " to " #target "\n")); \ + xtermCopyVTFontNames(&target.default_font, &source.default_font) + +#define COPY_X11_FONTLISTS(target, source) \ + TRACE(("COPY_X11_FONTLISTS " #source " to " #target "\n")); \ + xtermCopyFontLists(xw, &target.fonts.x11, &source.fonts.x11) + +static void +xtermCopyVTFontNames(VTFontNames * target, VTFontNames * source) +{ +#define COPY_IT(name,field) \ + TRACE((".. "#name" = %s\n", NonNull(source->field))); \ + free(target->field); \ + target->field = x_strdup(source->field) + + TRACE(("xtermCopyVTFontNames\n")); + + COPY_IT(font, f_n); + COPY_IT(boldFont, f_b); + +#if OPT_WIDE_CHARS + COPY_IT(wideFont, f_w); + COPY_IT(wideBoldFont, f_wb); +#endif +#undef COPY_IT +} + +static void +xtermCopyFontLists(XtermWidget xw, VTFontList * target, VTFontList * source) +{ +#define COPY_IT(name,field) \ + copyFontList(&(target->field), source->field); \ + TRACE_ARGV(".. " #name, source->field) + + (void) xw; + TRACE(("xtermCopyFontLists %s ->%s\n", + whichFontList(xw, source), + whichFontList(xw, target))); + + COPY_IT(font, list_n); + COPY_IT(fontBold, list_b); +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE + COPY_IT(fontItal, list_i); + COPY_IT(fontBtal, list_bi); +#endif +#if OPT_WIDE_CHARS + COPY_IT(wideFont, list_w); + COPY_IT(wideBoldFont, list_wb); + COPY_IT(wideItalFont, list_wi); + COPY_IT(wideBtalFont, list_wbi); +#endif +#undef COPY_IT +} + +void +xtermSaveVTFonts(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Cardinal n, m; + + if (!screen->savedVTFonts) { + + screen->savedVTFonts = True; + TRACE(("xtermSaveVTFonts saving original\n")); + COPY_DEFAULT_FONTS(screen->cacheVTFonts, xw->misc); + COPY_X11_FONTLISTS(screen->cacheVTFonts, xw->work); + COPY_MENU_FONTS(screen->cacheVTFonts, xw->screen); + } +} + +#define SAME_STRING(x,y) ((x) == (y) || ((x) && (y) && !strcmp(x, y))) +#define SAME_MEMBER(n) SAME_STRING(a->n, b->n) + +static Boolean +sameSubResources(SubResourceRec * a, SubResourceRec * b) +{ + Boolean result = True; + + if (!SAME_MEMBER(default_font.f_n) + || !SAME_MEMBER(default_font.f_b) +#if OPT_WIDE_CHARS + || !SAME_MEMBER(default_font.f_w) + || !SAME_MEMBER(default_font.f_wb) +#endif + ) { + TRACE(("sameSubResources: default_font differs\n")); + result = False; + } else { + int n; + + for (n = 0; n < NMENUFONTS; ++n) { + if (!SAME_MEMBER(menu_font_names[n][fNorm])) { + TRACE(("sameSubResources: menu_font_names[%d] differs\n", n)); + result = False; + break; + } + } + } + + return result; +} + +/* + * Load the "VT" font names from the given subresource name/class. These + * correspond to the VT100 resources. + */ +static Bool +xtermLoadVTFonts(XtermWidget xw, String myName, String myClass) +{ + SubResourceRec subresourceRec; + SubResourceRec referenceRec; + + /* + * These are duplicates of the VT100 font resources, but with a special + * application/classname passed in to distinguish them. + */ + static XtResource font_resources[] = + { + Sres(XtNfont, XtCFont, default_font.f_n, DEFFONT), + Sres(XtNboldFont, XtCBoldFont, default_font.f_b, DEFBOLDFONT), +#if OPT_WIDE_CHARS + Sres(XtNwideFont, XtCWideFont, default_font.f_w, DEFWIDEFONT), + Sres(XtNwideBoldFont, XtCWideBoldFont, default_font.f_wb, DEFWIDEBOLDFONT), +#endif + Sres(XtNfont1, XtCFont1, MenuFontName(fontMenu_font1), NULL), + Sres(XtNfont2, XtCFont2, MenuFontName(fontMenu_font2), NULL), + Sres(XtNfont3, XtCFont3, MenuFontName(fontMenu_font3), NULL), + Sres(XtNfont4, XtCFont4, MenuFontName(fontMenu_font4), NULL), + Sres(XtNfont5, XtCFont5, MenuFontName(fontMenu_font5), NULL), + Sres(XtNfont6, XtCFont6, MenuFontName(fontMenu_font6), NULL), + }; + Cardinal n, m; + Bool status = True; + TScreen *screen = TScreenOf(xw); + + TRACE(("called xtermLoadVTFonts(name=%s, class=%s)\n", + NonNull(myName), NonNull(myClass))); + + xtermSaveVTFonts(xw); + + if (IsEmpty(myName)) { + TRACE(("xtermLoadVTFonts restoring original\n")); + COPY_DEFAULT_FONTS(xw->misc, screen->cacheVTFonts); + COPY_X11_FONTLISTS(xw->work, screen->cacheVTFonts); + FREE_MENU_FONTS(xw->screen); + COPY_MENU_FONTS(xw->screen, screen->cacheVTFonts); + } else { + TRACE(("xtermLoadVTFonts(%s, %s)\n", myName, myClass)); + + memset(&referenceRec, 0, sizeof(referenceRec)); + memset(&subresourceRec, 0, sizeof(subresourceRec)); + XtGetSubresources((Widget) xw, (XtPointer) &subresourceRec, + myName, myClass, + font_resources, + (Cardinal) XtNumber(font_resources), + NULL, (Cardinal) 0); + + /* + * XtGetSubresources returns no status, so we compare the returned + * data against a zero'd struct to see if any data is returned. + */ + if (memcmp(&referenceRec, &subresourceRec, sizeof(referenceRec)) + && !sameSubResources(&(screen->cacheVTFonts), &subresourceRec)) { + + screen->mergedVTFonts = True; + + /* + * To make it simple, reallocate the strings returned by + * XtGetSubresources. We can free our own strings, but not theirs. + */ + ALLOC_STRING(subresourceRec.default_font.f_n); + ALLOC_STRING(subresourceRec.default_font.f_b); +#if OPT_WIDE_CHARS + ALLOC_STRING(subresourceRec.default_font.f_w); + ALLOC_STRING(subresourceRec.default_font.f_wb); +#endif + for (n = fontMenu_font1; n <= fontMenu_lastBuiltin; ++n) { + ALLOC_STRING(subresourceRec.MenuFontName(n)); + } + + /* + * Now, save the string to a font-list for consistency + */ +#define ALLOC_SUBLIST(which,field) \ + save2FontList(xw, "cached", \ + &(subresourceRec.fonts), \ + which, \ + subresourceRec.default_font.field, False) + + ALLOC_SUBLIST(fNorm, f_n); + ALLOC_SUBLIST(fBold, f_b); +#if OPT_WIDE_CHARS + ALLOC_SUBLIST(fWide, f_w); + ALLOC_SUBLIST(fWBold, f_wb); +#endif + + /* + * If a particular resource value was not found, use the original. + */ + MERGE_SUBFONT(subresourceRec, xw->misc, default_font.f_n); + INFER_SUBFONT(subresourceRec, xw->misc, default_font.f_b); + MERGE_SUBLIST(subresourceRec, xw->work, list_n); + MERGE_SUBLIST(subresourceRec, xw->work, list_b); +#if OPT_WIDE_CHARS + INFER_SUBFONT(subresourceRec, xw->misc, default_font.f_w); + INFER_SUBFONT(subresourceRec, xw->misc, default_font.f_wb); + MERGE_SUBLIST(subresourceRec, xw->work, list_w); + MERGE_SUBLIST(subresourceRec, xw->work, list_wb); +#endif + for (n = fontMenu_font1; n <= fontMenu_lastBuiltin; ++n) { + MERGE_SUBFONT(subresourceRec, xw->screen, MenuFontName(n)); + } + + /* + * Finally, copy the subresource data to the widget. + */ + COPY_DEFAULT_FONTS(xw->misc, subresourceRec); + COPY_X11_FONTLISTS(xw->work, subresourceRec); + FREE_MENU_FONTS(xw->screen); + COPY_MENU_FONTS(xw->screen, subresourceRec); + + FREE_STRING(screen->MenuFontName(fontMenu_default)); + FREE_STRING(screen->menu_font_names[0][fBold]); + screen->MenuFontName(fontMenu_default) = x_strdup(DefaultFontN(xw)); + screen->menu_font_names[0][fBold] = x_strdup(DefaultFontB(xw)); +#if OPT_WIDE_CHARS + FREE_STRING(screen->menu_font_names[0][fWide]); + FREE_STRING(screen->menu_font_names[0][fWBold]); + screen->menu_font_names[0][fWide] = x_strdup(DefaultFontW(xw)); + screen->menu_font_names[0][fWBold] = x_strdup(DefaultFontWB(xw)); +#endif + /* + * And remove our copies of strings. + */ + FREE_STRING(subresourceRec.default_font.f_n); + FREE_STRING(subresourceRec.default_font.f_b); +#if OPT_WIDE_CHARS + FREE_STRING(subresourceRec.default_font.f_w); + FREE_STRING(subresourceRec.default_font.f_wb); +#endif + for (n = fontMenu_font1; n <= fontMenu_lastBuiltin; ++n) { + FREE_STRING(subresourceRec.MenuFontName(n)); + } + } else { + TRACE(("...no resources found\n")); + status = False; + } + } + TRACE((".. xtermLoadVTFonts: %d\n", status)); + return status; +} + +#if OPT_WIDE_CHARS +static Bool +isWideFont(XFontStruct *fp, const char *tag, Bool nullOk) +{ + Bool result = False; + + (void) tag; + if (okFont(fp)) { + unsigned count = countGlyphs(fp); + TRACE(("isWideFont(%s) found %d cells\n", tag, count)); + result = (count > 256) ? True : False; + } else { + result = nullOk; + } + return result; +} + +/* + * If the current fonts are not wide, load the UTF8 fonts. + * + * Called during initialization (for wide-character mode), the fonts have not + * been setup, so we pass nullOk=True to isWideFont(). + * + * Called after initialization, e.g., in response to the UTF-8 menu entry + * (starting from narrow character mode), it checks if the fonts are not wide. + */ +Bool +xtermLoadWideFonts(XtermWidget xw, Bool nullOk) +{ + TScreen *screen = TScreenOf(xw); + Bool result; + + if (EmptyFont(GetNormalFont(screen, fWide)->fs)) { + result = (isWideFont(GetNormalFont(screen, fNorm)->fs, "normal", nullOk) + && isWideFont(GetNormalFont(screen, fBold)->fs, "bold", nullOk)); + } else { + result = (isWideFont(GetNormalFont(screen, fWide)->fs, "wide", nullOk) + && isWideFont(GetNormalFont(screen, fWBold)->fs, + "wide-bold", nullOk)); + if (result && !screen->utf8_latin1) { + result = (isWideFont(GetNormalFont(screen, fNorm)->fs, "normal", nullOk) + && isWideFont(GetNormalFont(screen, fBold)->fs, + "bold", nullOk)); + } + } + if (!result) { + TRACE(("current fonts are not all wide%s\n", nullOk ? " nullOk" : "")); + result = xtermLoadVTFonts(xw, XtNutf8Fonts, XtCUtf8Fonts); + } + TRACE(("xtermLoadWideFonts:%d\n", result)); + return result; +} +#endif /* OPT_WIDE_CHARS */ + +/* + * Restore the default fonts, i.e., if we had switched to wide-fonts. + */ +Bool +xtermLoadDefaultFonts(XtermWidget xw) +{ + Bool result; + result = xtermLoadVTFonts(xw, NULL, NULL); + TRACE(("xtermLoadDefaultFonts:%d\n", result)); + return result; +} +#endif /* OPT_LOAD_VTFONTS || OPT_WIDE_CHARS */ + +#if OPT_LOAD_VTFONTS +void +HandleLoadVTFonts(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + static char empty[] = ""; /* appease strict compilers */ + + TScreen *screen = TScreenOf(xw); + char name_buf[80]; + String name = (String) ((*param_count > 0) ? params[0] : empty); + char *myName = MyStackAlloc(strlen(name) + 1, name_buf); + + TRACE(("HandleLoadVTFonts(%d)\n", *param_count)); + if (myName != 0) { + char class_buf[80]; + String convert = (String) ((*param_count > 1) ? params[1] : myName); + char *myClass = MyStackAlloc(strlen(convert) + 1, class_buf); + + strcpy(myName, name); + if (myClass != 0) { + strcpy(myClass, convert); + if (*param_count == 1) + myClass[0] = x_toupper(myClass[0]); + + if (xtermLoadVTFonts(xw, myName, myClass)) { + int n; + /* + * When switching fonts, try to preserve the font-menu + * selection, since it is less surprising to do that (if + * the font-switching can be undone) than to switch to + * "Default". + */ + int font_number = screen->menu_font_number; + if (font_number > fontMenu_lastBuiltin) + font_number = fontMenu_lastBuiltin; + for (n = 0; n < NMENUFONTS; ++n) { + screen->menu_font_sizes[n] = 0; + } + if (font_number == fontMenu_default) { + SetVTFont(xw, font_number, True, defaultVTFontNames(xw)); + } else { + SetVTFont(xw, font_number, True, NULL); + } + } + MyStackFree(myClass, class_buf); + } + MyStackFree(myName, name_buf); + } + } +} +#endif /* OPT_LOAD_VTFONTS */ + +/* + * Set the limits for the box that outlines the cursor. + */ +void +xtermSetCursorBox(TScreen *screen) +{ + static XPoint VTbox[NBOX]; + XPoint *vp; + int fw = FontWidth(screen) - 1; + int fh = FontHeight(screen) - 1; + int ww = isCursorBar(screen) ? 1 : fw; + int hh = isCursorUnderline(screen) ? 1 : fh; + + vp = &VTbox[1]; + (vp++)->x = (short) ww; + (vp++)->y = (short) hh; + (vp++)->x = (short) -ww; + vp->y = (short) -hh; + + screen->box = VTbox; +} + +#if OPT_RENDERFONT + +#define CACHE_XFT(dst,src) if (src.font != 0) {\ + int err = checkXftWidth(xw, &(dst[fontnum]), &src);\ + TRACE(("Xft metrics %s[%d] = %d (%d,%d)%s advance %d, actual %d%s%s\n",\ + #dst,\ + fontnum,\ + src.font->height,\ + src.font->ascent,\ + src.font->descent,\ + ((src.font->ascent + src.font->descent) > src.font->height ? "*" : ""),\ + src.font->max_advance_width,\ + dst[fontnum].map.min_width,\ + dst[fontnum].map.mixed ? " mixed" : "",\ + err ? " ERROR" : ""));\ + if (err) {\ + xtermCloseXft(screen, &src);\ + memset((&dst[fontnum]), 0, sizeof(dst[fontnum]));\ + failed += err;\ + }\ + } + +#if OPT_REPORT_FONTS +static FcChar32 +xtermXftFirstChar(XftFont *xft) +{ + FcChar32 map[FC_CHARSET_MAP_SIZE]; + FcChar32 next; + FcChar32 first; + int i; + + first = FcCharSetFirstPage(xft->charset, map, &next); + for (i = 0; i < FC_CHARSET_MAP_SIZE; i++) { + if (map[i]) { + FcChar32 bits = map[i]; + first += (FcChar32) i *32; + while (!(bits & 0x1)) { + bits >>= 1; + first++; + } + break; + } + } + return first; +} + +static FcChar32 +xtermXftLastChar(XftFont *xft) +{ + FcChar32 this, last, next; + FcChar32 map[FC_CHARSET_MAP_SIZE]; + int i; + last = FcCharSetFirstPage(xft->charset, map, &next); + while ((this = FcCharSetNextPage(xft->charset, map, &next)) != FC_CHARSET_DONE) + last = this; + last &= (FcChar32) ~ 0xff; + for (i = FC_CHARSET_MAP_SIZE - 1; i >= 0; i--) { + if (map[i]) { + FcChar32 bits = map[i]; + last += (FcChar32) i *32 + 31; + while (!(bits & 0x80000000)) { + last--; + bits <<= 1; + } + break; + } + } + return (FcChar32) last; +} +#endif /* OPT_REPORT_FONTS */ + +#if OPT_TRACE + +#if !OPT_WIDE_CHARS +static Char * +convertToUTF8(Char *buffer, int c) +{ + buffer[0] = (Char) c; + buffer[1] = 0; + return buffer; +} +#endif + +static void +dumpXft(XtermWidget xw, XTermXftFonts *data) +{ + XftFont *xft = data->font; + TScreen *screen = TScreenOf(xw); + VTwin *win = WhichVWin(screen); + + FcChar32 c; + FcChar32 first = xtermXftFirstChar(xft); + FcChar32 last = xtermXftLastChar(xft); + FcChar32 dump; + unsigned count = 0; + unsigned too_high = 0; + unsigned too_wide = 0; + Boolean skip = False; + + TRACE(("dumpXft {{\n")); + TRACE(("\tdata range U+%04X..U+%04X\n", first, last)); + TRACE(("\tcode\tcells\tdimensions\n")); +#if OPT_TRACE < 2 + dump = 255; +#else + dump = last; +#endif + for (c = first; c <= last; ++c) { + if (FcCharSetHasChar(xft->charset, c)) { + int width = CharWidth(c); + XGlyphInfo extents; + Boolean big_x; + Boolean big_y; + + XftTextExtents32(XtDisplay(xw), xft, &c, 1, &extents); + big_x = (extents.width > win->f_width); + big_y = (extents.height > win->f_height); + + if (c <= dump) { + Char buffer[80]; + + *convertToUTF8(buffer, c) = '\0'; + TRACE(("%s%s\tU+%04X\t%d\t%.1f x %.1f\t%s\n", + (big_y ? "y" : ""), + (big_x ? "x" : ""), + c, width, + ((double) extents.height) / win->f_height, + ((double) extents.width) / win->f_width, + buffer)); + } else if (!skip) { + skip = True; + TRACE(("\t...skipping\n")); + } + if (big_y) + ++too_high; + if (big_x) + ++too_wide; + ++count; + } + } + TRACE(("}} %u total, %u too-high, %u too-wide\n", count, too_high, too_wide)); +} +#define DUMP_XFT(xw, data) dumpXft(xw, data) +#else +#define DUMP_XFT(xw, data) /* nothing */ +#endif + +/* + * Check if this is a FC_COLOR font, which fontconfig misrepresents to "fix" a + * problem with web browsers. As of 2018/12 (4 years later), Xft does not work + * with that. Even with this workaround, fontconfig has at least one bug which + * causes it to crash (Debian #917034). + */ +#ifdef FC_COLOR +#define GetFcBool(pattern, what) \ + (FcPatternGetBool(pattern, what, 0, &fcbogus) == FcResultMatch) + +static Boolean +isBogusXft(XftFont *font) +{ + Boolean result = False; + if (font != 0) { + FcBool fcbogus; + if (GetFcBool(font->pattern, FC_COLOR) && fcbogus) { + TRACE(("...matched color-bitmap font\n")); + result = True; + } else if (GetFcBool(font->pattern, FC_OUTLINE) && !fcbogus) { + TRACE(("...matched non-outline font\n")); + /* This is legal for regular bitmap fonts - fontconfig attempts to + * find a match - but problematic for misencoded color-bitmap fonts. + */ + } + } + return result; +} +#endif + +#if OPT_BOX_CHARS +static void +setBrokenBoxChars(XtermWidget xw, Bool state) +{ + TRACE(("setBrokenBoxChars %s\n", BtoS(state))); + term->work.broken_box_chars = (Boolean) state; + TScreenOf(xw)->broken_box_chars = (Boolean) state; + update_font_boxchars(); +} + +#else +#define setBrokenBoxChars(xw, state) /* nothing */ +#endif + +static Boolean +checkedXftWidth(Display *dpy, + XTermXftFonts *source, + unsigned limit, + Dimension *width, + FcChar32 c) +{ + Boolean result = False; + + if (FcCharSetHasChar(source->font->charset, c)) { + XGlyphInfo extents; + + result = True; + XftTextExtents32(dpy, source->font, &c, 1, &extents); + if (*width < extents.width && extents.width <= limit) { + *width = extents.width; + } + } + return result; +} + +static int +checkXftWidth(XtermWidget xw, XTermXftFonts *target, XTermXftFonts *source) +{ + FcChar32 c; + FcChar32 last = xtermXftLastChar(source->font); + Dimension limit = (Dimension) source->font->max_advance_width; + Dimension width = 0; + Dimension width2 = 0; + int failed = 0; +#if OPT_WIDE_CHARS + Cardinal n; +#endif + + target->font = source->font; + target->pattern = source->pattern; + target->map.min_width = 0; + target->map.max_width = limit; + +#if OPT_WIDE_CHARS + /* + * Check if the line-drawing characters are all provided in the font. + * If so, take that into account for the cell-widths. + */ + for (n = 0; n < XtNumber(unicode_boxes) - 1; ++n) { + if (!checkedXftWidth(XtDisplay(xw), + source, + limit, + &width2, unicode_boxes[n].code)) { + width2 = 0; + TRACE(("font omits U+%04X line-drawing symbol\n", + unicode_boxes[n].code)); + break; + } + } +#else + (void) width2; +#endif + + if (width2 > 0) { + Dimension check = (Dimension) (limit + 1) / 2; + TRACE(("font provides VT100-style line-drawing\n")); + /* + * The "VT100 line-drawing" characters happen to be all "ambiguous + * width" in Unicode's scheme. That means that they could be twice as + * wide as the Latin-1 characters. + */ +#define FC_ERR(n) (1.2 * (n)) + if (width2 > FC_ERR(check)) { + TRACE(("line-drawing characters appear to be double-width (ignore)\n")); + setBrokenBoxChars(xw, True); + } else if (width2 > width) { + width = width2; + } + } else { + TRACE(("font does NOT provide VT100-style line-drawing\n")); + setBrokenBoxChars(xw, True); + } + + /* + * For each printable code, ask what its width is. Given the maximum width + * for those, we have a reasonable estimate of the single-column width. + * + * Ignore control characters - their extent information is misleading. + */ + for (c = 32; c < 256; ++c) { + if (CharWidth(c) <= 0) + continue; + if (FcCharSetHasChar(source->font->charset, c)) { + (void) checkedXftWidth(XtDisplay(xw), + source, + target->map.max_width, + &width, c); + } + } + + /* + * Sometimes someone uses a symbol font which has no useful ASCII or + * Latin-1 characters. Allow that, in case they did it intentionally. + */ + if (width == 0) { + failed = 1; + if (last >= 256) { + width = target->map.max_width; + } + } + target->map.min_width = width; + target->map.mixed = (target->map.max_width >= (target->map.min_width + 1)); + return failed; +} + +#if OPT_REPORT_FONTS +static void +reportXftFonts(XtermWidget xw, + XftFont *fp, + const char *name, + const char *tag, + XftPattern *match) +{ + if (resource.reportFonts) { + char buffer[1024]; + FcChar32 first_char = xtermXftFirstChar(fp); + FcChar32 last_char = xtermXftLastChar(fp); + FcChar32 ch; + unsigned missing = 0; + + printf("Loaded XftFonts(%s[%s])\n", name, tag); + + for (ch = first_char; ch <= last_char; ++ch) { + if (xtermXftMissing(xw, fp, ch)) { + ++missing; + } + } + printf("\t\tfirst char: %u\n", first_char); + printf("\t\tlast char: %u\n", last_char); + printf("\t\tmissing-chars: %u\n", missing); + printf("\t\tpresent-chars: %u\n", (last_char - first_char) + 1 - missing); + + if (XftNameUnparse(match, buffer, (int) sizeof(buffer))) { + char *target; + char *source = buffer; + while ((target = strtok(source, ":")) != 0) { + printf("\t%s\n", target); + source = 0; + } + } + fflush(stdout); + } +} +#else +#define reportXftFonts(xw, result, name, tag, match) /* empty */ +#endif /* OPT_REPORT_FONTS */ + +/* + * Xft discards the pattern-match during open-pattern if the result happens to + * match a currently-open file, but provides no clue to the caller when it does + * this. That is, closing a font-file may leave the data in Xft's cache, while + * opening a file may free the data used for the match. + * + * Because of this problem, we cannot reliably refer to the pattern-match data + * if it may have been seen before. + */ +Boolean +maybeXftCache(XtermWidget xw, XftFont *font) +{ + Boolean result = False; + if (font != 0) { + TScreen *screen = TScreenOf(xw); + ListXftFonts *p; + for (p = screen->list_xft_fonts; p != 0; p = p->next) { + if (p->font == font) { + result = True; + break; + } + } + if (!result) { + p = TypeXtMalloc(ListXftFonts); + if (p != 0) { + p->font = font; + p->next = screen->list_xft_fonts; + screen->list_xft_fonts = p; + } + } + } + return result; +} + +/* + * Drop an entry from the cache, and close the font. + */ +void +closeCachedXft(TScreen *screen, XftFont *font) +{ + if (font != 0) { + ListXftFonts *p, *q; + + for (p = screen->list_xft_fonts, q = 0; p != 0; q = p, p = p->next) { + if (p->font == font) { + XftFontClose(screen->display, font); + if (q != 0) { + q->next = p->next; + } else { + screen->list_xft_fonts = p->next; + } + free(p); + break; + } + } + } +} + +static XftFont * +xtermOpenXft(XtermWidget xw, const char *name, XftPattern *pat, const char *tag) +{ + TScreen *screen = TScreenOf(xw); + Display *dpy = screen->display; + XftResult status; + XftFont *result = 0; + + TRACE(("xtermOpenXft(name=%s, tag=%s)\n", name, tag)); + if (pat != 0) { + XftPattern *match; + + FcConfigSubstitute(NULL, pat, FcMatchPattern); + XftDefaultSubstitute(dpy, DefaultScreen(dpy), pat); + + match = FcFontMatch(NULL, pat, &status); + if (match != 0) { + Boolean maybeReopened = False; + result = XftFontOpenPattern(dpy, match); +#ifdef FC_COLOR + if (result != 0) { + if (isBogusXft(result)) { + XftFontClose(dpy, result); + result = 0; + maybeReopened = True; + } + } +#endif + if (result != 0) { + TRACE(("...matched %s font\n", tag)); + if (!maybeXftCache(xw, result)) { + reportXftFonts(xw, result, name, tag, match); + } + } else { + TRACE(("...could not open %s font\n", tag)); + if (!maybeReopened) + XftPatternDestroy(match); + if (xw->misc.fontWarnings >= fwAlways) { + cannotFont(xw, "open", tag, name); + } + } + } else { + TRACE(("...did not match %s font\n", tag)); + if (xw->misc.fontWarnings >= fwResource) { + cannotFont(xw, "match", tag, name); + } + } + } + return result; +} + +#if OPT_SHIFT_FONTS +/* + * Don't make a dependency on the math library for a single function. + * (Newton Raphson). + */ +static double +dimSquareRoot(double value) +{ + double result = 0.0; + if (value > 0.0) { + int n; + double older = value; + for (n = 0; n < 10; ++n) { + double delta = (older * older - value) / (2.0 * older); + double newer = older - delta; + older = newer; + result = newer; + if (delta > -0.001 && delta < 0.001) + break; + } + } + return result; +} +#endif + +#ifdef DEBUG_XFT +static void +trace_xft_glyph(TScreen *screen, XftFont *font, FT_Face face, int code, const char *name) +{ + if (!XftGlyphExists(screen->display, font, code)) { + TRACE(("Xft glyph U+%04X missing :%s\n", code, name)); + } else if (FT_Load_Char(face, code, FT_LOAD_RENDER) == 0) { + FT_GlyphSlot g = face->glyph; + TRACE(("Xft glyph U+%04X size(%3d,%3d) at(%3d,%3d) :%s\n", + code, + g->bitmap.rows, g->bitmap.width, + g->bitmap_top, g->bitmap_left, + name)); + } +} + +#if OPT_WIDE_CHARS +static void +trace_xft_line_drawing(TScreen *screen, XftFont *font, FT_Face face) +{ + int n; + for (n = 0; unicode_boxes[n].code != 0; ++n) { + trace_xft_glyph(screen, font, face, unicode_boxes[n].code, + unicode_boxes[n].name); + } +} +#else +#define trace_xft_line_drawing(screen, font, face) /* nothing */ +#endif +#endif /* DEBUG_XFT */ + +/* + * Check if the line-drawing characters do not fill the bounding box. If so, + * they're not useful. + */ +#if OPT_BOX_CHARS +static void +linedrawing_gaps(XtermWidget xw, XftFont *font) +{ + Boolean broken; + +#if OPT_WIDE_CHARS + TScreen *screen = TScreenOf(xw); + int n; + FT_Face face; + face = XftLockFace(font); + broken = False; + for (n = 0; unicode_boxes[n].code; ++n) { + unsigned code = unicode_boxes[n].code; + + if (!XftGlyphExists(screen->display, font, code)) { + TRACE(("Xft glyph U+%04X is missing\n", code)); + broken = True; + break; + } + + if (FT_Load_Char(face, code, FT_LOAD_RENDER) == 0) { + FT_GlyphSlot g = face->glyph; + TRACE(("Xft glyph U+%04X size(%3d,%3d) at(%3d,%3d) :%s\n", + code, + g->bitmap.rows, g->bitmap.width, + g->bitmap_top, g->bitmap_left, + unicode_boxes[n].name)); + /* + * While it is possible for badly-designed fonts to have line + * drawing characters which do not meet, FreeType aggravates the + * situation with its rounding. Check for an obvious case where + * the weights at the ends of a vertical line do not add up. That + * shows up as two under-weight rows at the beginning/end of the + * bitmap. + */ + if (code == 0x2502) { + unsigned r, c; + unsigned mids = 0, ends = 0; + unsigned char *data = g->bitmap.buffer; + + switch (g->bitmap.pixel_mode) { + case FT_PIXEL_MODE_MONO: + /* FALLTHRU */ + case FT_PIXEL_MODE_GRAY: + for (r = 0; r < (unsigned) g->bitmap.rows; ++r) { + unsigned k = r * (unsigned) g->bitmap.pitch; + unsigned sum = 0; + for (c = 0; c < (unsigned) g->bitmap.width; ++c) { + unsigned xx = 0; + switch (g->bitmap.pixel_mode) { + case FT_PIXEL_MODE_MONO: + xx = (data[k + (c / 8)] >> (c % 8)) & 1; + break; + case FT_PIXEL_MODE_GRAY: + xx = data[k + c]; + break; + } + sum += xx; + TRACE2((" %2x", xx)); + } + TRACE2((" = %u\n", sum)); + if (r > 0 && (r + 1) < (unsigned) g->bitmap.rows) { + mids = sum; + } else { + ends += sum; + } + } + TRACE(("...compare middle %u vs ends %u\n", mids, ends)); + if ((mids > ends) && (g->bitmap.rows < 16)) + broken = True; + break; + default: + TRACE(("FIXME pixel_mode %d not handled\n", + g->bitmap.pixel_mode)); + break; + } + if (broken) + break; + } + /* + * The factor of two accounts for line-drawing that goes through + * the middle of a cell, possibly leaving half of the cell unused. + * A horizontal line has to extend the full width of the cell. + */ + switch (unicode_boxes[n].high) { + case 1: + if ((unsigned) g->bitmap.rows < (unsigned) FontHeight(screen)) { + TRACE(("...bitmap is shorter than full-cell (%u vs %u)\n", + (unsigned) g->bitmap.rows, + (unsigned) FontHeight(screen))); + broken = True; + } + break; + case 2: + if ((unsigned) (g->bitmap.rows * 2) < (unsigned) FontHeight(screen)) { + TRACE(("...bitmap is too short for half-cell (%u vs %u)\n", + (unsigned) (g->bitmap.rows * 2), + (unsigned) FontHeight(screen))); + broken = True; + } + break; + } + switch (unicode_boxes[n].wide) { + case 1: + if ((unsigned) g->bitmap.width < (unsigned) FontWidth(screen)) { + TRACE(("...bitmap is narrower than full-cell (%u vs %u)\n", + (unsigned) g->bitmap.width, + (unsigned) FontWidth(screen))); + broken = True; + } + break; + case 2: + if ((unsigned) (g->bitmap.width * 2) < (unsigned) FontWidth(screen)) { + TRACE(("...bitmap is too narrow for half-cell (%u vs %u)\n", + (unsigned) (g->bitmap.width * 2), + (unsigned) FontWidth(screen))); + broken = True; + } + break; + } + if (broken) + break; + } + } + XftUnlockFace(font); +#else + (void) font; + broken = True; +#endif + + if (broken) { + TRACE(("Xft line-drawing would not work\n")); + setBrokenBoxChars(xw, True); + } +} +#endif /* OPT_BOX_CHARS */ + +/* + * Given the Xft font metrics, determine the actual font size. This is used + * for each font to ensure that normal, bold and italic fonts follow the same + * rule. + */ +static void +setRenderFontsize(XtermWidget xw, VTwin *win, XftFont *font, const char *tag) +{ + if (font != 0) { + TScreen *screen = TScreenOf(xw); + int width, height, ascent, descent; +#ifdef DEBUG_XFT + int n; + FT_Face face; + FT_Size size; + FT_Size_Metrics metrics; + Boolean scalable; + Boolean is_fixed; + Boolean debug_xft = False; + + face = XftLockFace(font); + size = face->size; + metrics = size->metrics; + is_fixed = FT_IS_FIXED_WIDTH(face); + scalable = FT_IS_SCALABLE(face); + trace_xft_line_drawing(screen, font, face); + for (n = 32; n < 127; ++n) { + char name[80]; + sprintf(name, "letter \"%c\"", n); + trace_xft_glyph(screen, font, face, n, name); + } + XftUnlockFace(font); + + /* freetype's inconsistent for this sign */ + metrics.descender = -metrics.descender; + +#define TR_XFT "Xft metrics: " +#define D_64(name) ((double)(metrics.name)/64.0) +#define M_64(a,b) ((font->a * 64) != metrics.b) +#define BOTH(a,b) D_64(b), M_64(a,b) ? "*" : "" + + debug_xft = (M_64(ascent, ascender) + || M_64(descent, descender) + || M_64(height, height) + || M_64(max_advance_width, max_advance)); + + TRACE(("Xft font is %sscalable, %sfixed-width\n", + is_fixed ? "" : "not ", + scalable ? "" : "not ")); + + if (debug_xft) { + TRACE(("Xft font size %d+%d vs %d by %d\n", + font->ascent, + font->descent, + font->height, + font->max_advance_width)); + TRACE((TR_XFT "ascender %6.2f%s\n", BOTH(ascent, ascender))); + TRACE((TR_XFT "descender %6.2f%s\n", BOTH(descent, descender))); + TRACE((TR_XFT "height %6.2f%s\n", BOTH(height, height))); + TRACE((TR_XFT "max_advance %6.2f%s\n", BOTH(max_advance_width, max_advance))); + } else { + TRACE((TR_XFT "matches font\n")); + } +#endif + + width = font->max_advance_width; + height = font->height; + ascent = font->ascent; + descent = font->descent; + if (screen->force_xft_height && height < ascent + descent) { + TRACE(("...height is less than ascent + descent (%u vs %u)\n", + height, ascent + descent)); + if ((ascent + descent) > (height + 1)) { + /* this happens less than 10% of the time */ + --ascent; + --descent; + TRACE(("...decrement both ascent and descent before retry\n")); + } else if (ascent > descent) { + /* this is the usual case */ + --ascent; + TRACE(("...decrement ascent before retry\n")); + } else { + /* this could happen, though rare... */ + --descent; + TRACE(("...decrement descent before retry\n")); + } + height = ascent + descent; + font->ascent = ascent; + font->descent = descent; + TRACE(("...updated height %d vs %d (ascent %d, descent %d)\n", + height, ascent + descent, ascent, descent)); + } + if (is_double_width_font_xft(screen->display, font)) { + TRACE(("...reduce width from %d to %d\n", width, width >> 1)); + width >>= 1; + } + if (tag == 0) { + SetFontWidth(screen, win, width); + SetFontHeight(screen, win, height); + win->f_ascent = ascent; + win->f_descent = descent; + TRACE(("setRenderFontsize result %dx%d (%d+%d)\n", + width, height, ascent, descent)); + } else if (win->f_width < width || + win->f_height < height || + win->f_ascent < ascent || + win->f_descent < descent) { + TRACE(("setRenderFontsize %s changed %dx%d (%d+%d) to %dx%d (%d+%d)\n", + tag, + win->f_width, win->f_height, win->f_ascent, win->f_descent, + width, height, ascent, descent)); + + SetFontWidth(screen, win, width); + SetFontHeight(screen, win, height); + win->f_ascent = ascent; + win->f_descent = descent; + } else { + TRACE(("setRenderFontsize %s unchanged\n", tag)); + } +#if OPT_BOX_CHARS + if (!screen->broken_box_chars && (tag == 0)) { + linedrawing_gaps(xw, font); + } +#endif + } +} +#endif + +static void +checkFontInfo(int value, const char *tag, int failed) +{ + if (value == 0 || failed) { + if (value == 0) { + xtermWarning("Selected font has no non-zero %s for ISO-8859-1 encoding\n", tag); + exit(1); + } else { + xtermWarning("Selected font has no valid %s for ISO-8859-1 encoding\n", tag); + } + } +} + +#if OPT_RENDERFONT +void +xtermCloseXft(TScreen *screen, XTermXftFonts *pub) +{ + if (pub->font != 0) { + Cardinal n; + + closeCachedXft(screen, pub->font); + pub->font = 0; + + if (pub->pattern) { + XftPatternDestroy(pub->pattern); + pub->pattern = 0; + } + if (pub->fontset) { + XftFontSetDestroy(pub->fontset); + pub->fontset = 0; + } + + for (n = 0; n < pub->limit; ++n) { + if (pub->cache[n].font) { + closeCachedXft(screen, pub->cache[n].font); + } + } + } +} + +/* + * Get the faceName/faceNameDoublesize resource setting. + */ +String +getFaceName(XtermWidget xw, Bool wideName) +{ +#if OPT_RENDERWIDE + String result = (wideName + ? FirstItemOf(xw->work.fonts.xft.list_w) + : CurrentXftFont(xw)); +#else + String result = CurrentXftFont(xw); + (void) wideName; +#endif + return x_nonempty(result); +} + +/* + * If we change the faceName, we'll have to re-acquire all of the fonts that + * are derived from it. + */ +void +setFaceName(XtermWidget xw, const char *value) +{ + TScreen *screen = TScreenOf(xw); + Boolean changed = (Boolean) ((CurrentXftFont(xw) == 0) + || strcmp(CurrentXftFont(xw), value)); + + if (changed) { + int n; + + CurrentXftFont(xw) = x_strdup(value); + for (n = 0; n < NMENUFONTS; ++n) { + int e; + xw->misc.face_size[n] = -1.0; + for (e = 0; e < fMAX; ++e) { + xtermCloseXft(screen, getMyXftFont(xw, e, n)); + } + } + } +} +#endif + +/* + * Compute useful values for the font/window sizes + */ +void +xtermComputeFontInfo(XtermWidget xw, + VTwin *win, + XFontStruct *font, + int sbwidth) +{ + TScreen *screen = TScreenOf(xw); + + int i, j, width, height; +#if OPT_RENDERFONT + int fontnum = screen->menu_font_number; +#endif + int failed = 0; + +#if OPT_RENDERFONT + /* + * xterm contains a lot of references to fonts, assuming they are fixed + * size. This chunk of code overrides the actual font-selection (see + * drawXtermText()), if the user has selected render-font. All of the + * font-loading for fixed-fonts still goes on whether or not this chunk + * overrides it. + */ + if (UsingRenderFont(xw) && fontnum >= 0) { + String face_name = getFaceName(xw, False); + XTermXftFonts norm = screen->renderFontNorm[fontnum]; + XTermXftFonts bold = screen->renderFontBold[fontnum]; + XTermXftFonts ital = screen->renderFontItal[fontnum]; + XTermXftFonts btal = screen->renderFontBtal[fontnum]; +#if OPT_RENDERWIDE + XTermXftFonts wnorm = screen->renderWideNorm[fontnum]; + XTermXftFonts wbold = screen->renderWideBold[fontnum]; + XTermXftFonts wital = screen->renderWideItal[fontnum]; + XTermXftFonts wbtal = screen->renderWideBtal[fontnum]; +#endif + + if (norm.font == 0 && !IsEmpty(face_name)) { + XftPattern *pat; + double face_size; + + TRACE(("xtermComputeFontInfo font %d: norm(face %s, size %.1f)\n", + fontnum, face_name, + xw->misc.face_size[fontnum])); + + TRACE(("Using Xft %d\n", XftVersion)); + TRACE(("Using FontConfig %d\n", FC_VERSION)); + + fillInFaceSize(xw, fontnum); + face_size = (double) xw->misc.face_size[fontnum]; + + /* + * By observation (there is no documentation), XftPatternBuild is + * cumulative. Build the bold- and italic-patterns on top of the + * normal pattern. + */ +#ifdef FC_COLOR +#define NormXftPattern \ + XFT_FAMILY, XftTypeString, "mono", \ + FC_COLOR, XftTypeBool, FcFalse, \ + FC_OUTLINE, XftTypeBool, FcTrue, \ + XFT_SIZE, XftTypeDouble, face_size +#else +#define NormXftPattern \ + XFT_FAMILY, XftTypeString, "mono", \ + XFT_SIZE, XftTypeDouble, face_size +#endif + +#define BoldXftPattern(norm) \ + XFT_WEIGHT, XftTypeInteger, XFT_WEIGHT_BOLD, \ + XFT_CHAR_WIDTH, XftTypeInteger, norm.font->max_advance_width + +#define ItalXftPattern(norm) \ + XFT_SLANT, XftTypeInteger, XFT_SLANT_ITALIC, \ + XFT_CHAR_WIDTH, XftTypeInteger, norm.font->max_advance_width + +#define BtalXftPattern(norm) \ + XFT_WEIGHT, XftTypeInteger, XFT_WEIGHT_BOLD, \ + XFT_SLANT, XftTypeInteger, XFT_SLANT_ITALIC, \ + XFT_CHAR_WIDTH, XftTypeInteger, norm.font->max_advance_width + +#if OPT_WIDE_ATTRS +#define HAVE_ITALICS 1 +#define FIND_ITALICS ((pat = XftNameParse(face_name)) != 0) +#elif OPT_ISO_COLORS +#define HAVE_ITALICS 1 +#define FIND_ITALICS (screen->italicULMode && (pat = XftNameParse(face_name)) != 0) +#else +#define HAVE_ITALICS 0 +#endif + +#if OPT_DEC_CHRSET + freeall_DoubleFT(xw); +#endif + if ((pat = XftNameParse(face_name)) != 0) { +#define OPEN_XFT(name, tag) name.font = xtermOpenXft(xw, face_name, name.pattern, tag) + norm.pattern = XftPatternDuplicate(pat); + XftPatternBuild(norm.pattern, + NormXftPattern, + (void *) 0); + OPEN_XFT(norm, "normal"); + + if (norm.font != 0) { + bold.pattern = XftPatternDuplicate(pat); + XftPatternBuild(bold.pattern, + NormXftPattern, + BoldXftPattern(norm), + (void *) 0); + OPEN_XFT(bold, "bold"); + +#if HAVE_ITALICS + if (FIND_ITALICS) { + ital.pattern = XftPatternDuplicate(pat); + XftPatternBuild(ital.pattern, + NormXftPattern, + ItalXftPattern(norm), + (void *) 0); + OPEN_XFT(ital, "italic"); + btal.pattern = XftPatternDuplicate(pat); + XftPatternBuild(btal.pattern, + NormXftPattern, + BtalXftPattern(norm), + (void *) 0); + OPEN_XFT(btal, "bold-italic"); + } +#endif + + /* + * FIXME: just assume that the corresponding font has no + * graphics characters. + */ + if (screen->fnt_boxes) { + screen->fnt_boxes = 0; + TRACE(("Xft opened - will %suse internal line-drawing characters\n", + screen->fnt_boxes ? "not " : "")); + } + } + + CACHE_XFT(screen->renderFontNorm, norm); + + CACHE_XFT(screen->renderFontBold, bold); + if (norm.font != 0 && !bold.font) { + noUsableXft(xw, "bold"); + XftPatternDestroy(bold.pattern); + bold.pattern = XftPatternDuplicate(pat); + XftPatternBuild(bold.pattern, + NormXftPattern, + (void *) 0); + OPEN_XFT(bold, "bold"); + failed = 0; + CACHE_XFT(screen->renderFontBold, bold); + } +#if HAVE_ITALICS + CACHE_XFT(screen->renderFontItal, ital); + if (norm.font != 0 && !ital.font) { + noUsableXft(xw, "italic"); + XftPatternDestroy(ital.pattern); + ital.pattern = XftPatternDuplicate(pat); + XftPatternBuild(ital.pattern, + NormXftPattern, + (void *) 0); + OPEN_XFT(ital, "italics"); + failed = 0; + CACHE_XFT(screen->renderFontItal, ital); + } + CACHE_XFT(screen->renderFontBtal, btal); + if (norm.font != 0 && !btal.font) { + noUsableXft(xw, "bold italic"); + XftPatternDestroy(btal.pattern); + btal.pattern = XftPatternDuplicate(pat); + XftPatternBuild(btal.pattern, + NormXftPattern, + (void *) 0); + OPEN_XFT(btal, "bold-italics"); + failed = 0; + CACHE_XFT(screen->renderFontBtal, btal); + } +#endif + XftPatternDestroy(pat); + } else { + failed = 1; + } +#undef OPEN_XFT + + /* + * See xtermXftDrawString(). A separate double-width font is nice + * to have, but not essential. + */ +#if OPT_RENDERWIDE + if (norm.font != 0 && screen->wide_chars) { + int char_width = norm.font->max_advance_width * 2; + double aspect = ((FirstItemOf(xw->work.fonts.xft.list_w) + || screen->renderFontNorm[fontnum].map.mixed) + ? 1.0 + : 2.0); + + face_name = getFaceName(xw, True); + TRACE(("xtermComputeFontInfo wide(face %s, char_width %d)\n", + NonNull(face_name), + char_width)); + +#define WideXftPattern \ + XFT_FAMILY, XftTypeString, "mono", \ + XFT_SIZE, XftTypeDouble, face_size, \ + XFT_SPACING, XftTypeInteger, XFT_MONO, \ + XFT_CHAR_WIDTH, XftTypeInteger, char_width, \ + FC_ASPECT, XftTypeDouble, aspect + + if (!IsEmpty(face_name) && (pat = XftNameParse(face_name)) + != 0) { +#define OPEN_XFT(name, tag) name.font = xtermOpenXft(xw, face_name, name.pattern, tag) + wnorm.pattern = XftPatternDuplicate(pat); + XftPatternBuild(wnorm.pattern, + WideXftPattern, + (void *) 0); + OPEN_XFT(wnorm, "wide"); + + if (wnorm.font != 0) { + wbold.pattern = XftPatternDuplicate(pat); + XftPatternBuild(wbold.pattern, + WideXftPattern, + BoldXftPattern(wnorm), + (void *) 0); + OPEN_XFT(wbold, "wide-bold"); + +#if HAVE_ITALICS + if (FIND_ITALICS) { + wital.pattern = XftPatternDuplicate(pat); + XftPatternBuild(wital.pattern, + WideXftPattern, + ItalXftPattern(wnorm), + (void *) 0); + OPEN_XFT(wital, "wide-italic"); + } + CACHE_XFT(screen->renderWideBtal, wbtal); + if (!wbtal.font) { + noUsableXft(xw, "wide bold"); + XftPatternDestroy(wbtal.pattern); + wbtal.pattern = XftPatternDuplicate(pat); + XftPatternBuild(wbtal.pattern, + WideXftPattern, + (void *) 0); + OPEN_XFT(wbtal, "wide-bold-italics"); + failed = 0; + CACHE_XFT(screen->renderWideBtal, wbtal); + } +#endif + } + + CACHE_XFT(screen->renderWideNorm, wnorm); + + CACHE_XFT(screen->renderWideBold, wbold); + if (wnorm.font != 0 && !wbold.font) { + noUsableXft(xw, "wide-bold"); + XftPatternDestroy(wbold.pattern); + wbold.pattern = XftPatternDuplicate(pat); + XftPatternBuild(bold.pattern, + WideXftPattern, + (void *) 0); + OPEN_XFT(wbold, "wide-bold"); + failed = 0; + CACHE_XFT(screen->renderWideBold, bold); + } + + CACHE_XFT(screen->renderWideItal, wital); + if (wnorm.font != 0 && !wital.font) { + noUsableXft(xw, "wide-italic"); + XftPatternDestroy(wital.pattern); + wital.pattern = XftPatternDuplicate(pat); + XftPatternBuild(wital.pattern, + WideXftPattern, + (void *) 0); + OPEN_XFT(wital, "wide-italic"); + failed = 0; + CACHE_XFT(screen->renderWideItal, wital); + } + + XftPatternDestroy(pat); + } +#undef OPEN_XFT + } +#endif /* OPT_RENDERWIDE */ + } + if (norm.font == 0) { + TRACE(("...no TrueType font found for number %d, disable menu entry\n", fontnum)); + xw->work.render_font = False; + update_font_renderfont(); + /* now we will fall through into the bitmap fonts */ + } else { + setBrokenBoxChars(xw, False); + setRenderFontsize(xw, win, norm.font, NULL); + setRenderFontsize(xw, win, bold.font, "bold"); + setRenderFontsize(xw, win, ital.font, "ital"); + setRenderFontsize(xw, win, btal.font, "btal"); +#if OPT_BOX_CHARS + setupPackedFonts(xw); + + if (screen->force_packed) { + XTermXftFonts *use = &(screen->renderFontNorm[fontnum]); + SetFontHeight(screen, win, use->font->ascent + use->font->descent); + SetFontWidth(screen, win, use->map.min_width); + TRACE(("...packed TrueType font %dx%d vs %d\n", + win->f_height, + win->f_width, + use->map.max_width)); + } +#endif + DUMP_XFT(xw, &(screen->renderFontNorm[fontnum])); + } + } + /* + * Are we handling a bitmap font? + */ + else +#endif /* OPT_RENDERFONT */ + { + if (is_double_width_font(font) && !(screen->fnt_prop)) { + SetFontWidth(screen, win, font->min_bounds.width); + } else { + SetFontWidth(screen, win, font->max_bounds.width); + } + SetFontHeight(screen, win, font->ascent + font->descent); + win->f_ascent = font->ascent; + win->f_descent = font->descent; + } + i = 2 * screen->border + sbwidth; + j = 2 * screen->border; + width = MaxCols(screen) * win->f_width + i; + height = MaxRows(screen) * win->f_height + j; + win->fullwidth = (Dimension) width; + win->fullheight = (Dimension) height; + win->width = width - i; + win->height = height - j; + + TRACE(("xtermComputeFontInfo window %dx%d (full %dx%d), fontsize %dx%d (asc %d, dsc %d)\n", + win->height, + win->width, + win->fullheight, + win->fullwidth, + win->f_height, + win->f_width, + win->f_ascent, + win->f_descent)); + + checkFontInfo(win->f_height, "height", failed); + checkFontInfo(win->f_width, "width", failed); +} + +/* save this information as a side-effect for double-sized characters */ +static void +xtermSaveFontInfo(TScreen *screen, XFontStruct *font) +{ + screen->fnt_wide = (Dimension) (font->max_bounds.width); + screen->fnt_high = (Dimension) (font->ascent + font->descent); + TRACE(("xtermSaveFontInfo %dx%d\n", screen->fnt_high, screen->fnt_wide)); +} + +/* + * After loading a new font, update the structures that use its size. + */ +void +xtermUpdateFontInfo(XtermWidget xw, Bool doresize) +{ + TScreen *screen = TScreenOf(xw); + + int scrollbar_width; + VTwin *win = &(screen->fullVwin); + +#if USE_DOUBLE_BUFFER + discardRenderDraw(TScreenOf(xw)); +#endif /* USE_DOUBLE_BUFFER */ + + scrollbar_width = (xw->misc.scrollbar + ? (screen->scrollWidget->core.width + + BorderWidth(screen->scrollWidget)) + : 0); + xtermComputeFontInfo(xw, win, GetNormalFont(screen, fNorm)->fs, scrollbar_width); + xtermSaveFontInfo(screen, GetNormalFont(screen, fNorm)->fs); + + if (doresize) { + if (VWindow(screen)) { + xtermClear(xw); + } + TRACE(("xtermUpdateFontInfo {{\n")); + DoResizeScreen(xw); /* set to the new natural size */ + ResizeScrollBar(xw); + Redraw(); + TRACE(("... }} xtermUpdateFontInfo\n")); +#ifdef SCROLLBAR_RIGHT + updateRightScrollbar(xw); +#endif + } + xtermSetCursorBox(screen); +} + +#if OPT_BOX_CHARS || OPT_REPORT_FONTS + +/* + * Returns true if the given character is missing from the specified font. + */ +Bool +xtermMissingChar(unsigned ch, XTermFonts * font) +{ + Bool result = False; + XFontStruct *fs = font->fs; + XCharStruct *pc = 0; + + if (fs == NULL) { + result = True; + } else if (fs->max_byte1 == 0) { +#if OPT_WIDE_CHARS + if (ch < 256) +#endif + { + CI_GET_CHAR_INFO_1D(fs, E2A(ch), pc); + } + } +#if OPT_WIDE_CHARS + else { + unsigned row = (ch >> 8); + unsigned col = (ch & 0xff); + CI_GET_CHAR_INFO_2D(fs, row, col, pc); + } +#endif + + if (pc == 0 || CI_NONEXISTCHAR(pc)) { + TRACE2(("xtermMissingChar %#04x (!exists), %d cells\n", + ch, CharWidth(ch))); + result = True; + } + if (ch < KNOWN_MISSING) { + font->known_missing[ch] = (Char) (result ? 2 : 1); + } + return result; +} +#endif + +#if OPT_BOX_CHARS +/* + * The grid is arbitrary, enough resolution that nothing's lost in + * initialization. + */ +#define BOX_HIGH 60 +#define BOX_WIDE 60 + +#define MID_HIGH (BOX_HIGH/2) +#define MID_WIDE (BOX_WIDE/2) + +#define CHR_WIDE ((9*BOX_WIDE)/10) +#define CHR_HIGH ((9*BOX_HIGH)/10) + +/* + * ...since we'll scale the values anyway. + */ +#define Scale_XY(n,d,f) ((int)(n) * ((int)(f))) / (d) +#define SCALED_X(n) Scale_XY(n, BOX_WIDE, font_width) +#define SCALED_Y(n) Scale_XY(n, BOX_HIGH, font_height) +#define SCALE_X(n) n = SCALED_X(n) +#define SCALE_Y(n) n = SCALED_Y(n) + +#define SEG(x0,y0,x1,y1) x0,y0, x1,y1 + +/* + * Draw the given graphic character, if it is simple enough (i.e., a + * line-drawing character). + */ +void +xtermDrawBoxChar(XTermDraw * params, + unsigned ch, + GC gc, + int x, + int y, + int cells) +{ + TScreen *screen = TScreenOf(params->xw); + /* *INDENT-OFF* */ + static const short glyph_ht[] = { + SEG(1*BOX_WIDE/10, 0, 1*BOX_WIDE/10,5*MID_HIGH/6), /* H */ + SEG(6*BOX_WIDE/10, 0, 6*BOX_WIDE/10,5*MID_HIGH/6), + SEG(1*BOX_WIDE/10,5*MID_HIGH/12,6*BOX_WIDE/10,5*MID_HIGH/12), + SEG(2*BOX_WIDE/10, MID_HIGH, CHR_WIDE, MID_HIGH), /* T */ + SEG(6*BOX_WIDE/10, MID_HIGH, 6*BOX_WIDE/10, CHR_HIGH), + -1 + }, glyph_ff[] = { + SEG(1*BOX_WIDE/10, 0, 6*BOX_WIDE/10, 0), /* F */ + SEG(1*BOX_WIDE/10,5*MID_HIGH/12,6*CHR_WIDE/12,5*MID_HIGH/12), + SEG(1*BOX_WIDE/10, 0, 0*BOX_WIDE/3, 5*MID_HIGH/6), + SEG(1*BOX_WIDE/3, MID_HIGH, CHR_WIDE, MID_HIGH), /* F */ + SEG(1*BOX_WIDE/3, 8*MID_HIGH/6,10*CHR_WIDE/12,8*MID_HIGH/6), + SEG(1*BOX_WIDE/3, MID_HIGH, 1*BOX_WIDE/3, CHR_HIGH), + -1 + }, glyph_lf[] = { + SEG(1*BOX_WIDE/10, 0, 1*BOX_WIDE/10,9*MID_HIGH/12), /* L */ + SEG(1*BOX_WIDE/10,9*MID_HIGH/12,6*BOX_WIDE/10,9*MID_HIGH/12), + SEG(1*BOX_WIDE/3, MID_HIGH, CHR_WIDE, MID_HIGH), /* F */ + SEG(1*BOX_WIDE/3, 8*MID_HIGH/6,10*CHR_WIDE/12,8*MID_HIGH/6), + SEG(1*BOX_WIDE/3, MID_HIGH, 1*BOX_WIDE/3, CHR_HIGH), + -1 + }, glyph_nl[] = { + SEG(1*BOX_WIDE/10,5*MID_HIGH/6, 1*BOX_WIDE/10, 0), /* N */ + SEG(1*BOX_WIDE/10, 0, 5*BOX_WIDE/6, 5*MID_HIGH/6), + SEG(5*BOX_WIDE/6, 5*MID_HIGH/6, 5*BOX_WIDE/6, 0), + SEG(1*BOX_WIDE/3, MID_HIGH, 1*BOX_WIDE/3, CHR_HIGH), /* L */ + SEG(1*BOX_WIDE/3, CHR_HIGH, CHR_WIDE, CHR_HIGH), + -1 + }, glyph_vt[] = { + SEG(1*BOX_WIDE/10, 0, 5*BOX_WIDE/12,5*MID_HIGH/6), /* V */ + SEG(5*BOX_WIDE/12,5*MID_HIGH/6, 5*BOX_WIDE/6, 0), + SEG(2*BOX_WIDE/10, MID_HIGH, CHR_WIDE, MID_HIGH), /* T */ + SEG(6*BOX_WIDE/10, MID_HIGH, 6*BOX_WIDE/10, CHR_HIGH), + -1 + }, plus_or_minus[] = + { + SEG( 0, 5*BOX_HIGH/6, CHR_WIDE, 5*BOX_HIGH/6), + SEG( MID_WIDE, 2*BOX_HIGH/6, MID_WIDE, 4*BOX_HIGH/6), + SEG( 0, 3*BOX_HIGH/6, CHR_WIDE, 3*BOX_HIGH/6), + -1 + }, lower_right_corner[] = + { + SEG( 0, MID_HIGH, MID_WIDE, MID_HIGH), + SEG( MID_WIDE, MID_HIGH, MID_WIDE, 0), + -1 + }, upper_right_corner[] = + { + SEG( 0, MID_HIGH, MID_WIDE, MID_HIGH), + SEG( MID_WIDE, MID_HIGH, MID_WIDE, BOX_HIGH), + -1 + }, upper_left_corner[] = + { + SEG( MID_WIDE, MID_HIGH, BOX_WIDE, MID_HIGH), + SEG( MID_WIDE, MID_HIGH, MID_WIDE, BOX_HIGH), + -1 + }, lower_left_corner[] = + { + SEG( MID_WIDE, 0, MID_WIDE, MID_HIGH), + SEG( MID_WIDE, MID_WIDE, BOX_WIDE, MID_HIGH), + -1 + }, cross[] = + { + SEG( 0, MID_HIGH, BOX_WIDE, MID_HIGH), + SEG( MID_WIDE, 0, MID_WIDE, BOX_HIGH), + -1 + }, scan_line_1[] = + { + SEG( 0, 0, BOX_WIDE, 0), + -1 + }, scan_line_3[] = + { + SEG( 0, BOX_HIGH/4, BOX_WIDE, BOX_HIGH/4), + -1 + }, scan_line_7[] = + { + SEG( 0, MID_HIGH, BOX_WIDE, MID_HIGH), + -1 + }, scan_line_9[] = + { + SEG( 0, 3*BOX_HIGH/4, BOX_WIDE, 3*BOX_HIGH/4), + -1 + }, horizontal_line[] = + { + SEG( 0, BOX_HIGH, BOX_WIDE, BOX_HIGH), + -1 + }, left_tee[] = + { + SEG( MID_WIDE, 0, MID_WIDE, BOX_HIGH), + SEG( MID_WIDE, MID_HIGH, BOX_WIDE, MID_HIGH), + -1 + }, right_tee[] = + { + SEG( MID_WIDE, 0, MID_WIDE, BOX_HIGH), + SEG( MID_WIDE, MID_HIGH, 0, MID_HIGH), + -1 + }, bottom_tee[] = + { + SEG( 0, MID_HIGH, BOX_WIDE, MID_HIGH), + SEG( MID_WIDE, 0, MID_WIDE, MID_HIGH), + -1 + }, top_tee[] = + { + SEG( 0, MID_HIGH, BOX_WIDE, MID_HIGH), + SEG( MID_WIDE, MID_HIGH, MID_WIDE, BOX_HIGH), + -1 + }, vertical_line[] = + { + SEG( MID_WIDE, 0, MID_WIDE, BOX_HIGH), + -1 + }, less_than_or_equal[] = + { + SEG( CHR_WIDE, BOX_HIGH/3, 0, MID_HIGH), + SEG( CHR_WIDE, 2*BOX_HIGH/3, 0, MID_HIGH), + SEG( 0, 3*BOX_HIGH/4, CHR_WIDE, 3*BOX_HIGH/4), + -1 + }, greater_than_or_equal[] = + { + SEG( 0, BOX_HIGH/3, CHR_WIDE, MID_HIGH), + SEG( 0, 2*BOX_HIGH/3, CHR_WIDE, MID_HIGH), + SEG( 0, 3*BOX_HIGH/4, CHR_WIDE, 3*BOX_HIGH/4), + -1 + }, greek_pi[] = + { + SEG( 0, MID_HIGH, CHR_WIDE, MID_HIGH), + SEG(5*CHR_WIDE/6, MID_HIGH, 5*CHR_WIDE/6, CHR_HIGH), + SEG(2*CHR_WIDE/6, MID_HIGH, 2*CHR_WIDE/6, CHR_HIGH), + -1 + }, not_equal_to[] = + { + SEG(2*BOX_WIDE/3, 1*BOX_HIGH/3, 1*BOX_WIDE/3, CHR_HIGH), + SEG( 0, 2*BOX_HIGH/3, CHR_WIDE, 2*BOX_HIGH/3), + SEG( 0, MID_HIGH, CHR_WIDE, MID_HIGH), + -1 + }; + /* *INDENT-ON* */ + + static const short *lines[] = + { + 0, /* 00 (unused) */ + 0, /* 01 diamond */ + 0, /* 02 box */ + glyph_ht, /* 03 HT */ + glyph_ff, /* 04 FF */ + 0, /* 05 CR */ + glyph_lf, /* 06 LF */ + 0, /* 07 degrees (small circle) */ + plus_or_minus, /* 08 */ + glyph_nl, /* 09 */ + glyph_vt, /* 0A */ + lower_right_corner, /* 0B */ + upper_right_corner, /* 0C */ + upper_left_corner, /* 0D */ + lower_left_corner, /* 0E */ + cross, /* 0F */ + scan_line_1, /* 10 */ + scan_line_3, /* 11 */ + scan_line_7, /* 12 */ + scan_line_9, /* 13 */ + horizontal_line, /* 14 */ + left_tee, /* 15 */ + right_tee, /* 16 */ + bottom_tee, /* 17 */ + top_tee, /* 18 */ + vertical_line, /* 19 */ + less_than_or_equal, /* 1A */ + greater_than_or_equal, /* 1B */ + greek_pi, /* 1C */ + not_equal_to, /* 1D */ + 0, /* 1E LB */ + 0, /* 1F bullet */ + }; + + GC gc2; + CgsEnum cgsId = (ch == 2) ? gcDots : gcLine; + VTwin *cgsWin = WhichVWin(screen); + const short *p; + unsigned font_width = (((params->draw_flags & DOUBLEWFONT) ? 2U : 1U) + * screen->fnt_wide); + unsigned font_height = (((params->draw_flags & DOUBLEHFONT) ? 2U : 1U) + * screen->fnt_high); + + if (cells > 1) + font_width *= (unsigned) cells; + +#if OPT_WIDE_CHARS + /* + * Try to show line-drawing characters if we happen to be in UTF-8 + * mode, but have gotten an old-style font. + */ + if (screen->utf8_mode +#if OPT_RENDERFONT + && !UsingRenderFont(params->xw) +#endif + && (ch > 127) + && (ch != UCS_REPL)) { + int which = (params->attr_flags & BOLD) ? fBold : fNorm; + unsigned n; + for (n = 1; n < 32; n++) { + if (xtermMissingChar(n, getNormalFont(screen, which))) + continue; + if (dec2ucs(screen, n) != ch) + continue; + TRACE(("...use xterm-style linedrawing U+%04X ->%d\n", ch, n)); + ch = n; + break; + } + } +#endif + +#if OPT_VT52_MODE + if (!(screen->vtXX_level)) { + switch (ch) { + case 6: + ch = 7; + break; + default: + ch = 256; + break; + } + } +#endif + + TRACE(("DRAW_BOX(%d) cell %dx%d at %d,%d%s\n", + ch, font_height, font_width, y, x, + (ch >= (sizeof(lines) / sizeof(lines[0])) + ? "-BAD" + : ""))); + + if (cgsId == gcDots) { + setCgsFont(params->xw, cgsWin, cgsId, getCgsFont(params->xw, cgsWin, gc)); + setCgsFore(params->xw, cgsWin, cgsId, getCgsFore(params->xw, cgsWin, gc)); + setCgsBack(params->xw, cgsWin, cgsId, getCgsBack(params->xw, cgsWin, gc)); + } else { + setCgsFont(params->xw, cgsWin, cgsId, getCgsFont(params->xw, cgsWin, gc)); + setCgsFore(params->xw, cgsWin, cgsId, getCgsBack(params->xw, cgsWin, gc)); + setCgsBack(params->xw, cgsWin, cgsId, getCgsBack(params->xw, cgsWin, gc)); + } + gc2 = getCgsGC(params->xw, cgsWin, cgsId); + + if (!(params->draw_flags & NOBACKGROUND)) { + XFillRectangle(screen->display, VDrawable(screen), gc2, x, y, + font_width, + font_height); + } + + setCgsFont(params->xw, cgsWin, cgsId, getCgsFont(params->xw, cgsWin, gc)); + setCgsFore(params->xw, cgsWin, cgsId, getCgsFore(params->xw, cgsWin, gc)); + setCgsBack(params->xw, cgsWin, cgsId, getCgsBack(params->xw, cgsWin, gc)); + gc2 = getCgsGC(params->xw, cgsWin, cgsId); + + XSetLineAttributes(screen->display, gc2, + (params->attr_flags & BOLD) + ? ((font_height > 12) + ? font_height / 12 + : 1) + : ((font_height > 16) + ? font_height / 16 + : 1), + LineSolid, + CapProjecting, + JoinMiter); + + if (ch == 1) { /* diamond */ + XPoint points[5]; + int npoints = 5, n; + + points[0].x = MID_WIDE; + points[0].y = BOX_HIGH / 4; + + points[1].x = 8 * BOX_WIDE / 8; + points[1].y = MID_HIGH; + + points[2].x = points[0].x; + points[2].y = 3 * BOX_HIGH / 4; + + points[3].x = 0 * BOX_WIDE / 8; + points[3].y = points[1].y; + + points[4].x = points[0].x; + points[4].y = points[0].y; + + for (n = 0; n < npoints; ++n) { + points[n].x = (short) SCALED_X(points[n].x); + points[n].y = (short) SCALED_Y(points[n].y); + points[n].x = (short) (points[n].x + x); + points[n].y = (short) (points[n].y + y); + } + + XFillPolygon(screen->display, + VDrawable(screen), gc2, + points, npoints, + Convex, CoordModeOrigin); + } else if (ch == 7) { /* degrees */ + unsigned width = (BOX_WIDE / 3); + int x_coord = MID_WIDE - (int) (width / 2); + int y_coord = MID_HIGH - (int) width; + + SCALE_X(x_coord); + SCALE_Y(y_coord); + width = (unsigned) SCALED_X(width); + + XDrawArc(screen->display, + VDrawable(screen), gc2, + x + x_coord, y + y_coord, width, width, + 0, + 360 * 64); + } else if (ch == 0x1f) { /* bullet */ + unsigned width = 7 * BOX_WIDE / 10; + int x_coord = MID_WIDE - (int) (width / 3); + int y_coord = MID_HIGH - (int) (width / 3); + + SCALE_X(x_coord); + SCALE_Y(y_coord); + width = (unsigned) SCALED_X(width); + + XDrawArc(screen->display, + VDrawable(screen), gc2, + x + x_coord, y + y_coord, width, width, + 0, + 360 * 64); + } else if (ch < (sizeof(lines) / sizeof(lines[0])) + && (p = lines[ch]) != 0) { + int coord[4]; + int n = 0; + while (*p >= 0) { + coord[n++] = *p++; + if (n == 4) { + SCALE_X(coord[0]); + SCALE_Y(coord[1]); + SCALE_X(coord[2]); + SCALE_Y(coord[3]); + XDrawLine(screen->display, + VDrawable(screen), gc2, + x + coord[0], y + coord[1], + x + coord[2], y + coord[3]); + n = 0; + } + } + } else if (screen->force_all_chars) { + /* bounding rectangle, for debugging */ + XDrawRectangle(screen->display, VDrawable(screen), gc2, x, y, + font_width - 1, + font_height - 1); + } +} +#endif /* OPT_BOX_CHARS */ + +#if OPT_RENDERFONT +/* + * Check if the glyph is defined in the given font, and (try to) filter out + * cases where double-width glyphs are stuffed into a single-width outline. + */ +static Boolean +foundXftGlyph(XtermWidget xw, XftFont *font, unsigned wc) +{ + TScreen *screen = TScreenOf(xw); + Boolean result = False; + + if (font != 0 && XftGlyphExists(screen->display, font, wc)) { + int expect; + + if ((expect = CharWidth(wc)) > 0) { + XGlyphInfo gi; + int actual; + + XftTextExtents32(screen->display, font, &wc, 1, &gi); + /* + * Some (more than a few) fonts are sloppy; allow 10% outside + * the bounding box to accommodate them. + */ + actual = ((gi.xOff * 10) >= (11 * FontWidth(screen))) ? 2 : 1; + if (actual <= expect) { + /* allow double-cell if wcwidth agrees */ + result = True; + } else { + TRACE(("SKIP U+%04X %d vs %d (%d vs %d)\n", + wc, gi.xOff, FontWidth(screen), actual, expect)); + } + } else { + result = True; + } + } + return result; +} + +static void +markXftOpened(XtermWidget xw, XTermXftFonts *which, Cardinal n, unsigned wc) +{ + if (which->cache[n].usage != xcOpened) { + which->opened++; + which->cache[n].usage = xcOpened; + /* XFT_DEBUG=3 will show useful context for this */ + if (getenv("XFT_DEBUG") != 0) { + printf("xterm: matched U+%04X in fontset #%d [%u:%u]\n", + wc, n + 1, + which->opened, + xw->work.max_fontsets); + } + } +} + +/* + * Check if the given character has a glyph known to Xft. If it is missing, + * try first to replace the font with a fallback that provides the glyph. + */ +XftFont * +findXftGlyph(XtermWidget xw, XftFont *given, unsigned wc) +{ + TScreen *screen = TScreenOf(xw); + XTermXftFonts *which = 0; + XftFont *result = 0; + /* workaround for interface changes... */ + int fontnum = screen->menu_font_number; + static int table[] = + { + offsetof(TScreen, renderFontNorm), + offsetof(TScreen, renderFontBold), + offsetof(TScreen, renderFontItal), + offsetof(TScreen, renderFontBtal), +#if OPT_RENDERWIDE + offsetof(TScreen, renderWideNorm), + offsetof(TScreen, renderWideBold), + offsetof(TScreen, renderWideItal), + offsetof(TScreen, renderWideBtal), +#endif + }; + Cardinal n; + FcResult status; + const char *tag = 0; + + /* if fontsets are not wanted, just leave */ + if (xw->work.max_fontsets == 0) { + return 0; + } + + /* ignore codes in private use areas */ + if ((wc >= 0xe000 && wc <= 0xf8ff) + || (wc >= 0xf0000 && wc <= 0xffffd) + || (wc >= 0x100000 && wc <= 0x10fffd)) { + return 0; + } + /* the end of the BMP is reserved for non-characters */ + if (wc >= 0xfff0 && wc <= 0xffff) { + return 0; + } + + for (n = 0; n < XtNumber(table); ++n) { + XTermXftFonts *check = (XTermXftFonts *) ((void *) ((char *) screen + + table[n])); + if (check[fontnum].font == given) { + which = &check[fontnum]; + tag = whichFontEnum(n); + break; + } + } + if (which != 0) { + if (which->fontset == 0) { + FcFontSet *sortedFonts; + FcPattern *myPattern; + int j; + + myPattern = FcPatternDuplicate(which->pattern); + + FcPatternAddBool(myPattern, FC_SCALABLE, FcTrue); + FcPatternAddInteger(myPattern, FC_CHAR_WIDTH, given->max_advance_width); + + FcConfigSubstitute(FcConfigGetCurrent(), + myPattern, + FcMatchPattern); + FcDefaultSubstitute(myPattern); + + which->fontset = FcFontSetCreate(); + + sortedFonts = FcFontSort(0, myPattern, FcTrue, 0, &status); + + if (!sortedFonts || sortedFonts->nfont <= 0) { + xtermWarning("did not find any usable TrueType font\n"); + return 0; + } + which->limit = (unsigned) sortedFonts->nfont; + which->cache = TypeCallocN(XTermXftCache, (which->limit + 1)); + for (j = 0; j < sortedFonts->nfont; j++) { + FcPattern *font_pattern; + + font_pattern = FcFontRenderPrepare(FcConfigGetCurrent(), + myPattern, + sortedFonts->fonts[j]); + if (font_pattern) + FcFontSetAdd(which->fontset, font_pattern); + } + + FcFontSetSortDestroy(sortedFonts); + FcPatternDestroy(myPattern); + } + if (which->fontset != 0) { + XftFont *check; + Cardinal empty = which->limit; + + for (n = 0; n < which->limit; ++n) { + XftCache usage = which->cache[n].usage; + if (usage == xcEmpty) { + if (empty > n) + empty = n; + } else if (usage == xcOpened + || (usage == xcUnused + && (which->opened < xw->work.max_fontsets))) { + check = which->cache[n].font; + if (foundXftGlyph(xw, check, wc)) { + markXftOpened(xw, which, n, wc); + result = check; + TRACE_FALLBACK(xw, "old", wc, (int) n, result); + break; + } + } + } + + if ((result == 0) + && (empty < which->limit) + && (which->opened < xw->work.max_fontsets)) { + FcPattern *myPattern = 0; + FcPattern *myReport = 0; + + for (n = empty; n < which->limit; ++n) { + if (which->cache[n].usage >= xcBogus) + continue; + if (resource.reportFonts) { + myReport = FcPatternDuplicate(which->fontset->fonts[n]); + } + myPattern = FcPatternDuplicate(which->fontset->fonts[n]); + check = XftFontOpenPattern(screen->display, myPattern); + closeCachedXft(screen, which->cache[n].font); + (void) maybeXftCache(xw, check); + which->cache[n].font = check; + which->cache[n].usage = xcBogus; + if (check == 0) + continue; /* shouldn't happen... */ +#ifdef FC_COLOR + if (isBogusXft(check)) { + continue; + } +#endif + if (foundXftGlyph(xw, check, wc)) { + markXftOpened(xw, which, n, wc); + reportXftFonts(xw, check, "fallback", tag, myReport); + result = check; + TRACE_FALLBACK(xw, "new", wc, (int) n, result); + break; + } + /* + * The slot is opened, but we are not using it. + */ + which->cache[n].usage = xcUnused; + } + } + } + } + return result; +} + +/* + * Check if the given character has a glyph known to Xft. If it is missing, + * return true. + * + * see xc/lib/Xft/xftglyphs.c + */ +Bool +xtermXftMissing(XtermWidget xw, XftFont *font, unsigned wc) +{ + Bool result = False; + + if (font != 0) { + TScreen *screen = TScreenOf(xw); + if (!XftGlyphExists(screen->display, font, wc)) { +#if OPT_WIDE_CHARS + TRACE2(("xtermXftMissing %d (dec=%#x, ucs=%#x)\n", + wc, ucs2dec(screen, wc), dec2ucs(screen, wc))); +#else + TRACE2(("xtermXftMissing %d\n", wc)); +#endif + result = True; + } + } + return result; +} +#endif /* OPT_RENDERFONT */ + +#if OPT_WIDE_CHARS +#define MY_UCS(ucs,dec) case ucs: result = dec; break +unsigned +ucs2dec(TScreen *screen, unsigned ch) +{ + unsigned result = ch; + + (void) screen; + if ((ch > 127) + && (ch != UCS_REPL)) { +#if OPT_VT52_MODE + if (screen != 0 && !(screen->vtXX_level)) { + /* + * Intentionally empty: it would be possible to use the built-in + * line-drawing fallback in xtermDrawBoxChar(), but for testing + * ncurses, this is good enough. + */ + ; + } else +#endif + switch (ch) { + MY_UCS(0x25ae, 0); /* black vertical rectangle */ + MY_UCS(0x25c6, 1); /* black diamond */ + MY_UCS(0x2592, 2); /* medium shade */ + MY_UCS(0x2409, 3); /* symbol for horizontal tabulation */ + MY_UCS(0x240c, 4); /* symbol for form feed */ + MY_UCS(0x240d, 5); /* symbol for carriage return */ + MY_UCS(0x240a, 6); /* symbol for line feed */ + MY_UCS(0x00b0, 7); /* degree sign */ + MY_UCS(0x00b1, 8); /* plus-minus sign */ + MY_UCS(0x2424, 9); /* symbol for newline */ + MY_UCS(0x240b, 10); /* symbol for vertical tabulation */ + MY_UCS(0x2518, 11); /* box drawings light up and left */ + MY_UCS(0x2510, 12); /* box drawings light down and left */ + MY_UCS(0x250c, 13); /* box drawings light down and right */ + MY_UCS(0x2514, 14); /* box drawings light up and right */ + MY_UCS(0x253c, 15); /* box drawings light vertical and horizontal */ + MY_UCS(0x23ba, 16); /* box drawings scan 1 */ + MY_UCS(0x23bb, 17); /* box drawings scan 3 */ + MY_UCS(0x2500, 18); /* box drawings light horizontal */ + MY_UCS(0x23bc, 19); /* box drawings scan 7 */ + MY_UCS(0x23bd, 20); /* box drawings scan 9 */ + MY_UCS(0x251c, 21); /* box drawings light vertical and right */ + MY_UCS(0x2524, 22); /* box drawings light vertical and left */ + MY_UCS(0x2534, 23); /* box drawings light up and horizontal */ + MY_UCS(0x252c, 24); /* box drawings light down and horizontal */ + MY_UCS(0x2502, 25); /* box drawings light vertical */ + MY_UCS(0x2264, 26); /* less-than or equal to */ + MY_UCS(0x2265, 27); /* greater-than or equal to */ + MY_UCS(0x03c0, 28); /* greek small letter pi */ + MY_UCS(0x2260, 29); /* not equal to */ + MY_UCS(0x00a3, 30); /* pound sign */ + MY_UCS(0x00b7, 31); /* middle dot */ + } + } + return result; +} + +#undef MY_UCS +#define MY_UCS(ucs,dec) case dec: result = ucs; break + +unsigned +dec2ucs(TScreen *screen, unsigned ch) +{ + unsigned result = ch; + + (void) screen; + if (xtermIsDecGraphic(ch)) { +#if OPT_VT52_MODE + if (screen != 0 && !(screen->vtXX_level)) { + switch (ch) { + MY_UCS(0x0020, 0); /* nbsp, treat as blank */ + MY_UCS(0x0020, 1); /* reserved, treat as blank */ + MY_UCS(0x25ae, 2); /* black vertical rectangle */ + MY_UCS(0x215f, 3); /* "1/" */ + MY_UCS(0x0020, 4); /* "3/", not in Unicode, ignore */ + MY_UCS(0x0020, 5); /* "5/", not in Unicode, ignore */ + MY_UCS(0x0020, 6); /* "7/", not in Unicode, ignore */ + MY_UCS(0x00b0, 7); /* degree sign */ + MY_UCS(0x00b1, 8); /* plus-minus sign */ + MY_UCS(0x2192, 9); /* right-arrow */ + MY_UCS(0x2026, 10); /* ellipsis */ + MY_UCS(0x00f7, 11); /* divide by */ + MY_UCS(0x2193, 12); /* down arrow */ + MY_UCS(0x23ba, 13); /* bar at scan 0 */ + MY_UCS(0x23ba, 14); /* bar at scan 1 */ + MY_UCS(0x23bb, 15); /* bar at scan 2 */ + MY_UCS(0x23bb, 16); /* bar at scan 3 */ + MY_UCS(0x23bc, 17); /* bar at scan 4 */ + MY_UCS(0x23bc, 18); /* bar at scan 5 */ + MY_UCS(0x23bd, 19); /* bar at scan 6 */ + MY_UCS(0x23bd, 20); /* bar at scan 7 */ + MY_UCS(0x2080, 21); /* subscript 0 */ + MY_UCS(0x2081, 22); /* subscript 1 */ + MY_UCS(0x2082, 23); /* subscript 2 */ + MY_UCS(0x2083, 24); /* subscript 3 */ + MY_UCS(0x2084, 25); /* subscript 4 */ + MY_UCS(0x2085, 26); /* subscript 5 */ + MY_UCS(0x2086, 27); /* subscript 6 */ + MY_UCS(0x2087, 28); /* subscript 7 */ + MY_UCS(0x2088, 29); /* subscript 8 */ + MY_UCS(0x2089, 30); /* subscript 9 */ + MY_UCS(0x00b6, 31); /* paragraph */ + } + } else +#endif + switch (ch) { + MY_UCS(0x25ae, 0); /* black vertical rectangle */ + MY_UCS(0x25c6, 1); /* black diamond */ + MY_UCS(0x2592, 2); /* medium shade */ + MY_UCS(0x2409, 3); /* symbol for horizontal tabulation */ + MY_UCS(0x240c, 4); /* symbol for form feed */ + MY_UCS(0x240d, 5); /* symbol for carriage return */ + MY_UCS(0x240a, 6); /* symbol for line feed */ + MY_UCS(0x00b0, 7); /* degree sign */ + MY_UCS(0x00b1, 8); /* plus-minus sign */ + MY_UCS(0x2424, 9); /* symbol for newline */ + MY_UCS(0x240b, 10); /* symbol for vertical tabulation */ + MY_UCS(0x2518, 11); /* box drawings light up and left */ + MY_UCS(0x2510, 12); /* box drawings light down and left */ + MY_UCS(0x250c, 13); /* box drawings light down and right */ + MY_UCS(0x2514, 14); /* box drawings light up and right */ + MY_UCS(0x253c, 15); /* box drawings light vertical and horizontal */ + MY_UCS(0x23ba, 16); /* box drawings scan 1 */ + MY_UCS(0x23bb, 17); /* box drawings scan 3 */ + MY_UCS(0x2500, 18); /* box drawings light horizontal */ + MY_UCS(0x23bc, 19); /* box drawings scan 7 */ + MY_UCS(0x23bd, 20); /* box drawings scan 9 */ + MY_UCS(0x251c, 21); /* box drawings light vertical and right */ + MY_UCS(0x2524, 22); /* box drawings light vertical and left */ + MY_UCS(0x2534, 23); /* box drawings light up and horizontal */ + MY_UCS(0x252c, 24); /* box drawings light down and horizontal */ + MY_UCS(0x2502, 25); /* box drawings light vertical */ + MY_UCS(0x2264, 26); /* less-than or equal to */ + MY_UCS(0x2265, 27); /* greater-than or equal to */ + MY_UCS(0x03c0, 28); /* greek small letter pi */ + MY_UCS(0x2260, 29); /* not equal to */ + MY_UCS(0x00a3, 30); /* pound sign */ + MY_UCS(0x00b7, 31); /* middle dot */ + } + } + return result; +} + +#endif /* OPT_WIDE_CHARS */ + +#if OPT_RENDERFONT || OPT_SHIFT_FONTS +static int +lookupOneFontSize(XtermWidget xw, int fontnum) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->menu_font_sizes[fontnum] == 0) { + XTermFonts fnt; + + memset(&fnt, 0, sizeof(fnt)); + screen->menu_font_sizes[fontnum] = -1; + if (xtermOpenFont(xw, screen->MenuFontName(fontnum), &fnt, True)) { + if (fontnum <= fontMenu_lastBuiltin + || strcmp(fnt.fn, DEFFONT)) { + screen->menu_font_sizes[fontnum] = FontSize(fnt.fs); + if (screen->menu_font_sizes[fontnum] <= 0) + screen->menu_font_sizes[fontnum] = -1; + } + xtermCloseFont(xw, &fnt); + } + } + return (screen->menu_font_sizes[fontnum] > 0); +} + +/* + * Cache the font-sizes so subsequent larger/smaller font actions will go fast. + */ +static void +lookupFontSizes(XtermWidget xw) +{ + int n; + + for (n = 0; n < NMENUFONTS; n++) { + (void) lookupOneFontSize(xw, n); + } +} +#endif /* OPT_RENDERFONT || OPT_SHIFT_FONTS */ + +#if OPT_RENDERFONT +static double +defaultFaceSize(void) +{ + double result; + float value; + + if (sscanf(DEFFACESIZE, "%f", &value) == 1) + result = (double) value; + else + result = 14.0; + return result; +} + +static void +fillInFaceSize(XtermWidget xw, int fontnum) +{ + TScreen *screen = TScreenOf(xw); + double face_size = (double) xw->misc.face_size[fontnum]; + + if (face_size <= 0.0) { +#if OPT_SHIFT_FONTS + /* + * If the user is switching font-sizes, make it follow by + * default the same ratios to the default as the fixed fonts + * would, for easy comparison. There will be some differences + * since the fixed fonts have a variety of height/width ratios, + * but this is simpler than adding another resource value - and + * as noted above, the data for the fixed fonts are available. + */ + (void) lookupOneFontSize(xw, 0); + if (fontnum == fontMenu_default) { + face_size = defaultFaceSize(); + } else if (lookupOneFontSize(xw, fontnum) + && (screen->menu_font_sizes[0] + != screen->menu_font_sizes[fontnum])) { + double ratio; + long num = screen->menu_font_sizes[fontnum]; + long den = screen->menu_font_sizes[0]; + + if (den <= 0) + den = 1; + ratio = dimSquareRoot((double) num / (double) den); + + face_size = (ratio * (double) xw->misc.face_size[0]); + TRACE(("scaled[%d] using %3ld/%ld = %.2f -> %f\n", + fontnum, num, den, ratio, face_size)); + } else +#endif + { +#define LikeBitmap(s) (((s) / 78.0) * (double) xw->misc.face_size[fontMenu_default]) + switch (fontnum) { + case fontMenu_font1: + face_size = LikeBitmap(2.0); + break; + case fontMenu_font2: + face_size = LikeBitmap(35.0); + break; + case fontMenu_font3: + face_size = LikeBitmap(60.0); + break; + default: + face_size = defaultFaceSize(); + break; + case fontMenu_font4: + face_size = LikeBitmap(90.0); + break; + case fontMenu_font5: + face_size = LikeBitmap(135.0); + break; + case fontMenu_font6: + face_size = LikeBitmap(200.0); + break; + } + TRACE(("builtin[%d] -> %f\n", fontnum, face_size)); + } + xw->misc.face_size[fontnum] = (float) face_size; + } +} + +/* no selection or escape */ +#define NMENU_RENDERFONTS (fontMenu_lastBuiltin + 1) + +/* + * Workaround for breakage in font-packages - check if all of the bitmap font + * sizes are the same, and if we're using TrueType fonts. + */ +static Boolean +useFaceSizes(XtermWidget xw) +{ + Boolean result = False; + + TRACE(("useFaceSizes {{\n")); + if (UsingRenderFont(xw)) { + Boolean nonzero = True; + int n; + + for (n = 0; n < NMENU_RENDERFONTS; ++n) { + if (xw->misc.face_size[n] <= (float) 0.0) { + nonzero = False; + break; + } + } + if (!nonzero) { + Boolean broken_fonts = True; + TScreen *screen = TScreenOf(xw); + long first; + + lookupFontSizes(xw); + first = screen->menu_font_sizes[0]; + for (n = 0; n < NMENUFONTS; n++) { + if (screen->menu_font_sizes[n] > 0 + && screen->menu_font_sizes[n] != first) { + broken_fonts = False; + break; + } + } + + if (broken_fonts) { + + TRACE(("bitmap fonts are broken - set faceSize resources\n")); + for (n = 0; n < NMENUFONTS; n++) { + fillInFaceSize(xw, n); + } + + } + } + result = True; + } + TRACE(("...}}useFaceSizes %d\n", result)); + return result; +} +#endif /* OPT_RENDERFONT */ + +#if OPT_SHIFT_FONTS +/* + * Find the index of a larger/smaller font (according to the sign of 'relative' + * and its magnitude), starting from the 'old' index. + */ +int +lookupRelativeFontSize(XtermWidget xw, int old, int relative) +{ + TScreen *screen = TScreenOf(xw); + int m = -1; + + TRACE(("lookupRelativeFontSize(old=%d, relative=%d)\n", old, relative)); + if (!IsIcon(screen)) { +#if OPT_RENDERFONT + if (useFaceSizes(xw)) { + TRACE(("...using FaceSize\n")); + if (relative != 0) { + int n; + for (n = 0; n < NMENU_RENDERFONTS; ++n) { + fillInFaceSize(xw, n); + if (xw->misc.face_size[n] > 0 && + xw->misc.face_size[n] != xw->misc.face_size[old]) { + int cmp_0 = ((xw->misc.face_size[n] > + xw->misc.face_size[old]) + ? relative + : -relative); + int cmp_m = ((m < 0) + ? 1 + : ((xw->misc.face_size[n] < + xw->misc.face_size[m]) + ? relative + : -relative)); + if (cmp_0 > 0 && cmp_m > 0) { + m = n; + } + } + } + } + } else +#endif + { + TRACE(("...using bitmap areas\n")); + lookupFontSizes(xw); + if (relative != 0) { + int n; + for (n = 0; n < NMENUFONTS; ++n) { + if (screen->menu_font_sizes[n] > 0 && + screen->menu_font_sizes[n] != + screen->menu_font_sizes[old]) { + int cmp_0 = ((screen->menu_font_sizes[n] > + screen->menu_font_sizes[old]) + ? relative + : -relative); + int cmp_m = ((m < 0) + ? 1 + : ((screen->menu_font_sizes[n] < + screen->menu_font_sizes[m]) + ? relative + : -relative)); + if (cmp_0 > 0 && cmp_m > 0) { + m = n; + } + } + } + } + } + TRACE(("...new index %d\n", m)); + if (m >= 0) { + if (relative > 1) + m = lookupRelativeFontSize(xw, m, relative - 1); + else if (relative < -1) + m = lookupRelativeFontSize(xw, m, relative + 1); + } + } + return m; +} + +/* ARGSUSED */ +void +HandleLargerFont(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + XtermWidget xw; + + TRACE(("Handle larger-vt-font for %p\n", (void *) w)); + if ((xw = getXtermWidget(w)) != 0) { + if (xw->misc.shift_fonts) { + TScreen *screen = TScreenOf(xw); + int m; + + m = lookupRelativeFontSize(xw, screen->menu_font_number, 1); + if (m >= 0) { + SetVTFont(xw, m, True, NULL); + } else { + Bell(xw, XkbBI_MinorError, 0); + } + } + } +} + +/* ARGSUSED */ +void +HandleSmallerFont(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + XtermWidget xw; + + TRACE(("Handle smaller-vt-font for %p\n", (void *) w)); + if ((xw = getXtermWidget(w)) != 0) { + if (xw->misc.shift_fonts) { + TScreen *screen = TScreenOf(xw); + int m; + + m = lookupRelativeFontSize(xw, screen->menu_font_number, -1); + if (m >= 0) { + SetVTFont(xw, m, True, NULL); + } else { + Bell(xw, XkbBI_MinorError, 0); + } + } + } +} +#endif /* OPT_SHIFT_FONTS */ + +int +xtermGetFont(const char *param) +{ + int fontnum; + + switch (param[0]) { + case 'd': + case 'D': + case '0': + fontnum = fontMenu_default; + break; + case '1': + fontnum = fontMenu_font1; + break; + case '2': + fontnum = fontMenu_font2; + break; + case '3': + fontnum = fontMenu_font3; + break; + case '4': + fontnum = fontMenu_font4; + break; + case '5': + fontnum = fontMenu_font5; + break; + case '6': + fontnum = fontMenu_font6; + break; + case 'e': + case 'E': + fontnum = fontMenu_fontescape; + break; + case 's': + case 'S': + fontnum = fontMenu_fontsel; + break; + default: + fontnum = -1; + break; + } + return fontnum; +} + +/* ARGSUSED */ +void +HandleSetFont(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + int fontnum; + VTFontNames fonts; + + memset(&fonts, 0, sizeof(fonts)); + + if (*param_count == 0) { + fontnum = fontMenu_default; + } else { + Cardinal maxparams = 1; /* total number of params allowed */ + int result = xtermGetFont(params[0]); + + switch (result) { + case fontMenu_default: /* FALLTHRU */ + case fontMenu_font1: /* FALLTHRU */ + case fontMenu_font2: /* FALLTHRU */ + case fontMenu_font3: /* FALLTHRU */ + case fontMenu_font4: /* FALLTHRU */ + case fontMenu_font5: /* FALLTHRU */ + case fontMenu_font6: /* FALLTHRU */ + break; + case fontMenu_fontescape: +#if OPT_WIDE_CHARS + maxparams = 5; +#else + maxparams = 3; +#endif + break; + case fontMenu_fontsel: + maxparams = 2; + break; + default: + Bell(xw, XkbBI_MinorError, 0); + return; + } + fontnum = result; + + if (*param_count > maxparams) { /* see if extra args given */ + Bell(xw, XkbBI_MinorError, 0); + return; + } + switch (*param_count) { /* assign 'em */ +#if OPT_WIDE_CHARS + case 5: + fonts.f_wb = x_strdup(params[4]); + /* FALLTHRU */ + case 4: + fonts.f_w = x_strdup(params[3]); +#endif + /* FALLTHRU */ + case 3: + fonts.f_b = x_strdup(params[2]); + /* FALLTHRU */ + case 2: + fonts.f_n = x_strdup(params[1]); + break; + } + } + + SetVTFont(xw, fontnum, True, &fonts); + } +} + +void +SetVTFont(XtermWidget xw, + int which, + Bool doresize, + const VTFontNames * fonts) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("SetVTFont(which=%d, f_n=%s, f_b=%s)\n", which, + (fonts && fonts->f_n) ? fonts->f_n : "", + (fonts && fonts->f_b) ? fonts->f_b : "")); + + if (IsIcon(screen)) { + Bell(xw, XkbBI_MinorError, 0); + } else if (which >= 0 && which < NMENUFONTS) { + VTFontNames myfonts; + + memset(&myfonts, 0, sizeof(myfonts)); + if (fonts != 0) + myfonts = *fonts; + + if (which == fontMenu_fontsel) { /* go get the selection */ + FindFontSelection(xw, myfonts.f_n, False); + } else { + int oldFont = screen->menu_font_number; + +#define USE_CACHED(field, name) \ + if (myfonts.field == 0) { \ + myfonts.field = x_strdup(screen->menu_font_names[which][name]); \ + TRACE(("set myfonts." #field " from menu_font_names[%d][" #name "] %s\n", \ + which, NonNull(myfonts.field))); \ + } else { \ + TRACE(("set myfonts." #field " reused\n")); \ + } +#define SAVE_FNAME(field, name) \ + if (myfonts.field != 0) { \ + if (screen->menu_font_names[which][name] == 0 \ + || strcmp(screen->menu_font_names[which][name], myfonts.field)) { \ + TRACE(("updating menu_font_names[%d][" #name "] to \"%s\"\n", \ + which, myfonts.field)); \ + FREE_STRING(screen->menu_font_names[which][name]); \ + screen->menu_font_names[which][name] = x_strdup(myfonts.field); \ + } \ + } + + USE_CACHED(f_n, fNorm); + USE_CACHED(f_b, fBold); +#if OPT_WIDE_CHARS + USE_CACHED(f_w, fWide); + USE_CACHED(f_wb, fWBold); +#endif + if (xtermLoadFont(xw, + &myfonts, + doresize, which)) { + /* + * If successful, save the data so that a subsequent query via + * OSC-50 will return the expected values. + */ + SAVE_FNAME(f_n, fNorm); + SAVE_FNAME(f_b, fBold); +#if OPT_WIDE_CHARS + SAVE_FNAME(f_w, fWide); + SAVE_FNAME(f_wb, fWBold); +#endif + } else { + (void) xtermLoadFont(xw, + xtermFontName(screen->MenuFontName(oldFont)), + doresize, oldFont); + Bell(xw, XkbBI_MinorError, 0); + } + FREE_FNAME(f_n); + FREE_FNAME(f_b); +#if OPT_WIDE_CHARS + FREE_FNAME(f_w); + FREE_FNAME(f_wb); +#endif + } + } else { + Bell(xw, XkbBI_MinorError, 0); + } + return; +} + +#if OPT_RENDERFONT +static void +trimSizeFromFace(char *face_name, float *face_size) +{ + char *first = strstr(face_name, ":size="); + if (first == 0) { + first = face_name; + } else { + first++; + } + if (!strncmp(first, "size=", (size_t) 5)) { + char *last = strchr(first, ':'); + char mark; + float value; + char extra; + TRACE(("...before trimming, font = \"%s\"\n", face_name)); + if (last == 0) + last = first + strlen(first); + mark = *last; + *last = '\0'; + if (sscanf(first, "size=%g%c", &value, &extra) == 1) { + TRACE(("...trimmed size from font: %g\n", value)); + if (face_size != 0) + *face_size = value; + } + if (mark) { + while ((*first++ = *++last) != '\0') { + ; + } + } else { + if (first != face_name) + --first; + *first = '\0'; + } + TRACE(("...after trimming, font = \"%s\"\n", face_name)); + } +} +#endif + +/* + * Save a font specification to the proper list. + */ +static void +save2FontList(XtermWidget xw, + const char *name, + XtermFontNames * fontnames, + VTFontEnum which, + const char *source, + Bool ttf) +{ + char *value; + size_t plen; + Bool marked = False; + Bool use_ttf = ttf; + + (void) xw; + + if (source == 0) + source = ""; + while (isspace(CharOf(*source))) + ++source; + + /* fontconfig patterns can contain ':' separators, but we'll treat + * a leading prefix specially to denote whether the pattern might be + * XLFD ("x" or "xlfd") versus Xft ("xft"). + */ + for (plen = 0; source[plen] != '\0'; ++plen) { + if (source[plen] == ':') { + marked = True; + switch (plen) { + case 0: + ++plen; /* trim leading ':' */ + break; + case 1: + if (!strncmp(source, "x", plen)) { + ++plen; + use_ttf = False; + } else { + marked = False; + } + break; + case 3: + if (!strncmp(source, "xft", plen)) { + ++plen; + use_ttf = True; + } else { + marked = False; + } + break; + case 4: + if (!strncmp(source, "xlfd", plen)) { + ++plen; + use_ttf = False; + } else { + marked = False; + } + break; + default: + marked = False; + plen = 0; + break; + } + break; + } + } + if (!marked) + plen = 0; + value = x_strtrim(source + plen); + if (value != 0) { + Bool success = False; +#if OPT_RENDERFONT + VTFontList *target = (use_ttf + ? &(fontnames->xft) + : &(fontnames->x11)); +#else + VTFontList *target = &(fontnames->x11); +#endif + char ***list = 0; + char **next = 0; + size_t count = 0; + + (void) use_ttf; + switch (which) { + case fNorm: + list = &(target->list_n); + break; + case fBold: + list = &(target->list_b); + break; +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE + case fItal: + list = &(target->list_i); + break; + case fBtal: + list = &(target->list_bi); + break; +#endif +#if OPT_WIDE_CHARS + case fWide: + list = &(target->list_w); + break; + case fWBold: + list = &(target->list_wb); + break; + case fWItal: + list = &(target->list_wi); + break; + case fWBtal: + list = &(target->list_wbi); + break; +#endif + case fMAX: + list = 0; + break; + } + + if (list != 0) { + success = True; + if (*list != 0) { + while ((*list)[count] != 0) { + if (IsEmpty((*list)[count])) { + TRACE(("... initial %s\n", value)); + free((*list)[count]); + break; + } else if (!strcmp(value, (*list)[count])) { + TRACE(("... duplicate %s\n", value)); + success = False; + break; + } + ++count; + } + } + if (success) { + next = realloc(*list, sizeof(char *) * (count + 2)); + if (next != 0) { +#if OPT_RENDERFONT + if (use_ttf) { + trimSizeFromFace(value, + (count == 0 && which == fNorm) + ? &(xw->misc.face_size[0]) + : (float *) 0); + } +#endif + next[count++] = value; + next[count] = 0; + *list = next; + TRACE(("... saved %s %s %lu:%s\n", + whichFontList(xw, target), + whichFontList2(xw, *list), + (unsigned long) count, + value)); + } else { + fprintf(stderr, + "realloc failure in save2FontList(%s)\n", + name); + freeFontList(list); + success = False; + } + } + } + if (success) { +#if (MAX_XFT_FONTS == MAX_XLFD_FONTS) + size_t limit = MAX_XFT_FONTS; +#else + size_t limit = use_ttf ? MAX_XFT_FONTS : MAX_XLFD_FONTS; +#endif + if (count > limit && *x_skip_blanks(value)) { + fprintf(stderr, "%s: too many fonts for %s, ignoring %s\n", + ProgramName, + whichFontEnum(which), + value); + if (list && *list) { + free((*list)[limit]); + (*list)[limit] = 0; + } + } + } else { + free(value); + } + } +} + +/* + * In principle, any of the font-name resources could be extended to be a list + * of font-names. That would be bad for performance, but as a basis for an + * extension, parse the font-name as a comma-separated list, creating/updating + * an array of font-names. + */ +void +allocFontList(XtermWidget xw, + const char *name, + XtermFontNames * target, + VTFontEnum which, + const char *source, + Bool ttf) +{ + char *blob; + + blob = x_strdup(source); + if (blob != 0) { + int n; + int pass; + char **list = 0; + + TRACE(("allocFontList %s %s '%s'\n", whichFontEnum(which), name, blob)); + + for (pass = 0; pass < 2; ++pass) { + unsigned count = 0; + if (pass) + list[0] = blob; + for (n = 0; blob[n] != '\0'; ++n) { + if (blob[n] == ',') { + ++count; + if (pass != 0) { + blob[n] = '\0'; + list[count] = blob + n + 1; + } + } + } + if (!pass) { + if (count == 0 && *blob == '\0') + break; + list = TypeCallocN(char *, count + 2); + if (list == 0) + break; + } + } + if (list) { + for (n = 0; list[n] != 0; ++n) { + if (*list[n]) { + save2FontList(xw, name, target, which, list[n], ttf); + } + } + free(list); + } + } + free(blob); +} + +static void +initFontList(XtermWidget xw, + const char *name, + XtermFontNames * target, + Bool ttf) +{ + int which; + + TRACE(("initFontList(%s)\n", name)); + for (which = 0; which < fMAX; ++which) { + save2FontList(xw, name, target, (VTFontEnum) which, "", ttf); + } +} + +void +initFontLists(XtermWidget xw) +{ + TRACE(("initFontLists\n")); + initFontList(xw, "x11 font", &(xw->work.fonts), False); +#if OPT_RENDERFONT + initFontList(xw, "xft font", &(xw->work.fonts), True); +#endif +#if OPT_LOAD_VTFONTS || OPT_WIDE_CHARS + initFontList(xw, "cached font", + &(xw->screen.cacheVTFonts.fonts), False); +#endif +} + +void +copyFontList(char ***targetp, char **source) +{ + freeFontList(targetp); + + if (source != 0) { + int pass; + size_t count; + + for (pass = 0; pass < 2; ++pass) { + for (count = 0; source[count] != 0; ++count) { + if (pass) + (*targetp)[count] = x_strdup(source[count]); + } + if (!pass) { + ++count; + *targetp = TypeCallocN(char *, count); + } + } + } else { + *targetp = TypeCallocN(char *, 2); + (*targetp)[0] = x_strdup(""); + } +} + +#if OPT_LOAD_VTFONTS || OPT_WIDE_CHARS +static Boolean +merge_sublist(char ***targetp, char **source) +{ + Boolean result = False; + if ((*targetp == 0 || IsEmpty(**targetp)) && !IsEmpty(*source)) { + copyFontList(targetp, source); + result = True; + } + return result; +} +#endif + +void +freeFontList(char ***targetp) +{ + if (targetp != 0) { + char **target = *targetp; + if (target != 0) { + int n; + for (n = 0; target[n] != 0; ++n) { + free(target[n]); + } + free(target); + *targetp = 0; + } + } +} + +void +freeFontLists(VTFontList * lists) +{ + int which; + + TRACE(("freeFontLists\n")); + for (which = 0; which < fMAX; ++which) { + char ***target = 0; + switch (which) { + case fNorm: + target = &(lists->list_n); + break; + case fBold: + target = &(lists->list_b); + break; +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE + case fItal: + target = &(lists->list_i); + break; + case fBtal: + target = &(lists->list_bi); + break; +#endif +#if OPT_WIDE_CHARS + case fWide: + target = &(lists->list_w); + break; + case fWBold: + target = &(lists->list_wb); + break; + case fWItal: + target = &(lists->list_wi); + break; + case fWBtal: + target = &(lists->list_wbi); + break; +#endif + default: + target = 0; + break; + } + freeFontList(target); + } +} + +/* + * Return a pointer to the XLFD font information for a given font class. + * XXX make this allocate the font on demand. + */ +XTermFonts * +getNormalFont(TScreen *screen, int which) +{ + XTermFonts *result = 0; + if (which >= 0 && which < fMAX) + result = GetNormalFont(screen, which); + return result; +} + +#if OPT_DEC_CHRSET +XTermFonts * +getDoubleFont(TScreen *screen, int which) +{ + XTermFonts *result = 0; + if ((int) which >= 0 && which < NUM_CHRSET) + result = GetDoubleFont(screen, which); + return result; +} + +#if OPT_RENDERFONT +XftFont * +getDoubleXftFont(XTermDraw * params, unsigned chrset, unsigned attr_flags) +{ + XftFont *result = 0; + + XtermWidget xw = params->xw; + TScreen *screen = TScreenOf(xw); + XftPattern *top_pattern; + int fontnum = screen->menu_font_number; + const char *face_name = getFaceName(xw, False); + + if (chrset != CSET_SWL + && (top_pattern = XftNameParse(face_name)) != 0) { + double face_size = (double) xw->misc.face_size[fontnum]; + XftPattern *sub_pattern = XftPatternDuplicate(top_pattern); + + switch (chrset) { + case CSET_DHL_TOP: + /* FALLTHRU */ + case CSET_DHL_BOT: + face_size *= 2; + XftPatternBuild(sub_pattern, + NormXftPattern, + (void *) 0); + break; + case CSET_DWL: + XftPatternBuild(sub_pattern, + NormXftPattern, + FC_ASPECT, XftTypeDouble, 2.0, + (void *) 0); + break; + } + if (attr_flags & BOLD) { + XftPatternBuild(sub_pattern, + XFT_WEIGHT, XftTypeInteger, XFT_WEIGHT_BOLD, + (void *) 0); + } + result = xtermOpenXft(xw, face_name, sub_pattern, "doublesize"); + } + return result; +} +#endif +#endif /* OPT_DEC_CHRSET */ + +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE +XTermFonts * +getItalicFont(TScreen *screen, int which) +{ + XTermFonts *result = 0; +#if OPT_WIDE_ATTRS + if (which >= 0 && which < fMAX) + result = GetItalicFont(screen, which); +#else + (void) screen; + (void) which; +#endif + return result; +} +#endif + +#if OPT_RENDERFONT +/* + * This returns a pointer to everything known about a given Xft font. + * XXX make this allocate the font on demand. + */ +XTermXftFonts * +getMyXftFont(XtermWidget xw, int which, int fontnum) +{ + TScreen *screen = TScreenOf(xw); + XTermXftFonts *result = 0; + if (fontnum >= 0 && fontnum < NMENUFONTS) { + switch ((VTFontEnum) which) { + case fNorm: + result = &(screen->renderFontNorm[fontnum]); + break; + case fBold: + result = &(screen->renderFontBold[fontnum]); + break; +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE + case fItal: + result = &(screen->renderFontItal[fontnum]); + break; + case fBtal: + result = &(screen->renderFontBtal[fontnum]); + break; +#endif +#if OPT_WIDE_CHARS + case fWide: + result = &(screen->renderWideNorm[fontnum]); + break; + case fWBold: + result = &(screen->renderWideBold[fontnum]); + break; + case fWItal: + result = &(screen->renderWideItal[fontnum]); + break; + case fWBtal: + result = &(screen->renderWideBtal[fontnum]); + break; +#endif + case fMAX: + break; + } + } + return result; +} + +XftFont * +getXftFont(XtermWidget xw, VTFontEnum which, int fontnum) +{ + XTermXftFonts *data = getMyXftFont(xw, (int) which, fontnum); + XftFont *result = 0; + if (data != 0) + result = data->font; + return result; +} +#endif + +const char * +whichFontEnum(VTFontEnum value) +{ + const char *result = "?"; +#define DATA(name) case name: result = #name; break + switch (value) { + DATA(fNorm); + DATA(fBold); +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE + DATA(fItal); + DATA(fBtal); +#endif +#if OPT_WIDE_CHARS + DATA(fWide); + DATA(fWBold); + DATA(fWItal); + DATA(fWBtal); +#endif + DATA(fMAX); + } +#undef DATA + return result; +} + +const char * +whichFontList(XtermWidget xw, VTFontList * value) +{ + const char *result = "?"; + if (value == &(xw->work.fonts.x11)) + result = "x11_fontnames"; +#if OPT_RENDERFONT + else if (value == &(xw->work.fonts.xft)) + result = "xft_fontnames"; +#endif +#if OPT_LOAD_VTFONTS || OPT_WIDE_CHARS + else if (value == &(xw->screen.cacheVTFonts.fonts.x11)) + result = "cached_fontnames"; +#endif + return result; +} + +static const char * +whichFontList2s(VTFontList * list, char **value) +{ + const char *result = 0; +#define DATA(name) if (value == (list->name)) result = #name + DATA(list_n); + DATA(list_b); +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE + DATA(list_i); + DATA(list_bi); +#endif +#if OPT_WIDE_CHARS + DATA(list_w); + DATA(list_wb); + DATA(list_wi); + DATA(list_wbi); +#endif +#undef DATA + return result; +} + +const char * +whichFontList2(XtermWidget xw, char **value) +{ + const char *result = 0; +#define DATA(name) (result = whichFontList2s(&(xw->name), value)) + if (DATA(work.fonts.x11) == 0) { +#if OPT_RENDERFONT + if (DATA(work.fonts.xft) == 0) +#endif +#if OPT_LOAD_VTFONTS || OPT_WIDE_CHARS + if (DATA(screen.cacheVTFonts.fonts.x11) == 0) +#endif + result = "?"; + } +#undef DATA + return result; +} diff --git a/ports/xterm/xterm-359/fontutils.h b/ports/xterm/xterm-359/fontutils.h new file mode 100644 index 0000000..9d530c5 --- /dev/null +++ b/ports/xterm/xterm-359/fontutils.h @@ -0,0 +1,178 @@ +/* $XTermId: fontutils.h,v 1.134 2019/11/12 10:05:06 tom Exp $ */ + +/* + * Copyright 1998-2018,2019 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +#ifndef included_fontutils_h +#define included_fontutils_h 1 + +#include +/* *INDENT-OFF* */ + +extern Bool xtermLoadDefaultFonts (XtermWidget /* xw */); +extern Bool xtermOpenFont (XtermWidget /* xw */, const char */* name */, XTermFonts * /* result */, Bool /* force */); +extern XTermFonts * getDoubleFont (TScreen * /* screen */, int /* which */); +extern XTermFonts * getItalicFont (TScreen * /* screen */, int /* which */); +extern XTermFonts * getNormalFont (TScreen * /* screen */, int /* which */); +extern const VTFontNames * defaultVTFontNames(XtermWidget /* xw */); +extern const VTFontNames * xtermFontName (const char */* normal */); +extern const char * whichFontEnum (VTFontEnum /* value */); +extern const char * whichFontList (XtermWidget /* xw */, VTFontList * /* value */); +extern const char * whichFontList2(XtermWidget /* xw */, char ** /* value */); +extern int lookupRelativeFontSize (XtermWidget /* xw */, int /* old */, int /* relative */); +extern int xtermGetFont (const char * /* param */); +extern int xtermLoadFont (XtermWidget /* xw */, const VTFontNames */* fonts */, Bool /* doresize */, int /* fontnum */); +extern void HandleSetFont PROTO_XT_ACTIONS_ARGS; +extern void SetVTFont (XtermWidget /* xw */, int /* i */, Bool /* doresize */, const VTFontNames */* fonts */); +extern void allocFontList (XtermWidget /* xw */, const char * /* name */, XtermFontNames * /* target */, VTFontEnum /* which */, const char * /* source */, Bool /* ttf */); +extern void copyFontList (char *** /* targetp */, char ** /* source */); +extern void initFontLists (XtermWidget /* xw */); +extern void freeFontList (char *** /* targetp */); +extern void freeFontLists (VTFontList * /* lists */); +extern void xtermCloseFont (XtermWidget /* xw */, XTermFonts * /* fnt */); +extern void xtermCloseFonts (XtermWidget /* xw */, XTermFonts * /* fnts[fMAX] */); +extern void xtermComputeFontInfo (XtermWidget /* xw */, VTwin */* win */, XFontStruct */* font */, int /* sbwidth */); +extern void xtermCopyFontInfo (XTermFonts * /* target */, XTermFonts * /* source */); +extern void xtermDerivedFont (const char * /* name */); +extern void xtermFreeFontInfo (XTermFonts * /* target */); +extern void xtermSetCursorBox (TScreen * /* screen */); +extern void xtermUpdateFontGCs (XtermWidget /* xw */, MyGetFont /* myfunc */); +extern void xtermUpdateFontInfo (XtermWidget /* xw */, Bool /* doresize */); + +#define getIconicFont(screen) (&((screen)->fnt_icon)) + +/* use these when "which" is constant, or known in-limits */ +#define GetNormalFont(screen, which) (&((screen)->fnts[which])) +#define GetDoubleFont(screen, which) (&((screen)->double_fonts[which])) +#if OPT_WIDE_ATTRS +#define GetItalicFont(screen, which) (&((screen)->ifnts[which])) +#else +#define GetItalicFont(screen, which) 0 +#endif + +#define FirstItemOf(vector) ((vector) ? (vector)[0] : 0) +#define CurrentXftFont(xw) ((xw)->work.fonts.xft.list_n[0]) +#define DefaultFontN(xw) ((xw)->work.fonts.x11.list_n[0]) +#define DefaultFontB(xw) ((xw)->work.fonts.x11.list_b[0]) +#define DefaultFontW(xw) ((xw)->work.fonts.x11.list_w[0]) +#define DefaultFontWB(xw) ((xw)->work.fonts.x11.list_wb[0]) + +#if OPT_DEC_CHRSET +extern char *xtermSpecialFont (XTermDraw * /* params */); +#endif + +#define FontLacksMetrics(font) \ + ((font)->fs != 0 \ + && ((font)->fs->per_char == 0)) + +#define FontIsIncomplete(font) \ + ((font)->fs != 0 \ + && (font)->fs->per_char != 0 \ + && !(font)->fs->all_chars_exist) + +#if OPT_BOX_CHARS + +#define ForceBoxChars(screen,ch) \ + (xtermIsDecGraphic(ch) \ + && (screen)->force_box_chars) + + /* + * Keep track of (some) characters to make the check for missing + * characters faster. If the character is known to be missing, + * the cache value is '2'. If we have checked the character, the + * cached value is '1'. + */ +#if OPT_WIDE_CHARS +#define CheckedKnownMissing(font, ch) \ + (((ch) < KNOWN_MISSING) && ((font)->known_missing[(Char)(ch)] > 0)) +#else +#define CheckedKnownMissing(font, ch) \ + ((font)->known_missing[(Char)(ch)] > 0) +#endif + +#define IsXtermMissingChar(screen, ch, font) \ + (CheckedKnownMissing(font, ch) \ + ? ((font)->known_missing[(Char)(ch)] > 1) \ + : ((FontIsIncomplete(font) && xtermMissingChar(ch, font)) \ + || ForceBoxChars(screen, ch))) + +extern void xtermDrawBoxChar (XTermDraw * /* params */, unsigned /* ch */, GC /* gc */, int /* x */, int /* y */, int /* cols */); +#else +#define IsXtermMissingChar(screen, ch, font) False +#endif + +#if OPT_BOX_CHARS || OPT_REPORT_FONTS +extern Bool xtermMissingChar (unsigned /* ch */, XTermFonts */* font */); +#endif + +#if OPT_LOAD_VTFONTS +extern void HandleLoadVTFonts PROTO_XT_ACTIONS_ARGS; +#endif + +#if OPT_LOAD_VTFONTS || OPT_WIDE_CHARS +extern Bool xtermLoadWideFonts (XtermWidget /* w */, Bool /* nullOk */); +extern void xtermSaveVTFonts (XtermWidget /* xw */); +#endif + +#define xtermIsDecGraphic(ch) ((ch) > 0 && (ch) < 32) + +#if OPT_RENDERFONT +extern Boolean maybeXftCache(XtermWidget /* xw */, XftFont * /* font */); +extern Bool xtermXftMissing (XtermWidget /* xw */, XftFont * /* font */, unsigned /* wc */); +extern XTermXftFonts *getMyXftFont (XtermWidget /* xw */, int /* which */, int /* fontnum */); +extern XftFont *findXftGlyph (XtermWidget /* xw */, XftFont * /* given */, unsigned /* wc */); +extern XftFont *getXftFont (XtermWidget /* xw */, VTFontEnum /* which */, int /* fontnum */); +extern void closeCachedXft (TScreen * /* screen */, XftFont * /* font */); +extern void xtermCloseXft (TScreen * /* screen */, XTermXftFonts * /* pub */); +#if OPT_DEC_CHRSET +extern XftFont * getDoubleXftFont(XTermDraw * /* params */, unsigned /* chrset */, unsigned /* attr_flags */); +#endif +#endif + +#if OPT_SHIFT_FONTS +extern String getFaceName (XtermWidget /* xw */, Bool /* wideName */); +extern void HandleLargerFont PROTO_XT_ACTIONS_ARGS; +extern void HandleSmallerFont PROTO_XT_ACTIONS_ARGS; +extern void setFaceName (XtermWidget /* xw */, const char * /*value */); +#endif + +#if OPT_WIDE_ATTRS +extern unsigned xtermUpdateItalics (XtermWidget /* xw */, unsigned /* new_attrs */, unsigned /* old_attrs */); +extern void xtermLoadItalics (XtermWidget /* xw */); +#endif + +#if OPT_WIDE_CHARS +extern unsigned ucs2dec (TScreen * /* screen */, unsigned /* ch */); +extern unsigned dec2ucs (TScreen * /* screen */, unsigned /* ch */); +#endif + +/* *INDENT-ON* */ + +#endif /* included_fontutils_h */ diff --git a/ports/xterm/xterm-359/fontutils.o b/ports/xterm/xterm-359/fontutils.o new file mode 100644 index 0000000000000000000000000000000000000000..66ea694b0b5b0565d3d5ef3a56a6df418f92c8f6 GIT binary patch literal 349096 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 z∓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 Wl4H{Q&cCg$>3^7sd3z2z>HB|jhw3)~ literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/gen-charsets.pl b/ports/xterm/xterm-359/gen-charsets.pl new file mode 100755 index 0000000..2456a74 --- /dev/null +++ b/ports/xterm/xterm-359/gen-charsets.pl @@ -0,0 +1,105 @@ +#! /usr/bin/perl -w +# $XTermId: gen-charsets.pl,v 1.2 2018/08/22 22:59:15 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2018 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Translate a Unicode mapping, e.g., for one of the ISO-8859-x codepages, +# into the form used in charsets.c for converting characters. +use strict; + +$| = 1; + +sub do_file($) { + my $file = shift; + my $undef = hex(0x2426); + open( FP, $file ) || do { + print STDERR "Can't open $file: $!\n"; + return; + }; + my @data = ; + close(FP); + my $name = $file; + $name =~ s,^.*/,,; + $name =~ s/\..*$//; + $name =~ s/^(8859)/ISO-$1/; + $name =~ s/-/_/g; + printf "#define map_%s(code) \\\n", $name; + printf "\tswitch (code) { \\\n"; + my @target; + my @noteof; + + for my $n ( 0 .. $#data ) { + chomp $data[$n]; + $data[$n] =~ s/^\s*//; + $data[$n] =~ s/\s*$//; + next if ( $data[$n] =~ /^#/ ); + next if ( $data[$n] eq "" ); + if ( $data[$n] !~ /^0x[[:xdigit:]]+\s+0x[[:xdigit:]]+\s*#/i ) { + printf STDERR "?? %d:%s\n", $n + 1, $data[$n]; + next; + } + + my $source = $data[$n]; + $source =~ s/\s.*//; + $source = hex($source); + next if ( $source < 160 or $source > 255 ); + $source -= 128; + + my $target = $data[$n]; + $target =~ s/^[^\s]+\s+(0x[[:xdigit:]]+).*$/$1/i; + $target = hex($target); + + my $noteof = $data[$n]; + $noteof =~ s/^[^#]+#\s*//; + + $target[$source] = $target; + $noteof[$source] = $noteof; + } + my $lo = $target[32] ? 32 : 33; + my $hi = $target[127] ? 127 : 126; + for my $n ( $lo .. $hi ) { + if ( defined $target[$n] ) { + printf "\t UNI(0x%02x, 0x%04x);\t/* %s */ \\\n", $n, + $target[$n], $noteof[$n]; + } + else { + printf "\t XXX(0x%02x, UNDEF);\t/* undefined */ \\\n", $n; + } + } + printf "\t}\n"; +} + +while ( $#ARGV >= 0 ) { + &do_file( shift @ARGV ); +} + +1; diff --git a/ports/xterm/xterm-359/gen-pc-fkeys.pl b/ports/xterm/xterm-359/gen-pc-fkeys.pl new file mode 100755 index 0000000..1cc5b47 --- /dev/null +++ b/ports/xterm/xterm-359/gen-pc-fkeys.pl @@ -0,0 +1,364 @@ +#! /usr/bin/perl -w +# $XTermId: gen-pc-fkeys.pl,v 1.22 2007/11/30 23:03:55 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2004-2005,2007 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Construct a list of function-key definitions corresponding to xterm's +# Sun/PC keyboard. This uses ncurses' infocmp to obtain the strings (including +# extensions) to modify (and verify). +use strict; + +my($max_modifier, $terminfo); +my(@old_fkeys, $opt_fkeys, $min_fkeys, $max_fkeys); +my(%old_ckeys, $opt_ckeys, $min_ckeys, $max_ckeys); +my(%old_ekeys, $opt_ekeys, $min_ekeys, $max_ekeys); + +my(@ckey_names); +@ckey_names = ( + 'kcud1', 'kcub1', 'kcuf1', 'kcuu1', # 1 = no modifiers + 'kDN', 'kLFT', 'kRIT', 'kUP', # 2 = shift + # make_ckey_names() repeats this row, appending the modifier code + ); +my %ckey_names; +my(@ckey_known); +@ckey_known = ( + 'kind', 'kLFT', 'kRIT', 'kri', # 2 = shift (standard) + ); + +my(@ekey_names); +@ekey_names = ( + 'khome', 'kend', 'knp', 'kpp', 'kdch1', 'kich1', # 1 = no modifiers + 'kHOM', 'kEND', 'kNXT', 'kPRV', 'kDC', 'kIC', # 2 = shift + # make_ekey_names() repeats this row, appending the modifier code +); +my %ekey_names; + +$min_fkeys=12; # the number of "real" function keys on your keyboard +$max_fkeys=64; # the number of function-keys terminfo can support +$max_modifier=8; # modifier 1 + (1=shift, 2=alt, 4=control 8=meta) + +$min_ckeys=4; # the number of "real" cursor keys on your keyboard +$max_ckeys=($min_ckeys * ($max_modifier - 1)); + +$min_ekeys=6; # the number of "real" editing keys on your keyboard +$max_ekeys=($min_ekeys * ($max_modifier - 1)); + +$opt_ckeys=2; # xterm's modifyCursorKeys resource +$opt_ekeys=2; # xterm's modifyCursorKeys resource +$opt_fkeys=2; # xterm's modifyFunctionKeys resource +$terminfo="xterm-new"; # the terminfo entry to use + +# apply the given modifier to the terminfo string, return the result +sub modify_fkey($$$) { + my $code = $_[0]; + my $text = $_[1]; + my $opts = $_[2]; + if (not defined($text)) { + $text = ""; + } elsif ($code != 1) { + $text =~ s/\\EO/\\E\[/ if ($opts >= 1); + + my $piece = substr $text, 0, length ($text) - 1; + my $final = substr $text, length ($text) - 1; + my $check = substr $piece, length ($piece) - 1; + if ($check =~ /[0-9]/) { + $code = ";" . $code; + } elsif ( $check =~ /\[/ and $opts >= 2) { + $code = "1;" . $code; + } + if ( $opts >= 3 ) { + $code = ">" . $code; + } + $text = $piece . $code . $final; + $text =~ s/([\d;]+)>/>$1/; + } + return $text; +} + +# compute the next modifier value - +# Cycling through the modifiers is not just like counting. Users prefer +# pressing one modifier (even if using Emacs). So first we cycle through +# the individual modifiers, then for completeness two, three, etc. +sub next_modifier { + my $code = $_[0]; + my $mask = $code - 1; + if ($mask == 0) { + $mask = 1; # shift + } elsif ($mask == 1) { + $mask = 4; # control + } elsif ($mask == 2) { + $mask = 3; # shift+alt + } elsif ($mask == 4) { + $mask = 5; # shift+control + } elsif ($mask == 5) { + $mask = 2; # alt + } + # printf ("# next_modifier(%d) = %d\n", $code, $mask + 1); + return $mask + 1; +} + +sub make_ckey_names() { + my ($j, $k); + my $min = $min_ckeys * 2; + my $max = $max_ckeys - 1; + + # printf "# make_ckey_names\n"; + for $j ($min..$max) { + $k = 1 + substr($j / $min_ckeys, 0, 1); + $ckey_names[$j] = $ckey_names[$min_ckeys + ($j % $min_ckeys)] . $k; + # printf "# make %d:%s\n", $j, $ckey_names[$j]; + } + for $j (0..$#ckey_names) { + # printf "# %d:%s\n", $j, $ckey_names[$j]; + $ckey_names{$ckey_names[$j]} = $j; + } +} + +sub make_ekey_names() { + my ($j, $k); + my $min = $min_ekeys * 2; + my $max = $max_ekeys - 1; + + # printf "# make_ekey_names\n"; + for $j ($min..$max) { + $k = 1 + substr($j / $min_ekeys, 0, 1); + $ekey_names[$j] = $ekey_names[$min_ekeys + ($j % $min_ekeys)] . $k; + # printf "# make %d:%s\n", $j, $ekey_names[$j]; + } + for $j (0..$#ekey_names) { + # printf "# %d:%s\n", $j, $ekey_names[$j]; + $ekey_names{$ekey_names[$j]} = $j; + } +} + +# Read the terminfo entry's list of function keys $old_fkeys[]. +# We could handle $old_fkeys[0], but choose to start numbering from 1. +sub readterm($) { + my $term = $_[0]; + my($key, $n, $str); + my(@list) = `infocmp -x -1 $term`; + + for $n (0..$#list) { + chop $list[$n]; + $list[$n] =~ s/^[[:space:]]//; + + $key = $list[$n]; + $key =~ s/=.*//; + + $str = $list[$n]; + $str =~ s/^[^=]+=//; + $str =~ s/,$//; + + if ( $list[$n] =~ /^kf[[:digit:]]+=/ ) { + $key =~ s/^kf//; + # printf "# $n:%s(%d)(%s)\n", $list[$n], $key, $str; + $old_fkeys[$key] = $str; + } elsif ( $key =~ /^kc[[:alpha:]]+1/ + or $key =~ /^k(LFT|RIT|UP|DN)\d?/) { + # printf "# $n:%s(%d)(%s)\n", $list[$n], $key, $str; + $old_ckeys{$key} = $str; + } elsif ( defined $ekey_names{$key} ) { + # printf "# $n:%s(%s)(%s)\n", $list[$n], $key, $str; + $old_ekeys{$key} = $str; + } + } + # printf ("last index:%d\n", $#old_fkeys); +} + +# read the whole terminfo to ensure we get the non-modified stuff, then read +# the part that contains modifiers. +sub read_part($) { + my $part = $_[0]; + + %old_ckeys = (); + @old_fkeys = (); + readterm($terminfo); + readterm($part); +} + +sub nameof_ckeys($) { + my $opts = $_[0]; + my $optname = "xterm+pcc" . ($opts >= 0 ? $opts : "n"); + return $optname; +} + +sub generate_ckeys($) { + my $opts = $_[0]; + my($modifier, $cur_ckey, $index); + + printf "%s|fragment with modifyCursorKeys:%s,\n", + nameof_ckeys($opts), $opts; + + # show the standard cursor definitions + $modifier = 1; + for ($index = 0; $index < $min_ckeys; ++$index) { + $cur_ckey = $index + ($modifier * $min_ckeys); + my $name = $ckey_known[$index]; + my $input = $old_ckeys{$ckey_names[$index]}; + my $result = modify_fkey($modifier + 1, $input, $opts); + printf "\t%s=%s,\n", $name, $result; + if (defined $old_ckeys{$name}) { + if ($old_ckeys{$name} ne $result) { + printf "# found %s=%s\n", $name, $old_ckeys{$name}; + } + } + } + + # show the extended cursor definitions + for ($index = 0; $index < $min_ckeys; ++$index) { + for ($modifier = 1; $modifier < $max_modifier; ++$modifier) { + $cur_ckey = $index + ($modifier * $min_ckeys); + if (defined $ckey_names[$cur_ckey] and + $ckey_names[$cur_ckey] ne "kLFT" and + $ckey_names[$cur_ckey] ne "kRIT" ) { + my $name = $ckey_names[$cur_ckey]; + my $input = $old_ckeys{$ckey_names[$index]}; + my $result = modify_fkey($modifier + 1, $input, $opts); + printf "\t%s=%s,\n", $name, $result; + if (defined $old_ckeys{$name}) { + if ($old_ckeys{$name} ne $result) { + printf "# found %s=%s\n", $name, $old_ckeys{$name}; + } + } + } + } + } +} + +sub nameof_ekeys($) { + my $opts = $_[0]; + my $optname = "xterm+pce" . ($opts >= 0 ? $opts : "n"); + return $optname; +} + +sub generate_ekeys($) { + my $opts = $_[0]; + my($modifier, $cur_ekey, $index); + + printf "%s|fragment with modifyCursorKeys:%s,\n", + nameof_ekeys($opts), $opts; + + for ($index = 0; $index < $min_ekeys; ++$index) { + for ($modifier = 1; $modifier < $max_modifier; ++$modifier) { + $cur_ekey = $index + ($modifier * $min_ekeys); + if (defined $ekey_names[$cur_ekey] ) { + my $name = $ekey_names[$cur_ekey]; + my $input = $old_ekeys{$ekey_names[$index]}; + my $result = modify_fkey($modifier + 1, $input, $opts); + printf "\t%s=%s,\n", $name, $result; + if (defined $old_ekeys{$name}) { + if ($old_ekeys{$name} ne $result) { + printf "# found %s=%s\n", $name, $old_ekeys{$name}; + } + } + } + } + } +} + +sub nameof_fkeys($) { + my $opts = $_[0]; + my $optname = "xterm+pcf" . ($opts >= 0 ? $opts : "n"); + return $optname; +} + +sub generate_fkeys($) { + my $opts = $_[0]; + my($modifier, $cur_fkey); + + printf "%s|fragment with modifyFunctionKeys:%s and ctrlFKeys:10,\n", + nameof_fkeys($opts), $opts; + + for ($cur_fkey = 1, $modifier = 1; $cur_fkey < $max_fkeys; ++$cur_fkey) { + my $index = (($cur_fkey - 1) % $min_fkeys); + if ($index == 0 && $cur_fkey != 1) { + $modifier = next_modifier($modifier); + } + if (defined $old_fkeys[$index + 1]) { + my $input = $old_fkeys[$index + 1]; + my $result = modify_fkey($modifier, $input, $opts); + printf "\tkf%d=%s,\n", $cur_fkey, $result; + if (defined $old_fkeys[$cur_fkey]) { + if ($old_fkeys[$cur_fkey] ne $result) { + printf "# found kf%d=%s\n", $cur_fkey, $old_fkeys[$cur_fkey]; + } + } + } + } +} + +sub show_default() { + readterm($terminfo); + + printf "xterm+pcfkeys|fragment for PC-style keys,\n"; + printf "\tuse=%s,\n", nameof_ckeys($opt_ckeys); + printf "\tuse=%s,\n", nameof_ekeys($opt_ekeys); + printf "\tuse=%s,\n", nameof_fkeys($opt_fkeys); + + generate_ckeys($opt_ckeys); + generate_ekeys($opt_ekeys); + generate_fkeys($opt_fkeys); +} + +sub show_nondefault() +{ + my $opts; + + for ($opts = 0; $opts <= 3; ++$opts) { + if ($opts != $opt_ckeys) { + read_part(nameof_ckeys($opts)); + generate_ckeys($opts); + } + } + + for ($opts = 0; $opts <= 3; ++$opts) { + if ($opts != $opt_ekeys) { + read_part(nameof_ekeys($opts)); + generate_ekeys($opts); + } + } + + for ($opts = 0; $opts <= 3; ++$opts) { + if ($opts != $opt_fkeys) { + read_part(nameof_fkeys($opts)); + generate_fkeys($opts); + } + } +} + +make_ckey_names(); +make_ekey_names(); + +printf "# gen-pc-fkeys.pl\n"; +printf "# %s:timode\n", "vile"; +show_default(); +show_nondefault(); diff --git a/ports/xterm/xterm-359/graphics.c b/ports/xterm/xterm-359/graphics.c new file mode 100644 index 0000000..7b32592 --- /dev/null +++ b/ports/xterm/xterm-359/graphics.c @@ -0,0 +1,1815 @@ +/* $XTermId: graphics.c,v 1.90 2020/08/06 19:57:58 tom Exp $ */ + +/* + * Copyright 2013-2019,2020 by Ross Combs + * Copyright 2013-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +#include + +#include +#include +#include + +#include +#include + +#include +#include + +#undef DUMP_BITMAP +#undef DUMP_COLORS +#undef DEBUG_PALETTE +#undef DEBUG_PIXEL +#undef DEBUG_REFRESH + +/* + * graphics TODO list + * + * ReGIS: + * - ship a default alphabet zero font instead of scaling Xft fonts + * - input cursors + * - output cursors + * - mouse/tablet/arrow-key input + * - fix graphic pages for ReGIS -- they should also apply to text and sixel graphics + * - fix interpolated curves to more closely match implementation (identical despite direction and starting point) + * - non-ASCII alphabets + * - enter/leave anywhere in a command + * - locator key definitions (DECLKD) + * - command display mode + * - re-rasterization on window resize + * - macros + * - improved fills for narrow angles (track actual lines not just pixels) + * - hardcopy/screen-capture support (need dialog of some sort for safety) + * - error reporting + * + * sixel: + * - fix problem where new_row < 0 during sixel parsing (see FIXME) + * - screen-capture support (need dialog of some sort for safety) + * + * VT55/VT105 waveform graphics + * - everything + * + * Tektronix: + * - color (VT340 4014 emulation, 41xx, IRAF GTERM, and also MS-DOS Kermit color support) + * - polygon fill (41xx) + * - clear area extension + * - area fill extension + * - pixel operations (RU/RS/RP) + * - research other 41xx and 42xx extensions + * + * common graphics features: + * - handle light/dark screen modes (CSI?5[hl]) + * - update text fg/bg color which overlaps images + * - handle graphic updates in scroll regions (verify effect on graphics) + * - handle rectangular area copies (verify they work with graphics) + * - invalidate graphics under graphic if same origin, at least as big, and bg not transparent + * - invalidate graphic if completely scrolled past end of scrollback + * - invalidate graphic if all pixels are transparent/erased + * - invalidate graphic if completely scrolled out of alt buffer + * - posturize requested colors to match hardware palettes (e.g. only four possible shades on VT240) + * - color register report/restore + * - ability to select/copy graphics for pasting in other programs + * - ability to show non-scroll-mode sixel graphics in a separate window + * - ability to show ReGIS graphics in a separate window + * - ability to show Tektronix graphics in VT100 window + * - truncate graphics at bottom edge of terminal? + * - locator events (DECEFR DECSLE DECELR DECLRP) + * - locator controller mode (CSI6i / CSI7i) + * + * new escape sequences: + * - way to query text font size without "window ops" (or make "window ops" permissions more fine grained) + * - way to query and set the number of graphics pages + * + * ReGIS extensions: + * - non-integer text scaling + * - free distortionless text rotation (vs. simulating the distortion and aligning to 45deg increments) + * - font characteristics: bold/underline/italic + * - remove/increase arbitrary limits (pattern size, pages, alphabets, stack size, font names, etc.) + * - shade/fill with borders + * - sprites (copy portion of page into/out of buffer with scaling and rotation) + * - ellipses + * - 2D patterns + * - option to set actual graphic size (not just coordinate range) + * - gradients (for lines and fills) + * - line width (RLogin has this and it is mentioned in docs for the DEC ReGIS to Postscript converter) + * - transparency + * - background color as stackable write control + * - true color (virtual color registers created upon lookup) + * - anti-aliasing + * - variable-width (proportional) text + */ + +/* font sizes: + * VT510: + * 80 Columns 132 Columns Maximum Number of Lines + * 10 x 16 6 x 16 26 lines + keyboard indicator line + * 10 x 13 6 x 13 26 lines + keyboard indicator line + * 10 x 10 6 x 10 42 lines + keyboard indicator line + * 10 x 8 6 x 8 53 lines + keyboard indicator line + */ + +typedef struct allocated_color_register { + struct allocated_color_register *next; + Pixel pix; + short r, g, b; +} AllocatedColorRegister; + +#define LOOKUP_WIDTH 16 +static AllocatedColorRegister *allocated_colors[LOOKUP_WIDTH][LOOKUP_WIDTH][LOOKUP_WIDTH]; + +#define FOR_EACH_SLOT(ii) for (ii = 0U; ii < MAX_GRAPHICS; ii++) + +static ColorRegister *shared_color_registers; +static Graphic *displayed_graphics[MAX_GRAPHICS]; +static unsigned next_graphic_id = 0U; +static unsigned used_graphics; /* 0 to MAX_GRAPHICS */ + +#define DiffColor(this,that) \ + (this.r != that.r || \ + this.g != that.g || \ + this.b != that.b) + +static ColorRegister null_color = +{-1, -1, -1}; + +static ColorRegister * +allocRegisters(void) +{ + return TypeCallocN(ColorRegister, MAX_COLOR_REGISTERS); +} + +static Graphic * +freeGraphic(Graphic *obj) +{ + if (obj) { + if (obj->pixels) + free(obj->pixels); + if (obj->private_color_registers) + free(obj->private_color_registers); + free(obj); + } + return NULL; +} + +static Graphic * +allocGraphic(int max_w, int max_h) +{ + Graphic *result = TypeCalloc(Graphic); + if (result) { + result->max_width = max_w; + result->max_height = max_h; + if (!(result->pixels = TypeCallocN(RegisterNum, + (size_t) max_w * (size_t) max_h))) { + result = freeGraphic(result); + } else if (!(result->private_color_registers = allocRegisters())) { + result = freeGraphic(result); + } + } + return result; +} + +#define getActiveSlot(n) \ + (((n) < MAX_GRAPHICS && \ + displayed_graphics[n] && \ + displayed_graphics[n]->valid) \ + ? displayed_graphics[n] \ + : NULL) + +static Graphic * +getInactiveSlot(const TScreen *screen, unsigned n) +{ + if (n < MAX_GRAPHICS && + (!displayed_graphics[n] || + !displayed_graphics[n]->valid)) { + if (!displayed_graphics[n]) { + displayed_graphics[n] = allocGraphic(screen->graphics_max_wide, + screen->graphics_max_high); + used_graphics += (displayed_graphics[n] != NULL); + } + return displayed_graphics[n]; + } + return NULL; +} + +static ColorRegister * +getSharedRegisters(void) +{ + if (!shared_color_registers) + shared_color_registers = allocRegisters(); + return shared_color_registers; +} + +static void +deactivateSlot(unsigned n) +{ + if ((n < MAX_GRAPHICS) && displayed_graphics[n]) { + displayed_graphics[n] = freeGraphic(displayed_graphics[n]); + used_graphics--; + } +} + +extern RegisterNum +read_pixel(Graphic *graphic, int x, int y) +{ + if (x < 0 || x >= graphic->actual_width || + y < 0 || y >= graphic->actual_height) { + return COLOR_HOLE; + } + + return graphic->pixels[y * graphic->max_width + x]; +} + +#define _draw_pixel(G, X, Y, C) \ + do { \ + (G)->pixels[(Y) * (G)->max_width + (X)] = (RegisterNum) (C); \ + } while (0) + +void +draw_solid_pixel(Graphic *graphic, int x, int y, unsigned color) +{ + assert(color <= MAX_COLOR_REGISTERS); + +#ifdef DEBUG_PIXEL + TRACE(("drawing pixel at %d,%d color=%hu (hole=%hu, [%d,%d,%d])\n", + x, + y, + color, + COLOR_HOLE, + ((color != COLOR_HOLE) + ? (unsigned) graphic->color_registers[color].r : 0U), + ((color != COLOR_HOLE) + ? (unsigned) graphic->color_registers[color].g : 0U), + ((color != COLOR_HOLE) + ? (unsigned) graphic->color_registers[color].b : 0U))); +#endif + if (x >= 0 && x < graphic->actual_width && + y >= 0 && y < graphic->actual_height) { + _draw_pixel(graphic, x, y, color); + if (color < MAX_COLOR_REGISTERS) + graphic->color_registers_used[color] = 1; + } +} + +void +draw_solid_rectangle(Graphic *graphic, int x1, int y1, int x2, int y2, unsigned color) +{ + int x, y; + int tmp; + + assert(color <= MAX_COLOR_REGISTERS); + + if (x1 > x2) { + EXCHANGE(x1, x2, tmp); + } + if (y1 > y2) { + EXCHANGE(y1, y2, tmp); + } + + if (x2 < 0 || x1 >= graphic->actual_width || + y2 < 0 || y1 >= graphic->actual_height) + return; + + if (x1 < 0) + x1 = 0; + if (x2 >= graphic->actual_width) + x2 = graphic->actual_width - 1; + if (y1 < 0) + y1 = 0; + if (y2 >= graphic->actual_height) + y2 = graphic->actual_height - 1; + + if (color < MAX_COLOR_REGISTERS) + graphic->color_registers_used[color] = 1; + for (y = y1; y <= y2; y++) + for (x = x1; x <= x2; x++) + _draw_pixel(graphic, x, y, color); +} + +#if 0 /* unused */ +void +draw_solid_line(Graphic *graphic, int x1, int y1, int x2, int y2, unsigned color) +{ + int x, y; + int dx, dy; + int dir, diff; + + assert(color <= MAX_COLOR_REGISTERS); + + dx = abs(x1 - x2); + dy = abs(y1 - y2); + + if (dx > dy) { + if (x1 > x2) { + int tmp; + EXCHANGE(x1, x2, tmp); + EXCHANGE(y1, y2, tmp); + } + if (y1 < y2) + dir = 1; + else if (y1 > y2) + dir = -1; + else + dir = 0; + + diff = 0; + y = y1; + for (x = x1; x <= x2; x++) { + if (diff >= dx) { + diff -= dx; + y += dir; + } + diff += dy; + draw_solid_pixel(graphic, x, y, color); + } + } else { + if (y1 > y2) { + int tmp; + EXCHANGE(x1, x2, tmp); + EXCHANGE(y1, y2, tmp); + } + if (x1 < x2) + dir = 1; + else if (x1 > x2) + dir = -1; + else + dir = 0; + + diff = 0; + x = x1; + for (y = y1; y <= y2; y++) { + if (diff >= dy) { + diff -= dy; + x += dir; + } + diff += dx; + draw_solid_pixel(graphic, x, y, color); + } + } +} +#endif + +void +copy_overlapping_area(Graphic *graphic, int src_ul_x, int src_ul_y, + int dst_ul_x, int dst_ul_y, unsigned w, unsigned h, + unsigned default_color) +{ + int sx, ex, dx; + int sy, ey, dy; + int xx, yy; + RegisterNum color; + + if (dst_ul_x <= src_ul_x) { + sx = 0; + ex = (int) w - 1; + dx = +1; + } else { + sx = (int) w - 1; + ex = 0; + dx = -1; + } + + if (dst_ul_y <= src_ul_y) { + sy = 0; + ey = (int) h - 1; + dy = +1; + } else { + sy = (int) h - 1; + ey = 0; + dy = -1; + } + + for (yy = sy; yy != ey + dy; yy += dy) { + int dst_y = dst_ul_y + yy; + int src_y = src_ul_y + yy; + if (dst_y < 0 || dst_y >= (int) graphic->actual_height) + continue; + + for (xx = sx; xx != ex + dx; xx += dx) { + int dst_x = dst_ul_x + xx; + int src_x = src_ul_x + xx; + if (dst_x < 0 || dst_x >= (int) graphic->actual_width) + continue; + + if (src_x < 0 || src_x >= (int) graphic->actual_width || + src_y < 0 || src_y >= (int) graphic->actual_height) + color = (RegisterNum) default_color; + else + color = graphic->pixels[(unsigned) (src_y * + graphic->max_width) + + (unsigned) src_x]; + + graphic->pixels[(unsigned) (dst_y * graphic->max_width) + + (unsigned) dst_x] = color; + } + } +} + +static void +set_color_register(ColorRegister *color_registers, + unsigned color, + int r, + int g, + int b) +{ + ColorRegister *reg = &color_registers[color]; + reg->r = (short) r; + reg->g = (short) g; + reg->b = (short) b; +} + +/* Graphics which don't use private colors will act as if they are using a + * device-wide color palette. + */ +static void +set_shared_color_register(unsigned color, int r, int g, int b) +{ + unsigned ii; + + assert(color < MAX_COLOR_REGISTERS); + + set_color_register(getSharedRegisters(), color, r, g, b); + + if (!used_graphics) + return; + + FOR_EACH_SLOT(ii) { + Graphic *graphic; + + if (!(graphic = getActiveSlot(ii))) + continue; + if (graphic->private_colors) + continue; + + if (graphic->color_registers_used[ii]) { + graphic->dirty = 1; + } + } +} + +void +update_color_register(Graphic *graphic, + unsigned color, + int r, + int g, + int b) +{ + assert(color < MAX_COLOR_REGISTERS); + + if (graphic->private_colors) { + set_color_register(graphic->private_color_registers, + color, r, g, b); + if (graphic->color_registers_used[color]) { + graphic->dirty = 1; + } + graphic->color_registers_used[color] = 1; + } else { + set_shared_color_register(color, r, g, b); + } +} + +#define SQUARE(X) ( (X) * (X) ) + +RegisterNum +find_color_register(ColorRegister const *color_registers, int r, int g, int b) +{ + unsigned i; + unsigned closest_index; + unsigned closest_distance; + + /* I have no idea what algorithm DEC used for this. + * The documentation warns that it is unpredictable, especially with values + * far away from any allocated color so it is probably a very simple + * heuristic rather than something fancy like finding the minimum distance + * in a linear perceptive color space. + */ + closest_index = MAX_COLOR_REGISTERS; + closest_distance = 0U; + for (i = 0U; i < MAX_COLOR_REGISTERS; i++) { + unsigned d = (unsigned) (SQUARE(2 * (color_registers[i].r - r)) + + SQUARE(3 * (color_registers[i].g - g)) + + SQUARE(1 * (color_registers[i].b - b))); + if (closest_index == MAX_COLOR_REGISTERS || d < closest_distance) { + closest_index = i; + closest_distance = d; + } + } + + TRACE(("found closest color register to %d,%d,%d: %u (distance %u value %d,%d,%d)\n", + r, g, b, + closest_index, + closest_distance, + color_registers[closest_index].r, + color_registers[closest_index].g, + color_registers[closest_index].b)); + return (RegisterNum) closest_index; +} + +static void +init_color_registers(ColorRegister *color_registers, int graphics_id) +{ + TRACE(("setting initial colors for terminal %d\n", graphics_id)); + { + unsigned i; + + for (i = 0U; i < MAX_COLOR_REGISTERS; i++) { + set_color_register(color_registers, (RegisterNum) i, 0, 0, 0); + } + } + + /* + * default color registers: + * (mono) (color) + * VK100/GIGI (fixed) + * VT125: + * 0: 0% 0% + * 1: 33% blue + * 2: 66% red + * 3: 100% green + * VT240: + * 0: 0% 0% + * 1: 33% blue + * 2: 66% red + * 3: 100% green + * VT241: + * 0: 0% 0% + * 1: 33% blue + * 2: 66% red + * 3: 100% green + * VT330: + * 0: 0% 0% (bg for light on dark mode) + * 1: 33% blue (red?) + * 2: 66% red (green?) + * 3: 100% green (yellow?) (fg for light on dark mode) + * VT340: + * 0: 0% 0% (bg for light on dark mode) + * 1: 14% blue + * 2: 29% red + * 3: 43% green + * 4: 57% magenta + * 5: 71% cyan + * 6: 86% yellow + * 7: 100% 50% (fg for light on dark mode) + * 8: 0% 25% + * 9: 14% gray-blue + * 10: 29% gray-red + * 11: 43% gray-green + * 12: 57% gray-magenta + * 13: 71% gray-cyan + * 14: 86% gray-yellow + * 15: 100% 75% ("white") + * VT382: + * ? (FIXME: B&W only?) + * dxterm: + * ? + */ + switch (graphics_id) { + case 125: + case 241: + set_color_register(color_registers, 0, 0, 0, 0); + set_color_register(color_registers, 1, 0, 0, 100); + set_color_register(color_registers, 2, 0, 100, 0); + set_color_register(color_registers, 3, 100, 0, 0); + break; + case 240: + case 330: + set_color_register(color_registers, 0, 0, 0, 0); + set_color_register(color_registers, 1, 33, 33, 33); + set_color_register(color_registers, 2, 66, 66, 66); + set_color_register(color_registers, 3, 100, 100, 100); + break; + case 340: + default: + set_color_register(color_registers, 0, 0, 0, 0); + set_color_register(color_registers, 1, 20, 20, 80); + set_color_register(color_registers, 2, 80, 13, 13); + set_color_register(color_registers, 3, 20, 80, 20); + set_color_register(color_registers, 4, 80, 20, 80); + set_color_register(color_registers, 5, 20, 80, 80); + set_color_register(color_registers, 6, 80, 80, 20); + set_color_register(color_registers, 7, 53, 53, 53); + set_color_register(color_registers, 8, 26, 26, 26); + set_color_register(color_registers, 9, 33, 33, 60); + set_color_register(color_registers, 10, 60, 26, 26); + set_color_register(color_registers, 11, 33, 60, 33); + set_color_register(color_registers, 12, 60, 33, 60); + set_color_register(color_registers, 13, 33, 60, 60); + set_color_register(color_registers, 14, 60, 60, 33); + set_color_register(color_registers, 15, 80, 80, 80); + break; + case 382: /* FIXME: verify */ + set_color_register(color_registers, 0, 0, 0, 0); + set_color_register(color_registers, 1, 100, 100, 100); + break; + } + +#ifdef DEBUG_PALETTE + { + unsigned i; + + for (i = 0U; i < MAX_COLOR_REGISTERS; i++) { + TRACE(("initial value for register %03u: %d,%d,%d\n", + i, + color_registers[i].r, + color_registers[i].g, + color_registers[i].b)); + } + } +#endif +} + +unsigned +get_color_register_count(TScreen const *screen) +{ + unsigned num_color_registers; + + if (screen->numcolorregisters >= 0) { + num_color_registers = (unsigned) screen->numcolorregisters; + } else { + num_color_registers = 0U; + } + + if (num_color_registers > 1U) { + if (num_color_registers > MAX_COLOR_REGISTERS) + return MAX_COLOR_REGISTERS; + return num_color_registers; + } + + /* + * color capabilities: + * VK100/GIGI 1 plane (12x1 pixel attribute blocks) colorspace is 8 fixed colors (black, white, red, green, blue, cyan, yellow, magenta) + * VT125 2 planes (4 registers) colorspace is (64?) (color), ? (grayscale) + * VT240 2 planes (4 registers) colorspace is 4 shades (grayscale) + * VT241 2 planes (4 registers) colorspace is ? (color), ? shades (grayscale) + * VT330 2 planes (4 registers) colorspace is 4 shades (grayscale) + * VT340 4 planes (16 registers) colorspace is r16g16b16 (color), 16 shades (grayscale) + * VT382 1 plane (two fixed colors: black and white) FIXME: verify + * dxterm ? + */ + switch (screen->graphics_id) { + case 125: + return 4U; + case 240: + return 4U; + case 241: + return 4U; + case 330: + return 4U; + case 340: + return 16U; + case 382: + return 2U; + default: + /* unknown graphics model -- might as well be generous */ + return MAX_COLOR_REGISTERS; + } +} + +static void +init_graphic(Graphic *graphic, + unsigned type, + int graphics_id, + int charrow, + int charcol, + unsigned num_color_registers, + int private_colors) +{ + const unsigned max_pixels = (unsigned) (graphic->max_width * + graphic->max_height); + unsigned i; + + TRACE(("init_graphic at %d,%d\n", charrow, charcol)); + + graphic->hidden = 0; + graphic->dirty = 1; + for (i = 0U; i < max_pixels; i++) + graphic->pixels[i] = COLOR_HOLE; + memset(graphic->color_registers_used, 0, sizeof(graphic->color_registers_used)); + + /* + * text and graphics interactions: + * VK100/GIGI text writes on top of graphics buffer, color attribute shared with text + * VT240,VT241,VT330,VT340 text writes on top of graphics buffer + * VT382 text writes on top of graphics buffer FIXME: verify + * VT125 graphics buffer overlaid on top of text in B&W display, text not present in color display + */ + + /* + * dimensions (ReGIS logical, physical): + * VK100/GIGI 768x4?? 768x240(status?) + * VT125 768x460 768x230(+10status) (1:2 aspect ratio, ReGIS halves vertical addresses through "odd y emulation") + * VT240 800x460 800x230(+10status) (1:2 aspect ratio, ReGIS halves vertical addresses through "odd y emulation") + * VT241 800x460 800x230(+10status) (1:2 aspect ratio, ReGIS halves vertical addresses through "odd y emulation") + * VT330 800x480 800x480(+?status) + * VT340 800x480 800x480(+?status) + * VT382 960x750 sixel only + * dxterm ?x? ?x? variable? + */ + + graphic->actual_width = 0; + graphic->actual_height = 0; + + graphic->pixw = 1; + graphic->pixh = 1; + + graphic->valid_registers = num_color_registers; + TRACE(("%d color registers\n", graphic->valid_registers)); + + graphic->private_colors = private_colors; + if (graphic->private_colors) { + TRACE(("using private color registers\n")); + init_color_registers(graphic->private_color_registers, graphics_id); + graphic->color_registers = graphic->private_color_registers; + } else { + TRACE(("using shared color registers\n")); + graphic->color_registers = getSharedRegisters(); + } + + graphic->charrow = charrow; + graphic->charcol = charcol; + graphic->type = type; + graphic->valid = 0; +} + +Graphic * +get_new_graphic(XtermWidget xw, int charrow, int charcol, unsigned type) +{ + TScreen const *screen = TScreenOf(xw); + int bufferid = screen->whichBuf; + int graphics_id = GraphicsId(screen); + Graphic *graphic = NULL; + unsigned ii; + + FOR_EACH_SLOT(ii) { + if ((graphic = getInactiveSlot(screen, ii))) { + TRACE(("using fresh graphic index=%u id=%u\n", ii, next_graphic_id)); + break; + } + } + + /* if none are free, recycle the graphic scrolled back the farthest */ + if (!graphic) { + int min_charrow = 0; + Graphic *min_graphic = NULL; + + FOR_EACH_SLOT(ii) { + if (!(graphic = getActiveSlot(ii))) + continue; + if (!min_graphic || graphic->charrow < min_charrow) { + min_charrow = graphic->charrow; + min_graphic = graphic; + } + } + TRACE(("recycling old graphic index=%u id=%u\n", ii, next_graphic_id)); + graphic = min_graphic; + } + + if (graphic) { + unsigned num_color_registers; + num_color_registers = get_color_register_count(screen); + graphic->xw = xw; + graphic->bufferid = bufferid; + graphic->id = next_graphic_id++; + init_graphic(graphic, + type, + graphics_id, + charrow, + charcol, + num_color_registers, + screen->privatecolorregisters); + } + return graphic; +} + +Graphic * +get_new_or_matching_graphic(XtermWidget xw, + int charrow, + int charcol, + int actual_width, + int actual_height, + unsigned type) +{ + TScreen const *screen = TScreenOf(xw); + int bufferid = screen->whichBuf; + Graphic *graphic; + unsigned ii; + + FOR_EACH_SLOT(ii) { + TRACE(("checking slot=%u for graphic at %d,%d %dx%d bufferid=%d type=%u\n", ii, + charrow, charcol, + actual_width, actual_height, + bufferid, type)); + if ((graphic = getActiveSlot(ii))) { + if (graphic->type == type && + graphic->bufferid == bufferid && + graphic->charrow == charrow && + graphic->charcol == charcol && + graphic->actual_width == actual_width && + graphic->actual_height == actual_height) { + TRACE(("found existing graphic slot=%u id=%u\n", ii, graphic->id)); + return graphic; + } + TRACE(("not a match: graphic at %d,%d %dx%d bufferid=%d type=%u\n", + graphic->charrow, graphic->charcol, + graphic->actual_width, graphic->actual_height, + graphic->bufferid, graphic->type)); + } + } + + /* if no match get a new graphic */ + if ((graphic = get_new_graphic(xw, charrow, charcol, type))) { + graphic->actual_width = actual_width; + graphic->actual_height = actual_height; + TRACE(("no match; created graphic at %d,%d %dx%d bufferid=%d type=%u\n", + graphic->charrow, graphic->charcol, + graphic->actual_width, graphic->actual_height, + graphic->bufferid, graphic->type)); + } + return graphic; +} + +#define ScaleForXColor(s) (unsigned short) ((long)(s) * 65535 / CHANNEL_MAX) + +static int +save_allocated_color(const ColorRegister *reg, XtermWidget xw, Pixel *pix) +{ + unsigned const rr = ((unsigned) reg->r * (LOOKUP_WIDTH - 1)) / CHANNEL_MAX; + unsigned const gg = ((unsigned) reg->g * (LOOKUP_WIDTH - 1)) / CHANNEL_MAX; + unsigned const bb = ((unsigned) reg->b * (LOOKUP_WIDTH - 1)) / CHANNEL_MAX; + XColor xcolor; + AllocatedColorRegister *new_color; + + xcolor.pixel = 0UL; + xcolor.red = ScaleForXColor(reg->r); + xcolor.green = ScaleForXColor(reg->g); + xcolor.blue = ScaleForXColor(reg->b); + xcolor.flags = DoRed | DoGreen | DoBlue; + if (!allocateBestRGB(xw, &xcolor)) { + TRACE(("unable to allocate xcolor\n")); + *pix = 0UL; + return 0; + } else { + *pix = xcolor.pixel; + + if (!(new_color = malloc(sizeof(*new_color)))) { + TRACE(("unable to save pixel %lu\n", (unsigned long) *pix)); + return 0; + } else { + new_color->r = reg->r; + new_color->g = reg->g; + new_color->b = reg->b; + new_color->pix = *pix; + new_color->next = allocated_colors[rr][gg][bb]; + + allocated_colors[rr][gg][bb] = new_color; + + return 1; + } + } +} + +/* FIXME: with so many possible colors we need to determine + * when to free them to be nice to PseudoColor displays + */ +static Pixel +color_register_to_xpixel(const ColorRegister *reg, XtermWidget xw) +{ + Pixel result; + unsigned const rr = ((unsigned) reg->r * (LOOKUP_WIDTH - 1)) / CHANNEL_MAX; + unsigned const gg = ((unsigned) reg->g * (LOOKUP_WIDTH - 1)) / CHANNEL_MAX; + unsigned const bb = ((unsigned) reg->b * (LOOKUP_WIDTH - 1)) / CHANNEL_MAX; + const AllocatedColorRegister *search; + + for (search = allocated_colors[rr][gg][bb]; search; search = search->next) { + if (search->r == reg->r && + search->g == reg->g && + search->b == reg->b) { + return search->pix; + } + } + + save_allocated_color(reg, xw, &result); + return result; +} + +static void +refresh_graphic(TScreen const *screen, + Graphic const *graphic, + ColorRegister *buffer, + int refresh_x, + int refresh_y, + int refresh_w, + int refresh_h, + int draw_x, + int draw_y, + int draw_w, + int draw_h) +{ + int const pw = graphic->pixw; + int const ph = graphic->pixh; + int const graph_x = graphic->charcol * FontWidth(screen); + int const graph_y = graphic->charrow * FontHeight(screen); + int const graph_w = graphic->actual_width; + int const graph_h = graphic->actual_height; + int const mw = graphic->max_width; + int r, c; + int holes, total, out_of_range; + RegisterNum regnum; + + TRACE(("refreshing graphic %u from %d,%d %dx%d (valid=%d, size=%dx%d, scale=%dx%d max=%dx%d)\n", + graphic->id, + graph_x, graph_y, draw_w, draw_h, + graphic->valid, + graphic->actual_width, + graphic->actual_height, + pw, ph, + graphic->max_width, + graphic->max_height)); + + TRACE(("refresh pixmap starts at %d,%d\n", refresh_x, refresh_y)); + + holes = total = 0; + out_of_range = 0; + for (r = 0; r < graph_h; r++) { + int pmy = graph_y + r * ph; + + if (pmy + ph - 1 < draw_y) + continue; + if (pmy > draw_y + draw_h - 1) + break; + + if (pmy < draw_y || pmy > draw_y + draw_h - 1 || + pmy < refresh_y || pmy > refresh_y + refresh_h - 1) { + out_of_range++; + continue; + } + + for (c = 0; c < graph_w; c++) { + int pmx = graph_x + c * pw; + + if (pmx + pw - 1 < draw_x) + continue; + if (pmx > draw_x + draw_w - 1) + break; + + if (pmx < draw_x || pmx > draw_x + draw_w - 1 || + pmx < refresh_x || pmx > refresh_x + refresh_w - 1) { + out_of_range++; + continue; + } + + total++; + regnum = graphic->pixels[r * mw + c]; + if (regnum == COLOR_HOLE) { + holes++; + } else { + buffer[(pmy - refresh_y) * refresh_w + + (pmx - refresh_x)] = + graphic->color_registers[regnum]; + } + } + } + + TRACE(("done refreshing graphic: %d of %d refreshed pixels were holes; %d were out of pixmap range\n", + holes, total, out_of_range)); +} + +#ifdef DEBUG_REFRESH + +#define BASEX(X) ( (draw_x - base_x) + (X) ) +#define BASEY(Y) ( (draw_y - base_y) + (Y) ) + +static void +outline_refresh(TScreen const *screen, + Graphic const *graphic, + Pixmap output_pm, + GC graphics_gc, + int base_x, + int base_y, + int draw_x, + int draw_y, + int draw_w, + int draw_h) +{ + Display *const display = screen->display; + int const pw = graphic->pixw; + int const ph = graphic->pixh; + XGCValues xgcv; + XColor def; + + def.red = (unsigned short) ((1.0 - 0.1 * (rand() / (double) + RAND_MAX) * 65535.0)); + def.green = (unsigned short) ((0.7 + 0.2 * (rand() / (double) + RAND_MAX)) * 65535.0); + def.blue = (unsigned short) ((0.1 + 0.1 * (rand() / (double) + RAND_MAX)) * 65535.0); + def.flags = DoRed | DoGreen | DoBlue; + if (allocateBestRGB(graphic->xw, &def)) { + xgcv.foreground = def.pixel; + XChangeGC(display, graphics_gc, GCForeground, &xgcv); + } + + XDrawLine(display, output_pm, graphics_gc, + BASEX(0), BASEY(0), + BASEX(draw_w - 1), BASEY(0)); + XDrawLine(display, output_pm, graphics_gc, + BASEX(0), BASEY(draw_h - 1), + BASEX(draw_w - 1), BASEY(draw_h - 1)); + + XDrawLine(display, output_pm, graphics_gc, + BASEX(0), BASEY(0), + BASEX(0), BASEY(draw_h - 1)); + XDrawLine(display, output_pm, graphics_gc, + BASEX(draw_w - 1), BASEY(0), + BASEX(draw_w - 1), BASEY(draw_h - 1)); + + XDrawLine(display, output_pm, graphics_gc, + BASEX(draw_w - 1), BASEY(0), + BASEX(0), BASEY(draw_h - 1)); + XDrawLine(display, output_pm, graphics_gc, + BASEX(draw_w - 1), BASEY(draw_h - 1), + BASEX(0), BASEY(0)); + + def.red = (short) (0.7 * 65535.0); + def.green = (short) (0.1 * 65535.0); + def.blue = (short) (1.0 * 65535.0); + def.flags = DoRed | DoGreen | DoBlue; + if (allocateBestRGB(graphic->xw, &def)) { + xgcv.foreground = def.pixel; + XChangeGC(display, graphics_gc, GCForeground, &xgcv); + } + XFillRectangle(display, output_pm, graphics_gc, + BASEX(0), + BASEY(0), + (unsigned) pw, (unsigned) ph); + XFillRectangle(display, output_pm, graphics_gc, + BASEX(draw_w - 1 - pw), + BASEY(draw_h - 1 - ph), + (unsigned) pw, (unsigned) ph); +} +#endif + +/* + * Primary color hues: + * blue: 0 degrees + * red: 120 degrees + * green: 240 degrees + */ +void +hls2rgb(int h, int l, int s, short *r, short *g, short *b) +{ + const int hs = ((h + 240) / 60) % 6; + const double lv = l / 100.0; + const double sv = s / 100.0; + double c, x, m, c2; + double r1, g1, b1; + + if (s == 0) { + *r = *g = *b = (short) l; + return; + } + + c2 = (2.0 * lv) - 1.0; + if (c2 < 0.0) + c2 = -c2; + c = (1.0 - c2) * sv; + x = (hs & 1) ? c : 0.0; + m = lv - 0.5 * c; + + switch (hs) { + case 0: + r1 = c; + g1 = x; + b1 = 0.0; + break; + case 1: + r1 = x; + g1 = c; + b1 = 0.0; + break; + case 2: + r1 = 0.0; + g1 = c; + b1 = x; + break; + case 3: + r1 = 0.0; + g1 = x; + b1 = c; + break; + case 4: + r1 = x; + g1 = 0.0; + b1 = c; + break; + case 5: + r1 = c; + g1 = 0.0; + b1 = x; + break; + default: + TRACE(("Bad HLS input: [%d,%d,%d], returning white\n", h, l, s)); + *r = (short) 100; + *g = (short) 100; + *b = (short) 100; + return; + } + + *r = (short) ((r1 + m) * 100.0 + 0.5); + *g = (short) ((g1 + m) * 100.0 + 0.5); + *b = (short) ((b1 + m) * 100.0 + 0.5); + + if (*r < 0) + *r = 0; + else if (*r > 100) + *r = 100; + if (*g < 0) + *g = 0; + else if (*g > 100) + *g = 100; + if (*b < 0) + *b = 0; + else if (*b > 100) + *b = 100; +} + +void +dump_graphic(Graphic const *graphic) +{ +#if defined(DUMP_COLORS) || defined(DUMP_BITMAP) + RegisterNum color; +#endif +#ifdef DUMP_BITMAP + int r, c; + ColorRegister const *reg; +#endif + + (void) graphic; + + TRACE(("graphic stats: id=%u charrow=%d charcol=%d actual_width=%d actual_height=%d pixw=%d pixh=%d\n", + graphic->id, + graphic->charrow, + graphic->charcol, + graphic->actual_width, + graphic->actual_height, + graphic->pixw, + graphic->pixh)); + +#ifdef DUMP_COLORS + TRACE(("graphic colors:\n")); + for (color = 0; color < graphic->valid_registers; color++) { + TRACE(("%03u: %d,%d,%d\n", + color, + graphic->color_registers[color].r, + graphic->color_registers[color].g, + graphic->color_registers[color].b)); + } +#endif + +#ifdef DUMP_BITMAP + TRACE(("graphic pixels:\n")); + for (r = 0; r < graphic->actual_height; r++) { + for (c = 0; c < graphic->actual_width; c++) { + color = graphic->pixels[r * graphic->max_width + c]; + if (color == COLOR_HOLE) { + TRACE(("?")); + } else { + reg = &graphic->color_registers[color]; + if (reg->r + reg->g + reg->b > 200) { + TRACE(("#")); + } else if (reg->r + reg->g + reg->b > 150) { + TRACE(("%%")); + } else if (reg->r + reg->g + reg->b > 100) { + TRACE((":")); + } else if (reg->r + reg->g + reg->b > 80) { + TRACE((".")); + } else { + TRACE((" ")); + } + } + } + TRACE(("\n")); + } + + TRACE(("\n")); +#endif +} + +/* Erase the portion of any displayed graphic overlapping with a rectangle + * of the given size and location in pixels relative to the start of the + * graphic. This is used to allow text to "erase" graphics underneath it. + */ +static void +erase_graphic(Graphic *graphic, int x, int y, int w, int h) +{ + RegisterNum hole = COLOR_HOLE; + int pw, ph; + int r, c; + int rbase, cbase; + + pw = graphic->pixw; + ph = graphic->pixh; + + TRACE(("erasing graphic %d,%d %dx%d\n", x, y, w, h)); + + rbase = 0; + for (r = 0; r < graphic->actual_height; r++) { + if (rbase + ph - 1 >= y + && rbase <= y + h - 1) { + cbase = 0; + for (c = 0; c < graphic->actual_width; c++) { + if (cbase + pw - 1 >= x + && cbase <= x + w - 1) { + graphic->pixels[r * graphic->max_width + c] = hole; + } + cbase += pw; + } + } + rbase += ph; + } +} + +static int +compare_graphic_ids(const void *left, const void *right) +{ + const Graphic *l = *(const Graphic *const *) left; + const Graphic *r = *(const Graphic *const *) right; + + if (!l->valid || !r->valid) + return 0; + + if (l->bufferid < r->bufferid) + return -1; + else if (l->bufferid > r->bufferid) + return 1; + + if (l->id < r->id) + return -1; + else + return 1; +} + +static void +clip_area(int *orig_x, int *orig_y, int *orig_w, int *orig_h, + int clip_x, int clip_y, int clip_w, int clip_h) +{ + if (*orig_x < clip_x) { + const int diff = clip_x - *orig_x; + *orig_x += diff; + *orig_w -= diff; + } + if (*orig_w > 0 && *orig_x + *orig_w > clip_x + clip_w) { + *orig_w -= (*orig_x + *orig_w) - (clip_x + clip_w); + } + + if (*orig_y < clip_y) { + const int diff = clip_y - *orig_y; + *orig_y += diff; + *orig_h -= diff; + } + if (*orig_h > 0 && *orig_y + *orig_h > clip_y + clip_h) { + *orig_h -= (*orig_y + *orig_h) - (clip_y + clip_h); + } +} + +/* the coordinates are relative to the screen */ +static void +refresh_graphics(XtermWidget xw, + int leftcol, + int toprow, + int ncols, + int nrows, + int skip_clean) +{ + TScreen *const screen = TScreenOf(xw); + Display *const display = screen->display; + Window const drawable = VDrawable(screen); + int const scroll_y = screen->topline * FontHeight(screen); + int const refresh_x = leftcol * FontWidth(screen); + int const refresh_y = toprow * FontHeight(screen) + scroll_y; + int const refresh_w = ncols * FontWidth(screen); + int const refresh_h = nrows * FontHeight(screen); + int draw_x_min, draw_x_max; + int draw_y_min, draw_y_max; + Graphic *ordered_graphics[MAX_GRAPHICS]; + unsigned ii, jj; + unsigned active_count; + unsigned holes, non_holes; + int xx, yy; + ColorRegister *buffer; + + active_count = 0; + FOR_EACH_SLOT(ii) { + Graphic *graphic; + if (!(graphic = getActiveSlot(ii))) + continue; + TRACE(("refreshing graphic %d on buffer %d, current buffer %d\n", + graphic->id, graphic->bufferid, screen->whichBuf)); + if (screen->whichBuf == 0) { + if (graphic->bufferid != 0) { + TRACE(("skipping graphic %d from alt buffer (%d) when drawing screen=%d\n", + graphic->id, graphic->bufferid, screen->whichBuf)); + continue; + } + } else { + if (graphic->bufferid == 0 && graphic->charrow >= 0) { + TRACE(("skipping graphic %d from normal buffer (%d) when drawing screen=%d because it is not in scrollback area\n", + graphic->id, graphic->bufferid, screen->whichBuf)); + continue; + } + if (graphic->bufferid == 1 && + graphic->charrow + (graphic->actual_height + + FontHeight(screen) - 1) / + FontHeight(screen) < 0) { + TRACE(("skipping graphic %d from alt buffer (%d) when drawing screen=%d because it is completely in scrollback area\n", + graphic->id, graphic->bufferid, screen->whichBuf)); + continue; + } + } + if (graphic->hidden) + continue; + ordered_graphics[active_count++] = graphic; + } + + if (active_count == 0) + return; + if (active_count > 1) { + qsort(ordered_graphics, + (size_t) active_count, + sizeof(ordered_graphics[0]), + compare_graphic_ids); + } + + if (skip_clean) { + unsigned skip_count; + + for (jj = 0; jj < active_count; ++jj) { + if (ordered_graphics[jj]->dirty) + break; + } + skip_count = jj; + if (skip_count == active_count) + return; + + active_count -= skip_count; + for (jj = 0; jj < active_count; ++jj) { + ordered_graphics[jj] = ordered_graphics[jj + skip_count]; + } + } + + if (!(buffer = malloc(sizeof(*buffer) * + (unsigned) refresh_w * (unsigned) refresh_h))) { + TRACE(("unable to allocate %dx%d buffer for graphics refresh\n", + refresh_w, refresh_h)); + return; + } + for (yy = 0; yy < refresh_h; yy++) { + for (xx = 0; xx < refresh_w; xx++) { + buffer[yy * refresh_w + xx] = null_color; + } + } + + TRACE(("refresh: screen->topline=%d leftcol=%d toprow=%d nrows=%d ncols=%d (%d,%d %dx%d)\n", + screen->topline, + leftcol, toprow, + nrows, ncols, + refresh_x, refresh_y, + refresh_w, refresh_h)); + + { + int const altarea_x = 0; + int const altarea_y = 0; + int const altarea_w = Width(screen) * FontWidth(screen); + int const altarea_h = Height(screen) * FontHeight(screen); + + int const scrollarea_x = 0; + int const scrollarea_y = scroll_y; + int const scrollarea_w = Width(screen) * FontWidth(screen); + int const scrollarea_h = -scroll_y; + + int const mainarea_x = 0; + int const mainarea_y = scroll_y; + int const mainarea_w = Width(screen) * FontWidth(screen); + int const mainarea_h = -scroll_y + Height(screen) * FontHeight(screen); + + draw_x_min = refresh_x + refresh_w; + draw_x_max = refresh_x - 1; + draw_y_min = refresh_y + refresh_h; + draw_y_max = refresh_y - 1; + for (jj = 0; jj < active_count; ++jj) { + Graphic *graphic = ordered_graphics[jj]; + int draw_x = graphic->charcol * FontWidth(screen); + int draw_y = graphic->charrow * FontHeight(screen); + int draw_w = graphic->actual_width; + int draw_h = graphic->actual_height; + + if (screen->whichBuf != 0) { + if (graphic->bufferid != 0) { + /* clip to alt buffer */ + clip_area(&draw_x, &draw_y, &draw_w, &draw_h, + altarea_x, altarea_y, altarea_w, altarea_h); + } else { + /* clip to scrollback area */ + clip_area(&draw_x, &draw_y, &draw_w, &draw_h, + scrollarea_x, scrollarea_y, + scrollarea_w, scrollarea_h); + } + } else { + /* clip to scrollback + normal area */ + clip_area(&draw_x, &draw_y, &draw_w, &draw_h, + mainarea_x, mainarea_y, + mainarea_w, mainarea_h); + } + + clip_area(&draw_x, &draw_y, &draw_w, &draw_h, + refresh_x, refresh_y, refresh_w, refresh_h); + + TRACE(("refresh: graph=%u\n", jj)); + TRACE((" refresh_x=%d refresh_y=%d refresh_w=%d refresh_h=%d\n", + refresh_x, refresh_y, refresh_w, refresh_h)); + TRACE((" draw_x=%d draw_y=%d draw_w=%d draw_h=%d\n", + draw_x, draw_y, draw_w, draw_h)); + + if (draw_w > 0 && draw_h > 0) { + refresh_graphic(screen, graphic, buffer, + refresh_x, refresh_y, + refresh_w, refresh_h, + draw_x, draw_y, + draw_w, draw_h); + if (draw_x < draw_x_min) + draw_x_min = draw_x; + if (draw_x + draw_w - 1 > draw_x_max) + draw_x_max = draw_x + draw_w - 1; + if (draw_y < draw_y_min) + draw_y_min = draw_y; + if (draw_y + draw_h - 1 > draw_y_max) + draw_y_max = draw_y + draw_h - 1; + } + graphic->dirty = 0; + } + } + + if (draw_x_max < refresh_x || + draw_x_min > refresh_x + refresh_w - 1 || + draw_y_max < refresh_y || + draw_y_min > refresh_y + refresh_h - 1) { + free(buffer); + return; + } + + holes = 0U; + non_holes = 0U; + { + int y_min = draw_y_min - refresh_y; + int y_max = draw_y_max - refresh_y; + int x_min = draw_x_min - refresh_x; + int x_max = draw_x_max - refresh_x; + const ColorRegister *base = buffer + (y_min * refresh_w); + + for (yy = y_min; yy <= y_max; yy++) { + const ColorRegister *scan = base + x_min; + for (xx = x_min; xx <= x_max; xx++) { + if (scan->r < 0 || scan->g < 0 || scan->b < 0) { + holes++; + } else { + non_holes++; + } + ++scan; + } + base += refresh_w; + } + } + + if (non_holes < 1U) { + TRACE(("refresh: visible graphics areas are erased; nothing to do\n")); + free(buffer); + return; + } + + /* + * If we have any holes we can't just copy an image rectangle, and masking + * with bitmaps is very expensive. This fallback is surprisingly faster + * than the XPutImage version in some cases, but I don't know why. + * (This is even though there's no X11 primitive for drawing a horizontal + * line of height one and no attempt is made to handle multiple lines at + * once.) + */ + if (holes > 0U) { + GC graphics_gc; + XGCValues xgcv; + ColorRegister last_color; + ColorRegister gc_color; + int run; + + memset(&xgcv, 0, sizeof(xgcv)); + xgcv.graphics_exposures = False; + graphics_gc = XCreateGC(display, drawable, GCGraphicsExposures, &xgcv); + if (graphics_gc == None) { + TRACE(("unable to allocate GC for graphics refresh\n")); + free(buffer); + return; + } + + last_color = null_color; + gc_color = null_color; + run = 0; + for (yy = draw_y_min - refresh_y; yy <= draw_y_max - refresh_y; yy++) { + for (xx = draw_x_min - refresh_x; xx <= draw_x_max - refresh_x; + xx++) { + const ColorRegister color = buffer[yy * refresh_w + xx]; + + if (color.r < 0 || color.g < 0 || color.b < 0) { + last_color = color; + if (run > 0) { + XDrawLine(display, drawable, graphics_gc, + OriginX(screen) + refresh_x + xx - run, + (OriginY(screen) - scroll_y) + refresh_y + yy, + OriginX(screen) + refresh_x + xx - 1, + (OriginY(screen) - scroll_y) + refresh_y + yy); + run = 0; + } + continue; + } + + if (DiffColor(color, last_color)) { + last_color = color; + if (run > 0) { + XDrawLine(display, drawable, graphics_gc, + OriginX(screen) + refresh_x + xx - run, + (OriginY(screen) - scroll_y) + refresh_y + yy, + OriginX(screen) + refresh_x + xx - 1, + (OriginY(screen) - scroll_y) + refresh_y + yy); + run = 0; + } + + if (DiffColor(color, gc_color)) { + xgcv.foreground = + color_register_to_xpixel(&color, xw); + XChangeGC(display, graphics_gc, GCForeground, &xgcv); + gc_color = color; + } + } + run++; + } + if (run > 0) { + last_color = null_color; + XDrawLine(display, drawable, graphics_gc, + OriginX(screen) + refresh_x + xx - run, + (OriginY(screen) - scroll_y) + refresh_y + yy, + OriginX(screen) + refresh_x + xx - 1, + (OriginY(screen) - scroll_y) + refresh_y + yy); + run = 0; + } + } + + XFreeGC(display, graphics_gc); + } else { + XGCValues xgcv; + GC graphics_gc; + ColorRegister old_colors[2]; + Pixel fg, old_result[2]; + XImage *image; + char *imgdata; + unsigned image_w, image_h; + int nn; + + memset(&xgcv, 0, sizeof(xgcv)); + xgcv.graphics_exposures = False; + graphics_gc = XCreateGC(display, drawable, GCGraphicsExposures, &xgcv); + if (graphics_gc == None) { + TRACE(("unable to allocate GC for graphics refresh\n")); + free(buffer); + return; + } + + /* FIXME: is it worth reusing the GC/Image/imagedata across calls? */ + /* FIXME: is it worth using shared memory when available? */ + image_w = (unsigned) draw_x_max + 1U - (unsigned) draw_x_min; + image_h = (unsigned) draw_y_max + 1U - (unsigned) draw_y_min; + image = XCreateImage(display, xw->visInfo->visual, + (unsigned) xw->visInfo->depth, + ZPixmap, 0, NULL, + image_w, image_h, + (int) (sizeof(int) * 8U), 0); + if (!image) { + TRACE(("unable to allocate XImage for graphics refresh\n")); + XFreeGC(display, graphics_gc); + free(buffer); + return; + } + imgdata = malloc((size_t) (image_h * (unsigned) image->bytes_per_line)); + if (!imgdata) { + TRACE(("unable to allocate XImage for graphics refresh\n")); + XDestroyImage(image); + XFreeGC(display, graphics_gc); + free(buffer); + return; + } + image->data = imgdata; + + fg = 0U; + nn = 0; + + /* two-level cache cuts down on lookup-calls */ + old_result[0] = 0U; + old_result[1] = 0U; + old_colors[0] = null_color; + old_colors[1] = null_color; + + for (yy = draw_y_min - refresh_y; yy <= draw_y_max - refresh_y; yy++) { + for (xx = draw_x_min - refresh_x; xx <= draw_x_max - refresh_x; + xx++) { + const ColorRegister color = buffer[yy * refresh_w + xx]; + + if (DiffColor(color, old_colors[nn])) { + if (DiffColor(color, old_colors[!nn])) { + nn = !nn; + fg = color_register_to_xpixel(&color, xw); + old_result[nn] = fg; + old_colors[nn] = color; + } else { + nn = !nn; + fg = old_result[nn]; + } + } + + XPutPixel(image, + xx + refresh_x - draw_x_min, + yy + refresh_y - draw_y_min, fg); + } + } + + XPutImage(display, drawable, graphics_gc, image, + 0, 0, + OriginX(screen) + draw_x_min, + (OriginY(screen) - scroll_y) + draw_y_min, + image_w, image_h); + free(imgdata); + image->data = NULL; + XDestroyImage(image); + XFreeGC(display, graphics_gc); + } + + free(buffer); + XFlush(display); +} + +void +refresh_displayed_graphics(XtermWidget xw, + int leftcol, + int toprow, + int ncols, + int nrows) +{ + refresh_graphics(xw, leftcol, toprow, ncols, nrows, 0); +} + +void +refresh_modified_displayed_graphics(XtermWidget xw) +{ + TScreen const *screen = TScreenOf(xw); + refresh_graphics(xw, 0, 0, MaxCols(screen), MaxRows(screen), 1); +} + +void +scroll_displayed_graphics(XtermWidget xw, int rows) +{ + if (used_graphics) { + TScreen const *screen = TScreenOf(xw); + unsigned ii; + + TRACE(("graphics scroll: moving all up %d rows\n", rows)); + /* FIXME: VT125 ReGIS graphics are fixed at the upper left of the display; need to verify */ + + FOR_EACH_SLOT(ii) { + Graphic *graphic; + + if (!(graphic = getActiveSlot(ii))) + continue; + if (graphic->bufferid != screen->whichBuf) + continue; + if (graphic->hidden) + continue; + + graphic->charrow -= rows; + } + } +} + +void +pixelarea_clear_displayed_graphics(TScreen const *screen, + int winx, + int winy, + int w, + int h) +{ + unsigned ii; + + if (!used_graphics) + return; + + FOR_EACH_SLOT(ii) { + Graphic *graphic; + /* FIXME: are these coordinates (scrolled) screen-relative? */ + int const scroll_y = (screen->whichBuf == 0 + ? screen->topline * FontHeight(screen) + : 0); + int graph_x; + int graph_y; + int x, y; + + if (!(graphic = getActiveSlot(ii))) + continue; + if (graphic->bufferid != screen->whichBuf) + continue; + if (graphic->hidden) + continue; + + graph_x = graphic->charcol * FontWidth(screen); + graph_y = graphic->charrow * FontHeight(screen); + x = winx - graph_x; + y = (winy - scroll_y) - graph_y; + + TRACE(("pixelarea clear graphics: screen->topline=%d winx=%d winy=%d w=%d h=%d x=%d y=%d\n", + screen->topline, + winx, winy, + w, h, + x, y)); + erase_graphic(graphic, x, y, w, h); + } +} + +void +chararea_clear_displayed_graphics(TScreen const *screen, + int leftcol, + int toprow, + int ncols, + int nrows) +{ + if (used_graphics) { + int const x = leftcol * FontWidth(screen); + int const y = toprow * FontHeight(screen); + int const w = ncols * FontWidth(screen); + int const h = nrows * FontHeight(screen); + + TRACE(("chararea clear graphics: screen->topline=%d leftcol=%d toprow=%d nrows=%d ncols=%d x=%d y=%d w=%d h=%d\n", + screen->topline, + leftcol, toprow, + nrows, ncols, + x, y, w, h)); + pixelarea_clear_displayed_graphics(screen, x, y, w, h); + } +} + +void +reset_displayed_graphics(TScreen const *screen) +{ + init_color_registers(getSharedRegisters(), GraphicsId(screen)); + + if (used_graphics) { + unsigned ii; + + TRACE(("resetting all graphics\n")); + FOR_EACH_SLOT(ii) { + deactivateSlot(ii); + } + } +} + +#ifdef NO_LEAKS +void +noleaks_graphics(void) +{ + unsigned ii; + + FOR_EACH_SLOT(ii) { + deactivateSlot(ii); + } +} +#endif diff --git a/ports/xterm/xterm-359/graphics.h b/ports/xterm/xterm-359/graphics.h new file mode 100644 index 0000000..90bedf4 --- /dev/null +++ b/ports/xterm/xterm-359/graphics.h @@ -0,0 +1,127 @@ +/* $XTermId: graphics.h,v 1.23 2016/05/29 16:11:41 tom Exp $ */ + +/* + * Copyright 2013-2015,2016 by Ross Combs + * Copyright 2013-2015,2016 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +#ifndef included_graphics_h +#define included_graphics_h +/* *INDENT-OFF* */ + +#include + +#if OPT_GRAPHICS + +#define CHANNEL_MAX 100 + +typedef struct { + short r, g, b; +} ColorRegister; + +typedef unsigned short RegisterNum; + +#define MAX_COLOR_REGISTERS 1024U +#define COLOR_HOLE ((RegisterNum)MAX_COLOR_REGISTERS) + +#define MAX_GRAPHICS 16U + +typedef struct { + RegisterNum *pixels; + ColorRegister *private_color_registers; + ColorRegister *color_registers; + char color_registers_used[MAX_COLOR_REGISTERS]; + XtermWidget xw; + int max_width; /* largest image which can be stored */ + int max_height; /* largest image which can be stored */ + unsigned valid_registers; /* for wrap-around behavior */ + int actual_width; /* size of image before scaling */ + int actual_height; /* size of image before scaling */ + int private_colors; /* if not using the shared color registers */ + int charrow; /* upper left starting point in characters */ + int charcol; /* upper left starting point in characters */ + int pixw; /* width of graphic pixels in screen pixels */ + int pixh; /* height of graphic pixels in screen pixels */ + int bufferid; /* which screen buffer the graphic is associated with */ + unsigned type; /* type of graphic 0==sixel, 1...NUM_REGIS_PAGES==ReGIS page */ + unsigned id; /* sequential id used for preserving layering */ + int valid; /* if the graphic has been initialized */ + int dirty; /* if the graphic needs to be redrawn */ + int hidden; /* if the graphic should not be displayed */ +} Graphic; + +extern Graphic *get_new_graphic(XtermWidget /* xw */, int /* charrow */, int /* charcol */, unsigned /* type */); +extern Graphic *get_new_or_matching_graphic(XtermWidget /* xw */, int /* charrow */, int /* charcol */, int /* actual_width */, int /* actual_height */, unsigned /* type */); +extern RegisterNum read_pixel(Graphic */* graphic */, int /* x */, int /* y */); +extern void draw_solid_pixel(Graphic */* graphic */, int /* x */, int /* y */, unsigned /* color */); +extern void draw_solid_rectangle(Graphic */* graphic */, int /* x1 */, int /* y1 */, int /* x2 */, int /* y2 */, unsigned /* color */); +extern void draw_solid_line(Graphic */* graphic */, int /* x1 */, int /* y1 */, int /* x2 */, int /* y2 */, unsigned /* color */); +extern void copy_overlapping_area(Graphic */* graphic */, int /* src_x */, int /* src_y */, int /* dst_x */, int /* dst_y */, unsigned /* w */, unsigned /* h */, unsigned /* default_color */); +extern void hls2rgb(int /* h */, int /* l */, int /* s */, short */* r */, short */* g */, short */* b */); +extern void dump_graphic(Graphic const */* graphic */); +extern unsigned get_color_register_count(TScreen const */* screen */); +extern void update_color_register(Graphic */* graphic */, unsigned /* color */, int /* r */, int /* g */, int /* b */); +extern RegisterNum find_color_register(ColorRegister const */* color_registers */, int /* r */, int /* g */, int /* b */); +extern void chararea_clear_displayed_graphics(TScreen const */* screen */, int /* leftcol */, int /* toprow */, int /* ncols */, int /* nrows */); +extern void pixelarea_clear_displayed_graphics(TScreen const */* screen */, int /* winx */, int /* winy */, int /* w */, int /* h */); +extern void refresh_displayed_graphics(XtermWidget /* xw */, int /* leftcol */, int /* toprow */, int /* ncols */, int /* nrows */); +extern void refresh_modified_displayed_graphics(XtermWidget /* xw */); +extern void reset_displayed_graphics(TScreen const */* screen */); +extern void scroll_displayed_graphics(XtermWidget /* xw */, int /* rows */); + +#ifdef NO_LEAKS +extern void noleaks_graphics(void); +#endif + +#else + +#define get_new_graphic(xw, charrow, charcol, type) /* nothing */ +#define get_new_or_matching_graphic(xw, charrow, charcol, actual_width, actual_height, type) /* nothing */ +#define read_pixel(graphic, x, y) /* nothing */ +#define draw_solid_pixel(graphic, x, y, color) /* nothing */ +#define draw_solid_rectangle(graphic, x1, y1, x2, y2, color) /* nothing */ +#define draw_solid_line(graphic, x1, y1, x2, y2, color) /* nothing */ +#define copy_overlapping_area(graphic, src_x, src_y, dst_x, dst_y, w, h, default_color) /* nothing */ +#define hls2rgb(h, l, s, r, g, b) /* nothing */ +#define dump_graphic(graphic) /* nothing */ +#define get_color_register_count(screen) /* nothing */ +#define update_color_register(graphic, color, r, g, b) /* nothing */ +#define find_color_register(color_registers, r, g, b) /* nothing */ +#define chararea_clear_displayed_graphics(screen, leftcol, toprow, ncols, nrows) /* nothing */ +#define pixelarea_clear_displayed_graphics(screen, winx, winy, w, h) /* nothing */ +#define refresh_displayed_graphics(xw, leftcol, toprow, ncols, nrows) /* nothing */ +#define refresh_modified_displayed_graphics(xw) /* nothing */ +#define reset_displayed_graphics(screen) /* nothing */ +#define scroll_displayed_graphics(xw, rows) /* nothing */ + +#endif + +/* *INDENT-ON* */ + +#endif /* included_graphics_h */ diff --git a/ports/xterm/xterm-359/graphics.o b/ports/xterm/xterm-359/graphics.o new file mode 100644 index 0000000000000000000000000000000000000000..82e2b4021f34c4724b577a5b90e0ea3de7414070 GIT binary patch literal 121648 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

    >_4mH)7W}=C4istD>PD$Avl?+-g~??^ST_ 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 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/graphics_regis.c b/ports/xterm/xterm-359/graphics_regis.c new file mode 100644 index 0000000..f942e72 --- /dev/null +++ b/ports/xterm/xterm-359/graphics_regis.c @@ -0,0 +1,7520 @@ +/* $XTermId: graphics_regis.c,v 1.121 2020/08/04 00:46:08 tom Exp $ */ + +/* + * Copyright 2014-2019,2020 by Ross Combs + * Copyright 2014-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +/* get rid of shadowing warnings (we will not draw Bessel functions) */ +#define y1 my_y1 +#define y0 my_y0 + +#define SCALE_FIXED_POINT 16U + +#undef DEBUG_PARSING +#undef DEBUG_ALPHABET_LOOKUP +#undef DEBUG_ALPHABETS +#undef DEBUG_BEZIER +#undef DEBUG_SPLINE_SEGMENTS +#undef DEBUG_SPLINE_POINTS +#undef DEBUG_SPLINE_WITH_ROTATION +#undef DEBUG_SPLINE_WITH_OVERDRAW +#undef DEBUG_ARC_POINTS +#undef DEBUG_ARC_CENTER +#undef DEBUG_ARC_START +#undef DEBUG_ARC_END +#undef DEBUG_SPECIFIC_CHAR_METRICS +#define IS_DEBUG_CHAR(CH) ((CH) == 'W') /* glyphs to dump to terminal */ +#undef DEBUG_COMPUTED_FONT_METRICS +#undef DEBUG_FONT_NAME +#undef DEBUG_FONT_SIZE_SEARCH +#undef DEBUG_XFT_GLYPH +#undef DEBUG_USER_GLYPH +#undef DEBUG_LOAD + +/* controls for extensions over VT3x0 limitations */ +#define ENABLE_RGB_COLORSPECS +#undef ENABLE_FREE_ROTATION +#undef ENABLE_DISTORTIONLESS_ROTATION +#define ENABLE_UPLOAD_ALPHABET_FROM_FONT +#define ENABLE_UPLOAD_ALPHABET_ZERO +#define ENABLE_USER_FONT_SIZE +#define ENABLE_VARIABLE_ITALICS + +#define MIN_ITERATIONS_BEFORE_REFRESH 10U +#define MIN_MS_BEFORE_REFRESH 33 +/* *INDENT-OFF* */ +typedef struct RegisPoint { + int x, y; +} RegisPoint; + +typedef struct RegisWriteControls { + unsigned pv_multiplier; + unsigned pattern; + unsigned pattern_multiplier; + unsigned invert_pattern; + unsigned plane_mask; + unsigned write_style; + RegisterNum foreground; + unsigned shading_enabled; + char shading_character; + int shading_reference; + unsigned shading_reference_dim; + unsigned line_width; +} RegisWriteControls; + +typedef struct RegisTextControls { + unsigned alphabet_num; + unsigned character_set_l; /* default: "(B" (ASCII) */ + unsigned character_set_r; /* default: "-@" (Latin-1) */ + unsigned character_display_w; + unsigned character_display_h; + unsigned character_unit_cell_w; + unsigned character_unit_cell_h; + int character_inc_x; + int character_inc_y; + int string_rotation; + int character_rotation; + int slant; /* for italic/oblique */ +} RegisTextControls; + +#define FixedCopy(dst, src, len) strncpy(dst, src, len - 1)[len - 1] = '\0' +#define CopyFontname(dst, src) FixedCopy(dst, src, (size_t) REGIS_FONTNAME_LEN) + +#define MAX_REGIS_PAGES 8U + +#define MAX_REGIS_ALPHABETS 8U +#define REGIS_ALPHABET_NAME_LEN 11U +#define REGIS_FONTNAME_LEN 256U +/* enough for a 16x24 font (about 100KB) */ +#define MAX_REGIS_ALPHABET_BYTES (256U * 16U * 24U) +#define MAX_GLYPH_PIXELS 8192U +#define MAX_GLYPHS 256U +#define INVALID_ALPHABET_NUM ~0U + +typedef struct RegisAlphabet { + unsigned alphabet_num; + unsigned pixw, pixh; + char name[REGIS_ALPHABET_NAME_LEN]; + char fontname[REGIS_FONTNAME_LEN]; + int use_font; + int loaded[MAX_GLYPHS]; + Char *bytes; +} RegisAlphabet; + +typedef struct RegisDataFragment { + char const *start; + unsigned pos; + unsigned len; +} RegisDataFragment; +/* *INDENT-ON* */ + +#define POSITION_STACK_SIZE 16U +#define DUMMY_STACK_X -32768 +#define DUMMY_STACK_Y -32768 + +#define CURVE_POSITION_ARC_EDGE 0U +#define CURVE_POSITION_ARC_CENTER 1U +#define CURVE_POSITION_OPEN_CURVE 2U +#define CURVE_POSITION_CLOSED_CURVE 3U + +#define MAX_INPUT_CURVE_POINTS 16U +#define MAX_CURVE_POINTS (MAX_INPUT_CURVE_POINTS + 4U) + +#define MAX_FILL_POINTS 2048U + +typedef struct RegisParseState { + RegisDataFragment input; + char *temp; + unsigned templen; + char command; + char option; + /* position stack */ + int stack_x[POSITION_STACK_SIZE]; + int stack_y[POSITION_STACK_SIZE]; + unsigned stack_next; /* next empty position */ + /* curve options */ + int curve_mode; + int arclen; + int x_points[MAX_CURVE_POINTS]; + int y_points[MAX_CURVE_POINTS]; + unsigned num_points; + /* load options */ + char load_name[REGIS_ALPHABET_NAME_LEN]; + unsigned load_alphabet; + unsigned load_w, load_h; + unsigned load_index; + unsigned load_glyph; + unsigned load_row; + /* text options */ + unsigned text_tilt_state; +} RegisParseState; + +#define TEXT_TILT_STATE_READY 0U +#define TEXT_TILT_STATE_GOT_D 1U +#define TEXT_TILT_STATE_GOT_DS 2U +#define TEXT_TILT_STATE_GOT_DSD 3U + +typedef struct RegisGraphicsContext { + XtermWidget current_widget; + Graphic *destination_graphic; + Graphic *display_graphic; + int graphics_id; + int x_off, y_off; + int x_div, y_div; + int width, height; + unsigned all_planes; + RegisterNum background; + char const *builtin_font; + RegisAlphabet alphabets[MAX_REGIS_ALPHABETS]; + RegisWriteControls persistent_write_controls; + RegisWriteControls temporary_write_controls; + RegisTextControls persistent_text_controls; + RegisTextControls temporary_text_controls; + RegisTextControls *current_text_controls; + int multi_input_mode; + int graphics_output_cursor_x; + int graphics_output_cursor_y; + unsigned pattern_count; + unsigned pattern_bit; + int fill_mode; + RegisPoint fill_points[MAX_FILL_POINTS]; + unsigned fill_point_count; + unsigned destination_page; + unsigned display_page; + int force_refresh; +} RegisGraphicsContext; + +static RegisGraphicsContext persistent_context; +static RegisParseState persistent_state; + +#define MAX_PATTERN_BITS 8U + +#define WRITE_STYLE_OVERLAY 1U +#define WRITE_STYLE_REPLACE 2U +#define WRITE_STYLE_COMPLEMENT 3U +#define WRITE_STYLE_ERASE 4U + +#define WRITE_SHADING_REF_Y 0U +#define WRITE_SHADING_REF_X 1U +#define WRITE_SHADING_REF_NONE 2U + +/* keypress event example: http://iraf.net/forum/viewtopic.php?showtopic=61692 */ + +#define MIN2(X, Y) ( (X) < (Y) ? (X) : (Y) ) +#define MIN3(X, Y, Z) ( MIN2(MIN2((X), (Y)), MIN2((Y), (Z))) ) +#define MAX2(X, Y) ( (X) > (Y) ? (X) : (Y) ) +#define MAX3(X, Y, Z) ( MAX2(MAX2((X), (Y)), MAX2((Y), (Z))) ) + +#define ROT_LEFT_N(V, N) ( (((V) << ((N) & 3U )) & 255U) | \ + ((V) >> (8U - ((N) & 3U))) ) +#define ROT_LEFT(V) ( (((V) << 1U) & 255U) | ((V) >> 7U) ) + +/* convert user coordinates to absolute pixel coordinates */ +#define SCALE_XCOORD(C, X, S) ( ( (X) * ((C)->width - 1) ) / ( (C)->x_div * (S) ) ) +#define SCALE_YCOORD(C, Y, S) ( ( (Y) * ((C)->height - 1) ) / ( (C)->y_div * (S) ) ) +#define TRANSLATE_XCOORD(C, X, S) SCALE_XCOORD((C), (X) - (C)->x_off * (S), (S) ) +#define TRANSLATE_YCOORD(C, Y, S) SCALE_YCOORD((C), (Y) - (C)->y_off * (S), (S) ) + +#if 0 +/* convert absolute pixel coordinate to user coordinates */ +#define SCALE_XPIX(C, X, S) ( ( (X) * ((C)->x_div * (S) ) ) / ((C)->width - 1) ) +#define SCALE_YPIX(C, Y, S) ( ( (Y) * ((C)->y_div * (S) ) ) / ((C)->height - 1) ) +#define TRANSLATE_XPIX(C, X, S) ( SCALE_XPIX((C), (X), (S) ) + (C)->x_off * (S) ) +#define TRANSLATE_YPIX(C, Y, S) ( SCALE_YPIX((C), (Y), (S) ) + (C)->y_off * (S) ) +#endif + +#define READ_PIXEL(C, X, Y) read_pixel((C)->destination_graphic, (X), (Y)) +#define DRAW_PIXEL(C, X, Y, COL) draw_solid_pixel((C)->destination_graphic, (X), (Y), (COL)) +#define DRAW_ALL(C, COL) \ + draw_solid_rectangle((C)->destination_graphic, 0, 0, (C)->width, (C)->height, (COL)) + +static unsigned get_shade_character_pixel(Char const *pixels, + unsigned w, unsigned h, + unsigned smaxf, unsigned scale, + int slant_dx, int px, int py); +static void get_bitmap_of_character(RegisGraphicsContext const *context, + int ch, unsigned maxw, unsigned maxh, + Char *pixels, + unsigned *w, unsigned *h, + unsigned max_pixels); + +static void +init_regis_load_state(RegisParseState *state) +{ + state->load_index = MAX_REGIS_ALPHABETS; + state->load_w = 8U; + state->load_h = 10U; + state->load_alphabet = 1U; /* FIXME: is this the correct default */ + state->load_name[0] = '\0'; + state->load_glyph = (unsigned) (Char) '\0'; + state->load_row = 0U; +} + +static void +init_regis_parse_state(RegisParseState *state) +{ + state->command = '_'; + state->option = '_'; + state->stack_next = 0U; + state->load_index = MAX_REGIS_ALPHABETS; + init_regis_load_state(state); +} + +static int +ifloor(double d) +{ + double dl = floor(d); + return (int) dl; +} + +static int +isqrt(double d) +{ + double dl = sqrt(d); + return (int) dl; +} + +static void +draw_regis_pixel(RegisGraphicsContext *context, int x, int y, + unsigned value) +{ + unsigned color = 0; + + switch (context->temporary_write_controls.write_style) { + case WRITE_STYLE_OVERLAY: + /* + * Update pixels with foreground when pattern is 1, + * don't change when pattern is 0. + */ + if (!value) { + return; + } + + if (context->temporary_write_controls.invert_pattern) { + color = context->background; + } else { + color = context->temporary_write_controls.foreground; + } + break; + + case WRITE_STYLE_REPLACE: + /* + * Update pixels with foreground when pattern is 1, + * set to background when pattern is 0. + */ + { + unsigned fg, bg; + + if (context->temporary_write_controls.invert_pattern) { + fg = context->background; + bg = context->temporary_write_controls.foreground; + } else { + fg = context->temporary_write_controls.foreground; + bg = context->background; + } + color = value ? fg : bg; + } + break; + + case WRITE_STYLE_COMPLEMENT: + /* + * Update pixels with background when pattern is 1, + * don't change when pattern is 0. + */ + if (!value) { + return; + } + + color = READ_PIXEL(context, x, y); + if (color == COLOR_HOLE) + color = context->background; + color = color ^ context->all_planes; + break; + + case WRITE_STYLE_ERASE: + /* Update pixels to foreground. */ + if (context->temporary_write_controls.invert_pattern) { + color = context->temporary_write_controls.foreground; + } else { + color = context->background; + } + break; + } + + if (context->temporary_write_controls.plane_mask != context->all_planes) { + unsigned old_color = READ_PIXEL(context, x, y); + if (old_color == COLOR_HOLE) + old_color = context->background; + color = (color & context->temporary_write_controls.plane_mask) | + (old_color & ~context->temporary_write_controls.plane_mask); + } + + DRAW_PIXEL(context, x, y, color); +} + +static void +shade_pattern_to_pixel(RegisGraphicsContext *context, unsigned dim, int ref, + int x, int y) +{ + unsigned value; + + if (dim == WRITE_SHADING_REF_X) { + int delta = x > ref ? 1 : -1; + int curr_x; + + context->pattern_bit = 1U << (((unsigned) y) & 7U); + for (curr_x = ref; curr_x != x + delta; curr_x += delta) { + value = context->temporary_write_controls.pattern & + context->pattern_bit; + draw_regis_pixel(context, curr_x, y, value); + } + } else if (dim == WRITE_SHADING_REF_Y) { + int delta = y > ref ? 1 : -1; + int curr_y; + + for (curr_y = ref; curr_y != y + delta; curr_y += delta) { + context->pattern_bit = 1U << (((unsigned) curr_y) & 7U); + value = context->temporary_write_controls.pattern & + context->pattern_bit; + draw_regis_pixel(context, x, curr_y, value); + } + } else { + TRACE(("ERROR: shading requested, but there is no reference axis\n")); + } +} + +static void +shade_char_to_pixel(RegisGraphicsContext *context, Char const *pixels, + unsigned w, unsigned h, unsigned dim, int ref, int x, int y) +{ + unsigned xmaxf = context->current_text_controls->character_unit_cell_w; + unsigned ymaxf = context->current_text_controls->character_unit_cell_h; + unsigned smaxf; + unsigned s; + unsigned scale; + unsigned value; + + if (xmaxf > ymaxf) { + smaxf = ymaxf; + s = h; + } else { + smaxf = xmaxf; + s = w; + } + scale = (s << SCALE_FIXED_POINT) / smaxf; + + if (dim == WRITE_SHADING_REF_X) { + int delta = x > ref ? 1 : -1; + int curr_x; + + for (curr_x = ref; curr_x != x + delta; curr_x += delta) { + value = get_shade_character_pixel(pixels, w, h, smaxf, scale, 0, + curr_x, y); + draw_regis_pixel(context, curr_x, y, value); + } + } else if (dim == WRITE_SHADING_REF_Y) { + int delta = y > ref ? 1 : -1; + int curr_y; + + for (curr_y = ref; curr_y != y + delta; curr_y += delta) { + value = get_shade_character_pixel(pixels, w, h, smaxf, scale, 0, x, + curr_y); + draw_regis_pixel(context, x, curr_y, value); + } + } else { + TRACE(("ERROR: shading requested, but there is no reference axis\n")); + } +} + +static void +draw_patterned_pixel(RegisGraphicsContext *context, int x, int y) +{ + if (context->pattern_count >= + context->temporary_write_controls.pattern_multiplier) { + context->pattern_count = 0U; + context->pattern_bit = ROT_LEFT(context->pattern_bit); + } + context->pattern_count++; + + draw_regis_pixel(context, x, y, + context->temporary_write_controls.pattern & + context->pattern_bit); +} + +static void +shade_to_pixel(RegisGraphicsContext *context, unsigned dim, int ref, + int x, int y) +{ + if (context->temporary_write_controls.shading_character != '\0') { + unsigned xmaxf = context->current_text_controls->character_unit_cell_w; + unsigned ymaxf = context->current_text_controls->character_unit_cell_h; + char ch = context->temporary_write_controls.shading_character; + Char pixels[MAX_GLYPH_PIXELS]; + unsigned w, h; + + get_bitmap_of_character(context, ch, xmaxf, ymaxf, pixels, &w, &h, + MAX_GLYPH_PIXELS); + if (w > 0 && h > 0) { + shade_char_to_pixel(context, pixels, w, h, dim, ref, x, y); + } + } else { + shade_pattern_to_pixel(context, dim, ref, x, y); + } +} + +static void +draw_or_save_patterned_pixel(RegisGraphicsContext *context, int x, int y) +{ + if (context->fill_mode == 1) { + if (context->fill_point_count >= MAX_FILL_POINTS) { + TRACE(("point %d,%d can not be added to filled polygon\n", + x, y)); + return; + } + if (context->fill_point_count > 0U && + context->fill_points[context->fill_point_count - 1U].x == x && + context->fill_points[context->fill_point_count - 1U].y == y) { + return; + } + context->fill_points[context->fill_point_count].x = x; + context->fill_points[context->fill_point_count].y = y; + context->fill_point_count++; + return; + } + + if (context->temporary_write_controls.shading_enabled) { + unsigned dim = context->temporary_write_controls.shading_reference_dim; + int ref = context->temporary_write_controls.shading_reference; + + shade_to_pixel(context, dim, ref, x, y); + return; + } + + draw_patterned_pixel(context, x, y); +} + +static int +sort_points(void const *l, void const *r) +{ + RegisPoint const *const lp = l; + RegisPoint const *const rp = r; + + if (lp->y < rp->y) + return -1; + if (lp->y > rp->y) + return +1; + if (lp->x < rp->x) + return -1; + if (lp->x > rp->x) + return +1; + return 0; +} + +static void +draw_shaded_polygon(RegisGraphicsContext *context) +{ + unsigned p; + int old_x, old_y; + int inside; + Char pixels[MAX_GLYPH_PIXELS]; + unsigned w = 1, h = 1; + + char ch = context->temporary_write_controls.shading_character; + unsigned xmaxf = context->current_text_controls->character_unit_cell_w; + unsigned ymaxf = context->current_text_controls->character_unit_cell_h; + + get_bitmap_of_character(context, ch, xmaxf, ymaxf, pixels, &w, &h, + MAX_GLYPH_PIXELS); + if (w < 1U || h < 1U) { + return; + } + + qsort(context->fill_points, (size_t) context->fill_point_count, + sizeof(context->fill_points[0]), sort_points); + + old_x = DUMMY_STACK_X; + old_y = DUMMY_STACK_Y; + inside = 0; + for (p = 0U; p < context->fill_point_count; p++) { + int new_x = context->fill_points[p].x; + int new_y = context->fill_points[p].y; +#if 0 + printf("got %d,%d (%d,%d) inside=%d\n", new_x, new_y, old_x, old_y, inside); +#endif + + /* + * FIXME: This is using pixels to represent lines which loses + * information about exact slope and how many lines are present which + * causes misbehavior with some inputs (especially complex polygons). + * It also takes more room than remembering vertices, but I'd rather + * not have to implement line segments for arcs. Maybe store a count + * at each vertex instead (doesn't fix the slope problem). + */ + /* + * FIXME: Change this to only draw inside of polygons, and round + * points in a uniform direction to avoid overlapping drawing. As an + * option we could continue to support drawing the outline. + */ + if (new_y != old_y) { + if (inside) { + /* + * Just draw the vertical line when there is not a matching + * edge on the right side. + */ + shade_char_to_pixel(context, pixels, w, h, + WRITE_SHADING_REF_X, + old_x, old_x, old_y); + } + inside = 1; + } else { + if (inside) { + shade_char_to_pixel(context, pixels, w, h, + WRITE_SHADING_REF_X, + old_x, new_x, new_y); + } + if (new_x > old_x + 1) { + inside = !inside; + } + } + + old_x = new_x; + old_y = new_y; + } + + context->destination_graphic->dirty = 1; +} + +static void +draw_filled_polygon(RegisGraphicsContext *context) +{ + unsigned p; + int old_x, old_y; + int inside; + + qsort(context->fill_points, (size_t) context->fill_point_count, + sizeof(context->fill_points[0]), sort_points); + + old_x = DUMMY_STACK_X; + old_y = DUMMY_STACK_Y; + inside = 0; + for (p = 0U; p < context->fill_point_count; p++) { + int new_x = context->fill_points[p].x; + int new_y = context->fill_points[p].y; +#if 0 + printf("got %d,%d (%d,%d) inside=%d\n", new_x, new_y, old_x, old_y, inside); +#endif + + /* + * FIXME: This is using pixels to represent lines which loses + * information about exact slope and how many lines are present which + * causes misbehavior with some inputs (especially complex polygons). + * It also takes more room than remembering vertices, but I'd rather + * not have to implement line segments for arcs. Maybe store a count + * at each vertex instead (doesn't fix the slope problem). + */ + /* + * FIXME: Change this to only draw inside of polygons, and round + * points in a uniform direction to avoid overlapping drawing. As an + * option we could continue to support drawing the outline. + */ + if (new_y != old_y) { + if (inside) { + /* + * Just draw the vertical line when there is not a matching + * edge on the right side. + */ + shade_pattern_to_pixel(context, WRITE_SHADING_REF_X, + old_x, old_x, old_y); + } + inside = 1; + } else { + if (inside) { + shade_pattern_to_pixel(context, WRITE_SHADING_REF_X, + old_x, new_x, new_y); + } + if (new_x > old_x + 1) { + inside = !inside; + } + } + + old_x = new_x; + old_y = new_y; + } + + context->destination_graphic->dirty = 1; +} + +static void +draw_patterned_line(RegisGraphicsContext *context, int x1, int y1, + int x2, int y2) +{ + int x, y; + int dx, dy; + int dir, diff; + + dx = abs(x1 - x2); + dy = abs(y1 - y2); + + if (dx > dy) { + if (x1 > x2) { + int tmp; + EXCHANGE(x1, x2, tmp); + EXCHANGE(y1, y2, tmp); + } + if (y1 < y2) + dir = 1; + else if (y1 > y2) + dir = -1; + else + dir = 0; + + diff = 0; + y = y1; + for (x = x1; x <= x2; x++) { + if (diff >= dx) { + diff -= dx; + y += dir; + } + diff += dy; + draw_or_save_patterned_pixel(context, x, y); + } + } else { + if (y1 > y2) { + int tmp; + EXCHANGE(y1, y2, tmp); + EXCHANGE(x1, x2, tmp); + } + if (x1 < x2) + dir = 1; + else if (x1 > x2) + dir = -1; + else + dir = 0; + + diff = 0; + x = x1; + for (y = y1; y <= y2; y++) { + if (diff >= dy) { + diff -= dy; + x += dir; + } + diff += dx; + draw_or_save_patterned_pixel(context, x, y); + } + } + + context->destination_graphic->dirty = 1; +} + +typedef struct { + int dxx; + int dxy; + int dyx; + int dyy; +} quadmap_coords; + +static void +draw_patterned_arc(RegisGraphicsContext *context, + int cx, int cy, + int ex, int ey, + int a_start, int a_length, + int *ex_final, int *ey_final) +{ + const double third = hypot((double) (cx - ex), (double) (cy - ey)); + const int radius = (int) third; + const int ra = radius; + const int rb = radius; + const quadmap_coords neg_quadmap[4] = + { + {-1, 0, 0, +1}, + {0, -1, -1, 0}, + {+1, 0, 0, -1}, + {0, +1, +1, 0}, + }; + const quadmap_coords pos_quadmap[4] = + { + {-1, 0, 0, -1}, + {0, -1, +1, 0}, + {+1, 0, 0, +1}, + {0, +1, -1, 0}, + }; + const quadmap_coords *quadmap; + int total_points; + int half_degree; + int points_start, points_stop; + int points; + unsigned iterations; + long rx, ry; + long dx, dy; + int x, y; + long e2; + long error; + + TRACE(("orig a_length=%d a_start=%d\n", a_length, a_start)); + if (a_length == 0) + return; + if (a_length > 0) { + quadmap = pos_quadmap; + } else { + quadmap = neg_quadmap; + if (a_start != 0) + a_start = 3600 - a_start; + a_length = abs(a_length); + } + TRACE(("positive a_length=%d a_start=%d\n", a_length, a_start)); + + rx = -ra; + ry = 0; + e2 = rb; + dx = (2 * rx + 1) * e2 * e2; + dy = rx * rx; + error = dx + dy; + total_points = 0; + do { + total_points += 4; + e2 = 2 * error; + if (e2 >= dx) { + rx++; + dx += 2 * rb * rb; + error += dx; + } + if (e2 <= dy) { + ry++; + dy += 2 * ra * ra; + error += dy; + } + } + while (rx <= 0); + + /* FIXME: This is apparently not accurate enough because some arcs start or + * end a few pixels off. Maybe compare line slopes in the loop below + * instead? + */ + half_degree = total_points * 5; + points_start = (total_points * a_start - half_degree) / 3600; + points_stop = (total_points * a_start + + total_points * a_length + half_degree) / 3600; + TRACE(("drawing arc with %d points clockwise from %g degrees for %g degrees (from point %d to %d out of %d)\n", + total_points, a_start / 10.0, a_length / 10.0, points_start, points_stop, + total_points)); + + /* FIXME: The four pixels at the cardinal directions are double-drawn. */ + points = 0; + for (iterations = 0U; iterations < 8U; iterations++) { + int q2 = iterations & 0x3; + + rx = -ra; + ry = 0; + e2 = rb; + dx = (2 * rx + 1) * e2 * e2; + dy = rx * rx; + error = dx + dy; + do { +#ifdef DEBUG_ARC_POINTS + double rad = atan2( + (double) (quadmap[q2].dyx * rx + + quadmap[q2].dyy * ry), + (double) (quadmap[q2].dxx * rx + + quadmap[q2].dxy * ry)); + double deg = (360.0 * rad / (2.0 * M_PI)); + if (deg < 0.0) + deg += 360.0; +#endif + + if (points >= points_start && points <= points_stop) { + x = (int) (cx + + quadmap[q2].dxx * rx + + quadmap[q2].dxy * ry); + y = (int) (cy + + quadmap[q2].dyx * rx + + quadmap[q2].dyy * ry); +#ifdef DEBUG_ARC_POINTS + TRACE(("drawing point %u at %d,%d (%.5g deg)\n", + points, x, y, deg)); +#endif + draw_or_save_patterned_pixel(context, x, y); + if (ex_final) + *ex_final = x; + if (ey_final) + *ey_final = y; + } else { +#ifdef DEBUG_ARC_POINTS + x = (int) (cx + quadmap[q2].dxx * rx + quadmap[q2].dxy * ry); + y = (int) (cy + quadmap[q2].dyx * rx + quadmap[q2].dyy * ry); + TRACE(("skipping point %u at %d,%d which is outside of range (%.5g deg)\n", + points, x, y, deg)); +#endif + } + points++; + + e2 = 2 * error; + if (e2 >= dx) { + rx++; + dx += 2 * rb * rb; + error += dx; + } + if (e2 <= dy) { + ry++; + dy += 2 * ra * ra; + error += dy; + } + } + while (rx <= 0); + } + + context->destination_graphic->dirty = 1; +} + +/* + * The plot* functions are based on optimized rasterization primitives written + * by Zingl Alois. + * See http://members.chello.at/easyfilter/bresenham.html + */ + +/* + * FIXME: + * This is a terrible temporary hack. The plot functions below can be adapted + * to work like the other rasterization functions but there's no point in doing + * that until we know we don't have to write something completely different. + */ +static RegisGraphicsContext *global_context; +static void +setPixel(int x, int y) +{ + draw_or_save_patterned_pixel(global_context, x, y); +} + +static void +plotLine(int x0, int y0, int x1, int y1) +{ + int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1; + int dy = -abs(y1 - y0), sy = y0 < y1 ? 1 : -1; + int err = dx + dy; /* error value e_xy */ + + for (;;) { /* loop */ + int e2; + setPixel(x0, y0); + e2 = 2 * err; + if (e2 >= dy) { /* e_xy+e_x > 0 */ + if (x0 == x1) + break; + err += dy; + x0 += sx; + } + if (e2 <= dx) { /* e_xy+e_y < 0 */ + if (y0 == y1) + break; + err += dx; + y0 += sy; + } + } +} + +static void +plotQuadBezierSeg(int x0, int y0, int x1, int y1, int x2, int y2) +{ /* plot a limited quadratic Bezier segment */ + int sx = x2 - x1; + int sy = y2 - y1; + long xx = (x0 - x1); /* relative values for checks */ + long yy = (y0 - y1); + double cur = (double) (xx * sy - yy * sx); /* curvature */ + + assert(xx * sx <= 0 && yy * sy <= 0); /* sign of gradient must not change */ + + if (sx * (long) sx + sy * (long) sy > xx * xx + yy * yy) { /* begin with longer part */ + x2 = x0; + x0 = sx + x1; + y2 = y0; + y0 = sy + y1; + cur = -cur; /* swap P0 P2 */ + } + if (cur != 0.0) { /* no straight line */ + long xy; + double dx, dy, err; + + xx += sx; + xx *= (sx = (x0 < x2) ? 1 : -1); /* x step direction */ + yy += sy; + yy *= (sy = (y0 < y2) ? 1 : -1); /* y step direction */ + xy = 2 * xx * yy; + xx *= xx; + yy *= yy; /* differences 2nd degree */ + if (cur * sx * sy < 0) { /* negated curvature? */ + xx = -xx; + yy = -yy; + xy = -xy; + cur = -cur; + } + /* differences 1st degree */ + dx = ((4.0 * sy * cur * (x1 - x0)) + (double) xx) - (double) xy; + dy = ((4.0 * sx * cur * (y0 - y1)) + (double) yy) - (double) xy; + xx += xx; + yy += yy; + err = dx + dy + (double) xy; /* error 1st step */ + do { + setPixel(x0, y0); /* plot curve */ + if (x0 == x2 && y0 == y2) + return; /* last pixel -> curve finished */ + y1 = (2 * err) < dx; /* save value for test of y step */ + if ((2 * err) > dy) { + x0 += sx; + dx -= (double) xy; + dy += (double) yy; + err += dy; + } /* x step */ + if (y1) { + y0 += sy; + dy -= (double) xy; + dx += (double) xx; + err += dx; + } /* y step */ + } while (dy < 0 && dx > 0); /* gradient negates -> algorithm fails */ + } + plotLine(x0, y0, x2, y2); /* plot remaining part to end */ +} + +#if 0 +static void +plotQuadBezier(int x0, int y0, int x1, int y1, int x2, int y2) +{ /* plot any quadratic Bezier curve */ + int x = x0 - x1; + int y = y0 - y1; + double t = x0 - 2 * x1 + x2; + double r; + + if ((long) x * (x2 - x1) > 0) { /* horizontal cut at P4? */ + if ((long) y * (y2 - y1) > 0) /* vertical cut at P6 too? */ + if (fabs((y0 - 2 * y1 + y2) / t * x) > abs(y)) { /* which first? */ + x0 = x2; + x2 = x + x1; + y0 = y2; + y2 = y + y1; /* swap points */ + } /* now horizontal cut at P4 comes first */ + t = (x0 - x1) / t; + r = (1 - t) * ((1 - t) * y0 + 2.0 * t * y1) + t * t * y2; /* By(t=P4) */ + t = (x0 * x2 - x1 * x1) * t / (x0 - x1); /* gradient dP4/dx=0 */ + x = ifloor(t + 0.5); + y = ifloor(r + 0.5); + r = (y1 - y0) * (t - x0) / (x1 - x0) + y0; /* intersect P3 | P0 P1 */ + plotQuadBezierSeg(x0, y0, x, ifloor(r + 0.5), x, y); + r = (y1 - y2) * (t - x2) / (x1 - x2) + y2; /* intersect P4 | P1 P2 */ + x0 = x1 = x; + y0 = y; + y1 = ifloor(r + 0.5); /* P0 = P4, P1 = P8 */ + } + if ((long) (y0 - y1) * (y2 - y1) > 0) { /* vertical cut at P6? */ + t = y0 - 2 * y1 + y2; + t = (y0 - y1) / t; + r = (1 - t) * ((1 - t) * x0 + 2.0 * t * x1) + t * t * x2; /* Bx(t=P6) */ + t = (y0 * y2 - y1 * y1) * t / (y0 - y1); /* gradient dP6/dy=0 */ + x = ifloor(r + 0.5); + y = ifloor(t + 0.5); + r = (x1 - x0) * (t - y0) / (y1 - y0) + x0; /* intersect P6 | P0 P1 */ + plotQuadBezierSeg(x0, y0, ifloor(r + 0.5), y, x, y); + r = (x1 - x2) * (t - y2) / (y1 - y2) + x2; /* intersect P7 | P1 P2 */ + x0 = x; + x1 = ifloor(r + 0.5); + y0 = y1 = y; /* P0 = P6, P1 = P7 */ + } + plotQuadBezierSeg(x0, y0, x1, y1, x2, y2); /* remaining part */ +} +#endif + +static void +plotCubicBezierSeg(int x0, int y0, + double x1, double y1, + double x2, double y2, + int x3, int y3) +{ /* plot limited cubic Bezier segment */ + int f, fx, fy, tt; + int leg = 1; + int sx = x0 < x3 ? 1 : -1; + int sy = y0 < y3 ? 1 : -1; /* step direction */ + double xc = -fabs(x0 + x1 - x2 - x3); + double xa = xc - 4 * sx * (x1 - x2); + double xb = sx * (x0 - x1 - x2 + x3); + double yc = -fabs(y0 + y1 - y2 - y3); + double ya = yc - 4 * sy * (y1 - y2); + double yb = sy * (y0 - y1 - y2 + y3); + double ab, ac, bc, cb, xx, xy, yy, dx, dy, ex, *pxy; + double EP = 0.01; + /* check for curve restrains */ + /* slope P0-P1 == P2-P3 and (P0-P3 == P1-P2 or no slope change) */ + assert((x1 - x0) * (x2 - x3) < EP && + ((x3 - x0) * (x1 - x2) < EP || xb * xb < xa * xc + EP)); + assert((y1 - y0) * (y2 - y3) < EP && + ((y3 - y0) * (y1 - y2) < EP || yb * yb < ya * yc + EP)); + + if (xa == 0.0 && ya == 0.0) { /* quadratic Bezier */ + sx = ifloor((3 * x1 - x0 + 1) / 2); + sy = ifloor((3 * y1 - y0 + 1) / 2); /* new midpoint */ + plotQuadBezierSeg(x0, y0, sx, sy, x3, y3); + return; + } + x1 = (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0) + 1; /* line lengths */ + x2 = (x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3) + 1; + do { /* loop over both ends */ + ab = xa * yb - xb * ya; + ac = xa * yc - xc * ya; + bc = xb * yc - xc * yb; + ex = ab * (ab + ac - 3 * bc) + ac * ac; /* P0 part of self-intersection loop? */ + f = ((ex > 0.0) + ? 1 + : isqrt(1 + 1024 / x1)); /* calculate resolution */ + ab *= f; + ac *= f; + bc *= f; + ex *= f * f; /* increase resolution */ + xy = 9 * (ab + ac + bc) / 8; + cb = 8 * (xa - ya); /* init differences of 1st degree */ + dx = 27 * (8 * ab * (yb * yb - ya * yc) + + ex * (ya + 2 * yb + yc)) / 64 - ya * ya * (xy - ya); + dy = 27 * (8 * ab * (xb * xb - xa * xc) - + ex * (xa + 2 * xb + xc)) / 64 - xa * xa * (xy + xa); + /* init differences of 2nd degree */ + xx = 3 * (3 * ab * (3 * yb * yb - ya * ya - 2 * ya * yc) - + ya * (3 * ac * (ya + yb) + ya * cb)) / 4; + yy = 3 * (3 * ab * (3 * xb * xb - xa * xa - 2 * xa * xc) - + xa * (3 * ac * (xa + xb) + xa * cb)) / 4; + xy = xa * ya * (6 * ab + 6 * ac - 3 * bc + cb); + ac = ya * ya; + cb = xa * xa; + xy = 3 * (xy + 9 * f * (cb * yb * yc - xb * xc * ac) - + 18 * xb * yb * ab) / 8; + + if (ex < 0) { /* negate values if inside self-intersection loop */ + dx = -dx; + dy = -dy; + xx = -xx; + yy = -yy; + xy = -xy; + ac = -ac; + cb = -cb; + } /* init differences of 3rd degree */ + ab = 6 * ya * ac; + ac = -6 * xa * ac; + bc = 6 * ya * cb; + cb = -6 * xa * cb; + dx += xy; + ex = dx + dy; + dy += xy; /* error of 1st step */ + + for (pxy = &xy, fx = fy = f; x0 != x3 && y0 != y3;) { + setPixel(x0, y0); /* plot curve */ + do { /* move sub-steps of one pixel */ + if (dx > *pxy || dy < *pxy) + goto exit; /* confusing values */ + y1 = 2 * ex - dy; /* save value for test of y step */ + if (2 * ex >= dx) { /* x sub-step */ + fx--; + ex += dx += xx; + dy += xy += ac; + yy += bc; + xx += ab; + } + if (y1 <= 0) { /* y sub-step */ + fy--; + ex += dy += yy; + dx += xy += bc; + xx += ac; + yy += cb; + } + } while (fx > 0 && fy > 0); /* pixel complete? */ + if (2 * fx <= f) { + x0 += sx; + fx += f; + } /* x step */ + if (2 * fy <= f) { + y0 += sy; + fy += f; + } /* y step */ + if (pxy == &xy && dx < 0 && dy > 0) + pxy = &EP; /* pixel ahead valid */ + } + exit: + EXCHANGE(x0, x3, tt); + sx = -sx; + xb = -xb; /* swap legs */ + EXCHANGE(y0, y3, tt); + sy = -sy; + yb = -yb; + x1 = x2; + } while (leg--); /* try other end */ + plotLine(x0, y0, x3, y3); /* remaining part in case of cusp or crunode */ +} + +static void +plotCubicBezier(int x0, int y0, int x1, int y1, + int x2, int y2, int x3, int y3) +{ /* plot any cubic Bezier curve */ + int n = 0, i = 0; + long xc = x0 + x1 - x2 - x3; + long xa = xc - 4 * (x1 - x2); + long xb = x0 - x1 - x2 + x3; + long xd = xb + 4 * (x1 + x2); + long yc = y0 + y1 - y2 - y3; + long ya = yc - 4 * (y1 - y2); + long yb = y0 - y1 - y2 + y3; + long yd = yb + 4 * (y1 + y2); + double fx0 = x0; + double fy0 = y0; + double t1 = (double) (xb * xb - xa * xc), t2, t[5]; + +#ifdef DEBUG_BEZIER + printf("plotCubicBezier(%d,%d, %d,%d, %d,%d, %d,%d\n", + x0, y0, x1, y1, x2, y2, x3, y3); +#endif + /* sub-divide curve at gradient sign changes */ + if (xa == 0) { /* horizontal */ + if (labs(xc) < 2 * labs(xb)) + t[n++] = (double) xc / (2.0 * (double) xb); /* one change */ + } else if (t1 > 0.0) { /* two changes */ + t2 = sqrt(t1); + t1 = ((double) xb - t2) / (double) xa; + if (fabs(t1) < 1.0) + t[n++] = t1; + t1 = ((double) xb + t2) / (double) xa; + if (fabs(t1) < 1.0) + t[n++] = t1; + } + t1 = (double) (yb * yb - ya * yc); + if (ya == 0) { /* vertical */ + if (labs(yc) < 2 * labs(yb)) + t[n++] = (double) yc / (2.0 * (double) yb); /* one change */ + } else if (t1 > 0.0) { /* two changes */ + t2 = sqrt(t1); + t1 = ((double) yb - t2) / (double) ya; + if (fabs(t1) < 1.0) + t[n++] = t1; + t1 = ((double) yb + t2) / (double) ya; + if (fabs(t1) < 1.0) + t[n++] = t1; + } + for (i = 1; i < n; i++) /* bubble sort of 4 points */ + if ((t1 = t[i - 1]) > t[i]) { + t[i - 1] = t[i]; + t[i] = t1; + i = 0; + } + + t1 = -1.0; + t[n] = 1.0; /* begin / end point */ + for (i = 0; i <= n; i++) { /* plot each segment separately */ + double fx1, fx2, fx3; + double fy1, fy2, fy3; + + t2 = t[i]; /* sub-divide at t[i-1], t[i] */ + fx1 = (t1 * (t1 * (double) xb - (double) (2 * xc)) - + t2 * (t1 * (t1 * (double) xa - (double) (2 * xb)) + (double) + xc) + (double) xd) / 8 - fx0; + fy1 = (t1 * (t1 * (double) yb - (double) (2 * yc)) - + t2 * (t1 * (t1 * (double) ya - (double) (2 * yb)) + (double) + yc) + (double) yd) / 8 - fy0; + fx2 = (t2 * (t2 * (double) xb - (double) (2 * xc)) - + t1 * (t2 * (t2 * (double) xa - (double) (2 * xb)) + (double) + xc) + (double) xd) / 8 - fx0; + fy2 = (t2 * (t2 * (double) yb - (double) (2 * yc)) - + t1 * (t2 * (t2 * (double) ya - (double) (2 * yb)) + (double) + yc) + (double) yd) / 8 - fy0; + fx0 -= fx3 = (t2 * (t2 * ((double) (3 * xb) - t2 * (double) xa) - + (double) (3 * xc)) + (double) xd) / 8; + fy0 -= fy3 = (t2 * (t2 * ((double) (3 * yb) - t2 * (double) ya) - + (double) (3 * yc)) + (double) yd) / 8; + x3 = ifloor(fx3 + 0.5); + y3 = ifloor(fy3 + 0.5); /* scale bounds to int */ + if (fx0 != 0.0) { + fx1 *= fx0 = (x0 - x3) / fx0; + fx2 *= fx0; + } + if (fy0 != 0.0) { + fy1 *= fy0 = (y0 - y3) / fy0; + fy2 *= fy0; + } + if (x0 != x3 || y0 != y3) /* segment t1 - t2 */ + plotCubicBezierSeg(x0, y0, + x0 + fx1, y0 + fy1, + x0 + fx2, y0 + fy2, + x3, y3); + x0 = x3; + y0 = y3; + fx0 = fx3; + fy0 = fy3; + t1 = t2; + } +} + +#if 0 +static void +plotQuadSpline(int n, int x[], int y[], int skip_segments) +{ /* plot quadratic spline, destroys input arrays x,y */ +#define M_MAX 12 + double mi = 1, m[M_MAX]; /* diagonal constants of matrix */ + int i, x0, y0, x1, y1, x2, y2; +#ifdef DEBUG_SPLINE_SEGMENTS + int color = 0; +#endif + + assert(n > 1); /* need at least 3 points P[0]..P[n] */ + +#ifdef DEBUG_SPLINE_POINTS + { + int save_pattern; + + i = 0; + global_context->temporary_write_controls.foreground = 11; + save_pattern = global_context->temporary_write_controls.pattern; + global_context->temporary_write_controls.pattern = 0xff; + draw_patterned_arc(global_context, x[i], y[i], x[i] + 2, y[i], 0, + 3600, NULL, NULL); + i++; + global_context->temporary_write_controls.foreground = 15; + for (; i < n; i++) { + draw_patterned_arc(global_context, + x[i], y[i], + x[i] + 2, y[i], + 0, 3600, NULL, NULL); + } + global_context->temporary_write_controls.foreground = 10; + draw_patterned_arc(global_context, x[i], y[n], x[i] + 2, y[i], 0, + 3600, NULL, NULL); + global_context->temporary_write_controls.pattern = save_pattern; + } +#endif + + x2 = x[n]; + y2 = y[n]; + + x[1] = x0 = 8 * x[1] - 2 * x[0]; /* first row of matrix */ + y[1] = y0 = 8 * y[1] - 2 * y[0]; + + for (i = 2; i < n; i++) { /* forward sweep */ + if (i - 2 < M_MAX) + m[i - 2] = mi = 1.0 / (6.0 - mi); + x[i] = x0 = ifloor(8 * x[i] - x0 * mi + 0.5); /* store yi */ + y[i] = y0 = ifloor(8 * y[i] - y0 * mi + 0.5); + } + x1 = ifloor((x0 - 2 * x2) / (5.0 - mi) + 0.5); /* correction last row */ + y1 = ifloor((y0 - 2 * y2) / (5.0 - mi) + 0.5); + + for (i = n - 2; i > 0; i--) { /* back substitution */ + if (i <= M_MAX) + mi = m[i - 1]; + x0 = ifloor((x[i] - x1) * mi + 0.5); /* next corner */ + y0 = ifloor((y[i] - y1) * mi + 0.5); +#ifdef DEBUG_SPLINE_SEGMENTS + color++; + global_context->temporary_write_controls.foreground = color; +#endif + if ((n - 2) - i < skip_segments) + plotQuadBezier((x0 + x1) / 2, (y0 + y1) / 2, x1, y1, x2, y2); + x2 = (x0 + x1) / 2; + x1 = x0; + y2 = (y0 + y1) / 2; + y1 = y0; + } +#ifdef DEBUG_SPLINE_SEGMENTS + color++; + global_context->temporary_write_controls.foreground = color; +#endif + if (skip_segments > 0) + plotQuadBezier(x[0], y[0], x1, y1, x2, y2); +} +#endif + +static void +plotCubicSpline(int n, int x[], int y[], int skip_first_last) +{ +#define M_MAX 12 + double mi = 0.25, m[M_MAX]; /* diagonal constants of matrix */ + int x3, y3, x4, y4; + int i, x0, y0, x1, y1, x2, y2; +#ifdef DEBUG_SPLINE_SEGMENTS + RegisterNum color = 0; +#endif + + assert(n > 2); /* need at least 4 points P[0]..P[n] */ + +#ifdef DEBUG_SPLINE_POINTS + { + unsigned save_pattern; + + i = 0; + global_context->temporary_write_controls.foreground = 11; + save_pattern = global_context->temporary_write_controls.pattern; + global_context->temporary_write_controls.pattern = 0xff; + draw_patterned_arc(global_context, x[i], y[i], x[i] + 2, y[i], 0, + 3600, NULL, NULL); + i++; + global_context->temporary_write_controls.foreground = 15; + for (; i < n; i++) { + draw_patterned_arc(global_context, + x[i], y[i], + x[i] + 2, y[i], + 0, 3600, NULL, NULL); + } + global_context->temporary_write_controls.foreground = 10; + draw_patterned_arc(global_context, x[i], y[i], x[i] + 2, y[i], 0, + 3600, NULL, NULL); + global_context->temporary_write_controls.pattern = save_pattern; + } +#endif + + x3 = x[n - 1]; + y3 = y[n - 1]; + x4 = x[n]; + y4 = y[n]; + + x[1] = x0 = 12 * x[1] - 3 * x[0]; /* first row of matrix */ + y[1] = y0 = 12 * y[1] - 3 * y[0]; + + for (i = 2; i < n; i++) { /* forward sweep */ + if (i - 2 < M_MAX) + m[i - 2] = mi = 0.25 / (2.0 - mi); + x[i] = x0 = ifloor(12 * x[i] - 2 * x0 * mi + 0.5); + y[i] = y0 = ifloor(12 * y[i] - 2 * y0 * mi + 0.5); + } + x2 = ifloor((x0 - 3 * x4) / (7 - 4 * mi) + 0.5); /* correct last row */ + /* printf("y0=%d, y4=%d mi=%g\n", y0, y4, mi); */ + y2 = ifloor((y0 - 3 * y4) / (7 - 4 * mi) + 0.5); + /* printf("y2=%d, y3=%d, y4=%d\n", y2, y3, y4); */ +#ifdef DEBUG_SPLINE_SEGMENTS + color++; + global_context->temporary_write_controls.foreground = color; +#endif + if (!skip_first_last) + plotCubicBezier(x3, y3, (x2 + x4) / 2, (y2 + y4) / 2, x4, y4, x4, y4); + + if (n - 3 < M_MAX) + mi = m[n - 3]; + x1 = ifloor((x[n - 2] - 2 * x2) * mi + 0.5); + y1 = ifloor((y[n - 2] - 2 * y2) * mi + 0.5); + for (i = n - 3; i > 0; i--) { /* back substitution */ + if (i <= M_MAX) + mi = m[i - 1]; + x0 = ifloor((x[i] - 2 * x1) * mi + 0.5); + y0 = ifloor((y[i] - 2 * y1) * mi + 0.5); + x4 = ifloor((x0 + 4 * x1 + x2 + 3) / 6.0); /* reconstruct P[i] */ + y4 = ifloor((y0 + 4 * y1 + y2 + 3) / 6.0); +#ifdef DEBUG_SPLINE_SEGMENTS + color++; + global_context->temporary_write_controls.foreground = color; +#endif +#define CB_PARM(num) ifloor((num) / 3.0 + 0.5) + plotCubicBezier(x4, y4, + CB_PARM(2 * x1 + x2), + CB_PARM(2 * y1 + y2), + CB_PARM(x1 + 2 * x2), + CB_PARM(y1 + 2 * y2), + x3, y3); + x3 = x4; + y3 = y4; + x2 = x1; + y2 = y1; + x1 = x0; + y1 = y0; + } + x0 = x[0]; + x4 = ifloor((3 * x0 + 7 * x1 + 2 * x2 + 6) / 12.0); /* reconstruct P[1] */ + y0 = y[0]; + y4 = ifloor((3 * y0 + 7 * y1 + 2 * y2 + 6) / 12.0); +#ifdef DEBUG_SPLINE_SEGMENTS + global_context->temporary_write_controls.foreground = 4; +#endif + plotCubicBezier(x4, y4, + CB_PARM(2 * x1 + x2), + CB_PARM(2 * y1 + y2), + CB_PARM(x1 + 2 * x2), + CB_PARM(y1 + 2 * y2), + x3, y3); +#ifdef DEBUG_SPLINE_SEGMENTS + color++; + global_context->temporary_write_controls.foreground = color; +#endif + if (!skip_first_last) + plotCubicBezier(x0, y0, x0, y0, (x0 + x1) / 2, (y0 + y1) / 2, x4, y4); +} + +static unsigned +find_free_alphabet_index(RegisGraphicsContext *context, unsigned alphabet, + unsigned pixw, unsigned pixh) +{ + unsigned ii, jj; + + /* try an exact match */ + for (ii = 0U; ii < MAX_REGIS_ALPHABETS; ii++) { + if (context->alphabets[ii].alphabet_num == alphabet && + context->alphabets[ii].pixw == pixw && + context->alphabets[ii].pixh == pixh) { + return ii; + } + } + + /* otherwise use any empty slot */ + for (ii = 0U; ii < MAX_REGIS_ALPHABETS; ii++) { + if (context->alphabets[ii].alphabet_num == INVALID_ALPHABET_NUM) { + context->alphabets[ii].alphabet_num = alphabet; + context->alphabets[ii].pixw = pixw; + context->alphabets[ii].pixh = pixh; + return ii; + } + } + + /* otherwise recycle a slot with a different font size */ + for (ii = 0U; ii < MAX_REGIS_ALPHABETS; ii++) { + if (context->alphabets[ii].alphabet_num == alphabet) { + context->alphabets[ii].pixw = pixw; + context->alphabets[ii].pixh = pixh; + context->alphabets[ii].name[0] = '\0'; + context->alphabets[ii].fontname[0] = '\0'; + context->alphabets[ii].use_font = 0; + if (context->alphabets[ii].bytes != NULL) { + free(context->alphabets[ii].bytes); + context->alphabets[ii].bytes = NULL; + } + for (jj = 0U; jj < MAX_GLYPHS; jj++) { + context->alphabets[ii].loaded[jj] = 0; + } + return ii; + } + } + + /* finally just recycle this arbitrary slot */ + context->alphabets[0U].alphabet_num = alphabet; + context->alphabets[0U].pixw = pixw; + context->alphabets[0U].pixh = pixh; + context->alphabets[0U].name[0] = '\0'; + context->alphabets[0U].fontname[0] = '\0'; + context->alphabets[0U].use_font = 0; + if (context->alphabets[0U].bytes != NULL) { + free(context->alphabets[0U].bytes); + context->alphabets[0U].bytes = NULL; + } + for (jj = 0U; jj < MAX_GLYPHS; jj++) { + context->alphabets[0U].loaded[jj] = 0; + } + + return 0U; +} + +#ifdef DEBUG_SPECIFIC_CHAR_METRICS +static void +dump_bitmap_pixels(Char const *pixels, unsigned w, unsigned h) +{ + unsigned yy, xx; + + for (yy = 0U; yy < h; yy++) { + printf(" "); + for (xx = 0U; xx < w; xx++) { + if (pixels[yy * w + xx]) { + printf("#"); + } else { + printf("_"); + } + } + printf("\n"); + } +} +#endif + +#if OPT_RENDERFONT && defined(HAVE_TYPE_FCCHAR32) +static int +copy_bitmap_from_xft_font(Display *display, XftFont *font, FcChar32 ch, + Char *pixels, unsigned w, unsigned h, + unsigned xmin, unsigned ymin) +{ + /* + * FIXME: cache: + * - the bitmap for the last M characters and target dimensions + * - reuse the pixmap object where possible + */ + XftColor bg, fg; + Pixmap bitmap; + XftDraw *draw; + XImage *image; + unsigned bmw, bmh; + unsigned xx, yy; + + bg.pixel = 0UL; + bg.color.red = 0; + bg.color.green = 0; + bg.color.blue = 0; + bg.color.alpha = 0x0; + + fg.pixel = 1UL; + fg.color.red = 0xffff; + fg.color.green = 0xffff; + fg.color.blue = 0xffff; + fg.color.alpha = 0xffff; + + bmw = w + xmin; + bmh = h; + bitmap = XCreatePixmap(display, + DefaultRootWindow(display), + bmw, bmh, + 1); + if (bitmap == None) { + TRACE(("Unable to create Pixmap\n")); + return 0; + } + draw = XftDrawCreateBitmap(display, bitmap); + if (!draw) { + TRACE(("Unable to create XftDraw\n")); + XFreePixmap(display, bitmap); + return 0; + } + + XftDrawRect(draw, &bg, 0, 0, bmw, bmh); + XftDrawString32(draw, &fg, font, 0, font->ascent - (int) ymin, + &ch, 1); + + image = XGetImage(display, bitmap, (int) xmin, 0, w, h, 1UL, XYPixmap); + if (!image) { + TRACE(("Unable to create XImage\n")); + XftDrawDestroy(draw); + XFreePixmap(display, bitmap); + return 0; + } + + for (yy = 0U; yy < h; yy++) { + for (xx = 0U; xx < w; xx++) { + pixels[yy * w + xx] = (XGetPixel(image, (int) xx, (int) yy) != 0); + } + } + + XDestroyImage(image); + XftDrawDestroy(draw); + XFreePixmap(display, bitmap); + return 1; +} + +static void +get_xft_glyph_dimensions(Display *display, XftFont *font, unsigned *w, + unsigned *h, unsigned *xmin, unsigned *ymin) +{ + unsigned workw, workh; + FcChar32 ch; + Char *pixels; + Char *pixelp; + unsigned yy, xx; + unsigned char_count, pixel_count; + unsigned real_minx, real_maxx, real_miny, real_maxy; + unsigned char_minx, char_maxx, char_miny, char_maxy; + + /* + * For each ASCII or ISO-8859-1 printable code, find out what its + * dimensions are. + * + * We actually render the glyphs and determine the extents ourselves + * because the font library can lie by several pixels, and since we are + * doing manual character placement in fixed areas the glyph boundary needs + * to be accurate. + * + * Ignore control characters and spaces - their extent information is + * misleading. + */ + + /* Our "work area" is just a buffer which should be big enough to hold the + * largest glyph even if its size is under-reported by a couple of pixels + * in each dimension. + */ + workw = (unsigned) font->max_advance_width + 2U; + if (font->ascent + font->descent > font->height) { + workh = (unsigned) (font->ascent + font->descent) + 2U; + } else { + workh = (unsigned) font->height + 2U; + } + + if (!(pixels = malloc((size_t) (workw * workh)))) { + *w = 0U; + *h = 0U; + return; + } + + /* FIXME: ch is in UCS32 -- try to support non-ASCII characters */ + char_count = 0U; + real_minx = workw - 1U; + real_maxx = 0U; + real_miny = workh - 1U; + real_maxy = 0U; + for (ch = 33; ch < 256; ++ch) { + if (ch >= 127 && ch <= 160) + continue; + if (!FcCharSetHasChar(font->charset, ch)) + continue; + + if (!copy_bitmap_from_xft_font(display, font, ch, pixels, + workw, workh, 0U, 0U)) + continue; + + pixel_count = 0U; + char_minx = workh - 1U; + char_maxx = 0U; + char_miny = workh - 1U; + char_maxy = 0U; + pixelp = pixels; + for (yy = 0U; yy < workh; yy++) { + for (xx = 0U; xx < workw; xx++) { + if (*pixelp++) { + if (xx < char_minx) + char_minx = xx; + else if (xx > char_maxx) + char_maxx = xx; + if (yy < char_miny) + char_miny = yy; + else if (yy > char_maxy) + char_maxy = yy; + pixel_count++; + } + } + } + if (pixel_count < 1U) + continue; + +#ifdef DEBUG_SPECIFIC_CHAR_METRICS + if (IS_DEBUG_CHAR(ch)) { + printf("char: '%c' (%d)\n", (char) ch, ch); + printf(" minx: %u\n", char_minx); + printf(" maxx: %u\n", char_maxx); + printf(" miny: %u\n", char_miny); + printf(" maxy: %u\n", char_maxy); + dump_bitmap_pixels(pixels, workw, workh); + printf("\n"); + } +#endif + + if (char_minx < real_minx) + real_minx = char_minx; + if (char_maxx > real_maxx) + real_maxx = char_maxx; + if (char_miny < real_miny) + real_miny = char_miny; + if (char_maxy > real_maxy) + real_maxy = char_maxy; + char_count++; + } + + free(pixels); + + if (char_count < 1U) { + *w = 0U; + *h = 0U; + return; + } + + *w = (unsigned) (1 + real_maxx - real_minx); + *h = (unsigned) (1 + real_maxy - real_miny); + *xmin = real_minx; + *ymin = real_miny; + +#ifdef DEBUG_COMPUTED_FONT_METRICS + printf("reported metrics:\n"); + printf(" %ux%u ascent=%u descent=%u\n", font->max_advance_width, + font->height, font->ascent, font->descent); + printf("computed metrics:\n"); + printf(" real_minx=%u real_maxx=%u real_miny=%u real_maxy=%u\n", + real_minx, real_maxx, real_miny, real_maxy); + printf(" final: %ux%u xmin=%u ymin=%u\n", *w, *h, *xmin, *ymin); +#endif +} + +#define FONT_SIZE_CACHE_SIZE 32U + +/* Find the font pixel size which returns the font which is closest to the given + * maxw and maxh without overstepping either dimension. + */ +static XftFont * +find_best_xft_font_size(XtermWidget xw, + char const *fontname, + unsigned maxw, unsigned maxh, unsigned max_pixels, + unsigned *w, unsigned *h, + unsigned *xmin, unsigned *ymin) +{ + Display *display = XtDisplay(xw); + Screen *screen = XtScreen(xw); + XftFont *font; + unsigned targeth; + unsigned ii, cacheindex; + static struct { + char fontname[REGIS_FONTNAME_LEN]; + unsigned maxw, maxh, max_pixels; + unsigned targeth; + unsigned w, h; + unsigned xmin; + unsigned ymin; + } cache[FONT_SIZE_CACHE_SIZE]; + + assert(display); + assert(screen); + assert(fontname); + assert(w); + assert(h); + assert(xmin); + assert(ymin); + + cacheindex = FONT_SIZE_CACHE_SIZE; + for (ii = 0U; ii < FONT_SIZE_CACHE_SIZE; ii++) { + if (cache[ii].maxw == maxw && cache[ii].maxh == maxh && + cache[ii].max_pixels == max_pixels && + strcmp(cache[ii].fontname, fontname) == 0) { + cacheindex = ii; + break; + } + } + + if (cacheindex < FONT_SIZE_CACHE_SIZE) { + targeth = cache[cacheindex].targeth; + } else { + targeth = maxh * 10U + 5U; + } + for (;;) { + if (targeth <= 5U) { + TRACE(("Giving up finding suitable Xft font size for %ux%u.\n", + maxw, maxh)); + return NULL; + } + + /* + * Xft does a bad job at: + * - two-color low-resolution anti-aliased fonts + * - non-anti-aliased fonts at low resolution unless a font size is + * given (pixel size does not help, and the value of the font size + * doesn't appear to matter). + * + * In those two cases it literally drops pixels, sometimes whole + * columns, making the glyphs unreadable and ugly even when readable. + */ + /* + * FIXME: + * Also, we need to scale the width and height separately. The + * CHAR_WIDTH and CHAR_HEIGHT attributes would seem to be ideal, but + * don't appear to have any effect if set. Instead we will manually + * scale the bitmap later, which may be very ugly because we won't try + * to identify different parts of glyphs or preserve density. + */ + { + XftPattern *pat; + XftPattern *match; + XftResult status; + + font = NULL; + if ((pat = XftNameParse(fontname))) { + XftPatternBuild(pat, + /* arbitrary value */ + XFT_SIZE, XftTypeDouble, 12.0, + XFT_PIXEL_SIZE, XftTypeDouble, (double) + targeth / 10.0, +#if 0 + XFT_CHAR_WIDTH, XftTypeInteger, (int) maxw, + XFT_CHAR_HEIGHT, XftTypeInteger, (int) + (targeth / 10U), +#endif + XFT_SPACING, XftTypeInteger, XFT_MONO, + XFT_SLANT, XftTypeInteger, 0, + XFT_ANTIALIAS, XftTypeBool, False, + NULL); + if ((match = XftFontMatch(display, + XScreenNumberOfScreen(screen), + pat, &status))) { + font = XftFontOpenPattern(display, match); + maybeXftCache(xw, font); + } + XftPatternDestroy(pat); + } + } + if (!font) { + TRACE(("Unable to open a monospaced Xft font.\n")); + return NULL; + } +#ifdef DEBUG_FONT_SIZE_SEARCH + { + char buffer[1024]; + + if (XftNameUnparse(font->pattern, buffer, (int) sizeof(buffer))) { + printf("Testing font named \"%s\"\n", buffer); + } else { + printf("Testing unknown font\n"); + } + } +#endif + + if (cacheindex < FONT_SIZE_CACHE_SIZE && + targeth == cache[cacheindex].targeth) { + *w = cache[cacheindex].w; + *h = cache[cacheindex].h; + *xmin = cache[cacheindex].xmin; + *ymin = cache[cacheindex].ymin; + } else { + get_xft_glyph_dimensions(display, font, w, h, xmin, ymin); + } +#ifdef DEBUG_FONT_SIZE_SEARCH + printf("checking max=%ux%u targeth=%u.%u\n", maxw, maxh, targeth / + 10U, targeth % 10U); +#endif + + if (*h > maxh) { + XftFontClose(display, font); +#ifdef DEBUG_FONT_SIZE_SEARCH + printf("got %ux%u glyph; too tall; reducing target size\n", *w, *h); +#endif + if (*h > 2U * maxh) { + targeth /= (*h / maxh); + } else if (targeth > 10U && *h > maxh + 1U) { + targeth -= 10U; + } else { + targeth--; + } + continue; + } + if (*w > maxw) { + XftFontClose(display, font); +#ifdef DEBUG_FONT_SIZE_SEARCH + printf("got %ux%u glyph; too wide; reducing target size\n", *w, *h); +#endif + if (*w > 2U * maxw) { + targeth /= (*w / maxw); + } else if (targeth > 10U && *w > maxw + 1U) { + targeth -= 10U; + } else { + targeth--; + } + continue; + } + if (*w * *h > max_pixels) { + XftFontClose(display, font); +#ifdef DEBUG_FONT_SIZE_SEARCH + printf("got %ux%u glyph; too many pixels; reducing target size\n", + *w, *h); +#endif + if (*w * *h > 2U * max_pixels) { + unsigned min = *w < *h ? *w : *h; + unsigned divisor = (*w * *h) / (max_pixels * min); + if (divisor > 1U) { + targeth /= divisor; + } else if (targeth > 10U) { + targeth -= 10U; + } else { + targeth--; + } + } else { + targeth--; + } + continue; + } +#ifdef DEBUG_FONT_NAME + { + char buffer[1024]; + + if (XftNameUnparse(font->pattern, buffer, (int) sizeof(buffer))) { + printf("Final font for \"%s\" max %dx%d is \"%s\"\n", + fontname, maxw, maxh, buffer); + } else { + printf("Final font for \"%s\" max %dx%d is unknown\n", + fontname, maxw, maxh); + } + } +#endif + + if (cacheindex == FONT_SIZE_CACHE_SIZE) { + for (ii = 0U; ii < FONT_SIZE_CACHE_SIZE; ii++) { + if (cache[ii].maxw == 0U || cache[ii].maxh == 0U || + cache[ii].max_pixels == 0U) { + CopyFontname(cache[ii].fontname, fontname); + cache[ii].maxw = maxw; + cache[ii].maxh = maxh; + cache[ii].max_pixels = max_pixels; + cache[ii].targeth = targeth; + cache[ii].w = *w; + cache[ii].h = *h; + cache[ii].xmin = *xmin; + cache[ii].ymin = *ymin; + break; + } + } + if (ii == FONT_SIZE_CACHE_SIZE) { + ii = targeth % FONT_SIZE_CACHE_SIZE; + CopyFontname(cache[ii].fontname, fontname); + cache[ii].maxw = maxw; + cache[ii].maxh = maxh; + cache[ii].max_pixels = max_pixels; + cache[ii].targeth = targeth; + cache[ii].w = *w; + cache[ii].h = *h; + cache[ii].xmin = *xmin; + cache[ii].ymin = *ymin; + } + } + return font; + } +} +#endif + +static int +get_xft_bitmap_of_character(RegisGraphicsContext const *context, + char const *fontname, int ch, + unsigned maxw, unsigned maxh, Char *pixels, + unsigned max_pixels, unsigned *w, unsigned *h) +{ + /* + * See Xft / RENDERFONT stuff in fontutils.c and used in utils.c + * Add a separate configuration for ReGIS. + */ + /* + * FIXME: cache: + * - reuse the font where possible + */ +#ifdef XRENDERFONT + XtermWidget xw = context->destination_graphic->xw; + Display *display = XtDisplay(xw); + XftFont *font; + unsigned xmin = 0U, ymin = 0U; + + if (!(font = find_best_xft_font_size(xw, fontname, maxw, maxh, + max_pixels, w, h, &xmin, &ymin))) { + TRACE(("Unable to find suitable Xft font\n")); + return 0; + } + + if (!copy_bitmap_from_xft_font(display, font, CharOf(ch), pixels, *w, *h, + xmin, ymin)) { + TRACE(("Unable to create bitmap for '%c'\n", ch)); + XftFontClose(display, font); + return 0; + } + XftFontClose(display, font); + return 1; +#else + (void) context; + (void) fontname; + (void) ch; + (void) maxw; + (void) maxh; + (void) pixels; + (void) max_pixels; + (void) w; + (void) h; + + return 0; +#endif +} + +static unsigned +find_best_alphabet_index(RegisGraphicsContext const *context, + unsigned minw, unsigned minh, + unsigned maxw, unsigned maxh, + unsigned max_pixels) +{ + unsigned ii; + unsigned bestmatch; + unsigned bestw, besth; + + assert(context); + assert(maxw); + assert(maxh); + + bestmatch = MAX_REGIS_ALPHABETS; + bestw = 0U; + besth = 0U; + for (ii = 0U; ii < MAX_REGIS_ALPHABETS; ii++) { + if (context->alphabets[ii].alphabet_num == + context->current_text_controls->alphabet_num && + context->alphabets[ii].pixw >= minw && + context->alphabets[ii].pixh >= minh && + context->alphabets[ii].pixw <= maxw && + context->alphabets[ii].pixh <= maxh && + context->alphabets[ii].pixw > bestw && + context->alphabets[ii].pixh > besth && + context->alphabets[ii].pixw * + context->alphabets[ii].pixh <= max_pixels) { + bestmatch = ii; + bestw = context->alphabets[ii].pixw; + besth = context->alphabets[ii].pixh; + } + } + +#ifdef DEBUG_ALPHABET_LOOKUP + if (bestmatch < MAX_REGIS_ALPHABETS) { + TRACE(("found alphabet %u at index %u size %ux%u font=%s\n", + context->current_text_controls->alphabet_num, bestmatch, + bestw, besth, + context->alphabets[bestmatch].use_font ? + context->alphabets[bestmatch].fontname : "(none)")); + } +#endif + + return bestmatch; +} + +#define GLYPH_WIDTH_BYTES(PIXW) ( ((PIXW) + 7U) >> 3U ) + +static int +get_user_bitmap_of_character(RegisGraphicsContext const *context, + int ch, + unsigned alphabet_index, + Char *pixels) +{ + const Char *glyph; + unsigned w, h; + unsigned xx, yy; + unsigned byte, bit; + + assert(context); + assert(pixels); + + if (!context->alphabets[alphabet_index].loaded[(Char) ch]) { + TRACE(("in alphabet %u with alphabet index %u user glyph for '%c' not loaded\n", + context->current_text_controls->alphabet_num, alphabet_index, + ch)); + return 0; + } + + assert(context->alphabets[alphabet_index].bytes); + + w = context->alphabets[alphabet_index].pixw; + h = context->alphabets[alphabet_index].pixh; + glyph = &context->alphabets[alphabet_index] + .bytes[(Char) ch * GLYPH_WIDTH_BYTES(w) * h]; + + for (yy = 0U; yy < h; yy++) { + for (xx = 0U; xx < w; xx++) { + byte = yy * GLYPH_WIDTH_BYTES(w) + (xx >> 3U); + bit = xx & 7U; + pixels[yy * w + xx] = ((unsigned) glyph[byte] >> (7U - bit)) & 1U; + } + } + + return 1; +} + +/* + * alphabets + * 0 built-in + * 1-N custom (max is 3 on VT3X0 -- up to MAX_REGIS_ALPHABETS with xterm) + * + * built-in 7-bit charsets + * (B ASCII + * (0 DEC special graphics + * (> DEC technical + * (A NCR British + * (4 NCR Dutch + * (5 NCR Finnish + * (R NCR French + * (9 NCR French Canadian + * (K NCR German + * (Y NCR Italian + * (' NCR Norwegian/Danish + * (!6 NCR Portuguese + * (Z NCR Spanish + * (7 NCR Swedish + * (- NCR Swiss + * + * -@ ??? + * + * built-in 8-bit charsets + * )%5 DEC supplemental graphics + * -A ISO Latin-1 supplemental + * )< user-preferred supplemental (94 chars) + * + * defaults + * terminal char cell size charsets angle + * VT3x0 S1 0:ASCII(94) 0 (positive) + * + */ +static void +get_bitmap_of_character(RegisGraphicsContext const *context, int ch, + unsigned maxw, unsigned maxh, Char *pixels, + unsigned *w, unsigned *h, unsigned max_pixels) +{ + unsigned bestmatch; + char const *fontname = NULL; + + assert(context); + assert(w); + assert(h); + + if (context->current_text_controls->alphabet_num == 0) + fontname = context->builtin_font; + + *w = 0U; + *h = 0U; + + bestmatch = find_best_alphabet_index(context, 1U, 1U, maxw, maxh, + max_pixels); + if (bestmatch < MAX_REGIS_ALPHABETS) { + RegisAlphabet const *alpha = &context->alphabets[bestmatch]; + + if (!alpha->use_font && + get_user_bitmap_of_character(context, ch, bestmatch, pixels)) { +#ifdef DEBUG_USER_GLYPH + TRACE(("found user glyph for alphabet number %d (index %u)\n\n", + context->current_text_controls->alphabet_num, bestmatch)); +#endif + *w = alpha->pixw; + *h = alpha->pixh; + return; + } + + if (alpha->use_font) + fontname = alpha->fontname; + } + + if (fontname) { + if (get_xft_bitmap_of_character(context, fontname, ch, + maxw, maxh, pixels, + max_pixels, w, h)) { + if (*w > maxw) { + TRACE(("BUG: Xft glyph is too wide: %ux%u but max is %ux%u\n", + *w, *h, maxw, maxh)); + } else if (*h > maxh) { + TRACE(("BUG: Xft glyph is too tall: %ux%u but max is %ux%u\n", + *w, *h, maxw, maxh)); + } else if (*w * *h > max_pixels) { + TRACE(("BUG: Xft glyph has too many pixels: %u but max is %u\n", + *w * *h, max_pixels)); + } else { + TRACE(("got glyph from \"%s\" for alphabet number %d\n", + fontname, context->current_text_controls->alphabet_num)); +#ifdef DEBUG_SPECIFIC_CHAR_METRICS + if (IS_DEBUG_CHAR(ch)) { + printf("got %ux%u Xft bitmap for '%c' target size %ux%u:\n", + *w, *h, + ch, maxw, maxh); + dump_bitmap_pixels(pixels, *w, *h); + printf("\n"); + } +#endif + return; + } + } + } + + TRACE(("unable to load any bitmap for character '%c' in alphabet number %u at %ux%u\n", + ch, context->current_text_controls->alphabet_num, maxw, maxh)); + + /* + * The VT3x0 series (and probably earlier ReGIS implementations) use a solid + * block glyph for unknown glyphs. + */ + { + unsigned xx, yy; + + *w = MIN2(8U, maxh); + *h = MIN2(10U, maxw); + for (yy = 0U; yy < *h; yy++) + for (xx = 0U; xx < *w; xx++) + pixels[yy * *w + xx] = '\1'; + } +} + +#define ROT_SHEAR_SCALE 8192 +#define SIGNED_UNSIGNED_MOD(VAL, BASE) ( (((VAL) % (int) (BASE)) + (int) (BASE)) % (int) (BASE) ) + +static unsigned +get_shade_character_pixel(Char const *pixels, unsigned w, unsigned h, + unsigned smaxf, unsigned scale, int slant_dx, + int px, int py) +{ + unsigned wx, wy; + unsigned fx, fy; + + wx = (unsigned) SIGNED_UNSIGNED_MOD(px - + (slant_dx * SIGNED_UNSIGNED_MOD(py, smaxf)) + / ROT_SHEAR_SCALE, smaxf); + wy = (unsigned) SIGNED_UNSIGNED_MOD(py, smaxf); + + fx = (wx * scale) >> SCALE_FIXED_POINT; + fy = (wy * scale) >> SCALE_FIXED_POINT; + if (fx < w && fy < h) { + return (unsigned) pixels[fy * w + fx]; + } + return 0U; +} + +static void +draw_character(RegisGraphicsContext *context, int ch, + int slant_dx, int rot_shear_x, + int rot_shear_y, int x_sign_x, int x_sign_y, + int y_sign_x, int y_sign_y) +{ + const unsigned xmaxd = context->current_text_controls->character_display_w; + const unsigned ymaxd = context->current_text_controls->character_display_h; + const unsigned xmaxf = context->current_text_controls->character_unit_cell_w; + const unsigned ymaxf = context->current_text_controls->character_unit_cell_h; + unsigned w, h; + unsigned xscale, yscale; + unsigned fx, fy; + unsigned px, py; + int sx; + int rx, ry; + int ox, oy; + unsigned pad_left, pad_right; + unsigned pad_top, pad_bottom; + Char pixels[MAX_GLYPH_PIXELS]; + unsigned value; + + get_bitmap_of_character(context, ch, xmaxf, ymaxf, pixels, &w, &h, + MAX_GLYPH_PIXELS); + if (w < 1 || h < 1) { + return; + } + + if (xmaxd > xmaxf) { + pad_left = (xmaxd - xmaxf) / 2U; + pad_right = (xmaxd - xmaxf) - pad_left; + } else { + pad_left = 0U; + pad_right = 0U; + } + if (ymaxd > ymaxf) { + pad_top = (ymaxd - ymaxf) / 2U; + pad_bottom = (ymaxd - ymaxf) - pad_top; + } else { + pad_top = 0U; + pad_bottom = 0U; + } + + xscale = (w << SCALE_FIXED_POINT) / xmaxf; + yscale = (h << SCALE_FIXED_POINT) / ymaxf; + + for (py = 0U; py < ymaxd; py++) { + for (px = 0U; px < xmaxd; px++) { + if (py < pad_top || px < pad_left || + py >= ymaxd - pad_bottom || px >= xmaxd - pad_right) { + value = 0U; + } else { + fx = ((px - pad_left) * xscale) >> SCALE_FIXED_POINT; + fy = ((py - pad_top) * yscale) >> SCALE_FIXED_POINT; + if (fx < w && fy < h) { + value = (unsigned) pixels[fy * w + fx]; + } else { + value = 0U; + } + } + + sx = (int) px + (slant_dx * (int) py) / ROT_SHEAR_SCALE; + rx = x_sign_x * sx + x_sign_y * (int) py; + ry = y_sign_x * sx + y_sign_y * (int) py; + ox = rx + (rot_shear_x * ry) / ROT_SHEAR_SCALE; + oy = ry + (rot_shear_y * ox) / ROT_SHEAR_SCALE; + ox += (rot_shear_x * oy) / ROT_SHEAR_SCALE; + + draw_regis_pixel(context, + (int) context->graphics_output_cursor_x + ox, + (int) context->graphics_output_cursor_y + oy, + value); + } + } +} + +static void +move_text(RegisGraphicsContext *context, int dx, int dy) +{ + double total_rotation; + int str_invert; + int str_shear_x, str_shear_y; + int ox, oy; + + total_rotation = 2.0 * M_PI * + context->current_text_controls->string_rotation / 360.0; + while (total_rotation > 1.5 * M_PI) { + total_rotation -= 2.0 * M_PI; + } + if (total_rotation > 0.5 * M_PI) { + total_rotation -= M_PI; + str_invert = -1; + } else { + str_invert = 1; + } + str_shear_x = (int) (ROT_SHEAR_SCALE * -tan(0.5 * -total_rotation)); + str_shear_y = (int) (ROT_SHEAR_SCALE * sin(-total_rotation)); + + total_rotation = 2.0 * M_PI * + context->current_text_controls->character_rotation / 360.0; + while (total_rotation > 1.5 * M_PI) { + total_rotation -= 2.0 * M_PI; + } + + TRACE(("str_shear: %.5f, %.5f (sign=%d)\n", + str_shear_x / (double) ROT_SHEAR_SCALE, + str_shear_y / (double) ROT_SHEAR_SCALE, + str_invert)); + + ox = str_invert * dx + (str_shear_x * dy) / ROT_SHEAR_SCALE; + oy = str_invert * dy + (str_shear_y * ox) / ROT_SHEAR_SCALE; + ox += (str_shear_x * oy) / ROT_SHEAR_SCALE; + + TRACE(("after pv output updating position %+d,%+d\n", ox, oy)); + context->graphics_output_cursor_x += ox; + context->graphics_output_cursor_y += oy; + + return; +} + +#define UPSCALE_TEXT_DIMENSION(D) do { \ + *(D) = (unsigned)((double)(*(D)) * M_SQRT2); \ + } while (0) + +static void +draw_text(RegisGraphicsContext *context, char const *str) +{ +#ifndef ENABLE_DISTORTIONLESS_ROTATION + RegisTextControls *old_text_controls = NULL; + static RegisTextControls scratch_text_controls; +#endif + double total_rotation; + size_t ii; + int str_invert; + int str_shear_x, str_shear_y; + int slant_dx; + int chr_x_sign_x, chr_x_sign_y; + int chr_y_sign_x, chr_y_sign_y; + int chr_shear_x, chr_shear_y; + int begin_x, begin_y; + int rx, ry; + int ox, oy; + +#ifdef DEBUG_ALPHABETS + { + unsigned n; + + for (n = 0U; n < MAX_REGIS_ALPHABETS; n++) { + printf("alphabet index %u\n", n); + if (context->alphabets[n].alphabet_num != INVALID_ALPHABET_NUM) { + printf(" alphabet_num=%u\n", context->alphabets[n].alphabet_num); + printf(" pixw=%d\n", context->alphabets[n].pixw); + printf(" pixh=%d\n", context->alphabets[n].pixh); + printf(" name=\"%s\"\n", context->alphabets[n].name); + printf(" use_font=%d\n", context->alphabets[n].use_font); + printf(" fontname=\"%s\"\n", context->alphabets[n].fontname); + printf(" bytes=%p\n", context->alphabets[n].bytes); + } + } + } +#endif + + if (context->current_text_controls->slant <= -75 || + context->current_text_controls->slant >= +75) { + TRACE(("ERROR: unsupported character slant angle %d\n", + context->current_text_controls->slant)); + return; + } + + /* FIXME: grab when first entering command */ + begin_x = context->graphics_output_cursor_x; + begin_y = context->graphics_output_cursor_y; + +#ifndef ENABLE_DISTORTIONLESS_ROTATION + if (context->current_text_controls->character_rotation != 0 && + context->current_text_controls->character_rotation != 90 && + context->current_text_controls->character_rotation != 180 && + context->current_text_controls->character_rotation != 270) { + old_text_controls = context->current_text_controls; + scratch_text_controls = *context->current_text_controls; + UPSCALE_TEXT_DIMENSION(&scratch_text_controls.character_display_w); + UPSCALE_TEXT_DIMENSION(&scratch_text_controls.character_display_h); + /* FIXME: Not sure if this is really scaled. The increment seems to + * _not_ be scaled. + */ + UPSCALE_TEXT_DIMENSION(&scratch_text_controls.character_unit_cell_w); + UPSCALE_TEXT_DIMENSION(&scratch_text_controls.character_unit_cell_h); + context->current_text_controls = &scratch_text_controls; + TRACE(("scaled up text to %dx%d\n", + scratch_text_controls.character_display_w, + scratch_text_controls.character_display_h)); + } +#endif + + total_rotation = 2.0 * M_PI * + context->current_text_controls->string_rotation / 360.0; + while (total_rotation > 1.5 * M_PI) { + total_rotation -= 2.0 * M_PI; + } + if (total_rotation > 0.5 * M_PI) { + total_rotation -= M_PI; + str_invert = -1; + } else { + str_invert = 1; + } + str_shear_x = (int) (ROT_SHEAR_SCALE * -tan(0.5 * -total_rotation)); + str_shear_y = (int) (ROT_SHEAR_SCALE * sin(-total_rotation)); + + total_rotation = 2.0 * M_PI * + context->current_text_controls->character_rotation / 360.0; + while (total_rotation > 1.5 * M_PI) { + total_rotation -= 2.0 * M_PI; + } + if (total_rotation > 0.5 * M_PI) { + total_rotation -= M_PI; + chr_x_sign_x = -1; + chr_x_sign_y = 0; + chr_y_sign_x = 0; + chr_y_sign_y = -1; + } else { + chr_x_sign_x = 1; + chr_x_sign_y = 0; + chr_y_sign_x = 0; + chr_y_sign_y = 1; + } + chr_shear_x = (int) (ROT_SHEAR_SCALE * -tan(0.5 * -total_rotation)); + chr_shear_y = (int) (ROT_SHEAR_SCALE * sin(-total_rotation)); + + { + const int slant = context->current_text_controls->slant; + + TRACE(("float version: %.5f\n", tan(2.0 * M_PI * abs(slant) / 360.0))); + /* The slant is negative for forward-leaning characters. */ + if (slant > 0) { + slant_dx = (int) +(tan(2.0 * M_PI * abs(slant) / 360.0) * ROT_SHEAR_SCALE); + } else if (slant < 0) { + slant_dx = (int) -(tan(2.0 * M_PI * abs(slant) / 360.0) * ROT_SHEAR_SCALE); + } else { + slant_dx = 0; + } + TRACE(("string rotation: %d\n", + context->current_text_controls->string_rotation)); + TRACE(("character rotation: %d\n", + context->current_text_controls->character_rotation)); + TRACE(("character slant: %d (%.5f pixels per line)\n", + slant, slant_dx / (double) ROT_SHEAR_SCALE)); + } + + TRACE(("str_shear: %.5f, %.5f (sign=%d)\n", + str_shear_x / (double) ROT_SHEAR_SCALE, + str_shear_y / (double) ROT_SHEAR_SCALE, + str_invert)); + TRACE(("chr_shear: %.5f, %.5f (xsign=%d,%d, ysign=%d,%d)\n", + chr_shear_x / (double) ROT_SHEAR_SCALE, + chr_shear_y / (double) ROT_SHEAR_SCALE, + chr_x_sign_x, chr_x_sign_y, + chr_y_sign_x, chr_y_sign_y)); + TRACE(("character_inc: %d,%d\n", + context->current_text_controls->character_inc_x, context->current_text_controls->character_inc_y)); + + rx = 0; + ry = 0; + for (ii = 0U; ii < strlen(str); ii++) { + switch (str[ii]) { + case '\r': + rx = 0; + break; + case '\n': + ry += (int) context->current_text_controls->character_display_h; + break; + case '\b': + rx -= context->current_text_controls->character_inc_x; + ry -= context->current_text_controls->character_inc_y; + break; + case '\t': + rx += context->current_text_controls->character_inc_x; + ry += context->current_text_controls->character_inc_y; + break; + default: + ox = str_invert * rx + (str_shear_x * ry) / ROT_SHEAR_SCALE; + oy = str_invert * ry + (str_shear_y * ox) / ROT_SHEAR_SCALE; + ox += (str_shear_x * oy) / ROT_SHEAR_SCALE; + TRACE(("during text output updating position to %d,%d + %+d,%+d for '%c'\n", + begin_x, begin_y, ox, oy, str[ii])); + context->graphics_output_cursor_x = begin_x + ox; + context->graphics_output_cursor_y = begin_y + oy; + draw_character(context, str[ii], slant_dx, + chr_shear_x, chr_shear_y, + chr_x_sign_x, chr_x_sign_y, + chr_y_sign_x, chr_y_sign_y); + rx += context->current_text_controls->character_inc_x; + ry += context->current_text_controls->character_inc_y; + } + } + + ox = str_invert * rx + (str_shear_x * ry) / ROT_SHEAR_SCALE; + oy = str_invert * ry + (str_shear_y * ox) / ROT_SHEAR_SCALE; + ox += (str_shear_x * oy) / ROT_SHEAR_SCALE; + TRACE(("after text output updating position to %d,%d + %+d,%+d\n", + begin_x, begin_y, ox, oy)); + context->graphics_output_cursor_x = begin_x + ox; + context->graphics_output_cursor_y = begin_y + oy; + +#ifndef ENABLE_DISTORTIONLESS_ROTATION + if (context->current_text_controls->character_rotation != 0 && + context->current_text_controls->character_rotation != 90 && + context->current_text_controls->character_rotation != 180 && + context->current_text_controls->character_rotation != 270) { + context->current_text_controls = old_text_controls; + } +#endif + + context->destination_graphic->dirty = 1; + return; +} + +/* + * standard character cell sizes + * number disp cell unit cell offset + * S0 [ 9, 10] [ 8, disp_h] [disp_w, 0] + * S1 [ 9, 20] [ 8, disp_h] [disp_w, 0] + * S2 [ 18, 30] [ 16, disp_h] [disp_w, 0] + * S3 [ 27, 45] [ 24, disp_h] [disp_w, 0] + * S4 [ 36, 60] [ 32, disp_h] [disp_w, 0] + * S5 [ 45, 75] [ 40, disp_h] [disp_w, 0] + * S6 [ 54, 90] [ 48, disp_h] [disp_w, 0] + * S7 [ 63,105] [ 56, disp_h] [disp_w, 0] + * S8 [ 72,120] [ 64, disp_h] [disp_w, 0] + * S9 [ 81,135] [ 72, disp_h] [disp_w, 0] + * S10 [ 90,150] [ 80, disp_h] [disp_w, 0] + * S11 [ 99,165] [ 88, disp_h] [disp_w, 0] + * S12 [108,180] [ 96, disp_h] [disp_w, 0] + * S13 [117,195] [104, disp_h] [disp_w, 0] + * S14 [126,210] [112, disp_h] [disp_w, 0] + * S15 [135,225] [120, disp_h] [disp_w, 0] + * S16 [144,240] [128, disp_h] [disp_w, 0] + */ +static int +get_standard_character_size(int standard, unsigned *disp_w, unsigned + *disp_h, unsigned *unit_w, unsigned *unit_h, + int *off_x, int *off_y) +{ + switch (standard) { + case 0: + *disp_w = 9U; + *disp_h = 10U; + *unit_w = 8U; + break; + case 1: + *disp_w = 9U; + *disp_h = 20U; + *unit_w = 8U; + break; + case 2: + *disp_w = 18U; + *disp_h = 30U; + *unit_w = 16U; + break; + case 3: + *disp_w = 27U; + *disp_h = 45U; + *unit_w = 24U; + break; + case 4: + *disp_w = 36U; + *disp_h = 60U; + *unit_w = 32U; + break; + case 5: + *disp_w = 45U; + *disp_h = 75U; + *unit_w = 40U; + break; + case 6: + *disp_w = 54U; + *disp_h = 90U; + *unit_w = 48U; + break; + case 7: + *disp_w = 63U; + *disp_h = 105U; + *unit_w = 56U; + break; + case 8: + *disp_w = 72U; + *disp_h = 120U; + *unit_w = 64U; + break; + case 9: + *disp_w = 81U; + *disp_h = 135U; + *unit_w = 72U; + break; + case 10: + *disp_w = 90U; + *disp_h = 150U; + *unit_w = 80U; + break; + case 11: + *disp_w = 99U; + *disp_h = 165U; + *unit_w = 88U; + break; + case 12: + *disp_w = 108U; + *disp_h = 180U; + *unit_w = 96U; + break; + case 13: + *disp_w = 117U; + *disp_h = 195U; + *unit_w = 104U; + break; + case 14: + *disp_w = 126U; + *disp_h = 210U; + *unit_w = 112U; + break; + case 15: + *disp_w = 135U; + *disp_h = 225U; + *unit_w = 120U; + break; + case 16: + *disp_w = 144U; + *disp_h = 240U; + *unit_w = 128U; + break; + default: + return 1; + } + *unit_h = *disp_h; + *off_x = (int) *disp_w; + *off_y = 0; + + return 0; +} + +static void +init_fragment(RegisDataFragment *fragment, char const *str) +{ + assert(fragment); + assert(str); + + fragment->start = str; + fragment->len = (unsigned) strlen(str); + fragment->pos = 0U; +} + +static void +copy_fragment(RegisDataFragment *dst, RegisDataFragment const *src) +{ + assert(dst); + assert(src); + + dst->start = src->start; + dst->len = src->len; + dst->pos = src->pos; +} + +static char +peek_fragment(RegisDataFragment const *fragment) +{ + assert(fragment); + + if (fragment->pos < fragment->len) { + return fragment->start[fragment->pos]; + } + return '\0'; +} + +static char +pop_fragment(RegisDataFragment *fragment) +{ + assert(fragment); + + if (fragment->pos < fragment->len) { + return fragment->start[fragment->pos++]; + } + return '\0'; +} + +static char +get_fragment(RegisDataFragment const *fragment, unsigned pos) +{ + assert(fragment); + + if (fragment->pos + pos < fragment->len) { + return fragment->start[fragment->pos + pos]; + } + return '\0'; +} + +#define fragment_length(f) (f)->len + +static unsigned +fragment_remaining(RegisDataFragment const *fragment) +{ + assert(fragment); + + if (fragment->pos > fragment->len) + return 0U; + return fragment->len - fragment->pos; +} + +static int +fragment_consumed(RegisDataFragment const *fragment) +{ + assert(fragment); + + return fragment->pos >= fragment->len; +} + +static void +fragment_to_string(RegisDataFragment const *fragment, char *out, + unsigned outlen) +{ + unsigned remaininglen; + unsigned endpos; + + assert(fragment); + assert(out); + + if (!outlen) + return; + remaininglen = fragment->len - fragment->pos; + if (remaininglen < outlen - 1U) { + endpos = remaininglen; + } else { + endpos = outlen - 1U; + } + strncpy(out, &fragment->start[fragment->pos], (size_t) endpos); + out[endpos] = '\0'; +} + +#define MAX_FRAG 1024 +static char const * +fragment_to_tempstr(RegisDataFragment const *fragment) +{ + static char tempstr[MAX_FRAG]; + + assert(fragment); + + fragment_to_string(fragment, tempstr, MAX_FRAG); + return tempstr; +} + +static int +skip_regis_whitespace(RegisDataFragment *input) +{ + int skipped = 0; + + assert(input); + + while (!fragment_consumed(input)) { + char ch = peek_fragment(input); + if (ch != ',' && !IsSpace(ch)) { + break; + } + if (ch == '\n') { + TRACE(("end of input line\n\n")); + } + skipped = 1; + pop_fragment(input); + } + + if (skipped) + return 1; + return 0; +} + +static int +extract_regis_extent(RegisDataFragment *input, RegisDataFragment *output) +{ + char ch; + + assert(input); + assert(output); + + output->start = &input->start[input->pos]; + output->len = 0U; + output->pos = 0U; + + if (input->pos >= input->len) + return 0; + + ch = input->start[input->pos]; + if (ch != '[') + return 0; + input->pos++; + output->start++; + + /* FIXME: truncate to 16 bit signed integers */ + for (; input->pos < input->len; input->pos++, output->len++) { + ch = input->start[input->pos]; + if (ch == ';') { + TRACE(("DATA_ERROR: end of input before closing bracket\n")); + break; + } + if (ch == ']') + break; + } + if (ch == ']') + input->pos++; + + return 1; +} + +static int +extract_regis_num(RegisDataFragment *input, RegisDataFragment *output) +{ + char ch = 0; + int has_digits = 0; + + assert(input); + assert(output); + + output->start = &input->start[input->pos]; + output->len = 0U; + output->pos = 0U; + + if (input->start[input->pos] == '-' || + input->start[input->pos] == '+') { + input->pos++; + output->len++; + } + + for (; input->pos < input->len; input->pos++, output->len++) { + ch = input->start[input->pos]; + if (ch != '0' && ch != '1' && ch != '2' && ch != '3' && + ch != '4' && ch != '5' && ch != '6' && ch != '7' && + ch != '8' && ch != '9') { + break; + } + has_digits = 1; + } + + /* FIXME: what degenerate forms should be accepted ("E10" "1E" "1e" "1." "1ee10")? */ + /* FIXME: the terminal is said to support "floating point values", truncating to int... what do these look like? */ + if (has_digits && ch == 'E') { + input->pos++; + output->len++; + for (; input->pos < input->len; input->pos++, output->len++) { + ch = input->start[input->pos]; + if (ch != '0' && ch != '1' && ch != '2' && ch != '3' && + ch != '4' && ch != '5' && ch != '6' && ch != '7' && + ch != '8' && ch != '9') { + break; + } + } + } + + return has_digits; +} + +static int +extract_regis_pixelvector(RegisDataFragment *input, RegisDataFragment *output) +{ + char ch; + int has_digits; + + assert(input); + assert(output); + + output->start = &input->start[input->pos]; + output->len = 0U; + output->pos = 0U; + + if (input->pos < input->len) { + ch = input->start[input->pos]; + if (ch == '+' || ch == '-') { + input->pos++; + output->len++; + } + } + + has_digits = 0; + for (; input->pos < input->len; input->pos++, output->len++) { + ch = input->start[input->pos]; + if (ch != '0' && ch != '1' && ch != '2' && ch != '3' && + ch != '4' && ch != '5' && ch != '6' && ch != '7') { + break; + } + has_digits = 1; + } + + return has_digits; +} + +static int +extract_regis_command(RegisDataFragment *input, char *command) +{ + char ch; + + assert(input); + assert(command); + + if (input->pos >= input->len) + return 0; + + ch = input->start[input->pos]; + if (ch == '\0' || ch == ';') { + return 0; + } + if (!islower(CharOf(ch)) && !isupper(CharOf(ch)) && ch != '@') { + return 0; + } + *command = ch; + input->pos++; + + return 1; +} + +static int +extract_regis_string(RegisDataFragment *input, char *out, unsigned maxlen) +{ + char open_quote_ch; + char ch; + unsigned outlen; + + assert(input); + assert(out); + assert(maxlen > 0U); + + if (input->pos >= input->len) + return 0; + + ch = peek_fragment(input); + if (ch != '\'' && ch != '"') + return 0; + open_quote_ch = ch; + outlen = 0U; + pop_fragment(input); + + ch = '\0'; + while (!fragment_consumed(input)) { + char prev_ch = ch; + ch = peek_fragment(input); + /* ';' (resync) and '@' (macrograph) are not recognized in strings */ + if (prev_ch == open_quote_ch) { + if (ch == open_quote_ch) { + if (outlen < maxlen) { + out[outlen] = ch; + } + outlen++; + pop_fragment(input); + ch = '\0'; + continue; + } + if (outlen < maxlen) + out[outlen] = '\0'; + else + out[maxlen] = '\0'; + return 1; + } + if (ch == '\0') + break; + if (ch != open_quote_ch) { + if (outlen < maxlen) + out[outlen] = ch; + outlen++; + } + pop_fragment(input); + } + if (ch == open_quote_ch) { + pop_fragment(input); + if (outlen < maxlen) + out[outlen] = '\0'; + else + out[maxlen] = '\0'; + return 1; + } + /* FIXME: handle multiple strings concatenated with commas */ + + TRACE(("DATA_ERROR: end of input before closing quote\n")); + return 0; +} + +static int +extract_regis_parenthesized_data(RegisDataFragment *input, + RegisDataFragment *output) +{ + char ch; + char open_quote_ch; + int nesting; + + assert(input); + assert(output); + + output->start = &input->start[input->pos]; + output->len = 0U; + output->pos = 0U; + + if (input->pos >= input->len) + return 0; + + ch = input->start[input->pos]; + if (ch != '(') + return 0; + input->pos++; + output->start++; + nesting = 1; + open_quote_ch = '\0'; + + ch = '\0'; + for (; input->pos < input->len; input->pos++, output->len++) { + char prev_ch = ch; + ch = input->start[input->pos]; + if (ch == '\'' || ch == '"') { + if (open_quote_ch == '\0') { + open_quote_ch = ch; + } else { + if (ch == prev_ch && prev_ch == open_quote_ch) { + ch = '\0'; + } else if (ch == open_quote_ch) { + open_quote_ch = '\0'; + } + } + continue; + } + if (open_quote_ch != '\0') + continue; + + if (ch == ';') { + TRACE(("leaving parenthesized data nested %d levels deep due to command termination character\n", + nesting)); + break; + } + if (ch == '(') + nesting++; + if (ch == ')') { + nesting--; + if (nesting == 0) { + input->pos++; + return 1; + } + } + } + + TRACE(("DATA_ERROR: end of input before closing paren (%d levels deep)\n", + nesting)); + return 0; +} + +static int +extract_regis_option(RegisDataFragment *input, + char *option, + RegisDataFragment *output) +{ + char ch; + int paren_level, bracket_level; + char open_quote_ch; + + assert(input); + assert(option); + assert(output); + + /* LETTER suboptions* value? */ + /* + * FIXME: what are the rules for using separate parens vs. sharing between + * options? + */ + + output->start = &input->start[input->pos]; + output->len = 0U; + output->pos = 0U; + + if (input->pos >= input->len) { + return 0; + } + + ch = input->start[input->pos]; + /* FIXME: are options always letters or are some special characters ok? */ + if (ch == ';' || ch == ',' || + ch == '(' || ch == ')' || + ch == '[' || ch == ']' || + ch == '"' || ch == '\'' || + isdigit(CharOf(ch))) { + return 0; + } + *option = ch; + input->pos++; + output->start++; + paren_level = 0; + bracket_level = 0; + + open_quote_ch = '\0'; + for (; input->pos < input->len; input->pos++, output->len++) { + ch = input->start[input->pos]; + TRACE(("looking at char '%c' in option '%c'\n", ch, *option)); + /* FIXME: any special rules for commas? */ + /* FIXME: handle escaped quotes */ + if (ch == '\'' || ch == '"') { + if (open_quote_ch == ch) { + open_quote_ch = '\0'; + } else { + open_quote_ch = ch; + } + continue; + } + if (open_quote_ch != '\0') + continue; + if (ch == '(') { + paren_level++; + } + if (ch == ')') { + paren_level--; + if (paren_level < 0) { + TRACE(("DATA_ERROR: found ReGIS option has value with too many close parens \"%c\"\n", + *option)); + return 0; + } + } + if (ch == '[') { + bracket_level++; + } + if (ch == ']') { + bracket_level--; + if (bracket_level < 0) { + TRACE(("DATA_ERROR: found ReGIS option has value with too many close brackets \"%c\"\n", + *option)); + return 0; + } + } + if (paren_level == 0 && bracket_level == 0) { + /* + * Top-level commas indicate the end of this option and the start of + * another. + */ + if (ch == ',') + break; + /* + * Top-level command/option/suboption names also indicate the end of + * this option. "E" is valid as the exponent indicator in a numeric + * parameter. + */ + if (ch != 'E' && ch != 'e' && + ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))) + break; + } + if (ch == ';') + break; + } + if (paren_level != 0) { + TRACE(("DATA_ERROR: mismatched parens in argument to ReGIS option \"%c\"\n", + *option)); + return 0; + } + if (bracket_level != 0) { + TRACE(("DATA_ERROR: mismatched brackets in argument to ReGIS option \"%c\"\n", + *option)); + return 0; + } + + TRACE(("found ReGIS option and value \"%c\" \"%s\"\n", + *option, + fragment_to_tempstr(output))); + return 1; +} + +static int +regis_num_to_int(RegisDataFragment const *input, int *out) +{ + char ch; + + assert(input); + assert(out); + + /* FIXME: handle exponential notation and rounding */ + /* FIXME: check for junk after the number */ + ch = peek_fragment(input); + if (!isdigit(CharOf(ch)) && + ch != '+' && + ch != '-') { + *out = 0; + return 0; + } + + TRACE(("converting \"%s\" to an int\n", fragment_to_tempstr(input))); + *out = atoi(fragment_to_tempstr(input)); + return 1; +} + +static int +load_regis_colorspec(RegisGraphicsContext const *context, + RegisDataFragment const *input, + short *r_out, short *g_out, short *b_out) +{ + RegisDataFragment colorspec; + short r = -1, g = -1, b = -1; + short l = -1; + int simple; + + assert(context); + assert(input); + assert(r_out); + assert(g_out); + assert(b_out); + + copy_fragment(&colorspec, input); + TRACE(("colorspec option: \"%s\"\n", fragment_to_tempstr(&colorspec))); + + skip_regis_whitespace(&colorspec); + simple = 0; + if (fragment_remaining(&colorspec) == 1U) { + simple = 1; + } else if (fragment_remaining(&colorspec) > 1U) { + char after = get_fragment(&colorspec, 1U); + if (IsSpace(after)) + simple = 1; + } + if (simple) { + char ch = pop_fragment(&colorspec); + + TRACE(("got ReGIS RGB colorspec pattern '%c' with arguments: \"%s\"\n", + ch, fragment_to_tempstr(&colorspec))); + switch (ch) { + case 'D': + case 'd': + r = 0; + g = 0; + b = 0; + l = 0; + break; + case 'R': + case 'r': + r = 100; + g = 0; + b = 0; + l = 46; + break; + case 'G': + case 'g': + r = 0; + g = 100; + b = 0; + l = 50; + break; + case 'B': + case 'b': + r = 0; + g = 0; + b = 100; + l = 50; + break; + case 'C': + case 'c': + r = 0; + g = 100; + b = 100; + l = 50; + break; + case 'Y': + case 'y': + r = 100; + g = 100; + b = 0; + l = 50; + break; + case 'M': + case 'm': + r = 100; + g = 0; + b = 100; + l = 50; + break; + case 'W': + case 'w': + r = 100; + g = 100; + b = 100; + l = 100; + break; + default: + TRACE(("DATA_ERROR: unknown RGB color name: \"%c\"\n", ch)); + return 0; + } + } else { + RegisDataFragment num; + int max, val; + char comp; + short h = -1; + short s = -1; + + while (!fragment_consumed(&colorspec)) { + if (skip_regis_whitespace(&colorspec)) + continue; + + comp = pop_fragment(&colorspec); + switch (comp) { + case ',': + /* not sure if this is valid, but it is easy to handle */ + continue; + case 'H': + case 'h': + max = 360; + comp = 'H'; + break; + case 'L': + case 'l': + max = 100; + comp = 'L'; + break; + case 'S': + case 's': + max = 100; + comp = 'S'; + break; +#ifdef ENABLE_RGB_COLORSPECS + case 'R': /* RLogin extension */ + case 'r': + max = 100; + comp = 'R'; + break; + case 'G': /* RLogin extension */ + case 'g': + max = 100; + comp = 'G'; + break; + case 'B': /* RLogin extension */ + case 'b': + max = 100; + comp = 'B'; + break; +#endif + default: + TRACE(("DATA_ERROR: unrecognized component in colorspec: '%c'\n", + comp)); + return 0; + } + + skip_regis_whitespace(&colorspec); + if (!extract_regis_num(&colorspec, &num)) { + TRACE(("DATA_ERROR: expected int after '%c' component in colorspec: \"%s\"\n", + comp, fragment_to_tempstr(&colorspec))); + return 0; + } + if (!regis_num_to_int(&num, &val)) { + TRACE(("DATA_ERROR: component value %s is not a number\n", + fragment_to_tempstr(&num))); + return 0; + } + /* FIXME: error, truncate, wrap, ...? */ + if (val < 0 || val > max) { + TRACE(("DATA_ERROR: component value %d out of range\n", val)); + return 0; + } + + switch (comp) { + case 'H': + h = (short) val; + break; + case 'L': + l = (short) val; + break; + case 'S': + s = (short) val; + break; + case 'R': + r = (short) val; + break; + case 'G': + g = (short) val; + break; + case 'B': + b = (short) val; + break; + } + } + + if (h >= 0 && l >= 0 && s >= 0 && r < 0 && g < 0 && b < 0) { + TRACE(("found HLS colorspec to be converted: %hd,%hd,%hd\n", + h, l, s)); + hls2rgb(h, l, s, &r, &g, &b); + TRACE(("converted to RGB: %hd,%hd,%hd\n", r, g, b)); + } else if (h < 0 && l < 0 && s < 0 && r >= 0 && g >= 0 && b >= 0) { + TRACE(("found RGB colorspec: %hd,%hd,%hd\n", r, g, b)); + l = (short) ((MIN3(r, g, b) + MAX3(r, g, b)) / 2); + TRACE(("calculated L: %d\n", l)); + } else if (h < 0 && l >= 0 && s < 0 && r < 0 && g < 0 && b < 0) { + TRACE(("found L colorspec to be converted: %hd,%hd,%hd\n", + h, l, s)); + hls2rgb(0, l, 0, &r, &g, &b); + TRACE(("converted to RGB: %hd,%hd,%hd\n", r, g, b)); + } else { + TRACE(("DATA_ERROR: unrecognized colorspec format\n")); + return 0; + } + } + + /* + * The VT240 and VT330 models convert to the closest grayscale value. + */ + if (context->graphics_id == 240 || context->graphics_id == 330) { + hls2rgb(0, l, 0, &r, &g, &b); + TRACE(("converted to grayscale: %hd,%hd,%hd\n", r, g, b)); + } + + *r_out = r; + *g_out = g; + *b_out = b; + + skip_regis_whitespace(&colorspec); + if (!fragment_consumed(&colorspec)) { + char skip; + + skip = pop_fragment(&colorspec); + (void) skip; /* variable needed only if tracing */ + TRACE(("DATA_ERROR: ignoring unexpected character in ReGIS colorspec \"%c\"\n", + skip)); + } + + return 1; +} + +static int +load_regis_regnum_or_colorspec(RegisGraphicsContext const *context, + RegisDataFragment const *input, + RegisterNum *out) +{ + int val; + RegisDataFragment colorspec; + RegisDataFragment num; + RegisDataFragment coloroption; + + copy_fragment(&colorspec, input); + TRACE(("looking at colorspec pattern: \"%s\"\n", + fragment_to_tempstr(&colorspec))); + + skip_regis_whitespace(&colorspec); + + if (extract_regis_num(&colorspec, &num)) { + if (!regis_num_to_int(&num, &val)) { + TRACE(("DATA_ERROR: colorspec value %s is not a valid register\n", + fragment_to_tempstr(&num))); + return 0; + } + if (val < 0) { + /* FIXME: error, truncate, wrap, ...? */ + TRACE(("DATA_ERROR: ignoring negative colorspec value: %d\n", val)); + return 0; + } + if (val >= (int) context->destination_graphic->valid_registers) { + /* FIXME: error, truncate, wrap, ...? */ + TRACE(("DATA_ERROR: colorspec value %d is too big; wrapping\n", + val)); + val %= (int) context->destination_graphic->valid_registers; + } + + TRACE(("colorspec contains index for register %u\n", val)); + *out = (RegisterNum) val; + + skip_regis_whitespace(&colorspec); + if (!fragment_consumed(&colorspec)) { + char skip; + + skip = pop_fragment(&colorspec); + (void) skip; /* variable needed only if tracing */ + TRACE(("DATA_ERROR: unexpected character after register \"%c\"\n", + skip)); + return 0; + } + + return 1; + } + + if (extract_regis_parenthesized_data(&colorspec, &coloroption)) { + short r, g, b; + + if (!load_regis_colorspec(context, &coloroption, &r, &g, &b)) { + TRACE(("unable to parse colorspec\n")); + return 0; + } + + *out = find_color_register(context->destination_graphic->color_registers, + r, g, b); + TRACE(("colorspec maps to closest register %u\n", *out)); + + return 1; + } + + TRACE(("expected register number or colorspec, but found: \"%s\"\n", + fragment_to_tempstr(&colorspec))); + return 0; +} + +static int +to_scaled_int(char const *num, int scale, int *value) +{ + unsigned long whole, frac; + char *end; + + /* FIXME: handle whitespace? how about trailing junk? */ + whole = strtoul(num, &end, 10); + if (end[0] == '.') { + char temp[5] = "0000"; + + if (end[1] != '\0') { + temp[0] = end[1]; + if (end[2] != '\0') { + temp[1] = end[2]; + if (end[3] != '\0') { + temp[2] = end[3]; + if (end[4] != '\0') { + temp[3] = end[4]; + } + } + } + } + frac = strtoul(temp, NULL, 10); + } else if (end[0] == '\0' || end[0] == ',' || IsSpace(end[0])) { + frac = 0; + } else { + TRACE(("unexpected character %c in number %s\n", end[0], num)); + return 0; + } + + *value = (int) (whole * (unsigned) scale + + (frac * (unsigned) scale) / 10000); + + return 1; +} + +static int +load_regis_raw_extent(char const *extent, int *relx, int *rely, + int *xloc, int *yloc, int scale) +{ + int xsign, ysign; + char const *xpart; + char const *ypart; + + xpart = extent; + if ((ypart = strchr(extent, ','))) { + ypart++; + } else { + ypart = ""; + } + + while (IsSpace(xpart[0])) + xpart++; + while (IsSpace(ypart[0])) + ypart++; + + if (xpart[0] == '-') { + xsign = -1; + xpart++; + } else if (xpart[0] == '+') { + xsign = +1; + xpart++; + } else { + xsign = 0; + } + if (ypart[0] == '-') { + ysign = -1; + ypart++; + } else if (ypart[0] == '+') { + ysign = +1; + ypart++; + } else { + ysign = 0; + } + + if (xpart[0] == '\0' || xpart[0] == ',') { + *relx = 1; + *xloc = 0; + } else if (xsign == 0) { + int val; + + if (!to_scaled_int(xpart, scale, &val)) + return 0; + *relx = 0; + *xloc = val; + } else { + int val; + + if (!to_scaled_int(xpart, scale, &val)) + return 0; + *relx = 1; + *xloc = xsign * val; + } + if (ypart[0] == '\0') { + *rely = 1; + *yloc = 0; + } else if (ysign == 0) { + int val; + + if (!to_scaled_int(ypart, scale, &val)) + return 0; + *rely = 0; + *yloc = val; + } else { + int val; + + if (!to_scaled_int(ypart, scale, &val)) + return 0; + *rely = 1; + *yloc = ysign * val; + } + + return 1; +} + +static int +load_regis_mult_extent(char const *extent, int *w, int *h) +{ + int relx, rely; + int px, py; + + if (!load_regis_raw_extent(extent, &relx, &rely, &px, &py, 1)) { + TRACE(("invalid coordinates in extent %s\n", extent)); + return 0; + } + if (relx | rely) { + TRACE(("invalid relative value in multiplier extent %s\n", extent)); + return 0; + } + + *w = px; + *h = py; + + return 1; +} + +static int +load_regis_pixel_extent(char const *extent, int origx, int origy, + int *xloc, int *yloc) +{ + int relx, rely; + int px, py; + + if (!load_regis_raw_extent(extent, &relx, &rely, &px, &py, 1)) { + TRACE(("invalid coordinates in extent %s\n", extent)); + return 0; + } + + *xloc = px; + *yloc = py; + + if (relx) + *xloc += origx; + if (rely) + *yloc += origy; + + return 1; +} + +#define COORD_SCALE 1000 + +static int +load_regis_coord_extent(RegisGraphicsContext const *context, char const *extent, + int origx, int origy, int *xloc, int *yloc) +{ + int relx, rely; + int ux, uy; + + if (!load_regis_raw_extent(extent, &relx, &rely, &ux, &uy, COORD_SCALE)) { + TRACE(("invalid coordinates in extent %s\n", extent)); + return 0; + } + + if (relx) { + const int px = SCALE_XCOORD(context, ux, COORD_SCALE); + TRACE(("converted relative user X coord %.03f to relative pixel X coord %d (width=%d xoff=%d xdiv=%d)\n", + ux / (double) COORD_SCALE, px, context->width, + context->x_off, context->x_div)); + *xloc = origx + px; + } else { + const int px = TRANSLATE_XCOORD(context, ux, COORD_SCALE); + TRACE(("converted absolute user X coord %.03f to absolute pixel X coord %d\n", + ux / (double) COORD_SCALE, px)); + *xloc = px; + } + if (rely) { + const int py = SCALE_YCOORD(context, uy, COORD_SCALE); + TRACE(("converted relative user Y coord %.03f to relative pixel Y coord %d (height=%d yoff=%d ydiv=%d)\n", + uy / (double) COORD_SCALE, py, context->height, + context->y_off, context->y_div)); + *yloc = origy + py; + } else { + const int py = TRANSLATE_YCOORD(context, uy, COORD_SCALE); + TRACE(("converted absolute user Y coord %.03f to absolute pixel Y coord %d\n", + uy / (double) COORD_SCALE, py)); + *yloc = py; + } + + return 1; +} + +static int +load_regis_raw_pixelvector_digit(char const *pixelvector, + unsigned *offset, + int *dx, int *dy, int mul) +{ + switch (pixelvector[*offset]) { + case '0': + *dx += mul; + break; + case '1': + *dx += mul; + *dy -= mul; + break; + case '2': + *dy -= mul; + break; + case '3': + *dx -= mul; + *dy -= mul; + break; + case '4': + *dx -= mul; + break; + case '5': + *dx -= mul; + *dy += mul; + break; + case '6': + *dy += mul; + break; + case '7': + *dx += mul; + *dy += mul; + break; + default: + return 0; + } + + (*offset)++; + return 1; +} + +static int +load_regis_pixel_pixelvector(char const *pixelvector, + int mul, + int origx, int origy, + int *xloc, int *yloc) +{ + int found = 0; + int px = 0, py = 0; + unsigned offset = 0U; + while (load_regis_raw_pixelvector_digit(pixelvector, &offset, + &px, &py, + mul)) + found = 1; + if (pixelvector[offset] != '\0') { + TRACE(("DATA_ERROR: ignoring unknown pixel vector digits: \"%s\"\n", + &pixelvector[offset])); + } + + *xloc = origx + px; + *yloc = origy + py; + + return found; +} + +static int +load_regis_coord_pixelvector(RegisGraphicsContext const *context, + char const *pixelvector, + int origx, int origy, + int *xloc, int *yloc) +{ + const int mul = (int) (context->temporary_write_controls.pv_multiplier + * COORD_SCALE); + int found = 0; + int ux = 0, uy = 0; + unsigned offset = 0U; + + while (load_regis_raw_pixelvector_digit(pixelvector, &offset, + &ux, &uy, + mul)) + found = 1; + if (pixelvector[offset] != '\0') { + TRACE(("DATA_ERROR: ignoring unknown pixel vector digits: \"%s\"\n", + &pixelvector[offset])); + } { + const int px = SCALE_XCOORD(context, ux, COORD_SCALE); + const int py = SCALE_YCOORD(context, uy, COORD_SCALE); + + TRACE(("converted relative X coord %.03f to relative pixel X coord %d (width=%d xoff=%d xdiv=%d)\n", + ux / (double) COORD_SCALE, px, context->width, + context->x_off, context->x_div)); + *xloc = origx + px; + + TRACE(("converted relative Y coord %.03f to relative pixel Y coord %d (height=%d yoff=%d ydiv=%d)\n", + uy / (double) COORD_SCALE, py, context->height, + context->y_off, context->y_div)); + *yloc = origy + py; + } + + return found; +} + +static int +load_regis_coord_pixelvector_step(RegisGraphicsContext const *context, + char const *pixelvector, + unsigned *offset, + int origx, int origy, + int *xloc, int *yloc) +{ + const int mul = (int) (context->temporary_write_controls.pv_multiplier + * COORD_SCALE); + int found = 0; + int ux = 0, uy = 0; + if (load_regis_raw_pixelvector_digit(pixelvector, offset, &ux, &uy, mul)) + found = 1; + if (!found && pixelvector[*offset] != '\0') { + TRACE(("DATA_ERROR: ignoring unknown pixel vector digits: \"%s\"\n", + &pixelvector[*offset])); + } { + const int px = SCALE_XCOORD(context, ux, COORD_SCALE); + const int py = SCALE_YCOORD(context, uy, COORD_SCALE); + + TRACE(("converted relative X coord %.03f to relative pixel X coord %d (width=%d xoff=%d xdiv=%d)\n", + ux / (double) COORD_SCALE, px, context->width, + context->x_off, context->x_div)); + *xloc = origx + px; + + TRACE(("converted relative Y coord %.03f to relative pixel Y coord %d (height=%d yoff=%d ydiv=%d)\n", + uy / (double) COORD_SCALE, py, context->height, + context->y_off, context->y_div)); + *yloc = origy + py; + } + + return found; +} + +static int +load_regis_write_control(RegisParseState *state, + RegisGraphicsContext const *context, + int cur_x, int cur_y, + int option, + RegisDataFragment *arg, + RegisWriteControls *out) +{ + TRACE(("checking write control option \"%c\" with arg \"%s\"\n", + option, fragment_to_tempstr(arg))); + switch (option) { + case 'A': + case 'a': + TRACE(("write control alternate display method \"%s\"\n", + fragment_to_tempstr(arg))); + { + int val; + if (!regis_num_to_int(arg, &val) || val < 0 || val >= 1) { + TRACE(("DATA_ERROR: interpreting out of range value as 0 FIXME\n")); + break; + } + if (val == 1) { + TRACE(("ERROR: blink display method not supported FIXME\n")); + } + } + break; + case 'C': + case 'c': + TRACE(("write control compliment writing mode \"%s\"\n", + fragment_to_tempstr(arg))); + out->write_style = WRITE_STYLE_COMPLEMENT; + break; + case 'E': + case 'e': + TRACE(("write control erase writing mode \"%s\"\n", + fragment_to_tempstr(arg))); + out->write_style = WRITE_STYLE_ERASE; + break; + case 'F': + case 'f': + TRACE(("write control plane write mask \"%s\"\n", + fragment_to_tempstr(arg))); + { + int val; + if (!regis_num_to_int(arg, &val) || + val < 0 || val >= (int) context->destination_graphic->valid_registers) { + TRACE(("DATA_ERROR: interpreting out of range value as 0 FIXME\n")); + out->plane_mask = 0U; + } else { + out->plane_mask = (unsigned) val; + } + } + break; + case 'I': + case 'i': + TRACE(("write control foreground color \"%s\"\n", + fragment_to_tempstr(arg))); + if (!load_regis_regnum_or_colorspec(context, arg, &out->foreground)) { + TRACE(("DATA_ERROR: write control foreground color specifier not recognized: \"%s\"\n", + fragment_to_tempstr(arg))); + return 0; + } + break; + case 'L': + case 'l': + TRACE(("write control line width \"%s\" (FIXME: currently ignored)\n", + fragment_to_tempstr(arg))); + { + int val; + if (!regis_num_to_int(arg, &val) || + val < 0 || val >= (int) 9) { + TRACE(("interpreting out of range value as 1 FIXME\n")); + out->line_width = 1U; + } else { + out->line_width = (unsigned) val; + } + } + break; + case 'M': + case 'm': + TRACE(("write control found pixel multiplication factor \"%s\"\n", + fragment_to_tempstr(arg))); + { + int val; + if (!regis_num_to_int(arg, &val) || val <= 0) { + TRACE(("interpreting out of range value %d as 1 FIXME\n", val)); + out->pv_multiplier = 1U; + } else { + out->pv_multiplier = (unsigned) val; + } + } + break; + case 'N': + case 'n': + TRACE(("write control negative pattern control \"%s\"\n", + fragment_to_tempstr(arg))); + { + int val; + if (!regis_num_to_int(arg, &val)) { + val = -1; + } + switch (val) { + default: + TRACE(("interpreting out of range value %d as 0 FIXME\n", val)); + out->invert_pattern = 0U; + break; + case 0: + out->invert_pattern = 0U; + break; + case 1: + out->invert_pattern = 1U; + break; + } + } + break; + case 'P': + case 'p': + TRACE(("write control found pattern control \"%s\"\n", + fragment_to_tempstr(arg))); + { + RegisDataFragment suboptionset; + RegisDataFragment suboptionarg; + RegisDataFragment item; + char suboption; + + while (!fragment_consumed(arg)) { + if (skip_regis_whitespace(arg)) + continue; + + TRACE(("looking for option in \"%s\"\n", + fragment_to_tempstr(arg))); + if (extract_regis_parenthesized_data(arg, &suboptionset)) { + TRACE(("got write pattern suboptionset: \"%s\"\n", + fragment_to_tempstr(&suboptionset))); + while (!fragment_consumed(&suboptionset)) { + skip_regis_whitespace(&suboptionset); + if (extract_regis_option(&suboptionset, &suboption, + &suboptionarg)) { + skip_regis_whitespace(&suboptionarg); + TRACE(("inspecting write pattern suboption \"%c\" with value \"%s\"\n", + suboption, + fragment_to_tempstr(&suboptionarg))); + switch (suboption) { + case 'M': + case 'm': + TRACE(("found pattern multiplier \"%s\"\n", + fragment_to_tempstr(&suboptionarg))); + { + RegisDataFragment num; + int val; + + if (extract_regis_num(&suboptionarg, + &num)) { + if (!regis_num_to_int(&num, &val) + || val < 1) { + TRACE(("interpreting out of range pattern multiplier \"%s\" as 2 FIXME\n", + fragment_to_tempstr(&num))); + out->pattern_multiplier = 2U; + } else { + out->pattern_multiplier = + (unsigned) val; + } + skip_regis_whitespace(&suboptionarg); + } + + if (!fragment_consumed(&suboptionarg)) { + TRACE(("DATA_ERROR: unknown content after pattern multiplier \"%s\"\n", + fragment_to_tempstr(&suboptionarg))); + return 0; + } + } + break; + default: + TRACE(("DATA_ERROR: unknown ReGIS write pattern suboption '%c' arg \"%s\"\n", + suboption, + fragment_to_tempstr(&suboptionarg))); + return 0; + } + continue; + } + + TRACE(("DATA_ERROR: skipping unknown token in pattern control suboptionset (expecting option): \"%s\"\n", + fragment_to_tempstr(&suboptionset))); + pop_fragment(&suboptionset); + } + continue; + } + + TRACE(("looking for int in \"%s\"\n", + fragment_to_tempstr(arg))); + if (extract_regis_num(arg, &item)) { + if (peek_fragment(&item) == '0' || + peek_fragment(&item) == '1') { + unsigned pattern = 0U; + unsigned bitcount; + + TRACE(("converting pattern bits \"%s\"\n", + fragment_to_tempstr(&item))); + for (bitcount = 0;; bitcount++) { + char ch = pop_fragment(&item); + if (ch == '\0') + break; + switch (ch) { + case '0': + if (bitcount < MAX_PATTERN_BITS) { + pattern <<= 1U; + } + break; + case '1': + if (bitcount < MAX_PATTERN_BITS) { + pattern <<= 1U; + pattern |= 1U; + } + break; + default: + TRACE(("DATA_ERROR: unknown ReGIS write pattern bit value \"%c\"\n", + ch)); + return 0; + } + } + + if (bitcount > 0U) { + unsigned extrabits; + + for (extrabits = 0; + bitcount + extrabits < MAX_PATTERN_BITS; + extrabits++) { + if (pattern & (1U << (bitcount - 1U))) { + pattern <<= 1U; + pattern |= 1U; + } else { + pattern <<= 1U; + } + } + } + + out->pattern = pattern; + } else { + int val; + + TRACE(("converting pattern id \"%s\"\n", + fragment_to_tempstr(&item))); + if (!regis_num_to_int(&item, &val)) + val = -1; + switch (val) { /* FIXME: exponential allowed? */ + case 0: + out->pattern = 0x00; /* solid bg */ + break; + case 1: + out->pattern = 0xff; /* solid fg */ + break; + case 2: + out->pattern = 0xf0; /* dash */ + break; + case 3: + out->pattern = 0xe4; /* dash dot */ + break; + case 4: + out->pattern = 0xaa; /* dot */ + break; + case 5: + out->pattern = 0xea; /* dash dot dot */ + break; + case 6: + out->pattern = 0x88; /* sparse dot */ + break; + case 7: + out->pattern = 0x84; /* asymmetric sparse dot */ + break; + case 8: + out->pattern = 0xc8; /* sparse dash dot */ + break; + case 9: + out->pattern = 0x86; /* sparse dot dash */ + break; + default: + TRACE(("DATA_ERROR: unknown ReGIS standard write pattern \"%d\"\n", + val)); + return 0; + } + } + + TRACE(("final pattern is %02x\n", out->pattern)); + continue; + } + skip_regis_whitespace(arg); + + TRACE(("DATA_ERROR: skipping unknown token in pattern suboption: \"%s\"\n", + fragment_to_tempstr(arg))); + pop_fragment(arg); + } + } + break; + case 'R': + case 'r': + TRACE(("write control switch to replacement writing mode \"%s\"\n", + fragment_to_tempstr(arg))); + out->write_style = WRITE_STYLE_REPLACE; + break; + case 'S': + case 's': + TRACE(("write control shading control \"%s\"\n", + fragment_to_tempstr(arg))); + { + RegisDataFragment suboptionset; + RegisDataFragment suboptionarg; + RegisDataFragment item; + char suboption; + char shading_character = '\0'; + unsigned reference_dim = WRITE_SHADING_REF_Y; + /* FIXME: are relative offsets additive? */ + int ref_x = cur_x, ref_y = cur_y; + int shading_enabled = 0; + + while (!fragment_consumed(arg)) { + if (skip_regis_whitespace(arg)) + continue; + + if (extract_regis_string(arg, state->temp, state->templen)) { + TRACE(("found fill char \"%s\"\n", state->temp)); + /* FIXME: allow longer strings, ignore extra chars, or treat as error? */ + if (strlen(state->temp) != 1) { + TRACE(("DATA_ERROR: expected exactly one char in fill string FIXME\n")); + return 0; + } + shading_character = state->temp[0]; + shading_enabled = 1; + TRACE(("shading character is: '%c' (%d)\n", + shading_character, (int) shading_character)); + continue; + } + + if (extract_regis_parenthesized_data(arg, &suboptionset)) { + skip_regis_whitespace(&suboptionset); + TRACE(("got shading control suboptionset: \"%s\"\n", + fragment_to_tempstr(&suboptionset))); + while (!fragment_consumed(&suboptionset)) { + if (skip_regis_whitespace(&suboptionset)) + continue; + if (extract_regis_option(&suboptionset, &suboption, + &suboptionarg)) { + TRACE(("inspecting write shading suboption \"%c\" with value \"%s\"\n", + suboption, + fragment_to_tempstr(&suboptionarg))); + switch (suboption) { + case 'X': + case 'x': + TRACE(("found horizontal shading suboption \"%s\"\n", + fragment_to_tempstr(&suboptionarg))); + if (!fragment_consumed(&suboptionarg)) { + TRACE(("DATA_ERROR: unexpected value to horizontal shading suboption FIXME\n")); + return 0; + } + reference_dim = WRITE_SHADING_REF_X; + shading_enabled = 1; + break; + default: + TRACE(("DATA_ERROR: unknown ReGIS write pattern suboption '%c' arg \"%s\"\n", + suboption, + fragment_to_tempstr(&suboptionarg))); + return 0; + } + continue; + } + + TRACE(("DATA_ERROR: skipping unknown token in shading control suboptionset (expecting option): \"%s\"\n", + fragment_to_tempstr(&suboptionset))); + pop_fragment(&suboptionset); + } + continue; + } + + if (extract_regis_extent(arg, &item)) { + TRACE(("found extent in shading option curr=%d,%d ref=%d,%d\n", + cur_x, cur_y, ref_x, ref_y)); + if (!load_regis_coord_extent(context, + fragment_to_tempstr(&item), + ref_x, ref_y, + &ref_x, &ref_y)) { + TRACE(("DATA_ERROR: unable to parse extent in write shading option '%c': \"%s\"\n", + option, fragment_to_tempstr(&item))); + return 0; + } + TRACE(("shading reference = %d,%d (%s)\n", ref_x, ref_y, + ((reference_dim == WRITE_SHADING_REF_X) + ? "X" + : "Y"))); + continue; + } + + if (extract_regis_num(arg, &item)) { + if (!regis_num_to_int(&item, &shading_enabled)) { + TRACE(("DATA_ERROR: unable to parse int in write shading option '%c': \"%s\"\n", + option, fragment_to_tempstr(&item))); + return 0; + } + if (shading_enabled < 0 || shading_enabled > 1) { + TRACE(("interpreting out of range value %d as 0 FIXME\n", + shading_enabled)); + shading_enabled = 0; + } + TRACE(("shading enabled = %d\n", shading_enabled)); + continue; + } + + if (skip_regis_whitespace(arg)) { + continue; + } + + TRACE(("DATA_ERROR: skipping unknown token in shade suboption: \"%s\"\n", + fragment_to_tempstr(arg))); + pop_fragment(arg); + } + + if (shading_enabled) { + out->shading_enabled = 1U; + out->shading_reference_dim = reference_dim; + out->shading_reference = ((reference_dim == WRITE_SHADING_REF_X) + ? ref_x + : ref_y); + out->shading_character = shading_character; + TRACE(("final shading state: enabled, dim=%d ref=%d, char=%c\n", + out->shading_reference_dim, out->shading_reference, + out->shading_character)); + } else { + /* FIXME: confirm there is no effect if shading isn't enabled + * in the same command + */ + out->shading_enabled = 0U; + TRACE(("final shading state: shading disabled\n")); + } + } + break; + case 'V': + case 'v': + TRACE(("write control switch to overlay writing mode \"%s\"\n", + fragment_to_tempstr(arg))); + out->write_style = WRITE_STYLE_OVERLAY; + break; + default: + TRACE(("DATA_ERROR: ignoring unknown ReGIS write option \"%c\" arg \"%s\"\n", + option, fragment_to_tempstr(arg))); + return 0; + } + + return 1; +} + +static int +load_regis_write_control_set(RegisParseState *state, + RegisGraphicsContext const *context, + int cur_x, int cur_y, + RegisDataFragment *controls, + RegisWriteControls *out) +{ + RegisDataFragment optionset; + RegisDataFragment arg; + char option; + + while (!fragment_consumed(controls)) { + if (skip_regis_whitespace(controls)) + continue; + + if (extract_regis_parenthesized_data(controls, &optionset)) { + TRACE(("got write control optionset: \"%s\"\n", + fragment_to_tempstr(&optionset))); + while (!fragment_consumed(&optionset)) { + skip_regis_whitespace(&optionset); + if (extract_regis_option(&optionset, &option, &arg)) { + skip_regis_whitespace(&arg); + TRACE(("got write control option and value: \"%c\" \"%s\"\n", + option, fragment_to_tempstr(&arg))); + if (!load_regis_write_control(state, context, + cur_x, cur_y, + option, &arg, out)) { + return 0; + } + continue; + } + + TRACE(("DATA_ERROR: skipping unknown token in write control optionset (expecting option): \"%s\"\n", + fragment_to_tempstr(&optionset))); + pop_fragment(&optionset); + } + continue; + } + + TRACE(("DATA_ERROR: skipping unknown token in write controls (expecting optionset): \"%s\"\n", + fragment_to_tempstr(controls))); + pop_fragment(controls); + } + + return 1; +} + +static void +init_regis_write_controls(int graphics_id, unsigned all_planes, + RegisWriteControls *controls) +{ + controls->pv_multiplier = 1U; + controls->pattern = 0xff; /* solid */ + controls->pattern_multiplier = 2U; + controls->invert_pattern = 0U; + controls->plane_mask = all_planes; + controls->write_style = WRITE_STYLE_OVERLAY; + switch (graphics_id) { + case 125: /* FIXME: verify */ + case 240: /* FIXME: verify */ + case 241: /* FIXME: verify */ + case 330: + controls->foreground = 3U; + break; + case 340: + default: + controls->foreground = 7U; + break; + case 382: + controls->foreground = 1U; /* FIXME: verify */ + break; + } + controls->shading_enabled = 0U; + controls->shading_character = '\0'; + controls->shading_reference = 0; /* no meaning if shading is disabled */ + controls->shading_reference_dim = WRITE_SHADING_REF_NONE; + controls->line_width = 1U; + /* FIXME: add the rest */ +} + +static void +map_regis_graphics_pages(XtermWidget xw, RegisGraphicsContext *context) +{ + const int charrow = 0; + const int charcol = 0; + unsigned old_display_id = ~0U; + + if (context->destination_graphic) + context->destination_graphic->hidden = 1; + if (context->display_graphic) { + context->display_graphic->hidden = 1; + old_display_id = context->display_graphic->id; + } + + context->destination_graphic = + get_new_or_matching_graphic(xw, + charrow, charcol, + context->width, + context->height, + context->destination_page); + if (context->destination_graphic) { + context->destination_graphic->hidden = 1; + context->destination_graphic->valid = 1; + } + + context->display_graphic = + get_new_or_matching_graphic(xw, + charrow, charcol, + context->width, + context->height, + context->display_page); + if (context->display_graphic) { + context->display_graphic->hidden = 0; + if (old_display_id != context->display_graphic->id) { + if (!context->display_graphic->valid) { + draw_solid_rectangle(context->display_graphic, 0, 0, + context->width, context->height, + context->background); + } + context->display_graphic->dirty = 1; + context->force_refresh = 1; + /* FIXME: This isn't really enough. If there are holes in the new + * graphic they should be cleared and set to the text from the same + * page. But we don't have pages for text in xterm (the alt buffer + * is similar though). + */ + } + context->display_graphic->valid = 1; + } + + TRACE(("using graphics destination=[%d -> %u] display=[%d -> %u]\n", + context->destination_page, + (context->destination_graphic + ? context->destination_graphic->id + : 0U), + context->display_page, + (context->display_graphic + ? context->display_graphic->id + : 0U))); +} + +static void +copy_regis_write_controls(RegisWriteControls const *src, + RegisWriteControls *dst) +{ + dst->pv_multiplier = src->pv_multiplier; + dst->pattern = src->pattern; + dst->pattern_multiplier = src->pattern_multiplier; + dst->invert_pattern = src->invert_pattern; + dst->foreground = src->foreground; + dst->plane_mask = src->plane_mask; + dst->write_style = src->write_style; + dst->shading_enabled = src->shading_enabled; + dst->shading_character = src->shading_character; + dst->shading_reference = src->shading_reference; + dst->shading_reference_dim = src->shading_reference_dim; + dst->line_width = src->line_width; +} + +static void +init_regis_text_controls(RegisTextControls *controls) +{ + controls->alphabet_num = 0U; /* built-in */ + controls->character_set_l = 0U; /* ASCII */ + controls->character_set_r = 0U; /* Latin-1 */ + get_standard_character_size(1, &controls->character_display_w, + &controls->character_display_h, + &controls->character_unit_cell_w, + &controls->character_unit_cell_h, + &controls->character_inc_x, + &controls->character_inc_y); + controls->string_rotation = 0; + controls->character_rotation = 0; + controls->slant = 0; +} + +static void +copy_regis_text_controls(RegisTextControls const *src, RegisTextControls *dst) +{ + dst->alphabet_num = src->alphabet_num; + dst->character_set_l = src->character_set_l; + dst->character_set_r = src->character_set_r; + dst->character_display_w = src->character_display_w; + dst->character_display_h = src->character_display_h; + dst->character_unit_cell_w = src->character_unit_cell_w; + dst->character_unit_cell_h = src->character_unit_cell_h; + dst->character_inc_x = src->character_inc_x; + dst->character_inc_y = src->character_inc_y; + dst->string_rotation = src->string_rotation; + dst->character_rotation = src->character_rotation; + dst->slant = src->slant; +} + +static void +init_regis_alphabets(RegisGraphicsContext *context) +{ + unsigned alphabet_index; + + for (alphabet_index = 0U; alphabet_index < MAX_REGIS_ALPHABETS; + alphabet_index++) { + context->alphabets[alphabet_index].alphabet_num = INVALID_ALPHABET_NUM; + context->alphabets[alphabet_index].pixw = 0U; + context->alphabets[alphabet_index].pixh = 0U; + context->alphabets[alphabet_index].name[0] = '\0'; + context->alphabets[alphabet_index].fontname[0] = '\0'; + context->alphabets[alphabet_index].use_font = 0; + context->alphabets[alphabet_index].bytes = NULL; + } +} + +static void +init_regis_graphics_context(int graphics_id, int width, int height, + unsigned max_colors, const char *builtin_font, + RegisGraphicsContext *context) +{ + context->destination_graphic = NULL; + context->display_graphic = NULL; + context->display_page = 0U; + context->destination_page = 0U; + context->graphics_id = graphics_id; + + /* reset addressing / clear user coordinates */ + context->width = width; + context->height = height; + context->x_off = 0; + context->y_off = 0; + context->x_div = width - 1; + context->y_div = height - 1; + + /* + * Generate a mask covering all valid color register address bits + * (but don't bother past 2**16). + */ + context->all_planes = max_colors; + context->all_planes--; + context->all_planes |= 1U; + context->all_planes |= context->all_planes >> 1U; + context->all_planes |= context->all_planes >> 2U; + context->all_planes |= context->all_planes >> 4U; + context->all_planes |= context->all_planes >> 8U; + + context->builtin_font = builtin_font; + + init_regis_write_controls(graphics_id, context->all_planes, + &context->persistent_write_controls); + copy_regis_write_controls(&context->persistent_write_controls, + &context->temporary_write_controls); + + init_regis_text_controls(&context->persistent_text_controls); + context->current_text_controls = &context->persistent_text_controls; + init_regis_alphabets(context); + + context->multi_input_mode = 0; + /* FIXME: coordinates */ + /* FIXME: scrolling */ + context->background = 0U; + /* FIXME: input cursor location */ + /* FIXME: input cursor style */ + context->graphics_output_cursor_x = 0; + context->graphics_output_cursor_y = 0; + /* FIXME: output cursor style */ + + context->force_refresh = 0; +} + +static int +parse_regis_command(RegisParseState *state) +{ + char ch; + + if (!extract_regis_command(&state->input, &ch)) + return 0; + + switch (ch) { + case 'C': + case 'c': + /* Curve + + * C + * (A) # set the arc length in degrees (+ or nothing for + * # counter-clockwise, - for clockwise, rounded to the + * # closest integer degree) + * (B) # begin closed curve sequence (must have at least two + * # values; this option can not be nested) + * (C) # position is the center, current location is the + * # circumference (stays in effect until next command) + * (E) # end curve sequence (drawing is performed here) + * (S) # begin open curve sequence + * (W) # temporary write options (see write command) + * [] # center if (C), otherwise point on circumference + * []... # if between (B) and (E) + * ... # if between (B) and (E) + */ + TRACE(("found ReGIS command \"%c\" (curve)\n", ch)); + state->command = 'c'; + state->curve_mode = CURVE_POSITION_ARC_EDGE; + state->arclen = 360; + state->num_points = 0U; + break; + case 'F': + case 'f': + /* Fill + + * F + * (V) # polygon (see vector command) + * (C) # curve (see curve command) + * (W) # temporary write options (see write command) + */ + TRACE(("found ReGIS command \"%c\" (filled polygon)\n", ch)); + state->command = 'f'; + break; + case 'L': + case 'l': + /* Load + + * L + * (A) # set alphabet number or name + * (F)"fontname" # load from font (xterm extension) + * (S)[w,h] # set glyph size (xterm extension) + * "ascii"xx,xx,xx,xx,xx,xx,xx,xx # pixel values + */ + TRACE(("found ReGIS command \"%c\" (load charset)\n", ch)); + state->command = 'l'; + break; + case 'P': + case 'p': + /* Position + + * P + * (B) # begin bounded position stack (last point returns to first) + * (E) # end position stack + * (P) # select graphics page for the input and output cursors + * (S) # begin unbounded position stack + * (W) # temporary write options (see write command) + * # move: 0 == right, 1 == upper right, ..., 7 == lower right + * [] # move to position (X, Y, or both) + * + * Note the stack does not need to be ended before the next command + * Note: maximum depth is 16 levels + */ + TRACE(("found ReGIS command \"%c\" (position)\n", ch)); + state->command = 'p'; + break; + case 'R': + case 'r': + /* Report + + * R + * (E) # parse error + * (I) # set input mode (0 == one-shot, 1 == multiple) (always returns CR) + * (L) # current alphabet number and name + * (M() # macrograph contents + * (M(=) # macrograph storage (free bytes of total bytes) + * (P) # absolute output cursor position + * (P(I)) # interactive locator mode (in one-shot or multiple mode) + * (P(I[xmul,ymul])) # interactive locator mode with arrow key movement multipliers + */ + TRACE(("found ReGIS command \"%c\" (report status)\n", ch)); + state->command = 'r'; + break; + case 'S': + case 's': + /* Screen + + * S + * (A[][]) # adjust screen coordinates + * (C # 0 (cursor output off), 1 (cursor output on) + * (E) # erase to background color, resets shades, curves, and stacks + * (F) # print the graphic and erase the screen (DECprint extension) + * (H(P)[][) + * (I) # set the background to a specific register + * (I()) # set the background to the register closest to an "RGB" color + * (I(RGB)) # set the background to the register closest to an RGB triplet (RLogin extension) + * (I(HLS)) # set the background to the register closest to an HLS triplet + * (I(L)) # set the background to the register closest to a grayscale value + * (M()...) # codes are D (black), R (red), G (green), B (blue), C (cyan), Y (yellow), M (magenta), W (white) (sets color and grayscale registers) + * (M(A)...) # codes are D (black), R (red), G (green), B (blue), C (cyan), Y (yellow), M (magenta), W (white) (sets color registers only) + * (M(RGB)...) # 0..100, 0..100, 0..100 (sets color and grayscale registers) (RLogin extension) + * (M(ARGB)...) # 0..100, 0..100, 0..100 (sets color registers only) (RLogin extension) + * (M(HLS)...) # 0..360, 0..100, 0..100 (sets color and grayscale registers) + * (M(AHLS)...) # 0..360, 0..100, 0..100 (sets color registers only) + * (M(L)...) # level is 0 ... 100 (sets grayscale registers only) + * (P) # 0 (default) or 1 + * (S() # scale screen output by scale (default 1, VT125:max=2, VT3x0:unsupported) FIXME + * (S(X) # scale screen output horizontally by scale (default 1, VT125:max=2, VT3x0:unsupported) FIXME + * (S(Y) # scale screen output vertically by scale (default 1, VT125:max=2, VT3x0:unsupported) FIXME + * (T(

    I=Zyv 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 LPe1 +#include + +#define MakeDim(color) \ + color = (unsigned short) ((2 * (unsigned) color) / 3) + +#define RGBPCT(c) \ + ((double)c.red / 655.35), \ + ((double)c.green / 655.35), \ + ((double)c.blue / 655.35) + +static void dumpHtmlHeader(XtermWidget xw, FILE *fp); +static void dumpHtmlScreen(XtermWidget xw, FILE *fp); +static void dumpHtmlLine(XtermWidget xw, int row, FILE *fp); +static void dumpHtmlFooter(XtermWidget, FILE *fp); +static void writeStyle(XtermWidget, FILE *fp); + +void +xtermDumpHtml(XtermWidget xw) +{ + char *saveLocale; + FILE *fp; + + TRACE(("xtermDumpHtml...\n")); + saveLocale = xtermSetLocale(LC_NUMERIC, "C"); + fp = create_printfile(xw, ".xhtml"); + if (fp != 0) { + dumpHtmlHeader(xw, fp); + dumpHtmlScreen(xw, fp); + dumpHtmlFooter(xw, fp); + fclose(fp); + } + xtermResetLocale(LC_NUMERIC, saveLocale); + TRACE(("...xtermDumpHtml done\n")); +} + +static void +dumpHtmlHeader(XtermWidget xw, FILE *fp) +{ + fputs("\n", fp); + fputs("\n", fp); + fputs("\n", fp); + fputs(" \n", fp); + fprintf(fp, " \n", xtermVersion()); + fputs(" \n", fp); + fputs(" \n", fp); + fputs(" Xterm\n", fp); + writeStyle(xw, fp); + fputs(" \n", fp); + fputs(" \n", fp); + fputs("

    \n", fp); + fputs("
    ", fp);
    +    xevents(xw);
    +}
    +
    +static void
    +writeStyle(XtermWidget xw, FILE *fp)
    +{
    +    TScreen *s = TScreenOf(xw);
    +
    +    fputs("  \n", fp);
    +    xevents(xw);
    +}
    +
    +static void
    +dumpHtmlScreen(XtermWidget xw, FILE *fp)
    +{
    +    TScreen *s = TScreenOf(xw);
    +    int row;
    +
    +    for (row = s->top_marg; row <= s->bot_marg; ++row) {
    +	dumpHtmlLine(xw, row, fp);
    +    }
    +}
    +
    +/*
    + * Note: initial and final space around values of class and style
    + *       attribute are deliberate. They make it easier for XPath
    + *       to test whether a particular name is among the attributes.
    + *       It allows expressions such as
    + *           [contains(@class, ' ul ')]
    + *       instead of the unwieldy
    + *           [contains(concat(' ', @class, ' '), ' ul ')]
    + *       The ev and od (for even and odd rows) values
    + *       avoid empty values when going back to old fg/bg.
    + */
    +static void
    +dumpHtmlLine(XtermWidget xw, int row, FILE *fp)
    +{
    +    TScreen *s = TScreenOf(xw);
    +    char attrs[2][sizeof
    +		  ""];
    +    int attr_index = 0;
    +    char *attr = &attrs[attr_index][0];
    +    int inx = ROW2INX(s, row);
    +    LineData *ld = getLineData(s, inx);
    +    int col;
    +
    +    if (ld == 0)
    +	return;
    +
    +    for (col = 0; col < MaxCols(s); col++) {
    +	XColor fgcolor, bgcolor;
    +	IChar chr = ld->charData[col];
    +	int slen = 0;
    +
    +	fgcolor.pixel = xw->old_foreground;
    +	bgcolor.pixel = xw->old_background;
    +#if OPT_ISO_COLORS
    +	if (ld->attribs[col] & FG_COLOR) {
    +	    Pixel fg = extract_fg(xw, ld->color[col], ld->attribs[col]);
    +#if OPT_DIRECT_COLOR
    +	    if (ld->attribs[col] & ATR_DIRECT_FG)
    +		fgcolor.pixel = fg;
    +	    else
    +#endif
    +		fgcolor.pixel = s->Acolors[fg].value;
    +	}
    +	if (ld->attribs[col] & BG_COLOR) {
    +	    Pixel bg = extract_bg(xw, ld->color[col], ld->attribs[col]);
    +#if OPT_DIRECT_COLOR
    +	    if (ld->attribs[col] & ATR_DIRECT_BG)
    +		bgcolor.pixel = bg;
    +	    else
    +#endif
    +		bgcolor.pixel = s->Acolors[bg].value;
    +	}
    +#endif
    +
    +	XQueryColor(xw->screen.display, xw->core.colormap, &fgcolor);
    +	XQueryColor(xw->screen.display, xw->core.colormap, &bgcolor);
    +	xevents(xw);
    +
    +	if (ld->attribs[col] & BLINK) {
    +	    /* White on red. */
    +	    fgcolor.red = fgcolor.green = fgcolor.blue = 65535u;
    +	    bgcolor.red = 65535u;
    +	    bgcolor.green = bgcolor.blue = 0u;
    +	}
    +#if OPT_WIDE_ATTRS
    +	if (ld->attribs[col] & ATR_FAINT) {
    +	    MakeDim(fgcolor.red);
    +	    MakeDim(fgcolor.green);
    +	    MakeDim(fgcolor.blue);
    +	}
    +#endif
    +	if (ld->attribs[col] & INVERSE) {
    +	    XColor tmp = fgcolor;
    +	    fgcolor = bgcolor;
    +	    bgcolor = tmp;
    +	}
    +
    +	slen = sprintf(attr + slen, "", RGBPCT(bgcolor));
    +	if (col == 0) {
    +	    fputs(attr, fp);
    +	    attr = &attrs[attr_index ^= 1][0];
    +	} else {
    +	    if (strcmp(&attrs[0][0], &attrs[1][0])) {
    +		fputs("", fp);
    +		fputs(attr, fp);
    +		attr = &attrs[attr_index ^= 1][0];
    +	    }
    +	}
    +
    +#if OPT_WIDE_CHARS
    +	if (chr > 127) {
    +	    /* Ignore hidden characters. */
    +	    if (chr != HIDDEN_CHAR) {
    +		Char temp[10];
    +		*convertToUTF8(temp, chr) = 0;
    +		fputs((char *) temp, fp);
    +	    }
    +	} else
    +#endif
    +	    switch (chr) {
    +	    case 0:
    +		fputc(' ', fp);
    +		break;
    +	    case '&':
    +		fputs("&", fp);
    +		break;
    +	    case '<':
    +		fputs("<", fp);
    +		break;
    +	    case '>':
    +		fputs(">", fp);
    +		break;
    +	    case ' ':
    +		fputs("\302\240", fp);
    +		break;
    +	    default:
    +		fputc((int) chr, fp);
    +	    }
    +	xevents(xw);
    +    }
    +    fprintf(fp, "\n");
    +    xevents(xw);
    +}
    +
    +static void
    +dumpHtmlFooter(XtermWidget xw, FILE *fp)
    +{
    +    fputs("
    \n", fp); + fputs("
    \n", fp); + fputs(" \n", fp); + fputs("\n", fp); + xevents(xw); +} + +char * +PixelToCSSColor(XtermWidget xw, Pixel p) +{ + static char rgb[sizeof "rgb(100.00%, 100.00%, 100.00%)"]; + XColor c; + + c.pixel = p; + XQueryColor(xw->screen.display, xw->core.colormap, &c); + sprintf(rgb, "rgb(%.2f%%, %.2f%%, %.2f%%)", RGBPCT(c)); + return rgb; +} diff --git a/ports/xterm/xterm-359/html.o b/ports/xterm/xterm-359/html.o new file mode 100644 index 0000000000000000000000000000000000000000..fdb79a82883ada1514700622d4eb640d580820ae GIT binary patch literal 71560 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 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/icons/filled-xterm.png b/ports/xterm/xterm-359/icons/filled-xterm.png new file mode 100644 index 0000000000000000000000000000000000000000..88a115e77b0e3784efa33be3c9109cc211175666 GIT binary patch literal 2341 zcmV+=3EK9FP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iyt= z7X&)RM*pt>00^Z?L_t(&-tAd?P*m3$|J{89<+bt<1)`B6f)K(gCRXAr#+g!$@1lsE zIGSYAP@hw0qSHx6d{jXk#c7O*qIEJ&I&G(|+SG_fW9=wrQ9vj!Wfuq!*x_xzp?w92^7y zXl*4hHZn`caX@G&2LOC)t5p{p8{DIr4d5$Jry;W0BqE~Ds;c|`TJ4CfxR+W@oz>M% zL_}n@5&*h>^ynu_j=TRjZ*ct(kexQ0B{DvqGoC+R9v%}DKN1dTxO=xWan`Juy5eF< z7Z@1I>GdFsrOZ@a-5fK0dc0GTmV4p}qKXQ^SF5Fl8#k`d2unj@;Z+}vhN!xl0U)wi z?hp}~jmEFMl*;=9<%NrYv&R$mktRSko4v;du{QxCB2!`E#h!2j04O|hYySTI;*8i> zB#j@B{ficDMp@Zm0I*!YetdRxG?K@S!&@_F4rgNPTwf!jq70rTaUTzSTU8|*CQSGl z8I4m&5W0wnNR}yk^XAiMPM)+3s|T#sy1u$Wc>n;yqM}q=Hf=h>B_;g;b#)&AK*g0S z|Ew~Z=A~w2=%2QY?D07uNpjk}d96Web&~1QrHeBrO=@8e9@vIG2m0~App&?>rKKgr z-@hI}V{=K#KSm^pha!Yr;uRbmoVH*A0Fb4zvHrUbl|d7@dEr9W+}PL;PVL;8Gi~9* z6u!B+X4tKCIJhCn0f)sR?OnSzliJ&BsJ*@R#pj=2n>u~EiA0e-6FKmQLx)b2+5Cxn zGLtDEz}8a-4%9!@1a1}-(Ee@PXhLu>wHl4*-IG;Te(}SgpiW<{mOk3Oo5*gj8EFD4 zPvXh&!VBLRCQdBfnwbfRqHnJqlB>LR>+@c;Q${+8JtBZnqYMBZ-NK`yUVG-M(95|2zZ^eK`MJ5YZ_5@64-BOI++3pi`uy@6H)!4R z<+LU>mGX0Q-Q(2N^`PLy33@p$j!qstDDU37)e@`Mzd;sDIT6vvIXUD5tfcDdU%GPh zv%I{sei{u?bMxoJRz~k!yGHcsr*RKejEahNR9}CfZy_l-ae}C%WQFVZih1)K)Yy2! zMIb#TrHns%G@b;3Cqdw+jvrrd=Z2n^ii(k-4l_naIMkR_Q+=~=sXAO1~Vp5qr= zw+{F|Nf4|6{DzFcv8=51@bQVo*s+^>hSFTRrmI(fipi5dYrlU#a!W==Ty*{dGD(p>W>=^0Kq5IvLCFyZZfh=7hF3dsI@ATzKhHO=v_!^hg+QuBs|}`PEnB z@0ONA>*p85>GkL;EiKe1CQj&LEY6egd8jukm`s)cZ|@Q7jRxp+~L$ceNn)k26Lt z9H-U#faf`AwF>aO46RndNfJS&LN6SkQo*GMW8L#I2Jk$Gjt+uK#qss^wZR5M9{_T&QN-hTlUS6#k*nM6@0K_FsGCP^X^ zMVXw=?go}9c8`l9xpAU65RQ7`Vku zkhix*vf0doA@Ke?OO{+Fo~JZ}!AKn)((2gQBI0>@{j_PfNtWs7GiDT%EYrFvQ*M*f z`9$11GiH_LNR$Er4m^6EKLVw1)Jm3SsA>O`Spo)x~08#9@DJTG&O#xZvz;Rk|oYu2#OAGk; z4F2Fp1ax+?u?Y!5AHMtUZx`*_HD4aUc$fG;MF+Ru&-DL^v(Uc*0geso=!Wo400000 LNkvXXu0mjf9KwH; literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/icons/filled-xterm.svg b/ports/xterm/xterm-359/icons/filled-xterm.svg new file mode 100644 index 0000000..53c6228 --- /dev/null +++ b/ports/xterm/xterm-359/icons/filled-xterm.svg @@ -0,0 +1,680 @@ + + + + + filled-xterm + + + + + + + + + + image/svg+xml + + filled-xterm + + + + Thomas E. Dickey + + + + + MIT-X11 + + + XTerm icon, in SVG format. + June 14, 2012 + https://invisible-island.net/xterm/xterm.icon.html + https://invisible-island.net/xterm/images/icons-xterm_281.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + TERM + + + + + + + + + diff --git a/ports/xterm/xterm-359/icons/filled-xterm.xpms b/ports/xterm/xterm-359/icons/filled-xterm.xpms new file mode 100644 index 0000000..a375aa8 --- /dev/null +++ b/ports/xterm/xterm-359/icons/filled-xterm.xpms @@ -0,0 +1,694 @@ +/* $XTermId: filled-xterm.xpms,v 1.1 2012/10/07 22:58:01 tom Exp $ */ +/* generated by ./make-xpms */ +/* vile:xpmmode */ +/* XPM */ +static const char * const filled_xterm_16x16_xpm[] = { +"16 16 110 2", +" c None", +". c #BAA9A9", +"+ c #C59C9C", +"@ c #C49999", +"# c #C6AAAA", +"$ c #4D4242", +"% c #F0E4E4", +"& c #CEBABA", +"* c #D5BEBE", +"= c #C6B5B5", +"- c #CEBEBE", +"; c #796D6D", +"> c #DEC5C5", +", c #B19B9B", +"' c #C6B8B8", +") c #B19696", +"! c #EBE5E5", +"~ c #FFFFFF", +"{ c #D6D6D6", +"] c #D0BDBD", +"^ c #FFF4F4", +"/ c #FEFDFD", +"( c #706969", +"_ c #CCC3C3", +": c #FFF0F0", +"< c #978989", +"[ c #A9A5A5", +"} c #A7A3A3", +"| c #E3E1E1", +"1 c #DACBCB", +"2 c #DEDEDE", +"3 c #FFF8F8", +"4 c #FFF6F6", +"5 c #FFFCFC", +"6 c #FFFEFE", +"7 c #D2D2D2", +"8 c #9C9C9C", +"9 c #9B8787", +"0 c #B3A0A0", +"a c #FFD5D5", +"b c #D4C2C2", +"c c #FFE7E7", +"d c #7A6F6F", +"e c #786F6F", +"f c #C2C2C2", +"g c #B4B4B4", +"h c #FFE3E3", +"i c #E1CECE", +"j c #FED8D8", +"k c #908888", +"l c #878080", +"m c #898383", +"n c #F3ECEC", +"o c #D8C2C2", +"p c #FFFAFA", +"q c #FFF2F2", +"r c #FFF9F9", +"s c #EFEFEF", +"t c #FEFEFE", +"u c #C8C3C3", +"v c #D2BFBF", +"w c #8A8383", +"x c #FCE5E5", +"y c #D9B6B6", +"z c #DDBCBC", +"A c #BCA0A0", +"B c #F0D2D2", +"C c #AB9C9C", +"D c #000000", +"E c #B0A2A2", +"F c #AE9F9F", +"G c #C6ABAB", +"H c #B48E8E", +"I c #C8ABAB", +"J c #C39A9A", +"K c #D0B2B2", +"L c #C3A0A0", +"M c #CFB2B2", +"N c #C59999", +"O c #CCC1C1", +"P c #3C3535", +"Q c #A39C9C", +"R c #FAEDED", +"S c #FEFCFC", +"T c #F9F2F2", +"U c #FEF7F7", +"V c #FAEBEB", +"W c #FEFAFA", +"X c #F9F1F1", +"Y c #FEF4F4", +"Z c #FAEFEF", +"` c #EBE0E0", +" . c #DFB9B9", +".. c #E8E3E3", +"+. c #BBB0B0", +"@. c #BBA9A9", +"#. c #CEC8C8", +"$. c #BCADAD", +"%. c #CDC8C8", +"&. c #C78D8D", +"*. c #E3B2B2", +"=. c #E3BCBC", +"-. c #BBAAAA", +";. c #746C6C", +">. c #858585", +",. c #8A7F7F", +"'. c #977878", +"). c #A38686", +"!. c #A78686", +"~. c #201717", +" . + @ @ @ @ @ @ @ @ # $ ", +" % & * * * * * * * * = - ; ", +" > , ' ) ! ~ ~ ~ ~ ~ { ] ^ ", +" > / ( _ ~ ~ ~ ~ ~ ~ { ] : ", +" > ~ < [ ~ ~ ~ ~ ~ ~ { ] : ", +" > } | 1 2 ~ ~ ~ ~ ~ { ] : ", +" > ~ ~ 3 ~ 4 4 5 6 4 7 ] : ", +" > 7 8 9 0 a b c d e f ] : ", +" > ~ g h i j k c l m f ] n ", +" o ~ ~ p ~ q 6 r s t u v w ", +" x y z z z z z z A z B C ", +" D ", +" E F G H I J K L M N O P ", +" Q R S T U V W X Y Z U ` Q ", +" ...+._ @.#.$.%.&.*.=.-.;. ", +" >.>.>.,.'.).).).).).!.~. "}; +/* XPM */ +static const char * const filled_xterm_32x32_xpm[] = { +"32 32 225 2", +" c None", +". c #000000", +"+ c #D9C2C2", +"@ c #EEE5E5", +"# c #EBE0E0", +"$ c #EBE1E1", +"% c #EDE1E1", +"& c #918484", +"* c #FFEEEE", +"= c #F2DCDC", +"- c #403838", +"; c #5A5A5A", +"> c #5B4545", +", c #FEF2F2", +"' c #E9E9E9", +") c #856868", +"! c #271D1D", +"~ c #FBCFCF", +"{ c #746060", +"] c #FFFBFB", +"^ c #FFFFFF", +"/ c #FAF0F0", +"( c #5E4949", +"_ c #E3DCDC", +": c #BAA8A8", +"< c #292020", +"[ c #F1C0C0", +"} c #D9C6C6", +"| c #FFECEC", +"1 c #FFE8E8", +"2 c #FFFAFA", +"3 c #FFF0F0", +"4 c #FFEFEF", +"5 c #705D5D", +"6 c #DED5D5", +"7 c #F9E6E6", +"8 c #D3C3C3", +"9 c #392F2F", +"0 c #FCF6F6", +"a c #BAA7A7", +"b c #524646", +"c c #D9D1D1", +"d c #F2EAEA", +"e c #796666", +"f c #FEF7F7", +"g c #BBAAAA", +"h c #918383", +"i c #1D1515", +"j c #EBDADA", +"k c #B5B5B5", +"l c #FFF4F4", +"m c #DDD0D0", +"n c #110A0A", +"o c #FEFBFB", +"p c #D3C7C7", +"q c #FFF3F3", +"r c #968484", +"s c #F2E9E9", +"t c #908484", +"u c #FFFDFD", +"v c #A89191", +"w c #776262", +"x c #CCB4B4", +"y c #9E7979", +"z c #705F5F", +"A c #FFCCCC", +"B c #FFEAEA", +"C c #FFE6E6", +"D c #FFF1F1", +"E c #FFFEFE", +"F c #FFE1E1", +"G c #FFF2F2", +"H c #FFF7F7", +"I c #C7B8B8", +"J c #AE9494", +"K c #5A4848", +"L c #C0AFAF", +"M c #D1BDBD", +"N c #4F3D3D", +"O c #513636", +"P c #BCB0B0", +"Q c #665757", +"R c #1A0C0C", +"S c #E4DCDC", +"T c #FCF3F3", +"U c #1F0C0C", +"V c #C3C3C3", +"W c #726363", +"X c #443A3A", +"Y c #FFF8F8", +"Z c #583D3D", +"` c #FCF4F4", +" . c #615757", +".. c #6C5656", +"+. c #A09393", +"@. c #9B8E8E", +"#. c #856464", +"$. c #4A3F3F", +"%. c #BBBBBB", +"&. c #C0BCBC", +"*. c #452F2F", +"=. c #736C6C", +"-. c #775656", +";. c #878787", +">. c #A38888", +",. c #624D4D", +"'. c #C9B4B4", +"). c #F8F0F0", +"!. c #FFEDED", +"~. c #604242", +"{. c #B5A8A8", +"]. c #FAE9E9", +"^. c #FBF3F3", +"/. c #BAB2B2", +"(. c #F8DEDE", +"_. c #7F6F6F", +":. c #B5A2A2", +"<. c #806F6F", +"[. c #AA8E8E", +"}. c #FEFDFD", +"|. c #BD9F9F", +"1. c #C3B4B4", +"2. c #E0DCDC", +"3. c #F9EEEE", +"4. c #080303", +"5. c #F3C1C1", +"6. c #B7A2A2", +"7. c #4C3A3A", +"8. c #DFD6D6", +"9. c #7E6D6D", +"0. c #FFE9E9", +"a. c #B39A9A", +"b. c #BBA5A5", +"c. c #DEC9C9", +"d. c #715D5D", +"e. c #F3DDDD", +"f. c #8B7979", +"g. c #060303", +"h. c #FFEBEB", +"i. c #EFE9E9", +"j. c #EAEAEA", +"k. c #FAEFEF", +"l. c #D1C3C3", +"m. c #0B0707", +"n. c #312222", +"o. c #584141", +"p. c #685252", +"q. c #5D5858", +"r. c #5F5F5F", +"s. c #5B5B5B", +"t. c #5C5858", +"u. c #473232", +"v. c #181111", +"w. c #ECD8D8", +"x. c #F9EFEF", +"y. c #DBC6C6", +"z. c #DEC5C5", +"A. c #F7EDED", +"B. c #DCC4C4", +"C. c #F8EDED", +"D. c #DEC3C3", +"E. c #E0C9C9", +"F. c #DEC1C1", +"G. c #DBC7C7", +"H. c #F7E8E8", +"I. c #E1CACA", +"J. c #DBC2C2", +"K. c #F8EFEF", +"L. c #796868", +"M. c #422B2B", +"N. c #B5A3A3", +"O. c #F8ECEC", +"P. c #F8EEEE", +"Q. c #FDF7F7", +"R. c #FEF9F9", +"S. c #F7EAEA", +"T. c #FDF6F6", +"U. c #F7EBEB", +"V. c #FDF5F5", +"W. c #F7EEEE", +"X. c #F8EBEB", +"Y. c #786565", +"Z. c #2C2121", +"`. c #F6E9E9", +" + c #F6E8E8", +".+ c #F9EDED", +"++ c #FEFCFC", +"@+ c #F7ECEC", +"#+ c #F7E9E9", +"$+ c #837070", +"%+ c #806C6C", +"&+ c #D4C3C3", +"*+ c #DCC8C8", +"=+ c #DDC2C2", +"-+ c #DBBFBF", +";+ c #E1C8C8", +">+ c #DEC8C8", +",+ c #DEC7C7", +"'+ c #DFC8C8", +")+ c #DEBBBB", +"!+ c #FAEEEE", +"~+ c #221B1B", +"{+ c #3E3131", +"]+ c #F8E8E8", +"^+ c #8D8181", +"/+ c #F6E7E7", +"(+ c #696969", +"_+ c #6D6D6D", +":+ c #6F6C6C", +"<+ c #835D5D", +"[+ c #875D5D", +"}+ c #9D7474", +"|+ c #A27A7A", +"1+ c #958989", +"2+ c #919191", +"3+ c #9D9797", +"4+ c #917E7E", +"5+ c #E3C8C8", +"6+ c #241B1B", +"7+ c #695959", +"8+ c #CEBCBC", +"9+ c #D1D1D1", +"0+ c #CFCBCB", +"a+ c #322424", +"b+ c #201818", +" ", +" . + @ # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % @ & . ", +" . * = - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; > , ' ) ! ", +" . ~ { ] ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ( _ : / < ", +" . [ } | 1 1 2 3 1 4 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 : ^ 7 . ", +" . [ } 8 9 0 a b * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 : ^ 4 . ", +" . [ } ^ c d e f ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 g ^ 4 . ", +" . [ } ^ ^ h i j ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 k ^ l . ", +" . [ } ^ ^ m n | ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 k ^ ^ . ", +" . [ } ^ o { p q ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 k ^ ^ . ", +" . [ } ^ r s ^ t u ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 k ^ ^ . ", +" . [ } v w x ^ y z A ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 : ^ ^ . ", +" . [ } ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 : ^ ^ . ", +" . [ } B C C C D C C C E F G G ^ l C ^ ^ H ] 5 6 : ^ ^ . ", +" . [ } I J K L M N L L E O P Q l B R S T U V 5 6 : ^ ^ . ", +" . [ } ^ * W ^ * X ^ Y ^ Z ` .q B ..+.@.#.V 5 6 : ^ ^ . ", +" . [ } ^ * W ^ * $.%.&.^ *.=.-.u B ;.>.,.'.V 5 6 : ^ ).. ", +" . [ } ^ * W ^ * ,.!.!.E ~.^ {.].B ;.^./.(.V 5 6 : ^ _. ", +" . [ } ^ q :.^ l <.<.<.E [.^ }.|.3 1.^ ^ B 2.5 6 : 3.4. ", +" . 5.6.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ] 7.8.: 9. ", +" . 0.a.b.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.d.e.' f.g. ", +" . h.2 i.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.k.^ l.m. ", +" . . . . . . . . . . . . . . . . . . . . . . . ", +" ", +" n.o.p.p.p.p.q.; r.s.; ; ; t.p.p.p.p.p.p.p.p.u.. ", +" v.w.x.y.z.A.3.} B.C.3.D.E.C.C.F.G.C.H.I.J.C.K.L.M. ", +" N.O.P.Q.R.S.S.f T.U.S.V.f W.A.Q.Q.P.P.Q.f O.X._.Y. ", +" Z.Y `. +V.f .+A.T.Q.O..+++V.K.@+f f #+A.R.V.`.$+x.%+ ", +" &+B.X.).*+=+C.#+-+;+C.O.>+,+U.#+'+)+@+#+F.*+!+9.k.~+ ", +" {+]+^+/+(+_+_+_+_+_+_+_+_+:+<+[+}+|+1+2+3+S.^+4+5+6+ ", +" 7+8+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+0+a+b+ ", +" "}; +/* XPM */ +static const char * const filled_xterm_48x48_xpm[] = { +"48 48 246 2", +" c None", +". c #000000", +"+ c #F6D5D5", +"@ c #FFEAEA", +"# c #FFD6D6", +"$ c #FFD2D2", +"% c #FFD3D3", +"& c #F8D6D6", +"* c #FFEFEF", +"= c #FFFFFF", +"- c #F6DBDB", +"; c #0F0707", +"> c #090505", +", c #F6DCDC", +"' c #FFEEEE", +") c #C99999", +"! c #030101", +"~ c #F7DEDE", +"{ c #150B0B", +"] c #E3C5C5", +"^ c #FFEDED", +"/ c #E4CBCB", +"( c #140B0B", +"_ c #F7DDDD", +": c #E0C9C9", +"< c #080303", +"[ c #FFD9D9", +"} c #0D0707", +"| c #E5CACA", +"1 c #E5CBCB", +"2 c #0B0606", +"3 c #FFDCDC", +"4 c #E2CECE", +"5 c #090303", +"6 c #E1CBCB", +"7 c #9F8A8A", +"8 c #3B2929", +"9 c #312020", +"0 c #FFD5D5", +"a c #ECC8C8", +"b c #402525", +"c c #351F1F", +"d c #663E3E", +"e c #E6DBDB", +"f c #FFFAFA", +"g c #FFFEFE", +"h c #8C7272", +"i c #B4A1A1", +"j c #A69494", +"k c #D8C0C0", +"l c #675353", +"m c #FFFDFD", +"n c #584545", +"o c #E1BFBF", +"p c #3C2929", +"q c #FCF3F3", +"r c #F6EAEA", +"s c #160F0F", +"t c #E9D3D3", +"u c #6E5C5C", +"v c #D6BABA", +"w c #CBBBBB", +"x c #0D0808", +"y c #F8E8E8", +"z c #FFE2E2", +"A c #F4EDED", +"B c #FFF2F2", +"C c #4B3A3A", +"D c #FFFBFB", +"E c #AD9292", +"F c #FFE1E1", +"G c #A28E8E", +"H c #CCBDBD", +"I c #8B7777", +"J c #231515", +"K c #ECCECE", +"L c #FFDADA", +"M c #251414", +"N c #9A8686", +"O c #FFF1F1", +"P c #FFECEC", +"Q c #FFE4E4", +"R c #FFDFDF", +"S c #FFDBDB", +"T c #FFF0F0", +"U c #FFDDDD", +"V c #FFEBEB", +"W c #FFF4F4", +"X c #FFE5E5", +"Y c #FFDEDE", +"Z c #B29E9E", +"` c #A08F8F", +" . c #8A7373", +".. c #1C1111", +"+. c #D7CACA", +"@. c #645555", +"#. c #5E4B4B", +"$. c #FFF7F7", +"%. c #BD9F9F", +"&. c #392B2B", +"*. c #A19090", +"=. c #867474", +"-. c #9C8D8D", +";. c #A99494", +">. c #0E0606", +",. c #FFE9E9", +"'. c #D5C6C6", +"). c #564545", +"!. c #FFE7E7", +"~. c #5B3D3D", +"{. c #352121", +"]. c #5B4242", +"^. c #FFD7D7", +"/. c #E7D2D2", +"(. c #1F1313", +"_. c #786363", +":. c #AC9191", +"<. c #FFE8E8", +"[. c #DBC7C7", +"}. c #897474", +"|. c #574E4E", +"1. c #999999", +"2. c #FFF6F6", +"3. c #170F0F", +"4. c #3B2B2B", +"5. c #190E0E", +"6. c #C7B6B6", +"7. c #5F4D4D", +"8. c #F6E1E1", +"9. c #FCE9E9", +"0. c #F1EAEA", +"a. c #FEFAFA", +"b. c #3D2828", +"c. c #382626", +"d. c #947D7D", +"e. c #FFFCFC", +"f. c #B09B9B", +"g. c #C2B2B2", +"h. c #EEDADA", +"i. c #FDEFEF", +"j. c #0B0505", +"k. c #DACACA", +"l. c #7D6565", +"m. c #C6A7A7", +"n. c #FDF9F9", +"o. c #6C4D4D", +"p. c #AB9797", +"q. c #927B7B", +"r. c #FCEDED", +"s. c #0A0404", +"t. c #120B0B", +"u. c #E8D1D1", +"v. c #E2CACA", +"w. c #0F0808", +"x. c #907979", +"y. c #F9DFDF", +"z. c #1D1111", +"A. c #E8D0D0", +"B. c #E1C8C8", +"C. c #1A0C0C", +"D. c #F8E0E0", +"E. c #F7D4D4", +"F. c #090404", +"G. c #FAE1E1", +"H. c #100A0A", +"I. c #100808", +"J. c #7C4F4F", +"K. c #F6D3D3", +"L. c #FFD8D8", +"M. c #F8D5D5", +"N. c #AF9393", +"O. c #FDE5E5", +"P. c #FDE9E9", +"Q. c #FDE2E2", +"R. c #FDF8F8", +"S. c #FDE6E6", +"T. c #FEECEC", +"U. c #FEE5E5", +"V. c #FFE6E6", +"W. c #F8D1D1", +"X. c #0D0404", +"Y. c #291D1D", +"Z. c #583030", +"`. c #FFF8F8", +" + c #683737", +".+ c #5B3333", +"++ c #582D2D", +"@+ c #593030", +"#+ c #5D3232", +"$+ c #5A2D2D", +"%+ c #663737", +"&+ c #5B3030", +"*+ c #897272", +"=+ c #996F6F", +"-+ c #DBC1C1", +";+ c #110808", +">+ c #FDDDDD", +",+ c #473636", +"'+ c #563232", +")+ c #FFF5F5", +"!+ c #5C3636", +"~+ c #FFF9F9", +"{+ c #582E2E", +"]+ c #6F4040", +"^+ c #5B3434", +"/+ c #6D3E3E", +"(+ c #5A3333", +"_+ c #EFD7D7", +":+ c #FCEFEF", +"<+ c #140A0A", +"[+ c #6A5252", +"}+ c #583333", +"|+ c #5C2A2A", +"1+ c #653737", +"2+ c #6B3C3C", +"3+ c #643434", +"4+ c #6A3C3C", +"5+ c #613535", +"6+ c #9C8787", +"7+ c #907A7A", +"8+ c #DDC3C3", +"9+ c #F8E5E5", +"0+ c #FDF3F3", +"a+ c #190D0D", +"b+ c #FAEAEA", +"c+ c #DCC4C4", +"d+ c #876E6E", +"e+ c #461F1F", +"f+ c #472020", +"g+ c #261414", +"h+ c #070000", +"i+ c #220000", +"j+ c #230101", +"k+ c #3A1818", +"l+ c #3F1D1D", +"m+ c #3E1E1E", +"n+ c #553333", +"o+ c #724646", +"p+ c #431F1F", +"q+ c #AB8F8F", +"r+ c #887171", +"s+ c #DAC0C0", +"t+ c #FBD1D1", +"u+ c #1A1010", +"v+ c #B27C7C", +"w+ c #020101", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . + @ @ # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % @ @ & . . ", +" . * = - ; . . . . . . . . . . . . . . . . . . . . . . . . . . > , = ' . ) ! ", +" . * ~ { ] ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ( _ ' . ^ : < ", +" . [ } | = = = = = = = = = = = = = = = = = = = = = = = = = = = = 1 2 3 . ^ = 4 5 ", +" . [ . * = = = = = = = = = = = = = = = = = = = = = = = = = = = = * . [ . ^ = = 6 . ", +" . [ . * 7 8 9 0 = a b c d = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = e f = g h i = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = j = k l g = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = m n o p q = = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = = r s . t = = = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = = = u . v = = = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = = w x y = = = = = = = = = = = = = = = = = = = = * . [ . z = = * . ", +" . [ . * = = A B B C D = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = E z = = F G = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * H I J K = = L M } N O = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * P Q Q R = = S Q Q Q T = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = = = = = = = = = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = = = = = = = = = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * [ U U U U U V z U U U U W X Y X ^ = = V U O = = O F ' * . [ . ' = = * . ", +" . [ . * Z ` ...` Q +.@.#.` ` Q $.%.&.*.=. ^ = -. = = ;.>.,.* . [ . ' = = * . ", +" . [ . * = = '. = = = Q = = = = %. = = ).!.= -.~. f f {.].,.* . [ . ' = = * . ", +" . [ . * = = '. = = = U U ^.= %. ^ /.(.' = -._.:.<.[.}.@.,.* . [ . ' = = * . ", +" . [ . * = = '. = = = @.|.1.1.2.= %.3.4.5. = = -. 6. 7.8.@.,.* . [ . ' = = 9.. ", +" . [ . * = = '. = = = Q = = = = %. = 0. ' = -. a.b.c.f @.,.* . [ . ' = = d.. ", +" . [ . * = = '. = = = 0 ^ ^ ^ e.%. = = f. m -. = g.h.= @.,.* . [ . ' = i.j. ", +" . [ . * = = k. = = = l.9 9 9 ' m. = = n.o.z p. = = = = l.X * . [ . ' = q.. ", +" . [ . * = = = = = = = = = = = = = = = = = = = = = = = = = = = = * . [ . ' r.s. ", +" . 3 t.u.= = = = = = = = = = = = = = = = = = = = = = = = = = = = v.w.S . ' x.. ", +" . * y.z.A.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ B.C.D.' . E.F. ", +" . * = G.H.. . . . . . . . . . . . . . . . . . . . . . . . . . I.D.= ' . J.. ", +" . K.P P # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ L.P P M.. . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" ", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . N.O.P.O.P.Q.R.S.P.O.P.O.P.O.T.U.T.U.T.,.^ ,.^ ,.^ V.^ ,.= D W ,.^ W.X.. ", +" Y.W Z.`. +e..+e.++D @+$.Z.`. +e.#+e.$+D @+$.Z.`.%+e.#+e.$+e.&+$.Z.D *+=+. ", +" . -+D f e.m D `.= D e.D D f D m D `.= D e.D D f D m D `.= D e.D D f r.;+>+. ", +" ,+`.'+)+!+~+{+= ]+f .+`.Z.)+^+~+{+= /+f .+`.Z.)+^+~+{+= /+f (+`.Z.f q.q.T . ", +" . _+m f = D m ~+e.`.m f m f = D m ~+e.`.m f e.f = D m ~+e.`.m f m f :+<+i.T . ", +" . [+~+}+)+|+~+1+g 2+g 3+`.}+)+|+~+1+g 4+= 3+`.}+)+|+~+1+g 4+= 3+~+5+e.6+7+= 8+. ", +" ! 9+= ~+= T ' @ ' ,.' <.' <.' ' ' @ e.f = ~+= ~+= = = D = f = ~+= = 0+a+b+c+! ", +" . d+m e+f+e.g+. . . . . . . . . . . . h+i+i+j+k+l+l+c m+l+l+n+o+e.e+p+q+r+s+! ", +" . t+* @ @ P S [ L S S S S S S S S S S z ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ P z u+v+w+ ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" "}; +static const XPM_DATA filled_xterm_xpms[] = { + { "filled-xterm_16x16", filled_xterm_16x16_xpm }, + { "filled-xterm_32x32", filled_xterm_32x32_xpm }, + { "filled-xterm_48x48", filled_xterm_48x48_xpm } +}; diff --git a/ports/xterm/xterm-359/icons/filled-xterm_16x16.xpm b/ports/xterm/xterm-359/icons/filled-xterm_16x16.xpm new file mode 100644 index 0000000..9776055 --- /dev/null +++ b/ports/xterm/xterm-359/icons/filled-xterm_16x16.xpm @@ -0,0 +1,129 @@ +/* XPM */ +static char * filled_xterm_16x16_xpm[] = { +"16 16 110 2", +" c None", +". c #BAA9A9", +"+ c #C59C9C", +"@ c #C49999", +"# c #C6AAAA", +"$ c #4D4242", +"% c #F0E4E4", +"& c #CEBABA", +"* c #D5BEBE", +"= c #C6B5B5", +"- c #CEBEBE", +"; c #796D6D", +"> c #DEC5C5", +", c #B19B9B", +"' c #C6B8B8", +") c #B19696", +"! c #EBE5E5", +"~ c #FFFFFF", +"{ c #D6D6D6", +"] c #D0BDBD", +"^ c #FFF4F4", +"/ c #FEFDFD", +"( c #706969", +"_ c #CCC3C3", +": c #FFF0F0", +"< c #978989", +"[ c #A9A5A5", +"} c #A7A3A3", +"| c #E3E1E1", +"1 c #DACBCB", +"2 c #DEDEDE", +"3 c #FFF8F8", +"4 c #FFF6F6", +"5 c #FFFCFC", +"6 c #FFFEFE", +"7 c #D2D2D2", +"8 c #9C9C9C", +"9 c #9B8787", +"0 c #B3A0A0", +"a c #FFD5D5", +"b c #D4C2C2", +"c c #FFE7E7", +"d c #7A6F6F", +"e c #786F6F", +"f c #C2C2C2", +"g c #B4B4B4", +"h c #FFE3E3", +"i c #E1CECE", +"j c #FED8D8", +"k c #908888", +"l c #878080", +"m c #898383", +"n c #F3ECEC", +"o c #D8C2C2", +"p c #FFFAFA", +"q c #FFF2F2", +"r c #FFF9F9", +"s c #EFEFEF", +"t c #FEFEFE", +"u c #C8C3C3", +"v c #D2BFBF", +"w c #8A8383", +"x c #FCE5E5", +"y c #D9B6B6", +"z c #DDBCBC", +"A c #BCA0A0", +"B c #F0D2D2", +"C c #AB9C9C", +"D c #000000", +"E c #B0A2A2", +"F c #AE9F9F", +"G c #C6ABAB", +"H c #B48E8E", +"I c #C8ABAB", +"J c #C39A9A", +"K c #D0B2B2", +"L c #C3A0A0", +"M c #CFB2B2", +"N c #C59999", +"O c #CCC1C1", +"P c #3C3535", +"Q c #A39C9C", +"R c #FAEDED", +"S c #FEFCFC", +"T c #F9F2F2", +"U c #FEF7F7", +"V c #FAEBEB", +"W c #FEFAFA", +"X c #F9F1F1", +"Y c #FEF4F4", +"Z c #FAEFEF", +"` c #EBE0E0", +" . c #DFB9B9", +".. c #E8E3E3", +"+. c #BBB0B0", +"@. c #BBA9A9", +"#. c #CEC8C8", +"$. c #BCADAD", +"%. c #CDC8C8", +"&. c #C78D8D", +"*. c #E3B2B2", +"=. c #E3BCBC", +"-. c #BBAAAA", +";. c #746C6C", +">. c #858585", +",. c #8A7F7F", +"'. c #977878", +"). c #A38686", +"!. c #A78686", +"~. c #201717", +" . + @ @ @ @ @ @ @ @ # $ ", +" % & * * * * * * * * = - ; ", +" > , ' ) ! ~ ~ ~ ~ ~ { ] ^ ", +" > / ( _ ~ ~ ~ ~ ~ ~ { ] : ", +" > ~ < [ ~ ~ ~ ~ ~ ~ { ] : ", +" > } | 1 2 ~ ~ ~ ~ ~ { ] : ", +" > ~ ~ 3 ~ 4 4 5 6 4 7 ] : ", +" > 7 8 9 0 a b c d e f ] : ", +" > ~ g h i j k c l m f ] n ", +" o ~ ~ p ~ q 6 r s t u v w ", +" x y z z z z z z A z B C ", +" D ", +" E F G H I J K L M N O P ", +" Q R S T U V W X Y Z U ` Q ", +" ...+._ @.#.$.%.&.*.=.-.;. ", +" >.>.>.,.'.).).).).).!.~. "}; diff --git a/ports/xterm/xterm-359/icons/filled-xterm_32x32.xpm b/ports/xterm/xterm-359/icons/filled-xterm_32x32.xpm new file mode 100644 index 0000000..feec72c --- /dev/null +++ b/ports/xterm/xterm-359/icons/filled-xterm_32x32.xpm @@ -0,0 +1,260 @@ +/* XPM */ +static char * filled_xterm_32x32_xpm[] = { +"32 32 225 2", +" c None", +". c #000000", +"+ c #D9C2C2", +"@ c #EEE5E5", +"# c #EBE0E0", +"$ c #EBE1E1", +"% c #EDE1E1", +"& c #918484", +"* c #FFEEEE", +"= c #F2DCDC", +"- c #403838", +"; c #5A5A5A", +"> c #5B4545", +", c #FEF2F2", +"' c #E9E9E9", +") c #856868", +"! c #271D1D", +"~ c #FBCFCF", +"{ c #746060", +"] c #FFFBFB", +"^ c #FFFFFF", +"/ c #FAF0F0", +"( c #5E4949", +"_ c #E3DCDC", +": c #BAA8A8", +"< c #292020", +"[ c #F1C0C0", +"} c #D9C6C6", +"| c #FFECEC", +"1 c #FFE8E8", +"2 c #FFFAFA", +"3 c #FFF0F0", +"4 c #FFEFEF", +"5 c #705D5D", +"6 c #DED5D5", +"7 c #F9E6E6", +"8 c #D3C3C3", +"9 c #392F2F", +"0 c #FCF6F6", +"a c #BAA7A7", +"b c #524646", +"c c #D9D1D1", +"d c #F2EAEA", +"e c #796666", +"f c #FEF7F7", +"g c #BBAAAA", +"h c #918383", +"i c #1D1515", +"j c #EBDADA", +"k c #B5B5B5", +"l c #FFF4F4", +"m c #DDD0D0", +"n c #110A0A", +"o c #FEFBFB", +"p c #D3C7C7", +"q c #FFF3F3", +"r c #968484", +"s c #F2E9E9", +"t c #908484", +"u c #FFFDFD", +"v c #A89191", +"w c #776262", +"x c #CCB4B4", +"y c #9E7979", +"z c #705F5F", +"A c #FFCCCC", +"B c #FFEAEA", +"C c #FFE6E6", +"D c #FFF1F1", +"E c #FFFEFE", +"F c #FFE1E1", +"G c #FFF2F2", +"H c #FFF7F7", +"I c #C7B8B8", +"J c #AE9494", +"K c #5A4848", +"L c #C0AFAF", +"M c #D1BDBD", +"N c #4F3D3D", +"O c #513636", +"P c #BCB0B0", +"Q c #665757", +"R c #1A0C0C", +"S c #E4DCDC", +"T c #FCF3F3", +"U c #1F0C0C", +"V c #C3C3C3", +"W c #726363", +"X c #443A3A", +"Y c #FFF8F8", +"Z c #583D3D", +"` c #FCF4F4", +" . c #615757", +".. c #6C5656", +"+. c #A09393", +"@. c #9B8E8E", +"#. c #856464", +"$. c #4A3F3F", +"%. c #BBBBBB", +"&. c #C0BCBC", +"*. c #452F2F", +"=. c #736C6C", +"-. c #775656", +";. c #878787", +">. c #A38888", +",. c #624D4D", +"'. c #C9B4B4", +"). c #F8F0F0", +"!. c #FFEDED", +"~. c #604242", +"{. c #B5A8A8", +"]. c #FAE9E9", +"^. c #FBF3F3", +"/. c #BAB2B2", +"(. c #F8DEDE", +"_. c #7F6F6F", +":. c #B5A2A2", +"<. c #806F6F", +"[. c #AA8E8E", +"}. c #FEFDFD", +"|. c #BD9F9F", +"1. c #C3B4B4", +"2. c #E0DCDC", +"3. c #F9EEEE", +"4. c #080303", +"5. c #F3C1C1", +"6. c #B7A2A2", +"7. c #4C3A3A", +"8. c #DFD6D6", +"9. c #7E6D6D", +"0. c #FFE9E9", +"a. c #B39A9A", +"b. c #BBA5A5", +"c. c #DEC9C9", +"d. c #715D5D", +"e. c #F3DDDD", +"f. c #8B7979", +"g. c #060303", +"h. c #FFEBEB", +"i. c #EFE9E9", +"j. c #EAEAEA", +"k. c #FAEFEF", +"l. c #D1C3C3", +"m. c #0B0707", +"n. c #312222", +"o. c #584141", +"p. c #685252", +"q. c #5D5858", +"r. c #5F5F5F", +"s. c #5B5B5B", +"t. c #5C5858", +"u. c #473232", +"v. c #181111", +"w. c #ECD8D8", +"x. c #F9EFEF", +"y. c #DBC6C6", +"z. c #DEC5C5", +"A. c #F7EDED", +"B. c #DCC4C4", +"C. c #F8EDED", +"D. c #DEC3C3", +"E. c #E0C9C9", +"F. c #DEC1C1", +"G. c #DBC7C7", +"H. c #F7E8E8", +"I. c #E1CACA", +"J. c #DBC2C2", +"K. c #F8EFEF", +"L. c #796868", +"M. c #422B2B", +"N. c #B5A3A3", +"O. c #F8ECEC", +"P. c #F8EEEE", +"Q. c #FDF7F7", +"R. c #FEF9F9", +"S. c #F7EAEA", +"T. c #FDF6F6", +"U. c #F7EBEB", +"V. c #FDF5F5", +"W. c #F7EEEE", +"X. c #F8EBEB", +"Y. c #786565", +"Z. c #2C2121", +"`. c #F6E9E9", +" + c #F6E8E8", +".+ c #F9EDED", +"++ c #FEFCFC", +"@+ c #F7ECEC", +"#+ c #F7E9E9", +"$+ c #837070", +"%+ c #806C6C", +"&+ c #D4C3C3", +"*+ c #DCC8C8", +"=+ c #DDC2C2", +"-+ c #DBBFBF", +";+ c #E1C8C8", +">+ c #DEC8C8", +",+ c #DEC7C7", +"'+ c #DFC8C8", +")+ c #DEBBBB", +"!+ c #FAEEEE", +"~+ c #221B1B", +"{+ c #3E3131", +"]+ c #F8E8E8", +"^+ c #8D8181", +"/+ c #F6E7E7", +"(+ c #696969", +"_+ c #6D6D6D", +":+ c #6F6C6C", +"<+ c #835D5D", +"[+ c #875D5D", +"}+ c #9D7474", +"|+ c #A27A7A", +"1+ c #958989", +"2+ c #919191", +"3+ c #9D9797", +"4+ c #917E7E", +"5+ c #E3C8C8", +"6+ c #241B1B", +"7+ c #695959", +"8+ c #CEBCBC", +"9+ c #D1D1D1", +"0+ c #CFCBCB", +"a+ c #322424", +"b+ c #201818", +" ", +" . + @ # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % @ & . ", +" . * = - ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; > , ' ) ! ", +" . ~ { ] ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ( _ : / < ", +" . [ } | 1 1 2 3 1 4 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 : ^ 7 . ", +" . [ } 8 9 0 a b * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 : ^ 4 . ", +" . [ } ^ c d e f ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 g ^ 4 . ", +" . [ } ^ ^ h i j ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 k ^ l . ", +" . [ } ^ ^ m n | ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 k ^ ^ . ", +" . [ } ^ o { p q ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 k ^ ^ . ", +" . [ } ^ r s ^ t u ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 k ^ ^ . ", +" . [ } v w x ^ y z A ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 : ^ ^ . ", +" . [ } ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 5 6 : ^ ^ . ", +" . [ } B C C C D C C C E F G G ^ l C ^ ^ H ] 5 6 : ^ ^ . ", +" . [ } I J K L M N L L E O P Q l B R S T U V 5 6 : ^ ^ . ", +" . [ } ^ * W ^ * X ^ Y ^ Z ` .q B ..+.@.#.V 5 6 : ^ ^ . ", +" . [ } ^ * W ^ * $.%.&.^ *.=.-.u B ;.>.,.'.V 5 6 : ^ ).. ", +" . [ } ^ * W ^ * ,.!.!.E ~.^ {.].B ;.^./.(.V 5 6 : ^ _. ", +" . [ } ^ q :.^ l <.<.<.E [.^ }.|.3 1.^ ^ B 2.5 6 : 3.4. ", +" . 5.6.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ] 7.8.: 9. ", +" . 0.a.b.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.d.e.' f.g. ", +" . h.2 i.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.k.^ l.m. ", +" . . . . . . . . . . . . . . . . . . . . . . . ", +" ", +" n.o.p.p.p.p.q.; r.s.; ; ; t.p.p.p.p.p.p.p.p.u.. ", +" v.w.x.y.z.A.3.} B.C.3.D.E.C.C.F.G.C.H.I.J.C.K.L.M. ", +" N.O.P.Q.R.S.S.f T.U.S.V.f W.A.Q.Q.P.P.Q.f O.X._.Y. ", +" Z.Y `. +V.f .+A.T.Q.O..+++V.K.@+f f #+A.R.V.`.$+x.%+ ", +" &+B.X.).*+=+C.#+-+;+C.O.>+,+U.#+'+)+@+#+F.*+!+9.k.~+ ", +" {+]+^+/+(+_+_+_+_+_+_+_+_+:+<+[+}+|+1+2+3+S.^+4+5+6+ ", +" 7+8+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+9+0+a+b+ ", +" "}; diff --git a/ports/xterm/xterm-359/icons/filled-xterm_48x48.xpm b/ports/xterm/xterm-359/icons/filled-xterm_48x48.xpm new file mode 100644 index 0000000..e72e4ea --- /dev/null +++ b/ports/xterm/xterm-359/icons/filled-xterm_48x48.xpm @@ -0,0 +1,297 @@ +/* XPM */ +static char * filled_xterm_48x48_xpm[] = { +"48 48 246 2", +" c None", +". c #000000", +"+ c #F6D5D5", +"@ c #FFEAEA", +"# c #FFD6D6", +"$ c #FFD2D2", +"% c #FFD3D3", +"& c #F8D6D6", +"* c #FFEFEF", +"= c #FFFFFF", +"- c #F6DBDB", +"; c #0F0707", +"> c #090505", +", c #F6DCDC", +"' c #FFEEEE", +") c #C99999", +"! c #030101", +"~ c #F7DEDE", +"{ c #150B0B", +"] c #E3C5C5", +"^ c #FFEDED", +"/ c #E4CBCB", +"( c #140B0B", +"_ c #F7DDDD", +": c #E0C9C9", +"< c #080303", +"[ c #FFD9D9", +"} c #0D0707", +"| c #E5CACA", +"1 c #E5CBCB", +"2 c #0B0606", +"3 c #FFDCDC", +"4 c #E2CECE", +"5 c #090303", +"6 c #E1CBCB", +"7 c #9F8A8A", +"8 c #3B2929", +"9 c #312020", +"0 c #FFD5D5", +"a c #ECC8C8", +"b c #402525", +"c c #351F1F", +"d c #663E3E", +"e c #E6DBDB", +"f c #FFFAFA", +"g c #FFFEFE", +"h c #8C7272", +"i c #B4A1A1", +"j c #A69494", +"k c #D8C0C0", +"l c #675353", +"m c #FFFDFD", +"n c #584545", +"o c #E1BFBF", +"p c #3C2929", +"q c #FCF3F3", +"r c #F6EAEA", +"s c #160F0F", +"t c #E9D3D3", +"u c #6E5C5C", +"v c #D6BABA", +"w c #CBBBBB", +"x c #0D0808", +"y c #F8E8E8", +"z c #FFE2E2", +"A c #F4EDED", +"B c #FFF2F2", +"C c #4B3A3A", +"D c #FFFBFB", +"E c #AD9292", +"F c #FFE1E1", +"G c #A28E8E", +"H c #CCBDBD", +"I c #8B7777", +"J c #231515", +"K c #ECCECE", +"L c #FFDADA", +"M c #251414", +"N c #9A8686", +"O c #FFF1F1", +"P c #FFECEC", +"Q c #FFE4E4", +"R c #FFDFDF", +"S c #FFDBDB", +"T c #FFF0F0", +"U c #FFDDDD", +"V c #FFEBEB", +"W c #FFF4F4", +"X c #FFE5E5", +"Y c #FFDEDE", +"Z c #B29E9E", +"` c #A08F8F", +" . c #8A7373", +".. c #1C1111", +"+. c #D7CACA", +"@. c #645555", +"#. c #5E4B4B", +"$. c #FFF7F7", +"%. c #BD9F9F", +"&. c #392B2B", +"*. c #A19090", +"=. c #867474", +"-. c #9C8D8D", +";. c #A99494", +">. c #0E0606", +",. c #FFE9E9", +"'. c #D5C6C6", +"). c #564545", +"!. c #FFE7E7", +"~. c #5B3D3D", +"{. c #352121", +"]. c #5B4242", +"^. c #FFD7D7", +"/. c #E7D2D2", +"(. c #1F1313", +"_. c #786363", +":. c #AC9191", +"<. c #FFE8E8", +"[. c #DBC7C7", +"}. c #897474", +"|. c #574E4E", +"1. c #999999", +"2. c #FFF6F6", +"3. c #170F0F", +"4. c #3B2B2B", +"5. c #190E0E", +"6. c #C7B6B6", +"7. c #5F4D4D", +"8. c #F6E1E1", +"9. c #FCE9E9", +"0. c #F1EAEA", +"a. c #FEFAFA", +"b. c #3D2828", +"c. c #382626", +"d. c #947D7D", +"e. c #FFFCFC", +"f. c #B09B9B", +"g. c #C2B2B2", +"h. c #EEDADA", +"i. c #FDEFEF", +"j. c #0B0505", +"k. c #DACACA", +"l. c #7D6565", +"m. c #C6A7A7", +"n. c #FDF9F9", +"o. c #6C4D4D", +"p. c #AB9797", +"q. c #927B7B", +"r. c #FCEDED", +"s. c #0A0404", +"t. c #120B0B", +"u. c #E8D1D1", +"v. c #E2CACA", +"w. c #0F0808", +"x. c #907979", +"y. c #F9DFDF", +"z. c #1D1111", +"A. c #E8D0D0", +"B. c #E1C8C8", +"C. c #1A0C0C", +"D. c #F8E0E0", +"E. c #F7D4D4", +"F. c #090404", +"G. c #FAE1E1", +"H. c #100A0A", +"I. c #100808", +"J. c #7C4F4F", +"K. c #F6D3D3", +"L. c #FFD8D8", +"M. c #F8D5D5", +"N. c #AF9393", +"O. c #FDE5E5", +"P. c #FDE9E9", +"Q. c #FDE2E2", +"R. c #FDF8F8", +"S. c #FDE6E6", +"T. c #FEECEC", +"U. c #FEE5E5", +"V. c #FFE6E6", +"W. c #F8D1D1", +"X. c #0D0404", +"Y. c #291D1D", +"Z. c #583030", +"`. c #FFF8F8", +" + c #683737", +".+ c #5B3333", +"++ c #582D2D", +"@+ c #593030", +"#+ c #5D3232", +"$+ c #5A2D2D", +"%+ c #663737", +"&+ c #5B3030", +"*+ c #897272", +"=+ c #996F6F", +"-+ c #DBC1C1", +";+ c #110808", +">+ c #FDDDDD", +",+ c #473636", +"'+ c #563232", +")+ c #FFF5F5", +"!+ c #5C3636", +"~+ c #FFF9F9", +"{+ c #582E2E", +"]+ c #6F4040", +"^+ c #5B3434", +"/+ c #6D3E3E", +"(+ c #5A3333", +"_+ c #EFD7D7", +":+ c #FCEFEF", +"<+ c #140A0A", +"[+ c #6A5252", +"}+ c #583333", +"|+ c #5C2A2A", +"1+ c #653737", +"2+ c #6B3C3C", +"3+ c #643434", +"4+ c #6A3C3C", +"5+ c #613535", +"6+ c #9C8787", +"7+ c #907A7A", +"8+ c #DDC3C3", +"9+ c #F8E5E5", +"0+ c #FDF3F3", +"a+ c #190D0D", +"b+ c #FAEAEA", +"c+ c #DCC4C4", +"d+ c #876E6E", +"e+ c #461F1F", +"f+ c #472020", +"g+ c #261414", +"h+ c #070000", +"i+ c #220000", +"j+ c #230101", +"k+ c #3A1818", +"l+ c #3F1D1D", +"m+ c #3E1E1E", +"n+ c #553333", +"o+ c #724646", +"p+ c #431F1F", +"q+ c #AB8F8F", +"r+ c #887171", +"s+ c #DAC0C0", +"t+ c #FBD1D1", +"u+ c #1A1010", +"v+ c #B27C7C", +"w+ c #020101", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . + @ @ # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % @ @ & . . ", +" . * = - ; . . . . . . . . . . . . . . . . . . . . . . . . . . > , = ' . ) ! ", +" . * ~ { ] ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ / ( _ ' . ^ : < ", +" . [ } | = = = = = = = = = = = = = = = = = = = = = = = = = = = = 1 2 3 . ^ = 4 5 ", +" . [ . * = = = = = = = = = = = = = = = = = = = = = = = = = = = = * . [ . ^ = = 6 . ", +" . [ . * 7 8 9 0 = a b c d = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = e f = g h i = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = j = k l g = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = m n o p q = = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = = r s . t = = = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = = = u . v = = = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = = w x y = = = = = = = = = = = = = = = = = = = = * . [ . z = = * . ", +" . [ . * = = A B B C D = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = E z = = F G = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * H I J K = = L M } N O = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * P Q Q R = = S Q Q Q T = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = = = = = = = = = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * = = = = = = = = = = = = = = = = = = = = = = = = = = = = * . [ . ' = = * . ", +" . [ . * [ U U U U U V z U U U U W X Y X ^ = = V U O = = O F ' * . [ . ' = = * . ", +" . [ . * Z ` ...` Q +.@.#.` ` Q $.%.&.*.=. ^ = -. = = ;.>.,.* . [ . ' = = * . ", +" . [ . * = = '. = = = Q = = = = %. = = ).!.= -.~. f f {.].,.* . [ . ' = = * . ", +" . [ . * = = '. = = = U U ^.= %. ^ /.(.' = -._.:.<.[.}.@.,.* . [ . ' = = * . ", +" . [ . * = = '. = = = @.|.1.1.2.= %.3.4.5. = = -. 6. 7.8.@.,.* . [ . ' = = 9.. ", +" . [ . * = = '. = = = Q = = = = %. = 0. ' = -. a.b.c.f @.,.* . [ . ' = = d.. ", +" . [ . * = = '. = = = 0 ^ ^ ^ e.%. = = f. m -. = g.h.= @.,.* . [ . ' = i.j. ", +" . [ . * = = k. = = = l.9 9 9 ' m. = = n.o.z p. = = = = l.X * . [ . ' = q.. ", +" . [ . * = = = = = = = = = = = = = = = = = = = = = = = = = = = = * . [ . ' r.s. ", +" . 3 t.u.= = = = = = = = = = = = = = = = = = = = = = = = = = = = v.w.S . ' x.. ", +" . * y.z.A.^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ B.C.D.' . E.F. ", +" . * = G.H.. . . . . . . . . . . . . . . . . . . . . . . . . . I.D.= ' . J.. ", +" . K.P P # $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ L.P P M.. . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" ", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . N.O.P.O.P.Q.R.S.P.O.P.O.P.O.T.U.T.U.T.,.^ ,.^ ,.^ V.^ ,.= D W ,.^ W.X.. ", +" Y.W Z.`. +e..+e.++D @+$.Z.`. +e.#+e.$+D @+$.Z.`.%+e.#+e.$+e.&+$.Z.D *+=+. ", +" . -+D f e.m D `.= D e.D D f D m D `.= D e.D D f D m D `.= D e.D D f r.;+>+. ", +" ,+`.'+)+!+~+{+= ]+f .+`.Z.)+^+~+{+= /+f .+`.Z.)+^+~+{+= /+f (+`.Z.f q.q.T . ", +" . _+m f = D m ~+e.`.m f m f = D m ~+e.`.m f e.f = D m ~+e.`.m f m f :+<+i.T . ", +" . [+~+}+)+|+~+1+g 2+g 3+`.}+)+|+~+1+g 4+= 3+`.}+)+|+~+1+g 4+= 3+~+5+e.6+7+= 8+. ", +" ! 9+= ~+= T ' @ ' ,.' <.' <.' ' ' @ e.f = ~+= ~+= = = D = f = ~+= = 0+a+b+c+! ", +" . d+m e+f+e.g+. . . . . . . . . . . . h+i+i+j+k+l+l+c m+l+l+n+o+e.e+p+q+r+s+! ", +" . t+* @ @ P S [ L S S S S S S S S S S z ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ P z u+v+w+ ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" "}; diff --git a/ports/xterm/xterm-359/icons/make-xpms b/ports/xterm/xterm-359/icons/make-xpms new file mode 100755 index 0000000..31cb560 --- /dev/null +++ b/ports/xterm/xterm-359/icons/make-xpms @@ -0,0 +1,26 @@ +#!/bin/sh +# $XTermId: make-xpms,v 1.6 2012/10/07 22:50:56 tom Exp $ +# some files are generated from other icons... +for name in mini.xterm filled-xterm xterm xterm-color +do + target=${name}.xpms + NAME=`echo "$target" | sed -e 's/[\.-]/_/g'` + LIST= + echo "** creating $target" + rm -f $target + echo "/* @XTermId@ */" | sed -e 's/@/$/g' >$target + echo "/* generated by $0 $* */" >>$target + echo "/* vile:xpmmode */" >>$target + for source in ${name}_*[0-9]x[1-9]*.xpm + do + echo ".. from $source" + BASE=`basename "$source" .xpm` + PART=`echo "$source" | sed -e 's/[\.-]/_/g'` + test -n "$LIST" && LIST="$LIST, " + LIST="$LIST + { \"$BASE\", $PART }" + sed -e 's/char \*/const char * const/' $source >>$target + done + echo "static const XPM_DATA $NAME[] = {$LIST +};" >>$target +done diff --git a/ports/xterm/xterm-359/icons/mini.xterm.svg b/ports/xterm/xterm-359/icons/mini.xterm.svg new file mode 100644 index 0000000..4946c09 --- /dev/null +++ b/ports/xterm/xterm-359/icons/mini.xterm.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + image/svg+xml + + XTerm mini-icon + August 21, 2012 + + + Thomas E. Dickey + + + + https://invisible-island.net/xterm/xterm.icon.html + https://invisible-island.net/xterm/images/mini.xterm_256.png + + + + + + + + + + + + X + + + T + + diff --git a/ports/xterm/xterm-359/icons/mini.xterm.xpms b/ports/xterm/xterm-359/icons/mini.xterm.xpms new file mode 100644 index 0000000..1420d33 --- /dev/null +++ b/ports/xterm/xterm-359/icons/mini.xterm.xpms @@ -0,0 +1,553 @@ +/* $XTermId: mini.xterm.xpms,v 1.4 2012/10/07 20:42:50 tom Exp $ */ +/* generated by ./make-xpms */ +/* vile:xpmmode */ +/* XPM */ +static const char * const mini_xterm_16x16_xpm[] = { +"16 16 84 1", +" c None", +". c #FF3200", +"+ c #FF3C00", +"@ c #FF3F00", +"# c #FF3B00", +"$ c #FF3800", +"% c #FF2000", +"& c #FF1100", +"* c #FF3D00", +"= c #FF3900", +"- c #FF2200", +"; c #FF0A00", +"> c #FF5D00", +", c #FF1300", +"' c #FF0500", +") c #D0412F", +"! c #DD6722", +"~ c #DA3E25", +"{ c #D84727", +"] c #D03C2F", +"^ c #0023F3", +"/ c #000BF2", +"( c #0E21E6", +"_ c #4433B4", +": c #352EC3", +"< c #0010F2", +"[ c #0004F1", +"} c #2C33CB", +"| c #3E2ABA", +"1 c #011EF3", +"2 c #0012F3", +"3 c #022DF5", +"4 c #F2140D", +"5 c #FF5E00", +"6 c #052AF0", +"7 c #0013F3", +"8 c #DD4822", +"9 c #002CF5", +"0 c #004FF7", +"a c #003AF6", +"b c #1529E1", +"c c #D83827", +"d c #0037F7", +"e c #004CF8", +"f c #FF5900", +"g c #182EDE", +"h c #FF2100", +"i c #152CE1", +"j c #DD3B22", +"k c #FF2300", +"l c #FF2A00", +"m c #0C28E9", +"n c #E1571E", +"o c #FF2E00", +"p c #012AF4", +"q c #E1661E", +"r c #FF3600", +"s c #FF3500", +"t c #0028F4", +"u c #0011F2", +"v c #D64E29", +"w c #FF5C00", +"x c #FF2B00", +"y c #FF1D00", +"z c #FF2F00", +"A c #000EF2", +"B c #0003F1", +"C c #8C4072", +"D c #FF4C00", +"E c #FF2D00", +"F c #0360F6", +"G c #0031F6", +"H c #0016F3", +"I c #0827EE", +"J c #3D47BE", +"K c #E5631A", +"L c #FF4300", +"M c #FF3E00", +"N c #FF2400", +"O c #FF0700", +"P c #FF3400", +"Q c #FF5700", +"R c #FF5600", +"S c #FF3700", +" .+@#$% &$$*=- ", +" ;>#, '+ ", +" )!~ {] ", +" ^/(_:<[}|1/2 ", +" 2345=678 97 ", +" 0a =>b7c de ", +" fg7 ", +" hg7 ", +" $i7j ", +" klm7no ", +" # p7qr ", +" sk tuvwx ", +" yz ABCfDE ", +" = FGHHIJKr ", +" $LM$N O$PQRS- ", +" "}; +/* XPM */ +static const char * const mini_xterm_32x32_xpm[] = { +"32 32 143 2", +" c None", +". c #FF0000", +"+ c #FF1900", +"@ c #FF1F00", +"# c #FF0B00", +"$ c #FF1D00", +"% c #FF4A00", +"& c #FF5100", +"* c #FF5B00", +"= c #FF5E00", +"- c #FF5300", +"; c #FF3600", +"> c #FF0C00", +", c #FF5A00", +"' c #FF5C00", +") c #FF0A00", +"! c #FF0D00", +"~ c #FF2E00", +"{ c #FF5800", +"] c #FF2700", +"^ c #FF0500", +"/ c #0073FB", +"( c #0041F7", +"_ c #0074FB", +": c #0059F9", +"< c #0000F1", +"[ c #0505EC", +"} c #3A44BE", +"| c #615A9A", +"1 c #784285", +"2 c #3466C8", +"3 c #004DF8", +"4 c #0053F8", +"5 c #006CF9", +"6 c #3C44BD", +"7 c #2729CF", +"8 c #002CF5", +"9 c #2D2EC9", +"0 c #8D6E71", +"a c #E96416", +"b c #FF4400", +"c c #FF1800", +"d c #0019F3", +"e c #FF1400", +"f c #D66729", +"g c #73498A", +"h c #091FEB", +"i c #002CF4", +"j c #006FFC", +"k c #0002F1", +"l c #0059F8", +"m c #AD3252", +"n c #FF1700", +"o c #FF2B00", +"p c #B84A47", +"q c #0026F4", +"r c #FF0700", +"s c #FF1600", +"t c #003FF6", +"u c #0003F1", +"v c #006FFA", +"w c #0058F9", +"x c #0055FA", +"y c #FF3D00", +"z c #C3363C", +"A c #FF0400", +"B c #FF3F00", +"C c #FF1000", +"D c #003DF6", +"E c #005AF8", +"F c #002AF4", +"G c #FF0100", +"H c #FF5600", +"I c #C3643C", +"J c #A73958", +"K c #FF3100", +"L c #0020F3", +"M c #002DF5", +"N c #0089FD", +"O c #0022F4", +"P c #0085FD", +"Q c #C36E3C", +"R c #BC3943", +"S c #FF1300", +"T c #007AFC", +"U c #FF2200", +"V c #C3693C", +"W c #FF4600", +"X c #C3563C", +"Y c #FF1100", +"Z c #BD6C42", +"` c #C12F3E", +" . c #B13B4E", +".. c #C32F3C", +"+. c #C0283F", +"@. c #C34D3C", +"#. c #FF2400", +"$. c #BC3E43", +"%. c #C36D3C", +"&. c #FF3400", +"*. c #FF0800", +"=. c #C36B3C", +"-. c #FF4E00", +";. c #C3523C", +">. c #FF3E00", +",. c #FF1C00", +"'. c #FF0200", +"). c #BF3240", +"!. c #FF1A00", +"~. c #B4624B", +"{. c #FF5900", +"]. c #FF1200", +"^. c #B82E47", +"/. c #FF4800", +"(. c #FF3A00", +"_. c #001EF4", +":. c #001DF4", +"<. c #7D4882", +"[. c #FF4F00", +"}. c #0076FB", +"|. c #000CF2", +"1. c #0276F9", +"2. c #FF3800", +"3. c #FF5D00", +"4. c #004CF7", +"5. c #004CF8", +"6. c #FB0104", +"7. c #FF5500", +"8. c #B53E4A", +"9. c #0055F8", +"0. c #0038F6", +"a. c #0028F4", +"b. c #0039F6", +"c. c #0254F6", +"d. c #C66E39", +"e. c #FF3500", +"f. c #248ADB", +"g. c #785587", +"h. c #DE3121", +"i. c #FF1E00", +"j. c #FF2800", +"k. c #FF5700", +"l. c #FF1B00", +" ", +" ", +" . + @ @ @ @ @ @ @ @ @ # $ . @ @ @ @ @ @ @ @ . ", +" . % & & * = = = - & & ; @ > & & & , ' & & & ) ", +" . . . . ! = = = ~ . . . . . . . { ] ^ . . . ", +" / ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( _ ", +" : < < < [ } | 1 2 3 < < < < 4 5 6 7 < < < < : ", +" 8 < < 9 0 a = b c d < < d e f g h < < i ", +" j k < l m n = = = o p q < < q r { ] s t < u v ", +" w < x . y = = ' z q < < q A % B C D < E ", +" 8 F G H = = I q < < q J K & ! L M ", +" N O P r = = Q q < < q R ' S T O N ", +" . U = Q q < < q V ] s ", +" . W Q q < < q X Y ", +" G Z q < < q ` ", +" .q < < q .. ", +" +.q < < q @.#. ", +" $.q < < q %.+ &. ", +" *.=.q < < q Q - Y ", +" A -.;.q < < q Q = >.,. ", +" '.; -.).q < < q Q = = U ~ ", +" !., Y q < < q ~.= = {.]. ", +" *., U q < < q ^., = = /.s ", +" A -.(.]. _.< < :.<.C = = = ~ ] ", +" '.; [.! }.|.< < |.1.. 2.= = 3.s ", +" !., Y 4.< < < < 5. 6.7.= = & ]. ", +" *., U 8.9.0.a.< < < < < < a.b.c.d.= = (.@ ", +" A -.e.# f. g.h.= = = i.j. ", +" . @ @ ,.y , Y ,.@ @ G '.@ ,.].* = = k.l.@ @ . ", +" . & & & & & & & & & ) ,.& & & & & & & & & & ) ", +" . . . . . . . . . . . . . . . . . . . . . . . ", +" "}; +/* XPM */ +static const char * const mini_xterm_48x48_xpm[] = { +"48 48 213 2", +" c None", +". c #FF0000", +"+ c #FF5300", +"@ c #FF5E00", +"# c #FF4800", +"$ c #FF4200", +"% c #FF4000", +"& c #FF4B00", +"* c #FF5200", +"= c #FF5400", +"- c #FF3500", +"; c #FF5100", +"> c #FF5C00", +", c #FF3000", +"' c #FF4500", +") c #FF2000", +"! c #FF0300", +"~ c #FF1600", +"{ c #FF5D00", +"] c #FF3800", +"^ c #FF0200", +"/ c #FF0900", +"( c #FF2B00", +"_ c #FF3300", +": c #FF1A00", +"< c #FF1300", +"[ c #FF1200", +"} c #FF5700", +"| c #4577BA", +"1 c #874E78", +"2 c #887577", +"3 c #887E77", +"4 c #887977", +"5 c #875078", +"6 c #566CA9", +"7 c #5E70A1", +"8 c #884E77", +"9 c #887677", +"0 c #7C5B83", +"a c #795686", +"b c #008DFE", +"c c #0012F3", +"d c #000BF2", +"e c #008FFE", +"f c #006CFA", +"g c #0000F1", +"h c #0001F1", +"i c #0020F4", +"j c #0040F6", +"k c #0959F0", +"l c #1158E8", +"m c #1159E8", +"n c #0058F9", +"o c #001DF4", +"p c #0023F4", +"q c #005BFA", +"r c #0060FA", +"s c #0E58EB", +"t c #0651F3", +"u c #0033F5", +"v c #000EF2", +"w c #006EFA", +"x c #0092FF", +"y c #001FF4", +"z c #000FF2", +"A c #0C51EC", +"B c #326AC9", +"C c #7A6583", +"D c #CA6234", +"E c #FC5F03", +"F c #FF5800", +"G c #FF0800", +"H c #F4060B", +"I c #007CFB", +"J c #0013F3", +"K c #007EFB", +"L c #FF1800", +"M c #F3590C", +"N c #AB6152", +"O c #4F4EAD", +"P c #175CE4", +"Q c #0036F5", +"R c #0022F4", +"S c #0095FD", +"T c #0084FD", +"U c #0004F1", +"V c #0051F8", +"W c #345AC7", +"X c #E61519", +"Y c #FF5900", +"Z c #FF4600", +"` c #FF0100", +" . c #446EB9", +".. c #0034F6", +"+. c #0032F5", +"@. c #FF2200", +"#. c #006FFA", +"$. c #002DF5", +"%. c #0086FD", +"&. c #0046F7", +"*. c #0015F3", +"=. c #0076FC", +"-. c #FF0400", +";. c #FF2300", +">. c #FF2900", +",. c #9E3E61", +"'. c #0039F6", +"). c #FF2A00", +"!. c #FF4300", +"~. c #0071FB", +"{. c #005EF9", +"]. c #004DF7", +"^. c #008CFE", +"/. c #0008F2", +"(. c #001DF3", +"_. c #007DFB", +":. c #FF4100", +"<. c #FF5B00", +"[. c #A3425C", +"}. c #994C66", +"|. c #FF1100", +"1. c #0072FB", +"2. c #000AF2", +"3. c #006EFC", +"4. c #0017F3", +"5. c #007FFB", +"6. c #FF0600", +"7. c #FF5600", +"8. c #A56A5A", +"9. c #A53B5A", +"0. c #FF4F00", +"a. c #0076FB", +"b. c #0076FA", +"c. c #0093FF", +"d. c #007DFC", +"e. c #FF1C00", +"f. c #A5765A", +"g. c #A55D5A", +"h. c #006FFB", +"i. c #002CF5", +"j. c #008AFD", +"k. c #006BF9", +"l. c #FF3A00", +"m. c #FF5000", +"n. c #007BFB", +"o. c #008BFD", +"p. c #A5755A", +"q. c #9A5565", +"r. c #A43A5B", +"s. c #FF4D00", +"t. c #80507F", +"u. c #FF0F00", +"v. c #7A5485", +"w. c #A5555A", +"x. c #FF0A00", +"y. c #A53D5A", +"z. c #A4515B", +"A. c #A5685A", +"B. c #A5735A", +"C. c #FF0700", +"D. c #FF2E00", +"E. c #FF1500", +"F. c #A3705C", +"G. c #FF0500", +"H. c #9A4965", +"I. c #FF0E00", +"J. c #FF3B00", +"K. c #FF2D00", +"L. c #A13C5E", +"M. c #FF4C00", +"N. c #62649D", +"O. c #FF0B00", +"P. c #FF4700", +"Q. c #FF1D00", +"R. c #A56D5A", +"S. c #FF2C00", +"T. c #A4465B", +"U. c #FF1400", +"V. c #A03E61", +"W. c #FF3100", +"X. c #FF1B00", +"Y. c #FF1000", +"Z. c #0029F5", +"`. c #0027F4", +" + c #4571BA", +".+ c #FF3900", +"++ c #FF3200", +"@+ c #008EFD", +"#+ c #0019F3", +"$+ c #0090FD", +"%+ c #FF0D00", +"&+ c #FF1E00", +"*+ c #FF4E00", +"=+ c #0088FC", +"-+ c #0087FC", +";+ c #FF1900", +">+ c #0036F6", +",+ c #FF2100", +"'+ c #0073FB", +")+ c #0062FA", +"!+ c #001AF3", +"~+ c #2463D8", +"{+ c #3E58BE", +"]+ c #2A7FD3", +"^+ c #807B7F", +"/+ c #008EFB", +"(+ c #006AFA", +"_+ c #004CF8", +":+ c #717B8D", +"<+ c #EE0B11", +"[+ c #F73E08", +"}+ c #FF1F00", +"|+ c #FF5500", +" ", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ . . # @ @ @ @ @ @ @ @ @ @ @ @ $ . ", +" . % & & & * @ @ @ @ @ = & & & & & . . - & & & & & ; @ > & & & & , . ", +" . . . . . . * @ @ @ @ ; . . . . . . . . . . . . . ' @ ) . . . . . . ", +" ! ~ { @ @ @ @ ] ^ / ( @ $ . ", +" ^ _ @ @ @ @ @ : ! < [ > } ^ . ", +" | 1 2 3 3 3 3 4 5 6 7 8 9 3 0 a ", +" b c d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d c e ", +" f g g g g g g h i j k l m n o g g g g g g p q r s t u v g g g g g g g w ", +" x y g g g g z A B C D E F G H I c g g g g J K L / M N O P Q h g g g g R S ", +" T g g g U V W X Y @ @ @ @ Z ` ...g g g g +. ` ' @ @.. #.$.g g g g %. ", +" &.g g *.=. -.;.@ @ @ @ @ >.,.'.g g g g '. / ).@ !.. ~.{.U g g ]. ", +" ^./.g (._. ` :.@ @ @ @ <.[.'.g g g g '.}.|.<.} ^ . 1.2.g d e ", +" 3.g 4.5. 6.7.@ @ @ @ 8.'.g g g g '.9.0.@ [ . a./.g b. ", +" c.R /.d. -.e.@ @ @ @ f.'.g g g g '.g.@ - . h.h i. ", +" j.k.%. ^ l.@ @ @ f.'.g g g g '.f.m.` n.f o. ", +" ! * @ @ f.'.g g g g '.p.G . ", +" ! ~ { @ f.'.g g g g '.q.. ", +" ^ _ @ f.'.g g g g '.r. ", +" ^ s.f.'.g g g g '.t. ", +" ^ u.p.'.g g g g '.v. ", +" ^ w.'.g g g g '.r. ", +" x.y.'.g g g g '.z.^ ", +" ` A.'.g g g g '.B.x.. ", +" C.D.f.'.g g g g '.f.# ` ", +" < E.{ F.'.g g g g '.f.@ ( ^ ", +" : G.; @ H.'.g g g g '.f.@ <.I.^ ", +" -.J.@ K.L.'.g g g g '.f.@ @ s.` ", +" I.) @ M.. N.'.g g g g '.f.@ @ @ _ ^ ", +" L O.F <.6.. '.g g g g '.f.@ @ @ { E.! ", +" ^ P.@ Q.. '.g g g g '.R.@ @ @ @ * ! ", +" G S.@ % . '.g g g g '.T.{ @ @ @ @ l.^ ", +" < U.> 7.^ ..g g g g u V.W.@ @ @ @ @ e.! ", +" X.-.m.@ Y.. Z.g g g g `. +` M.@ @ @ @ 7.6. ", +" -..+@ ++. @+#+g g g g #+$+^ %+<.@ @ @ @ :.` ", +" I.&+@ *+. =+h g g g g h -+ ! >.@ @ @ @ @ ;.^ ", +" ;+x.} > C.. >+g g g g g g >+ ` Z @ @ @ @ Y / . ", +" ` ' @ ,+. %.1.'+)+!+g g g g g g g g #+)+~+{+]+^+@ @ @ P.` ", +" / ).@ !.. /+(+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+(+:+@ @ @ @ ).^ ", +" I.[ > F . . <+[+@ @ @ @ <.I.` ", +" . . . . . . 0.@ }+. . . . . . . . . . . . . |+@ @ @ @ s.. . . . . . ", +" O.@ @ @ @ @ @ @ @ @ @ @ @ @ ^ ! $ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ $ . ", +" . & & & & & & & & & & & & & . . , & & & & & & & & & & & & & & & , . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" ", +" "}; +static const XPM_DATA mini_xterm_xpms[] = { + { "mini.xterm_16x16", mini_xterm_16x16_xpm }, + { "mini.xterm_32x32", mini_xterm_32x32_xpm }, + { "mini.xterm_48x48", mini_xterm_48x48_xpm } +}; diff --git a/ports/xterm/xterm-359/icons/mini.xterm_16x16.png b/ports/xterm/xterm-359/icons/mini.xterm_16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..9c3f098679d482b7f20081f8fd59432cc6488d88 GIT binary patch literal 732 zcmV<20wev2P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iyt= z6c!GiK*f*%00LY|L_t(I%Z-yuNR)9D#ee@%adgnEDJx5IY; zh=Rx#LD3>;)4DLV5Eqdyk|2nP3@RcDp(3Q{p=NKf6w&Wv{48hYv~VmR6`kF^2Y&Y+ zF4qVSu$Xhi<0c9S0wJKAPV=60O{JMkHUJP4@xOxU!~h^zAlRvRE~*SiE0DZg7OaW* zC4%jW;ht7vE0I%z9Yo|Z&|%=p*8SI-T0iIA@AUg9iDRF*RXnnyA73MzpN|Gg_2jnk!+`Bsawqw%lems_# zW`CkazTbeO-?uT%mMbSvZ%t3A(_X?VW;iChzYnjiw;O%7d{ltq@CWMf+G5wx!QX&V zr-9{z4Ux=wDyCUwXhznDAYNOqi!vXK+jyCCfh|MLV>$yFpqSB0aU9ofdS>Nz3a_n0 zM`{YjXI2#0*#NGQ#*}t2!@qoo^R&=1TISo&W{(G$5G1@D1DGH;1}A^)EMfu9Wa z(9JFLj@t?YVG-!|JYpfSI9&NFK;R;k)BM1VLpinb(-n@#5;v_)ZG`AyJ{iiPYEovw zRCze2Vl1U_II4W`D*1zVNVY|?Eq7+$lT{^mKYrPlA}z&H4#k2b03$d|5mk7AVc-YQ z%XQO1DS%=*OFoqZf%K7yd;oezKGF!X0RMz&FAThjY*+})`@;c@fu^4v2l}0YroCSP O0000 c #FF5D00", +", c #FF1300", +"' c #FF0500", +") c #D0412F", +"! c #DD6722", +"~ c #DA3E25", +"{ c #D84727", +"] c #D03C2F", +"^ c #0023F3", +"/ c #000BF2", +"( c #0E21E6", +"_ c #4433B4", +": c #352EC3", +"< c #0010F2", +"[ c #0004F1", +"} c #2C33CB", +"| c #3E2ABA", +"1 c #011EF3", +"2 c #0012F3", +"3 c #022DF5", +"4 c #F2140D", +"5 c #FF5E00", +"6 c #052AF0", +"7 c #0013F3", +"8 c #DD4822", +"9 c #002CF5", +"0 c #004FF7", +"a c #003AF6", +"b c #1529E1", +"c c #D83827", +"d c #0037F7", +"e c #004CF8", +"f c #FF5900", +"g c #182EDE", +"h c #FF2100", +"i c #152CE1", +"j c #DD3B22", +"k c #FF2300", +"l c #FF2A00", +"m c #0C28E9", +"n c #E1571E", +"o c #FF2E00", +"p c #012AF4", +"q c #E1661E", +"r c #FF3600", +"s c #FF3500", +"t c #0028F4", +"u c #0011F2", +"v c #D64E29", +"w c #FF5C00", +"x c #FF2B00", +"y c #FF1D00", +"z c #FF2F00", +"A c #000EF2", +"B c #0003F1", +"C c #8C4072", +"D c #FF4C00", +"E c #FF2D00", +"F c #0360F6", +"G c #0031F6", +"H c #0016F3", +"I c #0827EE", +"J c #3D47BE", +"K c #E5631A", +"L c #FF4300", +"M c #FF3E00", +"N c #FF2400", +"O c #FF0700", +"P c #FF3400", +"Q c #FF5700", +"R c #FF5600", +"S c #FF3700", +" .+@#$% &$$*=- ", +" ;>#, '+ ", +" )!~ {] ", +" ^/(_:<[}|1/2 ", +" 2345=678 97 ", +" 0a =>b7c de ", +" fg7 ", +" hg7 ", +" $i7j ", +" klm7no ", +" # p7qr ", +" sk tuvwx ", +" yz ABCfDE ", +" = FGHHIJKr ", +" $LM$N O$PQRS- ", +" "}; diff --git a/ports/xterm/xterm-359/icons/mini.xterm_256x256.png b/ports/xterm/xterm-359/icons/mini.xterm_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..480a1b334b540d9a39f50ceb275a2c744b45fb77 GIT binary patch literal 11587 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 A;{X5v literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/icons/mini.xterm_32x32.png b/ports/xterm/xterm-359/icons/mini.xterm_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..8fbdb1a137865cbbcbfe8060b195f7a9c6a7d794 GIT binary patch literal 1434 zcmV;L1!ek)P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iyt= z6croTuyVKn00kOJL_t(o!_Aj%P?S{^$A8bm!m@xduEbm5EBKBg36`$nM1!L^I{1p! zFgi7rQ@)g1ADn4$vOZLfQ`DD6zc@5wVmNAJHkwRA6HbVQhA3bZZ^A0Du?V=k&*=lZ z%Pz|*OfYq3cILVF{?EDpz2}^J&w>9~6aax(Ab13NoeH!Mo|JwYvBS{U6sY$k&_WF1 z1Yvlr>OH{74W)skAqbd&5+*&y#-E@#_trV5?y>+u?<5cc1b8TP1Df-@324RP*LWD$ zNMV6{YyecJ4VRdK2mPNe0>5yM2*3_ZV;l`+v)WCg2B-v}5QqQ@{GN}MUQSU6OaoHL z0j{EPhiYv6?!+0rV!%uG*b1qzZy1w^ds|CauN4$4sw3giYlgC2MA2J3dh7G zFje%_Ne&`2a7ZK{^QmN${-7KzLV!is_3$gtEmbc9t&aIw{D@Oj{ zj2p86Lhp6^9A!k;y+CxFB!dWAfL5+6ZR}&0a*9oceJl;E!~vMK@V$#dMWCo((W zHW`73*{0Me-~e(dWeUCAbZgA>J-qya9Xm+Eh@K~?z(ObK?!`BhV%8e+nXI;P-I2&a z+hSh=25mDBq>&d5-}Ab1+9OSx5%zPMW}wG?PYjYLF{d(zNnEB6J=qFaya0QZBfMa^ zNVhZ+sBZDif*y4{d7)VZb9spS`mFSkNhxMb$VPi_bN#bbueM_>>!bDW6{rG+~2?%VpN9sC!7A6DTB+5b# zjTr%f*#z^RKB+Hm$kJvpP{(dbCw0^b2!x>H1erw9;s+E8B%xBrd3lw<(LDi`FG(RB z2(j1eEPip5fgp^OadOlM2y7*qG!lrTgx-R*m);(Xu~@^)-GfCyBWuLO#(zz~<#(2o zNEr@vynl4j%RXtSE4PPZr@6m~0MdZl9FvU$)z63tc=^2^=%h?B^C9hy@$`BCd*G+o zCB>ZMO1~Nq2}Bc2<)g1%by$8^2;n;SX(zM)*_MU0YXi6rjSuF%+e#-oZd2r*pAU49 zENSc?F##{XU#1t8OaETlINXRMDF>XeynWLbac&d}aWQS4DjaN@Fu@&vyRYUlY~>O|-C$ zI3*9wrzjPe=lH~IWHGilkyiR;`h|Hqw*Q?=x{h2 zkCh&}eL$(l-*k3Iu3-Zy#Cuun0hSNi#f;t6(F`fEl#{|U?(tx3ns0aHBJeAxC>u^w o`G~bT8W9>P9Om6> c #FF0C00", +", c #FF5A00", +"' c #FF5C00", +") c #FF0A00", +"! c #FF0D00", +"~ c #FF2E00", +"{ c #FF5800", +"] c #FF2700", +"^ c #FF0500", +"/ c #0073FB", +"( c #0041F7", +"_ c #0074FB", +": c #0059F9", +"< c #0000F1", +"[ c #0505EC", +"} c #3A44BE", +"| c #615A9A", +"1 c #784285", +"2 c #3466C8", +"3 c #004DF8", +"4 c #0053F8", +"5 c #006CF9", +"6 c #3C44BD", +"7 c #2729CF", +"8 c #002CF5", +"9 c #2D2EC9", +"0 c #8D6E71", +"a c #E96416", +"b c #FF4400", +"c c #FF1800", +"d c #0019F3", +"e c #FF1400", +"f c #D66729", +"g c #73498A", +"h c #091FEB", +"i c #002CF4", +"j c #006FFC", +"k c #0002F1", +"l c #0059F8", +"m c #AD3252", +"n c #FF1700", +"o c #FF2B00", +"p c #B84A47", +"q c #0026F4", +"r c #FF0700", +"s c #FF1600", +"t c #003FF6", +"u c #0003F1", +"v c #006FFA", +"w c #0058F9", +"x c #0055FA", +"y c #FF3D00", +"z c #C3363C", +"A c #FF0400", +"B c #FF3F00", +"C c #FF1000", +"D c #003DF6", +"E c #005AF8", +"F c #002AF4", +"G c #FF0100", +"H c #FF5600", +"I c #C3643C", +"J c #A73958", +"K c #FF3100", +"L c #0020F3", +"M c #002DF5", +"N c #0089FD", +"O c #0022F4", +"P c #0085FD", +"Q c #C36E3C", +"R c #BC3943", +"S c #FF1300", +"T c #007AFC", +"U c #FF2200", +"V c #C3693C", +"W c #FF4600", +"X c #C3563C", +"Y c #FF1100", +"Z c #BD6C42", +"` c #C12F3E", +" . c #B13B4E", +".. c #C32F3C", +"+. c #C0283F", +"@. c #C34D3C", +"#. c #FF2400", +"$. c #BC3E43", +"%. c #C36D3C", +"&. c #FF3400", +"*. c #FF0800", +"=. c #C36B3C", +"-. c #FF4E00", +";. c #C3523C", +">. c #FF3E00", +",. c #FF1C00", +"'. c #FF0200", +"). c #BF3240", +"!. c #FF1A00", +"~. c #B4624B", +"{. c #FF5900", +"]. c #FF1200", +"^. c #B82E47", +"/. c #FF4800", +"(. c #FF3A00", +"_. c #001EF4", +":. c #001DF4", +"<. c #7D4882", +"[. c #FF4F00", +"}. c #0076FB", +"|. c #000CF2", +"1. c #0276F9", +"2. c #FF3800", +"3. c #FF5D00", +"4. c #004CF7", +"5. c #004CF8", +"6. c #FB0104", +"7. c #FF5500", +"8. c #B53E4A", +"9. c #0055F8", +"0. c #0038F6", +"a. c #0028F4", +"b. c #0039F6", +"c. c #0254F6", +"d. c #C66E39", +"e. c #FF3500", +"f. c #248ADB", +"g. c #785587", +"h. c #DE3121", +"i. c #FF1E00", +"j. c #FF2800", +"k. c #FF5700", +"l. c #FF1B00", +" ", +" ", +" . + @ @ @ @ @ @ @ @ @ # $ . @ @ @ @ @ @ @ @ . ", +" . % & & * = = = - & & ; @ > & & & , ' & & & ) ", +" . . . . ! = = = ~ . . . . . . . { ] ^ . . . ", +" / ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( _ ", +" : < < < [ } | 1 2 3 < < < < 4 5 6 7 < < < < : ", +" 8 < < 9 0 a = b c d < < d e f g h < < i ", +" j k < l m n = = = o p q < < q r { ] s t < u v ", +" w < x . y = = ' z q < < q A % B C D < E ", +" 8 F G H = = I q < < q J K & ! L M ", +" N O P r = = Q q < < q R ' S T O N ", +" . U = Q q < < q V ] s ", +" . W Q q < < q X Y ", +" G Z q < < q ` ", +" .q < < q .. ", +" +.q < < q @.#. ", +" $.q < < q %.+ &. ", +" *.=.q < < q Q - Y ", +" A -.;.q < < q Q = >.,. ", +" '.; -.).q < < q Q = = U ~ ", +" !., Y q < < q ~.= = {.]. ", +" *., U q < < q ^., = = /.s ", +" A -.(.]. _.< < :.<.C = = = ~ ] ", +" '.; [.! }.|.< < |.1.. 2.= = 3.s ", +" !., Y 4.< < < < 5. 6.7.= = & ]. ", +" *., U 8.9.0.a.< < < < < < a.b.c.d.= = (.@ ", +" A -.e.# f. g.h.= = = i.j. ", +" . @ @ ,.y , Y ,.@ @ G '.@ ,.].* = = k.l.@ @ . ", +" . & & & & & & & & & ) ,.& & & & & & & & & & ) ", +" . . . . . . . . . . . . . . . . . . . . . . . ", +" "}; diff --git a/ports/xterm/xterm-359/icons/mini.xterm_48x48.png b/ports/xterm/xterm-359/icons/mini.xterm_48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..ed40e7cf50e861417ae84ee4e153c8950247d865 GIT binary patch literal 2194 zcmV;D2yOR?P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iyt< z5Dx>yMBj`600@(f~H3rP4qtQC?Dl(vDN1 z6>X@&Qd+fED)q%+Tj~hdjxx0lIzB3DDUX5!(*Yd_$|Hbfs1`JBctxN|NO>f=+$1-- z_uPBV`bQ3s+?@LeNdag4&Fmj%&u@Rb-`(H-_Vi+>*nvazAEUdECWjU4PF0Vj6@0fOws0lX}rI&L#+NpHxB7|bkxf7ht#$97kU z+oeK67*7!7F`*yHyL-o`d*|-&@7gQ>`TER~)3wtn23*kbpX3XAP}Nq=`u49hn?pCv zmJ@|49u__u_5 z3F$l)n!__%En|Fr$FJ1i=S8W+K7n=~pjx~3PG%|aY*Hfy>dbf6m)+_1d|1z6`szqF zP>ifNy75Wu*1DV*XcTx^%V^VNo}-D=6a$q4Jp9tOg;yOV%y6uv($&^W!Qa+~kWYDR z03NxR>R=`S!xi|NtCkG)PJU)TD8NsMxts(~6BslA%Pg5+wpWvCo6OS*mvD*h%lu(zB&XV=F!FzkpXlWDa^7r@1F|Y7;<-*YFkf8p?gxRCfeH|C9)rg?g5DQ!F9_4khy$?E=F)i z6p%$y#YH}_@|FT1v&g2I-!KM9jl!q`Q*a_!Bw^aEa{>m{q+;h2U}#D(D(_IB1cAbO z86ED80U&euDQ%2mQujsZI+1WO=Af}CB$I){>YEBcx*5+!o@IiWYB|C&XM5mdF$b!^ zRGdgEB+R}k03mlQ&&YB zuwl)V1&896QGy^77b<_ap#Wqa^SH?UOfvJC)zqM&1JMKTE{p8OWSqc#@_HP+>j5B> z$)cGxl+bFeG)S+;8QpdESGTCpaPI!qn*E!gTg4_GHtv|KJc_4%>UHn1kPIkIB!6g zya$7C(n&M#(wAwt8Tcz~mfhu*K{^39n+cIg8Qs;Boiqb)30T`BqnE~N{rhauaxG&5 z32fDJ#cKT^tKQ){ob;wVef7=pF zub|nugh0h3o$LsVpvlOHz8Ojjvz(_#iqq~KUsG=L?O9@O=ua$b_~A943qTb*lIgMP z1h%M)Pa{1n6?l#_6a(cgYT9(p=q1$m(1cPul*Zh&OfDLkbre!ZAzV`Mrl*F-4KNzP zaW+VU;%MgiN}V{(G-kail}*?v;(j1Rh>h5QDq!gc83m3y_edAO#Q4Rg7nauGtm1KL*uTB`(g{v?u+SGw<1ZZaulIOyW@|Ak=6#x$a+bw5((9EXo z13rkjw#l(-W9B@OBjztap9+u%*cNf;MQ;^KqPtEUiKa&Ae}hhpIBlMa##9{S#mS!z zREG71)r)OC?00wlw*SFQV%)qs4q7dCx<3?FFYbMb2U7cumyVikV3fxH=@y~?0vehk UIiy4(>Hq)$07*qoM6N<$f-_ c #FF5C00", +", c #FF3000", +"' c #FF4500", +") c #FF2000", +"! c #FF0300", +"~ c #FF1600", +"{ c #FF5D00", +"] c #FF3800", +"^ c #FF0200", +"/ c #FF0900", +"( c #FF2B00", +"_ c #FF3300", +": c #FF1A00", +"< c #FF1300", +"[ c #FF1200", +"} c #FF5700", +"| c #4577BA", +"1 c #874E78", +"2 c #887577", +"3 c #887E77", +"4 c #887977", +"5 c #875078", +"6 c #566CA9", +"7 c #5E70A1", +"8 c #884E77", +"9 c #887677", +"0 c #7C5B83", +"a c #795686", +"b c #008DFE", +"c c #0012F3", +"d c #000BF2", +"e c #008FFE", +"f c #006CFA", +"g c #0000F1", +"h c #0001F1", +"i c #0020F4", +"j c #0040F6", +"k c #0959F0", +"l c #1158E8", +"m c #1159E8", +"n c #0058F9", +"o c #001DF4", +"p c #0023F4", +"q c #005BFA", +"r c #0060FA", +"s c #0E58EB", +"t c #0651F3", +"u c #0033F5", +"v c #000EF2", +"w c #006EFA", +"x c #0092FF", +"y c #001FF4", +"z c #000FF2", +"A c #0C51EC", +"B c #326AC9", +"C c #7A6583", +"D c #CA6234", +"E c #FC5F03", +"F c #FF5800", +"G c #FF0800", +"H c #F4060B", +"I c #007CFB", +"J c #0013F3", +"K c #007EFB", +"L c #FF1800", +"M c #F3590C", +"N c #AB6152", +"O c #4F4EAD", +"P c #175CE4", +"Q c #0036F5", +"R c #0022F4", +"S c #0095FD", +"T c #0084FD", +"U c #0004F1", +"V c #0051F8", +"W c #345AC7", +"X c #E61519", +"Y c #FF5900", +"Z c #FF4600", +"` c #FF0100", +" . c #446EB9", +".. c #0034F6", +"+. c #0032F5", +"@. c #FF2200", +"#. c #006FFA", +"$. c #002DF5", +"%. c #0086FD", +"&. c #0046F7", +"*. c #0015F3", +"=. c #0076FC", +"-. c #FF0400", +";. c #FF2300", +">. c #FF2900", +",. c #9E3E61", +"'. c #0039F6", +"). c #FF2A00", +"!. c #FF4300", +"~. c #0071FB", +"{. c #005EF9", +"]. c #004DF7", +"^. c #008CFE", +"/. c #0008F2", +"(. c #001DF3", +"_. c #007DFB", +":. c #FF4100", +"<. c #FF5B00", +"[. c #A3425C", +"}. c #994C66", +"|. c #FF1100", +"1. c #0072FB", +"2. c #000AF2", +"3. c #006EFC", +"4. c #0017F3", +"5. c #007FFB", +"6. c #FF0600", +"7. c #FF5600", +"8. c #A56A5A", +"9. c #A53B5A", +"0. c #FF4F00", +"a. c #0076FB", +"b. c #0076FA", +"c. c #0093FF", +"d. c #007DFC", +"e. c #FF1C00", +"f. c #A5765A", +"g. c #A55D5A", +"h. c #006FFB", +"i. c #002CF5", +"j. c #008AFD", +"k. c #006BF9", +"l. c #FF3A00", +"m. c #FF5000", +"n. c #007BFB", +"o. c #008BFD", +"p. c #A5755A", +"q. c #9A5565", +"r. c #A43A5B", +"s. c #FF4D00", +"t. c #80507F", +"u. c #FF0F00", +"v. c #7A5485", +"w. c #A5555A", +"x. c #FF0A00", +"y. c #A53D5A", +"z. c #A4515B", +"A. c #A5685A", +"B. c #A5735A", +"C. c #FF0700", +"D. c #FF2E00", +"E. c #FF1500", +"F. c #A3705C", +"G. c #FF0500", +"H. c #9A4965", +"I. c #FF0E00", +"J. c #FF3B00", +"K. c #FF2D00", +"L. c #A13C5E", +"M. c #FF4C00", +"N. c #62649D", +"O. c #FF0B00", +"P. c #FF4700", +"Q. c #FF1D00", +"R. c #A56D5A", +"S. c #FF2C00", +"T. c #A4465B", +"U. c #FF1400", +"V. c #A03E61", +"W. c #FF3100", +"X. c #FF1B00", +"Y. c #FF1000", +"Z. c #0029F5", +"`. c #0027F4", +" + c #4571BA", +".+ c #FF3900", +"++ c #FF3200", +"@+ c #008EFD", +"#+ c #0019F3", +"$+ c #0090FD", +"%+ c #FF0D00", +"&+ c #FF1E00", +"*+ c #FF4E00", +"=+ c #0088FC", +"-+ c #0087FC", +";+ c #FF1900", +">+ c #0036F6", +",+ c #FF2100", +"'+ c #0073FB", +")+ c #0062FA", +"!+ c #001AF3", +"~+ c #2463D8", +"{+ c #3E58BE", +"]+ c #2A7FD3", +"^+ c #807B7F", +"/+ c #008EFB", +"(+ c #006AFA", +"_+ c #004CF8", +":+ c #717B8D", +"<+ c #EE0B11", +"[+ c #F73E08", +"}+ c #FF1F00", +"|+ c #FF5500", +" ", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ . . # @ @ @ @ @ @ @ @ @ @ @ @ $ . ", +" . % & & & * @ @ @ @ @ = & & & & & . . - & & & & & ; @ > & & & & , . ", +" . . . . . . * @ @ @ @ ; . . . . . . . . . . . . . ' @ ) . . . . . . ", +" ! ~ { @ @ @ @ ] ^ / ( @ $ . ", +" ^ _ @ @ @ @ @ : ! < [ > } ^ . ", +" | 1 2 3 3 3 3 4 5 6 7 8 9 3 0 a ", +" b c d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d c e ", +" f g g g g g g h i j k l m n o g g g g g g p q r s t u v g g g g g g g w ", +" x y g g g g z A B C D E F G H I c g g g g J K L / M N O P Q h g g g g R S ", +" T g g g U V W X Y @ @ @ @ Z ` ...g g g g +. ` ' @ @.. #.$.g g g g %. ", +" &.g g *.=. -.;.@ @ @ @ @ >.,.'.g g g g '. / ).@ !.. ~.{.U g g ]. ", +" ^./.g (._. ` :.@ @ @ @ <.[.'.g g g g '.}.|.<.} ^ . 1.2.g d e ", +" 3.g 4.5. 6.7.@ @ @ @ 8.'.g g g g '.9.0.@ [ . a./.g b. ", +" c.R /.d. -.e.@ @ @ @ f.'.g g g g '.g.@ - . h.h i. ", +" j.k.%. ^ l.@ @ @ f.'.g g g g '.f.m.` n.f o. ", +" ! * @ @ f.'.g g g g '.p.G . ", +" ! ~ { @ f.'.g g g g '.q.. ", +" ^ _ @ f.'.g g g g '.r. ", +" ^ s.f.'.g g g g '.t. ", +" ^ u.p.'.g g g g '.v. ", +" ^ w.'.g g g g '.r. ", +" x.y.'.g g g g '.z.^ ", +" ` A.'.g g g g '.B.x.. ", +" C.D.f.'.g g g g '.f.# ` ", +" < E.{ F.'.g g g g '.f.@ ( ^ ", +" : G.; @ H.'.g g g g '.f.@ <.I.^ ", +" -.J.@ K.L.'.g g g g '.f.@ @ s.` ", +" I.) @ M.. N.'.g g g g '.f.@ @ @ _ ^ ", +" L O.F <.6.. '.g g g g '.f.@ @ @ { E.! ", +" ^ P.@ Q.. '.g g g g '.R.@ @ @ @ * ! ", +" G S.@ % . '.g g g g '.T.{ @ @ @ @ l.^ ", +" < U.> 7.^ ..g g g g u V.W.@ @ @ @ @ e.! ", +" X.-.m.@ Y.. Z.g g g g `. +` M.@ @ @ @ 7.6. ", +" -..+@ ++. @+#+g g g g #+$+^ %+<.@ @ @ @ :.` ", +" I.&+@ *+. =+h g g g g h -+ ! >.@ @ @ @ @ ;.^ ", +" ;+x.} > C.. >+g g g g g g >+ ` Z @ @ @ @ Y / . ", +" ` ' @ ,+. %.1.'+)+!+g g g g g g g g #+)+~+{+]+^+@ @ @ P.` ", +" / ).@ !.. /+(+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+_+(+:+@ @ @ @ ).^ ", +" I.[ > F . . <+[+@ @ @ @ <.I.` ", +" . . . . . . 0.@ }+. . . . . . . . . . . . . |+@ @ @ @ s.. . . . . . ", +" O.@ @ @ @ @ @ @ @ @ @ @ @ @ ^ ! $ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ $ . ", +" . & & & & & & & & & & & & & . . , & & & & & & & & & & & & & & & , . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" ", +" "}; diff --git a/ports/xterm/xterm-359/icons/terminal_48x48.svg b/ports/xterm/xterm-359/icons/terminal_48x48.svg new file mode 100644 index 0000000..62c2ded --- /dev/null +++ b/ports/xterm/xterm-359/icons/terminal_48x48.svg @@ -0,0 +1,636 @@ + + + + + terminal + + + + + + + + image/svg+xml + + terminal + + + + Thomas E. Dickey + + + + + MIT-X11 + + + Translated from the X11 bitmaps/terminal file through stages to svg. + June 14, 2012 + https://invisible-island.net/xterm/xterm.icon.html + https://invisible-island.net/xterm/images/icons-terminal.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ports/xterm/xterm-359/icons/terminal_48x48.xpm b/ports/xterm/xterm-359/icons/terminal_48x48.xpm new file mode 100644 index 0000000..d482844 --- /dev/null +++ b/ports/xterm/xterm-359/icons/terminal_48x48.xpm @@ -0,0 +1,53 @@ +/* XPM */ +static char * terminal_48x48_xpm[] = { +"48 48 2 1", +" c #000000", +". c #FFFFFF", +"................................................", +"...... ........", +"..... .................................. ......", +"..... ... ... . .....", +"..... .. ............................ .. .. ....", +"..... . .............................. . ... ...", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . .... ..", +"..... . .............................. . ... ...", +"..... . .............................. . ... ...", +"..... . .............................. . .. ....", +"..... . .............................. . .. ....", +"..... . .............................. . . .....", +"..... .. ............................ .. . .....", +"..... ... ... ......", +"..... .................................. ......", +"...... ........", +"................................................", +"................................................", +"...... ......", +"..... .................................. ......", +"..... . . . . . . . . . . . . . . . . .. ......", +".... .................................. . ......", +".... . . . . . . . . . . . . . . . . .. . ......", +"... .................................. .. ......", +"... . . . . . . . . . . . . . . . . .. .. ......", +".. .................................. .. .......", +".. . . . . . ........", +". .................................. . .........", +". ..........", +"................................................"}; diff --git a/ports/xterm/xterm-359/icons/xterm-color.png b/ports/xterm/xterm-359/icons/xterm-color.png new file mode 100644 index 0000000000000000000000000000000000000000..310d80f09cf8a414ee5a6bdc8d888045a41a7f5c GIT binary patch literal 1860 zcmV-K2fO%*P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iyt= z6dDPvksm(*00zWKL_t(&-tC!vY*W`2z<)2cpGiz&k^(U<%?GtY0%2Q`=q5Bu$p`^K zNV+Y9NfYa+y8f|FWN4aDk(M=`U=1as8ZFb*!6>wUt=m*h&{oh*jM0)X$j3lQi^->x zK#2+-QvdMQ0UJuie`1N=SOmq-{~F4tLARb!@cRaK?4v-6|S_Fh10 zYir*!7!2K`Swk5|0NUHz|B>Tx>>b+)jjs?BE0Q53~0BCYN1 z?JW+6Bgg0Sl|*9+5s^NV$t0=pajgA*0i01)RYb%U;-w|*4Q8{sd!o1q3*ZIBIt_t4 z2X2NLA1;81NJ~r0=@12&(qj|hX=!PW zXoGl!1?CwM|1(I}W<(jLt&4fc_vgjV0%6>wECA50!LIiqbus)dD~S8)BXDaFj&{$y zL^fs&TwaR=o<|Ckkk6h%660bU17FwzVJJ8Q0S(@L8eXi1zQFWqdeQ>4`=OyJcwjr? zr{7g3EkN;Hm}3FgC-8heWSJiz0gS+b74XCfSa}ixI=sIoCVZ+>BEUOefnV3cwLxh0 z!O#8*8M*Mw`=0~i?@541O|ahqD>I?-)@^*X7y4YVYke@O&54V>3mKy!T4Vvm0LQLC zRwBH2GlkxU@%-hFQ+td$2Rdo=IPrMgeEsL!X!JN~^f>A8^l(7Yy>;p>aOmm@xO#%G zk;X>vk9hV}MdZKdNadj#g_p~(-?gsiGmQ^V^a1eLR})yaJU(KD6tkCr^6+iqgmmVK zhu-_)LK8vLH*`whP7P+9CaBmQ6vk*$m^!1ix%~JO|%OBW;n&n}^)ET8Bogt2_J(%eKFOf^h!T z-K^O0s|oiS8XD@qr&?$LIU(Mi2H(b1TL`&>NgGX&2@7lxN|E!^m=tJ*9=B*XHWN2SYl@=U0h{o}Zt8UPSbb8#h*q zh=k^nmzQ@w^#5e&0%7`9t5$tH8eKs_L6wL|d3pKC%F4=9!|%WofdQy%XlVFb=o}7& zMm;oYcg*#Bq#JY8H0_$jVsUGl);<{lwy$2j`htk)g@uLHA|e|$Y^VxpsY*noq@?6u z!{=eT@H|?&u$IGg>({RzLAPhmp7$y%D^H1tL@R&=aJk*?YMExxG_5tH{f@~9@QZER zww)fP^+0iP@dXhHgtQeI!`cds6Vio!zo@8aRJyP=!qz!(;K1pMii!_HrOZd;2@sBK zyP_y{0|NtHX0v&5Xn|?ms{!a!*toS2{E#kzK){=voNVmr>ABh2+1crEI2=BouNXKt z-ktcRva+(XX0y2{H#fJ%U@#bKYil3Q%*}zXlo1LAVojo4&VGCG*exJ|xfvTzwz&ec`yP@Rd + + + + xterm-color + + + + + + + + + + image/svg+xml + + xterm-color + + + + Thomas E. Dickey + + + + + MIT-X11 + + + XTerm icon, in SVG format. + June 14, 2012 + https://invisible-island.net/xterm/xterm.icon.html + https://invisible-island.net/xterm/images/icons-xterm-color_226.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + TERM + + + + + + + + + + + + + + + + + + diff --git a/ports/xterm/xterm-359/icons/xterm-color.xpms b/ports/xterm/xterm-359/icons/xterm-color.xpms new file mode 100644 index 0000000..0736813 --- /dev/null +++ b/ports/xterm/xterm-359/icons/xterm-color.xpms @@ -0,0 +1,263 @@ +/* $XTermId: xterm-color.xpms,v 1.3 2012/10/09 10:48:48 tom Exp $ */ +/* generated by ./make-xpms */ +/* vile:xpmmode */ +/* XPM */ +static const char * const xterm_color_16x16_xpm[] = { +"16 16 80 1", +". c None", +" c #555500", +"+ c #545400", +"@ c #3A3A00", +"# c #222200", +"$ c #2A2A00", +"% c #2B2B00", +"& c #151500", +"* c #5E5E00", +"= c #5A5A00", +"- c #909098", +"; c #3E3E3E", +"> c #000000", +", c #F2F2F2", +"' c #2E2E36", +") c #343400", +"! c #4C0000", +"~ c #140000", +"{ c #7C0000", +"] c #7F7F7F", +"^ c #858588", +"/ c #EA0000", +"( c #0B0000", +"_ c #460000", +": c #8E0000", +"< c #A80000", +"[ c #474747", +"} c #868686", +"| c #404548", +"1 c #8F3400", +"2 c #451200", +"3 c #299000", +"4 c #1F6C00", +"5 c #192E48", +"6 c #1B3448", +"7 c #888888", +"8 c #CF4C00", +"9 c #3B0700", +"0 c #39C700", +"a c #42E800", +"b c #2D5181", +"c c #55A3E3", +"d c #305C81", +"e c #989898", +"f c #D84F00", +"g c #3A0600", +"h c #258100", +"i c #376599", +"j c #396D99", +"k c #7E7E7E", +"l c #010100", +"m c #000101", +"n c #9A9A9A", +"o c #101000", +"p c #5B5B00", +"q c #3D3D00", +"r c #272700", +"s c #2F2F00", +"t c #303000", +"u c #1A1A00", +"v c #464636", +"w c #7A7A7F", +"x c #8B8B90", +"y c #1B1B00", +"z c #0F0F00", +"A c #FFFFFF", +"B c #5B5B5B", +"C c #C9C9C9", +"D c #BFBFBF", +"E c #B5B5B5", +"F c #5C5C5C", +"G c #79797F", +"H c #7F7F88", +"I c #484835", +"J c #3C3C00", +"K c #1E1E00", +"L c #909090", +"M c #333336", +"N c #464600", +"O c #575700", +".+@#$$$$$$$$%&*+", +".=-;>>>>>>>>>,')", +".=>!~{>>>>>>>>]^", +".=>>/(>>>>>>>>]]", +".=>_:<>>>>>>>>]]", +".=>>>>>>>>>>>>]]", +".=>[}|12345>6>]]", +".=>>7>890abcd>]]", +".=>>e>fgh0i>j>k^", +".=>>>l>>>>>m>>no", +".=-;>>>>>>>>>,>p", +".+qrsssssssstu*.", +".pvwwwwwwwwwwxy.", +"+zABABCDDDEAFG*.", +"*HBABAEDDDCBAIJ.", +"KL]]]]]]]]]]MNO."}; +/* XPM */ +static const char * const xterm_color_32x32_xpm[] = { +"32 32 60 1", +". c None", +" c #FFFFFF", +"+ c #000000", +"@ c #EFEFEF", +"# c #FEFEFE", +"$ c #FBFBFB", +"% c #F3F3F3", +"& c #ADADAD", +"* c #909090", +"= c #737373", +"- c #D2D2D2", +"; c #646464", +"> c #9A9A9A", +", c #8D8D8D", +"' c #D3D3D3", +") c #0E0E0E", +"! c #F6F6F6", +"~ c #5E5E5E", +"{ c #B1B1B1", +"] c #777777", +"^ c #949494", +"/ c #757575", +"( c #C4C4C4", +"_ c #E7E7E7", +": c #F1F1F1", +"< c #F8F8F8", +"[ c #EEEEEE", +"} c #F0F0F0", +"| c #FAFAFA", +"1 c #7B7B7B", +"2 c #3D3D3D", +"3 c #868686", +"4 c #4F4F4F", +"5 c #ABABAB", +"6 c #545454", +"7 c #5B5B5B", +"8 c #AFAFAF", +"9 c #292929", +"0 c #181818", +"a c #C7C7C7", +"b c #CFCFCF", +"c c #7F7F7F", +"d c #A3A3A3", +"e c #4D4D4D", +"f c #6A6A6A", +"g c #A1A1A1", +"h c #8E8E8E", +"i c #696969", +"j c #474747", +"k c #5A5A5A", +"l c #959595", +"m c #767676", +"n c #8B8B8B", +"o c #BCBCBC", +"p c #BFBFBF", +"q c #D7D7D7", +"r c #404040", +"s c #636363", +"t c #989898", +"u c #8A8A8A", +"................................", +".....+++++++++++++++++++++++....", +"....+..+++++++++++++++++++..++..", +"....+.+...................+.+.+.", +"....++.@#.$%................+..+", +"....++.&*.=-................+..+", +"....++..;>,.................+..+", +"....++..')!.................+..+", +"....++.#~{].................+..+", +"....++.^{./(................+..+", +"....++......................+..+", +"....++......................+..+", +"....++.____:___<_[..<}..[|..+..+", +"....++.1;21341156]7.89$:0a..+..+", +"....++..bc.8^__8d.e.8fghia..+..+", +"....++..bc.84115jkl.887mna..+..+", +"....++..bc.8d..8dof.88pqna..+..+", +"....++..bc.8rss5d.tu88..na..+...", +"....++......................+.+.", +"....++......................+.+.", +"....+.+...................+.++..", +"....+..+++++++++++++++++++..+...", +".....+++++++++++++++++++++++....", +"................................", +".....++++++++++++++++++++++++...", +"....+.......................+...", +"...+.......................+....", +"...+..++..++.++..++..+..++.+....", +"....++..++..+..++..++.++........", +"..+.......................+.+...", +".+.......................+......", +".++++++++++++++++++++++++++....."}; +/* XPM */ +static const char * const xterm_color_48x48_xpm[] = { +"48 48 10 1", +". c None", +" c #555500", +"+ c #000000", +"@ c #FFFFFF", +"# c #FF0000", +"$ c #070700", +"% c #0B0B00", +"& c #FF8400", +"* c #49FF00", +"= c #60B7FF", +"................................................", +"......++++++++++++++++++++++++++++++++++........", +".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", +".....+@@@++++++++++++++++++++++++++++@@@+@+.....", +".....+@@++++++++++++++++++++++++++++++@@+@@+....", +".....+@++++++++++++++++++++++++++++++++@+@@@+...", +".....+@++###++++###++++++++++++++++++++@+@@@@+..", +".....+@+++##++++##+++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@++++++##++++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@+++##++++##+++++++++++++++++++++@+@@@@+..", +".....+@++###++++###++++++++++++++++++++@+@@@@+..", +".....+@++++++++++++++++++++++++++++++++@+@@@@+..", +".....+@$+++++++++++++++++++++++++++++++@+@@@@+..", +".....+@%@@@@@@@+&&&&&++****+++==+++==++@+@@@@+..", +".....+@++++@++++&++++++*+++*++==+++==++@+@@@@+..", +".....+@++++@++++&++++++*+++*++=+=+=+=++@+@@@@+..", +".....+@++++@++++&&&&+++****+++=+=+=+=++@+@@@@+..", +".....+@++++@++++&++++++*+*++++=++=++=++@+@@@+...", +".....+@++++@++++&++++++*++*+++=++=++=++@+@@@+...", +".....+@++++@++++&&&&&++*+++*++=+++++=++@+@@+....", +".....+@++++++++++++++++++++++++++++++++@+@@+....", +".....+@++++++++++++++++++++++++++++++++@+@+.....", +".....+@@++++++++++++++++++++++++++++++@@+@+.....", +".....+@@@++++++++++++++++++++++++++++@@@++......", +".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", +"......++++++++++++++++++++++++++++++++++........", +"................................................", +"................................................", +"......++++++++++++++++++++++++++++++++++++......", +".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", +".....+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@++......", +"....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@+......", +"....+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@+@+......", +"...+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@+......", +"...+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@+@@+......", +"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@+.......", +"..+@++@++++++++++++++++++++++++++@++@+@+........", +".+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@+.........", +".+++++++++++++++++++++++++++++++++++++..........", +"................................................"}; +static const XPM_DATA xterm_color_xpms[] = { + { "xterm-color_16x16", xterm_color_16x16_xpm }, + { "xterm-color_32x32", xterm_color_32x32_xpm }, + { "xterm-color_48x48", xterm_color_48x48_xpm } +}; diff --git a/ports/xterm/xterm-359/icons/xterm-color_16x16.xpm b/ports/xterm/xterm-359/icons/xterm-color_16x16.xpm new file mode 100644 index 0000000..d5b3c7a --- /dev/null +++ b/ports/xterm/xterm-359/icons/xterm-color_16x16.xpm @@ -0,0 +1,99 @@ +/* XPM */ +static char * xterm_color_16x16_xpm[] = { +"16 16 80 1", +". c None", +" c #555500", +"+ c #545400", +"@ c #3A3A00", +"# c #222200", +"$ c #2A2A00", +"% c #2B2B00", +"& c #151500", +"* c #5E5E00", +"= c #5A5A00", +"- c #909098", +"; c #3E3E3E", +"> c #000000", +", c #F2F2F2", +"' c #2E2E36", +") c #343400", +"! c #4C0000", +"~ c #140000", +"{ c #7C0000", +"] c #7F7F7F", +"^ c #858588", +"/ c #EA0000", +"( c #0B0000", +"_ c #460000", +": c #8E0000", +"< c #A80000", +"[ c #474747", +"} c #868686", +"| c #404548", +"1 c #8F3400", +"2 c #451200", +"3 c #299000", +"4 c #1F6C00", +"5 c #192E48", +"6 c #1B3448", +"7 c #888888", +"8 c #CF4C00", +"9 c #3B0700", +"0 c #39C700", +"a c #42E800", +"b c #2D5181", +"c c #55A3E3", +"d c #305C81", +"e c #989898", +"f c #D84F00", +"g c #3A0600", +"h c #258100", +"i c #376599", +"j c #396D99", +"k c #7E7E7E", +"l c #010100", +"m c #000101", +"n c #9A9A9A", +"o c #101000", +"p c #5B5B00", +"q c #3D3D00", +"r c #272700", +"s c #2F2F00", +"t c #303000", +"u c #1A1A00", +"v c #464636", +"w c #7A7A7F", +"x c #8B8B90", +"y c #1B1B00", +"z c #0F0F00", +"A c #FFFFFF", +"B c #5B5B5B", +"C c #C9C9C9", +"D c #BFBFBF", +"E c #B5B5B5", +"F c #5C5C5C", +"G c #79797F", +"H c #7F7F88", +"I c #484835", +"J c #3C3C00", +"K c #1E1E00", +"L c #909090", +"M c #333336", +"N c #464600", +"O c #575700", +".+@#$$$$$$$$%&*+", +".=-;>>>>>>>>>,')", +".=>!~{>>>>>>>>]^", +".=>>/(>>>>>>>>]]", +".=>_:<>>>>>>>>]]", +".=>>>>>>>>>>>>]]", +".=>[}|12345>6>]]", +".=>>7>890abcd>]]", +".=>>e>fgh0i>j>k^", +".=>>>l>>>>>m>>no", +".=-;>>>>>>>>>,>p", +".+qrsssssssstu*.", +".pvwwwwwwwwwwxy.", +"+zABABCDDDEAFG*.", +"*HBABAEDDDCBAIJ.", +"KL]]]]]]]]]]MNO."}; diff --git a/ports/xterm/xterm-359/icons/xterm-color_32x32.xpm b/ports/xterm/xterm-359/icons/xterm-color_32x32.xpm new file mode 100644 index 0000000..7feaadc --- /dev/null +++ b/ports/xterm/xterm-359/icons/xterm-color_32x32.xpm @@ -0,0 +1,95 @@ +/* XPM */ +static char * xterm_color_32x32_xpm[] = { +"32 32 60 1", +". c None", +" c #FFFFFF", +"+ c #000000", +"@ c #EFEFEF", +"# c #FEFEFE", +"$ c #FBFBFB", +"% c #F3F3F3", +"& c #ADADAD", +"* c #909090", +"= c #737373", +"- c #D2D2D2", +"; c #646464", +"> c #9A9A9A", +", c #8D8D8D", +"' c #D3D3D3", +") c #0E0E0E", +"! c #F6F6F6", +"~ c #5E5E5E", +"{ c #B1B1B1", +"] c #777777", +"^ c #949494", +"/ c #757575", +"( c #C4C4C4", +"_ c #E7E7E7", +": c #F1F1F1", +"< c #F8F8F8", +"[ c #EEEEEE", +"} c #F0F0F0", +"| c #FAFAFA", +"1 c #7B7B7B", +"2 c #3D3D3D", +"3 c #868686", +"4 c #4F4F4F", +"5 c #ABABAB", +"6 c #545454", +"7 c #5B5B5B", +"8 c #AFAFAF", +"9 c #292929", +"0 c #181818", +"a c #C7C7C7", +"b c #CFCFCF", +"c c #7F7F7F", +"d c #A3A3A3", +"e c #4D4D4D", +"f c #6A6A6A", +"g c #A1A1A1", +"h c #8E8E8E", +"i c #696969", +"j c #474747", +"k c #5A5A5A", +"l c #959595", +"m c #767676", +"n c #8B8B8B", +"o c #BCBCBC", +"p c #BFBFBF", +"q c #D7D7D7", +"r c #404040", +"s c #636363", +"t c #989898", +"u c #8A8A8A", +"................................", +".....+++++++++++++++++++++++....", +"....+..+++++++++++++++++++..++..", +"....+.+...................+.+.+.", +"....++.@#.$%................+..+", +"....++.&*.=-................+..+", +"....++..;>,.................+..+", +"....++..')!.................+..+", +"....++.#~{].................+..+", +"....++.^{./(................+..+", +"....++......................+..+", +"....++......................+..+", +"....++.____:___<_[..<}..[|..+..+", +"....++.1;21341156]7.89$:0a..+..+", +"....++..bc.8^__8d.e.8fghia..+..+", +"....++..bc.84115jkl.887mna..+..+", +"....++..bc.8d..8dof.88pqna..+..+", +"....++..bc.8rss5d.tu88..na..+...", +"....++......................+.+.", +"....++......................+.+.", +"....+.+...................+.++..", +"....+..+++++++++++++++++++..+...", +".....+++++++++++++++++++++++....", +"................................", +".....++++++++++++++++++++++++...", +"....+.......................+...", +"...+.......................+....", +"...+..++..++.++..++..+..++.+....", +"....++..++..+..++..++.++........", +"..+.......................+.+...", +".+.......................+......", +".++++++++++++++++++++++++++....."}; diff --git a/ports/xterm/xterm-359/icons/xterm-color_48x48.xpm b/ports/xterm/xterm-359/icons/xterm-color_48x48.xpm new file mode 100644 index 0000000..d8a501f --- /dev/null +++ b/ports/xterm/xterm-359/icons/xterm-color_48x48.xpm @@ -0,0 +1,61 @@ +/* XPM */ +static char * xterm_color_48x48_xpm[] = { +"48 48 10 1", +". c None", +" c #555500", +"+ c #000000", +"@ c #FFFFFF", +"# c #FF0000", +"$ c #070700", +"% c #0B0B00", +"& c #FF8400", +"* c #49FF00", +"= c #60B7FF", +"................................................", +"......++++++++++++++++++++++++++++++++++........", +".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", +".....+@@@++++++++++++++++++++++++++++@@@+@+.....", +".....+@@++++++++++++++++++++++++++++++@@+@@+....", +".....+@++++++++++++++++++++++++++++++++@+@@@+...", +".....+@++###++++###++++++++++++++++++++@+@@@@+..", +".....+@+++##++++##+++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@++++++##++++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@+++++####+++++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@++++##++##++++++++++++++++++++++@+@@@@+..", +".....+@+++##++++##+++++++++++++++++++++@+@@@@+..", +".....+@++###++++###++++++++++++++++++++@+@@@@+..", +".....+@++++++++++++++++++++++++++++++++@+@@@@+..", +".....+@$+++++++++++++++++++++++++++++++@+@@@@+..", +".....+@%@@@@@@@+&&&&&++****+++==+++==++@+@@@@+..", +".....+@++++@++++&++++++*+++*++==+++==++@+@@@@+..", +".....+@++++@++++&++++++*+++*++=+=+=+=++@+@@@@+..", +".....+@++++@++++&&&&+++****+++=+=+=+=++@+@@@@+..", +".....+@++++@++++&++++++*+*++++=++=++=++@+@@@+...", +".....+@++++@++++&++++++*++*+++=++=++=++@+@@@+...", +".....+@++++@++++&&&&&++*+++*++=+++++=++@+@@+....", +".....+@++++++++++++++++++++++++++++++++@+@@+....", +".....+@++++++++++++++++++++++++++++++++@+@+.....", +".....+@@++++++++++++++++++++++++++++++@@+@+.....", +".....+@@@++++++++++++++++++++++++++++@@@++......", +".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", +"......++++++++++++++++++++++++++++++++++........", +"................................................", +"................................................", +"......++++++++++++++++++++++++++++++++++++......", +".....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++......", +".....+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@++......", +"....+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@+......", +"....+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@+@+......", +"...+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@+......", +"...+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@+@@+......", +"..+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@+.......", +"..+@++@++++++++++++++++++++++++++@++@+@+........", +".+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@+.........", +".+++++++++++++++++++++++++++++++++++++..........", +"................................................"}; diff --git a/ports/xterm/xterm-359/icons/xterm.png b/ports/xterm/xterm-359/icons/xterm.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fcf1b33680213825a19751e82cd8b4b6aa4c25 GIT binary patch literal 843 zcmV-R1GM~!P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iyh^ z2_z;`Kg`wu00PTNL_t(&-tF1XYaLY-2k=i!BG!U5HW+G(E~1-MT8JA#162dXE=mn5 zf_AA3m#qtT?W&tDis(`h@(*NX!G%zyBL1KTrA<{_)EL_;(qLXT8kjEL9hhF`y*KYi zW+ovAE^pqs_spE{x#!$-<_tTOX0eW>;_)wD=mo%fuYy}($ew^C74Al?Y=Rm5ftR}l zFc$=8O0;^cY|?^X2tZY?l+iUQ=PC%| z`*;uZaN|2z3pW|9Yc13Y{S=mQDCCFL5F6XVg$@MeU(E1c54=a~4qyyF;_aNZ@8dEa ztTTXYvU(<3+t?0?tWI&*_bF5>+6Ay(0OY+nwc}^!{=BII!{Hr(-uHV9?GLEpMplii*-(otNo5D9?7nU+F zN1b$-z{VhVU?>{#+&He`$!P93{E3h8b12P=&@UlOvh)r<>HxeGfQvZaZyK+vl*qMyrx<8d*cWQ#RK1_zpKj21-O?KX#ofT98{g0K z#o4H2-s%zWdeV*Wr&PD@^hUR>o3gE5bT@XXDtf408IVWQ_;LWH#!x2v_DiGKEDGQ= ze1T5~kc`&)ke>`C$XKXmH;V|pf}b#q#lWlTH$6W8$4C+7M{pg-YvA|UTrY=_ zUT<}|upB)%wf=liex^vGS<&qIuh(D)R`DJ#;3U541YlhA3uK+jhP!wTU+?%L=^p+$ Vx38=mZgl_v002ovPDHLkV1hd;g~b2> literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/icons/xterm.svg b/ports/xterm/xterm-359/icons/xterm.svg new file mode 100644 index 0000000..675367b --- /dev/null +++ b/ports/xterm/xterm-359/icons/xterm.svg @@ -0,0 +1,652 @@ + + + + + xterm + + + + + + + + + + image/svg+xml + + xterm + + + + Thomas E. Dickey + + + + + MIT-X11 + + + XTerm icon, in SVG format. + June 14, 2012 + https://invisible-island.net/xterm/xterm.icon.html + https://invisible-island.net/xterm/images/icons-xterm_281.png + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + TERM + + diff --git a/ports/xterm/xterm-359/icons/xterm.xpms b/ports/xterm/xterm-359/icons/xterm.xpms new file mode 100644 index 0000000..bb34504 --- /dev/null +++ b/ports/xterm/xterm-359/icons/xterm.xpms @@ -0,0 +1,119 @@ +/* $XTermId: xterm.xpms,v 1.3 2012/10/07 22:58:01 tom Exp $ */ +/* generated by ./make-xpms */ +/* vile:xpmmode */ +/* XPM */ +static const char * const xterm_16x16_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" . ", +" .... . ", +" .. . ", +" .. . ", +" .. . . ", +" . ", +" .... .. . ", +" . . . .. . ", +" . . ", +" . . ", +" . ", +" . ", +" ", +" ", +" . "}; +/* XPM */ +static const char * const xterm_32x32_xpm[] = { +"32 32 2 1", +" c None", +". c #000000", +" ", +" . .. ", +" . ................... ... ", +" . . ... . ", +" . ... . ", +" . .. ... ... . ", +" . . . ... . ", +" . .. ... . ", +" . .. ... . ", +" . .. ... . ", +" . . . ... . ", +" . ... .. ... . ", +" . ... . ", +" . ... . ", +" . ........ ... .. ..... . ", +" . . . . . ........ . ", +" . . ... .. . . .... . ", +" . . . . . . . .... . ", +" . . ... . .. . .... . ", +" . . .... ", +" . . . ... ", +" . .. ", +" ....................... ", +" ", +" ........................ ", +" . .. ", +" .. ", +" . . . ", +" . . ", +" . . ................. .. . ", +" . .. ", +" "}; +/* XPM */ +static const char * const xterm_48x48_xpm[] = { +"48 48 2 1", +" c None", +". c #000000", +" ", +" .................................. ", +" . .. ", +" . ............................ . . ", +" . . . . . ", +" . . . . . ", +" . . . . . ", +" . . ... ... . . . ", +" . . . . . . . ", +" . . . . . . . ", +" . . . . . . . ", +" . . .. . . . ", +" . . .. . . . ", +" . . . . . . . ", +" . . . . . . . ", +" . . . . . . . ", +" . . ... ... . . . ", +" . . . . . ", +" . . . . . ", +" . . . . . ", +" . . . . . ", +" . . ..... ..... .... . . . . . ", +" . . . . . . .. .. . . . ", +" . . . . . . .. .. . . . ", +" . . . ..... .... . . . . . . . ", +" . . . . . . . ... . . . .. ", +" . . . . . . . . . . . . ", +" . . . ..... . . . . . . .. ", +" . . . . . ", +" . . . . .. ", +" . . . . . ", +" . ............................ ... ", +" . .. ", +" .................................. ", +" ", +" ", +" .................................... ", +" . .. ", +" . . . . . . . . . . . . . . . . . ... ", +" . . . ", +" . . . . . . . . . . . . . . . . . .. . ", +" . . . ", +" .. . . . . . . . . . . . . . . . . .. . ", +" . . . ", +" .. .. .......................... .... . ", +" . . . ", +" ..................................... ", +" "}; +static const XPM_DATA xterm_xpms[] = { + { "xterm_16x16", xterm_16x16_xpm }, + { "xterm_32x32", xterm_32x32_xpm }, + { "xterm_48x48", xterm_48x48_xpm } +}; diff --git a/ports/xterm/xterm-359/icons/xterm_16x16.xpm b/ports/xterm/xterm-359/icons/xterm_16x16.xpm new file mode 100644 index 0000000..4dc5514 --- /dev/null +++ b/ports/xterm/xterm-359/icons/xterm_16x16.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static char * xterm_16x16_xpm[] = { +"16 16 2 1", +" c None", +". c #000000", +" ", +" . ", +" .... . ", +" .. . ", +" .. . ", +" .. . . ", +" . ", +" .... .. . ", +" . . . .. . ", +" . . ", +" . . ", +" . ", +" . ", +" ", +" ", +" . "}; diff --git a/ports/xterm/xterm-359/icons/xterm_32x32.xpm b/ports/xterm/xterm-359/icons/xterm_32x32.xpm new file mode 100644 index 0000000..844a956 --- /dev/null +++ b/ports/xterm/xterm-359/icons/xterm_32x32.xpm @@ -0,0 +1,37 @@ +/* XPM */ +static char * xterm_32x32_xpm[] = { +"32 32 2 1", +" c None", +". c #000000", +" ", +" . .. ", +" . ................... ... ", +" . . ... . ", +" . ... . ", +" . .. ... ... . ", +" . . . ... . ", +" . .. ... . ", +" . .. ... . ", +" . .. ... . ", +" . . . ... . ", +" . ... .. ... . ", +" . ... . ", +" . ... . ", +" . ........ ... .. ..... . ", +" . . . . . ........ . ", +" . . ... .. . . .... . ", +" . . . . . . . .... . ", +" . . ... . .. . .... . ", +" . . .... ", +" . . . ... ", +" . .. ", +" ....................... ", +" ", +" ........................ ", +" . .. ", +" .. ", +" . . . ", +" . . ", +" . . ................. .. . ", +" . .. ", +" "}; diff --git a/ports/xterm/xterm-359/icons/xterm_48x48.xpm b/ports/xterm/xterm-359/icons/xterm_48x48.xpm new file mode 100644 index 0000000..d197d75 --- /dev/null +++ b/ports/xterm/xterm-359/icons/xterm_48x48.xpm @@ -0,0 +1,53 @@ +/* XPM */ +static char * xterm_48x48_xpm[] = { +"48 48 2 1", +" c None", +". c #000000", +" ", +" .................................. ", +" . .. ", +" . ............................ . . ", +" . . . . . ", +" . . . . . ", +" . . . . . ", +" . . ... ... . . . ", +" . . . . . . . ", +" . . . . . . . ", +" . . . . . . . ", +" . . .. . . . ", +" . . .. . . . ", +" . . . . . . . ", +" . . . . . . . ", +" . . . . . . . ", +" . . ... ... . . . ", +" . . . . . ", +" . . . . . ", +" . . . . . ", +" . . . . . ", +" . . ..... ..... .... . . . . . ", +" . . . . . . .. .. . . . ", +" . . . . . . .. .. . . . ", +" . . . ..... .... . . . . . . . ", +" . . . . . . . ... . . . .. ", +" . . . . . . . . . . . . ", +" . . . ..... . . . . . . .. ", +" . . . . . ", +" . . . . .. ", +" . . . . . ", +" . ............................ ... ", +" . .. ", +" .................................. ", +" ", +" ", +" .................................... ", +" . .. ", +" . . . . . . . . . . . . . . . . . ... ", +" . . . ", +" . . . . . . . . . . . . . . . . . .. . ", +" . . . ", +" .. . . . . . . . . . . . . . . . . .. . ", +" . . . ", +" .. .. .......................... .... . ", +" . . . ", +" ..................................... ", +" "}; diff --git a/ports/xterm/xterm-359/input.c b/ports/xterm/xterm-359/input.c new file mode 100644 index 0000000..c48b9f4 --- /dev/null +++ b/ports/xterm/xterm-359/input.c @@ -0,0 +1,2086 @@ +/* $XTermId: input.c,v 1.363 2019/11/13 23:05:06 tom Exp $ */ + +/* + * Copyright 1999-2018,2019 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* input.c */ + +#include + +#include + +#ifdef VMS +#include +#endif + +#if HAVE_X11_DECKEYSYM_H +#include +#endif + +#if HAVE_X11_SUNKEYSYM_H +#include +#endif + +#if HAVE_X11_XF86KEYSYM_H +#include +#endif + +#if !defined(HAVE_CONFIG_H) && defined(_X_DEPRECATED) +#define HAVE_XKBKEYCODETOKEYSYM 1 +#endif + +#ifdef HAVE_XKBKEYCODETOKEYSYM +#include +#endif + +#include +#include +#include + +#include + +#include +#include +#include +#include + +/* + * Xutil.h has no macro to check for the complete set of function- and + * modifier-keys that might be returned. Fake it. + */ +#ifdef XK_ISO_Lock +#define IsPredefinedKey(n) ((n) >= XK_ISO_Lock && (n) <= XK_Delete) +#else +#define IsPredefinedKey(n) ((n) >= XK_BackSpace && (n) <= XK_Delete) +#endif + +#ifdef XK_ISO_Left_Tab +#define IsTabKey(n) ((n) == XK_Tab || (n) == XK_ISO_Left_Tab) +#else +#define IsTabKey(n) ((n) == XK_Tab) +#endif + +#ifndef IsPrivateKeypadKey +#define IsPrivateKeypadKey(k) (0) +#endif + +#define IsBackarrowToggle(keyboard, keysym, state) \ + ((((keyboard->flags & MODE_DECBKM) == 0) \ + ^ ((state & ControlMask) != 0)) \ + && (keysym == XK_BackSpace)) + +#define MAP(from, to) case from: result = to; break +#define Masked(value,mask) ((value) & (unsigned) (~(mask))) + +#define KEYSYM_FMT "0x%04lX" /* simplify matching */ + +#define TEK4014_GIN(tw) (tw != 0 && TekScreenOf(tw)->TekGIN) + +typedef struct { + KeySym keysym; + Bool is_fkey; + int nbytes; +#define STRBUFSIZE 500 + char strbuf[STRBUFSIZE]; +} KEY_DATA; + +static +const char kypd_num[] = " XXXXXXXX\tXXX\rXXXxxxxXXXXXXXXXXXXXXXXXXXXX*+,-./0123456789XXX="; +/* 0123456789 abc def0123456789abcdef0123456789abcdef0123456789abcd */ +static +const char kypd_apl[] = " ABCDEFGHIJKLMNOPQRSTUVWXYZ??????abcdefghijklmnopqrstuvwxyzXXX"; +/* 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcd */ +static +const char curfinal[] = "HDACB FE"; + +static int decfuncvalue(KEY_DATA *); +static void sunfuncvalue(ANSI *, KEY_DATA *); +static void hpfuncvalue(ANSI *, KEY_DATA *); +static void scofuncvalue(ANSI *, KEY_DATA *); + +static void +AdjustAfterInput(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->scrollkey && screen->topline != 0) + WindowScroll(xw, 0, False); + if (screen->marginbell) { + int col = screen->max_col - screen->nmarginbell; + if (screen->bellArmed >= 0) { + if (screen->bellArmed == screen->cur_row) { + if (screen->cur_col >= col) { + Bell(xw, XkbBI_MarginBell, 0); + screen->bellArmed = -1; + } + } else { + screen->bellArmed = + screen->cur_col < col ? screen->cur_row : -1; + } + } else if (screen->cur_col < col) + screen->bellArmed = screen->cur_row; + } +} + +/* + * Return true if the key is on the editing keypad. This overlaps with + * IsCursorKey() and IsKeypadKey() and must be tested before those macros to + * distinguish it from them. + * + * VT220 emulation uses the VT100 numeric keypad as well as a 6-key + * editing keypad. Here's a picture of the VT220 editing keypad: + * +--------+--------+--------+ + * | Find | Insert | Remove | + * +--------+--------+--------+ + * | Select | Prev | Next | + * +--------+--------+--------+ + * + * and the similar Sun and PC keypads: + * +--------+--------+--------+ + * | Insert | Home | PageUp | + * +--------+--------+--------+ + * | Delete | End | PageDn | + * +--------+--------+--------+ + */ +static Bool +IsEditKeypad(XtermWidget xw, KeySym keysym) +{ + Bool result; + + switch (keysym) { + case XK_Delete: + result = !xtermDeleteIsDEL(xw); + break; + case XK_Prior: + case XK_Next: + case XK_Insert: + case XK_Find: + case XK_Select: +#ifdef DXK_Remove + case DXK_Remove: +#endif + result = True; + break; + default: + result = False; + break; + } + return result; +} + +/* + * Editing-keypad, plus other editing keys which are not included in the + * other macros. + */ +static Bool +IsEditFunctionKey(XtermWidget xw, KeySym keysym) +{ + Bool result; + + switch (keysym) { +#ifdef XK_KP_Delete + case XK_KP_Delete: /* editing key on numeric keypad */ + case XK_KP_Insert: /* editing key on numeric keypad */ +#endif +#ifdef XK_ISO_Left_Tab + case XK_ISO_Left_Tab: +#endif + result = True; + break; + default: + result = IsEditKeypad(xw, keysym); + break; + } + return result; +} + +#if OPT_MOD_FKEYS +#define IS_CTRL(n) ((n) < ANSI_SPA || ((n) >= 0x7f && (n) <= 0x9f)) + +/* + * Return true if the keysym corresponds to one of the control characters, + * or one of the common ASCII characters that is combined with control to + * make a control character. + */ +static Bool +IsControlInput(KEY_DATA * kd) +{ + return ((kd->keysym) >= 0x40 && (kd->keysym) <= 0x7f); +} + +static Bool +IsControlOutput(KEY_DATA * kd) +{ + return IS_CTRL(kd->keysym); +} + +/* + * X "normally" has some built-in translations, which the user may want to + * suppress when processing the modifyOtherKeys resource. In particular, the + * control modifier applied to some of the keyboard digits gives results for + * control characters. + * + * control 2 0 NUL + * control SPC 0 NUL + * control @ 0 NUL + * control ` 0 NUL + * control 3 0x1b ESC + * control 4 0x1c FS + * control \ 0x1c FS + * control 5 0x1d GS + * control 6 0x1e RS + * control ^ 0x1e RS + * control ~ 0x1e RS + * control 7 0x1f US + * control / 0x1f US + * control _ 0x1f US + * control 8 0x7f DEL + * + * It is possible that some other keyboards do not work for these combinations, + * but they do work with modifyOtherKeys=2 for the US keyboard: + * + * control ` 0 NUL + * control [ 0x1b ESC + * control \ 0x1c FS + * control ] 0x1d GS + * control ? 0x7f DEL + */ +static Bool +IsControlAlias(KEY_DATA * kd) +{ + Bool result = False; + + if (kd->nbytes == 1) { + result = IS_CTRL(CharOf(kd->strbuf[0])); + } + return result; +} + +/* + * If we are in the non-VT220/VT52 keyboard state, allow modifiers to add a + * parameter to the function-key control sequences. + * + * Note that we generally cannot capture the Shift-modifier for the numeric + * keypad since this is commonly used to act as a type of NumLock, e.g., + * making the keypad send "7" (actually XK_KP_7) where the unshifted code + * would be Home (XK_KP_Home). The other modifiers work, subject to the + * usual window-manager assignments. + */ +#if OPT_SUNPC_KBD +#define LegacyAllows(code) (!is_legacy || (code & xw->keyboard.modify_now.allow_keys) != 0) +#else +#define LegacyAllows(code) True +#endif + +static Bool +allowModifierParm(XtermWidget xw, KEY_DATA * kd) +{ + TKeyboard *keyboard = &(xw->keyboard); + int is_legacy = (keyboard->type == keyboardIsLegacy); + Bool result = False; + +#if OPT_SUNPC_KBD + if (keyboard->type == keyboardIsVT220) + is_legacy = True; +#endif + +#if OPT_VT52_MODE + if (TScreenOf(xw)->vtXX_level != 0) +#endif + { + if (IsCursorKey(kd->keysym) || IsEditFunctionKey(xw, kd->keysym)) { + result = LegacyAllows(2); + } else if (IsKeypadKey(kd->keysym)) { + result = LegacyAllows(1); + } else if (IsFunctionKey(kd->keysym)) { + result = LegacyAllows(4); + } else if (IsMiscFunctionKey(kd->keysym)) { + result = LegacyAllows(8); + } + } + if (xw->keyboard.modify_now.other_keys != 0) { + result = True; + } + return result; +} + +/* +* Modifier codes: +* None 1 +* Shift 2 = 1(None)+1(Shift) +* Alt 3 = 1(None)+2(Alt) +* Alt+Shift 4 = 1(None)+1(Shift)+2(Alt) +* Ctrl 5 = 1(None)+4(Ctrl) +* Ctrl+Shift 6 = 1(None)+1(Shift)+4(Ctrl) +* Ctrl+Alt 7 = 1(None)+2(Alt)+4(Ctrl) +* Ctrl+Alt+Shift 8 = 1(None)+1(Shift)+2(Alt)+4(Ctrl) +* Meta 9 = 1(None)+8(Meta) +* Meta+Shift 10 = 1(None)+8(Meta)+1(Shift) +* Meta+Alt 11 = 1(None)+8(Meta)+2(Alt) +* Meta+Alt+Shift 12 = 1(None)+8(Meta)+1(Shift)+2(Alt) +* Meta+Ctrl 13 = 1(None)+8(Meta)+4(Ctrl) +* Meta+Ctrl+Shift 14 = 1(None)+8(Meta)+1(Shift)+4(Ctrl) +* Meta+Ctrl+Alt 15 = 1(None)+8(Meta)+2(Alt)+4(Ctrl) +* Meta+Ctrl+Alt+Shift 16 = 1(None)+8(Meta)+1(Shift)+2(Alt)+4(Ctrl) +*/ + +unsigned +xtermParamToState(XtermWidget xw, unsigned param) +{ + unsigned result = 0; +#if OPT_NUM_LOCK + if (param > MOD_NONE) { + if ((param - MOD_NONE) & MOD_SHIFT) + UIntSet(result, ShiftMask); + if ((param - MOD_NONE) & MOD_CTRL) + UIntSet(result, ControlMask); + if ((param - MOD_NONE) & MOD_ALT) + UIntSet(result, xw->work.alt_mods); + if ((param - MOD_NONE) & MOD_META) + UIntSet(result, xw->work.meta_mods); + } +#else + (void) xw; + (void) param; +#endif + TRACE(("xtermParamToState(%d) %s%s%s%s -> %#x\n", param, + MODIFIER_NAME(param, MOD_SHIFT), + MODIFIER_NAME(param, MOD_ALT), + MODIFIER_NAME(param, MOD_CTRL), + MODIFIER_NAME(param, MOD_META), + result)); + return result; +} + +unsigned +xtermStateToParam(XtermWidget xw, unsigned state) +{ + unsigned modify_parm = MOD_NONE; + + TRACE(("xtermStateToParam %#x\n", state)); +#if OPT_NUM_LOCK + if (state & ShiftMask) { + modify_parm += MOD_SHIFT; + UIntClr(state, ShiftMask); + } + if (state & ControlMask) { + modify_parm += MOD_CTRL; + UIntClr(state, ControlMask); + } + if ((state & xw->work.alt_mods) != 0) { + modify_parm += MOD_ALT; + UIntClr(state, xw->work.alt_mods); + } + if ((state & xw->work.meta_mods) != 0) { + modify_parm += MOD_META; + /* UIntClr(state, xw->work.meta_mods); */ + } + if (modify_parm == MOD_NONE) + modify_parm = 0; +#else + (void) xw; + (void) state; +#endif + TRACE(("...xtermStateToParam %d%s%s%s%s\n", modify_parm, + MODIFIER_NAME(modify_parm, MOD_SHIFT), + MODIFIER_NAME(modify_parm, MOD_ALT), + MODIFIER_NAME(modify_parm, MOD_CTRL), + MODIFIER_NAME(modify_parm, MOD_META))); + return modify_parm; +} + +#define computeMaskedModifier(xw, state, mask) \ + xtermStateToParam(xw, Masked(state, mask)) + +#if OPT_NUM_LOCK +static unsigned +filterAltMeta(unsigned result, unsigned mask, Bool enable, KEY_DATA * kd) +{ + if ((result & mask) != 0) { + /* + * metaSendsEscape makes the meta key independent of + * modifyOtherKeys. + */ + if (enable) { + result &= ~mask; + } + /* + * A bare meta-modifier is independent of modifyOtherKeys. If it + * is combined with other modifiers, make it depend. + */ + if ((result & ~(mask)) == 0) { + result &= ~mask; + } + /* + * Check for special cases of control+meta which are used by some + * applications, e.g., emacs. + */ + if ((IsControlInput(kd) + || IsControlOutput(kd)) + && (result & ControlMask) != 0) { + result &= ~(mask | ControlMask); + } + if (kd->keysym == XK_Return || kd->keysym == XK_Tab) { + result &= ~(mask | ControlMask); + } + } + return result; +} +#endif /* OPT_NUM_LOCK */ + +/* + * Single characters (not function-keys) are allowed fewer modifiers when + * interpreting modifyOtherKeys due to pre-existing associations with some + * modifiers. + */ +static unsigned +allowedCharModifiers(XtermWidget xw, unsigned state, KEY_DATA * kd) +{ +#if OPT_NUM_LOCK + unsigned a_or_m = (state & (xw->work.meta_mods | xw->work.alt_mods)); +#else + unsigned a_or_m = 0; +#endif + /* + * Start by limiting the result to the modifiers we might want to use. + */ + unsigned result = (state & (ControlMask + | ShiftMask + | a_or_m)); + + /* + * If modifyOtherKeys is off or medium (0 or 1), moderate its effects by + * excluding the common cases for modifiers. + */ + if (xw->keyboard.modify_now.other_keys <= 1) { + if (IsControlInput(kd) + && Masked(result, ControlMask) == 0) { + /* These keys are already associated with the control-key */ + if (xw->keyboard.modify_now.other_keys == 0) { + UIntClr(result, ControlMask); + } + } else if (kd->keysym == XK_Tab || kd->keysym == XK_Return) { + /* EMPTY */ ; + } else if (IsControlAlias(kd)) { + /* Things like "^_" work here... */ + if (Masked(result, (ControlMask | ShiftMask)) == 0) { + result = 0; + } + } else if (!IsControlOutput(kd) && !IsPredefinedKey(kd->keysym)) { + /* Printable keys are already associated with the shift-key */ + if (!(result & ControlMask)) { + UIntClr(result, ShiftMask); + } + } +#if OPT_NUM_LOCK + result = filterAltMeta(result, + xw->work.meta_mods, + TScreenOf(xw)->meta_sends_esc, kd); + if (TScreenOf(xw)->alt_is_not_meta) { + result = filterAltMeta(result, + xw->work.alt_mods, + TScreenOf(xw)->alt_sends_esc, kd); + } +#endif + } + TRACE(("...allowedCharModifiers(state=%u" FMT_MODIFIER_NAMES + ", ch=" KEYSYM_FMT ") ->" + "%u" FMT_MODIFIER_NAMES "\n", + state, ARG_MODIFIER_NAMES(state), kd->keysym, + result, ARG_MODIFIER_NAMES(result))); + return result; +} + +/* + * Decide if we should generate a special escape sequence for "other" keys + * than cursor-, function-keys, etc., as per the modifyOtherKeys resource. + */ +static Bool +ModifyOtherKeys(XtermWidget xw, + unsigned state, + KEY_DATA * kd, + unsigned modify_parm) +{ + TKeyboard *keyboard = &(xw->keyboard); + Bool result = False; + + /* + * Exclude the keys already covered by a modifier. + */ + if (kd->is_fkey + || IsEditFunctionKey(xw, kd->keysym) + || IsKeypadKey(kd->keysym) + || IsCursorKey(kd->keysym) + || IsPFKey(kd->keysym) + || IsMiscFunctionKey(kd->keysym) + || IsPrivateKeypadKey(kd->keysym)) { + result = False; + } else if (modify_parm != 0) { + if (IsBackarrowToggle(keyboard, kd->keysym, state)) { + kd->keysym = XK_Delete; + UIntClr(state, ControlMask); + } + if (!IsPredefinedKey(kd->keysym)) { + state = allowedCharModifiers(xw, state, kd); + } + if (state != 0) { + switch (keyboard->modify_now.other_keys) { + default: + break; + case 1: + switch (kd->keysym) { + case XK_BackSpace: + case XK_Delete: + result = False; + break; +#ifdef XK_ISO_Left_Tab + case XK_ISO_Left_Tab: + if (computeMaskedModifier(xw, state, ShiftMask)) + result = True; + break; +#endif + case XK_Return: + case XK_Tab: + result = (modify_parm != 0); + break; + default: + if (IsControlInput(kd)) { + if (state == ControlMask || state == ShiftMask) { + result = False; + } else { + result = (modify_parm != 0); + } + } else if (IsControlAlias(kd)) { + if (state == ShiftMask) + result = False; + else if (computeMaskedModifier(xw, state, ControlMask)) { + result = True; + } + } else { + result = True; + } + break; + } + break; + case 2: + switch (kd->keysym) { + case XK_BackSpace: + /* strip ControlMask as per IsBackarrowToggle() */ + if (computeMaskedModifier(xw, state, ControlMask)) + result = True; + break; + case XK_Delete: + result = (xtermStateToParam(xw, state) != 0); + break; +#ifdef XK_ISO_Left_Tab + case XK_ISO_Left_Tab: + if (computeMaskedModifier(xw, state, ShiftMask)) + result = True; + break; +#endif + case XK_Return: + case XK_Tab: + result = (modify_parm != 0); + break; + default: + if (IsControlInput(kd)) { + result = True; + } else if (state == ShiftMask) { + result = (kd->keysym == ' ' || kd->keysym == XK_Return); + } else if (computeMaskedModifier(xw, state, ShiftMask)) { + result = True; + } + break; + } + break; + } + } + } + TRACE(("...ModifyOtherKeys(%d,%d) %s\n", + keyboard->modify_now.other_keys, + modify_parm, + BtoS(result))); + return result; +} + +#define APPEND_PARM(number) \ + reply->a_param[reply->a_nparam] = (ParmType) number; \ + reply->a_nparam++ + +/* + * Function-key code 27 happens to not be used in the vt220-style encoding. + * xterm uses this to represent modified non-function-keys such as control/+ in + * the Sun/PC keyboard layout. See the modifyOtherKeys resource in the manpage + * for more information. + */ +static Bool +modifyOtherKey(ANSI *reply, int input_char, unsigned modify_parm, int format_keys) +{ + Bool result = False; + + if (input_char >= 0) { + reply->a_type = ANSI_CSI; + if (format_keys) { + APPEND_PARM(input_char); + APPEND_PARM(modify_parm); + reply->a_final = 'u'; + } else { + APPEND_PARM(27); + APPEND_PARM(modify_parm); + APPEND_PARM(input_char); + reply->a_final = '~'; + } + + result = True; + } + return result; +} + +static void +modifyCursorKey(ANSI *reply, int modify, unsigned *modify_parm) +{ + if (*modify_parm != 0) { + if (modify < 0) { + *modify_parm = 0; + } + if (modify > 0) { + reply->a_type = ANSI_CSI; /* SS3 should not have params */ + } + if (modify > 1 && reply->a_nparam == 0) { + APPEND_PARM(1); /* force modifier to 2nd param */ + } + if (modify > 2) { + reply->a_pintro = '>'; /* mark this as "private" */ + } + } +} +#else +#define modifyCursorKey(reply, modify, parm) /* nothing */ +#endif /* OPT_MOD_FKEYS */ + +#if OPT_SUNPC_KBD +/* + * If we have told xterm that our keyboard is really a Sun/PC keyboard, this is + * enough to make a reasonable approximation to DEC vt220 numeric and editing + * keypads. + */ +static KeySym +TranslateFromSUNPC(KeySym keysym) +{ + /* *INDENT-OFF* */ + static struct { + KeySym before, after; + } table[] = { +#ifdef DXK_Remove + { XK_Delete, DXK_Remove }, +#endif + { XK_Home, XK_Find }, + { XK_End, XK_Select }, +#ifdef XK_KP_Home + { XK_Delete, XK_KP_Decimal }, + { XK_KP_Delete, XK_KP_Decimal }, + { XK_KP_Insert, XK_KP_0 }, + { XK_KP_End, XK_KP_1 }, + { XK_KP_Down, XK_KP_2 }, + { XK_KP_Next, XK_KP_3 }, + { XK_KP_Left, XK_KP_4 }, + { XK_KP_Begin, XK_KP_5 }, + { XK_KP_Right, XK_KP_6 }, + { XK_KP_Home, XK_KP_7 }, + { XK_KP_Up, XK_KP_8 }, + { XK_KP_Prior, XK_KP_9 }, +#endif + }; + /* *INDENT-ON* */ + + unsigned n; + + for (n = 0; n < sizeof(table) / sizeof(table[0]); n++) { + if (table[n].before == keysym) { + TRACE(("...Input keypad before was " KEYSYM_FMT "\n", keysym)); + keysym = table[n].after; + TRACE(("...Input keypad changed to " KEYSYM_FMT "\n", keysym)); + break; + } + } + return keysym; +} +#endif /* OPT_SUNPC_KBD */ + +#define VT52_KEYPAD \ + if_OPT_VT52_MODE(screen,{ \ + reply.a_type = ANSI_ESC; \ + reply.a_pintro = '?'; \ + }) + +#define VT52_CURSOR_KEYS \ + if_OPT_VT52_MODE(screen,{ \ + reply.a_type = ANSI_ESC; \ + }) + +#undef APPEND_PARM +#define APPEND_PARM(number) \ + reply.a_param[reply.a_nparam] = (ParmType) number, \ + reply.a_nparam++ + +#if OPT_MOD_FKEYS +#define MODIFIER_PARM \ + if (modify_parm != 0) APPEND_PARM(modify_parm) +#else +#define MODIFIER_PARM /*nothing */ +#endif + +/* + * Determine if we use the \E[3~ sequence for Delete, or the legacy ^?. We + * maintain the delete_is_del value as 3 states: unspecified(2), true and + * false. If unspecified, it is handled differently according to whether the + * legacy keyboard support is enabled, or if xterm emulates a VT220. + * + * Once the user (or application) has specified delete_is_del via resource + * setting, popup menu or escape sequence, it overrides the keyboard type + * rather than the reverse. + */ +Bool +xtermDeleteIsDEL(XtermWidget xw) +{ + Bool result = True; + + if (xw->keyboard.type == keyboardIsDefault + || xw->keyboard.type == keyboardIsVT220) + result = (TScreenOf(xw)->delete_is_del == True); + + if (xw->keyboard.type == keyboardIsLegacy) + result = (TScreenOf(xw)->delete_is_del != False); + + TRACE(("xtermDeleteIsDEL(%d/%d) = %d\n", + xw->keyboard.type, + TScreenOf(xw)->delete_is_del, + result)); + + return result; +} + +static Boolean +lookupKeyData(KEY_DATA * kd, XtermWidget xw, XKeyEvent *event) +{ + TScreen *screen = TScreenOf(xw); + Boolean result = True; +#if OPT_INPUT_METHOD +#if OPT_MOD_FKEYS + TKeyboard *keyboard = &(xw->keyboard); +#endif +#endif + + (void) screen; + + TRACE(("%s %#x\n", visibleEventType(event->type), event->keycode)); + + kd->keysym = 0; + kd->is_fkey = False; +#if OPT_TCAP_QUERY + if (screen->tc_query_code >= 0) { + kd->keysym = (KeySym) screen->tc_query_code; + kd->is_fkey = screen->tc_query_fkey; + if (kd->keysym != XK_BackSpace) { + kd->nbytes = 0; + kd->strbuf[0] = 0; + } else { + kd->nbytes = 1; + kd->strbuf[0] = 8; + } + } else +#endif + { +#if OPT_INPUT_METHOD + TInput *input = lookupTInput(xw, (Widget) xw); + if (input && input->xic) { + Status status_return; +#if OPT_WIDE_CHARS + if (screen->utf8_mode) { + kd->nbytes = Xutf8LookupString(input->xic, event, + kd->strbuf, (int) sizeof(kd->strbuf), + &(kd->keysym), &status_return); + } else +#endif + { + kd->nbytes = XmbLookupString(input->xic, event, + kd->strbuf, (int) sizeof(kd->strbuf), + &(kd->keysym), &status_return); + } +#if OPT_MOD_FKEYS + /* + * Fill-in some code useful with IsControlAlias(): + */ + if (status_return == XLookupBoth + && kd->nbytes <= 1 + && !IsPredefinedKey(kd->keysym) + && (keyboard->modify_now.other_keys > 1) + && !IsControlInput(kd)) { + kd->nbytes = 1; + kd->strbuf[0] = (char) kd->keysym; + } +#endif /* OPT_MOD_FKEYS */ + } else +#endif /* OPT_INPUT_METHOD */ + { + static XComposeStatus compose_status = + {NULL, 0}; + kd->nbytes = XLookupString(event, + kd->strbuf, (int) sizeof(kd->strbuf), + &(kd->keysym), &compose_status); + } + kd->is_fkey = IsFunctionKey(kd->keysym); + } + return result; +} + +void +Input(XtermWidget xw, + XKeyEvent *event, + Bool eightbit) +{ + Char *string; + + TKeyboard *keyboard = &(xw->keyboard); + TScreen *screen = TScreenOf(xw); + + int j; + int key = False; + ANSI reply; + int dec_code; + unsigned modify_parm = 0; + int keypad_mode = ((keyboard->flags & MODE_DECKPAM) != 0); + unsigned evt_state = event->state; + unsigned mod_state; + KEY_DATA kd; + + /* Ignore characters typed at the keyboard */ + if (keyboard->flags & MODE_KAM) + return; + + lookupKeyData(&kd, xw, event); + + memset(&reply, 0, sizeof(reply)); + + TRACE(("Input(%d,%d) keysym " + KEYSYM_FMT + ", %d:'%s'%s" FMT_MODIFIER_NAMES "%s%s%s%s%s%s\n", + screen->cur_row, screen->cur_col, + kd.keysym, + kd.nbytes, + visibleChars((Char *) kd.strbuf, + ((kd.nbytes > 0) + ? (unsigned) kd.nbytes + : 0)), + ARG_MODIFIER_NAMES(evt_state), + eightbit ? " 8bit" : " 7bit", + IsKeypadKey(kd.keysym) ? " KeypadKey" : "", + IsCursorKey(kd.keysym) ? " CursorKey" : "", + IsPFKey(kd.keysym) ? " PFKey" : "", + kd.is_fkey ? " FKey" : "", + IsMiscFunctionKey(kd.keysym) ? " MiscFKey" : "", + IsEditFunctionKey(xw, kd.keysym) ? " EditFkey" : "")); + +#if OPT_SUNPC_KBD + /* + * DEC keyboards don't have keypad(+), but do have keypad(,) instead. + * Other (Sun, PC) keyboards commonly have keypad(+), but no keypad(,) + * - it's a pain for users to work around. + */ + if (keyboard->type == keyboardIsVT220 + && (evt_state & ShiftMask) == 0) { + if (kd.keysym == XK_KP_Add) { + kd.keysym = XK_KP_Separator; + UIntClr(evt_state, ShiftMask); + TRACE(("...Input keypad(+), change keysym to " + KEYSYM_FMT + "\n", + kd.keysym)); + } + if ((evt_state & ControlMask) != 0 + && kd.keysym == XK_KP_Separator) { + kd.keysym = XK_KP_Subtract; + UIntClr(evt_state, ControlMask); + TRACE(("...Input control/keypad(,), change keysym to " + KEYSYM_FMT + "\n", + kd.keysym)); + } + } +#endif + + /* + * The keyboard tables may give us different keypad codes according to + * whether NumLock is pressed. Use this check to simplify the process + * of determining whether we generate an escape sequence for a keypad + * key, or force it to the value kypd_num[]. There is no fixed + * modifier for this feature, so we assume that it is the one assigned + * to the NumLock key. + * + * This check used to try to return the contents of strbuf, but that + * does not work properly when a control modifier is given (trash is + * returned in the buffer in some cases -- perhaps an X bug). + */ +#if OPT_NUM_LOCK + if (kd.nbytes == 1 + && IsKeypadKey(kd.keysym) + && xw->misc.real_NumLock + && (xw->work.num_lock & evt_state) != 0) { + keypad_mode = 0; + TRACE(("...Input num_lock, force keypad_mode off\n")); + } +#endif + +#if OPT_MOD_FKEYS + if (evt_state != 0 + && allowModifierParm(xw, &kd)) { + modify_parm = xtermStateToParam(xw, evt_state); + } + + /* + * Shift-tab is often mapped to XK_ISO_Left_Tab which is classified as + * IsEditFunctionKey(), and the conversion does not produce any bytes. + * Check for this special case so we have data when handling the + * modifyOtherKeys resource. + */ + if (keyboard->modify_now.other_keys > 1) { + if (IsTabKey(kd.keysym) && kd.nbytes == 0) { + kd.nbytes = 1; + kd.strbuf[0] = '\t'; + } + } +#ifdef XK_ISO_Left_Tab + else if (IsTabKey(kd.keysym) + && kd.nbytes <= 1 + && modify_parm == (MOD_NONE + MOD_SHIFT)) { + kd.keysym = XK_ISO_Left_Tab; + } +#endif +#endif /* OPT_MOD_FKEYS */ + + /* VT300 & up: backarrow toggle */ + if ((kd.nbytes == 1) + && IsBackarrowToggle(keyboard, kd.keysym, evt_state)) { + kd.strbuf[0] = ANSI_DEL; + TRACE(("...Input backarrow changed to %d\n", kd.strbuf[0])); + } +#if OPT_SUNPC_KBD + /* make an DEC editing-keypad from a Sun or PC editing-keypad */ + if (keyboard->type == keyboardIsVT220 + && (kd.keysym != XK_Delete || !xtermDeleteIsDEL(xw))) + kd.keysym = TranslateFromSUNPC(kd.keysym); + else +#endif + { +#ifdef XK_KP_Home + if (kd.keysym >= XK_KP_Home && kd.keysym <= XK_KP_Begin) { + TRACE(("...Input keypad before was " KEYSYM_FMT "\n", kd.keysym)); + kd.keysym += (KeySym) (XK_Home - XK_KP_Home); + TRACE(("...Input keypad changed to " KEYSYM_FMT "\n", kd.keysym)); + } +#endif + } + + /* + * Map the Sun afterthought-keys in as F36 and F37. + */ +#ifdef SunXK_F36 + if (!kd.is_fkey) { + if (kd.keysym == SunXK_F36) { + kd.keysym = XK_Fn(36); + kd.is_fkey = True; + } + if (kd.keysym == SunXK_F37) { + kd.keysym = XK_Fn(37); + kd.is_fkey = True; + } + } +#endif + + /* + * Use the control- and shift-modifiers to obtain more function keys than + * the keyboard provides. We can do this if there is no conflicting use of + * those modifiers: + * + * a) for VT220 keyboard, we use only the control-modifier. The keyboard + * uses shift-modifier for UDK's. + * + * b) for non-VT220 keyboards, we only have to check if the + * modifyFunctionKeys resource is inactive. + * + * Thereafter, we note when we have a function-key and keep that + * distinction when testing for "function-key" values. + */ + if ((evt_state & (ControlMask | ShiftMask)) != 0 + && kd.is_fkey) { + + /* VT220 keyboard uses shift for UDK */ + if (keyboard->type == keyboardIsVT220 + || keyboard->type == keyboardIsLegacy) { + + TRACE(("...map XK_F%ld", kd.keysym - XK_Fn(1) + 1)); + if (evt_state & ControlMask) { + kd.keysym += (KeySym) xw->misc.ctrl_fkeys; + UIntClr(evt_state, ControlMask); + } + TRACE((" to XK_F%ld\n", kd.keysym - XK_Fn(1) + 1)); + + } +#if OPT_MOD_FKEYS + else if (keyboard->modify_now.function_keys < 0) { + + TRACE(("...map XK_F%ld", kd.keysym - XK_Fn(1) + 1)); + if (evt_state & ShiftMask) { + kd.keysym += (KeySym) (xw->misc.ctrl_fkeys * 1); + UIntClr(evt_state, ShiftMask); + } + if (evt_state & ControlMask) { + kd.keysym += (KeySym) (xw->misc.ctrl_fkeys * 2); + UIntClr(evt_state, ControlMask); + } + TRACE((" to XK_F%ld\n", kd.keysym - XK_Fn(1) + 1)); + + } + /* + * Reevaluate the modifier parameter, stripping off the modifiers + * that we just used. + */ + if (modify_parm) { + modify_parm = xtermStateToParam(xw, evt_state); + } +#endif /* OPT_MOD_FKEYS */ + } + + /* + * Test for one of the keyboard variants. + */ + switch (keyboard->type) { + case keyboardIsHP: + hpfuncvalue(&reply, &kd); + break; + case keyboardIsSCO: + scofuncvalue(&reply, &kd); + break; + case keyboardIsSun: + sunfuncvalue(&reply, &kd); + break; + case keyboardIsTermcap: +#if OPT_TCAP_FKEYS + if (xtermcapString(xw, (int) kd.keysym, evt_state)) + return; +#endif + break; + case keyboardIsDefault: + case keyboardIsLegacy: + case keyboardIsVT220: + break; + } + + if (reply.a_final) { + /* + * The key symbol matches one of the variants. Most of those are + * function-keys, though some cursor- and editing-keys are mixed in. + */ + modifyCursorKey(&reply, + ((kd.is_fkey + || IsMiscFunctionKey(kd.keysym) + || IsEditFunctionKey(xw, kd.keysym)) + ? keyboard->modify_now.function_keys + : keyboard->modify_now.cursor_keys), + &modify_parm); + MODIFIER_PARM; + unparseseq(xw, &reply); + } else if (((kd.is_fkey + || IsMiscFunctionKey(kd.keysym) + || IsEditFunctionKey(xw, kd.keysym)) +#if OPT_MOD_FKEYS + && !ModifyOtherKeys(xw, evt_state, &kd, modify_parm) +#endif + ) || (kd.keysym == XK_Delete + && ((modify_parm != 0) + || !xtermDeleteIsDEL(xw)))) { + dec_code = decfuncvalue(&kd); + if ((evt_state & ShiftMask) +#if OPT_SUNPC_KBD + && keyboard->type == keyboardIsVT220 +#endif + && ((string = (Char *) udk_lookup(xw, dec_code, &kd.nbytes)) != 0)) { + /* UIntClr(evt_state, ShiftMask); */ + while (kd.nbytes-- > 0) + unparseputc(xw, CharOf(*string++)); + } + /* + * Interpret F1-F4 as PF1-PF4 for VT52, VT100 + */ + else if (keyboard->type != keyboardIsLegacy + && (dec_code >= 11 && dec_code <= 14)) { + reply.a_type = ANSI_SS3; + VT52_CURSOR_KEYS; + reply.a_final = (Char) A2E(dec_code - 11 + E2A('P')); + modifyCursorKey(&reply, + keyboard->modify_now.function_keys, + &modify_parm); + MODIFIER_PARM; + unparseseq(xw, &reply); + } else { + reply.a_type = ANSI_CSI; + reply.a_final = 0; + +#ifdef XK_ISO_Left_Tab + if (kd.keysym == XK_ISO_Left_Tab) { + reply.a_nparam = 0; + reply.a_final = 'Z'; +#if OPT_MOD_FKEYS + if (keyboard->modify_now.other_keys > 1 + && computeMaskedModifier(xw, evt_state, ShiftMask)) + modifyOtherKey(&reply, '\t', modify_parm, keyboard->format_keys); +#endif + } else +#endif /* XK_ISO_Left_Tab */ + { + reply.a_nparam = 1; +#if OPT_MOD_FKEYS + if (kd.is_fkey) { + modifyCursorKey(&reply, + keyboard->modify_now.function_keys, + &modify_parm); + } + MODIFIER_PARM; +#endif + reply.a_param[0] = (ParmType) dec_code; + reply.a_final = '~'; + } + if (reply.a_final != 0 + && (reply.a_nparam == 0 || reply.a_param[0] >= 0)) + unparseseq(xw, &reply); + } + key = True; + } else if (IsPFKey(kd.keysym)) { + reply.a_type = ANSI_SS3; + reply.a_final = (Char) ((kd.keysym - XK_KP_F1) + 'P'); + VT52_CURSOR_KEYS; + MODIFIER_PARM; + unparseseq(xw, &reply); + key = True; + } else if (IsKeypadKey(kd.keysym)) { + if (keypad_mode) { + reply.a_type = ANSI_SS3; + reply.a_final = (Char) (kypd_apl[kd.keysym - XK_KP_Space]); + VT52_KEYPAD; + MODIFIER_PARM; + unparseseq(xw, &reply); + } else { + unparseputc(xw, kypd_num[kd.keysym - XK_KP_Space]); + } + key = True; + } else if (IsCursorKey(kd.keysym)) { + if (keyboard->flags & MODE_DECCKM) { + reply.a_type = ANSI_SS3; + } else { + reply.a_type = ANSI_CSI; + } + modifyCursorKey(&reply, keyboard->modify_now.cursor_keys, &modify_parm); + reply.a_final = (Char) (curfinal[kd.keysym - XK_Home]); + VT52_CURSOR_KEYS; + MODIFIER_PARM; + unparseseq(xw, &reply); + key = True; + } else if (kd.nbytes > 0) { + +#if OPT_TEK4014 + if (TEK4014_GIN(tekWidget)) { + TekEnqMouse(tekWidget, kd.strbuf[0]); + TekGINoff(tekWidget); + kd.nbytes--; + for (j = 0; j < kd.nbytes; ++j) { + kd.strbuf[j] = kd.strbuf[j + 1]; + } + } +#endif +#if OPT_MOD_FKEYS + if ((keyboard->modify_now.other_keys > 0) + && ModifyOtherKeys(xw, evt_state, &kd, modify_parm) + && (mod_state = allowedCharModifiers(xw, evt_state, &kd)) != 0) { + int input_char; + + evt_state = mod_state; + + modify_parm = xtermStateToParam(xw, evt_state); + + /* + * We want to show a keycode that corresponds to the 8-bit value + * of the key. If the keysym is less than 256, that is good + * enough. Special keys such as Tab may result in a value that + * is usable as well. For the latter (special cases), try to use + * the result from the X library lookup. + */ + input_char = ((kd.keysym < 256) + ? (int) kd.keysym + : ((kd.nbytes == 1) + ? CharOf(kd.strbuf[0]) + : -1)); + + TRACE(("...modifyOtherKeys %d;%d\n", modify_parm, input_char)); + if (modifyOtherKey(&reply, input_char, modify_parm, keyboard->format_keys)) { + unparseseq(xw, &reply); + } else { + Bell(xw, XkbBI_MinorError, 0); + } + } else +#endif /* OPT_MOD_FKEYS */ + { + int prefix = 0; + +#if OPT_NUM_LOCK + /* + * Send ESC if we have a META modifier and metaSendsEcape is true. + * Like eightBitInput, except that it is not associated with + * terminal settings. + */ + if (kd.nbytes != 0) { + if (screen->meta_sends_esc + && (evt_state & xw->work.meta_mods) != 0) { + TRACE(("...input-char is modified by META\n")); + UIntClr(evt_state, xw->work.meta_mods); + eightbit = False; + prefix = ANSI_ESC; + } else if (eightbit) { + /* it might be overridden, but this helps for debugging */ + TRACE(("...input-char is shifted by META\n")); + } + if (screen->alt_is_not_meta + && (evt_state & xw->work.alt_mods) != 0) { + UIntClr(evt_state, xw->work.alt_mods); + if (screen->alt_sends_esc) { + TRACE(("...input-char is modified by ALT\n")); + eightbit = False; + prefix = ANSI_ESC; + } else if (!eightbit) { + TRACE(("...input-char is shifted by ALT\n")); + eightbit = True; + } + } + } +#endif + /* + * If metaSendsEscape is false, fall through to this chunk, which + * implements the eightBitInput resource. + * + * It is normally executed when the user presses Meta plus a + * printable key, e.g., Meta+space. The presence of the Meta + * modifier is not guaranteed since what really happens is the + * "insert-eight-bit" or "insert-seven-bit" action, which we + * distinguish by the eightbit parameter to this function. So the + * eightBitInput resource really means that we use this shifting + * logic in the "insert-eight-bit" action. + */ + if (eightbit && (kd.nbytes == 1) && screen->input_eight_bits) { + IChar ch = CharOf(kd.strbuf[0]); + if ((ch < 128) && (screen->eight_bit_meta == ebTrue)) { + kd.strbuf[0] |= (char) 0x80; + TRACE(("...input shift from %d to %d (%#x to %#x)\n", + ch, CharOf(kd.strbuf[0]), + ch, CharOf(kd.strbuf[0]))); +#if OPT_WIDE_CHARS + if (screen->utf8_mode) { + /* + * We could interpret the incoming code as "in the + * current locale", but it's simpler to treat it as + * a Unicode value to translate to UTF-8. + */ + ch = CharOf(kd.strbuf[0]); + kd.nbytes = 2; + kd.strbuf[0] = (char) (0xc0 | ((ch >> 6) & 0x3)); + kd.strbuf[1] = (char) (0x80 | (ch & 0x3f)); + TRACE(("...encoded %#x in UTF-8 as %#x,%#x\n", + ch, CharOf(kd.strbuf[0]), CharOf(kd.strbuf[1]))); + } +#endif + } + eightbit = False; + } +#if OPT_WIDE_CHARS + if (kd.nbytes == 1) /* cannot do NRC on UTF-8, for instance */ +#endif + { + /* VT220 & up: National Replacement Characters */ + if ((xw->flags & NATIONAL) != 0) { + unsigned cmp = xtermCharSetIn(xw, + CharOf(kd.strbuf[0]), + (DECNRCM_codes) + screen->keyboard_dialect[0]); + TRACE(("...input NRC %d, %s %d\n", + CharOf(kd.strbuf[0]), + (CharOf(kd.strbuf[0]) == cmp) + ? "unchanged" + : "changed to", + CharOf(cmp))); + kd.strbuf[0] = (char) cmp; + } else if (eightbit) { + prefix = ANSI_ESC; + } else if (kd.strbuf[0] == '?' + && (evt_state & ControlMask) != 0) { + kd.strbuf[0] = ANSI_DEL; + } + } + if (prefix != 0) + unparseputc(xw, prefix); /* escape */ + for (j = 0; j < kd.nbytes; ++j) + unparseputc(xw, CharOf(kd.strbuf[j])); + } + key = ((kd.keysym != ANSI_XOFF) && (kd.keysym != ANSI_XON)); + } + unparse_end(xw); + + if (key && !TEK4014_ACTIVE(xw)) + AdjustAfterInput(xw); + + xtermShowPointer(xw, False); + return; +} + +void +StringInput(XtermWidget xw, const Char *string, size_t nbytes) +{ + TRACE(("InputString (%s,%lu)\n", + visibleChars(string, (unsigned) nbytes), + (unsigned long) nbytes)); +#if OPT_TEK4014 + if (nbytes && TEK4014_GIN(tekWidget)) { + TekEnqMouse(tekWidget, *string++); + TekGINoff(tekWidget); + nbytes--; + } +#endif + while (nbytes-- != 0) + unparseputc(xw, *string++); + if (!TEK4014_ACTIVE(xw)) + AdjustAfterInput(xw); + unparse_end(xw); +} + +/* These definitions are DEC-style (e.g., vt320) */ +static int +decfuncvalue(KEY_DATA * kd) +{ + int result; + + if (kd->is_fkey) { + switch (kd->keysym) { + MAP(XK_Fn(1), 11); + MAP(XK_Fn(2), 12); + MAP(XK_Fn(3), 13); + MAP(XK_Fn(4), 14); + MAP(XK_Fn(5), 15); + MAP(XK_Fn(6), 17); + MAP(XK_Fn(7), 18); + MAP(XK_Fn(8), 19); + MAP(XK_Fn(9), 20); + MAP(XK_Fn(10), 21); + MAP(XK_Fn(11), 23); + MAP(XK_Fn(12), 24); + MAP(XK_Fn(13), 25); + MAP(XK_Fn(14), 26); + MAP(XK_Fn(15), 28); + MAP(XK_Fn(16), 29); + MAP(XK_Fn(17), 31); + MAP(XK_Fn(18), 32); + MAP(XK_Fn(19), 33); + MAP(XK_Fn(20), 34); + default: + /* after F20 the codes are made up and do not correspond to any + * real terminal. So they are simply numbered sequentially. + */ + result = 42 + (int) (kd->keysym - XK_Fn(21)); + break; + } + } else { + switch (kd->keysym) { + MAP(XK_Find, 1); + MAP(XK_Insert, 2); + MAP(XK_Delete, 3); +#ifdef XK_KP_Insert + MAP(XK_KP_Insert, 2); + MAP(XK_KP_Delete, 3); +#endif +#ifdef DXK_Remove + MAP(DXK_Remove, 3); +#endif + MAP(XK_Select, 4); + MAP(XK_Prior, 5); + MAP(XK_Next, 6); +#ifdef XK_ISO_Left_Tab + MAP(XK_ISO_Left_Tab, 'Z'); +#endif + MAP(XK_Help, 28); + MAP(XK_Menu, 29); + default: + result = -1; + break; + } + } + return result; +} + +static void +hpfuncvalue(ANSI *reply, KEY_DATA * kd) +{ +#if OPT_HP_FUNC_KEYS + int result; + + if (kd->is_fkey) { + switch (kd->keysym) { + MAP(XK_Fn(1), 'p'); + MAP(XK_Fn(2), 'q'); + MAP(XK_Fn(3), 'r'); + MAP(XK_Fn(4), 's'); + MAP(XK_Fn(5), 't'); + MAP(XK_Fn(6), 'u'); + MAP(XK_Fn(7), 'v'); + MAP(XK_Fn(8), 'w'); + default: + result = -1; + break; + } + } else { + switch (kd->keysym) { + MAP(XK_Up, 'A'); + MAP(XK_Down, 'B'); + MAP(XK_Right, 'C'); + MAP(XK_Left, 'D'); + MAP(XK_End, 'F'); + MAP(XK_Clear, 'J'); + MAP(XK_Delete, 'P'); + MAP(XK_Insert, 'Q'); + MAP(XK_Next, 'S'); + MAP(XK_Prior, 'T'); + MAP(XK_Home, 'h'); +#ifdef XK_KP_Insert + MAP(XK_KP_Delete, 'P'); + MAP(XK_KP_Insert, 'Q'); +#endif +#ifdef DXK_Remove + MAP(DXK_Remove, 'P'); +#endif + MAP(XK_Select, 'F'); + MAP(XK_Find, 'h'); + default: + result = -1; + break; + } + } + if (result > 0) { + reply->a_type = ANSI_ESC; + reply->a_final = (Char) result; + } +#else + (void) reply; + (void) kd; +#endif /* OPT_HP_FUNC_KEYS */ +} + +static void +scofuncvalue(ANSI *reply, KEY_DATA * kd) +{ +#if OPT_SCO_FUNC_KEYS + int result; + + if (kd->is_fkey) { + switch (kd->keysym) { + MAP(XK_Fn(1), 'M'); + MAP(XK_Fn(2), 'N'); + MAP(XK_Fn(3), 'O'); + MAP(XK_Fn(4), 'P'); + MAP(XK_Fn(5), 'Q'); + MAP(XK_Fn(6), 'R'); + MAP(XK_Fn(7), 'S'); + MAP(XK_Fn(8), 'T'); + MAP(XK_Fn(9), 'U'); + MAP(XK_Fn(10), 'V'); + MAP(XK_Fn(11), 'W'); + MAP(XK_Fn(12), 'X'); + MAP(XK_Fn(13), 'Y'); + MAP(XK_Fn(14), 'Z'); + MAP(XK_Fn(15), 'a'); + MAP(XK_Fn(16), 'b'); + MAP(XK_Fn(17), 'c'); + MAP(XK_Fn(18), 'd'); + MAP(XK_Fn(19), 'e'); + MAP(XK_Fn(20), 'f'); + MAP(XK_Fn(21), 'g'); + MAP(XK_Fn(22), 'h'); + MAP(XK_Fn(23), 'i'); + MAP(XK_Fn(24), 'j'); + MAP(XK_Fn(25), 'k'); + MAP(XK_Fn(26), 'l'); + MAP(XK_Fn(27), 'm'); + MAP(XK_Fn(28), 'n'); + MAP(XK_Fn(29), 'o'); + MAP(XK_Fn(30), 'p'); + MAP(XK_Fn(31), 'q'); + MAP(XK_Fn(32), 'r'); + MAP(XK_Fn(33), 's'); + MAP(XK_Fn(34), 't'); + MAP(XK_Fn(35), 'u'); + MAP(XK_Fn(36), 'v'); + MAP(XK_Fn(37), 'w'); + MAP(XK_Fn(38), 'x'); + MAP(XK_Fn(39), 'y'); + MAP(XK_Fn(40), 'z'); + MAP(XK_Fn(41), '@'); + MAP(XK_Fn(42), '['); + MAP(XK_Fn(43), '\\'); + MAP(XK_Fn(44), ']'); + MAP(XK_Fn(45), '^'); + MAP(XK_Fn(46), '_'); + MAP(XK_Fn(47), '`'); + MAP(XK_Fn(48), L_CURL); + default: + result = -1; + break; + } + } else { + switch (kd->keysym) { + MAP(XK_Up, 'A'); + MAP(XK_Down, 'B'); + MAP(XK_Right, 'C'); + MAP(XK_Left, 'D'); + MAP(XK_Begin, 'E'); + MAP(XK_End, 'F'); + MAP(XK_Insert, 'L'); + MAP(XK_Next, 'G'); + MAP(XK_Prior, 'I'); + MAP(XK_Home, 'H'); +#ifdef XK_KP_Insert + MAP(XK_KP_Insert, 'L'); +#endif + default: + result = -1; + break; + } + } + if (result > 0) { + reply->a_type = ANSI_CSI; + reply->a_final = (Char) result; + } +#else + (void) reply; + (void) kd; +#endif /* OPT_SCO_FUNC_KEYS */ +} + +static void +sunfuncvalue(ANSI *reply, KEY_DATA * kd) +{ +#if OPT_SUN_FUNC_KEYS + ParmType result; + + if (kd->is_fkey) { + switch (kd->keysym) { + /* kf1-kf20 are numbered sequentially */ + MAP(XK_Fn(1), 224); + MAP(XK_Fn(2), 225); + MAP(XK_Fn(3), 226); + MAP(XK_Fn(4), 227); + MAP(XK_Fn(5), 228); + MAP(XK_Fn(6), 229); + MAP(XK_Fn(7), 230); + MAP(XK_Fn(8), 231); + MAP(XK_Fn(9), 232); + MAP(XK_Fn(10), 233); + MAP(XK_Fn(11), 192); + MAP(XK_Fn(12), 193); + MAP(XK_Fn(13), 194); + MAP(XK_Fn(14), 195); /* kund */ + MAP(XK_Fn(15), 196); + MAP(XK_Fn(16), 197); /* kcpy */ + MAP(XK_Fn(17), 198); + MAP(XK_Fn(18), 199); + MAP(XK_Fn(19), 200); /* kfnd */ + MAP(XK_Fn(20), 201); + + /* kf31-kf36 are numbered sequentially */ + MAP(XK_Fn(21), 208); /* kf31 */ + MAP(XK_Fn(22), 209); + MAP(XK_Fn(23), 210); + MAP(XK_Fn(24), 211); + MAP(XK_Fn(25), 212); + MAP(XK_Fn(26), 213); /* kf36 */ + + /* kf37-kf47 are interspersed with keypad keys */ + MAP(XK_Fn(27), 214); /* khome */ + MAP(XK_Fn(28), 215); /* kf38 */ + MAP(XK_Fn(29), 216); /* kpp */ + MAP(XK_Fn(30), 217); /* kf40 */ + MAP(XK_Fn(31), 218); /* kb2 */ + MAP(XK_Fn(32), 219); /* kf42 */ + MAP(XK_Fn(33), 220); /* kend */ + MAP(XK_Fn(34), 221); /* kf44 */ + MAP(XK_Fn(35), 222); /* knp */ + MAP(XK_Fn(36), 234); /* kf46 */ + MAP(XK_Fn(37), 235); /* kf47 */ + default: + result = -1; + break; + } + } else { + switch (kd->keysym) { + MAP(XK_Help, 196); /* khlp */ + MAP(XK_Menu, 197); + + MAP(XK_Find, 1); + MAP(XK_Insert, 2); /* kich1 */ + MAP(XK_Delete, 3); +#ifdef XK_KP_Insert + MAP(XK_KP_Insert, 2); + MAP(XK_KP_Delete, 3); +#endif +#ifdef DXK_Remove + MAP(DXK_Remove, 3); +#endif + MAP(XK_Select, 4); + + MAP(XK_Prior, 216); + MAP(XK_Next, 222); + MAP(XK_Home, 214); + MAP(XK_End, 220); + MAP(XK_Begin, 218); /* kf41=kb2 */ + + default: + result = -1; + break; + } + } + if (result > 0) { + reply->a_type = ANSI_CSI; + reply->a_nparam = 1; + reply->a_param[0] = result; + reply->a_final = 'z'; + } else if (IsCursorKey(kd->keysym)) { + reply->a_type = ANSI_SS3; + reply->a_final = (Char) curfinal[kd->keysym - XK_Home]; + } +#else + (void) reply; + (void) kd; +#endif /* OPT_SUN_FUNC_KEYS */ +} + +#if OPT_NUM_LOCK +#define isName(c) ((c) == '_' || (c) == '-' || isalnum(CharOf(c))) + +static const char * +skipName(const char *s) +{ + while (*s != '\0' && isName(CharOf(*s))) + ++s; + return s; +} + +/* + * Found a ":" in a translation, check what is past it to see if it contains + * any of the insert-text action names. + */ +static Boolean +keyCanInsert(const char *parse) +{ + Boolean result = False; + Boolean escape = False; + Boolean quoted = False; + + static const char *const table[] = + { + "insert", + "insert-seven-bit", + "insert-eight-bit", + "string", + }; + Cardinal n; + + while (*parse != '\0' && *parse != '\n') { + int ch = CharOf(*parse++); + if (escape) { + escape = False; + } else if (ch == '\\') { + escape = True; + } else if (ch == '"') { + quoted = (Boolean) !quoted; + } else if (!quoted && isName(ch)) { + const char *next = skipName(--parse); + size_t need = (size_t) (next - parse); + + for (n = 0; n < XtNumber(table); ++n) { + if (need == strlen(table[n]) + && !strncmp(parse, table[n], need)) { + result = True; + break; + } + } + parse = next; + } + + } + return result; +} + +/* + * Strip the entire action, to avoid matching it. + */ +static char * +stripAction(char *base, char *last) +{ + while (last != base) { + if (*--last == '\n') { + break; + } + } + return last; +} + +static char * +stripBlanks(char *base, char *last) +{ + while (last != base) { + int ch = CharOf(last[-1]); + if (ch != ' ' && ch != '\t') + break; + --last; + } + return last; +} + +/* + * Strip unneeded whitespace from a translations resource, mono-casing and + * returning a malloc'd copy of the result. + */ +static char * +stripTranslations(const char *s, Bool onlyInsert) +{ + char *dst = 0; + + if (s != 0) { + dst = TypeMallocN(char, strlen(s) + 1); + + if (dst != 0) { + int state = 0; + int prv = 0; + char *d = dst; + + TRACE(("stripping:\n%s\n", s)); + while (*s != '\0') { + int ch = *s++; + if (ch == '\n') { + if (d != dst) + *d++ = (char) ch; + state = 0; + } else if (strchr(":!#", ch) != 0) { + d = stripBlanks(dst, d); + if (onlyInsert && (ch == ':') && !keyCanInsert(s)) { + d = stripAction(dst, d); + } + state = -1; + } else if (state >= 0) { + if (isspace(CharOf(ch))) { + if (state == 0 || strchr("<>~ \t", prv)) + continue; + } else if (strchr("<>~", ch)) { + d = stripBlanks(dst, d); + } + *d++ = x_toupper(ch); + ++state; + } + prv = ch; + } + *d = '\0'; + TRACE(("...result:\n%s\n", dst)); + } + } + return dst; +} + +/* + * Make a simple check to see if a given translations keyword appears in + * xterm's translations resource. It does not attempt to parse the strings, + * just makes a case-independent check and ensures that the ends of the match + * are on token-boundaries. + * + * That this can only retrieve translations that are given as resource values; + * the default translations in charproc.c for example are not retrievable by + * any interface to X. + * + * Also: We can retrieve only the most-specified translation resource. For + * example, if the resource file specifies both "*translations" and + * "XTerm*translations", we see only the latter. + */ +static Bool +TranslationsUseKeyword(Widget w, char **cache, const char *keyword, Bool onlyInsert) +{ + Bool result = False; + char *copy; + char *test; + + if ((test = stripTranslations(keyword, onlyInsert)) != 0) { + if (*cache == 0) { + String data = 0; + getKeymapResources(w, "vt100", "VT100", XtRString, &data, sizeof(data)); + if (data != 0 && (copy = stripTranslations(data, onlyInsert)) != 0) { + *cache = copy; + } + } + + if (*cache != 0) { + char *p = *cache; + int state = 0; + int now = ' '; + + while (*p != 0) { + int prv = now; + now = *p++; + if (now == ':' + || now == '!') { + state = -1; + } else if (now == '\n') { + state = 0; + } else if (state >= 0) { + if (now == test[state]) { + if ((state != 0 + || !isName(prv)) + && ((test[++state] == 0) + && !isName(*p))) { + result = True; + break; + } + } else { + state = 0; + } + } + } + } + free(test); + } + TRACE(("TranslationsUseKeyword(%p, %s) = %d\n", + (void *) w, keyword, result)); + return result; +} + +static Bool +xtermHasTranslation(XtermWidget xw, const char *keyword, Bool onlyInsert) +{ + return (TranslationsUseKeyword(SHELL_OF(xw), + &(xw->keyboard.shell_translations), + keyword, + onlyInsert) + || TranslationsUseKeyword((Widget) xw, + &(xw->keyboard.xterm_translations), + keyword, + onlyInsert)); +} + +#if OPT_EXTRA_PASTE +static void +addTranslation(XtermWidget xw, const char *fromString, const char *toString) +{ + size_t have = (xw->keyboard.extra_translations + ? strlen(xw->keyboard.extra_translations) + : 0); + size_t need = (((have != 0) ? (have + 4) : 0) + + strlen(fromString) + + strlen(toString) + + 6); + + if (!xtermHasTranslation(xw, fromString, False)) { + xw->keyboard.extra_translations + = TypeRealloc(char, need, xw->keyboard.extra_translations); + if ((xw->keyboard.extra_translations) != 0) { + TRACE(("adding %s: %s\n", fromString, toString)); + if (have) + strcat(xw->keyboard.extra_translations, " \\n\\"); + sprintf(xw->keyboard.extra_translations, "%s: %s", + fromString, toString); + TRACE(("...{%s}\n", xw->keyboard.extra_translations)); + } + } +} +#endif + +#define SaveMask(name) xw->work.name |= (unsigned) mask;\ + TRACE(("SaveMask(%#x -> %s) %#x (%#x is%s modifier)\n", \ + (unsigned) keysym, #name, \ + xw->work.name, (unsigned) mask, \ + ModifierName((unsigned) mask))); +/* + * Determine which modifier mask (if any) applies to the Num_Lock keysym. + * + * Also, determine which modifiers are associated with the ALT keys, so we can + * send that information as a parameter for special keys in Sun/PC keyboard + * mode. However, if the ALT modifier is used in translations, we do not want + * to confuse things by sending the parameter. + */ +void +VTInitModifiers(XtermWidget xw) +{ + Display *dpy = XtDisplay(xw); + XModifierKeymap *keymap = XGetModifierMapping(dpy); + KeySym keysym; + int min_keycode, max_keycode, keysyms_per_keycode = 0; + + if (keymap != 0) { + KeySym *theMap; + int keycode_count; + + TRACE(("VTInitModifiers\n")); + + XDisplayKeycodes(dpy, &min_keycode, &max_keycode); + keycode_count = (max_keycode - min_keycode + 1); + theMap = XGetKeyboardMapping(dpy, + (KeyCode) min_keycode, + keycode_count, + &keysyms_per_keycode); + + if (theMap != 0) { + int i, j, k, l; + unsigned long mask; + +#if OPT_EXTRA_PASTE + /* + * Assume that if we can find the paste keysym in the X keyboard + * mapping that the server allows the corresponding translations + * resource. + */ + int limit = (max_keycode - min_keycode) * keysyms_per_keycode; + for (i = 0; i < limit; ++i) { +#ifdef XF86XK_Paste + if (theMap[i] == XF86XK_Paste) { + TRACE(("keyboard has XF86XK_Paste\n")); + addTranslation(xw, + ": XF86Paste", + "insert-selection(SELECT, CUT_BUFFER0)"); + } +#endif +#ifdef SunXK_Paste + if (theMap[i] == SunXK_Paste) { + TRACE(("keyboard has SunXK_Paste\n")); + addTranslation(xw, + ": SunPaste", + "insert-selection(SELECT, CUT_BUFFER0)"); + } +#endif + } +#endif /* OPT_EXTRA_PASTE */ + + for (i = k = 0, mask = 1; i < 8; i++, mask <<= 1) { + for (j = 0; j < keymap->max_keypermod; j++) { + KeyCode code = keymap->modifiermap[k++]; + if (code == 0) + continue; + + for (l = 0; l < keysyms_per_keycode; ++l) { +#ifdef HAVE_XKBKEYCODETOKEYSYM + keysym = XkbKeycodeToKeysym(dpy, code, 0, l); +#else + keysym = XKeycodeToKeysym(dpy, code, l); +#endif + if (keysym == NoSymbol) { + /* EMPTY */ ; + } else if (keysym == XK_Num_Lock) { + SaveMask(num_lock); + } else if (keysym == XK_Alt_L || keysym == XK_Alt_R) { + SaveMask(alt_mods); + } else if (keysym == XK_Meta_L || keysym == XK_Meta_R) { + SaveMask(meta_mods); + } + } + } + } + XFree(theMap); + } + + /* Don't disable any mods if "alwaysUseMods" is true. */ + if (!xw->misc.alwaysUseMods) { + + /* + * Force TranslationsUseKeyword() to reload. + */ + if (xw->keyboard.shell_translations) { + free(xw->keyboard.shell_translations); + xw->keyboard.shell_translations = 0; + } + if (xw->keyboard.xterm_translations) { + free(xw->keyboard.xterm_translations); + xw->keyboard.xterm_translations = 0; + } + + /* + * If the Alt modifier is used in translations, we would rather not + * use it to modify function-keys when NumLock is active. + */ + if ((xw->work.alt_mods != 0) + && xtermHasTranslation(xw, "alt", True)) { + TRACE(("ALT is used as a modifier in translations (ignore mask)\n")); + xw->work.alt_mods = 0; + } + + /* + * If the Meta modifier is used in translations, we would rather not + * use it to modify function-keys. + */ + if ((xw->work.meta_mods != 0) + && xtermHasTranslation(xw, "meta", True)) { + TRACE(("META is used as a modifier in translations\n")); + xw->work.meta_mods = 0; + } + } + + XFreeModifiermap(keymap); + } +} +#endif /* OPT_NUM_LOCK */ diff --git a/ports/xterm/xterm-359/input.o b/ports/xterm/xterm-359/input.o new file mode 100644 index 0000000000000000000000000000000000000000..b23faad4a2124c3b696fb07a6a0fc37c0b8bb069 GIT binary patch literal 116024 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 LFUYHgV5;sfO1UBU literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/install-sh b/ports/xterm/xterm-359/install-sh new file mode 100755 index 0000000..462fa9c --- /dev/null +++ b/ports/xterm/xterm-359/install-sh @@ -0,0 +1,294 @@ +#! /bin/sh +# +# install - install a program, script, or datafile +# +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd=$cpprog + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "$0: no input file specified" >&2 + exit 1 +else + : +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d "$dst" ]; then + instcmd=: + chmodcmd="" + else + instcmd=$mkdirprog + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f "$src" ] || [ -d "$src" ] + then + : + else + echo "$0: $src does not exist" >&2 + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "$0: no destination specified" >&2 + exit 1 + else + : + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d "$dst" ] + then + dst=$dst/`basename "$src"` + else + : + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' + ' +IFS="${IFS-$defaultIFS}" + +oIFS=$IFS +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS=$oIFS + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp=$pathcomp$1 + shift + + if [ ! -d "$pathcomp" ] ; + then + $mkdirprog "$pathcomp" + else + : + fi + + pathcomp=$pathcomp/ +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd "$dst" && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename "$dst"` + else + dstfile=`basename "$dst" $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename "$dst"` + else + : + fi + +# Make a couple of temp file names in the proper directory. + + dsttmp=$dstdir/#inst.$$# + rmtmp=$dstdir/#rm.$$# + +# Trap to clean up temp files at exit. + + trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 + +# Move or copy the file name to the temp name + + $doit $instcmd "$src" "$dsttmp" && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi && + +# Now remove or move aside any old file at destination location. We try this +# two ways since rm can't unlink itself on some systems and the destination +# file might be busy for other reasons. In this case, the final cleanup +# might fail but the new file should still install successfully. + +{ + if [ -f "$dstdir/$dstfile" ] + then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null || + $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null || + { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit + } + else + : + fi +} && + +# Now rename the file to the real destination. + + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + +fi && + +# The final little trick to "correctly" pass the exit status to the exit trap. + +{ + (exit 0); exit +} diff --git a/ports/xterm/xterm-359/keysym2ucs.c b/ports/xterm/xterm-359/keysym2ucs.c new file mode 100644 index 0000000..2ea5acd --- /dev/null +++ b/ports/xterm/xterm-359/keysym2ucs.c @@ -0,0 +1,871 @@ +/* $XTermId: keysym2ucs.c,v 1.19 2018/09/09 17:35:05 tom Exp $ + * This module converts keysym values into the corresponding ISO 10646 + * (UCS, Unicode) values. + * + * The array keysymtab[] contains pairs of X11 keysym values for graphical + * characters and the corresponding Unicode value. The function + * keysym2ucs() maps a keysym onto a Unicode value using a binary search, + * therefore keysymtab[] must remain SORTED by keysym value. + * + * The keysym -> UTF-8 conversion will hopefully one day be provided + * by Xlib via XmbLookupString() and should ideally not have to be + * done in X applications. But we are not there yet. + * + * We allow to represent any UCS character in the range U-00000000 to + * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff. + * This admittedly does not cover the entire 31-bit space of UCS, but + * it does cover all of the characters up to U-10FFFF, which can be + * represented by UTF-16, and more, and it is very unlikely that higher + * UCS codes will ever be assigned by ISO. So to get Unicode character + * U+ABCD you can directly use keysym 0x0100abcd. + * + * NOTE: The comments in the table below contain the actual character + * encoded in UTF-8, so for viewing and editing best use an editor in + * UTF-8 mode. + * + * Author: Markus G. Kuhn , University of Cambridge, April 2001 + * + * Special thanks to Richard Verhoeven for preparing + * an initial draft of the mapping table. + * + * This software is in the public domain. Share and enjoy! + * + * AUTOMATICALLY GENERATED FILE, DO NOT EDIT !!! (unicode/convmap.pl) + */ + +#ifndef KEYSYM2UCS_INCLUDED + +#include "keysym2ucs.h" +#define VISIBLE /* */ + +#else + +#define VISIBLE static + +#endif + +static struct codepair { + unsigned short keysym; + unsigned short ucs; +} keysymtab[] = { + { 0x01a1, 0x0104 }, /* Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */ + { 0x01a2, 0x02d8 }, /* breve ˘ BREVE */ + { 0x01a3, 0x0141 }, /* Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */ + { 0x01a5, 0x013d }, /* Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */ + { 0x01a6, 0x015a }, /* Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */ + { 0x01a9, 0x0160 }, /* Scaron Š LATIN CAPITAL LETTER S WITH CARON */ + { 0x01aa, 0x015e }, /* Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */ + { 0x01ab, 0x0164 }, /* Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */ + { 0x01ac, 0x0179 }, /* Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */ + { 0x01ae, 0x017d }, /* Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */ + { 0x01af, 0x017b }, /* Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */ + { 0x01b1, 0x0105 }, /* aogonek ą LATIN SMALL LETTER A WITH OGONEK */ + { 0x01b2, 0x02db }, /* ogonek ˛ OGONEK */ + { 0x01b3, 0x0142 }, /* lstroke ł LATIN SMALL LETTER L WITH STROKE */ + { 0x01b5, 0x013e }, /* lcaron ľ LATIN SMALL LETTER L WITH CARON */ + { 0x01b6, 0x015b }, /* sacute ś LATIN SMALL LETTER S WITH ACUTE */ + { 0x01b7, 0x02c7 }, /* caron ˇ CARON */ + { 0x01b9, 0x0161 }, /* scaron š LATIN SMALL LETTER S WITH CARON */ + { 0x01ba, 0x015f }, /* scedilla ş LATIN SMALL LETTER S WITH CEDILLA */ + { 0x01bb, 0x0165 }, /* tcaron ť LATIN SMALL LETTER T WITH CARON */ + { 0x01bc, 0x017a }, /* zacute ź LATIN SMALL LETTER Z WITH ACUTE */ + { 0x01bd, 0x02dd }, /* doubleacute ˝ DOUBLE ACUTE ACCENT */ + { 0x01be, 0x017e }, /* zcaron ž LATIN SMALL LETTER Z WITH CARON */ + { 0x01bf, 0x017c }, /* zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */ + { 0x01c0, 0x0154 }, /* Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */ + { 0x01c3, 0x0102 }, /* Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */ + { 0x01c5, 0x0139 }, /* Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */ + { 0x01c6, 0x0106 }, /* Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */ + { 0x01c8, 0x010c }, /* Ccaron Č LATIN CAPITAL LETTER C WITH CARON */ + { 0x01ca, 0x0118 }, /* Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */ + { 0x01cc, 0x011a }, /* Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */ + { 0x01cf, 0x010e }, /* Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */ + { 0x01d0, 0x0110 }, /* Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */ + { 0x01d1, 0x0143 }, /* Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */ + { 0x01d2, 0x0147 }, /* Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */ + { 0x01d5, 0x0150 }, /* Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */ + { 0x01d8, 0x0158 }, /* Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */ + { 0x01d9, 0x016e }, /* Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */ + { 0x01db, 0x0170 }, /* Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */ + { 0x01de, 0x0162 }, /* Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */ + { 0x01e0, 0x0155 }, /* racute ŕ LATIN SMALL LETTER R WITH ACUTE */ + { 0x01e3, 0x0103 }, /* abreve ă LATIN SMALL LETTER A WITH BREVE */ + { 0x01e5, 0x013a }, /* lacute ĺ LATIN SMALL LETTER L WITH ACUTE */ + { 0x01e6, 0x0107 }, /* cacute ć LATIN SMALL LETTER C WITH ACUTE */ + { 0x01e8, 0x010d }, /* ccaron č LATIN SMALL LETTER C WITH CARON */ + { 0x01ea, 0x0119 }, /* eogonek ę LATIN SMALL LETTER E WITH OGONEK */ + { 0x01ec, 0x011b }, /* ecaron ě LATIN SMALL LETTER E WITH CARON */ + { 0x01ef, 0x010f }, /* dcaron ď LATIN SMALL LETTER D WITH CARON */ + { 0x01f0, 0x0111 }, /* dstroke đ LATIN SMALL LETTER D WITH STROKE */ + { 0x01f1, 0x0144 }, /* nacute ń LATIN SMALL LETTER N WITH ACUTE */ + { 0x01f2, 0x0148 }, /* ncaron ň LATIN SMALL LETTER N WITH CARON */ + { 0x01f5, 0x0151 }, /* odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */ + { 0x01f8, 0x0159 }, /* rcaron ř LATIN SMALL LETTER R WITH CARON */ + { 0x01f9, 0x016f }, /* uring ů LATIN SMALL LETTER U WITH RING ABOVE */ + { 0x01fb, 0x0171 }, /* udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */ + { 0x01fe, 0x0163 }, /* tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */ + { 0x01ff, 0x02d9 }, /* abovedot ˙ DOT ABOVE */ + { 0x02a1, 0x0126 }, /* Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */ + { 0x02a6, 0x0124 }, /* Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */ + { 0x02a9, 0x0130 }, /* Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */ + { 0x02ab, 0x011e }, /* Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */ + { 0x02ac, 0x0134 }, /* Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */ + { 0x02b1, 0x0127 }, /* hstroke ħ LATIN SMALL LETTER H WITH STROKE */ + { 0x02b6, 0x0125 }, /* hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */ + { 0x02b9, 0x0131 }, /* idotless ı LATIN SMALL LETTER DOTLESS I */ + { 0x02bb, 0x011f }, /* gbreve ğ LATIN SMALL LETTER G WITH BREVE */ + { 0x02bc, 0x0135 }, /* jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */ + { 0x02c5, 0x010a }, /* Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */ + { 0x02c6, 0x0108 }, /* Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */ + { 0x02d5, 0x0120 }, /* Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */ + { 0x02d8, 0x011c }, /* Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */ + { 0x02dd, 0x016c }, /* Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */ + { 0x02de, 0x015c }, /* Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */ + { 0x02e5, 0x010b }, /* cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */ + { 0x02e6, 0x0109 }, /* ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */ + { 0x02f5, 0x0121 }, /* gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */ + { 0x02f8, 0x011d }, /* gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */ + { 0x02fd, 0x016d }, /* ubreve ŭ LATIN SMALL LETTER U WITH BREVE */ + { 0x02fe, 0x015d }, /* scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */ + { 0x03a2, 0x0138 }, /* kra ĸ LATIN SMALL LETTER KRA */ + { 0x03a3, 0x0156 }, /* Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */ + { 0x03a5, 0x0128 }, /* Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */ + { 0x03a6, 0x013b }, /* Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */ + { 0x03aa, 0x0112 }, /* Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */ + { 0x03ab, 0x0122 }, /* Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */ + { 0x03ac, 0x0166 }, /* Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */ + { 0x03b3, 0x0157 }, /* rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */ + { 0x03b5, 0x0129 }, /* itilde ĩ LATIN SMALL LETTER I WITH TILDE */ + { 0x03b6, 0x013c }, /* lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */ + { 0x03ba, 0x0113 }, /* emacron ē LATIN SMALL LETTER E WITH MACRON */ + { 0x03bb, 0x0123 }, /* gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */ + { 0x03bc, 0x0167 }, /* tslash ŧ LATIN SMALL LETTER T WITH STROKE */ + { 0x03bd, 0x014a }, /* ENG Ŋ LATIN CAPITAL LETTER ENG */ + { 0x03bf, 0x014b }, /* eng ŋ LATIN SMALL LETTER ENG */ + { 0x03c0, 0x0100 }, /* Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */ + { 0x03c7, 0x012e }, /* Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */ + { 0x03cc, 0x0116 }, /* Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */ + { 0x03cf, 0x012a }, /* Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */ + { 0x03d1, 0x0145 }, /* Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */ + { 0x03d2, 0x014c }, /* Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */ + { 0x03d3, 0x0136 }, /* Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */ + { 0x03d9, 0x0172 }, /* Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */ + { 0x03dd, 0x0168 }, /* Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */ + { 0x03de, 0x016a }, /* Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */ + { 0x03e0, 0x0101 }, /* amacron ā LATIN SMALL LETTER A WITH MACRON */ + { 0x03e7, 0x012f }, /* iogonek į LATIN SMALL LETTER I WITH OGONEK */ + { 0x03ec, 0x0117 }, /* eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */ + { 0x03ef, 0x012b }, /* imacron ī LATIN SMALL LETTER I WITH MACRON */ + { 0x03f1, 0x0146 }, /* ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */ + { 0x03f2, 0x014d }, /* omacron ō LATIN SMALL LETTER O WITH MACRON */ + { 0x03f3, 0x0137 }, /* kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */ + { 0x03f9, 0x0173 }, /* uogonek ų LATIN SMALL LETTER U WITH OGONEK */ + { 0x03fd, 0x0169 }, /* utilde ũ LATIN SMALL LETTER U WITH TILDE */ + { 0x03fe, 0x016b }, /* umacron ū LATIN SMALL LETTER U WITH MACRON */ + { 0x047e, 0x203e }, /* overline ‾ OVERLINE */ + { 0x04a1, 0x3002 }, /* kana_fullstop 。 IDEOGRAPHIC FULL STOP */ + { 0x04a2, 0x300c }, /* kana_openingbracket 「 LEFT CORNER BRACKET */ + { 0x04a3, 0x300d }, /* kana_closingbracket 」 RIGHT CORNER BRACKET */ + { 0x04a4, 0x3001 }, /* kana_comma 、 IDEOGRAPHIC COMMA */ + { 0x04a5, 0x30fb }, /* kana_conjunctive ・ KATAKANA MIDDLE DOT */ + { 0x04a6, 0x30f2 }, /* kana_WO ヲ KATAKANA LETTER WO */ + { 0x04a7, 0x30a1 }, /* kana_a ァ KATAKANA LETTER SMALL A */ + { 0x04a8, 0x30a3 }, /* kana_i ィ KATAKANA LETTER SMALL I */ + { 0x04a9, 0x30a5 }, /* kana_u ゥ KATAKANA LETTER SMALL U */ + { 0x04aa, 0x30a7 }, /* kana_e ェ KATAKANA LETTER SMALL E */ + { 0x04ab, 0x30a9 }, /* kana_o ォ KATAKANA LETTER SMALL O */ + { 0x04ac, 0x30e3 }, /* kana_ya ャ KATAKANA LETTER SMALL YA */ + { 0x04ad, 0x30e5 }, /* kana_yu ュ KATAKANA LETTER SMALL YU */ + { 0x04ae, 0x30e7 }, /* kana_yo ョ KATAKANA LETTER SMALL YO */ + { 0x04af, 0x30c3 }, /* kana_tsu ッ KATAKANA LETTER SMALL TU */ + { 0x04b0, 0x30fc }, /* prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */ + { 0x04b1, 0x30a2 }, /* kana_A ア KATAKANA LETTER A */ + { 0x04b2, 0x30a4 }, /* kana_I イ KATAKANA LETTER I */ + { 0x04b3, 0x30a6 }, /* kana_U ウ KATAKANA LETTER U */ + { 0x04b4, 0x30a8 }, /* kana_E エ KATAKANA LETTER E */ + { 0x04b5, 0x30aa }, /* kana_O オ KATAKANA LETTER O */ + { 0x04b6, 0x30ab }, /* kana_KA カ KATAKANA LETTER KA */ + { 0x04b7, 0x30ad }, /* kana_KI キ KATAKANA LETTER KI */ + { 0x04b8, 0x30af }, /* kana_KU ク KATAKANA LETTER KU */ + { 0x04b9, 0x30b1 }, /* kana_KE ケ KATAKANA LETTER KE */ + { 0x04ba, 0x30b3 }, /* kana_KO コ KATAKANA LETTER KO */ + { 0x04bb, 0x30b5 }, /* kana_SA サ KATAKANA LETTER SA */ + { 0x04bc, 0x30b7 }, /* kana_SHI シ KATAKANA LETTER SI */ + { 0x04bd, 0x30b9 }, /* kana_SU ス KATAKANA LETTER SU */ + { 0x04be, 0x30bb }, /* kana_SE セ KATAKANA LETTER SE */ + { 0x04bf, 0x30bd }, /* kana_SO ソ KATAKANA LETTER SO */ + { 0x04c0, 0x30bf }, /* kana_TA タ KATAKANA LETTER TA */ + { 0x04c1, 0x30c1 }, /* kana_CHI チ KATAKANA LETTER TI */ + { 0x04c2, 0x30c4 }, /* kana_TSU ツ KATAKANA LETTER TU */ + { 0x04c3, 0x30c6 }, /* kana_TE テ KATAKANA LETTER TE */ + { 0x04c4, 0x30c8 }, /* kana_TO ト KATAKANA LETTER TO */ + { 0x04c5, 0x30ca }, /* kana_NA ナ KATAKANA LETTER NA */ + { 0x04c6, 0x30cb }, /* kana_NI ニ KATAKANA LETTER NI */ + { 0x04c7, 0x30cc }, /* kana_NU ヌ KATAKANA LETTER NU */ + { 0x04c8, 0x30cd }, /* kana_NE ネ KATAKANA LETTER NE */ + { 0x04c9, 0x30ce }, /* kana_NO ノ KATAKANA LETTER NO */ + { 0x04ca, 0x30cf }, /* kana_HA ハ KATAKANA LETTER HA */ + { 0x04cb, 0x30d2 }, /* kana_HI ヒ KATAKANA LETTER HI */ + { 0x04cc, 0x30d5 }, /* kana_FU フ KATAKANA LETTER HU */ + { 0x04cd, 0x30d8 }, /* kana_HE ヘ KATAKANA LETTER HE */ + { 0x04ce, 0x30db }, /* kana_HO ホ KATAKANA LETTER HO */ + { 0x04cf, 0x30de }, /* kana_MA マ KATAKANA LETTER MA */ + { 0x04d0, 0x30df }, /* kana_MI ミ KATAKANA LETTER MI */ + { 0x04d1, 0x30e0 }, /* kana_MU ム KATAKANA LETTER MU */ + { 0x04d2, 0x30e1 }, /* kana_ME メ KATAKANA LETTER ME */ + { 0x04d3, 0x30e2 }, /* kana_MO モ KATAKANA LETTER MO */ + { 0x04d4, 0x30e4 }, /* kana_YA ヤ KATAKANA LETTER YA */ + { 0x04d5, 0x30e6 }, /* kana_YU ユ KATAKANA LETTER YU */ + { 0x04d6, 0x30e8 }, /* kana_YO ヨ KATAKANA LETTER YO */ + { 0x04d7, 0x30e9 }, /* kana_RA ラ KATAKANA LETTER RA */ + { 0x04d8, 0x30ea }, /* kana_RI リ KATAKANA LETTER RI */ + { 0x04d9, 0x30eb }, /* kana_RU ル KATAKANA LETTER RU */ + { 0x04da, 0x30ec }, /* kana_RE レ KATAKANA LETTER RE */ + { 0x04db, 0x30ed }, /* kana_RO ロ KATAKANA LETTER RO */ + { 0x04dc, 0x30ef }, /* kana_WA ワ KATAKANA LETTER WA */ + { 0x04dd, 0x30f3 }, /* kana_N ン KATAKANA LETTER N */ + { 0x04de, 0x309b }, /* voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */ + { 0x04df, 0x309c }, /* semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */ + { 0x05ac, 0x060c }, /* Arabic_comma ، ARABIC COMMA */ + { 0x05bb, 0x061b }, /* Arabic_semicolon ؛ ARABIC SEMICOLON */ + { 0x05bf, 0x061f }, /* Arabic_question_mark ؟ ARABIC QUESTION MARK */ + { 0x05c1, 0x0621 }, /* Arabic_hamza ء ARABIC LETTER HAMZA */ + { 0x05c2, 0x0622 }, /* Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */ + { 0x05c3, 0x0623 }, /* Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */ + { 0x05c4, 0x0624 }, /* Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */ + { 0x05c5, 0x0625 }, /* Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */ + { 0x05c6, 0x0626 }, /* Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */ + { 0x05c7, 0x0627 }, /* Arabic_alef ا ARABIC LETTER ALEF */ + { 0x05c8, 0x0628 }, /* Arabic_beh ب ARABIC LETTER BEH */ + { 0x05c9, 0x0629 }, /* Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */ + { 0x05ca, 0x062a }, /* Arabic_teh ت ARABIC LETTER TEH */ + { 0x05cb, 0x062b }, /* Arabic_theh ث ARABIC LETTER THEH */ + { 0x05cc, 0x062c }, /* Arabic_jeem ج ARABIC LETTER JEEM */ + { 0x05cd, 0x062d }, /* Arabic_hah ح ARABIC LETTER HAH */ + { 0x05ce, 0x062e }, /* Arabic_khah خ ARABIC LETTER KHAH */ + { 0x05cf, 0x062f }, /* Arabic_dal د ARABIC LETTER DAL */ + { 0x05d0, 0x0630 }, /* Arabic_thal ذ ARABIC LETTER THAL */ + { 0x05d1, 0x0631 }, /* Arabic_ra ر ARABIC LETTER REH */ + { 0x05d2, 0x0632 }, /* Arabic_zain ز ARABIC LETTER ZAIN */ + { 0x05d3, 0x0633 }, /* Arabic_seen س ARABIC LETTER SEEN */ + { 0x05d4, 0x0634 }, /* Arabic_sheen ش ARABIC LETTER SHEEN */ + { 0x05d5, 0x0635 }, /* Arabic_sad ص ARABIC LETTER SAD */ + { 0x05d6, 0x0636 }, /* Arabic_dad ض ARABIC LETTER DAD */ + { 0x05d7, 0x0637 }, /* Arabic_tah ط ARABIC LETTER TAH */ + { 0x05d8, 0x0638 }, /* Arabic_zah ظ ARABIC LETTER ZAH */ + { 0x05d9, 0x0639 }, /* Arabic_ain ع ARABIC LETTER AIN */ + { 0x05da, 0x063a }, /* Arabic_ghain غ ARABIC LETTER GHAIN */ + { 0x05e0, 0x0640 }, /* Arabic_tatweel ـ ARABIC TATWEEL */ + { 0x05e1, 0x0641 }, /* Arabic_feh ف ARABIC LETTER FEH */ + { 0x05e2, 0x0642 }, /* Arabic_qaf ق ARABIC LETTER QAF */ + { 0x05e3, 0x0643 }, /* Arabic_kaf ك ARABIC LETTER KAF */ + { 0x05e4, 0x0644 }, /* Arabic_lam ل ARABIC LETTER LAM */ + { 0x05e5, 0x0645 }, /* Arabic_meem م ARABIC LETTER MEEM */ + { 0x05e6, 0x0646 }, /* Arabic_noon ن ARABIC LETTER NOON */ + { 0x05e7, 0x0647 }, /* Arabic_ha ه ARABIC LETTER HEH */ + { 0x05e8, 0x0648 }, /* Arabic_waw و ARABIC LETTER WAW */ + { 0x05e9, 0x0649 }, /* Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */ + { 0x05ea, 0x064a }, /* Arabic_yeh ي ARABIC LETTER YEH */ + { 0x05eb, 0x064b }, /* Arabic_fathatan ً ARABIC FATHATAN */ + { 0x05ec, 0x064c }, /* Arabic_dammatan ٌ ARABIC DAMMATAN */ + { 0x05ed, 0x064d }, /* Arabic_kasratan ٍ ARABIC KASRATAN */ + { 0x05ee, 0x064e }, /* Arabic_fatha َ ARABIC FATHA */ + { 0x05ef, 0x064f }, /* Arabic_damma ُ ARABIC DAMMA */ + { 0x05f0, 0x0650 }, /* Arabic_kasra ِ ARABIC KASRA */ + { 0x05f1, 0x0651 }, /* Arabic_shadda ّ ARABIC SHADDA */ + { 0x05f2, 0x0652 }, /* Arabic_sukun ْ ARABIC SUKUN */ + { 0x06a1, 0x0452 }, /* Serbian_dje ђ CYRILLIC SMALL LETTER DJE */ + { 0x06a2, 0x0453 }, /* Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */ + { 0x06a3, 0x0451 }, /* Cyrillic_io ё CYRILLIC SMALL LETTER IO */ + { 0x06a4, 0x0454 }, /* Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */ + { 0x06a5, 0x0455 }, /* Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */ + { 0x06a6, 0x0456 }, /* Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */ + { 0x06a7, 0x0457 }, /* Ukrainian_yi ї CYRILLIC SMALL LETTER YI */ + { 0x06a8, 0x0458 }, /* Cyrillic_je ј CYRILLIC SMALL LETTER JE */ + { 0x06a9, 0x0459 }, /* Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */ + { 0x06aa, 0x045a }, /* Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */ + { 0x06ab, 0x045b }, /* Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */ + { 0x06ac, 0x045c }, /* Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */ + { 0x06ad, 0x0491 }, /* Ukrainian_ghe_with_upturn ґ CYRILLIC SMALL LETTER GHE WITH UPTURN */ + { 0x06ae, 0x045e }, /* Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */ + { 0x06af, 0x045f }, /* Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */ + { 0x06b0, 0x2116 }, /* numerosign № NUMERO SIGN */ + { 0x06b1, 0x0402 }, /* Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */ + { 0x06b2, 0x0403 }, /* Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */ + { 0x06b3, 0x0401 }, /* Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */ + { 0x06b4, 0x0404 }, /* Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */ + { 0x06b5, 0x0405 }, /* Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */ + { 0x06b6, 0x0406 }, /* Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */ + { 0x06b7, 0x0407 }, /* Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */ + { 0x06b8, 0x0408 }, /* Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */ + { 0x06b9, 0x0409 }, /* Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */ + { 0x06ba, 0x040a }, /* Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */ + { 0x06bb, 0x040b }, /* Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */ + { 0x06bc, 0x040c }, /* Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */ + { 0x06bd, 0x0490 }, /* Ukrainian_GHE_WITH_UPTURN Ґ CYRILLIC CAPITAL LETTER GHE WITH UPTURN */ + { 0x06be, 0x040e }, /* Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */ + { 0x06bf, 0x040f }, /* Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */ + { 0x06c0, 0x044e }, /* Cyrillic_yu ю CYRILLIC SMALL LETTER YU */ + { 0x06c1, 0x0430 }, /* Cyrillic_a а CYRILLIC SMALL LETTER A */ + { 0x06c2, 0x0431 }, /* Cyrillic_be б CYRILLIC SMALL LETTER BE */ + { 0x06c3, 0x0446 }, /* Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */ + { 0x06c4, 0x0434 }, /* Cyrillic_de д CYRILLIC SMALL LETTER DE */ + { 0x06c5, 0x0435 }, /* Cyrillic_ie е CYRILLIC SMALL LETTER IE */ + { 0x06c6, 0x0444 }, /* Cyrillic_ef ф CYRILLIC SMALL LETTER EF */ + { 0x06c7, 0x0433 }, /* Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */ + { 0x06c8, 0x0445 }, /* Cyrillic_ha х CYRILLIC SMALL LETTER HA */ + { 0x06c9, 0x0438 }, /* Cyrillic_i и CYRILLIC SMALL LETTER I */ + { 0x06ca, 0x0439 }, /* Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */ + { 0x06cb, 0x043a }, /* Cyrillic_ka к CYRILLIC SMALL LETTER KA */ + { 0x06cc, 0x043b }, /* Cyrillic_el л CYRILLIC SMALL LETTER EL */ + { 0x06cd, 0x043c }, /* Cyrillic_em м CYRILLIC SMALL LETTER EM */ + { 0x06ce, 0x043d }, /* Cyrillic_en н CYRILLIC SMALL LETTER EN */ + { 0x06cf, 0x043e }, /* Cyrillic_o о CYRILLIC SMALL LETTER O */ + { 0x06d0, 0x043f }, /* Cyrillic_pe п CYRILLIC SMALL LETTER PE */ + { 0x06d1, 0x044f }, /* Cyrillic_ya я CYRILLIC SMALL LETTER YA */ + { 0x06d2, 0x0440 }, /* Cyrillic_er р CYRILLIC SMALL LETTER ER */ + { 0x06d3, 0x0441 }, /* Cyrillic_es с CYRILLIC SMALL LETTER ES */ + { 0x06d4, 0x0442 }, /* Cyrillic_te т CYRILLIC SMALL LETTER TE */ + { 0x06d5, 0x0443 }, /* Cyrillic_u у CYRILLIC SMALL LETTER U */ + { 0x06d6, 0x0436 }, /* Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */ + { 0x06d7, 0x0432 }, /* Cyrillic_ve в CYRILLIC SMALL LETTER VE */ + { 0x06d8, 0x044c }, /* Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */ + { 0x06d9, 0x044b }, /* Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */ + { 0x06da, 0x0437 }, /* Cyrillic_ze з CYRILLIC SMALL LETTER ZE */ + { 0x06db, 0x0448 }, /* Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */ + { 0x06dc, 0x044d }, /* Cyrillic_e э CYRILLIC SMALL LETTER E */ + { 0x06dd, 0x0449 }, /* Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */ + { 0x06de, 0x0447 }, /* Cyrillic_che ч CYRILLIC SMALL LETTER CHE */ + { 0x06df, 0x044a }, /* Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */ + { 0x06e0, 0x042e }, /* Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */ + { 0x06e1, 0x0410 }, /* Cyrillic_A А CYRILLIC CAPITAL LETTER A */ + { 0x06e2, 0x0411 }, /* Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */ + { 0x06e3, 0x0426 }, /* Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */ + { 0x06e4, 0x0414 }, /* Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */ + { 0x06e5, 0x0415 }, /* Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */ + { 0x06e6, 0x0424 }, /* Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */ + { 0x06e7, 0x0413 }, /* Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */ + { 0x06e8, 0x0425 }, /* Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */ + { 0x06e9, 0x0418 }, /* Cyrillic_I И CYRILLIC CAPITAL LETTER I */ + { 0x06ea, 0x0419 }, /* Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */ + { 0x06eb, 0x041a }, /* Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */ + { 0x06ec, 0x041b }, /* Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */ + { 0x06ed, 0x041c }, /* Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */ + { 0x06ee, 0x041d }, /* Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */ + { 0x06ef, 0x041e }, /* Cyrillic_O О CYRILLIC CAPITAL LETTER O */ + { 0x06f0, 0x041f }, /* Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */ + { 0x06f1, 0x042f }, /* Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */ + { 0x06f2, 0x0420 }, /* Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */ + { 0x06f3, 0x0421 }, /* Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */ + { 0x06f4, 0x0422 }, /* Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */ + { 0x06f5, 0x0423 }, /* Cyrillic_U У CYRILLIC CAPITAL LETTER U */ + { 0x06f6, 0x0416 }, /* Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */ + { 0x06f7, 0x0412 }, /* Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */ + { 0x06f8, 0x042c }, /* Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */ + { 0x06f9, 0x042b }, /* Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */ + { 0x06fa, 0x0417 }, /* Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */ + { 0x06fb, 0x0428 }, /* Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */ + { 0x06fc, 0x042d }, /* Cyrillic_E Э CYRILLIC CAPITAL LETTER E */ + { 0x06fd, 0x0429 }, /* Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */ + { 0x06fe, 0x0427 }, /* Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */ + { 0x06ff, 0x042a }, /* Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */ + { 0x07a1, 0x0386 }, /* Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */ + { 0x07a2, 0x0388 }, /* Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */ + { 0x07a3, 0x0389 }, /* Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */ + { 0x07a4, 0x038a }, /* Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */ + { 0x07a5, 0x03aa }, /* Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */ + { 0x07a7, 0x038c }, /* Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */ + { 0x07a8, 0x038e }, /* Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */ + { 0x07a9, 0x03ab }, /* Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */ + { 0x07ab, 0x038f }, /* Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */ + { 0x07ae, 0x0385 }, /* Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */ + { 0x07af, 0x2015 }, /* Greek_horizbar ― HORIZONTAL BAR */ + { 0x07b1, 0x03ac }, /* Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */ + { 0x07b2, 0x03ad }, /* Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */ + { 0x07b3, 0x03ae }, /* Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */ + { 0x07b4, 0x03af }, /* Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */ + { 0x07b5, 0x03ca }, /* Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */ + { 0x07b6, 0x0390 }, /* Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */ + { 0x07b7, 0x03cc }, /* Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */ + { 0x07b8, 0x03cd }, /* Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */ + { 0x07b9, 0x03cb }, /* Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */ + { 0x07ba, 0x03b0 }, /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */ + { 0x07bb, 0x03ce }, /* Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */ + { 0x07c1, 0x0391 }, /* Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */ + { 0x07c2, 0x0392 }, /* Greek_BETA Β GREEK CAPITAL LETTER BETA */ + { 0x07c3, 0x0393 }, /* Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */ + { 0x07c4, 0x0394 }, /* Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */ + { 0x07c5, 0x0395 }, /* Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */ + { 0x07c6, 0x0396 }, /* Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */ + { 0x07c7, 0x0397 }, /* Greek_ETA Η GREEK CAPITAL LETTER ETA */ + { 0x07c8, 0x0398 }, /* Greek_THETA Θ GREEK CAPITAL LETTER THETA */ + { 0x07c9, 0x0399 }, /* Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */ + { 0x07ca, 0x039a }, /* Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */ + { 0x07cb, 0x039b }, /* Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */ + { 0x07cc, 0x039c }, /* Greek_MU Μ GREEK CAPITAL LETTER MU */ + { 0x07cd, 0x039d }, /* Greek_NU Ν GREEK CAPITAL LETTER NU */ + { 0x07ce, 0x039e }, /* Greek_XI Ξ GREEK CAPITAL LETTER XI */ + { 0x07cf, 0x039f }, /* Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */ + { 0x07d0, 0x03a0 }, /* Greek_PI Π GREEK CAPITAL LETTER PI */ + { 0x07d1, 0x03a1 }, /* Greek_RHO Ρ GREEK CAPITAL LETTER RHO */ + { 0x07d2, 0x03a3 }, /* Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */ + { 0x07d4, 0x03a4 }, /* Greek_TAU Τ GREEK CAPITAL LETTER TAU */ + { 0x07d5, 0x03a5 }, /* Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */ + { 0x07d6, 0x03a6 }, /* Greek_PHI Φ GREEK CAPITAL LETTER PHI */ + { 0x07d7, 0x03a7 }, /* Greek_CHI Χ GREEK CAPITAL LETTER CHI */ + { 0x07d8, 0x03a8 }, /* Greek_PSI Ψ GREEK CAPITAL LETTER PSI */ + { 0x07d9, 0x03a9 }, /* Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */ + { 0x07e1, 0x03b1 }, /* Greek_alpha α GREEK SMALL LETTER ALPHA */ + { 0x07e2, 0x03b2 }, /* Greek_beta β GREEK SMALL LETTER BETA */ + { 0x07e3, 0x03b3 }, /* Greek_gamma γ GREEK SMALL LETTER GAMMA */ + { 0x07e4, 0x03b4 }, /* Greek_delta δ GREEK SMALL LETTER DELTA */ + { 0x07e5, 0x03b5 }, /* Greek_epsilon ε GREEK SMALL LETTER EPSILON */ + { 0x07e6, 0x03b6 }, /* Greek_zeta ζ GREEK SMALL LETTER ZETA */ + { 0x07e7, 0x03b7 }, /* Greek_eta η GREEK SMALL LETTER ETA */ + { 0x07e8, 0x03b8 }, /* Greek_theta θ GREEK SMALL LETTER THETA */ + { 0x07e9, 0x03b9 }, /* Greek_iota ι GREEK SMALL LETTER IOTA */ + { 0x07ea, 0x03ba }, /* Greek_kappa κ GREEK SMALL LETTER KAPPA */ + { 0x07eb, 0x03bb }, /* Greek_lambda λ GREEK SMALL LETTER LAMDA */ + { 0x07ec, 0x03bc }, /* Greek_mu μ GREEK SMALL LETTER MU */ + { 0x07ed, 0x03bd }, /* Greek_nu ν GREEK SMALL LETTER NU */ + { 0x07ee, 0x03be }, /* Greek_xi ξ GREEK SMALL LETTER XI */ + { 0x07ef, 0x03bf }, /* Greek_omicron ο GREEK SMALL LETTER OMICRON */ + { 0x07f0, 0x03c0 }, /* Greek_pi π GREEK SMALL LETTER PI */ + { 0x07f1, 0x03c1 }, /* Greek_rho ρ GREEK SMALL LETTER RHO */ + { 0x07f2, 0x03c3 }, /* Greek_sigma σ GREEK SMALL LETTER SIGMA */ + { 0x07f3, 0x03c2 }, /* Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */ + { 0x07f4, 0x03c4 }, /* Greek_tau τ GREEK SMALL LETTER TAU */ + { 0x07f5, 0x03c5 }, /* Greek_upsilon υ GREEK SMALL LETTER UPSILON */ + { 0x07f6, 0x03c6 }, /* Greek_phi φ GREEK SMALL LETTER PHI */ + { 0x07f7, 0x03c7 }, /* Greek_chi χ GREEK SMALL LETTER CHI */ + { 0x07f8, 0x03c8 }, /* Greek_psi ψ GREEK SMALL LETTER PSI */ + { 0x07f9, 0x03c9 }, /* Greek_omega ω GREEK SMALL LETTER OMEGA */ + { 0x08a1, 0x23b7 }, /* leftradical ⎷ RADICAL SYMBOL BOTTOM */ + { 0x08a2, 0x250c }, /* topleftradical ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ + { 0x08a3, 0x2500 }, /* horizconnector ─ BOX DRAWINGS LIGHT HORIZONTAL */ + { 0x08a4, 0x2320 }, /* topintegral ⌠ TOP HALF INTEGRAL */ + { 0x08a5, 0x2321 }, /* botintegral ⌡ BOTTOM HALF INTEGRAL */ + { 0x08a6, 0x2502 }, /* vertconnector │ BOX DRAWINGS LIGHT VERTICAL */ + { 0x08a7, 0x23a1 }, /* topleftsqbracket ⎡ LEFT SQUARE BRACKET UPPER CORNER */ + { 0x08a8, 0x23a3 }, /* botleftsqbracket ⎣ LEFT SQUARE BRACKET LOWER CORNER */ + { 0x08a9, 0x23a4 }, /* toprightsqbracket ⎤ RIGHT SQUARE BRACKET UPPER CORNER */ + { 0x08aa, 0x23a6 }, /* botrightsqbracket ⎦ RIGHT SQUARE BRACKET LOWER CORNER */ + { 0x08ab, 0x239b }, /* topleftparens ⎛ LEFT PARENTHESIS UPPER HOOK */ + { 0x08ac, 0x239d }, /* botleftparens ⎝ LEFT PARENTHESIS LOWER HOOK */ + { 0x08ad, 0x239e }, /* toprightparens ⎞ RIGHT PARENTHESIS UPPER HOOK */ + { 0x08ae, 0x23a0 }, /* botrightparens ⎠ RIGHT PARENTHESIS LOWER HOOK */ + { 0x08af, 0x23a8 }, /* leftmiddlecurlybrace ⎨ LEFT CURLY BRACKET MIDDLE PIECE */ + { 0x08b0, 0x23ac }, /* rightmiddlecurlybrace ⎬ RIGHT CURLY BRACKET MIDDLE PIECE */ +/* 0x08b1 topleftsummation ? ??? */ +/* 0x08b2 botleftsummation ? ??? */ +/* 0x08b3 topvertsummationconnector ? ??? */ +/* 0x08b4 botvertsummationconnector ? ??? */ +/* 0x08b5 toprightsummation ? ??? */ +/* 0x08b6 botrightsummation ? ??? */ +/* 0x08b7 rightmiddlesummation ? ??? */ + { 0x08bc, 0x2264 }, /* lessthanequal ≤ LESS-THAN OR EQUAL TO */ + { 0x08bd, 0x2260 }, /* notequal ≠ NOT EQUAL TO */ + { 0x08be, 0x2265 }, /* greaterthanequal ≥ GREATER-THAN OR EQUAL TO */ + { 0x08bf, 0x222b }, /* integral ∫ INTEGRAL */ + { 0x08c0, 0x2234 }, /* therefore ∴ THEREFORE */ + { 0x08c1, 0x221d }, /* variation ∝ PROPORTIONAL TO */ + { 0x08c2, 0x221e }, /* infinity ∞ INFINITY */ + { 0x08c5, 0x2207 }, /* nabla ∇ NABLA */ + { 0x08c8, 0x223c }, /* approximate ∼ TILDE OPERATOR */ + { 0x08c9, 0x2243 }, /* similarequal ≃ ASYMPTOTICALLY EQUAL TO */ + { 0x08cd, 0x21d4 }, /* ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */ + { 0x08ce, 0x21d2 }, /* implies ⇒ RIGHTWARDS DOUBLE ARROW */ + { 0x08cf, 0x2261 }, /* identical ≡ IDENTICAL TO */ + { 0x08d6, 0x221a }, /* radical √ SQUARE ROOT */ + { 0x08da, 0x2282 }, /* includedin ⊂ SUBSET OF */ + { 0x08db, 0x2283 }, /* includes ⊃ SUPERSET OF */ + { 0x08dc, 0x2229 }, /* intersection ∩ INTERSECTION */ + { 0x08dd, 0x222a }, /* union ∪ UNION */ + { 0x08de, 0x2227 }, /* logicaland ∧ LOGICAL AND */ + { 0x08df, 0x2228 }, /* logicalor ∨ LOGICAL OR */ + { 0x08ef, 0x2202 }, /* partialderivative ∂ PARTIAL DIFFERENTIAL */ + { 0x08f6, 0x0192 }, /* function ƒ LATIN SMALL LETTER F WITH HOOK */ + { 0x08fb, 0x2190 }, /* leftarrow ← LEFTWARDS ARROW */ + { 0x08fc, 0x2191 }, /* uparrow ↑ UPWARDS ARROW */ + { 0x08fd, 0x2192 }, /* rightarrow → RIGHTWARDS ARROW */ + { 0x08fe, 0x2193 }, /* downarrow ↓ DOWNWARDS ARROW */ + { 0x09df, 0x2422 }, /* blank ␢ BLANK SYMBOL */ + { 0x09e0, 0x25c6 }, /* soliddiamond ◆ BLACK DIAMOND */ + { 0x09e1, 0x2592 }, /* checkerboard ▒ MEDIUM SHADE */ + { 0x09e2, 0x2409 }, /* ht ␉ SYMBOL FOR HORIZONTAL TABULATION */ + { 0x09e3, 0x240c }, /* ff ␌ SYMBOL FOR FORM FEED */ + { 0x09e4, 0x240d }, /* cr ␍ SYMBOL FOR CARRIAGE RETURN */ + { 0x09e5, 0x240a }, /* lf ␊ SYMBOL FOR LINE FEED */ + { 0x09e8, 0x2424 }, /* nl ␤ SYMBOL FOR NEWLINE */ + { 0x09e9, 0x240b }, /* vt ␋ SYMBOL FOR VERTICAL TABULATION */ + { 0x09ea, 0x2518 }, /* lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */ + { 0x09eb, 0x2510 }, /* uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */ + { 0x09ec, 0x250c }, /* upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */ + { 0x09ed, 0x2514 }, /* lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */ + { 0x09ee, 0x253c }, /* crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ + { 0x09ef, 0x23ba }, /* horizlinescan1 ⎺ HORIZONTAL SCAN LINE-1 */ + { 0x09f0, 0x23bb }, /* horizlinescan3 ⎻ HORIZONTAL SCAN LINE-3 */ + { 0x09f1, 0x2500 }, /* horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */ + { 0x09f2, 0x23bc }, /* horizlinescan7 ⎼ HORIZONTAL SCAN LINE-7 */ + { 0x09f3, 0x23bd }, /* horizlinescan9 ⎽ HORIZONTAL SCAN LINE-9 */ + { 0x09f4, 0x251c }, /* leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ + { 0x09f5, 0x2524 }, /* rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */ + { 0x09f6, 0x2534 }, /* bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */ + { 0x09f7, 0x252c }, /* topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ + { 0x09f8, 0x2502 }, /* vertbar │ BOX DRAWINGS LIGHT VERTICAL */ + { 0x0aa1, 0x2003 }, /* emspace   EM SPACE */ + { 0x0aa2, 0x2002 }, /* enspace   EN SPACE */ + { 0x0aa3, 0x2004 }, /* em3space   THREE-PER-EM SPACE */ + { 0x0aa4, 0x2005 }, /* em4space   FOUR-PER-EM SPACE */ + { 0x0aa5, 0x2007 }, /* digitspace   FIGURE SPACE */ + { 0x0aa6, 0x2008 }, /* punctspace   PUNCTUATION SPACE */ + { 0x0aa7, 0x2009 }, /* thinspace   THIN SPACE */ + { 0x0aa8, 0x200a }, /* hairspace   HAIR SPACE */ + { 0x0aa9, 0x2014 }, /* emdash — EM DASH */ + { 0x0aaa, 0x2013 }, /* endash – EN DASH */ + { 0x0aac, 0x2423 }, /* signifblank ␣ OPEN BOX */ + { 0x0aae, 0x2026 }, /* ellipsis … HORIZONTAL ELLIPSIS */ + { 0x0aaf, 0x2025 }, /* doubbaselinedot ‥ TWO DOT LEADER */ + { 0x0ab0, 0x2153 }, /* onethird ⅓ VULGAR FRACTION ONE THIRD */ + { 0x0ab1, 0x2154 }, /* twothirds ⅔ VULGAR FRACTION TWO THIRDS */ + { 0x0ab2, 0x2155 }, /* onefifth ⅕ VULGAR FRACTION ONE FIFTH */ + { 0x0ab3, 0x2156 }, /* twofifths ⅖ VULGAR FRACTION TWO FIFTHS */ + { 0x0ab4, 0x2157 }, /* threefifths ⅗ VULGAR FRACTION THREE FIFTHS */ + { 0x0ab5, 0x2158 }, /* fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */ + { 0x0ab6, 0x2159 }, /* onesixth ⅙ VULGAR FRACTION ONE SIXTH */ + { 0x0ab7, 0x215a }, /* fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */ + { 0x0ab8, 0x2105 }, /* careof ℅ CARE OF */ + { 0x0abb, 0x2012 }, /* figdash ‒ FIGURE DASH */ + { 0x0abc, 0x2329 }, /* leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */ + { 0x0abd, 0x002e }, /* decimalpoint . FULL STOP */ + { 0x0abe, 0x232a }, /* rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */ +/* 0x0abf marker ? ??? */ + { 0x0ac3, 0x215b }, /* oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */ + { 0x0ac4, 0x215c }, /* threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */ + { 0x0ac5, 0x215d }, /* fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */ + { 0x0ac6, 0x215e }, /* seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */ + { 0x0ac9, 0x2122 }, /* trademark ™ TRADE MARK SIGN */ + { 0x0aca, 0x2613 }, /* signaturemark ☓ SALTIRE */ +/* 0x0acb trademarkincircle ? ??? */ + { 0x0acc, 0x25c1 }, /* leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */ + { 0x0acd, 0x25b7 }, /* rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */ + { 0x0ace, 0x25cb }, /* emopencircle ○ WHITE CIRCLE */ + { 0x0acf, 0x25af }, /* emopenrectangle ▯ WHITE VERTICAL RECTANGLE */ + { 0x0ad0, 0x2018 }, /* leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */ + { 0x0ad1, 0x2019 }, /* rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */ + { 0x0ad2, 0x201c }, /* leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */ + { 0x0ad3, 0x201d }, /* rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */ + { 0x0ad4, 0x211e }, /* prescription ℞ PRESCRIPTION TAKE */ + { 0x0ad5, 0x2030 }, /* permille ‰ PER MILLE SIGN */ + { 0x0ad6, 0x2032 }, /* minutes ′ PRIME */ + { 0x0ad7, 0x2033 }, /* seconds ″ DOUBLE PRIME */ + { 0x0ad9, 0x271d }, /* latincross ✝ LATIN CROSS */ +/* 0x0ada hexagram ? ??? */ + { 0x0adb, 0x25ac }, /* filledrectbullet ▬ BLACK RECTANGLE */ + { 0x0adc, 0x25c0 }, /* filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */ + { 0x0add, 0x25b6 }, /* filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */ + { 0x0ade, 0x25cf }, /* emfilledcircle ● BLACK CIRCLE */ + { 0x0adf, 0x25ae }, /* emfilledrect ▮ BLACK VERTICAL RECTANGLE */ + { 0x0ae0, 0x25e6 }, /* enopencircbullet ◦ WHITE BULLET */ + { 0x0ae1, 0x25ab }, /* enopensquarebullet ▫ WHITE SMALL SQUARE */ + { 0x0ae2, 0x25ad }, /* openrectbullet ▭ WHITE RECTANGLE */ + { 0x0ae3, 0x25b3 }, /* opentribulletup △ WHITE UP-POINTING TRIANGLE */ + { 0x0ae4, 0x25bd }, /* opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */ + { 0x0ae5, 0x2606 }, /* openstar ☆ WHITE STAR */ + { 0x0ae6, 0x2022 }, /* enfilledcircbullet • BULLET */ + { 0x0ae7, 0x25aa }, /* enfilledsqbullet ▪ BLACK SMALL SQUARE */ + { 0x0ae8, 0x25b2 }, /* filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */ + { 0x0ae9, 0x25bc }, /* filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */ + { 0x0aea, 0x261c }, /* leftpointer ☜ WHITE LEFT POINTING INDEX */ + { 0x0aeb, 0x261e }, /* rightpointer ☞ WHITE RIGHT POINTING INDEX */ + { 0x0aec, 0x2663 }, /* club ♣ BLACK CLUB SUIT */ + { 0x0aed, 0x2666 }, /* diamond ♦ BLACK DIAMOND SUIT */ + { 0x0aee, 0x2665 }, /* heart ♥ BLACK HEART SUIT */ + { 0x0af0, 0x2720 }, /* maltesecross ✠ MALTESE CROSS */ + { 0x0af1, 0x2020 }, /* dagger † DAGGER */ + { 0x0af2, 0x2021 }, /* doubledagger ‡ DOUBLE DAGGER */ + { 0x0af3, 0x2713 }, /* checkmark ✓ CHECK MARK */ + { 0x0af4, 0x2717 }, /* ballotcross ✗ BALLOT X */ + { 0x0af5, 0x266f }, /* musicalsharp ♯ MUSIC SHARP SIGN */ + { 0x0af6, 0x266d }, /* musicalflat ♭ MUSIC FLAT SIGN */ + { 0x0af7, 0x2642 }, /* malesymbol ♂ MALE SIGN */ + { 0x0af8, 0x2640 }, /* femalesymbol ♀ FEMALE SIGN */ + { 0x0af9, 0x260e }, /* telephone ☎ BLACK TELEPHONE */ + { 0x0afa, 0x2315 }, /* telephonerecorder ⌕ TELEPHONE RECORDER */ + { 0x0afb, 0x2117 }, /* phonographcopyright ℗ SOUND RECORDING COPYRIGHT */ + { 0x0afc, 0x2038 }, /* caret ‸ CARET */ + { 0x0afd, 0x201a }, /* singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */ + { 0x0afe, 0x201e }, /* doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */ +/* 0x0aff cursor ? ??? */ + { 0x0ba3, 0x003c }, /* leftcaret < LESS-THAN SIGN */ + { 0x0ba6, 0x003e }, /* rightcaret > GREATER-THAN SIGN */ + { 0x0ba8, 0x2228 }, /* downcaret ∨ LOGICAL OR */ + { 0x0ba9, 0x2227 }, /* upcaret ∧ LOGICAL AND */ + { 0x0bc0, 0x00af }, /* overbar ¯ MACRON */ + { 0x0bc2, 0x22a4 }, /* downtack ⊤ DOWN TACK */ + { 0x0bc3, 0x2229 }, /* upshoe ∩ INTERSECTION */ + { 0x0bc4, 0x230a }, /* downstile ⌊ LEFT FLOOR */ + { 0x0bc6, 0x005f }, /* underbar _ LOW LINE */ + { 0x0bca, 0x2218 }, /* jot ∘ RING OPERATOR */ + { 0x0bcc, 0x2395 }, /* quad ⎕ APL FUNCTIONAL SYMBOL QUAD */ + { 0x0bce, 0x22a5 }, /* uptack ⊥ UP TACK */ + { 0x0bcf, 0x25cb }, /* circle ○ WHITE CIRCLE */ + { 0x0bd3, 0x2308 }, /* upstile ⌈ LEFT CEILING */ + { 0x0bd6, 0x222a }, /* downshoe ∪ UNION */ + { 0x0bd8, 0x2283 }, /* rightshoe ⊃ SUPERSET OF */ + { 0x0bda, 0x2282 }, /* leftshoe ⊂ SUBSET OF */ + { 0x0bdc, 0x22a3 }, /* lefttack ⊣ LEFT TACK */ + { 0x0bfc, 0x22a2 }, /* righttack ⊢ RIGHT TACK */ + { 0x0cdf, 0x2017 }, /* hebrew_doublelowline ‗ DOUBLE LOW LINE */ + { 0x0ce0, 0x05d0 }, /* hebrew_aleph א HEBREW LETTER ALEF */ + { 0x0ce1, 0x05d1 }, /* hebrew_bet ב HEBREW LETTER BET */ + { 0x0ce2, 0x05d2 }, /* hebrew_gimel ג HEBREW LETTER GIMEL */ + { 0x0ce3, 0x05d3 }, /* hebrew_dalet ד HEBREW LETTER DALET */ + { 0x0ce4, 0x05d4 }, /* hebrew_he ה HEBREW LETTER HE */ + { 0x0ce5, 0x05d5 }, /* hebrew_waw ו HEBREW LETTER VAV */ + { 0x0ce6, 0x05d6 }, /* hebrew_zain ז HEBREW LETTER ZAYIN */ + { 0x0ce7, 0x05d7 }, /* hebrew_chet ח HEBREW LETTER HET */ + { 0x0ce8, 0x05d8 }, /* hebrew_tet ט HEBREW LETTER TET */ + { 0x0ce9, 0x05d9 }, /* hebrew_yod י HEBREW LETTER YOD */ + { 0x0cea, 0x05da }, /* hebrew_finalkaph ך HEBREW LETTER FINAL KAF */ + { 0x0ceb, 0x05db }, /* hebrew_kaph כ HEBREW LETTER KAF */ + { 0x0cec, 0x05dc }, /* hebrew_lamed ל HEBREW LETTER LAMED */ + { 0x0ced, 0x05dd }, /* hebrew_finalmem ם HEBREW LETTER FINAL MEM */ + { 0x0cee, 0x05de }, /* hebrew_mem מ HEBREW LETTER MEM */ + { 0x0cef, 0x05df }, /* hebrew_finalnun ן HEBREW LETTER FINAL NUN */ + { 0x0cf0, 0x05e0 }, /* hebrew_nun נ HEBREW LETTER NUN */ + { 0x0cf1, 0x05e1 }, /* hebrew_samech ס HEBREW LETTER SAMEKH */ + { 0x0cf2, 0x05e2 }, /* hebrew_ayin ע HEBREW LETTER AYIN */ + { 0x0cf3, 0x05e3 }, /* hebrew_finalpe ף HEBREW LETTER FINAL PE */ + { 0x0cf4, 0x05e4 }, /* hebrew_pe פ HEBREW LETTER PE */ + { 0x0cf5, 0x05e5 }, /* hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */ + { 0x0cf6, 0x05e6 }, /* hebrew_zade צ HEBREW LETTER TSADI */ + { 0x0cf7, 0x05e7 }, /* hebrew_qoph ק HEBREW LETTER QOF */ + { 0x0cf8, 0x05e8 }, /* hebrew_resh ר HEBREW LETTER RESH */ + { 0x0cf9, 0x05e9 }, /* hebrew_shin ש HEBREW LETTER SHIN */ + { 0x0cfa, 0x05ea }, /* hebrew_taw ת HEBREW LETTER TAV */ + { 0x0da1, 0x0e01 }, /* Thai_kokai ก THAI CHARACTER KO KAI */ + { 0x0da2, 0x0e02 }, /* Thai_khokhai ข THAI CHARACTER KHO KHAI */ + { 0x0da3, 0x0e03 }, /* Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */ + { 0x0da4, 0x0e04 }, /* Thai_khokhwai ค THAI CHARACTER KHO KHWAI */ + { 0x0da5, 0x0e05 }, /* Thai_khokhon ฅ THAI CHARACTER KHO KHON */ + { 0x0da6, 0x0e06 }, /* Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */ + { 0x0da7, 0x0e07 }, /* Thai_ngongu ง THAI CHARACTER NGO NGU */ + { 0x0da8, 0x0e08 }, /* Thai_chochan จ THAI CHARACTER CHO CHAN */ + { 0x0da9, 0x0e09 }, /* Thai_choching ฉ THAI CHARACTER CHO CHING */ + { 0x0daa, 0x0e0a }, /* Thai_chochang ช THAI CHARACTER CHO CHANG */ + { 0x0dab, 0x0e0b }, /* Thai_soso ซ THAI CHARACTER SO SO */ + { 0x0dac, 0x0e0c }, /* Thai_chochoe ฌ THAI CHARACTER CHO CHOE */ + { 0x0dad, 0x0e0d }, /* Thai_yoying ญ THAI CHARACTER YO YING */ + { 0x0dae, 0x0e0e }, /* Thai_dochada ฎ THAI CHARACTER DO CHADA */ + { 0x0daf, 0x0e0f }, /* Thai_topatak ฏ THAI CHARACTER TO PATAK */ + { 0x0db0, 0x0e10 }, /* Thai_thothan ฐ THAI CHARACTER THO THAN */ + { 0x0db1, 0x0e11 }, /* Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */ + { 0x0db2, 0x0e12 }, /* Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */ + { 0x0db3, 0x0e13 }, /* Thai_nonen ณ THAI CHARACTER NO NEN */ + { 0x0db4, 0x0e14 }, /* Thai_dodek ด THAI CHARACTER DO DEK */ + { 0x0db5, 0x0e15 }, /* Thai_totao ต THAI CHARACTER TO TAO */ + { 0x0db6, 0x0e16 }, /* Thai_thothung ถ THAI CHARACTER THO THUNG */ + { 0x0db7, 0x0e17 }, /* Thai_thothahan ท THAI CHARACTER THO THAHAN */ + { 0x0db8, 0x0e18 }, /* Thai_thothong ธ THAI CHARACTER THO THONG */ + { 0x0db9, 0x0e19 }, /* Thai_nonu น THAI CHARACTER NO NU */ + { 0x0dba, 0x0e1a }, /* Thai_bobaimai บ THAI CHARACTER BO BAIMAI */ + { 0x0dbb, 0x0e1b }, /* Thai_popla ป THAI CHARACTER PO PLA */ + { 0x0dbc, 0x0e1c }, /* Thai_phophung ผ THAI CHARACTER PHO PHUNG */ + { 0x0dbd, 0x0e1d }, /* Thai_fofa ฝ THAI CHARACTER FO FA */ + { 0x0dbe, 0x0e1e }, /* Thai_phophan พ THAI CHARACTER PHO PHAN */ + { 0x0dbf, 0x0e1f }, /* Thai_fofan ฟ THAI CHARACTER FO FAN */ + { 0x0dc0, 0x0e20 }, /* Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */ + { 0x0dc1, 0x0e21 }, /* Thai_moma ม THAI CHARACTER MO MA */ + { 0x0dc2, 0x0e22 }, /* Thai_yoyak ย THAI CHARACTER YO YAK */ + { 0x0dc3, 0x0e23 }, /* Thai_rorua ร THAI CHARACTER RO RUA */ + { 0x0dc4, 0x0e24 }, /* Thai_ru ฤ THAI CHARACTER RU */ + { 0x0dc5, 0x0e25 }, /* Thai_loling ล THAI CHARACTER LO LING */ + { 0x0dc6, 0x0e26 }, /* Thai_lu ฦ THAI CHARACTER LU */ + { 0x0dc7, 0x0e27 }, /* Thai_wowaen ว THAI CHARACTER WO WAEN */ + { 0x0dc8, 0x0e28 }, /* Thai_sosala ศ THAI CHARACTER SO SALA */ + { 0x0dc9, 0x0e29 }, /* Thai_sorusi ษ THAI CHARACTER SO RUSI */ + { 0x0dca, 0x0e2a }, /* Thai_sosua ส THAI CHARACTER SO SUA */ + { 0x0dcb, 0x0e2b }, /* Thai_hohip ห THAI CHARACTER HO HIP */ + { 0x0dcc, 0x0e2c }, /* Thai_lochula ฬ THAI CHARACTER LO CHULA */ + { 0x0dcd, 0x0e2d }, /* Thai_oang อ THAI CHARACTER O ANG */ + { 0x0dce, 0x0e2e }, /* Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */ + { 0x0dcf, 0x0e2f }, /* Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */ + { 0x0dd0, 0x0e30 }, /* Thai_saraa ะ THAI CHARACTER SARA A */ + { 0x0dd1, 0x0e31 }, /* Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */ + { 0x0dd2, 0x0e32 }, /* Thai_saraaa า THAI CHARACTER SARA AA */ + { 0x0dd3, 0x0e33 }, /* Thai_saraam ำ THAI CHARACTER SARA AM */ + { 0x0dd4, 0x0e34 }, /* Thai_sarai ิ THAI CHARACTER SARA I */ + { 0x0dd5, 0x0e35 }, /* Thai_saraii ี THAI CHARACTER SARA II */ + { 0x0dd6, 0x0e36 }, /* Thai_saraue ึ THAI CHARACTER SARA UE */ + { 0x0dd7, 0x0e37 }, /* Thai_sarauee ื THAI CHARACTER SARA UEE */ + { 0x0dd8, 0x0e38 }, /* Thai_sarau ุ THAI CHARACTER SARA U */ + { 0x0dd9, 0x0e39 }, /* Thai_sarauu ู THAI CHARACTER SARA UU */ + { 0x0dda, 0x0e3a }, /* Thai_phinthu ฺ THAI CHARACTER PHINTHU */ +/* 0x0dde Thai_maihanakat_maitho ? ??? */ + { 0x0ddf, 0x0e3f }, /* Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */ + { 0x0de0, 0x0e40 }, /* Thai_sarae เ THAI CHARACTER SARA E */ + { 0x0de1, 0x0e41 }, /* Thai_saraae แ THAI CHARACTER SARA AE */ + { 0x0de2, 0x0e42 }, /* Thai_sarao โ THAI CHARACTER SARA O */ + { 0x0de3, 0x0e43 }, /* Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */ + { 0x0de4, 0x0e44 }, /* Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */ + { 0x0de5, 0x0e45 }, /* Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */ + { 0x0de6, 0x0e46 }, /* Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */ + { 0x0de7, 0x0e47 }, /* Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */ + { 0x0de8, 0x0e48 }, /* Thai_maiek ่ THAI CHARACTER MAI EK */ + { 0x0de9, 0x0e49 }, /* Thai_maitho ้ THAI CHARACTER MAI THO */ + { 0x0dea, 0x0e4a }, /* Thai_maitri ๊ THAI CHARACTER MAI TRI */ + { 0x0deb, 0x0e4b }, /* Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */ + { 0x0dec, 0x0e4c }, /* Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */ + { 0x0ded, 0x0e4d }, /* Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */ + { 0x0df0, 0x0e50 }, /* Thai_leksun ๐ THAI DIGIT ZERO */ + { 0x0df1, 0x0e51 }, /* Thai_leknung ๑ THAI DIGIT ONE */ + { 0x0df2, 0x0e52 }, /* Thai_leksong ๒ THAI DIGIT TWO */ + { 0x0df3, 0x0e53 }, /* Thai_leksam ๓ THAI DIGIT THREE */ + { 0x0df4, 0x0e54 }, /* Thai_leksi ๔ THAI DIGIT FOUR */ + { 0x0df5, 0x0e55 }, /* Thai_lekha ๕ THAI DIGIT FIVE */ + { 0x0df6, 0x0e56 }, /* Thai_lekhok ๖ THAI DIGIT SIX */ + { 0x0df7, 0x0e57 }, /* Thai_lekchet ๗ THAI DIGIT SEVEN */ + { 0x0df8, 0x0e58 }, /* Thai_lekpaet ๘ THAI DIGIT EIGHT */ + { 0x0df9, 0x0e59 }, /* Thai_lekkao ๙ THAI DIGIT NINE */ + { 0x0ea1, 0x3131 }, /* Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */ + { 0x0ea2, 0x3132 }, /* Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */ + { 0x0ea3, 0x3133 }, /* Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */ + { 0x0ea4, 0x3134 }, /* Hangul_Nieun ㄴ HANGUL LETTER NIEUN */ + { 0x0ea5, 0x3135 }, /* Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */ + { 0x0ea6, 0x3136 }, /* Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */ + { 0x0ea7, 0x3137 }, /* Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */ + { 0x0ea8, 0x3138 }, /* Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */ + { 0x0ea9, 0x3139 }, /* Hangul_Rieul ㄹ HANGUL LETTER RIEUL */ + { 0x0eaa, 0x313a }, /* Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */ + { 0x0eab, 0x313b }, /* Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */ + { 0x0eac, 0x313c }, /* Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */ + { 0x0ead, 0x313d }, /* Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */ + { 0x0eae, 0x313e }, /* Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */ + { 0x0eaf, 0x313f }, /* Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */ + { 0x0eb0, 0x3140 }, /* Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */ + { 0x0eb1, 0x3141 }, /* Hangul_Mieum ㅁ HANGUL LETTER MIEUM */ + { 0x0eb2, 0x3142 }, /* Hangul_Pieub ㅂ HANGUL LETTER PIEUP */ + { 0x0eb3, 0x3143 }, /* Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */ + { 0x0eb4, 0x3144 }, /* Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */ + { 0x0eb5, 0x3145 }, /* Hangul_Sios ㅅ HANGUL LETTER SIOS */ + { 0x0eb6, 0x3146 }, /* Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */ + { 0x0eb7, 0x3147 }, /* Hangul_Ieung ㅇ HANGUL LETTER IEUNG */ + { 0x0eb8, 0x3148 }, /* Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */ + { 0x0eb9, 0x3149 }, /* Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */ + { 0x0eba, 0x314a }, /* Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */ + { 0x0ebb, 0x314b }, /* Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */ + { 0x0ebc, 0x314c }, /* Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */ + { 0x0ebd, 0x314d }, /* Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */ + { 0x0ebe, 0x314e }, /* Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */ + { 0x0ebf, 0x314f }, /* Hangul_A ㅏ HANGUL LETTER A */ + { 0x0ec0, 0x3150 }, /* Hangul_AE ㅐ HANGUL LETTER AE */ + { 0x0ec1, 0x3151 }, /* Hangul_YA ㅑ HANGUL LETTER YA */ + { 0x0ec2, 0x3152 }, /* Hangul_YAE ㅒ HANGUL LETTER YAE */ + { 0x0ec3, 0x3153 }, /* Hangul_EO ㅓ HANGUL LETTER EO */ + { 0x0ec4, 0x3154 }, /* Hangul_E ㅔ HANGUL LETTER E */ + { 0x0ec5, 0x3155 }, /* Hangul_YEO ㅕ HANGUL LETTER YEO */ + { 0x0ec6, 0x3156 }, /* Hangul_YE ㅖ HANGUL LETTER YE */ + { 0x0ec7, 0x3157 }, /* Hangul_O ㅗ HANGUL LETTER O */ + { 0x0ec8, 0x3158 }, /* Hangul_WA ㅘ HANGUL LETTER WA */ + { 0x0ec9, 0x3159 }, /* Hangul_WAE ㅙ HANGUL LETTER WAE */ + { 0x0eca, 0x315a }, /* Hangul_OE ㅚ HANGUL LETTER OE */ + { 0x0ecb, 0x315b }, /* Hangul_YO ㅛ HANGUL LETTER YO */ + { 0x0ecc, 0x315c }, /* Hangul_U ㅜ HANGUL LETTER U */ + { 0x0ecd, 0x315d }, /* Hangul_WEO ㅝ HANGUL LETTER WEO */ + { 0x0ece, 0x315e }, /* Hangul_WE ㅞ HANGUL LETTER WE */ + { 0x0ecf, 0x315f }, /* Hangul_WI ㅟ HANGUL LETTER WI */ + { 0x0ed0, 0x3160 }, /* Hangul_YU ㅠ HANGUL LETTER YU */ + { 0x0ed1, 0x3161 }, /* Hangul_EU ㅡ HANGUL LETTER EU */ + { 0x0ed2, 0x3162 }, /* Hangul_YI ㅢ HANGUL LETTER YI */ + { 0x0ed3, 0x3163 }, /* Hangul_I ㅣ HANGUL LETTER I */ + { 0x0ed4, 0x11a8 }, /* Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */ + { 0x0ed5, 0x11a9 }, /* Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */ + { 0x0ed6, 0x11aa }, /* Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */ + { 0x0ed7, 0x11ab }, /* Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */ + { 0x0ed8, 0x11ac }, /* Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */ + { 0x0ed9, 0x11ad }, /* Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */ + { 0x0eda, 0x11ae }, /* Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */ + { 0x0edb, 0x11af }, /* Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */ + { 0x0edc, 0x11b0 }, /* Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */ + { 0x0edd, 0x11b1 }, /* Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */ + { 0x0ede, 0x11b2 }, /* Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */ + { 0x0edf, 0x11b3 }, /* Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */ + { 0x0ee0, 0x11b4 }, /* Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */ + { 0x0ee1, 0x11b5 }, /* Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */ + { 0x0ee2, 0x11b6 }, /* Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */ + { 0x0ee3, 0x11b7 }, /* Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */ + { 0x0ee4, 0x11b8 }, /* Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */ + { 0x0ee5, 0x11b9 }, /* Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */ + { 0x0ee6, 0x11ba }, /* Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */ + { 0x0ee7, 0x11bb }, /* Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */ + { 0x0ee8, 0x11bc }, /* Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */ + { 0x0ee9, 0x11bd }, /* Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */ + { 0x0eea, 0x11be }, /* Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */ + { 0x0eeb, 0x11bf }, /* Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */ + { 0x0eec, 0x11c0 }, /* Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */ + { 0x0eed, 0x11c1 }, /* Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */ + { 0x0eee, 0x11c2 }, /* Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */ + { 0x0eef, 0x316d }, /* Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */ + { 0x0ef0, 0x3171 }, /* Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */ + { 0x0ef1, 0x3178 }, /* Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */ + { 0x0ef2, 0x317f }, /* Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */ + { 0x0ef3, 0x3181 }, /* Hangul_KkogjiDalrinIeung ㆁ HANGUL LETTER YESIEUNG */ + { 0x0ef4, 0x3184 }, /* Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */ + { 0x0ef5, 0x3186 }, /* Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */ + { 0x0ef6, 0x318d }, /* Hangul_AraeA ㆍ HANGUL LETTER ARAEA */ + { 0x0ef7, 0x318e }, /* Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */ + { 0x0ef8, 0x11eb }, /* Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */ + { 0x0ef9, 0x11f0 }, /* Hangul_J_KkogjiDalrinIeung ᇰ HANGUL JONGSEONG YESIEUNG */ + { 0x0efa, 0x11f9 }, /* Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */ + { 0x0eff, 0x20a9 }, /* Korean_Won ₩ WON SIGN */ + { 0x13a4, 0x20ac }, /* Euro € EURO SIGN */ + { 0x13bc, 0x0152 }, /* OE Œ LATIN CAPITAL LIGATURE OE */ + { 0x13bd, 0x0153 }, /* oe œ LATIN SMALL LIGATURE OE */ + { 0x13be, 0x0178 }, /* Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */ + { 0x20a0, 0x20a0 }, /* EcuSign ₠ EURO-CURRENCY SIGN */ + { 0x20a1, 0x20a1 }, /* ColonSign ₡ COLON SIGN */ + { 0x20a2, 0x20a2 }, /* CruzeiroSign ₢ CRUZEIRO SIGN */ + { 0x20a3, 0x20a3 }, /* FFrancSign ₣ FRENCH FRANC SIGN */ + { 0x20a4, 0x20a4 }, /* LiraSign ₤ LIRA SIGN */ + { 0x20a5, 0x20a5 }, /* MillSign ₥ MILL SIGN */ + { 0x20a6, 0x20a6 }, /* NairaSign ₦ NAIRA SIGN */ + { 0x20a7, 0x20a7 }, /* PesetaSign ₧ PESETA SIGN */ + { 0x20a8, 0x20a8 }, /* RupeeSign ₨ RUPEE SIGN */ + { 0x20a9, 0x20a9 }, /* WonSign ₩ WON SIGN */ + { 0x20aa, 0x20aa }, /* NewSheqelSign ₪ NEW SHEQEL SIGN */ + { 0x20ab, 0x20ab }, /* DongSign ₫ DONG SIGN */ + { 0x20ac, 0x20ac }, /* EuroSign € EURO SIGN */ +}; + +VISIBLE +long keysym2ucs(KeySym keysym) +{ + int min = 0; + int max = sizeof(keysymtab) / sizeof(struct codepair) - 1; + + /* first check for Latin-1 characters (1:1 mapping) */ + if ((keysym >= 0x0020 && keysym <= 0x007e) || + (keysym >= 0x00a0 && keysym <= 0x00ff)) + return (long) keysym; + + /* also check for directly encoded 24-bit UCS characters */ + if ((keysym & 0xff000000) == 0x01000000) + return (long) (keysym & 0x00ffffff); + + /* binary search in table */ + while (max >= min) { + int mid = (min + max) / 2; + if (keysymtab[mid].keysym < keysym) + min = mid + 1; + else if (keysymtab[mid].keysym > keysym) + max = mid - 1; + else { + /* found it */ + return keysymtab[mid].ucs; + } + } + + /* no matching Unicode value found */ + return -1; +} diff --git a/ports/xterm/xterm-359/keysym2ucs.h b/ports/xterm/xterm-359/keysym2ucs.h new file mode 100644 index 0000000..1f23ac6 --- /dev/null +++ b/ports/xterm/xterm-359/keysym2ucs.h @@ -0,0 +1,9 @@ +/* $XFree86: xc/programs/xterm/keysym2ucs.h,v 1.1 1999/06/12 15:37:18 dawes Exp $ */ +/* + * This module converts keysym values into the corresponding ISO 10646-1 + * (UCS, Unicode) values. + */ + +#include + +long keysym2ucs(KeySym keysym); diff --git a/ports/xterm/xterm-359/koi8rxterm b/ports/xterm/xterm-359/koi8rxterm new file mode 100755 index 0000000..98f85ca --- /dev/null +++ b/ports/xterm/xterm-359/koi8rxterm @@ -0,0 +1,115 @@ +#!/bin/sh +# $XTermId: koi8rxterm,v 1.5 2007/12/30 16:33:06 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2007 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# This is a wrapper script to set up xterm with a KOI8-R locale; based on +# uxterm by Branden Robinson. + +whoami=koi8rxterm + +: ${XTERM_PROGRAM=xterm} + +# Check if there is a workable locale program. If there is not, we will read +# something via the standard error. Ignore whatever is written to the +# standard output. +locale=`sh -c "LC_ALL=C LC_CTYPE=C LANG=C locale >/dev/null" 2>&1` +found=no + +# Check for -version and -help options, to provide a simple return without +# requiring the program to create a window: +if test $# = 1 +then + case $1 in + -v|-ver*|-h|-he*) + $XTERM_PROGRAM "$@" + exit $? + ;; + esac +fi + +# Check environment variables that xterm does, in the same order: +for name in LC_ALL LC_CTYPE LANG +do + eval 'value=$'$name + if test -n "$value" ; then + case $value in + *.koi8r|*.KOI8R|*.koi8-r|*.KOI8-R) + found=yes + ;; + *.koi8r@*|*.KOI8R@*|*.koi8-r@*|*.KOI8-R*) + found=yes + ;; + *) + # The user may not have configured his or her + # locale; try to muddle through anyway. + value=ru_RU.KOI8-R + ;; + esac + break + fi +done + +# If we didn't find one that uses KOI8-R, modify the safest one. Not everyone +# has a KOI8-R locale installed (and there appears to be no trivial/portable +# way to determine whether it is, from a shell script). We could check if the +# user's shell does not reset unknown locale specifiers, but not all shells do. +if test $found != yes ; then + if test -n "$value" ; then + value=`echo ${value} |sed -e 's/[.@].*//'`.KOI8-R + else + name="LC_CTYPE" + value="ru_RU.KOI8-R" + fi + eval save=\$${name} + eval ${name}=${value} + eval export ${name} + if test -z "$locale" ; then + # The 'locale' program tries to do a sanity check. + check=`sh -c "locale >/dev/null" 2>&1` + if test -n "$check" ; then + eval ${name}=${save} + eval export ${name} + + echo "$whoami tried to use locale $value by setting \$$name" >&2 + xmessage -file - < +#include + +#include + +/* + * Given a row-number, find the corresponding data for the line in the VT100 + * widget. Row numbers can be positive or negative. + * + * If the data comes from the scrollback, defer that to getScrollback(). + */ +LineData * +getLineData(TScreen *screen, int row) +{ + LineData *result = 0; + ScrnBuf buffer; + int max_row = screen->max_row; + + if (row >= 0) { + buffer = screen->visbuf; + } else { +#if OPT_FIFO_LINES + buffer = 0; + result = getScrollback(screen, row); +#else + buffer = screen->saveBuf_index; + row += screen->savelines; + max_row += screen->savelines; +#endif + } + if (row >= 0 && row <= max_row) { + result = (LineData *) scrnHeadAddr(screen, buffer, (unsigned) row); + } + + return result; +} + +/* + * Copy line's data, e.g., from one screen buffer to another, given the preset + * pointers for the destination. + * + * TODO: optionally prune unused combining character data from the result. + */ +void +copyLineData(LineData *dst, CLineData *src) +{ + if (dst == NULL || src == NULL) + return; + + dst->bufHead = src->bufHead; + +#if OPT_WIDE_CHARS + dst->combSize = src->combSize; +#endif + + /* + * Usually we're copying the same-sized line; a memcpy is faster than + * several loops. + */ + if (dst->lineSize == src->lineSize) { + size_t size = (sizeof(dst->attribs[0]) +#if OPT_ISO_COLORS + + sizeof(dst->color[0]) +#endif + + sizeof(dst->charData[0]) +#if OPT_WIDE_CHARS + + sizeof(dst->combData[0][0]) * dst->combSize +#endif + ); + + memcpy(dst->attribs, src->attribs, size * dst->lineSize); + } else { + Dimension col; + Dimension limit = ((dst->lineSize < src->lineSize) + ? dst->lineSize + : src->lineSize); +#if OPT_WIDE_CHARS + Char comb; +#endif + + for (col = 0; col < limit; ++col) { + dst->attribs[col] = src->attribs[col]; +#if OPT_ISO_COLORS + dst->color[col] = src->color[col]; +#endif + dst->charData[col] = src->charData[col]; +#if OPT_WIDE_CHARS + for (comb = 0; comb < dst->combSize; ++comb) { + dst->combData[comb][col] = src->combData[comb][col]; + } +#endif + } + for (col = limit; col < dst->lineSize; ++col) { + dst->attribs[col] = 0; +#if OPT_ISO_COLORS + dst->color[col] = initCColor; +#endif + dst->charData[col] = 0; +#if OPT_WIDE_CHARS + for (comb = 0; comb < dst->combSize; ++comb) { + dst->combData[comb][col] = 0; + } +#endif + } + } +} + +#if OPT_WIDE_CHARS +#define initLineExtra(screen) \ + screen->lineExtra = ((size_t) (screen->max_combining) * sizeof(IChar *)); \ + screen->cellExtra = ((size_t) (screen->max_combining) * sizeof(IChar)) +#else +#define initLineExtra(screen) \ + screen->lineExtra = 0; \ + screen->cellExtra = 0 +#endif + +/* + * CellData size depends on the "combiningChars" resource. + */ +#define CellDataSize(screen) (SizeOfCellData + screen->cellExtra) + +#define CellDataAddr(screen, data, cell) \ + ( (CellData *)(void *) ((char *)data + (cell * CellDataSize(screen))) ) +#define ConstCellDataAddr(screen, data, cell) \ + ( (const CellData *)(const void *) ( \ + (const char *)data + (cell * CellDataSize(screen))) ) + +void +initLineData(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + initLineExtra(screen); + +#if OPT_WIDE_CHARS + TRACE(("initLineData %lu (%d combining chars)\n", + (unsigned long) screen->lineExtra, screen->max_combining)); +#else + TRACE(("initLineData\n")); +#endif + + /* + * Per-line size/offsets. + */ + TRACE(("** sizeof(LineData) %lu\n", (unsigned long) sizeof(LineData))); + TRACE((" offset(lineSize) %lu\n", (unsigned long) offsetof(LineData, lineSize))); + TRACE((" offset(bufHead) %lu\n", (unsigned long) offsetof(LineData, bufHead))); +#if OPT_WIDE_CHARS + TRACE((" offset(combSize) %lu\n", (unsigned long) offsetof(LineData, combSize))); +#endif + TRACE((" offset(*attribs) %lu\n", (unsigned long) offsetof(LineData, attribs))); +#if OPT_ISO_COLORS + TRACE((" offset(*color) %lu\n", (unsigned long) offsetof(LineData, color))); +#endif + TRACE((" offset(*charData) %lu\n", (unsigned long) offsetof(LineData, charData))); + TRACE((" offset(*combData) %lu\n", (unsigned long) offsetof(LineData, combData))); + + /* + * Per-cell size/offsets. + */ + TRACE(("** sizeof(CellData) %lu\n", (unsigned long) CellDataSize(screen))); + TRACE((" offset(attribs) %lu\n", (unsigned long) offsetof(CellData, attribs))); +#if OPT_WIDE_CHARS + TRACE((" offset(combSize) %lu\n", (unsigned long) offsetof(CellData, combSize))); +#endif +#if OPT_ISO_COLORS + TRACE((" offset(color) %lu\n", (unsigned long) offsetof(CellData, color))); +#endif + TRACE((" offset(charData) %lu\n", (unsigned long) offsetof(CellData, charData))); + TRACE((" offset(combData) %lu\n", (unsigned long) offsetof(CellData, combData))); + + /* + * Data-type sizes. + */ +#if OPT_ISO_COLORS + TRACE(("** sizeof(CellColor) %lu\n", (unsigned long) sizeof(CellColor))); +#endif + TRACE(("** sizeof(IAttr) %lu\n", (unsigned long) sizeof(IAttr))); + TRACE(("** sizeof(IChar) %lu\n", (unsigned long) sizeof(IChar))); + TRACE(("** sizeof(RowData) %lu\n", (unsigned long) sizeof(RowData))); +} + +CellData * +newCellData(XtermWidget xw, Cardinal count) +{ + CellData *result; + TScreen *screen = TScreenOf(xw); + + initLineExtra(screen); + result = (CellData *) calloc((size_t) count, (size_t) CellDataSize(screen)); + return result; +} + +void +saveCellData(TScreen *screen, + CellData *data, + Cardinal cell, + CLineData *ld, + XTermRect *limits, + int column) +{ + CellData *item = CellDataAddr(screen, data, cell); + + (void) limits; + if (column < MaxCols(screen)) { + item->attribs = ld->attribs[column]; + if_OPT_ISO_COLORS(screen, { + item->color = ld->color[column]; + }); + item->charData = ld->charData[column]; + if_OPT_WIDE_CHARS(screen, { + size_t off; + Bool blank = (((item->charData == HIDDEN_CHAR) + && (limits == NULL + || (column + 1) == limits->left)) + || (item->charData != HIDDEN_CHAR + && WideCells(item->charData) > 1 + && (limits == NULL + || (column + 1) >= limits->right))); + if (blank) { + item->charData = (Char) ' '; + } + item->combSize = blank ? 0 : ld->combSize; + for_each_combData(off, item) { + item->combData[off] = ld->combData[off][column]; + } + }); + TRACE2(("SAVED::%s\n", visibleIChars(&(item->charData), 1))); + } +} + +void +restoreCellData(TScreen *screen, + const CellData *data, + Cardinal cell, + LineData *ld, + XTermRect *limits, + int column) +{ + const CellData *item = ConstCellDataAddr(screen, data, cell); + + (void) limits; + if (column < MaxCols(screen)) { + ld->attribs[column] = item->attribs; + TRACE2(("BEFORE:%2d:%s\n", column + 1, visibleIChars(ld->charData, ld->lineSize))); + if_OPT_ISO_COLORS(screen, { + ld->color[column] = item->color; + }); + ld->charData[column] = item->charData; + if_OPT_WIDE_CHARS(screen, { + size_t off; + ld->combSize = item->combSize; + for_each_combData(off, ld) { + ld->combData[off][column] = item->combData[off]; + } + }); + TRACE2(("AFTER::%2d:%s\n", column + 1, visibleIChars(ld->charData, ld->lineSize))); + } +} diff --git a/ports/xterm/xterm-359/linedata.o b/ports/xterm/xterm-359/linedata.o new file mode 100644 index 0000000000000000000000000000000000000000..0a5e1303e80b75623da8d1f49812b13331c6befc GIT binary patch literal 61040 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 sfzVF96#+g#qZ7^`$V1c;@6q#2R{FQ00^Wu8vp +#include +#include + +#include + +#if OPT_TOOLBAR + +#if defined(HAVE_LIB_XAW) +#include +#elif defined(HAVE_LIB_XAW3D) +#include +#elif defined(HAVE_LIB_XAW3DXFT) +#include +#elif defined(HAVE_LIB_NEXTAW) +#include +#elif defined(HAVE_LIB_XAWPLUS) +#include +#endif + +#endif /* OPT_TOOLBAR */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#if OPT_WIDE_CHARS +#include +#endif + +#ifdef __osf__ +#define USE_SYSV_SIGNALS +#define WTMP +#include /* openpty() */ +#endif + +#ifdef __sgi +#include /* initgroups() */ +#endif + +static void hungtty(int) GCC_NORETURN; +static void Syntax(char *) GCC_NORETURN; +static void HsSysError(int) GCC_NORETURN; + +#if defined(__SCO__) || defined(SVR4) || defined(_POSIX_SOURCE) || ( defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 1) ) +#define USE_POSIX_SIGNALS +#endif + +#if defined(SYSV) && !defined(SVR4) && !defined(ISC22) && !defined(ISC30) +/* older SYSV systems cannot ignore SIGHUP. + Shell hangs, or you get extra shells, or something like that */ +#define USE_SYSV_SIGHUP +#endif + +#if defined(sony) && defined(bsd43) && !defined(KANJI) +#define KANJI +#endif + +#ifdef linux +#define USE_SYSV_PGRP +#define USE_SYSV_SIGNALS +#define WTMP +#ifdef __GLIBC__ +#if (__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1)) +#include +#endif +#endif +#endif + +#ifdef __MVS__ +#define USE_SYSV_PGRP +#define USE_SYSV_SIGNALS +#endif + +#ifdef __CYGWIN__ +#define WTMP +#endif + +#ifdef __SCO__ +#ifndef _SVID3 +#define _SVID3 +#endif +#endif + +#if defined(__GLIBC__) && !defined(linux) +#define USE_SYSV_PGRP +#define WTMP +#endif + +#if defined(USE_TTY_GROUP) || defined(USE_UTMP_SETGID) || defined(HAVE_INITGROUPS) +#include +#endif + +#ifndef TTY_GROUP_NAME +#define TTY_GROUP_NAME "tty" +#endif + +#include + +#ifdef Lynx +#ifndef BSDLY +#define BSDLY 0 +#endif +#ifndef VTDLY +#define VTDLY 0 +#endif +#ifndef FFDLY +#define FFDLY 0 +#endif +#endif + +#ifdef SYSV /* { */ + +#ifdef USE_USG_PTYS /* AT&T SYSV has no ptyio.h */ +#include /* for I_PUSH */ +#include /* for POLLIN */ +#endif /* USE_USG_PTYS */ + +#define USE_SYSV_SIGNALS +#define USE_SYSV_PGRP + +#if !defined(TIOCSWINSZ) || defined(__SCO__) || defined(__UNIXWARE__) +#define USE_SYSV_ENVVARS /* COLUMNS/LINES vs. TERMCAP */ +#endif + +/* + * now get system-specific includes + */ +#ifdef macII +#include +#undef USE_SYSV_ENVVARS +#undef FIOCLEX +#undef FIONCLEX +#define setpgrp2 setpgrp +#include +#include +#endif + +#ifdef __hpux +#include +#endif /* __hpux */ + +#ifdef __osf__ +#undef USE_SYSV_PGRP +#define setpgrp setpgid +#endif + +#ifdef __sgi +#include +#endif /* __sgi */ + +#ifdef sun +#include +#endif + +#else /* } !SYSV { */ /* BSD systems */ + +#ifdef __QNX__ + +#ifndef __QNXNTO__ +#define ttyslot() 1 +#else +#define USE_SYSV_PGRP +extern __inline__ +int +ttyslot(void) +{ + return 1; /* yuk */ +} +#endif + +#else + +#if defined(__INTERIX) || defined(__APPLE__) +#define setpgrp setpgid +#endif + +#ifndef linux +#ifndef VMS +#ifndef USE_POSIX_TERMIOS +#ifndef USE_ANY_SYSV_TERMIO +#include +#endif +#endif /* USE_POSIX_TERMIOS */ +#ifdef Lynx +#include +#else +#include +#endif +#endif /* !VMS */ +#endif /* !linux */ + +#endif /* __QNX__ */ + +#endif /* } !SYSV */ + +/* Xpoll.h and on glibc 2.1 systems have colliding NBBY's */ +#if defined(__GLIBC__) && ((__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1))) +#ifndef NOFILE +#define NOFILE OPEN_MAX +#endif +#elif !(defined(VMS) || defined(WIN32) || defined(Lynx) || defined(__GNU__) || defined(__MVS__)) +#include /* for NOFILE */ +#endif + +#if defined(BSD) && (BSD >= 199103) +#define WTMP +#endif + +#include + +#ifdef __hpux +#include +#endif /* __hpux */ + +#if defined(apollo) && (OSMAJORVERSION == 10) && (OSMINORVERSION < 4) +#define ttyslot() 1 +#endif /* apollo */ + +#if defined(UTMPX_FOR_UTMP) +#define UTMP_STR utmpx +#else +#define UTMP_STR utmp +#endif + +#if defined(USE_UTEMPTER) +#include +#if 1 +#define UTEMPTER_ADD(pty,hostname,master_fd) utempter_add_record(master_fd, hostname) +#define UTEMPTER_DEL() utempter_remove_added_record () +#else +#define UTEMPTER_ADD(pty,hostname,master_fd) addToUtmp(pty, hostname, master_fd) +#define UTEMPTER_DEL() removeFromUtmp() +#endif +#endif + +#if defined(I_FIND) && defined(I_PUSH) +#define PUSH_FAILS(fd,name) ioctl(fd, I_FIND, name) == 0 \ + && ioctl(fd, I_PUSH, name) < 0 +#else +#define PUSH_FAILS(fd,name) ioctl(fd, I_PUSH, name) < 0 +#endif + +#if defined(UTMPX_FOR_UTMP) + +#include + +#define call_endutent endutxent +#define call_getutid getutxid +#define call_pututline pututxline +#define call_setutent setutxent +#define call_updwtmp updwtmpx + +#elif defined(HAVE_UTMP) + +#include + +#if defined(_CRAY) && (OSMAJORVERSION < 8) +extern struct utmp *getutid __((struct utmp * _Id)); +#endif + +#define call_endutent endutent +#define call_getutid getutid +#define call_pututline pututline +#define call_setutent setutent +#define call_updwtmp updwtmp + +#endif + +#if defined(USE_LASTLOG) && defined(HAVE_LASTLOG_H) +#include /* caution: glibc includes utmp.h here */ +#endif + +#ifndef USE_LASTLOGX +#if defined(_NETBSD_SOURCE) && defined(_PATH_LASTLOGX) +#define USE_LASTLOGX 1 +#endif +#endif + +#ifdef PUCC_PTYD +#include +#endif /* PUCC_PTYD */ + +#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__) +#include /* openpty() */ +#endif + +#if defined(__FreeBSD__) || defined(__DragonFly__) +#include /* openpty() */ +#endif + +#if !defined(UTMP_FILENAME) +#if defined(UTMP_FILE) +#define UTMP_FILENAME UTMP_FILE +#elif defined(_PATH_UTMP) +#define UTMP_FILENAME _PATH_UTMP +#else +#define UTMP_FILENAME "/etc/utmp" +#endif +#endif + +#ifndef LASTLOG_FILENAME +#ifdef _PATH_LASTLOG +#define LASTLOG_FILENAME _PATH_LASTLOG +#else +#define LASTLOG_FILENAME "/usr/adm/lastlog" /* only on BSD systems */ +#endif +#endif + +#if !defined(WTMP_FILENAME) +#if defined(WTMP_FILE) +#define WTMP_FILENAME WTMP_FILE +#elif defined(_PATH_WTMP) +#define WTMP_FILENAME _PATH_WTMP +#elif defined(SYSV) +#define WTMP_FILENAME "/etc/wtmp" +#else +#define WTMP_FILENAME "/usr/adm/wtmp" +#endif +#endif + +#include + +#if defined(__SCO__) || (defined(ISC) && !defined(_POSIX_SOURCE)) +#undef SIGTSTP /* defined, but not the BSD way */ +#endif + +#ifdef SIGTSTP +#include +#endif + +#if defined(__SCO__) || defined(__UNIXWARE__) +#undef ECHOKE +#undef ECHOCTL +#endif + +#if defined(HAVE_SYS_TTYDEFAULTS_H) && !defined(CEOF) +#include +#endif + +#ifdef X_NOT_POSIX +extern long lseek(); +#if defined(USG) || defined(SVR4) +extern unsigned sleep(); +#else +extern void sleep(); +#endif +extern char *ttyname(); +#endif + +#if defined(SYSV) && defined(DECL_PTSNAME) +extern char *ptsname(int); +#endif + +#ifndef VMS +static void reapchild(int /* n */ ); +static int spawnXTerm(XtermWidget /* xw */ + ,unsigned /* line_speed */ ); +static void remove_termcap_entry(char *, const char *); +#ifdef USE_PTY_SEARCH +static int pty_search(int * /* pty */ ); +#endif +#endif /* ! VMS */ + +static int get_pty(int *pty, char *from); +static void resize_termcap(XtermWidget xw); +static void set_owner(char *device, unsigned uid, unsigned gid, unsigned mode); + +static Bool added_utmp_entry = False; + +#ifdef HAVE_POSIX_SAVED_IDS +static uid_t save_euid; +static gid_t save_egid; +#endif + +static uid_t save_ruid; +static gid_t save_rgid; + +#if defined(USE_UTMP_SETGID) +static int really_get_pty(int *pty, char *from); +#endif + +#if defined(USE_SYSV_UTMP) && !defined(USE_UTEMPTER) +static Bool xterm_exiting = False; +#endif + +static char *explicit_shname = NULL; + +/* +** Ordinarily it should be okay to omit the assignment in the following +** statement. Apparently the c89 compiler on AIX 4.1.3 has a bug, or does +** it? Without the assignment though the compiler will init command_to_exec +** to 0xffffffff instead of NULL; and subsequent usage, e.g. in spawnXTerm() to +** SEGV. +*/ +static char **command_to_exec = NULL; + +#if OPT_LUIT_PROG +static char **command_to_exec_with_luit = NULL; +static unsigned command_length_with_luit = 0; +#endif + +#define TERMCAP_ERASE "kb" +#define VAL_INITIAL_ERASE A2E(8) + +/* choose a nice default value for speed - if we make it too low, users who + * mistakenly use $TERM set to vt100 will get padding delays. Setting it to a + * higher value is not useful since legacy applications (termcap) that care + * about padding generally store the code in a short, which does not have + * enough bits for the extended values. + */ +#ifdef B38400 /* everyone should define this */ +#define VAL_LINE_SPEED B38400 +#else /* ...but xterm's used this for a long time */ +#define VAL_LINE_SPEED B9600 +#endif + +/* + * Allow use of system default characters if defined and reasonable. + * These are based on the BSD ttydefaults.h + */ +#ifndef CBRK +#define CBRK 0xff /* was 0 */ +#endif +#ifndef CDISCARD +#define CDISCARD CONTROL('O') +#endif +#ifndef CDSUSP +#define CDSUSP CONTROL('Y') +#endif +#ifndef CEOF +#define CEOF CONTROL('D') +#endif +#ifndef CEOL +#define CEOL 0xff /* was 0 */ +#endif +#ifndef CERASE +#define CERASE 0177 +#endif +#ifndef CERASE2 +#define CERASE2 CONTROL('H') +#endif +#ifndef CFLUSH +#define CFLUSH CONTROL('O') +#endif +#ifndef CINTR +#define CINTR CONTROL('C') +#endif +#ifndef CKILL +#define CKILL CONTROL('U') /* was '@' */ +#endif +#ifndef CLNEXT +#define CLNEXT CONTROL('V') +#endif +#ifndef CNUL +#define CNUL 0 +#endif +#ifndef CQUIT +#define CQUIT CONTROL('\\') +#endif +#ifndef CRPRNT +#define CRPRNT CONTROL('R') +#endif +#ifndef CREPRINT +#define CREPRINT CRPRNT +#endif +#ifndef CSTART +#define CSTART CONTROL('Q') +#endif +#ifndef CSTATUS +#define CSTATUS CONTROL('T') +#endif +#ifndef CSTOP +#define CSTOP CONTROL('S') +#endif +#ifndef CSUSP +#define CSUSP CONTROL('Z') +#endif +#ifndef CSWTCH +#define CSWTCH 0 +#endif +#ifndef CWERASE +#define CWERASE CONTROL('W') +#endif + +#ifdef USE_ANY_SYSV_TERMIO +#define TERMIO_STRUCT struct termio +#define ttySetAttr(fd, datap) ioctl(fd, TCSETA, datap) +#define ttyGetAttr(fd, datap) ioctl(fd, TCGETA, datap) +#define ttyFlush(fd) ioctl(fd, TCFLSH, 1) +#elif defined(USE_POSIX_TERMIOS) +#define TERMIO_STRUCT struct termios +#define ttySetAttr(fd, datap) tcsetattr(fd, TCSANOW, datap) +#define ttyGetAttr(fd, datap) tcgetattr(fd, datap) +#define ttyFlush(fd) tcflush(fd, TCOFLUSH) +#endif /* USE_ANY_SYSV_TERMIO */ + +#ifndef VMS +#ifdef TERMIO_STRUCT +/* The following structures are initialized in main() in order +** to eliminate any assumptions about the internal order of their +** contents. +*/ +static TERMIO_STRUCT d_tio; + +#ifndef ONLCR +#define ONLCR 0 +#endif + +#ifndef OPOST +#define OPOST 0 +#endif + +#define D_TIO_FLAGS (OPOST | ONLCR) + +#ifdef HAS_LTCHARS +static struct ltchars d_ltc; +#endif /* HAS_LTCHARS */ + +#ifdef TIOCLSET +static unsigned int d_lmode; +#endif /* TIOCLSET */ + +#else /* !TERMIO_STRUCT */ + +#define D_SG_FLAGS (EVENP | ODDP | ECHO | CRMOD) + +static struct sgttyb d_sg = +{ + 0, 0, 0177, CKILL, (D_SG_FLAGS | XTABS) +}; +static struct tchars d_tc = +{ + CINTR, CQUIT, CSTART, + CSTOP, CEOF, CBRK +}; +static struct ltchars d_ltc = +{ + CSUSP, CDSUSP, CRPRNT, + CFLUSH, CWERASE, CLNEXT +}; +static int d_disipline = NTTYDISC; +static long int d_lmode = LCRTBS | LCRTERA | LCRTKIL | LCTLECH; +#ifdef sony +static long int d_jmode = KM_SYSSJIS | KM_ASCII; +static struct jtchars d_jtc = +{ + 'J', 'B' +}; +#endif /* sony */ +#endif /* TERMIO_STRUCT */ +#endif /* ! VMS */ + +/* + * SYSV has the termio.c_cc[V] and ltchars; BSD has tchars and ltchars; + * SVR4 has only termio.c_cc, but it includes everything from ltchars. + * POSIX termios has termios.c_cc, which is similar to SVR4. + */ +#define TTYMODE(name) { name, sizeof(name)-1, 0, 0 } +static Boolean override_tty_modes = False; +/* *INDENT-OFF* */ +static struct { + const char *name; + size_t len; + int set; + int value; +} ttyModes[] = { + TTYMODE("intr"), /* tchars.t_intrc ; VINTR */ +#define XTTYMODE_intr 0 + TTYMODE("quit"), /* tchars.t_quitc ; VQUIT */ +#define XTTYMODE_quit 1 + TTYMODE("erase"), /* sgttyb.sg_erase ; VERASE */ +#define XTTYMODE_erase 2 + TTYMODE("kill"), /* sgttyb.sg_kill ; VKILL */ +#define XTTYMODE_kill 3 + TTYMODE("eof"), /* tchars.t_eofc ; VEOF */ +#define XTTYMODE_eof 4 + TTYMODE("eol"), /* VEOL */ +#define XTTYMODE_eol 5 + TTYMODE("swtch"), /* VSWTCH */ +#define XTTYMODE_swtch 6 + TTYMODE("start"), /* tchars.t_startc ; VSTART */ +#define XTTYMODE_start 7 + TTYMODE("stop"), /* tchars.t_stopc ; VSTOP */ +#define XTTYMODE_stop 8 + TTYMODE("brk"), /* tchars.t_brkc */ +#define XTTYMODE_brk 9 + TTYMODE("susp"), /* ltchars.t_suspc ; VSUSP */ +#define XTTYMODE_susp 10 + TTYMODE("dsusp"), /* ltchars.t_dsuspc ; VDSUSP */ +#define XTTYMODE_dsusp 11 + TTYMODE("rprnt"), /* ltchars.t_rprntc ; VREPRINT */ +#define XTTYMODE_rprnt 12 + TTYMODE("flush"), /* ltchars.t_flushc ; VDISCARD */ +#define XTTYMODE_flush 13 + TTYMODE("weras"), /* ltchars.t_werasc ; VWERASE */ +#define XTTYMODE_weras 14 + TTYMODE("lnext"), /* ltchars.t_lnextc ; VLNEXT */ +#define XTTYMODE_lnext 15 + TTYMODE("status"), /* VSTATUS */ +#define XTTYMODE_status 16 + TTYMODE("erase2"), /* VERASE2 */ +#define XTTYMODE_erase2 17 + TTYMODE("eol2"), /* VEOL2 */ +#define XTTYMODE_eol2 18 + TTYMODE("tabs"), /* TAB0 */ +#define XTTYMODE_tabs 19 + TTYMODE("-tabs"), /* TAB3 */ +#define XTTYMODE__tabs 20 +}; + +#ifndef TAB0 +#define TAB0 0 +#endif + +#ifndef TAB3 +#if defined(OXTABS) +#define TAB3 OXTABS +#elif defined(XTABS) +#define TAB3 XTABS +#endif +#endif + +#ifndef TABDLY +#define TABDLY (TAB0|TAB3) +#endif + +#define isTtyMode(p,q) (ttyChars[p].myMode == q && ttyModes[q].set) + +#define isTabMode(n) \ + (isTtyMode(n, XTTYMODE_tabs) || \ + isTtyMode(n, XTTYMODE__tabs)) + +#define TMODE(ind,var) \ + if (ttyModes[ind].set) \ + var = (cc_t) ttyModes[ind].value + +#define validTtyChar(data, n) \ + (ttyChars[n].sysMode >= 0 && \ + ttyChars[n].sysMode < (int) XtNumber(data.c_cc)) + +static const struct { + int sysMode; + int myMode; + int myDefault; +} ttyChars[] = { +#ifdef VINTR + { VINTR, XTTYMODE_intr, CINTR }, +#endif +#ifdef VQUIT + { VQUIT, XTTYMODE_quit, CQUIT }, +#endif +#ifdef VERASE + { VERASE, XTTYMODE_erase, CERASE }, +#endif +#ifdef VKILL + { VKILL, XTTYMODE_kill, CKILL }, +#endif +#ifdef VEOF + { VEOF, XTTYMODE_eof, CEOF }, +#endif +#ifdef VEOL + { VEOL, XTTYMODE_eol, CEOL }, +#endif +#ifdef VSWTCH + { VSWTCH, XTTYMODE_swtch, CNUL }, +#endif +#ifdef VSTART + { VSTART, XTTYMODE_start, CSTART }, +#endif +#ifdef VSTOP + { VSTOP, XTTYMODE_stop, CSTOP }, +#endif +#ifdef VSUSP + { VSUSP, XTTYMODE_susp, CSUSP }, +#endif +#ifdef VDSUSP + { VDSUSP, XTTYMODE_dsusp, CDSUSP }, +#endif +#ifdef VREPRINT + { VREPRINT, XTTYMODE_rprnt, CREPRINT }, +#endif +#ifdef VDISCARD + { VDISCARD, XTTYMODE_flush, CDISCARD }, +#endif +#ifdef VWERASE + { VWERASE, XTTYMODE_weras, CWERASE }, +#endif +#ifdef VLNEXT + { VLNEXT, XTTYMODE_lnext, CLNEXT }, +#endif +#ifdef VSTATUS + { VSTATUS, XTTYMODE_status, CSTATUS }, +#endif +#ifdef VERASE2 + { VERASE2, XTTYMODE_erase2, CERASE2 }, +#endif +#ifdef VEOL2 + { VEOL2, XTTYMODE_eol2, CNUL }, +#endif + { -1, XTTYMODE_tabs, TAB0 }, + { -1, XTTYMODE__tabs, TAB3 }, +}; +/* *INDENT-ON* */ + +static int parse_tty_modes(char *s); + +#ifndef USE_UTEMPTER +#ifdef USE_SYSV_UTMP +#if (defined(AIXV3) && (OSMAJORVERSION < 4)) && !(defined(getutid)) +extern struct utmp *getutid(); +#endif /* AIXV3 */ + +#else /* not USE_SYSV_UTMP */ +static char etc_utmp[] = UTMP_FILENAME; +#endif /* USE_SYSV_UTMP */ + +#if defined(USE_LASTLOG) && defined(USE_STRUCT_LASTLOG) +static char etc_lastlog[] = LASTLOG_FILENAME; +#else +#undef USE_LASTLOG +#endif + +#ifdef WTMP +static char etc_wtmp[] = WTMP_FILENAME; +#endif +#endif /* !USE_UTEMPTER */ + +/* + * Some people with 4.3bsd /bin/login seem to like to use login -p -f user + * to implement xterm -ls. They can turn on USE_LOGIN_DASH_P and turn off + * WTMP and USE_LASTLOG. + */ +#ifdef USE_LOGIN_DASH_P +#ifndef LOGIN_FILENAME +#define LOGIN_FILENAME "/bin/login" +#endif +static char bin_login[] = LOGIN_FILENAME; +#endif + +static char noPassedPty[2]; +static char *passedPty = noPassedPty; /* name if pty if slave */ + +#if defined(TIOCCONS) || defined(SRIOCSREDIR) +static int Console; +#include /* XmuGetHostname */ +#define MIT_CONSOLE_LEN 12 +#define MIT_CONSOLE "MIT_CONSOLE_" +static char mit_console_name[255 + MIT_CONSOLE_LEN + 1] = MIT_CONSOLE; +static Atom mit_console; +#endif /* TIOCCONS */ + +#ifndef USE_SYSV_UTMP +static int tslot; +#endif /* USE_SYSV_UTMP */ +static sigjmp_buf env; + +#define SetUtmpHost(dst, screen) \ + { \ + char host[sizeof(dst) + 1]; \ + strncpy(host, DisplayString(screen->display), sizeof(host) - 1); \ + host[sizeof(dst)] = '\0'; \ + TRACE(("DisplayString(%s)\n", host)); \ + if (!resource.utmpDisplayId) { \ + char *endptr = strrchr(host, ':'); \ + if (endptr) { \ + TRACE(("trimming display-id '%s'\n", host)); \ + *endptr = '\0'; \ + } \ + } \ + copy_filled(dst, host, sizeof(dst)); \ + } + +#ifdef HAVE_UTMP_UT_SYSLEN +# define SetUtmpSysLen(utmp) \ + { \ + utmp.ut_host[sizeof(utmp.ut_host)-1] = '\0'; \ + utmp.ut_syslen = (short) ((int) strlen(utmp.ut_host) + 1); \ + } +#endif + +/* used by VT (charproc.c) */ + +static XtResource application_resources[] = +{ + Sres("iconGeometry", "IconGeometry", icon_geometry, NULL), + Sres(XtNtitle, XtCTitle, title, NULL), + Sres(XtNiconHint, XtCIconHint, icon_hint, NULL), + Sres(XtNiconName, XtCIconName, icon_name, NULL), + Sres("termName", "TermName", term_name, NULL), + Sres("ttyModes", "TtyModes", tty_modes, NULL), + Sres("validShells", "ValidShells", valid_shells, NULL), + Bres("hold", "Hold", hold_screen, False), + Bres("utmpInhibit", "UtmpInhibit", utmpInhibit, False), + Bres("utmpDisplayId", "UtmpDisplayId", utmpDisplayId, True), + Bres("messages", "Messages", messages, True), + Ires("minBufSize", "MinBufSize", minBufSize, 4096), + Ires("maxBufSize", "MaxBufSize", maxBufSize, 32768), + Sres("menuLocale", "MenuLocale", menuLocale, DEF_MENU_LOCALE), + Sres("omitTranslation", "OmitTranslation", omitTranslation, NULL), + Sres("keyboardType", "KeyboardType", keyboardType, "unknown"), +#if OPT_PRINT_ON_EXIT + Ires("printModeImmediate", "PrintModeImmediate", printModeNow, 0), + Ires("printOptsImmediate", "PrintOptsImmediate", printOptsNow, 9), + Sres("printFileImmediate", "PrintFileImmediate", printFileNow, NULL), + Ires("printModeOnXError", "PrintModeOnXError", printModeOnXError, 0), + Ires("printOptsOnXError", "PrintOptsOnXError", printOptsOnXError, 9), + Sres("printFileOnXError", "PrintFileOnXError", printFileOnXError, NULL), +#endif +#if OPT_SUNPC_KBD + Bres("sunKeyboard", "SunKeyboard", sunKeyboard, False), +#endif +#if OPT_HP_FUNC_KEYS + Bres("hpFunctionKeys", "HpFunctionKeys", hpFunctionKeys, False), +#endif +#if OPT_SCO_FUNC_KEYS + Bres("scoFunctionKeys", "ScoFunctionKeys", scoFunctionKeys, False), +#endif +#if OPT_SUN_FUNC_KEYS + Bres("sunFunctionKeys", "SunFunctionKeys", sunFunctionKeys, False), +#endif +#if OPT_TCAP_FKEYS + Bres("tcapFunctionKeys", "TcapFunctionKeys", termcapKeys, False), +#endif +#if OPT_INITIAL_ERASE + Bres("ptyInitialErase", "PtyInitialErase", ptyInitialErase, DEF_INITIAL_ERASE), + Bres("backarrowKeyIsErase", "BackarrowKeyIsErase", backarrow_is_erase, DEF_BACKARO_ERASE), +#endif + Bres("useInsertMode", "UseInsertMode", useInsertMode, False), +#if OPT_ZICONBEEP + Ires("zIconBeep", "ZIconBeep", zIconBeep, 0), + Sres("zIconTitleFormat", "ZIconTitleFormat", zIconFormat, "*** %s"), +#endif +#if OPT_PTY_HANDSHAKE + Bres("waitForMap", "WaitForMap", wait_for_map, False), + Bres("ptyHandshake", "PtyHandshake", ptyHandshake, True), + Bres("ptySttySize", "PtySttySize", ptySttySize, DEF_PTY_STTY_SIZE), +#endif +#if OPT_REPORT_CCLASS + Bres("reportCClass", "ReportCClass", reportCClass, False), +#endif +#if OPT_REPORT_COLORS + Bres("reportColors", "ReportColors", reportColors, False), +#endif +#if OPT_REPORT_FONTS + Bres("reportFonts", "ReportFonts", reportFonts, False), +#endif +#if OPT_REPORT_ICONS + Bres("reportIcons", "ReportIcons", reportIcons, False), +#endif +#if OPT_XRES_QUERY + Bres("reportXRes", "ReportXRes", reportXRes, False), +#endif +#if OPT_SAME_NAME + Bres("sameName", "SameName", sameName, True), +#endif +#if OPT_SESSION_MGT + Bres("sessionMgt", "SessionMgt", sessionMgt, True), +#endif +#if OPT_TOOLBAR + Bres(XtNtoolBar, XtCToolBar, toolBar, True), +#endif +#if OPT_MAXIMIZE + Bres(XtNmaximized, XtCMaximized, maximized, False), + Sres(XtNfullscreen, XtCFullscreen, fullscreen_s, "off"), +#endif +#if USE_DOUBLE_BUFFER + Bres(XtNbuffered, XtCBuffered, buffered, DEF_DOUBLE_BUFFER), + Ires(XtNbufferedFPS, XtCBufferedFPS, buffered_fps, 40), +#endif +}; + +static String fallback_resources[] = +{ +#if OPT_TOOLBAR + "*toolBar: false", +#endif + "*SimpleMenu*menuLabel.vertSpace: 100", + "*SimpleMenu*HorizontalMargins: 16", + "*SimpleMenu*Sme.height: 16", + "*SimpleMenu*Cursor: left_ptr", + "*mainMenu.Label: Main Options (no app-defaults)", + "*vtMenu.Label: VT Options (no app-defaults)", + "*fontMenu.Label: VT Fonts (no app-defaults)", +#if OPT_TEK4014 + "*tekMenu.Label: Tek Options (no app-defaults)", +#endif + NULL +}; + +/* Command line options table. Only resources are entered here...there is a + pass over the remaining options after XrmParseCommand is let loose. */ +/* *INDENT-OFF* */ +#define DATA(option,pattern,type,value) { (char *) option, (char *) pattern, type, (XPointer) value } +static XrmOptionDescRec optionDescList[] = { +DATA("-geometry", "*vt100.geometry",XrmoptionSepArg, NULL), +DATA("-132", "*c132", XrmoptionNoArg, "on"), +DATA("+132", "*c132", XrmoptionNoArg, "off"), +DATA("-ah", "*alwaysHighlight", XrmoptionNoArg, "on"), +DATA("+ah", "*alwaysHighlight", XrmoptionNoArg, "off"), +DATA("-aw", "*autoWrap", XrmoptionNoArg, "on"), +DATA("+aw", "*autoWrap", XrmoptionNoArg, "off"), +#ifndef NO_ACTIVE_ICON +DATA("-ai", "*activeIcon", XrmoptionNoArg, "off"), +DATA("+ai", "*activeIcon", XrmoptionNoArg, "on"), +#endif /* NO_ACTIVE_ICON */ +DATA("-b", "*internalBorder",XrmoptionSepArg, NULL), +DATA("-bc", "*cursorBlink", XrmoptionNoArg, "on"), +DATA("+bc", "*cursorBlink", XrmoptionNoArg, "off"), +DATA("-bcf", "*cursorOffTime",XrmoptionSepArg, NULL), +DATA("-bcn", "*cursorOnTime",XrmoptionSepArg, NULL), +DATA("-bdc", "*colorBDMode", XrmoptionNoArg, "off"), +DATA("+bdc", "*colorBDMode", XrmoptionNoArg, "on"), +DATA("-cb", "*cutToBeginningOfLine", XrmoptionNoArg, "off"), +DATA("+cb", "*cutToBeginningOfLine", XrmoptionNoArg, "on"), +DATA("-cc", "*charClass", XrmoptionSepArg, NULL), +DATA("-cm", "*colorMode", XrmoptionNoArg, "off"), +DATA("+cm", "*colorMode", XrmoptionNoArg, "on"), +DATA("-cn", "*cutNewline", XrmoptionNoArg, "off"), +DATA("+cn", "*cutNewline", XrmoptionNoArg, "on"), +DATA("-cr", "*cursorColor", XrmoptionSepArg, NULL), +DATA("-cu", "*curses", XrmoptionNoArg, "on"), +DATA("+cu", "*curses", XrmoptionNoArg, "off"), +DATA("-dc", "*dynamicColors",XrmoptionNoArg, "off"), +DATA("+dc", "*dynamicColors",XrmoptionNoArg, "on"), +DATA("-fb", "*boldFont", XrmoptionSepArg, NULL), +DATA("-fbb", "*freeBoldBox", XrmoptionNoArg, "off"), +DATA("+fbb", "*freeBoldBox", XrmoptionNoArg, "on"), +DATA("-fbx", "*forceBoxChars", XrmoptionNoArg, "off"), +DATA("+fbx", "*forceBoxChars", XrmoptionNoArg, "on"), +#ifndef NO_ACTIVE_ICON +DATA("-fi", "*iconFont", XrmoptionSepArg, NULL), +#endif /* NO_ACTIVE_ICON */ +#if OPT_RENDERFONT +DATA("-fa", "*faceName", XrmoptionSepArg, NULL), +DATA("-fd", "*faceNameDoublesize", XrmoptionSepArg, NULL), +DATA("-fs", "*faceSize", XrmoptionSepArg, NULL), +#endif +#if OPT_WIDE_ATTRS && OPT_ISO_COLORS +DATA("-itc", "*colorITMode", XrmoptionNoArg, "off"), +DATA("+itc", "*colorITMode", XrmoptionNoArg, "on"), +#endif +#if OPT_WIDE_CHARS +DATA("-fw", "*wideFont", XrmoptionSepArg, NULL), +DATA("-fwb", "*wideBoldFont", XrmoptionSepArg, NULL), +#endif +#if OPT_INPUT_METHOD +DATA("-fx", "*ximFont", XrmoptionSepArg, NULL), +#endif +#if OPT_HIGHLIGHT_COLOR +DATA("-hc", "*highlightColor", XrmoptionSepArg, NULL), +DATA("-hm", "*highlightColorMode", XrmoptionNoArg, "on"), +DATA("+hm", "*highlightColorMode", XrmoptionNoArg, "off"), +DATA("-selfg", "*highlightTextColor", XrmoptionSepArg, NULL), +DATA("-selbg", "*highlightColor", XrmoptionSepArg, NULL), +#endif +#if OPT_HP_FUNC_KEYS +DATA("-hf", "*hpFunctionKeys",XrmoptionNoArg, "on"), +DATA("+hf", "*hpFunctionKeys",XrmoptionNoArg, "off"), +#endif +DATA("-hold", "*hold", XrmoptionNoArg, "on"), +DATA("+hold", "*hold", XrmoptionNoArg, "off"), +#if OPT_INITIAL_ERASE +DATA("-ie", "*ptyInitialErase", XrmoptionNoArg, "on"), +DATA("+ie", "*ptyInitialErase", XrmoptionNoArg, "off"), +#endif +DATA("-j", "*jumpScroll", XrmoptionNoArg, "on"), +DATA("+j", "*jumpScroll", XrmoptionNoArg, "off"), +#if OPT_C1_PRINT +DATA("-k8", "*allowC1Printable", XrmoptionNoArg, "on"), +DATA("+k8", "*allowC1Printable", XrmoptionNoArg, "off"), +#endif +DATA("-kt", "*keyboardType", XrmoptionSepArg, NULL), +/* parse logging options anyway for compatibility */ +DATA("-l", "*logging", XrmoptionNoArg, "on"), +DATA("+l", "*logging", XrmoptionNoArg, "off"), +DATA("-lf", "*logFile", XrmoptionSepArg, NULL), +DATA("-ls", "*loginShell", XrmoptionNoArg, "on"), +DATA("+ls", "*loginShell", XrmoptionNoArg, "off"), +DATA("-mb", "*marginBell", XrmoptionNoArg, "on"), +DATA("+mb", "*marginBell", XrmoptionNoArg, "off"), +DATA("-mc", "*multiClickTime", XrmoptionSepArg, NULL), +DATA("-mesg", "*messages", XrmoptionNoArg, "off"), +DATA("+mesg", "*messages", XrmoptionNoArg, "on"), +DATA("-ms", "*pointerColor",XrmoptionSepArg, NULL), +DATA("-nb", "*nMarginBell", XrmoptionSepArg, NULL), +DATA("-nul", "*underLine", XrmoptionNoArg, "off"), +DATA("+nul", "*underLine", XrmoptionNoArg, "on"), +DATA("-pc", "*boldColors", XrmoptionNoArg, "on"), +DATA("+pc", "*boldColors", XrmoptionNoArg, "off"), +DATA("-rw", "*reverseWrap", XrmoptionNoArg, "on"), +DATA("+rw", "*reverseWrap", XrmoptionNoArg, "off"), +DATA("-s", "*multiScroll", XrmoptionNoArg, "on"), +DATA("+s", "*multiScroll", XrmoptionNoArg, "off"), +DATA("-sb", "*scrollBar", XrmoptionNoArg, "on"), +DATA("+sb", "*scrollBar", XrmoptionNoArg, "off"), +#if OPT_REPORT_CCLASS +DATA("-report-charclass","*reportCClass", XrmoptionNoArg, "on"), +#endif +#if OPT_REPORT_COLORS +DATA("-report-colors", "*reportColors", XrmoptionNoArg, "on"), +#endif +#if OPT_REPORT_ICONS +DATA("-report-icons", "*reportIcons", XrmoptionNoArg, "on"), +#endif +#if OPT_REPORT_FONTS +DATA("-report-fonts", "*reportFonts", XrmoptionNoArg, "on"), +#endif +#if OPT_XRES_QUERY +DATA("-report-xres", "*reportXRes", XrmoptionNoArg, "on"), +#endif +#ifdef SCROLLBAR_RIGHT +DATA("-leftbar", "*rightScrollBar", XrmoptionNoArg, "off"), +DATA("-rightbar", "*rightScrollBar", XrmoptionNoArg, "on"), +#endif +DATA("-rvc", "*colorRVMode", XrmoptionNoArg, "off"), +DATA("+rvc", "*colorRVMode", XrmoptionNoArg, "on"), +DATA("-sf", "*sunFunctionKeys", XrmoptionNoArg, "on"), +DATA("+sf", "*sunFunctionKeys", XrmoptionNoArg, "off"), +DATA("-sh", "*scaleHeight", XrmoptionSepArg, NULL), +DATA("-si", "*scrollTtyOutput", XrmoptionNoArg, "off"), +DATA("+si", "*scrollTtyOutput", XrmoptionNoArg, "on"), +DATA("-sk", "*scrollKey", XrmoptionNoArg, "on"), +DATA("+sk", "*scrollKey", XrmoptionNoArg, "off"), +DATA("-sl", "*saveLines", XrmoptionSepArg, NULL), +#if OPT_SUNPC_KBD +DATA("-sp", "*sunKeyboard", XrmoptionNoArg, "on"), +DATA("+sp", "*sunKeyboard", XrmoptionNoArg, "off"), +#endif +#if OPT_TEK4014 +DATA("-t", "*tekStartup", XrmoptionNoArg, "on"), +DATA("+t", "*tekStartup", XrmoptionNoArg, "off"), +#endif +DATA("-ti", "*decTerminalID",XrmoptionSepArg, NULL), +DATA("-tm", "*ttyModes", XrmoptionSepArg, NULL), +DATA("-tn", "*termName", XrmoptionSepArg, NULL), +#if OPT_WIDE_CHARS +DATA("-u8", "*utf8", XrmoptionNoArg, "2"), +DATA("+u8", "*utf8", XrmoptionNoArg, "0"), +#endif +#if OPT_LUIT_PROG +DATA("-lc", "*locale", XrmoptionNoArg, "on"), +DATA("+lc", "*locale", XrmoptionNoArg, "off"), +DATA("-lcc", "*localeFilter",XrmoptionSepArg, NULL), +DATA("-en", "*locale", XrmoptionSepArg, NULL), +#endif +DATA("-uc", "*cursorUnderLine", XrmoptionNoArg, "on"), +DATA("+uc", "*cursorUnderLine", XrmoptionNoArg, "off"), +DATA("-ulc", "*colorULMode", XrmoptionNoArg, "off"), +DATA("+ulc", "*colorULMode", XrmoptionNoArg, "on"), +DATA("-ulit", "*italicULMode", XrmoptionNoArg, "off"), +DATA("+ulit", "*italicULMode", XrmoptionNoArg, "on"), +DATA("-ut", "*utmpInhibit", XrmoptionNoArg, "on"), +DATA("+ut", "*utmpInhibit", XrmoptionNoArg, "off"), +DATA("-im", "*useInsertMode", XrmoptionNoArg, "on"), +DATA("+im", "*useInsertMode", XrmoptionNoArg, "off"), +DATA("-vb", "*visualBell", XrmoptionNoArg, "on"), +DATA("+vb", "*visualBell", XrmoptionNoArg, "off"), +DATA("-pob", "*popOnBell", XrmoptionNoArg, "on"), +DATA("+pob", "*popOnBell", XrmoptionNoArg, "off"), +#if OPT_WIDE_CHARS +DATA("-wc", "*wideChars", XrmoptionNoArg, "on"), +DATA("+wc", "*wideChars", XrmoptionNoArg, "off"), +DATA("-mk_width", "*mkWidth", XrmoptionNoArg, "on"), +DATA("+mk_width", "*mkWidth", XrmoptionNoArg, "off"), +DATA("-cjk_width", "*cjkWidth", XrmoptionNoArg, "on"), +DATA("+cjk_width", "*cjkWidth", XrmoptionNoArg, "off"), +#endif +DATA("-wf", "*waitForMap", XrmoptionNoArg, "on"), +DATA("+wf", "*waitForMap", XrmoptionNoArg, "off"), +#if OPT_ZICONBEEP +DATA("-ziconbeep", "*zIconBeep", XrmoptionSepArg, NULL), +#endif +#if OPT_SAME_NAME +DATA("-samename", "*sameName", XrmoptionNoArg, "on"), +DATA("+samename", "*sameName", XrmoptionNoArg, "off"), +#endif +#if OPT_SESSION_MGT +DATA("-sm", "*sessionMgt", XrmoptionNoArg, "on"), +DATA("+sm", "*sessionMgt", XrmoptionNoArg, "off"), +#endif +#if OPT_TOOLBAR +DATA("-tb", "*"XtNtoolBar, XrmoptionNoArg, "on"), +DATA("+tb", "*"XtNtoolBar, XrmoptionNoArg, "off"), +#endif +#if OPT_MAXIMIZE +DATA("-maximized", "*maximized", XrmoptionNoArg, "on"), +DATA("+maximized", "*maximized", XrmoptionNoArg, "off"), +DATA("-fullscreen", "*fullscreen", XrmoptionNoArg, "on"), +DATA("+fullscreen", "*fullscreen", XrmoptionNoArg, "off"), +#endif +/* options that we process ourselves */ +DATA("-help", NULL, XrmoptionSkipNArgs, NULL), +DATA("-version", NULL, XrmoptionSkipNArgs, NULL), +DATA("-baudrate", NULL, XrmoptionSkipArg, NULL), +DATA("-class", NULL, XrmoptionSkipArg, NULL), +DATA("-e", NULL, XrmoptionSkipLine, NULL), +DATA("-into", NULL, XrmoptionSkipArg, NULL), +/* bogus old compatibility stuff for which there are + standard XtOpenApplication options now */ +DATA("%", "*tekGeometry", XrmoptionStickyArg, NULL), +DATA("#", ".iconGeometry",XrmoptionStickyArg, NULL), +DATA("-T", ".title", XrmoptionSepArg, NULL), +DATA("-n", "*iconName", XrmoptionSepArg, NULL), +DATA("-r", "*reverseVideo",XrmoptionNoArg, "on"), +DATA("+r", "*reverseVideo",XrmoptionNoArg, "off"), +DATA("-rv", "*reverseVideo",XrmoptionNoArg, "on"), +DATA("+rv", "*reverseVideo",XrmoptionNoArg, "off"), +DATA("-w", ".borderWidth", XrmoptionSepArg, NULL), +#undef DATA +}; + +static OptionHelp xtermOptions[] = { +{ "-version", "print the version number" }, +{ "-help", "print out this message" }, +{ "-display displayname", "X server to contact" }, +{ "-geometry geom", "size (in characters) and position" }, +{ "-/+rv", "turn on/off reverse video" }, +{ "-bg color", "background color" }, +{ "-fg color", "foreground color" }, +{ "-bd color", "border color" }, +{ "-bw number", "border width in pixels" }, +{ "-fn fontname", "normal text font" }, +{ "-fb fontname", "bold text font" }, +{ "-/+fbb", "turn on/off normal/bold font comparison inhibit"}, +{ "-/+fbx", "turn off/on linedrawing characters"}, +#if OPT_RENDERFONT +{ "-fa pattern", "FreeType font-selection pattern" }, +{ "-fd pattern", "FreeType Doublesize font-selection pattern" }, +{ "-fs size", "FreeType font-size" }, +#endif +#if OPT_WIDE_CHARS +{ "-fw fontname", "doublewidth text font" }, +{ "-fwb fontname", "doublewidth bold text font" }, +#endif +#if OPT_INPUT_METHOD +{ "-fx fontname", "XIM fontset" }, +#endif +{ "-iconic", "start iconic" }, +{ "-name string", "client instance, icon, and title strings" }, +{ "-baudrate rate", "set line-speed (default 38400)" }, +{ "-class string", "class string (XTerm)" }, +{ "-title string", "title string" }, +{ "-xrm resourcestring", "additional resource specifications" }, +{ "-/+132", "turn on/off 80/132 column switching" }, +{ "-/+ah", "turn on/off always highlight" }, +#ifndef NO_ACTIVE_ICON +{ "-/+ai", "turn off/on active icon" }, +{ "-fi fontname", "icon font for active icon" }, +#endif /* NO_ACTIVE_ICON */ +{ "-b number", "internal border in pixels" }, +{ "-/+bc", "turn on/off text cursor blinking" }, +{ "-bcf milliseconds", "time text cursor is off when blinking"}, +{ "-bcn milliseconds", "time text cursor is on when blinking"}, +{ "-/+bdc", "turn off/on display of bold as color"}, +{ "-/+cb", "turn on/off cut-to-beginning-of-line inhibit" }, +{ "-cc classrange", "specify additional character classes" }, +{ "-/+cm", "turn off/on ANSI color mode" }, +{ "-/+cn", "turn on/off cut newline inhibit" }, +{ "-cr color", "text cursor color" }, +{ "-/+cu", "turn on/off curses emulation" }, +{ "-/+dc", "turn off/on dynamic color selection" }, +#if OPT_HIGHLIGHT_COLOR +{ "-/+hm", "turn on/off selection-color override" }, +{ "-selbg color", "selection background color" }, +{ "-selfg color", "selection foreground color" }, +/* -hc is deprecated, not shown in help message */ +#endif +#if OPT_HP_FUNC_KEYS +{ "-/+hf", "turn on/off HP Function Key escape codes" }, +#endif +{ "-/+hold", "turn on/off logic that retains window after exit" }, +#if OPT_INITIAL_ERASE +{ "-/+ie", "turn on/off initialization of 'erase' from pty" }, +#endif +{ "-/+im", "use insert mode for TERMCAP" }, +{ "-/+j", "turn on/off jump scroll" }, +#if OPT_C1_PRINT +{ "-/+k8", "turn on/off C1-printable classification"}, +#endif +{ "-kt keyboardtype", "set keyboard type:" KEYBOARD_TYPES }, +#ifdef ALLOWLOGGING +{ "-/+l", "turn on/off logging" }, +{ "-lf filename", "logging filename (use '-' for standard out)" }, +#else +{ "-/+l", "turn on/off logging (not supported)" }, +{ "-lf filename", "logging filename (not supported)" }, +#endif +{ "-/+ls", "turn on/off login shell" }, +{ "-/+mb", "turn on/off margin bell" }, +{ "-mc milliseconds", "multiclick time in milliseconds" }, +{ "-/+mesg", "forbid/allow messages" }, +{ "-ms color", "pointer color" }, +{ "-nb number", "margin bell in characters from right end" }, +{ "-/+nul", "turn off/on display of underlining" }, +{ "-/+aw", "turn on/off auto wraparound" }, +{ "-/+pc", "turn on/off PC-style bold colors" }, +{ "-/+rw", "turn on/off reverse wraparound" }, +{ "-/+s", "turn on/off multiscroll" }, +{ "-/+sb", "turn on/off scrollbar" }, +#if OPT_REPORT_CCLASS +{"-report-charclass", "report \"charClass\" after initialization"}, +#endif +#if OPT_REPORT_COLORS +{ "-report-colors", "report colors as they are allocated" }, +#endif +#if OPT_REPORT_FONTS +{ "-report-fonts", "report fonts as loaded to stdout" }, +#endif +#if OPT_REPORT_ICONS +{ "-report-icons", "report title/icon updates" }, +#endif +#if OPT_XRES_QUERY +{ "-report-xres", "report X resources for VT100 widget" }, +#endif +#ifdef SCROLLBAR_RIGHT +{ "-rightbar", "force scrollbar right (default left)" }, +{ "-leftbar", "force scrollbar left" }, +#endif +{ "-/+rvc", "turn off/on display of reverse as color" }, +{ "-/+sf", "turn on/off Sun Function Key escape codes" }, +{ "-sh number", "scale line-height values by the given number" }, +{ "-/+si", "turn on/off scroll-on-tty-output inhibit" }, +{ "-/+sk", "turn on/off scroll-on-keypress" }, +{ "-sl number", "number of scrolled lines to save" }, +#if OPT_SUNPC_KBD +{ "-/+sp", "turn on/off Sun/PC Function/Keypad mapping" }, +#endif +#if OPT_TEK4014 +{ "-/+t", "turn on/off Tek emulation window" }, +#endif +#if OPT_TOOLBAR +{ "-/+tb", "turn on/off toolbar" }, +#endif +{ "-ti termid", "terminal identifier" }, +{ "-tm string", "terminal mode keywords and characters" }, +{ "-tn name", "TERM environment variable name" }, +#if OPT_WIDE_CHARS +{ "-/+u8", "turn on/off UTF-8 mode (implies wide-characters)" }, +#endif +#if OPT_LUIT_PROG +{ "-/+lc", "turn on/off locale mode using luit" }, +{ "-lcc path", "filename of locale converter (" DEFLOCALEFILTER ")" }, +/* -en is deprecated, not shown in help message */ +#endif +{ "-/+uc", "turn on/off underline cursor" }, +{ "-/+ulc", "turn off/on display of underline as color" }, +{ "-/+ulit", "turn off/on display of underline as italics" }, +#ifdef HAVE_UTMP +{ "-/+ut", "turn on/off utmp support" }, +#else +{ "-/+ut", "turn on/off utmp support (not available)" }, +#endif +{ "-/+vb", "turn on/off visual bell" }, +{ "-/+pob", "turn on/off pop on bell" }, +#if OPT_WIDE_ATTRS && OPT_ISO_COLORS +{ "-/+itc", "turn off/on display of italic as color"}, +#endif +#if OPT_WIDE_CHARS +{ "-/+wc", "turn on/off wide-character mode" }, +{ "-/+mk_width", "turn on/off simple width convention" }, +{ "-/+cjk_width", "turn on/off legacy CJK width convention" }, +#endif +{ "-/+wf", "turn on/off wait for map before command exec" }, +{ "-e command args ...", "command to execute" }, +#if OPT_TEK4014 +{ "%geom", "Tek window geometry" }, +#endif +{ "#geom", "icon window geometry" }, +{ "-T string", "title name for window" }, +{ "-n string", "icon name for window" }, +#if defined(TIOCCONS) || defined(SRIOCSREDIR) +{ "-C", "intercept console messages" }, +#else +{ "-C", "intercept console messages (not supported)" }, +#endif +{ "-Sccn", "slave mode on \"ttycc\", file descriptor \"n\"" }, +{ "-into windowId", "use the window id given to -into as the parent window rather than the default root window" }, +#if OPT_ZICONBEEP +{ "-ziconbeep percent", "beep and flag icon of window having hidden output" }, +#endif +#if OPT_SAME_NAME +{ "-/+samename", "turn on/off the no-flicker option for title and icon name" }, +#endif +#if OPT_SESSION_MGT +{ "-/+sm", "turn on/off the session-management support" }, +#endif +#if OPT_MAXIMIZE +{"-/+maximized", "turn on/off maxmize on startup" }, +{"-/+fullscreen", "turn on/off fullscreen on startup" }, +#endif +{ NULL, NULL }}; +/* *INDENT-ON* */ + +static const char *const message[] = +{ + "Fonts should be fixed width and, if both normal and bold are specified, should", + "have the same size. If only a normal font is specified, it will be used for", + "both normal and bold text (by doing overstriking). The -e option, if given,", + "must appear at the end of the command line, otherwise the user's default shell", + "will be started. Options that start with a plus sign (+) restore the default.", + NULL}; + +/* + * Decode a key-definition. This combines the termcap and ttyModes, for + * comparison. Note that octal escapes in ttyModes are done by the normal + * resource translation. Also, ttyModes allows '^-' as a synonym for disabled. + */ +static int +decode_keyvalue(char **ptr, int termcap) +{ + char *string = *ptr; + int value = -1; + + TRACE(("decode_keyvalue '%s'\n", string)); + if (*string == '^') { + switch (*++string) { + case '?': + value = A2E(ANSI_DEL); + break; + case '-': + if (!termcap) { + errno = 0; +#if defined(_POSIX_VDISABLE) && defined(HAVE_UNISTD_H) + value = _POSIX_VDISABLE; +#endif +#if defined(_PC_VDISABLE) + if (value == -1) { + value = (int) fpathconf(0, _PC_VDISABLE); + if (value == -1) { + if (errno != 0) + break; /* skip this (error) */ + value = 0377; + } + } +#elif defined(VDISABLE) + if (value == -1) + value = VDISABLE; +#endif + break; + } + /* FALLTHRU */ + default: + value = CONTROL(*string); + break; + } + ++string; + } else if (termcap && (*string == '\\')) { + char *s = (string + 1); + char *d; + int temp = (int) strtol(s, &d, 8); + if (PartS2L(s, d) && temp > 0) { + value = temp; + string = d; + } + } else { + value = CharOf(*string); + ++string; + } + *ptr = string; + TRACE(("...decode_keyvalue %#x\n", value)); + return value; +} + +static int +matchArg(XrmOptionDescRec * table, const char *param) +{ + int result = -1; + int n; + int ch; + + for (n = 0; (ch = table->option[n]) != '\0'; ++n) { + if (param[n] == ch) { + result = n; + } else { + if (param[n] != '\0') + result = -1; + break; + } + } + + return result; +} + +/* return the number of argv[] entries which constitute arguments of option */ +static int +countArg(XrmOptionDescRec * item) +{ + int result = 0; + + switch (item->argKind) { + case XrmoptionNoArg: + /* FALLTHRU */ + case XrmoptionIsArg: + /* FALLTHRU */ + case XrmoptionStickyArg: + break; + case XrmoptionSepArg: + /* FALLTHRU */ + case XrmoptionResArg: + /* FALLTHRU */ + case XrmoptionSkipArg: + result = 1; + break; + case XrmoptionSkipLine: + break; + case XrmoptionSkipNArgs: + result = (int) (long) (item->value); + break; + } + return result; +} + +#define isOption(string) (Boolean)((string)[0] == '-' || (string)[0] == '+') + +/* + * Parse the argument list, more/less as XtInitialize, etc., would do, so we + * can find our own "-help" and "-version" options reliably. Improve on just + * doing that, by detecting ambiguous options (things that happen to match the + * abbreviated option we are examining), and making it smart enough to handle + * "-d" as an abbreviation for "-display". Doing this requires checking the + * standard table (something that the X libraries should do). + */ +static XrmOptionDescRec * +parseArg(int *num, char **argv, char **valuep) +{ + /* table adapted from XtInitialize, used here to improve abbreviations */ + /* *INDENT-OFF* */ +#define DATA(option,kind) { (char *) option, NULL, kind, (XtPointer) NULL } + static XrmOptionDescRec opTable[] = { + DATA("+synchronous", XrmoptionNoArg), + DATA("-background", XrmoptionSepArg), + DATA("-bd", XrmoptionSepArg), + DATA("-bg", XrmoptionSepArg), + DATA("-bordercolor", XrmoptionSepArg), + DATA("-borderwidth", XrmoptionSepArg), + DATA("-bw", XrmoptionSepArg), + DATA("-display", XrmoptionSepArg), + DATA("-fg", XrmoptionSepArg), + DATA("-fn", XrmoptionSepArg), + DATA("-font", XrmoptionSepArg), + DATA("-foreground", XrmoptionSepArg), + DATA("-iconic", XrmoptionNoArg), + DATA("-name", XrmoptionSepArg), + DATA("-reverse", XrmoptionNoArg), + DATA("-selectionTimeout", XrmoptionSepArg), + DATA("-synchronous", XrmoptionNoArg), + DATA("-title", XrmoptionSepArg), + DATA("-xnllanguage", XrmoptionSepArg), + DATA("-xrm", XrmoptionResArg), + DATA("-xtsessionID", XrmoptionSepArg), + /* These xterm options are processed after XtOpenApplication */ +#if defined(TIOCCONS) || defined(SRIOCSREDIR) + DATA("-C", XrmoptionNoArg), +#endif /* TIOCCONS */ + DATA("-S", XrmoptionStickyArg), + DATA("-D", XrmoptionNoArg), + }; +#undef DATA + /* *INDENT-ON* */ + XrmOptionDescRec *result = 0; + Cardinal inlist; + Cardinal limit = XtNumber(optionDescList) + XtNumber(opTable); + int atbest = -1; + int best = -1; + int test; + Boolean exact = False; + int ambiguous1 = -1; + int ambiguous2 = -1; + char *option; + char *value; + +#define ITEM(n) ((Cardinal)(n) < XtNumber(optionDescList) \ + ? &optionDescList[n] \ + : &opTable[(Cardinal)(n) - XtNumber(optionDescList)]) + + if ((option = argv[*num]) != 0) { + Boolean need_value; + Boolean have_value = False; + + TRACE(("parseArg %s\n", option)); + if ((value = argv[(*num) + 1]) != 0) { + have_value = (Boolean) !isOption(value); + } + for (inlist = 0; inlist < limit; ++inlist) { + XrmOptionDescRec *check = ITEM(inlist); + + test = matchArg(check, option); + if (test < 0) + continue; + + /* check for exact match */ + if ((test + 1) == (int) strlen(check->option)) { + if (check->argKind == XrmoptionStickyArg) { + if (strlen(option) > strlen(check->option)) { + exact = True; + atbest = (int) inlist; + break; + } + } else if ((test + 1) == (int) strlen(option)) { + exact = True; + atbest = (int) inlist; + break; + } + } + + need_value = (Boolean) (test > 0 && countArg(check) > 0); + + if (need_value && value != 0) { + ; + } else if (need_value ^ have_value) { + TRACE(("...skipping, need %d vs have %d\n", need_value, have_value)); + continue; + } + + /* special-case for our own options - always allow abbreviation */ + if (test > 0 + && ITEM(inlist)->argKind >= XrmoptionSkipArg) { + atbest = (int) inlist; + if (ITEM(inlist)->argKind == XrmoptionSkipNArgs) { + /* in particular, silence a warning about ambiguity */ + exact = 1; + } + break; + } + if (test > best) { + best = test; + atbest = (int) inlist; + } else if (test == best) { + if (atbest >= 0) { + if (atbest > 0) { + ambiguous1 = (int) inlist; + ambiguous2 = (int) atbest; + } + atbest = -1; + } + } + } + } + + *valuep = 0; + if (atbest >= 0) { + result = ITEM(atbest); + if (!exact) { + if (ambiguous1 >= 0 && ambiguous2 >= 0) { + xtermWarning("ambiguous option \"%s\" vs \"%s\"\n", + ITEM(ambiguous1)->option, + ITEM(ambiguous2)->option); + } else if (strlen(option) > strlen(result->option)) { + result = 0; + } + } + if (result != 0) { + TRACE(("...result %s\n", result->option)); + /* expand abbreviations */ + if (result->argKind != XrmoptionStickyArg) { + if (strcmp(argv[*num], result->option)) { + argv[*num] = x_strdup(result->option); + } + } + + /* adjust (*num) to skip option value */ + (*num) += countArg(result); + TRACE(("...next %s\n", NonNull(argv[*num]))); + if (result->argKind == XrmoptionSkipArg) { + *valuep = argv[*num]; + TRACE(("...parameter %s\n", NonNull(*valuep))); + } + } + } +#undef ITEM + return result; +} + +static void +Syntax(char *badOption) +{ + OptionHelp *opt; + OptionHelp *list = sortedOpts(xtermOptions, optionDescList, XtNumber(optionDescList)); + int col; + + TRACE(("Syntax error at %s\n", badOption)); + xtermWarning("bad command line option \"%s\"\r\n\n", badOption); + + fprintf(stderr, "usage: %s", ProgramName); + col = 8 + (int) strlen(ProgramName); + for (opt = list; opt->opt; opt++) { + int len = 3 + (int) strlen(opt->opt); /* space [ string ] */ + if (col + len > 79) { + fprintf(stderr, "\r\n "); /* 3 spaces */ + col = 3; + } + fprintf(stderr, " [%s]", opt->opt); + col += len; + } + + fprintf(stderr, "\r\n\nType %s -help for a full description.\r\n\n", + ProgramName); + exit(1); +} + +static void +Version(void) +{ + printf("%s\n", xtermVersion()); + fflush(stdout); +} + +static void +Help(void) +{ + OptionHelp *opt; + OptionHelp *list = sortedOpts(xtermOptions, optionDescList, XtNumber(optionDescList)); + const char *const *cpp; + + printf("%s usage:\n %s [-options ...] [-e command args]\n\n", + xtermVersion(), ProgramName); + printf("where options include:\n"); + for (opt = list; opt->opt; opt++) { + printf(" %-28s %s\n", opt->opt, opt->desc); + } + + putchar('\n'); + for (cpp = message; *cpp; cpp++) + puts(*cpp); + putchar('\n'); + fflush(stdout); +} + +static void +NeedParam(XrmOptionDescRec * option_ptr, const char *option_val) +{ + if (IsEmpty(option_val)) { + xtermWarning("option %s requires a value\n", option_ptr->option); + exit(1); + } +} + +#if defined(TIOCCONS) || defined(SRIOCSREDIR) +/* ARGSUSED */ +static Boolean +ConvertConsoleSelection(Widget w GCC_UNUSED, + Atom *selection GCC_UNUSED, + Atom *target GCC_UNUSED, + Atom *type GCC_UNUSED, + XtPointer *value GCC_UNUSED, + unsigned long *length GCC_UNUSED, + int *format GCC_UNUSED) +{ + /* we don't save console output, so can't offer it */ + return False; +} +#endif /* TIOCCONS */ + +/* + * DeleteWindow(): Action proc to implement ICCCM delete_window. + */ +/* ARGSUSED */ +static void +DeleteWindow(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *num_params GCC_UNUSED) +{ +#if OPT_TEK4014 + if (w == toplevel) { + if (TEK4014_SHOWN(term)) + hide_vt_window(); + else + do_hangup(w, (XtPointer) 0, (XtPointer) 0); + } else if (TScreenOf(term)->Vshow) + hide_tek_window(); + else +#endif + do_hangup(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +static void +KeyboardMapping(Widget w GCC_UNUSED, + XEvent *event, + String *params GCC_UNUSED, + Cardinal *num_params GCC_UNUSED) +{ + switch (event->type) { + case MappingNotify: + XRefreshKeyboardMapping(&event->xmapping); + break; + } +} + +static XtActionsRec actionProcs[] = +{ + {"DeleteWindow", DeleteWindow}, + {"KeyboardMapping", KeyboardMapping}, +}; + +/* + * Some platforms use names such as /dev/tty01, others /dev/pts/1. Parse off + * the "tty01" or "pts/1" portion, and return that for use as an identifier for + * utmp. + */ +static char * +my_pty_name(char *device) +{ + size_t len = strlen(device); + Bool name = False; + + while (len != 0) { + int ch = device[len - 1]; + if (isdigit(ch)) { + len--; + } else if (ch == '/') { + if (name) + break; + len--; + } else if (isalpha(ch)) { + name = True; + len--; + } else { + break; + } + } + TRACE(("my_pty_name(%s) -> '%s'\n", device, device + len)); + return device + len; +} + +/* + * If the name contains a '/', it is a "pts/1" case. Otherwise, return the + * last few characters for a utmp identifier. + */ +static char * +my_pty_id(char *device) +{ + char *name = my_pty_name(device); + char *leaf = x_basename(name); + + if (name == leaf) { /* no '/' in the name */ + int len = (int) strlen(leaf); + if (PTYCHARLEN < len) + leaf = leaf + (len - PTYCHARLEN); + } + TRACE(("my_pty_id (%s) -> '%s'\n", device, leaf)); + return leaf; +} + +/* + * Set the tty/pty identifier + */ +static void +set_pty_id(char *device, char *id) +{ + char *name = my_pty_name(device); + char *leaf = x_basename(name); + + if (name == leaf) { + strcpy(my_pty_id(device), id); + } else { + strcpy(leaf, id); + } + TRACE(("set_pty_id(%s) -> '%s'\n", id, device)); +} + +/* + * The original -S option accepts two characters to identify the pty, and a + * file-descriptor (assumed to be nonzero). That is not general enough, so we + * check first if the option contains a '/' to delimit the two fields, and if + * not, fall-thru to the original logic. + */ +static Bool +ParseSccn(char *option) +{ + char *leaf = x_basename(option); + Bool code = False; + + passedPty = x_strdup(option); + if (leaf != option) { + if (leaf - option > 0 + && isdigit(CharOf(*leaf)) + && sscanf(leaf, "%d", &am_slave) == 1) { + size_t len = (size_t) (leaf - option - 1); + /* + * If we have a slash, we only care about the part after the slash, + * which is a file-descriptor. The part before the slash can be + * the /dev/pts/XXX value, but since we do not need to reopen it, + * it is useful mainly for display in a "ps -ef". + */ + passedPty[len] = 0; + code = True; + } + } else { + code = (sscanf(option, "%c%c%d", + passedPty, passedPty + 1, &am_slave) == 3); + passedPty[2] = '\0'; + } + TRACE(("ParseSccn(%s) = '%s' %d (%s)\n", option, + passedPty, am_slave, code ? "OK" : "ERR")); + return code; +} + +#if defined(USE_SYSV_UTMP) && !defined(USE_UTEMPTER) +/* + * From "man utmp": + * xterm and other terminal emulators directly create a USER_PROCESS record + * and generate the ut_id by using the last two letters of /dev/ttyp%c or by + * using p%d for /dev/pts/%d. If they find a DEAD_PROCESS for this id, they + * recycle it, otherwise they create a new entry. If they can, they will mark + * it as DEAD_PROCESS on exiting and it is advised that they null ut_line, + * ut_time, ut_user and ut_host as well. + * + * Generally ut_id allows no more than 3 characters (plus null), even if the + * pty implementation allows more than 3 digits. + */ +static char * +my_utmp_id(char *device) +{ + typedef struct UTMP_STR UTMP_STRUCT; +#define UTIDSIZE (sizeof(((UTMP_STRUCT *)NULL)->ut_id)) + static char result[UTIDSIZE + 1]; + +#if defined(__SCO__) || defined(__UNIXWARE__) + /* + * Legend does not support old-style pty's, has no related compatibility + * issues, and can use the available space in ut_id differently from the + * default convention. + * + * This scheme is intended to avoid conflicts both with other users of + * utmpx as well as between multiple xterms. First, Legend uses all of the + * characters of ut_id, and adds no terminating NUL is required (the + * default scheme may add a trailing NUL). Second, all xterm entries will + * start with the letter 'x' followed by three digits, which will be the + * last three digits of the device name, regardless of the format of the + * device name, with leading 0's added where necessary. For instance, an + * xterm on /dev/pts/3 will have a ut_id of x003; an xterm on /dev/pts123 + * will have a ut_id of x123. Under the other convention, /dev/pts/3 would + * have a ut_id of p3 and /dev/pts123 would have a ut_id of p123. + */ + int len, n; + + len = strlen(device); + n = UTIDSIZE; + result[n] = '\0'; + while ((n > 0) && (len > 0) && isdigit(device[len - 1])) + result[--n] = device[--len]; + while (n > 0) + result[--n] = '0'; + result[0] = 'x'; +#else + char *name = my_pty_name(device); + char *leaf = x_basename(name); + size_t len = strlen(leaf); + + if ((UTIDSIZE - 1) < len) + leaf = leaf + (len - (UTIDSIZE - 1)); + sprintf(result, "p%s", leaf); +#endif + + TRACE(("my_utmp_id (%s) -> '%s'\n", device, result)); + return result; +} +#endif /* USE_SYSV_UTMP */ + +#ifdef USE_POSIX_SIGNALS + +typedef void (*sigfunc) (int); + +/* make sure we sure we ignore SIGCHLD for the cases parent + has just been stopped and not actually killed */ + +static sigfunc +posix_signal(int signo, sigfunc func) +{ + struct sigaction act, oact; + + act.sa_handler = func; + sigemptyset(&act.sa_mask); +#ifdef SA_RESTART + act.sa_flags = SA_NOCLDSTOP | SA_RESTART; +#else + act.sa_flags = SA_NOCLDSTOP; +#endif + if (sigaction(signo, &act, &oact) < 0) + return (SIG_ERR); + return (oact.sa_handler); +} + +#endif /* USE_POSIX_SIGNALS */ + +#if defined(DISABLE_SETUID) || defined(USE_UTMP_SETGID) +static void +disableSetUid(void) +{ + TRACE(("process %d disableSetUid\n", (int) getpid())); + if (setuid(save_ruid) == -1) { + xtermWarning("unable to reset uid\n"); + exit(1); + } + TRACE_IDS; +} +#else +#define disableSetUid() /* nothing */ +#endif /* DISABLE_SETUID */ + +#if defined(DISABLE_SETGID) || defined(USE_UTMP_SETGID) +static void +disableSetGid(void) +{ + TRACE(("process %d disableSetGid\n", (int) getpid())); + if (setegid(save_rgid) == -1) { + xtermWarning("unable to reset effective gid\n"); + exit(1); + } + TRACE_IDS; +} +#else +#define disableSetGid() /* nothing */ +#endif /* DISABLE_SETGID */ + +#if defined(HAVE_POSIX_SAVED_IDS) +#if (!defined(USE_UTEMPTER) || !defined(DISABLE_SETGID)) +static void +setEffectiveGroup(gid_t group) +{ + TRACE(("process %d setEffectiveGroup(%d)\n", (int) getpid(), (int) group)); + if (setegid(group) == -1) { +#ifdef __MVS__ + if (!(errno == EMVSERR)) /* could happen if _BPX_SHAREAS=REUSE */ +#endif + { + xtermPerror("setegid(%d)", (int) group); + } + } + TRACE_IDS; +} +#endif + +#if !defined(USE_UTMP_SETGID) && (!defined(USE_UTEMPTER) || !defined(DISABLE_SETUID)) +static void +setEffectiveUser(uid_t user) +{ + TRACE(("process %d setEffectiveUser(%d)\n", (int) getpid(), (int) user)); + if (seteuid(user) == -1) { +#ifdef __MVS__ + if (!(errno == EMVSERR)) +#endif + { + xtermPerror("seteuid(%d)", (int) user); + } + } + TRACE_IDS; +} +#endif +#endif /* HAVE_POSIX_SAVED_IDS */ + +#if OPT_LUIT_PROG +static Boolean +complex_command(char **args) +{ + Boolean result = False; + if (x_countargv(args) == 1) { + char *check = xtermFindShell(args[0], False); + if (check == 0) { + result = True; + } else { + free(check); + } + } + return result; +} +#endif + +static unsigned +lookup_baudrate(const char *value) +{ + struct speed { + unsigned given_speed; /* values for 'ospeed' */ + unsigned actual_speed; /* the actual speed */ + }; + +#define DATA(number) { B##number, number } + + static struct speed const speeds[] = + { + DATA(0), + DATA(50), + DATA(75), + DATA(110), + DATA(134), + DATA(150), + DATA(200), + DATA(300), + DATA(600), + DATA(1200), + DATA(1800), + DATA(2400), + DATA(4800), + DATA(9600), +#ifdef B19200 + DATA(19200), +#elif defined(EXTA) + {EXTA, 19200}, +#endif +#ifdef B28800 + DATA(28800), +#endif +#ifdef B38400 + DATA(38400), +#elif defined(EXTB) + {EXTB, 38400}, +#endif +#ifdef B57600 + DATA(57600), +#endif +#ifdef B76800 + DATA(76800), +#endif +#ifdef B115200 + DATA(115200), +#endif +#ifdef B153600 + DATA(153600), +#endif +#ifdef B230400 + DATA(230400), +#endif +#ifdef B307200 + DATA(307200), +#endif +#ifdef B460800 + DATA(460800), +#endif +#ifdef B500000 + DATA(500000), +#endif +#ifdef B576000 + DATA(576000), +#endif +#ifdef B921600 + DATA(921600), +#endif +#ifdef B1000000 + DATA(1000000), +#endif +#ifdef B1152000 + DATA(1152000), +#endif +#ifdef B1500000 + DATA(1500000), +#endif +#ifdef B2000000 + DATA(2000000), +#endif +#ifdef B2500000 + DATA(2500000), +#endif +#ifdef B3000000 + DATA(3000000), +#endif +#ifdef B3500000 + DATA(3500000), +#endif +#ifdef B4000000 + DATA(4000000), +#endif + }; +#undef DATA + unsigned result = 0; + long check; + char *next; + if (x_toupper(*value) == 'B') + value++; + if (isdigit(CharOf(*value))) { + check = strtol(value, &next, 10); + if (FullS2L(value, next) && (check > 0)) { + Cardinal n; + for (n = 0; n < XtNumber(speeds); ++n) { + if (speeds[n].actual_speed == (unsigned) check) { + result = speeds[n].given_speed; + break; + } + } + } + } + if (result == 0) { + fprintf(stderr, "unsupported value for baudrate: %s\n", value); + } + return result; +} + +int +main(int argc, char *argv[]ENVP_ARG) +{ +#if OPT_MAXIMIZE +#define DATA(name) { #name, es##name } + static const FlagList tblFullscreen[] = + { + DATA(Always), + DATA(Never) + }; +#undef DATA +#endif + + Widget form_top, menu_top; + Dimension menu_high; + TScreen *screen; + int mode; + char *my_class = x_strdup(DEFCLASS); + unsigned line_speed = VAL_LINE_SPEED; + Window winToEmbedInto = None; + + ProgramName = argv[0]; + +#ifdef HAVE_POSIX_SAVED_IDS + save_euid = geteuid(); + save_egid = getegid(); +#endif + + save_ruid = getuid(); + save_rgid = getgid(); + +#if defined(DISABLE_SETUID) || defined(DISABLE_SETGID) +#if defined(DISABLE_SETUID) + disableSetUid(); +#endif +#if defined(DISABLE_SETGID) + disableSetGid(); +#endif + TRACE_IDS; +#endif + + /* extra length in case longer tty name like /dev/ttyq255 */ + ttydev = TypeMallocN(char, sizeof(TTYDEV) + 80); +#ifdef USE_PTY_DEVICE + ptydev = TypeMallocN(char, sizeof(PTYDEV) + 80); + if (!ttydev || !ptydev) +#else + if (!ttydev) +#endif + { + xtermWarning("unable to allocate memory for ttydev or ptydev\n"); + exit(1); + } + strcpy(ttydev, TTYDEV); +#ifdef USE_PTY_DEVICE + strcpy(ptydev, PTYDEV); +#endif + +#if defined(USE_UTMP_SETGID) + get_pty(NULL, NULL); + disableSetUid(); + disableSetGid(); + TRACE_IDS; +#define get_pty(pty, from) really_get_pty(pty, from) +#endif + + /* Do these first, since we may not be able to open the display */ + TRACE_OPTS(xtermOptions, optionDescList, XtNumber(optionDescList)); + TRACE_ARGV("Before XtOpenApplication", argv); + if (argc > 1) { + XrmOptionDescRec *option_ptr; + char *option_value; + int n; + Bool quit = False; + + for (n = 1; n < argc; n++) { + if ((option_ptr = parseArg(&n, argv, &option_value)) == 0) { + if (argv[n] == 0) { + break; + } else if (isOption(argv[n])) { + Syntax(argv[n]); + } else if (explicit_shname != 0) { + xtermWarning("Explicit shell already was %s\n", explicit_shname); + Syntax(argv[n]); + } + explicit_shname = xtermFindShell(argv[n], True); + if (explicit_shname == 0) + exit(0); + TRACE(("...explicit shell %s\n", explicit_shname)); + } else if (!strcmp(option_ptr->option, "-e")) { + command_to_exec = (argv + n + 1); + if (!command_to_exec[0]) + Syntax(argv[n]); + break; + } else if (!strcmp(option_ptr->option, "-version")) { + Version(); + quit = True; + } else if (!strcmp(option_ptr->option, "-help")) { + Help(); + quit = True; + } else if (!strcmp(option_ptr->option, "-baudrate")) { + NeedParam(option_ptr, option_value); + if ((line_speed = lookup_baudrate(option_value)) == 0) { + Help(); + quit = True; + } + } else if (!strcmp(option_ptr->option, "-class")) { + NeedParam(option_ptr, option_value); + free(my_class); + if ((my_class = x_strdup(option_value)) == 0) { + Help(); + quit = True; + } + } else if (!strcmp(option_ptr->option, "-into")) { + char *endPtr; + NeedParam(option_ptr, option_value); + winToEmbedInto = (Window) strtol(option_value, &endPtr, 0); + if (!FullS2L(option_value, endPtr)) { + Help(); + quit = True; + } + } + } + if (quit) + exit(0); + /* + * If there is anything left unparsed, and we're not using "-e", + * then give up. + */ + if (n < argc && !command_to_exec) { + Syntax(argv[n]); + } + } + + /* This dumped core on HP-UX 9.05 with X11R5 */ +#if OPT_I18N_SUPPORT + XtSetLanguageProc(NULL, NULL, NULL); +#endif + +#ifdef TERMIO_STRUCT /* { */ + /* Initialization is done here rather than above in order + * to prevent any assumptions about the order of the contents + * of the various terminal structures (which may change from + * implementation to implementation). + */ + memset(&d_tio, 0, sizeof(d_tio)); + d_tio.c_iflag = ICRNL | IXON; + d_tio.c_oflag = TAB3 | D_TIO_FLAGS; + { + Cardinal nn; + + /* fill in default-values */ + for (nn = 0; nn < XtNumber(ttyChars); ++nn) { + if (validTtyChar(d_tio, nn)) { + d_tio.c_cc[ttyChars[nn].sysMode] = + (cc_t) ttyChars[nn].myDefault; + } + } + } +#if defined(macII) || defined(ATT) || defined(CRAY) /* { */ + d_tio.c_cflag = line_speed | CS8 | CREAD | PARENB | HUPCL; + d_tio.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK; +#ifdef ECHOKE + d_tio.c_lflag |= ECHOKE | IEXTEN; +#endif +#ifdef ECHOCTL + d_tio.c_lflag |= ECHOCTL | IEXTEN; +#endif +#ifndef USE_TERMIOS /* { */ + d_tio.c_line = 0; +#endif /* } */ +#ifdef HAS_LTCHARS /* { */ + d_ltc.t_suspc = CSUSP; /* t_suspc */ + d_ltc.t_dsuspc = CDSUSP; /* t_dsuspc */ + d_ltc.t_rprntc = CRPRNT; + d_ltc.t_flushc = CFLUSH; + d_ltc.t_werasc = CWERASE; + d_ltc.t_lnextc = CLNEXT; +#endif /* } HAS_LTCHARS */ +#ifdef TIOCLSET /* { */ + d_lmode = 0; +#endif /* } TIOCLSET */ +#else /* }{ else !macII, ATT, CRAY */ +#ifndef USE_POSIX_TERMIOS +#ifdef BAUD_0 /* { */ + d_tio.c_cflag = CS8 | CREAD | PARENB | HUPCL; +#else /* }{ !BAUD_0 */ + d_tio.c_cflag = line_speed | CS8 | CREAD | PARENB | HUPCL; +#endif /* } !BAUD_0 */ +#else /* USE_POSIX_TERMIOS */ + d_tio.c_cflag = CS8 | CREAD | PARENB | HUPCL; + cfsetispeed(&d_tio, line_speed); + cfsetospeed(&d_tio, line_speed); +#endif + d_tio.c_lflag = ISIG | ICANON | ECHO | ECHOE | ECHOK; +#ifdef ECHOKE + d_tio.c_lflag |= ECHOKE | IEXTEN; +#endif +#ifdef ECHOCTL + d_tio.c_lflag |= ECHOCTL | IEXTEN; +#endif +#ifndef USE_POSIX_TERMIOS +#ifdef NTTYDISC + d_tio.c_line = NTTYDISC; +#else + d_tio.c_line = 0; +#endif +#endif /* USE_POSIX_TERMIOS */ +#ifdef __sgi + d_tio.c_cflag &= ~(HUPCL | PARENB); + d_tio.c_iflag |= BRKINT | ISTRIP | IGNPAR; +#endif +#ifdef __MVS__ + d_tio.c_cflag &= ~(HUPCL | PARENB); +#endif + { + Cardinal nn; + int i; + + /* try to inherit tty settings */ + for (i = 0; i <= 2; i++) { + TERMIO_STRUCT deftio; + if (ttyGetAttr(i, &deftio) == 0) { + for (nn = 0; nn < XtNumber(ttyChars); ++nn) { + if (validTtyChar(d_tio, nn)) { + d_tio.c_cc[ttyChars[nn].sysMode] = + deftio.c_cc[ttyChars[nn].sysMode]; + } + } + break; + } + } + } +#if defined(USE_TERMIOS) || defined(USE_POSIX_TERMIOS) /* { */ + d_tio.c_cc[VMIN] = 1; + d_tio.c_cc[VTIME] = 0; +#endif /* } */ +#ifdef HAS_LTCHARS /* { */ + d_ltc.t_suspc = CharOf('\000'); /* t_suspc */ + d_ltc.t_dsuspc = CharOf('\000'); /* t_dsuspc */ + d_ltc.t_rprntc = CharOf('\377'); /* reserved... */ + d_ltc.t_flushc = CharOf('\377'); + d_ltc.t_werasc = CharOf('\377'); + d_ltc.t_lnextc = CharOf('\377'); +#endif /* } HAS_LTCHARS */ + +#ifdef TIOCLSET /* { */ + d_lmode = 0; +#endif /* } TIOCLSET */ +#endif /* } macII, ATT, CRAY */ +#endif /* } TERMIO_STRUCT */ + + /* Init the Toolkit. */ + { +#if defined(HAVE_POSIX_SAVED_IDS) && !defined(USE_UTMP_SETGID) && !defined(USE_UTEMPTER) + setEffectiveGroup(save_rgid); + setEffectiveUser(save_ruid); + TRACE_IDS; +#endif + toplevel = xtermOpenApplication(&app_con, + my_class, + optionDescList, + XtNumber(optionDescList), + &argc, argv, + fallback_resources, + sessionShellWidgetClass, + NULL, 0); + + XtGetApplicationResources(toplevel, (XtPointer) &resource, + application_resources, + XtNumber(application_resources), NULL, 0); + TRACE_XRES(); +#if USE_DOUBLE_BUFFER + if (resource.buffered_fps <= 0) + resource.buffered_fps = DEF_BUFFER_RATE; + if (resource.buffered_fps > 100) + resource.buffered_fps = 100; +#endif +#if OPT_MAXIMIZE + resource.fullscreen = extendedBoolean(resource.fullscreen_s, + tblFullscreen, + esLAST); +#endif + VTInitTranslations(); +#if OPT_PTY_HANDSHAKE + resource.wait_for_map0 = resource.wait_for_map; +#endif + +#if defined(HAVE_POSIX_SAVED_IDS) && !defined(USE_UTMP_SETGID) +#if !defined(DISABLE_SETUID) || !defined(DISABLE_SETGID) +#if !defined(DISABLE_SETUID) + setEffectiveUser(save_euid); +#endif +#if !defined(DISABLE_SETGID) + setEffectiveGroup(save_egid); +#endif + TRACE_IDS; +#endif +#endif + } + + /* + * ICCCM delete_window. + */ + XtAppAddActions(app_con, actionProcs, XtNumber(actionProcs)); + + /* + * fill in terminal modes + */ + if (resource.tty_modes) { + int n = parse_tty_modes(resource.tty_modes); + if (n < 0) { + xtermWarning("bad tty modes \"%s\"\n", resource.tty_modes); + } else if (n > 0) { + override_tty_modes = True; + } + } + initZIconBeep(); + hold_screen = resource.hold_screen ? 1 : 0; + if (resource.icon_geometry != NULL) { + int scr, junk; + int ix, iy; + Arg args[2]; + + for (scr = 0; /* yyuucchh */ + XtScreen(toplevel) != ScreenOfDisplay(XtDisplay(toplevel), scr); + scr++) ; + + args[0].name = XtNiconX; + args[1].name = XtNiconY; + XGeometry(XtDisplay(toplevel), scr, resource.icon_geometry, "", + 0, 0, 0, 0, 0, &ix, &iy, &junk, &junk); + args[0].value = (XtArgVal) ix; + args[1].value = (XtArgVal) iy; + XtSetValues(toplevel, args, 2); + } + + XtSetValues(toplevel, ourTopLevelShellArgs, + number_ourTopLevelShellArgs); + +#if OPT_WIDE_CHARS + /* seems as good a place as any */ + init_classtab(); +#endif + + /* Parse the rest of the command line */ + TRACE_ARGV("After XtOpenApplication", argv); + for (argc--, argv++; argc > 0; argc--, argv++) { + if (!isOption(*argv)) { +#ifdef VMS + Syntax(*argv); +#else + if (argc > 1) + Syntax(*argv); + continue; +#endif + } + + TRACE(("parsing %s\n", argv[0])); + switch (argv[0][1]) { + case 'C': +#if defined(TIOCCONS) || defined(SRIOCSREDIR) +#ifndef __sgi + { + struct stat sbuf; + + /* Must be owner and have read/write permission. + xdm cooperates to give the console the right user. */ + if (!stat("/dev/console", &sbuf) && + (sbuf.st_uid == save_ruid) && + !access("/dev/console", R_OK | W_OK)) { + Console = True; + } else + Console = False; + } +#else /* __sgi */ + Console = True; +#endif /* __sgi */ +#endif /* TIOCCONS */ + continue; + case 'S': + if (!ParseSccn(*argv + 2)) + Syntax(*argv); + continue; +#ifdef DEBUG + case 'D': + debug = True; + continue; +#endif /* DEBUG */ + case 'b': + if (strcmp(argv[0], "-baudrate")) + Syntax(*argv); + argc--; + argv++; + continue; + case 'c': + if (strcmp(argv[0], "-class")) + Syntax(*argv); + argc--; + argv++; + continue; + case 'e': + if (strcmp(argv[0], "-e")) + Syntax(*argv); + command_to_exec = (argv + 1); + break; + case 'i': + if (strcmp(argv[0], "-into")) + Syntax(*argv); + argc--; + argv++; + continue; + + default: + Syntax(*argv); + } + break; + } + + SetupMenus(toplevel, &form_top, &menu_top, &menu_high); + + term = (XtermWidget) XtVaCreateManagedWidget("vt100", xtermWidgetClass, + form_top, +#if OPT_TOOLBAR + XtNmenuBar, menu_top, + XtNresizable, True, + XtNfromVert, menu_top, + XtNleft, XawChainLeft, + XtNright, XawChainRight, + XtNtop, XawChainTop, + XtNbottom, XawChainBottom, + XtNmenuHeight, menu_high, +#endif + (XtPointer) 0); + decode_keyboard_type(term, &resource); + + screen = TScreenOf(term); + screen->inhibit = 0; + +#ifdef ALLOWLOGGING + if (term->misc.logInhibit) + screen->inhibit |= I_LOG; +#endif + if (term->misc.signalInhibit) + screen->inhibit |= I_SIGNAL; +#if OPT_TEK4014 + if (term->misc.tekInhibit) + screen->inhibit |= I_TEK; +#endif + + /* + * We might start by showing the tek4014 window. + */ +#if OPT_TEK4014 + if (screen->inhibit & I_TEK) + TEK4014_ACTIVE(term) = False; + + if (TEK4014_ACTIVE(term) && !TekInit()) + SysError(ERROR_INIT); +#endif + + /* + * Start the toolbar at this point, after the first window has been setup. + */ +#if OPT_TOOLBAR + ShowToolbar(resource.toolBar); +#endif + + xtermOpenSession(); + + /* + * Set title and icon name if not specified + */ + if (command_to_exec) { + Arg args[2]; + + if (!resource.title) { + if (command_to_exec) { + resource.title = x_basename(command_to_exec[0]); + } /* else not reached */ + } + + if (!resource.icon_name) + resource.icon_name = resource.title; + XtSetArg(args[0], XtNtitle, resource.title); + XtSetArg(args[1], XtNiconName, resource.icon_name); + + TRACE(("setting:\n\ttitle \"%s\"\n\ticon \"%s\"\n\thint \"%s\"\n\tbased on command \"%s\"\n", + resource.title, + resource.icon_name, + NonNull(resource.icon_hint), + *command_to_exec)); + + XtSetValues(toplevel, args, 2); + } +#if OPT_LUIT_PROG + if (term->misc.callfilter) { + char **split_filter = x_splitargs(term->misc.localefilter); + unsigned count_split = x_countargv(split_filter); + unsigned count_exec = x_countargv(command_to_exec); + unsigned count_using = (unsigned) (term->misc.use_encoding ? 2 : 0); + + command_to_exec_with_luit = TypeCallocN(char *, + (count_split + + count_exec + + count_using + + 8)); + if (command_to_exec_with_luit == NULL) + SysError(ERROR_LUMALLOC); + + x_appendargv(command_to_exec_with_luit, split_filter); + if (count_using) { + char *encoding_opt[4]; + encoding_opt[0] = x_strdup("-encoding"); + encoding_opt[1] = term->misc.locale_str; + encoding_opt[2] = 0; + x_appendargv(command_to_exec_with_luit, encoding_opt); + } + command_length_with_luit = x_countargv(command_to_exec_with_luit); + if (count_exec) { + static char *fixup_shell[] = + {(char *) "sh", (char *) "-c", 0}; + char *delimiter[2]; + delimiter[0] = x_strdup("--"); + delimiter[1] = 0; + x_appendargv(command_to_exec_with_luit, delimiter); + if (complex_command(command_to_exec)) { + x_appendargv(command_to_exec_with_luit, fixup_shell); + } + x_appendargv(command_to_exec_with_luit, command_to_exec); + } + TRACE_ARGV("luit command", command_to_exec_with_luit); + xtermSetenv("XTERM_FILTER", *command_to_exec_with_luit); + } +#endif + + if_DEBUG({ + /* Set up stderr properly. Opening this log file cannot be + done securely by a privileged xterm process (although we try), + so the debug feature is disabled by default. */ + char dbglogfile[TIMESTAMP_LEN + 20]; + int i = -1; + timestamp_filename(dbglogfile, "xterm.debug.log."); + if (creat_as(save_ruid, save_rgid, False, dbglogfile, 0600) > 0) { + i = open(dbglogfile, O_WRONLY | O_TRUNC); + } + if (i >= 0) { + dup2(i, 2); + + /* mark this file as close on exec */ + (void) fcntl(i, F_SETFD, 1); + } + }); + + spawnXTerm(term, line_speed); + +#ifndef VMS + /* Child process is out there, let's catch its termination */ + +#ifdef USE_POSIX_SIGNALS + (void) posix_signal(SIGCHLD, reapchild); +#else + (void) signal(SIGCHLD, reapchild); +#endif + /* Realize procs have now been executed */ + + if (am_slave >= 0) { /* Write window id so master end can read and use */ + char buf[80]; + + buf[0] = '\0'; + sprintf(buf, "%lx\n", XtWindow(SHELL_OF(CURRENT_EMU()))); + IGNORE_RC(write(screen->respond, buf, strlen(buf))); + } +#ifdef AIXV3 +#if (OSMAJORVERSION < 4) + /* In AIXV3, xterms started from /dev/console have CLOCAL set. + * This means we need to clear CLOCAL so that SIGHUP gets sent + * to the slave-pty process when xterm exits. + */ + + { + TERMIO_STRUCT tio; + + if (ttyGetAttr(screen->respond, &tio) == -1) + SysError(ERROR_TIOCGETP); + + tio.c_cflag &= ~(CLOCAL); + + if (ttySetAttr(screen->respond, &tio) == -1) + SysError(ERROR_TIOCSETP); + } +#endif +#endif +#if defined(USE_ANY_SYSV_TERMIO) || defined(__MVS__) || defined(__minix) + if (0 > (mode = fcntl(screen->respond, F_GETFL, 0))) + SysError(ERROR_F_GETFL); +#ifdef O_NDELAY + mode |= O_NDELAY; +#else + mode |= O_NONBLOCK; +#endif /* O_NDELAY */ + if (fcntl(screen->respond, F_SETFL, mode)) + SysError(ERROR_F_SETFL); +#else /* !USE_ANY_SYSV_TERMIO */ + mode = 1; + if (ioctl(screen->respond, FIONBIO, (char *) &mode) == -1) + SysError(ERROR_FIONBIO); +#endif /* USE_ANY_SYSV_TERMIO, etc */ + + /* The erase character is used to delete the current completion */ +#if OPT_DABBREV +#ifdef TERMIO_STRUCT + screen->dabbrev_erase_char = d_tio.c_cc[VERASE]; +#else + screen->dabbrev_erase_char = d_sg.sg_erase; +#endif + TRACE(("set dabbrev erase_char %#x\n", screen->dabbrev_erase_char)); +#endif + + FD_ZERO(&pty_mask); + FD_ZERO(&X_mask); + FD_ZERO(&Select_mask); + FD_SET(screen->respond, &pty_mask); + FD_SET(ConnectionNumber(screen->display), &X_mask); + FD_SET(screen->respond, &Select_mask); + FD_SET(ConnectionNumber(screen->display), &Select_mask); + max_plus1 = ((screen->respond < ConnectionNumber(screen->display)) + ? (1 + ConnectionNumber(screen->display)) + : (1 + screen->respond)); + +#endif /* !VMS */ + if_DEBUG({ + TRACE(("debugging on pid %d\n", (int) getpid())); + }); + XSetErrorHandler(xerror); + XSetIOErrorHandler(xioerror); +#if OPT_SESSION_MGT + IceSetIOErrorHandler(ice_error); +#endif + + initPtyData(&VTbuffer); +#ifdef ALLOWLOGGING + if (term->misc.log_on) { + StartLog(term); + } +#endif + + xtermEmbedWindow(winToEmbedInto); +#if OPT_COLOR_RES + TRACE(("checking reverseVideo before rv %s fg %s, bg %s\n", + term->misc.re_verse0 ? "reverse" : "normal", + NonNull(TScreenOf(term)->Tcolors[TEXT_FG].resource), + NonNull(TScreenOf(term)->Tcolors[TEXT_BG].resource))); + + if (term->misc.re_verse0) { + if (isDefaultForeground(TScreenOf(term)->Tcolors[TEXT_FG].resource) + && isDefaultBackground(TScreenOf(term)->Tcolors[TEXT_BG].resource)) { + TScreenOf(term)->Tcolors[TEXT_FG].resource = x_strdup(XtDefaultBackground); + TScreenOf(term)->Tcolors[TEXT_BG].resource = x_strdup(XtDefaultForeground); + } else { + ReverseVideo(term); + } + term->misc.re_verse = True; + update_reversevideo(); + TRACE(("updated reverseVideo after rv %s fg %s, bg %s\n", + term->misc.re_verse ? "reverse" : "normal", + NonNull(TScreenOf(term)->Tcolors[TEXT_FG].resource), + NonNull(TScreenOf(term)->Tcolors[TEXT_BG].resource))); + } +#endif /* OPT_COLOR_RES */ + +#if OPT_MAXIMIZE + if (resource.maximized) + RequestMaximize(term, True); +#endif + for (;;) { +#if OPT_TEK4014 + if (TEK4014_ACTIVE(term)) + TekRun(); + else +#endif + VTRun(term); + } +} + +#if defined(__osf__) || (defined(__GLIBC__) && !defined(USE_USG_PTYS)) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) +#define USE_OPENPTY 1 +static int opened_tty = -1; +#endif + +/* + * This function opens up a pty master and stuffs its value into pty. + * + * If it finds one, it returns a value of 0. If it does not find one, + * it returns a value of !0. This routine is designed to be re-entrant, + * so that if a pty master is found and later, we find that the slave + * has problems, we can re-enter this function and get another one. + */ +static int +get_pty(int *pty, char *from GCC_UNUSED) +{ + int result = 1; + +#if defined(USE_OPENPTY) + result = openpty(pty, &opened_tty, ttydev, NULL, NULL); + if (opened_tty >= 0) { + close(opened_tty); + opened_tty = -1; + } +#elif defined(HAVE_POSIX_OPENPT) && defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT_PTY_ISATTY) + if ((*pty = posix_openpt(O_RDWR)) >= 0) { + char *name = ptsname(*pty); + if (name != 0) { + strcpy(ttydev, name); + result = 0; + } + } +#ifdef USE_PTY_SEARCH + if (result) { + result = pty_search(pty); + } +#endif +#elif defined(PUCC_PTYD) + result = ((*pty = openrpty(ttydev, ptydev, + (resource.utmpInhibit ? OPTY_NOP : OPTY_LOGIN), + save_ruid, from)) < 0); +#elif defined(__QNXNTO__) + result = pty_search(pty); +#else +#if defined(USE_USG_PTYS) || defined(__CYGWIN__) +#if defined(__MVS__) + result = pty_search(pty); +#else + result = ((*pty = open("/dev/ptmx", O_RDWR)) < 0); +#endif +#if defined(SVR4) || defined(__SCO__) + if (!result) + strcpy(ttydev, ptsname(*pty)); +#endif + +#elif defined(AIXV3) + + if ((*pty = open("/dev/ptc", O_RDWR)) >= 0) { + strcpy(ttydev, ttyname(*pty)); + result = 0; + } +#elif defined(__convex__) + + char *pty_name; + extern char *getpty(void); + + while ((pty_name = getpty()) != NULL) { + if ((*pty = open(pty_name, O_RDWR)) >= 0) { + strcpy(ptydev, pty_name); + strcpy(ttydev, pty_name); + *x_basename(ttydev) = 't'; + result = 0; + break; + } + } + +#elif defined(sequent) + + result = ((*pty = getpseudotty(&ttydev, &ptydev)) < 0); + +#elif defined(__sgi) && (OSMAJORVERSION >= 4) + + char *tty_name; + + tty_name = _getpty(pty, O_RDWR, 0622, 0); + if (tty_name != 0) { + strcpy(ttydev, tty_name); + result = 0; + } +#elif (defined(__sgi) && (OSMAJORVERSION < 4)) || (defined(umips) && defined (SYSTYPE_SYSV)) + + struct stat fstat_buf; + + *pty = open("/dev/ptc", O_RDWR); + if (*pty >= 0 && (fstat(*pty, &fstat_buf)) >= 0) { + result = 0; + sprintf(ttydev, "/dev/ttyq%d", minor(fstat_buf.st_rdev)); + } +#elif defined(__hpux) + + /* + * Use the clone device if it works, otherwise use pty_search logic. + */ + if ((*pty = open("/dev/ptym/clone", O_RDWR)) >= 0) { + char *name = ptsname(*pty); + if (name != 0) { + strcpy(ttydev, name); + result = 0; + } else { /* permissions, or other unexpected problem */ + close(*pty); + *pty = -1; + result = pty_search(pty); + } + } else { + result = pty_search(pty); + } + +#else + + result = pty_search(pty); + +#endif +#endif + + TRACE(("get_pty(ttydev=%s, ptydev=%s) %s fd=%d\n", + ttydev != 0 ? ttydev : "?", + ptydev != 0 ? ptydev : "?", + result ? "FAIL" : "OK", + pty != 0 ? *pty : -1)); + return result; +} + +static void +set_pty_permissions(uid_t uid, unsigned gid, unsigned mode) +{ +#ifdef USE_TTY_GROUP + struct group *ttygrp; + + if ((ttygrp = getgrnam(TTY_GROUP_NAME)) != 0) { + gid = (unsigned) ttygrp->gr_gid; + mode &= 0660U; + } + endgrent(); +#endif /* USE_TTY_GROUP */ + + TRACE_IDS; + set_owner(ttydev, (unsigned) uid, gid, mode); +} + +#ifdef get_pty /* USE_UTMP_SETGID */ +#undef get_pty +/* + * Call the real get_pty() before relinquishing root-setuid, caching the + * result. + */ +static int +get_pty(int *pty, char *from) +{ + static int m_pty = -1; + int result = -1; + + if (pty == NULL) { + result = really_get_pty(&m_pty, from); + + seteuid(0); + set_pty_permissions(save_ruid, save_rgid, 0600U); + seteuid(save_ruid); + TRACE_IDS; + + } else if (m_pty != -1) { + *pty = m_pty; + result = 0; + } else { + result = -1; + } + TRACE(("get_pty(ttydev=%s, ptydev=%s) %s fd=%d (utmp setgid)\n", + ttydev != 0 ? ttydev : "?", + ptydev != 0 ? ptydev : "?", + result ? "FAIL" : "OK", + pty != 0 ? *pty : -1)); +#ifdef USE_OPENPTY + if (opened_tty >= 0) { + close(opened_tty); + opened_tty = -1; + } +#endif + return result; +} +#endif + +/* + * Called from get_pty to iterate over likely pseudo terminals + * we might allocate. Used on those systems that do not have + * a functional interface for allocating a pty. + * Returns 0 if found a pty, 1 if fails. + */ +#ifdef USE_PTY_SEARCH +static int +pty_search(int *pty) +{ + static int devindex = 0, letter = 0; + +#if defined(CRAY) || defined(__MVS__) + while (devindex < MAXPTTYS) { + sprintf(ttydev, TTYFORMAT, devindex); + sprintf(ptydev, PTYFORMAT, devindex); + devindex++; + + TRACE(("pty_search(ttydev=%s, ptydev=%s)\n", ttydev, ptydev)); + if ((*pty = open(ptydev, O_RDWR)) >= 0) { + return 0; + } + } +#else /* CRAY || __MVS__ */ + while (PTYCHAR1[letter]) { + ttydev[strlen(ttydev) - 2] = + ptydev[strlen(ptydev) - 2] = PTYCHAR1[letter]; + + while (PTYCHAR2[devindex]) { + ttydev[strlen(ttydev) - 1] = + ptydev[strlen(ptydev) - 1] = PTYCHAR2[devindex]; + devindex++; + + TRACE(("pty_search(ttydev=%s, ptydev=%s)\n", ttydev, ptydev)); + if ((*pty = open(ptydev, O_RDWR)) >= 0) { +#ifdef sun + /* Need to check the process group of the pty. + * If it exists, then the slave pty is in use, + * and we need to get another one. + */ + int pgrp_rtn; + if (ioctl(*pty, TIOCGPGRP, &pgrp_rtn) == 0 || errno != EIO) { + close(*pty); + continue; + } +#endif /* sun */ + return 0; + } + } + devindex = 0; + letter++; + } +#endif /* CRAY else */ + /* + * We were unable to allocate a pty master! Return an error + * condition and let our caller terminate cleanly. + */ + return 1; +} +#endif /* USE_PTY_SEARCH */ + +/* + * The only difference in /etc/termcap between 4014 and 4015 is that + * the latter has support for switching character sets. We support the + * 4015 protocol, but ignore the character switches. Therefore, we + * choose 4014 over 4015. + * + * Features of the 4014 over the 4012: larger (19") screen, 12-bit + * graphics addressing (compatible with 4012 10-bit addressing), + * special point plot mode, incremental plot mode (not implemented in + * later Tektronix terminals), and 4 character sizes. + * All of these are supported by xterm. + */ + +#if OPT_TEK4014 +static const char *const tekterm[] = +{ + "tek4014", + "tek4015", /* 4014 with APL character set support */ + "tek4012", /* 4010 with lower case */ + "tek4013", /* 4012 with APL character set support */ + "tek4010", /* small screen, upper-case only */ + "dumb", + 0 +}; +#endif + +/* The VT102 is a VT100 with the Advanced Video Option included standard. + * It also adds Escape sequences for insert/delete character/line. + * The VT220 adds 8-bit character sets, selective erase. + * The VT320 adds a 25th status line, terminal state interrogation. + * The VT420 has up to 48 lines on the screen. + */ + +static const char *const vtterm[] = +{ +#ifdef USE_X11TERM + "x11term", /* for people who want special term name */ +#endif + DFT_TERMTYPE, /* for people who want special term name */ + "xterm", /* the preferred name, should be fastest */ + "vt102", + "vt100", + "ansi", + "dumb", + 0 +}; + +/* ARGSUSED */ +static void +hungtty(int i GCC_UNUSED) +{ + DEBUG_MSG("handle:hungtty\n"); + siglongjmp(env, 1); +} + +#if OPT_PTY_HANDSHAKE +#define NO_FDS {-1, -1} + +static int cp_pipe[2] = NO_FDS; /* this pipe is used for child to parent transfer */ +static int pc_pipe[2] = NO_FDS; /* this pipe is used for parent to child transfer */ + +typedef enum { /* c == child, p == parent */ + PTY_BAD, /* c->p: can't open pty slave for some reason */ + PTY_FATALERROR, /* c->p: we had a fatal error with the pty */ + PTY_GOOD, /* c->p: we have a good pty, let's go on */ + PTY_NEW, /* p->c: here is a new pty slave, try this */ + PTY_NOMORE, /* p->c; no more pty's, terminate */ + UTMP_ADDED, /* c->p: utmp entry has been added */ + UTMP_TTYSLOT, /* c->p: here is my ttyslot */ + PTY_EXEC /* p->c: window has been mapped the first time */ +} status_t; + +#define HANDSHAKE_LEN 1024 + +typedef struct { + status_t status; + int error; + int fatal_error; + int tty_slot; + int rows; + int cols; + char buffer[HANDSHAKE_LEN]; +} handshake_t; + +/* the buffer is large enough that we can always have a trailing null */ +#define copy_handshake(dst, src) \ + strncpy(dst.buffer, src, (size_t)HANDSHAKE_LEN - 1)[HANDSHAKE_LEN - 1] = '\0' + +#if OPT_TRACE +static void +trace_handshake(const char *tag, handshake_t * data) +{ + const char *status = "?"; + switch (data->status) { + case PTY_BAD: + status = "PTY_BAD"; + break; + case PTY_FATALERROR: + status = "PTY_FATALERROR"; + break; + case PTY_GOOD: + status = "PTY_GOOD"; + break; + case PTY_NEW: + status = "PTY_NEW"; + break; + case PTY_NOMORE: + status = "PTY_NOMORE"; + break; + case UTMP_ADDED: + status = "UTMP_ADDED"; + break; + case UTMP_TTYSLOT: + status = "UTMP_TTYSLOT"; + break; + case PTY_EXEC: + status = "PTY_EXEC"; + break; + } + TRACE(("handshake %s %s errno=%d, error=%d device \"%s\"\n", + tag, + status, + data->error, + data->fatal_error, + data->buffer)); +} +#define TRACE_HANDSHAKE(tag, data) trace_handshake(tag, data) +#else +#define TRACE_HANDSHAKE(tag, data) /* nothing */ +#endif + +/* HsSysError() + * + * This routine does the equivalent of a SysError but it handshakes + * over the errno and error exit to the master process so that it can + * display our error message and exit with our exit code so that the + * user can see it. + */ + +static void +HsSysError(int error) +{ + handshake_t handshake; + + memset(&handshake, 0, sizeof(handshake)); + handshake.status = PTY_FATALERROR; + handshake.error = errno; + handshake.fatal_error = error; + copy_handshake(handshake, ttydev); + + if (resource.ptyHandshake && (cp_pipe[1] >= 0)) { + TRACE(("HsSysError errno=%d, error=%d device \"%s\"\n", + handshake.error, + handshake.fatal_error, + handshake.buffer)); + TRACE_HANDSHAKE("writing", &handshake); + IGNORE_RC(write(cp_pipe[1], + (const char *) &handshake, + sizeof(handshake))); + } else { + xtermWarning("fatal pty error errno=%d, error=%d device \"%s\"\n", + handshake.error, + handshake.fatal_error, + handshake.buffer); + fprintf(stderr, "%s\n", SysErrorMsg(handshake.error)); + fprintf(stderr, "Reason: %s\n", SysReasonMsg(handshake.fatal_error)); + } + exit(error); +} + +void +first_map_occurred(void) +{ + if (resource.wait_for_map) { + if (pc_pipe[1] >= 0) { + handshake_t handshake; + TScreen *screen = TScreenOf(term); + + memset(&handshake, 0, sizeof(handshake)); + handshake.status = PTY_EXEC; + handshake.rows = screen->max_row; + handshake.cols = screen->max_col; + + TRACE(("first_map_occurred: %dx%d\n", MaxRows(screen), MaxCols(screen))); + TRACE_HANDSHAKE("writing", &handshake); + IGNORE_RC(write(pc_pipe[1], + (const char *) &handshake, + sizeof(handshake))); + close(cp_pipe[0]); + close(pc_pipe[1]); + } + resource.wait_for_map = False; + } +} +#else +/* + * temporary hack to get xterm working on att ptys + */ +static void +HsSysError(int error) +{ + xtermWarning("fatal pty error %d (errno=%d) on tty %s\n", + error, errno, ttydev); + exit(error); +} +#endif /* OPT_PTY_HANDSHAKE else !OPT_PTY_HANDSHAKE */ + +#ifndef VMS +static void +set_owner(char *device, unsigned uid, unsigned gid, unsigned mode) +{ + int why; + + TRACE_IDS; + TRACE(("set_owner(%s, uid=%d, gid=%d, mode=%#o\n", + device, (int) uid, (int) gid, (unsigned) mode)); + + if (chown(device, (uid_t) uid, (gid_t) gid) < 0) { + why = errno; + if (why != ENOENT + && save_ruid == 0) { + xtermPerror("Cannot chown %s to %ld,%ld", + device, (long) uid, (long) gid); + } + TRACE(("...chown failed: %s\n", strerror(why))); + } else if (chmod(device, (mode_t) mode) < 0) { + why = errno; + if (why != ENOENT) { + struct stat sb; + if (stat(device, &sb) < 0) { + xtermPerror("Cannot chmod %s to %03o", + device, (unsigned) mode); + } else if (mode != (sb.st_mode & 0777U)) { + xtermPerror("Cannot chmod %s to %03lo currently %03lo", + device, + (unsigned long) mode, + (unsigned long) (sb.st_mode & 0777U)); + TRACE(("...stat uid=%d, gid=%d, mode=%#o\n", + (int) sb.st_uid, (int) sb.st_gid, (unsigned) sb.st_mode)); + } + } + TRACE(("...chmod failed: %s\n", strerror(why))); + } +} + +/* + * utmp data may not be null-terminated; even if it is, there may be garbage + * after the null. This fills the unused part of the result with nulls. + */ +static void +copy_filled(char *target, const char *source, size_t len) +{ + size_t used = 0; + while (used < len) { + if ((target[used] = source[used]) == 0) + break; + ++used; + } + while (used < len) { + target[used++] = '\0'; + } +} + +#if defined(HAVE_UTMP) && defined(USE_SYSV_UTMP) && !defined(USE_UTEMPTER) +/* + * getutid() only looks at ut_type and ut_id. + * But we'll also check ut_line in find_utmp(). + */ +static void +init_utmp(int type, struct UTMP_STR *tofind) +{ + memset(tofind, 0, sizeof(*tofind)); + tofind->ut_type = (short) type; + copy_filled(tofind->ut_id, my_utmp_id(ttydev), sizeof(tofind->ut_id)); + copy_filled(tofind->ut_line, my_pty_name(ttydev), sizeof(tofind->ut_line)); +} + +/* + * We could use getutline() if we didn't support old systems. + */ +static struct UTMP_STR * +find_utmp(struct UTMP_STR *tofind) +{ + struct UTMP_STR *result; + struct UTMP_STR limited; + struct UTMP_STR working; + + for (;;) { + memset(&working, 0, sizeof(working)); + working.ut_type = tofind->ut_type; + copy_filled(working.ut_id, tofind->ut_id, sizeof(tofind->ut_id)); +#if defined(__digital__) && defined(__unix__) && (defined(OSMAJORVERSION) && OSMAJORVERSION < 5) + working.ut_type = 0; +#endif + if ((result = call_getutid(&working)) == 0) + break; + copy_filled(limited.ut_line, result->ut_line, sizeof(result->ut_line)); + if (!memcmp(limited.ut_line, tofind->ut_line, sizeof(limited.ut_line))) + break; + /* + * Solaris, IRIX64 and HPUX manpages say to fill the static area + * pointed to by the return-value to zeros if searching for multiple + * occurrences. Otherwise it will continue to return the same value. + */ + memset(result, 0, sizeof(*result)); + } + return result; +} +#endif /* HAVE_UTMP... */ + +#define close_fd(fd) close(fd), fd = -1 + +#if defined(TIOCNOTTY) && (!defined(__GLIBC__) || (__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1))) +#define USE_NO_DEV_TTY 1 +#else +#define USE_NO_DEV_TTY 0 +#endif + +static int +same_leaf(char *a, char *b) +{ + char *p = x_basename(a); + char *q = x_basename(b); + return !strcmp(p, q); +} + +/* + * "good enough" (inode wouldn't port to Cygwin) + */ +static int +same_file(const char *a, const char *b) +{ + struct stat asb; + struct stat bsb; + int result = 0; + + if ((stat(a, &asb) == 0) + && (stat(b, &bsb) == 0) + && ((asb.st_mode & S_IFMT) == S_IFREG) + && ((bsb.st_mode & S_IFMT) == S_IFREG) + && (asb.st_mtime == bsb.st_mtime) + && (asb.st_size == bsb.st_size)) { + result = 1; + } + return result; +} + +static int +findValidShell(const char *haystack, const char *needle) +{ + int result = -1; + int count = -1; + const char *s, *t; + size_t have; + size_t want = strlen(needle); + + TRACE(("findValidShell:\n%s\n", NonNull(haystack))); + + for (s = t = haystack; (s != 0) && (*s != '\0'); s = t) { + ++count; + if ((t = strchr(s, '\n')) == 0) { + t = s + strlen(s); + } + have = (size_t) (t - s); + + if ((have >= want) && (*s != '#')) { + char *p = malloc(have + 1); + + if (p != 0) { + char *q; + + memcpy(p, s, have); + p[have] = '\0'; + if ((q = x_strtrim(p)) != 0) { + TRACE(("...test %s\n", q)); + if (!strcmp(q, needle)) { + result = count; + } else if (same_leaf(q, (char *) needle) && + same_file(q, needle)) { + result = count; + } + free(q); + } + free(p); + } + if (result >= 0) + break; + } + while (*t == '\n') { + ++t; + } + } + return result; +} + +static int +ourValidShell(const char *pathname) +{ + return findValidShell(x_strtrim(resource.valid_shells), pathname); +} + +#if defined(HAVE_GETUSERSHELL) && defined(HAVE_ENDUSERSHELL) +static Boolean +validShell(const char *pathname) +{ + int result = -1; + + if (validProgram(pathname)) { + char *q; + int count = -1; + + TRACE(("validShell:getusershell\n")); + while ((q = getusershell()) != 0) { + ++count; + TRACE(("...test \"%s\"\n", q)); + if (!strcmp(q, pathname)) { + result = count; + break; + } + } + endusershell(); + + if (result < 0) + result = ourValidShell(pathname); + } + + TRACE(("validShell %s ->%d\n", NonNull(pathname), result)); + return (result >= 0); +} +#else +/* + * Only set $SHELL for paths found in the standard location. + */ +static Boolean +validShell(const char *pathname) +{ + int result = -1; + const char *ok_shells = "/etc/shells"; + char *blob; + struct stat sb; + size_t rc; + FILE *fp; + + if (validProgram(pathname)) { + + TRACE(("validShell:%s\n", ok_shells)); + + if (stat(ok_shells, &sb) == 0 + && (sb.st_mode & S_IFMT) == S_IFREG + && ((size_t) sb.st_size > 0) + && ((size_t) sb.st_size < (((size_t) ~0) - 2)) + && (blob = calloc((size_t) sb.st_size + 2, sizeof(char))) != 0) { + + if ((fp = fopen(ok_shells, "r")) != 0) { + rc = fread(blob, sizeof(char), (size_t) sb.st_size, fp); + fclose(fp); + + if (rc == (size_t) sb.st_size) { + blob[rc] = '\0'; + result = findValidShell(blob, pathname); + } + } + free(blob); + } + if (result < 0) + result = ourValidShell(pathname); + } + TRACE(("validShell %s ->%d\n", NonNull(pathname), result)); + return (result > 0); +} +#endif + +static char * +resetShell(char *oldPath) +{ + char *newPath = x_strdup("/bin/sh"); + char *envPath = getenv("SHELL"); + if (oldPath != 0) + free(oldPath); + if (!IsEmpty(envPath)) + xtermSetenv("SHELL", newPath); + return newPath; +} + +/* + * Inits pty and tty and forks a login process. + * Does not close fd Xsocket. + * If slave, the pty named in passedPty is already open for use + */ +static int +spawnXTerm(XtermWidget xw, unsigned line_speed) +{ + TScreen *screen = TScreenOf(xw); + Cardinal nn; +#if OPT_PTY_HANDSHAKE + Bool got_handshake_size = False; + handshake_t handshake; + int done; +#endif +#if OPT_INITIAL_ERASE + int initial_erase = VAL_INITIAL_ERASE; + Bool setInitialErase; +#endif + int rc = 0; + int ttyfd = -1; + Bool ok_termcap; + char *newtc; + +#ifdef TERMIO_STRUCT + TERMIO_STRUCT tio; +#ifdef __MVS__ + TERMIO_STRUCT gio; +#endif /* __MVS__ */ +#ifdef TIOCLSET + unsigned lmode; +#endif /* TIOCLSET */ +#ifdef HAS_LTCHARS + struct ltchars ltc; +#endif /* HAS_LTCHARS */ +#else /* !TERMIO_STRUCT */ + int ldisc = 0; + int discipline; + unsigned lmode; + struct tchars tc; + struct ltchars ltc; + struct sgttyb sg; +#ifdef sony + int jmode; + struct jtchars jtc; +#endif /* sony */ +#endif /* TERMIO_STRUCT */ + + char *shell_path = 0; + char *shname, *shname_minus; + int i; +#if USE_NO_DEV_TTY + int no_dev_tty = False; +#endif + const char *const *envnew; /* new environment */ + char buf[64]; + char *TermName = NULL; +#ifdef TTYSIZE_STRUCT + TTYSIZE_STRUCT ts; +#endif + struct passwd pw; + char *login_name = NULL; +#ifndef USE_UTEMPTER +#ifdef HAVE_UTMP + struct UTMP_STR utmp; +#ifdef USE_SYSV_UTMP + struct UTMP_STR *utret = NULL; +#endif +#ifdef USE_LASTLOG + struct lastlog lastlog; +#endif +#ifdef USE_LASTLOGX + struct lastlogx lastlogx; +#endif /* USE_LASTLOG */ +#endif /* HAVE_UTMP */ +#endif /* !USE_UTEMPTER */ + +#if OPT_TRACE + unsigned long xterm_parent = (unsigned long) getpid(); +#endif + + /* Noisy compilers (suppress some unused-variable warnings) */ + (void) rc; +#if defined(HAVE_UTMP) && defined(USE_SYSV_UTMP) && !defined(USE_UTEMPTER) + (void) utret; +#endif + + screen->uid = save_ruid; + screen->gid = save_rgid; + +#ifdef SIGTTOU + /* so that TIOCSWINSZ || TIOCSIZE doesn't block */ + signal(SIGTTOU, SIG_IGN); +#endif + +#if OPT_PTY_HANDSHAKE + memset(&handshake, 0, sizeof(handshake)); +#endif + + if (am_slave >= 0) { + screen->respond = am_slave; + set_pty_id(ttydev, passedPty); +#ifdef USE_PTY_DEVICE + set_pty_id(ptydev, passedPty); +#endif + if (xtermResetIds(screen) < 0) + exit(1); + } else { + Bool tty_got_hung; + + /* + * Sometimes /dev/tty hangs on open (as in the case of a pty + * that has gone away). Simply make up some reasonable + * defaults. + */ + + if (!sigsetjmp(env, 1)) { + signal(SIGALRM, hungtty); + alarm(2); /* alarm(1) might return too soon */ + ttyfd = open("/dev/tty", O_RDWR); + alarm(0); + tty_got_hung = False; + } else { + tty_got_hung = True; + ttyfd = -1; + errno = ENXIO; + } + shell_path = 0; + memset(&pw, 0, sizeof(pw)); +#if OPT_PTY_HANDSHAKE + got_handshake_size = False; +#endif /* OPT_PTY_HANDSHAKE */ +#if OPT_INITIAL_ERASE + initial_erase = VAL_INITIAL_ERASE; +#endif + signal(SIGALRM, SIG_DFL); + + /* + * Check results and ignore current control terminal if + * necessary. ENXIO is what is normally returned if there is + * no controlling terminal, but some systems (e.g. SunOS 4.0) + * seem to return EIO. Solaris 2.3 is said to return EINVAL. + * Cygwin returns ENOENT. FreeBSD can return ENOENT, especially + * if xterm is run within a jail. + */ +#if USE_NO_DEV_TTY + no_dev_tty = False; +#endif + if (ttyfd < 0) { + if (tty_got_hung || errno == ENXIO || errno == EIO || + errno == ENOENT || +#ifdef ENODEV + errno == ENODEV || +#endif + errno == EINVAL || errno == ENOTTY || errno == EACCES) { +#if USE_NO_DEV_TTY + no_dev_tty = True; +#endif +#ifdef HAS_LTCHARS + ltc = d_ltc; +#endif /* HAS_LTCHARS */ +#ifdef TIOCLSET + lmode = d_lmode; +#endif /* TIOCLSET */ +#ifdef TERMIO_STRUCT + tio = d_tio; +#else /* !TERMIO_STRUCT */ + sg = d_sg; + tc = d_tc; + discipline = d_disipline; +#ifdef sony + jmode = d_jmode; + jtc = d_jtc; +#endif /* sony */ +#endif /* TERMIO_STRUCT */ + } else { + SysError(ERROR_OPDEVTTY); + } + } else { + + /* Get a copy of the current terminal's state, + * if we can. Some systems (e.g., SVR4 and MacII) + * may not have a controlling terminal at this point + * if started directly from xdm or xinit, + * in which case we just use the defaults as above. + */ +#ifdef HAS_LTCHARS + if (ioctl(ttyfd, TIOCGLTC, <c) == -1) + ltc = d_ltc; +#endif /* HAS_LTCHARS */ +#ifdef TIOCLSET + if (ioctl(ttyfd, TIOCLGET, &lmode) == -1) + lmode = d_lmode; +#endif /* TIOCLSET */ +#ifdef TERMIO_STRUCT + rc = ttyGetAttr(ttyfd, &tio); + if (rc == -1) + tio = d_tio; +#else /* !TERMIO_STRUCT */ + rc = ioctl(ttyfd, TIOCGETP, (char *) &sg); + if (rc == -1) + sg = d_sg; + if (ioctl(ttyfd, TIOCGETC, (char *) &tc) == -1) + tc = d_tc; + if (ioctl(ttyfd, TIOCGETD, (char *) &discipline) == -1) + discipline = d_disipline; +#ifdef sony + if (ioctl(ttyfd, TIOCKGET, (char *) &jmode) == -1) + jmode = d_jmode; + if (ioctl(ttyfd, TIOCKGETC, (char *) &jtc) == -1) + jtc = d_jtc; +#endif /* sony */ +#endif /* TERMIO_STRUCT */ + + /* + * If ptyInitialErase is set, we want to get the pty's + * erase value. Just in case that will fail, first get + * the value from /dev/tty, so we will have something + * at least. + */ +#if OPT_INITIAL_ERASE + if (resource.ptyInitialErase) { +#ifdef TERMIO_STRUCT + initial_erase = tio.c_cc[VERASE]; +#else /* !TERMIO_STRUCT */ + initial_erase = sg.sg_erase; +#endif /* TERMIO_STRUCT */ + TRACE(("%s initial_erase:%d (from /dev/tty)\n", + rc == 0 ? "OK" : "FAIL", + initial_erase)); + } +#endif +#ifdef __MVS__ + if (ttyGetAttr(ttyfd, &gio) == 0) { + gio.c_cflag &= ~(HUPCL | PARENB); + ttySetAttr(ttyfd, &gio); + } +#endif /* __MVS__ */ + + close_fd(ttyfd); + } + + if (get_pty(&screen->respond, XDisplayString(screen->display))) { + SysError(ERROR_PTYS); + } + TRACE_GET_TTYSIZE(screen->respond, "after get_pty"); +#if OPT_INITIAL_ERASE + if (resource.ptyInitialErase) { +#ifdef TERMIO_STRUCT + TERMIO_STRUCT my_tio; + rc = ttyGetAttr(screen->respond, &my_tio); + if (rc == 0) + initial_erase = my_tio.c_cc[VERASE]; +#else /* !TERMIO_STRUCT */ + struct sgttyb my_sg; + rc = ioctl(screen->respond, TIOCGETP, (char *) &my_sg); + if (rc == 0) + initial_erase = my_sg.sg_erase; +#endif /* TERMIO_STRUCT */ + TRACE(("%s initial_erase:%d (from pty)\n", + (rc == 0) ? "OK" : "FAIL", + initial_erase)); + } +#endif /* OPT_INITIAL_ERASE */ + } + + /* avoid double MapWindow requests */ + XtSetMappedWhenManaged(SHELL_OF(CURRENT_EMU()), False); + + wm_delete_window = XInternAtom(XtDisplay(toplevel), "WM_DELETE_WINDOW", + False); + + if (!TEK4014_ACTIVE(xw)) + VTInit(xw); /* realize now so know window size for tty driver */ +#if defined(TIOCCONS) || defined(SRIOCSREDIR) + if (Console) { + /* + * Inform any running xconsole program + * that we are going to steal the console. + */ + XmuGetHostname(mit_console_name + MIT_CONSOLE_LEN, 255); + mit_console = XInternAtom(screen->display, mit_console_name, False); + /* the user told us to be the console, so we can use CurrentTime */ + XtOwnSelection(SHELL_OF(CURRENT_EMU()), + mit_console, CurrentTime, + ConvertConsoleSelection, NULL, NULL); + } +#endif +#if OPT_TEK4014 + if (TEK4014_ACTIVE(xw)) { + envnew = tekterm; + } else +#endif + { + envnew = vtterm; + } + + /* + * This used to exit if no termcap entry was found for the specified + * terminal name. That's a little unfriendly, so instead we'll allow + * the program to proceed (but not to set $TERMCAP) if the termcap + * entry is not found. + */ + ok_termcap = True; + if (!get_termcap(xw, TermName = resource.term_name)) { + const char *last = NULL; + char *next; + + TermName = x_strdup(*envnew); + ok_termcap = False; + while (*envnew != NULL) { + if (last == NULL || strcmp(last, *envnew)) { + next = x_strdup(*envnew); + if (get_termcap(xw, next)) { + free(TermName); + TermName = next; + ok_termcap = True + 1; + break; + } else { + free(next); + } + } + last = *envnew; + envnew++; + } + } + if (ok_termcap) { + resource.term_name = x_strdup(TermName); + resize_termcap(xw); + } + + /* + * Check if ptyInitialErase is not set. If so, we rely on the termcap + * (or terminfo) to tell us what the erase mode should be set to. + */ +#if OPT_INITIAL_ERASE + TRACE(("resource ptyInitialErase is %sset\n", + resource.ptyInitialErase ? "" : "not ")); + setInitialErase = False; + if (override_tty_modes && ttyModes[XTTYMODE_erase].set) { + initial_erase = ttyModes[XTTYMODE_erase].value; + setInitialErase = True; + } else if (resource.ptyInitialErase) { + /* EMPTY */ ; + } else if (ok_termcap) { + char *s = get_tcap_erase(xw); + TRACE(("...extracting initial_erase value from termcap\n")); + if (s != 0) { + char *save = s; + initial_erase = decode_keyvalue(&s, True); + setInitialErase = True; + free(save); + } + } + TRACE(("...initial_erase:%d\n", initial_erase)); + + TRACE(("resource backarrowKeyIsErase is %sset\n", + resource.backarrow_is_erase ? "" : "not ")); + if (resource.backarrow_is_erase) { /* see input.c */ + if (initial_erase == ANSI_DEL) { + UIntClr(xw->keyboard.flags, MODE_DECBKM); + } else { + xw->keyboard.flags |= MODE_DECBKM; + xw->keyboard.reset_DECBKM = 1; + } + TRACE(("...sets DECBKM %s\n", + (xw->keyboard.flags & MODE_DECBKM) ? "on" : "off")); + } else { + xw->keyboard.reset_DECBKM = 2; + } +#endif /* OPT_INITIAL_ERASE */ + +#ifdef TTYSIZE_STRUCT + /* tell tty how big window is */ +#if OPT_TEK4014 + if (TEK4014_ACTIVE(xw)) { + setup_winsize(ts, TDefaultRows, TDefaultCols, + TFullHeight(TekScreenOf(tekWidget)), + TFullWidth(TekScreenOf(tekWidget))); + } else +#endif + { + setup_winsize(ts, MaxRows(screen), MaxCols(screen), + FullHeight(screen), FullWidth(screen)); + } + TRACE_RC(i, SET_TTYSIZE(screen->respond, ts)); + TRACE(("spawn SET_TTYSIZE %dx%d return %d\n", + TTYSIZE_ROWS(ts), + TTYSIZE_COLS(ts), i)); +#endif /* TTYSIZE_STRUCT */ + +#if !defined(USE_OPENPTY) +#if defined(USE_USG_PTYS) || defined(HAVE_POSIX_OPENPT) + /* + * utempter checks the ownership of the device; some implementations + * set ownership in grantpt - do this first. + */ + grantpt(screen->respond); +#endif +#if !defined(USE_USG_PTYS) && defined(HAVE_POSIX_OPENPT) + unlockpt(screen->respond); + TRACE_GET_TTYSIZE(screen->respond, "after unlockpt"); +#endif +#endif /* !USE_OPENPTY */ + + added_utmp_entry = False; +#if defined(USE_UTEMPTER) +#undef UTMP + if ((xw->misc.login_shell || !command_to_exec) && !resource.utmpInhibit) { + struct UTMP_STR dummy; + + /* Note: utempter may trim it anyway */ + SetUtmpHost(dummy.ut_host, screen); + TRACE(("...calling addToUtmp(pty=%s, hostname=%s, master_fd=%d)\n", + ttydev, dummy.ut_host, screen->respond)); + UTEMPTER_ADD(ttydev, dummy.ut_host, screen->respond); + added_utmp_entry = True; + } +#endif + + if (am_slave < 0) { +#if OPT_PTY_HANDSHAKE + if (resource.ptyHandshake && (pipe(pc_pipe) || pipe(cp_pipe))) + SysError(ERROR_FORK); +#endif + TRACE(("Forking...\n")); + if ((screen->pid = fork()) == -1) + SysError(ERROR_FORK); + + if (screen->pid == 0) { +#ifdef USE_USG_PTYS + int ptyfd = -1; + char *pty_name; +#endif + /* + * now in child process + */ +#if defined(_POSIX_SOURCE) || defined(SVR4) || defined(__convex__) || defined(__SCO__) || defined(__QNX__) + int pgrp = setsid(); /* variable may not be used... */ +#else + int pgrp = getpid(); +#endif + TRACE_CHILD + +#ifdef USE_USG_PTYS +#ifdef HAVE_SETPGID + setpgid(0, 0); +#else + setpgrp(); +#endif + unlockpt(screen->respond); + TRACE_GET_TTYSIZE(screen->respond, "after unlockpt"); + if ((pty_name = ptsname(screen->respond)) == 0) { + SysError(ERROR_PTSNAME); + } else if ((ptyfd = open(pty_name, O_RDWR)) < 0) { + SysError(ERROR_OPPTSNAME); + } +#ifdef I_PUSH + else if (PUSH_FAILS(ptyfd, "ptem")) { + SysError(ERROR_PTEM); + } +#if !defined(SVR4) && !(defined(SYSV) && defined(i386)) + else if (!x_getenv("CONSEM") + && PUSH_FAILS(ptyfd, "consem")) { + SysError(ERROR_CONSEM); + } +#endif /* !SVR4 */ + else if (PUSH_FAILS(ptyfd, "ldterm")) { + SysError(ERROR_LDTERM); + } +#ifdef SVR4 /* from Sony */ + else if (PUSH_FAILS(ptyfd, "ttcompat")) { + SysError(ERROR_TTCOMPAT); + } +#endif /* SVR4 */ +#endif /* I_PUSH */ + ttyfd = ptyfd; +#ifndef __MVS__ + close_fd(screen->respond); +#endif /* __MVS__ */ + +#ifdef TTYSIZE_STRUCT + /* tell tty how big window is */ +#if OPT_TEK4014 + if (TEK4014_ACTIVE(xw)) { + setup_winsize(ts, TDefaultRows, TDefaultCols, + TFullHeight(TekScreenOf(tekWidget)), + TFullWidth(TekScreenOf(tekWidget))); + } else +#endif /* OPT_TEK4014 */ + { + setup_winsize(ts, MaxRows(screen), MaxCols(screen), + FullHeight(screen), FullWidth(screen)); + } + trace_winsize(ts, "initial tty size"); +#endif /* TTYSIZE_STRUCT */ + +#endif /* USE_USG_PTYS */ + + (void) pgrp; /* not all branches use this variable */ + +#if OPT_PTY_HANDSHAKE /* warning, goes for a long ways */ + if (resource.ptyHandshake) { + char *ptr; + + /* close parent's sides of the pipes */ + close(cp_pipe[0]); + close(pc_pipe[1]); + + /* Make sure that our sides of the pipes are not in the + * 0, 1, 2 range so that we don't fight with stdin, out + * or err. + */ + if (cp_pipe[1] <= 2) { + if ((i = fcntl(cp_pipe[1], F_DUPFD, 3)) >= 0) { + IGNORE_RC(close(cp_pipe[1])); + cp_pipe[1] = i; + } + } + if (pc_pipe[0] <= 2) { + if ((i = fcntl(pc_pipe[0], F_DUPFD, 3)) >= 0) { + IGNORE_RC(close(pc_pipe[0])); + pc_pipe[0] = i; + } + } + + /* we don't need the socket, or the pty master anymore */ + close(ConnectionNumber(screen->display)); +#ifndef __MVS__ + if (screen->respond >= 0) + close(screen->respond); +#endif /* __MVS__ */ + + /* Now is the time to set up our process group and + * open up the pty slave. + */ +#ifdef USE_SYSV_PGRP +#if defined(CRAY) && (OSMAJORVERSION > 5) + IGNORE_RC(setsid()); +#else + IGNORE_RC(setpgrp()); +#endif +#endif /* USE_SYSV_PGRP */ + +#if defined(__QNX__) && !defined(__QNXNTO__) + qsetlogin(getlogin(), ttydev); +#endif + if (ttyfd >= 0) { +#ifdef __MVS__ + if (ttyGetAttr(ttyfd, &gio) == 0) { + gio.c_cflag &= ~(HUPCL | PARENB); + ttySetAttr(ttyfd, &gio); + } +#else /* !__MVS__ */ + close_fd(ttyfd); +#endif /* __MVS__ */ + } + + for (;;) { +#if USE_NO_DEV_TTY + if (!no_dev_tty + && (ttyfd = open("/dev/tty", O_RDWR)) >= 0) { + ioctl(ttyfd, TIOCNOTTY, (char *) NULL); + close_fd(ttyfd); + } +#endif /* USE_NO_DEV_TTY */ +#ifdef CSRG_BASED + IGNORE_RC(revoke(ttydev)); +#endif + if ((ttyfd = open(ttydev, O_RDWR)) >= 0) { + TRACE_GET_TTYSIZE(ttyfd, "after open"); + TRACE_RC(i, SET_TTYSIZE(ttyfd, ts)); + TRACE_GET_TTYSIZE(ttyfd, "after SET_TTYSIZE fixup"); +#if defined(CRAY) && defined(TCSETCTTY) + /* make /dev/tty work */ + ioctl(ttyfd, TCSETCTTY, 0); +#endif +#if ((defined(__GLIBC__) && defined(__FreeBSD_kernel__)) || defined(__GNU__)) && defined(TIOCSCTTY) + /* make /dev/tty work */ + ioctl(ttyfd, TIOCSCTTY, 0); +#endif +#ifdef USE_SYSV_PGRP + /* We need to make sure that we are actually + * the process group leader for the pty. If + * we are, then we should now be able to open + * /dev/tty. + */ + if ((i = open("/dev/tty", O_RDWR)) >= 0) { + /* success! */ + close(i); + break; + } +#else /* USE_SYSV_PGRP */ + break; +#endif /* USE_SYSV_PGRP */ + } + perror("open ttydev"); +#ifdef TIOCSCTTY + ioctl(ttyfd, TIOCSCTTY, 0); +#endif + /* let our master know that the open failed */ + handshake.status = PTY_BAD; + handshake.error = errno; + copy_handshake(handshake, ttydev); + TRACE_HANDSHAKE("writing", &handshake); + IGNORE_RC(write(cp_pipe[1], + (const char *) &handshake, + sizeof(handshake))); + + /* get reply from parent */ + i = (int) read(pc_pipe[0], (char *) &handshake, + sizeof(handshake)); + if (i <= 0) { + /* parent terminated */ + exit(1); + } + + if (handshake.status == PTY_NOMORE) { + /* No more ptys, let's shutdown. */ + exit(1); + } + + /* We have a new pty to try */ + if (ttyfd >= 0) + close(ttyfd); + free(ttydev); + handshake.buffer[HANDSHAKE_LEN - 1] = '\0'; + ttydev = x_strdup(handshake.buffer); + } + + /* use the same tty name that everyone else will use + * (from ttyname) + */ + if ((ptr = ttyname(ttyfd)) != 0) { + free(ttydev); + ttydev = x_strdup(ptr); + } + } +#endif /* OPT_PTY_HANDSHAKE -- from near fork */ + + set_pty_permissions(screen->uid, + (unsigned) screen->gid, + (resource.messages + ? 0622U + : 0600U)); + + /* + * set up the tty modes + */ + { +#ifdef TERMIO_STRUCT +#if defined(umips) || defined(CRAY) || defined(linux) + /* If the control tty had its modes screwed around with, + eg. by lineedit in the shell, or emacs, etc. then tio + will have bad values. Let's just get termio from the + new tty and tailor it. */ + if (ttyGetAttr(ttyfd, &tio) == -1) + SysError(ERROR_TIOCGETP); + tio.c_lflag |= ECHOE; +#endif /* umips */ + /* Now is also the time to change the modes of the + * child pty. + */ + /* input: nl->nl, don't ignore cr, cr->nl */ + UIntClr(tio.c_iflag, (INLCR | IGNCR)); + tio.c_iflag |= ICRNL; +#if OPT_WIDE_CHARS && defined(IUTF8) +#if OPT_LUIT_PROG + if (command_to_exec_with_luit == 0) +#endif + if (screen->utf8_mode) + tio.c_iflag |= IUTF8; +#endif + /* output: cr->cr, nl is not return, no delays, ln->cr/nl */ +#ifndef USE_POSIX_TERMIOS + UIntClr(tio.c_oflag, + (OCRNL + | ONLRET + | NLDLY + | CRDLY + | TABDLY + | BSDLY + | VTDLY + | FFDLY)); +#endif /* USE_POSIX_TERMIOS */ + tio.c_oflag |= D_TIO_FLAGS; +#ifndef USE_POSIX_TERMIOS +# if defined(Lynx) && !defined(CBAUD) +# define CBAUD V_CBAUD +# endif + UIntClr(tio.c_cflag, CBAUD); +#ifdef BAUD_0 + /* baud rate is 0 (don't care) */ +#elif defined(HAVE_TERMIO_C_ISPEED) + tio.c_ispeed = tio.c_ospeed = line_speed; +#else /* !BAUD_0 */ + tio.c_cflag |= line_speed; +#endif /* !BAUD_0 */ +#else /* USE_POSIX_TERMIOS */ + cfsetispeed(&tio, line_speed); + cfsetospeed(&tio, line_speed); +#ifdef __MVS__ + /* turn off bits that can't be set from the slave side */ + tio.c_cflag &= ~(PACKET | PKT3270 | PTU3270 | PKTXTND); +#endif /* __MVS__ */ + /* Clear CLOCAL so that SIGHUP is sent to us + when the xterm ends */ + tio.c_cflag &= (unsigned) ~CLOCAL; +#endif /* USE_POSIX_TERMIOS */ + /* enable signals, canonical processing (erase, kill, etc), + * echo + */ + tio.c_lflag |= ISIG | ICANON | ECHO | ECHOE | ECHOK; +#ifdef ECHOKE + tio.c_lflag |= ECHOKE | IEXTEN; +#endif +#ifdef ECHOCTL + tio.c_lflag |= ECHOCTL | IEXTEN; +#endif + for (nn = 0; nn < XtNumber(ttyChars); ++nn) { + if (validTtyChar(tio, nn)) { + int sysMode = ttyChars[nn].sysMode; +#ifdef __MVS__ + if (tio.c_cc[sysMode] != 0) { + switch (sysMode) { + case VEOL: + case VEOF: + continue; + } + } +#endif + tio.c_cc[sysMode] = (cc_t) ttyChars[nn].myDefault; + } + } + + if (override_tty_modes) { + TRACE(("applying termios ttyModes\n")); + for (nn = 0; nn < XtNumber(ttyChars); ++nn) { + if (validTtyChar(tio, nn)) { + TMODE(ttyChars[nn].myMode, + tio.c_cc[ttyChars[nn].sysMode]); + } else if (isTabMode(nn)) { + unsigned tmp = (unsigned) tio.c_oflag; + tmp = tmp & (unsigned) ~TABDLY; + tmp |= (unsigned) ttyModes[ttyChars[nn].myMode].value; + tio.c_oflag = tmp; + } + } +#ifdef HAS_LTCHARS + /* both SYSV and BSD have ltchars */ + TMODE(XTTYMODE_susp, ltc.t_suspc); + TMODE(XTTYMODE_dsusp, ltc.t_dsuspc); + TMODE(XTTYMODE_rprnt, ltc.t_rprntc); + TMODE(XTTYMODE_flush, ltc.t_flushc); + TMODE(XTTYMODE_weras, ltc.t_werasc); + TMODE(XTTYMODE_lnext, ltc.t_lnextc); +#endif + } +#ifdef HAS_LTCHARS +#ifdef __hpux + /* ioctl chokes when the "reserved" process group controls + * are not set to _POSIX_VDISABLE */ + ltc.t_rprntc = _POSIX_VDISABLE; + ltc.t_rprntc = _POSIX_VDISABLE; + ltc.t_flushc = _POSIX_VDISABLE; + ltc.t_werasc = _POSIX_VDISABLE; + ltc.t_lnextc = _POSIX_VDISABLE; +#endif /* __hpux */ + if (ioctl(ttyfd, TIOCSLTC, <c) == -1) + HsSysError(ERROR_TIOCSETC); +#endif /* HAS_LTCHARS */ +#ifdef TIOCLSET + if (ioctl(ttyfd, TIOCLSET, (char *) &lmode) == -1) + HsSysError(ERROR_TIOCLSET); +#endif /* TIOCLSET */ + if (ttySetAttr(ttyfd, &tio) == -1) + HsSysError(ERROR_TIOCSETP); + + /* ignore errors here - some platforms don't work */ + UIntClr(tio.c_cflag, CSIZE); + if (screen->input_eight_bits) + tio.c_cflag |= CS8; + else + tio.c_cflag |= CS7; + (void) ttySetAttr(ttyfd, &tio); + +#else /* !TERMIO_STRUCT */ + sg.sg_flags &= ~(ALLDELAY | XTABS | CBREAK | RAW); + sg.sg_flags |= ECHO | CRMOD; + /* make sure speed is set on pty so that editors work right */ + sg.sg_ispeed = line_speed; + sg.sg_ospeed = line_speed; + /* reset t_brkc to default value */ + tc.t_brkc = -1; +#ifdef LPASS8 + if (screen->input_eight_bits) + lmode |= LPASS8; + else + lmode &= ~(LPASS8); +#endif +#ifdef sony + jmode &= ~KM_KANJI; +#endif /* sony */ + + ltc = d_ltc; + + if (override_tty_modes) { + TRACE(("applying sgtty ttyModes\n")); + TMODE(XTTYMODE_intr, tc.t_intrc); + TMODE(XTTYMODE_quit, tc.t_quitc); + TMODE(XTTYMODE_erase, sg.sg_erase); + TMODE(XTTYMODE_kill, sg.sg_kill); + TMODE(XTTYMODE_eof, tc.t_eofc); + TMODE(XTTYMODE_start, tc.t_startc); + TMODE(XTTYMODE_stop, tc.t_stopc); + TMODE(XTTYMODE_brk, tc.t_brkc); + /* both SYSV and BSD have ltchars */ + TMODE(XTTYMODE_susp, ltc.t_suspc); + TMODE(XTTYMODE_dsusp, ltc.t_dsuspc); + TMODE(XTTYMODE_rprnt, ltc.t_rprntc); + TMODE(XTTYMODE_flush, ltc.t_flushc); + TMODE(XTTYMODE_weras, ltc.t_werasc); + TMODE(XTTYMODE_lnext, ltc.t_lnextc); + if (ttyModes[XTTYMODE_tabs].set + || ttyModes[XTTYMODE__tabs].set) { + sg.sg_flags &= ~XTABS; + if (ttyModes[XTTYMODE__tabs].set.set) + sg.sg_flags |= XTABS; + } + } + + if (ioctl(ttyfd, TIOCSETP, (char *) &sg) == -1) + HsSysError(ERROR_TIOCSETP); + if (ioctl(ttyfd, TIOCSETC, (char *) &tc) == -1) + HsSysError(ERROR_TIOCSETC); + if (ioctl(ttyfd, TIOCSETD, (char *) &discipline) == -1) + HsSysError(ERROR_TIOCSETD); + if (ioctl(ttyfd, TIOCSLTC, (char *) <c) == -1) + HsSysError(ERROR_TIOCSLTC); + if (ioctl(ttyfd, TIOCLSET, (char *) &lmode) == -1) + HsSysError(ERROR_TIOCLSET); +#ifdef sony + if (ioctl(ttyfd, TIOCKSET, (char *) &jmode) == -1) + HsSysError(ERROR_TIOCKSET); + if (ioctl(ttyfd, TIOCKSETC, (char *) &jtc) == -1) + HsSysError(ERROR_TIOCKSETC); +#endif /* sony */ +#endif /* TERMIO_STRUCT */ +#if defined(TIOCCONS) || defined(SRIOCSREDIR) + if (Console) { +#ifdef TIOCCONS + int on = 1; + if (ioctl(ttyfd, TIOCCONS, (char *) &on) == -1) + xtermPerror("cannot open console"); +#endif +#ifdef SRIOCSREDIR + int fd = open("/dev/console", O_RDWR); + if (fd == -1 || ioctl(fd, SRIOCSREDIR, ttyfd) == -1) + xtermPerror("cannot open console"); + IGNORE_RC(close(fd)); +#endif + } +#endif /* TIOCCONS */ + } + + signal(SIGCHLD, SIG_DFL); +#ifdef USE_SYSV_SIGHUP + /* watch out for extra shells (I don't understand either) */ + signal(SIGHUP, SIG_DFL); +#else + signal(SIGHUP, SIG_IGN); +#endif + /* restore various signals to their defaults */ + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + + /* + * If we're not asked to let the parent process set the terminal's + * erase mode, or if we had the ttyModes erase resource, then set + * the terminal's erase mode from our best guess. + */ +#if OPT_INITIAL_ERASE + TRACE(("check if we should set erase to %d:%s\n\tptyInitialErase:%d,\n\toveride_tty_modes:%d,\n\tXTTYMODE_erase:%d\n", + initial_erase, + setInitialErase ? "YES" : "NO", + resource.ptyInitialErase, + override_tty_modes, + ttyModes[XTTYMODE_erase].set)); + if (setInitialErase) { +#if OPT_TRACE + int old_erase; +#endif +#ifdef TERMIO_STRUCT + if (ttyGetAttr(ttyfd, &tio) == -1) + tio = d_tio; +#if OPT_TRACE + old_erase = tio.c_cc[VERASE]; +#endif + tio.c_cc[VERASE] = (cc_t) initial_erase; + TRACE_RC(rc, ttySetAttr(ttyfd, &tio)); +#else /* !TERMIO_STRUCT */ + if (ioctl(ttyfd, TIOCGETP, (char *) &sg) == -1) + sg = d_sg; +#if OPT_TRACE + old_erase = sg.sg_erase; +#endif + sg.sg_erase = initial_erase; + rc = ioctl(ttyfd, TIOCSETP, (char *) &sg); +#endif /* TERMIO_STRUCT */ + TRACE(("%s setting erase to %d (was %d)\n", + rc ? "FAIL" : "OK", initial_erase, old_erase)); + } +#endif + + xtermCopyEnv(environ); + + /* + * standards.freedesktop.org/startup-notification-spec/ + * notes that this variable is used when a "reliable" mechanism is + * not available; in practice it must be unset to avoid confusing + * GTK applications. + */ + xtermUnsetenv("DESKTOP_STARTUP_ID"); + /* + * We set this temporarily to work around poor design of Xcursor. + * Unset it here to avoid confusion. + */ + xtermUnsetenv("XCURSOR_PATH"); + + xtermSetenv("TERM", resource.term_name); + if (!resource.term_name) + *get_tcap_buffer(xw) = 0; + + sprintf(buf, "%lu", + ((unsigned long) XtWindow(SHELL_OF(CURRENT_EMU())))); + xtermSetenv("WINDOWID", buf); + + /* put the display into the environment of the shell */ + xtermSetenv("DISPLAY", XDisplayString(screen->display)); + + xtermSetenv("XTERM_VERSION", xtermVersion()); + xtermSetenv("XTERM_LOCALE", xtermEnvLocale()); + + /* + * For debugging only, add environment variables that can be used + * in scripts to selectively kill xterm's parent or child + * processes. + */ +#if OPT_TRACE + sprintf(buf, "%lu", (unsigned long) xterm_parent); + xtermSetenv("XTERM_PARENT", buf); + sprintf(buf, "%lu", (unsigned long) getpid()); + xtermSetenv("XTERM_CHILD", buf); +#endif + + signal(SIGTERM, SIG_DFL); + + /* this is the time to go and set up stdin, out, and err + */ + { +#if defined(CRAY) && (OSMAJORVERSION >= 6) + close_fd(ttyfd); + + IGNORE_RC(close(0)); + + if (open("/dev/tty", O_RDWR)) { + SysError(ERROR_OPDEVTTY); + } + IGNORE_RC(close(1)); + IGNORE_RC(close(2)); + dup(0); + dup(0); +#else + /* dup the tty */ + for (i = 0; i <= 2; i++) + if (i != ttyfd) { + IGNORE_RC(close(i)); + IGNORE_RC(dup(ttyfd)); + } +#ifndef ATT + /* and close the tty */ + if (ttyfd > 2) + close_fd(ttyfd); +#endif +#endif /* CRAY */ + } + +#if !defined(USE_SYSV_PGRP) +#ifdef TIOCSCTTY + setsid(); + ioctl(0, TIOCSCTTY, 0); +#endif + ioctl(0, TIOCSPGRP, (char *) &pgrp); + setpgrp(0, 0); + close(open(ttydev, O_WRONLY)); + setpgrp(0, pgrp); +#if defined(__QNX__) + tcsetpgrp(0, pgrp /*setsid() */ ); +#endif +#endif /* !USE_SYSV_PGRP */ + +#ifdef Lynx + { + TERMIO_STRUCT t; + if (ttyGetAttr(0, &t) >= 0) { + /* this gets lost somewhere on our way... */ + t.c_oflag |= OPOST; + ttySetAttr(0, &t); + } + } +#endif + +#ifdef HAVE_UTMP + login_name = NULL; + if (x_getpwuid(screen->uid, &pw)) { + login_name = x_getlogin(screen->uid, &pw); + } + if (login_name != NULL) { + xtermSetenv("LOGNAME", login_name); /* for POSIX */ + } +#ifndef USE_UTEMPTER +#ifdef USE_UTMP_SETGID + setEffectiveGroup(save_egid); + TRACE_IDS; +#endif +#ifdef USE_SYSV_UTMP + /* Set up our utmp entry now. We need to do it here + * for the following reasons: + * - It needs to have our correct process id (for + * login). + * - If our parent was to set it after the fork(), + * it might make it out before we need it. + * - We need to do it before we go and change our + * user and group id's. + */ + (void) call_setutent(); + init_utmp(DEAD_PROCESS, &utmp); + + /* position to entry in utmp file */ + /* Test return value: beware of entries left behind: PSz 9 Mar 00 */ + utret = find_utmp(&utmp); + if (utret == 0) { + (void) call_setutent(); + init_utmp(USER_PROCESS, &utmp); + utret = find_utmp(&utmp); + if (utret == 0) { + (void) call_setutent(); + } + } +#if OPT_TRACE + if (!utret) + TRACE(("getutid: NULL\n")); + else + TRACE(("getutid: pid=%d type=%d user=%s line=%.*s id=%.*s\n", + (int) utret->ut_pid, utret->ut_type, utret->ut_user, + (int) sizeof(utret->ut_line), utret->ut_line, + (int) sizeof(utret->ut_id), utret->ut_id)); +#endif + + /* set up the new entry */ + utmp.ut_type = USER_PROCESS; +#ifdef HAVE_UTMP_UT_XSTATUS + utmp.ut_xstatus = 2; +#endif + copy_filled(utmp.ut_user, + (login_name != NULL) ? login_name : "????", + sizeof(utmp.ut_user)); + /* why are we copying this string again? (see above) */ + copy_filled(utmp.ut_id, my_utmp_id(ttydev), sizeof(utmp.ut_id)); + copy_filled(utmp.ut_line, + my_pty_name(ttydev), sizeof(utmp.ut_line)); + +#ifdef HAVE_UTMP_UT_HOST + SetUtmpHost(utmp.ut_host, screen); +#endif +#ifdef HAVE_UTMP_UT_SYSLEN + SetUtmpSysLen(utmp); +#endif + + copy_filled(utmp.ut_name, + (login_name) ? login_name : "????", + sizeof(utmp.ut_name)); + + utmp.ut_pid = getpid(); +#if defined(HAVE_UTMP_UT_XTIME) +#if defined(HAVE_UTMP_UT_SESSION) + utmp.ut_session = getsid(0); +#endif + utmp.ut_xtime = time((time_t *) 0); + utmp.ut_tv.tv_usec = 0; +#else + utmp.ut_time = time((time_t *) 0); +#endif + + /* write out the entry */ + if (!resource.utmpInhibit) { + errno = 0; + call_pututline(&utmp); + TRACE(("pututline: id %.*s, line %.*s, pid %ld, errno %d %s\n", + (int) sizeof(utmp.ut_id), utmp.ut_id, + (int) sizeof(utmp.ut_line), utmp.ut_line, + (long) utmp.ut_pid, + errno, (errno != 0) ? strerror(errno) : "")); + } +#ifdef WTMP +#if defined(WTMPX_FILE) && (defined(SVR4) || defined(__SCO__)) + if (xw->misc.login_shell) + updwtmpx(WTMPX_FILE, &utmp); +#elif defined(linux) && defined(__GLIBC__) && (__GLIBC__ >= 2) && !(defined(__powerpc__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0)) + if (xw->misc.login_shell) + call_updwtmp(etc_wtmp, &utmp); +#else + if (xw->misc.login_shell && + (i = open(etc_wtmp, O_WRONLY | O_APPEND)) >= 0) { + IGNORE_RC(write(i, (char *) &utmp, sizeof(utmp))); + close(i); + } +#endif +#endif + /* close the file */ + (void) call_endutent(); + +#else /* USE_SYSV_UTMP */ + /* We can now get our ttyslot! We can also set the initial + * utmp entry. + */ + tslot = ttyslot(); + added_utmp_entry = False; + { + if (tslot > 0 && OkPasswd(&pw) && !resource.utmpInhibit && + (i = open(etc_utmp, O_WRONLY)) >= 0) { + memset(&utmp, 0, sizeof(utmp)); + copy_filled(utmp.ut_line, + my_pty_name(ttydev), + sizeof(utmp.ut_line)); + copy_filled(utmp.ut_name, login_name, + sizeof(utmp.ut_name)); +#ifdef HAVE_UTMP_UT_HOST + SetUtmpHost(utmp.ut_host, screen); +#endif +#ifdef HAVE_UTMP_UT_SYSLEN + SetUtmpSysLen(utmp); +#endif + + utmp.ut_time = time((time_t *) 0); + lseek(i, (long) (tslot * sizeof(utmp)), 0); + IGNORE_RC(write(i, (char *) &utmp, sizeof(utmp))); + close(i); + added_utmp_entry = True; +#if defined(WTMP) + if (xw->misc.login_shell && + (i = open(etc_wtmp, O_WRONLY | O_APPEND)) >= 0) { + int status; + status = write(i, (char *) &utmp, sizeof(utmp)); + status = close(i); + } +#elif defined(MNX_LASTLOG) + if (xw->misc.login_shell && + (i = open(_U_LASTLOG, O_WRONLY)) >= 0) { + lseek(i, (long) (screen->uid * + sizeof(utmp)), 0); + IGNORE_RC(write(i, (char *) &utmp, sizeof(utmp))); + close(i); + } +#endif /* WTMP or MNX_LASTLOG */ + } else + tslot = -tslot; + } + + /* Let's pass our ttyslot to our parent so that it can + * clean up after us. + */ +#if OPT_PTY_HANDSHAKE + if (resource.ptyHandshake) { + handshake.tty_slot = tslot; + } +#endif /* OPT_PTY_HANDSHAKE */ +#endif /* USE_SYSV_UTMP */ + +#ifdef USE_LASTLOGX + if (xw->misc.login_shell) { + memset(&lastlogx, 0, sizeof(lastlogx)); + copy_filled(lastlogx.ll_line, + my_pty_name(ttydev), + sizeof(lastlogx.ll_line)); + X_GETTIMEOFDAY(&lastlogx.ll_tv); + SetUtmpHost(lastlogx.ll_host, screen); + updlastlogx(_PATH_LASTLOGX, screen->uid, &lastlogx); + } +#endif + +#ifdef USE_LASTLOG + if (xw->misc.login_shell && + (i = open(etc_lastlog, O_WRONLY)) >= 0) { + size_t size = sizeof(struct lastlog); + off_t offset = (off_t) ((size_t) screen->uid * size); + + memset(&lastlog, 0, size); + copy_filled(lastlog.ll_line, + my_pty_name(ttydev), + sizeof(lastlog.ll_line)); + SetUtmpHost(lastlog.ll_host, screen); + lastlog.ll_time = time((time_t *) 0); + if (lseek(i, offset, 0) != (off_t) (-1)) { + IGNORE_RC(write(i, (char *) &lastlog, size)); + } + close(i); + } +#endif /* USE_LASTLOG */ + +#if defined(USE_UTMP_SETGID) + disableSetGid(); + TRACE_IDS; +#endif + +#if OPT_PTY_HANDSHAKE + /* Let our parent know that we set up our utmp entry + * so that it can clean up after us. + */ + if (resource.ptyHandshake) { + handshake.status = UTMP_ADDED; + handshake.error = 0; + copy_handshake(handshake, ttydev); + TRACE_HANDSHAKE("writing", &handshake); + IGNORE_RC(write(cp_pipe[1], (char *) &handshake, sizeof(handshake))); + } +#endif /* OPT_PTY_HANDSHAKE */ +#endif /* USE_UTEMPTER */ +#endif /* HAVE_UTMP */ + + IGNORE_RC(setgid(screen->gid)); + TRACE_IDS; +#ifdef HAVE_INITGROUPS + if (geteuid() == 0 && OkPasswd(&pw)) { + if (initgroups(login_name, pw.pw_gid)) { + perror("initgroups failed"); + SysError(ERROR_INIGROUPS); + } + } +#endif + if (setuid(screen->uid)) { + SysError(ERROR_SETUID); + } + TRACE_IDS; +#if OPT_PTY_HANDSHAKE + if (resource.ptyHandshake) { + /* mark the pipes as close on exec */ + (void) fcntl(cp_pipe[1], F_SETFD, 1); + (void) fcntl(pc_pipe[0], F_SETFD, 1); + + /* We are at the point where we are going to + * exec our shell (or whatever). Let our parent + * know we arrived safely. + */ + handshake.status = PTY_GOOD; + handshake.error = 0; + copy_handshake(handshake, ttydev); + TRACE_HANDSHAKE("writing", &handshake); + IGNORE_RC(write(cp_pipe[1], + (const char *) &handshake, + sizeof(handshake))); + + if (resource.wait_for_map) { + i = (int) read(pc_pipe[0], (char *) &handshake, + sizeof(handshake)); + if (i != sizeof(handshake) || + handshake.status != PTY_EXEC) { + /* some very bad problem occurred */ + exit(ERROR_PTY_EXEC); + } + if (handshake.rows > 0 && handshake.cols > 0) { + TRACE(("handshake read ttysize: %dx%d\n", + handshake.rows, handshake.cols)); + set_max_row(screen, handshake.rows); + set_max_col(screen, handshake.cols); +#ifdef TTYSIZE_STRUCT + got_handshake_size = True; + setup_winsize(ts, MaxRows(screen), MaxCols(screen), + FullHeight(screen), FullWidth(screen)); + trace_winsize(ts, "got handshake"); +#endif /* TTYSIZE_STRUCT */ + } + } + } +#endif /* OPT_PTY_HANDSHAKE */ + +#ifdef USE_SYSV_ENVVARS + { + char numbuf[12]; + sprintf(numbuf, "%d", MaxCols(screen)); + xtermSetenv("COLUMNS", numbuf); + sprintf(numbuf, "%d", MaxRows(screen)); + xtermSetenv("LINES", numbuf); + } +#ifdef HAVE_UTMP + if (OkPasswd(&pw)) { /* SVR4 doesn't provide these */ + if (!x_getenv("HOME")) + xtermSetenv("HOME", pw.pw_dir); + if (!x_getenv("SHELL")) + xtermSetenv("SHELL", pw.pw_shell); + } +#endif /* HAVE_UTMP */ +#else /* USE_SYSV_ENVVARS */ + if (*(newtc = get_tcap_buffer(xw)) != '\0') { + resize_termcap(xw); + if (xw->misc.titeInhibit && !xw->misc.tiXtraScroll) { + remove_termcap_entry(newtc, "ti="); + remove_termcap_entry(newtc, "te="); + } + /* + * work around broken termcap entries */ + if (resource.useInsertMode) { + remove_termcap_entry(newtc, "ic="); + /* don't get duplicates */ + remove_termcap_entry(newtc, "im="); + remove_termcap_entry(newtc, "ei="); + remove_termcap_entry(newtc, "mi"); + if (*newtc) + strcat(newtc, ":im=\\E[4h:ei=\\E[4l:mi:"); + } + if (*newtc) { +#if OPT_INITIAL_ERASE + unsigned len; + remove_termcap_entry(newtc, TERMCAP_ERASE "="); + len = (unsigned) strlen(newtc); + if (len != 0 && newtc[len - 1] == ':') + len--; + sprintf(newtc + len, ":%s=\\%03o:", + TERMCAP_ERASE, + CharOf(initial_erase)); +#endif + xtermSetenv("TERMCAP", newtc); + } + } +#endif /* USE_SYSV_ENVVARS */ +#ifdef OWN_TERMINFO_ENV + xtermSetenv("TERMINFO", OWN_TERMINFO_DIR); +#endif + +#if OPT_PTY_HANDSHAKE + /* + * Need to reset after all the ioctl bashing we did above. + * + * If we expect the waitForMap logic to set the handshake-size, + * use that to prevent races. + */ + TRACE(("should we reset screensize after pty-handshake?\n")); + TRACE(("... ptyHandshake :%d\n", resource.ptyHandshake)); + TRACE(("... ptySttySize :%d\n", resource.ptySttySize)); + TRACE(("... got_handshake_size:%d\n", got_handshake_size)); + TRACE(("... wait_for_map0 :%d\n", resource.wait_for_map0)); + if (resource.ptyHandshake + && resource.ptySttySize + && (got_handshake_size || !resource.wait_for_map0)) { +#ifdef TTYSIZE_STRUCT + TRACE_RC(i, SET_TTYSIZE(0, ts)); + trace_winsize(ts, "ptyHandshake SET_TTYSIZE"); +#endif /* TTYSIZE_STRUCT */ + } +#endif /* OPT_PTY_HANDSHAKE */ + signal(SIGHUP, SIG_DFL); + + /* + * If we have an explicit shell to run, make that set $SHELL. + * Next, allow an existing setting of $SHELL, for absolute paths. + * Otherwise, if $SHELL is not set, determine it from the user's + * password information, if possible. + * + * Incidentally, our setting of $SHELL tells luit to use that + * program rather than choosing between $SHELL and "/bin/sh". + */ + if (validShell(explicit_shname)) { + xtermSetenv("SHELL", explicit_shname); + } else if (validProgram(shell_path = x_getenv("SHELL"))) { + if (!validShell(shell_path)) { + xtermUnsetenv("SHELL"); + } + } else if ((!OkPasswd(&pw) && !x_getpwuid(screen->uid, &pw)) + || *(shell_path = x_strdup(pw.pw_shell)) == 0) { + shell_path = resetShell(shell_path); + } else if (validShell(shell_path)) { + xtermSetenv("SHELL", shell_path); + } else { + shell_path = resetShell(shell_path); + } + + /* + * Set $XTERM_SHELL, which is not necessarily a valid shell, but + * is executable. + */ + if (validProgram(explicit_shname)) { + shell_path = explicit_shname; + } else if (shell_path == 0) { + /* this could happen if the explicit shname lost a race */ + shell_path = resetShell(shell_path); + } + xtermSetenv("XTERM_SHELL", shell_path); + + shname = x_basename(shell_path); + TRACE(("shell path '%s' leaf '%s'\n", shell_path, shname)); + +#if OPT_LUIT_PROG + /* + * Use two copies of command_to_exec, in case luit is not actually + * there, or refuses to run. In that case we will fall-through to + * to command that the user gave anyway. + */ + if (command_to_exec_with_luit && command_to_exec) { + char *myShell = xtermFindShell(*command_to_exec_with_luit, False); + xtermSetenv("XTERM_SHELL", myShell); + free(myShell); + TRACE_ARGV("spawning luit command", command_to_exec_with_luit); + execvp(*command_to_exec_with_luit, command_to_exec_with_luit); + xtermPerror("Can't execvp %s", *command_to_exec_with_luit); + xtermWarning("cannot support your locale.\n"); + } +#endif + if (command_to_exec) { + char *myShell = xtermFindShell(*command_to_exec, False); + xtermSetenv("XTERM_SHELL", myShell); + free(myShell); + TRACE_ARGV("spawning command", command_to_exec); + execvp(*command_to_exec, command_to_exec); + if (command_to_exec[1] == 0) + execlp(shell_path, shname, "-c", command_to_exec[0], + (void *) 0); + xtermPerror("Can't execvp %s", *command_to_exec); + } +#ifdef USE_SYSV_SIGHUP + /* fix pts sh hanging around */ + signal(SIGHUP, SIG_DFL); +#endif + + if ((shname_minus = malloc(strlen(shname) + 2)) != 0) { + (void) strcpy(shname_minus, "-"); + (void) strcat(shname_minus, shname); + } else { + static char default_minus[] = "-sh"; + shname_minus = default_minus; + } +#ifndef TERMIO_STRUCT + ldisc = (!XStrCmp("csh", shname + strlen(shname) - 3) + ? NTTYDISC + : 0); + ioctl(0, TIOCSETD, (char *) &ldisc); +#endif /* !TERMIO_STRUCT */ + +#ifdef USE_LOGIN_DASH_P + if (xw->misc.login_shell && OkPasswd(&pw) && added_utmp_entry) + execl(bin_login, "login", "-p", "-f", login_name, (void *) 0); +#endif + +#if OPT_LUIT_PROG + if (command_to_exec_with_luit) { + if (xw->misc.login_shell) { + char *params[4]; + params[0] = x_strdup("-argv0"); + params[1] = shname_minus; + params[2] = NULL; + x_appendargv(command_to_exec_with_luit + + command_length_with_luit, + params); + } + TRACE_ARGV("final luit command", command_to_exec_with_luit); + execvp(*command_to_exec_with_luit, command_to_exec_with_luit); + /* Exec failed. */ + xtermPerror("Can't execvp %s", *command_to_exec_with_luit); + } +#endif + execlp(shell_path, + (xw->misc.login_shell ? shname_minus : shname), + (void *) 0); + + /* Exec failed. */ + xtermPerror("Could not exec %s", shell_path); + IGNORE_RC(sleep(5)); + free(shell_path); + exit(ERROR_EXEC); + } + /* end if in child after fork */ +#if OPT_PTY_HANDSHAKE + if (resource.ptyHandshake) { + /* Parent process. Let's handle handshaked requests to our + * child process. + */ + + /* close childs's sides of the pipes */ + close(cp_pipe[1]); + close(pc_pipe[0]); + + for (done = 0; !done;) { + if (read(cp_pipe[0], + (char *) &handshake, + sizeof(handshake)) <= 0) { + /* Our child is done talking to us. If it terminated + * due to an error, we will catch the death of child + * and clean up. + */ + break; + } + + TRACE_HANDSHAKE("read", &handshake); + switch (handshake.status) { + case PTY_GOOD: + /* Success! Let's free up resources and + * continue. + */ + done = 1; + break; + + case PTY_BAD: + /* The open of the pty failed! Let's get + * another one. + */ + IGNORE_RC(close(screen->respond)); + if (get_pty(&screen->respond, XDisplayString(screen->display))) { + /* no more ptys! */ + xtermPerror("child process can find no available ptys"); + handshake.status = PTY_NOMORE; + TRACE_HANDSHAKE("writing", &handshake); + IGNORE_RC(write(pc_pipe[1], + (const char *) &handshake, + sizeof(handshake))); + exit(ERROR_PTYS); + } + handshake.status = PTY_NEW; + copy_handshake(handshake, ttydev); + TRACE_HANDSHAKE("writing", &handshake); + IGNORE_RC(write(pc_pipe[1], + (const char *) &handshake, + sizeof(handshake))); + break; + + case PTY_FATALERROR: + errno = handshake.error; + close(cp_pipe[0]); + close(pc_pipe[1]); + SysError(handshake.fatal_error); + /*NOTREACHED */ + + case UTMP_ADDED: + /* The utmp entry was set by our slave. Remember + * this so that we can reset it later. + */ + added_utmp_entry = True; +#ifndef USE_SYSV_UTMP + tslot = handshake.tty_slot; +#endif /* USE_SYSV_UTMP */ + free(ttydev); + handshake.buffer[HANDSHAKE_LEN - 1] = '\0'; + ttydev = x_strdup(handshake.buffer); + break; + case PTY_NEW: + case PTY_NOMORE: + case UTMP_TTYSLOT: + case PTY_EXEC: + default: + xtermWarning("unexpected handshake status %d\n", + (int) handshake.status); + } + } + /* close our sides of the pipes */ + if (!resource.wait_for_map) { + close(cp_pipe[0]); + close(pc_pipe[1]); + } + } +#endif /* OPT_PTY_HANDSHAKE */ + } + + /* end if no slave */ + /* + * still in parent (xterm process) + */ +#ifdef USE_SYSV_SIGHUP + /* hung sh problem? */ + signal(SIGHUP, SIG_DFL); +#else + signal(SIGHUP, SIG_IGN); +#endif + +/* + * Unfortunately, System V seems to have trouble divorcing the child process + * from the process group of xterm. This is a problem because hitting the + * INTR or QUIT characters on the keyboard will cause xterm to go away if we + * don't ignore the signals. This is annoying. + */ + +#if defined(USE_SYSV_SIGNALS) && !defined(SIGTSTP) + signal(SIGINT, SIG_IGN); + +#ifndef SYSV + /* hung shell problem */ + signal(SIGQUIT, SIG_IGN); +#endif + signal(SIGTERM, SIG_IGN); +#elif defined(SYSV) || defined(__osf__) + /* if we were spawned by a jobcontrol smart shell (like ksh or csh), + * then our pgrp and pid will be the same. If we were spawned by + * a jobcontrol dumb shell (like /bin/sh), then we will be in our + * parent's pgrp, and we must ignore keyboard signals, or we will + * tank on everything. + */ + if (getpid() == getpgrp()) { + (void) signal(SIGINT, Exit); + (void) signal(SIGQUIT, Exit); + (void) signal(SIGTERM, Exit); + } else { + (void) signal(SIGINT, SIG_IGN); + (void) signal(SIGQUIT, SIG_IGN); + (void) signal(SIGTERM, SIG_IGN); + } + (void) signal(SIGPIPE, Exit); +#else /* SYSV */ + signal(SIGINT, Exit); + signal(SIGQUIT, Exit); + signal(SIGTERM, Exit); + signal(SIGPIPE, Exit); +#endif /* USE_SYSV_SIGNALS and not SIGTSTP */ +#ifdef NO_LEAKS + if (ok_termcap != True) + free(TermName); +#endif + + return 0; +} /* end spawnXTerm */ + +void +Exit(int n) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + +#ifdef USE_UTEMPTER + DEBUG_MSG("handle:Exit USE_UTEMPTER\n"); + if (!resource.utmpInhibit && added_utmp_entry) { + TRACE(("...calling removeFromUtmp\n")); + UTEMPTER_DEL(); + } +#elif defined(HAVE_UTMP) +#ifdef USE_SYSV_UTMP + struct UTMP_STR utmp; + struct UTMP_STR *utptr; + + DEBUG_MSG("handle:Exit USE_SYSV_UTMP\n"); + /* don't do this more than once */ + if (xterm_exiting) { + exit(n); + } + xterm_exiting = True; + +#ifdef PUCC_PTYD + closepty(ttydev, ptydev, (resource.utmpInhibit ? OPTY_NOP : OPTY_LOGIN), screen->respond); +#endif /* PUCC_PTYD */ + + /* cleanup the utmp entry we forged earlier */ + if (!resource.utmpInhibit +#if OPT_PTY_HANDSHAKE /* without handshake, no way to know */ + && (resource.ptyHandshake && added_utmp_entry) +#endif /* OPT_PTY_HANDSHAKE */ + ) { +#if defined(USE_UTMP_SETGID) + setEffectiveGroup(save_egid); + TRACE_IDS; +#endif + init_utmp(USER_PROCESS, &utmp); + (void) call_setutent(); + + /* + * We could use getutline() if we didn't support old systems. + */ + while ((utptr = find_utmp(&utmp)) != 0) { + if (utptr->ut_pid == screen->pid) { + utptr->ut_type = DEAD_PROCESS; +#if defined(HAVE_UTMP_UT_XTIME) +#if defined(HAVE_UTMP_UT_SESSION) + utptr->ut_session = getsid(0); +#endif + utptr->ut_xtime = time((time_t *) 0); + utptr->ut_tv.tv_usec = 0; +#else + *utptr->ut_user = 0; + utptr->ut_time = time((time_t *) 0); +#endif + (void) call_pututline(utptr); +#ifdef WTMP +#if defined(WTMPX_FILE) && (defined(SVR4) || defined(__SCO__)) + if (xw->misc.login_shell) + updwtmpx(WTMPX_FILE, utptr); +#elif defined(linux) && defined(__GLIBC__) && (__GLIBC__ >= 2) && !(defined(__powerpc__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0)) + copy_filled(utmp.ut_line, utptr->ut_line, sizeof(utmp.ut_line)); + if (xw->misc.login_shell) + call_updwtmp(etc_wtmp, utptr); +#else + /* set wtmp entry if wtmp file exists */ + if (xw->misc.login_shell) { + int fd; + if ((fd = open(etc_wtmp, O_WRONLY | O_APPEND)) >= 0) { + IGNORE_RC(write(fd, utptr, sizeof(*utptr))); + close(fd); + } + } +#endif +#endif + break; + } + memset(utptr, 0, sizeof(*utptr)); /* keep searching */ + } + (void) call_endutent(); +#ifdef USE_UTMP_SETGID + disableSetGid(); + TRACE_IDS; +#endif + } +#else /* not USE_SYSV_UTMP */ + int wfd; + struct utmp utmp; + + DEBUG_MSG("handle:Exit !USE_SYSV_UTMP\n"); + if (!resource.utmpInhibit && added_utmp_entry && + (am_slave < 0 && tslot > 0)) { +#if defined(USE_UTMP_SETGID) + setEffectiveGroup(save_egid); + TRACE_IDS; +#endif + if ((wfd = open(etc_utmp, O_WRONLY)) >= 0) { + memset(&utmp, 0, sizeof(utmp)); + lseek(wfd, (long) (tslot * sizeof(utmp)), 0); + IGNORE_RC(write(wfd, (char *) &utmp, sizeof(utmp))); + close(wfd); + } +#ifdef WTMP + if (xw->misc.login_shell && + (wfd = open(etc_wtmp, O_WRONLY | O_APPEND)) >= 0) { + copy_filled(utmp.ut_line, + my_pty_name(ttydev), + sizeof(utmp.ut_line)); + utmp.ut_time = time((time_t *) 0); + IGNORE_RC(write(wfd, (char *) &utmp, sizeof(utmp))); + close(wfd); + } +#endif /* WTMP */ +#ifdef USE_UTMP_SETGID + disableSetGid(); + TRACE_IDS; +#endif + } +#endif /* USE_SYSV_UTMP */ +#endif /* HAVE_UTMP */ + + cleanup_colored_cursor(); + + /* + * Flush pending data before releasing ownership, so nobody else can write + * in the middle of the data. + */ + ttyFlush(screen->respond); + +#ifdef USE_PTY_SEARCH + if (am_slave < 0) { + TRACE_IDS; + /* restore ownership of tty and pty */ + set_owner(ttydev, 0, 0, 0666U); +#if (defined(USE_PTY_DEVICE) && !defined(__sgi) && !defined(__hpux)) + set_owner(ptydev, 0, 0, 0666U); +#endif + } +#endif + + /* + * Close after releasing ownership to avoid race condition: other programs + * grabbing it, and *then* having us release ownership.... + */ + close(screen->respond); /* close explicitly to avoid race with slave side */ +#ifdef ALLOWLOGGING + if (screen->logging) + CloseLog(xw); +#endif + + xtermPrintOnXError(xw, n); + +#ifdef NO_LEAKS + if (n == 0) { + Display *dpy = TScreenOf(xw)->display; + + TRACE(("Freeing memory leaks\n")); + + if (toplevel) { + XtDestroyWidget(toplevel); + TRACE(("destroyed top-level widget\n")); + } + sortedOpts(0, 0, 0); + noleaks_charproc(); + noleaks_ptydata(); +#if OPT_GRAPHICS + noleaks_graphics(); +#endif +#if OPT_WIDE_CHARS + noleaks_CharacterClass(); +#endif + /* XrmSetDatabase(dpy, 0); increases leaks ;-) */ + XtCloseDisplay(dpy); + XtDestroyApplicationContext(app_con); + xtermCloseSession(); + TRACE(("closed display\n")); + + TRACE_CLOSE(); + } +#endif + + exit(n); +} + +/* ARGSUSED */ +static void +resize_termcap(XtermWidget xw) +{ + char *newtc = get_tcap_buffer(xw); + +#ifndef USE_SYSV_ENVVARS + if (!TEK4014_ACTIVE(xw) && *newtc) { + TScreen *screen = TScreenOf(xw); + char *ptr1, *ptr2; + size_t i; + int li_first = 0; + char *temp; + char oldtc[TERMCAP_SIZE]; + + strcpy(oldtc, newtc); + TRACE(("resize %s\n", oldtc)); + if ((ptr1 = x_strindex(oldtc, "co#")) == NULL) { + strcat(oldtc, "co#80:"); + ptr1 = x_strindex(oldtc, "co#"); + } + if ((ptr2 = x_strindex(oldtc, "li#")) == NULL) { + strcat(oldtc, "li#24:"); + ptr2 = x_strindex(oldtc, "li#"); + } + if (ptr1 > ptr2) { + li_first++; + temp = ptr1; + ptr1 = ptr2; + ptr2 = temp; + } + ptr1 += 3; + ptr2 += 3; + strncpy(newtc, oldtc, i = (size_t) (ptr1 - oldtc)); + temp = newtc + i; + sprintf(temp, "%d", (li_first + ? MaxRows(screen) + : MaxCols(screen))); + temp += strlen(temp); + if ((ptr1 = strchr(ptr1, ':')) != 0 && (ptr1 < ptr2)) { + strncpy(temp, ptr1, i = (size_t) (ptr2 - ptr1)); + temp += i; + sprintf(temp, "%d", (li_first + ? MaxCols(screen) + : MaxRows(screen))); + if ((ptr2 = strchr(ptr2, ':')) != 0) { + strcat(temp, ptr2); + } + } + TRACE((" ==> %s\n", newtc)); + TRACE((" new size %dx%d\n", MaxRows(screen), MaxCols(screen))); + } +#endif /* USE_SYSV_ENVVARS */ +} + +#endif /* ! VMS */ + +/* + * Does a non-blocking wait for a child process. If the system + * doesn't support non-blocking wait, do nothing. + * Returns the pid of the child, or 0 or -1 if none or error. + */ +int +nonblocking_wait(void) +{ +#ifdef USE_POSIX_WAIT + pid_t pid; + + pid = waitpid(-1, NULL, WNOHANG); +#elif defined(USE_SYSV_SIGNALS) && (defined(CRAY) || !defined(SIGTSTP)) + /* cannot do non-blocking wait */ + int pid = 0; +#else /* defined(USE_SYSV_SIGNALS) && (defined(CRAY) || !defined(SIGTSTP)) */ +#if defined(Lynx) + int status; +#else + union wait status; +#endif + int pid; + + pid = wait3(&status, WNOHANG, (struct rusage *) NULL); +#endif /* USE_POSIX_WAIT else */ + return pid; +} + +#ifndef VMS + +/* ARGSUSED */ +static void +reapchild(int n GCC_UNUSED) +{ + int olderrno = errno; + int pid; + + DEBUG_MSG("handle:reapchild\n"); + + pid = wait(NULL); + +#ifdef USE_SYSV_SIGNALS + /* cannot re-enable signal before waiting for child + * because then SVR4 loops. Sigh. HP-UX 9.01 too. + */ + (void) signal(SIGCHLD, reapchild); +#endif + + do { + if (pid == TScreenOf(term)->pid) { + DEBUG_MSG("Exiting\n"); + if (hold_screen) + caught_intr = True; + else + need_cleanup = True; + } + } while ((pid = nonblocking_wait()) > 0); + + errno = olderrno; +} +#endif /* !VMS */ + +static void +remove_termcap_entry(char *buf, const char *str) +{ + char *base = buf; + char *first = base; + int count = 0; + size_t len = strlen(str); + + TRACE(("*** remove_termcap_entry('%s', '%s')\n", str, buf)); + + while (*buf != 0) { + if (!count && !strncmp(buf, str, len)) { + while (*buf != 0) { + if (*buf == '\\') + buf++; + else if (*buf == ':') + break; + if (*buf != 0) + buf++; + } + while ((*first++ = *buf++) != 0) { + ; + } + TRACE(("...removed_termcap_entry('%s', '%s')\n", str, base)); + return; + } else if (*buf == '\\') { + buf++; + } else if (*buf == ':') { + first = buf; + count = 0; + } else if (!isspace(CharOf(*buf))) { + count++; + } + if (*buf != 0) + buf++; + } + TRACE(("...cannot remove\n")); +} + +/* + * parse_tty_modes accepts lines of the following form: + * + * [SETTING] ... + * + * where setting consists of the words in the ttyModes[] array followed by a + * character or ^char. + */ +static int +parse_tty_modes(char *s) +{ + int c; + Cardinal j, k; + int count = 0; + Boolean found; + + TRACE(("parse_tty_modes\n")); + for (;;) { + size_t len; + + while (*s && isspace(CharOf(*s))) { + s++; + } + if (!*s) { + return count; + } + + for (len = 0; s[len] && !isspace(CharOf(s[len])); ++len) { + ; + } + found = False; + for (j = 0; j < XtNumber(ttyModes); ++j) { + if (len == ttyModes[j].len + && strncmp(s, + ttyModes[j].name, + ttyModes[j].len) == 0) { + found = True; + break; + } + } + if (!found) { + return -1; + } + + s += ttyModes[j].len; + while (*s && isspace(CharOf(*s))) { + s++; + } + + /* check if this needs a parameter */ + found = False; + for (k = 0, c = 0; k < XtNumber(ttyChars); ++k) { + if ((int) j == ttyChars[k].myMode) { + if (ttyChars[k].sysMode < 0) { + found = True; + c = ttyChars[k].myDefault; + } + break; + } + } + + if (!found) { + if (!*s + || (c = decode_keyvalue(&s, False)) == -1) { + return -1; + } + } + ttyModes[j].value = c; + ttyModes[j].set = 1; + count++; + TRACE(("...parsed #%d: %s=%#x\n", count, ttyModes[j].name, c)); + } +} + +#ifndef VMS /* don't use pipes on OpenVMS */ +int +GetBytesAvailable(int fd) +{ +#if defined(FIONREAD) + int arg; + ioctl(fd, FIONREAD, (char *) &arg); + return (int) arg; +#elif defined(__CYGWIN__) + fd_set set; + struct timeval select_timeout = + {0, 0}; + + FD_ZERO(&set); + FD_SET(fd, &set); + if (Select(fd + 1, &set, NULL, NULL, &select_timeout) > 0) + return 1; + else + return 0; +#elif defined(FIORDCK) + return (ioctl(fd, FIORDCHK, NULL)); +#else /* !FIORDCK */ + struct pollfd pollfds[1]; + + pollfds[0].fd = fd; + pollfds[0].events = POLLIN; + return poll(pollfds, 1, 0); +#endif +} +#endif /* !VMS */ + +/* Utility function to try to hide system differences from + everybody who used to call killpg() */ + +int +kill_process_group(int pid, int sig) +{ + TRACE(("kill_process_group(pid=%d, sig=%d)\n", pid, sig)); +#if defined(SVR4) || defined(SYSV) || !defined(X_NOT_POSIX) + return kill(-pid, sig); +#else + return killpg(pid, sig); +#endif +} + +#if OPT_EBCDIC +int +A2E(int x) +{ + char c; + c = x; + __atoe_l(&c, 1); + return c; +} + +int +E2A(int x) +{ + char c; + c = x; + __etoa_l(&c, 1); + return c; +} +#endif + +#if defined(__QNX__) && !defined(__QNXNTO__) +#include +#include +#include +#include +#include + +struct _proc_session ps; +struct _proc_session_reply rps; + +int +qsetlogin(char *login, char *ttyname) +{ + int v = getsid(getpid()); + + memset(&ps, 0, sizeof(ps)); + memset(&rps, 0, sizeof(rps)); + + ps.type = _PROC_SESSION; + ps.subtype = _PROC_SUB_ACTION1; + ps.sid = v; + strcpy(ps.name, login); + + Send(1, &ps, &rps, sizeof(ps), sizeof(rps)); + + if (rps.status < 0) + return (rps.status); + + ps.type = _PROC_SESSION; + ps.subtype = _PROC_SUB_ACTION2; + ps.sid = v; + sprintf(ps.name, "//%d%s", getnid(), ttyname); + Send(1, &ps, &rps, sizeof(ps), sizeof(rps)); + + return (rps.status); +} +#endif + +#ifdef __minix +int +setpgrp(void) +{ + return 0; +} + +void +_longjmp(jmp_buf _env, int _val) +{ + longjmp(_env, _val); +} +#endif diff --git a/ports/xterm/xterm-359/main.h b/ports/xterm/xterm-359/main.h new file mode 100644 index 0000000..71358e1 --- /dev/null +++ b/ports/xterm/xterm-359/main.h @@ -0,0 +1,263 @@ +/* $XTermId: main.h,v 1.72 2019/07/19 00:45:03 tom Exp $ */ + +/* + * Copyright 2000-2018,2019 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ +#ifndef included_main_h +#define included_main_h + +#include + +#ifndef DEFCLASS +#define DEFCLASS "XTerm" +#endif + +#ifndef DEFFONT +#define DEFFONT "fixed" +#endif + +#ifndef DEFWIDEFONT +#define DEFWIDEFONT NULL /* grab one which is 2x as wide */ +#endif + +#ifndef DEFWIDEBOLDFONT +#define DEFWIDEBOLDFONT NULL +#endif + +#ifndef DEFXIMFONT +#define DEFXIMFONT "fixed" +#endif + +#ifndef DEFBOLDFONT +#define DEFBOLDFONT NULL /* no bold font uses overstriking */ +#endif + +#ifndef DEFBORDER +#define DEFBORDER 2 +#endif + +#ifndef DEFFACENAME +#define DEFFACENAME NULL +#endif + +#ifndef DEFFACENAME_AUTO +#define DEFFACENAME_AUTO "mono" +#endif + +#ifndef DEFFACESIZE +#define DEFFACESIZE "8.0" +#endif + +#ifndef DEF_ALLOW_COLOR +#define DEF_ALLOW_COLOR True +#endif + +#ifndef DEF_ALLOW_FONT +#define DEF_ALLOW_FONT True +#endif + +#ifndef DEF_ALLOW_MOUSE +#define DEF_ALLOW_MOUSE True +#endif + +#ifndef DEF_ALLOW_TCAP +#define DEF_ALLOW_TCAP True +#endif + +#ifndef DEF_ALLOW_TITLE +#define DEF_ALLOW_TITLE True +#endif + +#ifndef DEF_ALLOW_WINDOW +#define DEF_ALLOW_WINDOW False +#endif + +#ifndef DEF_DISALLOWED_COLOR +#define DEF_DISALLOWED_COLOR "SetColor,GetColor,GetAnsiColor" +#endif + +#ifndef DEF_DISALLOWED_FONT +#define DEF_DISALLOWED_FONT "SetFont,GetFont" +#endif + +#ifndef DEF_DISALLOWED_MOUSE +#define DEF_DISALLOWED_MOUSE "*" +#endif + +#ifndef DEF_DISALLOWED_PASTE_CONTROLS +#define DEF_DISALLOWED_PASTE_CONTROLS "BS,HT,DEL,ESC" +#endif + +#ifndef DEF_DISALLOWED_TCAP +#define DEF_DISALLOWED_TCAP "SetTcap,GetTcap" +#endif + +#ifndef DEF_DISALLOWED_WINDOW +#define DEF_DISALLOWED_WINDOW "20,21,SetXprop,SetSelection" +#endif + +#if OPT_BLINK_TEXT +#define DEFBLINKASBOLD False +#else +#define DEFBLINKASBOLD True +#endif + +#if OPT_DOUBLE_BUFFER +#define DEF_DOUBLE_BUFFER True +#else +#define DEF_DOUBLE_BUFFER False +#endif + +#ifndef DEFDELETE_DEL +#define DEFDELETE_DEL Maybe +#endif + +#ifndef DEF_BACKARO_ERASE +#define DEF_BACKARO_ERASE False +#endif + +#ifndef DEF_BACKARO_BS +#define DEF_BACKARO_BS True +#endif + +#ifndef DEF_ALT_SENDS_ESC +#define DEF_ALT_SENDS_ESC False +#endif + +#ifndef DEF_META_SENDS_ESC +#define DEF_META_SENDS_ESC False +#endif + +#ifndef DEF_8BIT_META +#define DEF_8BIT_META "true" /* eightBitMeta */ +#endif + +#ifndef DEF_COLOR4 +#define DEF_COLOR4 "blue2" /* see XTerm-col.ad */ +#endif + +#ifndef DEF_COLOR12 +#define DEF_COLOR12 "rgb:5c/5c/ff" /* see XTerm-col.ad */ +#endif + +#ifndef DEF_INITIAL_ERASE +#define DEF_INITIAL_ERASE False +#endif + +#ifndef DEF_MENU_LOCALE +#define DEF_MENU_LOCALE "C" +#endif + +#ifndef DEF_POINTER_MODE +#define DEF_POINTER_MODE pNoMouse +#endif + +#ifndef DEF_PTY_STTY_SIZE +#if defined(linux) || defined(__APPLE__) +#define DEF_PTY_STTY_SIZE False +#else +#define DEF_PTY_STTY_SIZE True +#endif +#endif + +#ifndef DEF_BUFFER_RATE +#define DEF_BUFFER_RATE 40 /* frames/second, limited to 100 */ +#endif + +#ifndef DEF_LIMIT_RESPONSE +#define DEF_LIMIT_RESPONSE 1024 +#endif + +#ifndef DEF_SAVE_LINES +#define DEF_SAVE_LINES 1024 +#endif + +#ifndef DEF_SCROLL_LINES +#define DEF_SCROLL_LINES 1 +#endif + +#ifndef DEF_TITLE_MODES +#define DEF_TITLE_MODES 0 +#endif + +#ifndef DEF_XFT_CACHE +#define DEF_XFT_CACHE 50 +#endif + +#ifndef PROJECTROOT +#define PROJECTROOT "/usr/X11R6" +#endif + +/* + * The configure script quotes PROJECTROOT's value. + * imake does not quote PROJECTROOT's value. + */ +#ifdef HAVE_CONFIG_H +#define DEFLOCALEFILTER2(x) x +#else +#define DEFLOCALEFILTER2(x) #x +#endif + +/* + * If the configure script finds luit, we have the path directly. + */ +#ifdef LUIT_PATH +#define DEFLOCALEFILTER LUIT_PATH +#else +#define DEFLOCALEFILTER1(x) DEFLOCALEFILTER2(x) +#define DEFLOCALEFILTER DEFLOCALEFILTER1(PROJECTROOT) "/bin/luit" +#endif + +/* + * See lib/Xt/Resources.c + */ +#define MAXRESOURCES 400 + +#endif /* included_main_h */ diff --git a/ports/xterm/xterm-359/main.o b/ports/xterm/xterm-359/main.o new file mode 100644 index 0000000000000000000000000000000000000000..6c73b0a2667527ffe00ade4afe0dda8deafd1c50 GIT binary patch literal 241008 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 +#include +#include +#include +#include + +#include + +#define app_con Xaw_app_con /* quiet a warning from SimpleMenu.h */ + +#if defined(HAVE_LIB_XAW) + +#include +#include +#include +#include + +#if OPT_TOOLBAR +#include +#include +#endif + +#elif defined(HAVE_LIB_XAW3D) + +#include +#include +#include +#include + +#if OPT_TOOLBAR +#include +#include +#endif + +#elif defined(HAVE_LIB_XAW3DXFT) + +#include +#include +#include +#include + +#if OPT_TOOLBAR +#include +#include +#endif + +#elif defined(HAVE_LIB_NEXTAW) + +#include +#include +#include +#include + +#if OPT_TOOLBAR +#include +#include +#endif + +#elif defined(HAVE_LIB_XAWPLUS) + +#include +#include +#include +#include + +#if OPT_TOOLBAR +#include +#include +#endif + +#endif + +#undef app_con + +#include +#include + +#if OPT_TRACE +#define UpdateCheckbox(func, mn, mi, val) UpdateMenuItem(func, mn, mi, val) +#else +#define UpdateCheckbox(func, mn, mi, val) UpdateMenuItem(mn, mi, val) +#endif + +#define ToggleFlag(flag) flag = (Boolean) !flag +/* *INDENT-OFF* */ +static void do_8bit_control PROTO_XT_CALLBACK_ARGS; +static void do_allow132 PROTO_XT_CALLBACK_ARGS; +static void do_allowBoldFonts PROTO_XT_CALLBACK_ARGS; +static void do_allowsends PROTO_XT_CALLBACK_ARGS; +static void do_altscreen PROTO_XT_CALLBACK_ARGS; +static void do_appcursor PROTO_XT_CALLBACK_ARGS; +static void do_appkeypad PROTO_XT_CALLBACK_ARGS; +static void do_autolinefeed PROTO_XT_CALLBACK_ARGS; +static void do_autowrap PROTO_XT_CALLBACK_ARGS; +static void do_backarrow PROTO_XT_CALLBACK_ARGS; +static void do_bellIsUrgent PROTO_XT_CALLBACK_ARGS; +static void do_clearsavedlines PROTO_XT_CALLBACK_ARGS GCC_NORETURN; +static void do_continue PROTO_XT_CALLBACK_ARGS; +static void do_delete_del PROTO_XT_CALLBACK_ARGS; +#if OPT_SCREEN_DUMPS +static void do_dump_html PROTO_XT_CALLBACK_ARGS; +static void do_dump_svg PROTO_XT_CALLBACK_ARGS; +#endif +static void do_hardreset PROTO_XT_CALLBACK_ARGS GCC_NORETURN; +static void do_interrupt PROTO_XT_CALLBACK_ARGS; +static void do_jumpscroll PROTO_XT_CALLBACK_ARGS; +static void do_keepClipboard PROTO_XT_CALLBACK_ARGS; +static void do_keepSelection PROTO_XT_CALLBACK_ARGS; +static void do_kill PROTO_XT_CALLBACK_ARGS; +static void do_old_fkeys PROTO_XT_CALLBACK_ARGS; +static void do_poponbell PROTO_XT_CALLBACK_ARGS; +static void do_print PROTO_XT_CALLBACK_ARGS; +static void do_print_redir PROTO_XT_CALLBACK_ARGS; +static void do_quit PROTO_XT_CALLBACK_ARGS GCC_NORETURN; +static void do_redraw PROTO_XT_CALLBACK_ARGS; +static void do_reversevideo PROTO_XT_CALLBACK_ARGS; +static void do_reversewrap PROTO_XT_CALLBACK_ARGS; +static void do_scrollbar PROTO_XT_CALLBACK_ARGS; +static void do_scrollkey PROTO_XT_CALLBACK_ARGS; +static void do_scrollttyoutput PROTO_XT_CALLBACK_ARGS; +static void do_securekbd PROTO_XT_CALLBACK_ARGS; +static void do_selectClipboard PROTO_XT_CALLBACK_ARGS; +static void do_softreset PROTO_XT_CALLBACK_ARGS GCC_NORETURN; +static void do_suspend PROTO_XT_CALLBACK_ARGS; +static void do_terminate PROTO_XT_CALLBACK_ARGS; +static void do_titeInhibit PROTO_XT_CALLBACK_ARGS; +static void do_visualbell PROTO_XT_CALLBACK_ARGS; +static void do_vtfont PROTO_XT_CALLBACK_ARGS; + +#ifdef ALLOWLOGGING +static void do_logging PROTO_XT_CALLBACK_ARGS; +#endif + +#ifndef NO_ACTIVE_ICON +static void do_activeicon PROTO_XT_CALLBACK_ARGS; +#endif /* NO_ACTIVE_ICON */ + +#if OPT_ALLOW_XXX_OPS +static void enable_allow_xxx_ops (Bool); +static void do_allowColorOps PROTO_XT_CALLBACK_ARGS; +static void do_allowFontOps PROTO_XT_CALLBACK_ARGS; +static void do_allowMouseOps PROTO_XT_CALLBACK_ARGS; +static void do_allowTcapOps PROTO_XT_CALLBACK_ARGS; +static void do_allowTitleOps PROTO_XT_CALLBACK_ARGS; +static void do_allowWindowOps PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_BLINK_CURS +static void do_cursorblink PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_BOX_CHARS +static void do_font_boxchars PROTO_XT_CALLBACK_ARGS; +static void do_font_packed PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_DEC_CHRSET +static void do_font_doublesize PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_DEC_SOFTFONT +static void do_font_loadable PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_HP_FUNC_KEYS +static void do_hp_fkeys PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_MAXIMIZE +static void do_fullscreen PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_NUM_LOCK +static void do_alt_esc PROTO_XT_CALLBACK_ARGS; +static void do_num_lock PROTO_XT_CALLBACK_ARGS; +static void do_meta_esc PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_PRINT_ON_EXIT +static void do_write_now PROTO_XT_CALLBACK_ARGS; +static void do_write_error PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_RENDERFONT +static void do_font_renderfont PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_SCO_FUNC_KEYS +static void do_sco_fkeys PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_SIXEL_GRAPHICS +static void do_sixelscrolling PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_GRAPHICS +static void do_privatecolorregisters PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_SUN_FUNC_KEYS +static void do_sun_fkeys PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_SUNPC_KBD +static void do_sun_kbd PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_TCAP_FKEYS +static void do_tcap_fkeys PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_TEK4014 +static void do_tekcopy PROTO_XT_CALLBACK_ARGS; +static void do_tekhide PROTO_XT_CALLBACK_ARGS; +static void do_tekmode PROTO_XT_CALLBACK_ARGS; +static void do_tekonoff PROTO_XT_CALLBACK_ARGS; +static void do_tekpage PROTO_XT_CALLBACK_ARGS; +static void do_tekreset PROTO_XT_CALLBACK_ARGS; +static void do_tekshow PROTO_XT_CALLBACK_ARGS; +static void do_tektext2 PROTO_XT_CALLBACK_ARGS; +static void do_tektext3 PROTO_XT_CALLBACK_ARGS; +static void do_tektextlarge PROTO_XT_CALLBACK_ARGS; +static void do_tektextsmall PROTO_XT_CALLBACK_ARGS; +static void do_vthide PROTO_XT_CALLBACK_ARGS; +static void do_vtmode PROTO_XT_CALLBACK_ARGS; +static void do_vtonoff PROTO_XT_CALLBACK_ARGS; +static void do_vtshow PROTO_XT_CALLBACK_ARGS; +static void handle_tekshow (Widget gw, Bool allowswitch); +static void handle_vtshow (Widget gw, Bool allowswitch); +#endif + +#if OPT_TOOLBAR +static void do_toolbar PROTO_XT_CALLBACK_ARGS; +#endif + +#if OPT_WIDE_CHARS +static void do_font_utf8_mode PROTO_XT_CALLBACK_ARGS; +static void do_font_utf8_fonts PROTO_XT_CALLBACK_ARGS; +static void do_font_utf8_title PROTO_XT_CALLBACK_ARGS; +#endif + +/* + * The order of entries MUST match the values given in menu.h + */ +MenuEntry mainMenuEntries[] = { +#if OPT_TOOLBAR + { "toolbar", do_toolbar, NULL }, +#endif +#if OPT_MAXIMIZE + { "fullscreen", do_fullscreen, NULL }, +#endif + { "securekbd", do_securekbd, NULL }, + { "allowsends", do_allowsends, NULL }, + { "redraw", do_redraw, NULL }, + { "line1", NULL, NULL }, +#ifdef ALLOWLOGGING + { "logging", do_logging, NULL }, +#endif +#ifdef OPT_PRINT_ON_EXIT + { "print-immediate", do_write_now, NULL }, + { "print-on-error", do_write_error, NULL }, +#endif + { "print", do_print, NULL }, + { "print-redir", do_print_redir, NULL }, +#if OPT_SCREEN_DUMPS + { "dump-html", do_dump_html, NULL }, + { "dump-svg", do_dump_svg, NULL }, +#endif + { "line2", NULL, NULL }, + { "8-bit control", do_8bit_control,NULL }, + { "backarrow key", do_backarrow, NULL }, +#if OPT_NUM_LOCK + { "num-lock", do_num_lock, NULL }, + { "alt-esc", do_alt_esc, NULL }, + { "meta-esc", do_meta_esc, NULL }, +#endif + { "delete-is-del", do_delete_del, NULL }, + { "oldFunctionKeys",do_old_fkeys, NULL }, +#if OPT_TCAP_FKEYS + { "tcapFunctionKeys",do_tcap_fkeys, NULL }, +#endif +#if OPT_HP_FUNC_KEYS + { "hpFunctionKeys", do_hp_fkeys, NULL }, +#endif +#if OPT_SCO_FUNC_KEYS + { "scoFunctionKeys",do_sco_fkeys, NULL }, +#endif +#if OPT_SUN_FUNC_KEYS + { "sunFunctionKeys",do_sun_fkeys, NULL }, +#endif +#if OPT_SUNPC_KBD + { "sunKeyboard", do_sun_kbd, NULL }, +#endif + { "line3", NULL, NULL }, + { "suspend", do_suspend, NULL }, + { "continue", do_continue, NULL }, + { "interrupt", do_interrupt, NULL }, + { "hangup", do_hangup, NULL }, + { "terminate", do_terminate, NULL }, + { "kill", do_kill, NULL }, + { "line4", NULL, NULL }, + { "quit", do_quit, NULL }}; + +MenuEntry vtMenuEntries[] = { + { "scrollbar", do_scrollbar, NULL }, + { "jumpscroll", do_jumpscroll, NULL }, + { "reversevideo", do_reversevideo, NULL }, + { "autowrap", do_autowrap, NULL }, + { "reversewrap", do_reversewrap, NULL }, + { "autolinefeed", do_autolinefeed, NULL }, + { "appcursor", do_appcursor, NULL }, + { "appkeypad", do_appkeypad, NULL }, + { "scrollkey", do_scrollkey, NULL }, + { "scrollttyoutput",do_scrollttyoutput, NULL }, + { "allow132", do_allow132, NULL }, + { "keepSelection", do_keepSelection, NULL }, +#if OPT_MENU_KEEPCLIPBOARD + { "keepClipboard", do_keepClipboard, NULL }, +#endif + { "selectToClipboard",do_selectClipboard, NULL }, + { "visualbell", do_visualbell, NULL }, + { "bellIsUrgent", do_bellIsUrgent, NULL }, + { "poponbell", do_poponbell, NULL }, +#if OPT_BLINK_CURS + { "cursorblink", do_cursorblink, NULL }, +#endif + { "titeInhibit", do_titeInhibit, NULL }, +#ifndef NO_ACTIVE_ICON + { "activeicon", do_activeicon, NULL }, +#endif /* NO_ACTIVE_ICON */ + { "line1", NULL, NULL }, + { "softreset", do_softreset, NULL }, + { "hardreset", do_hardreset, NULL }, + { "clearsavedlines",do_clearsavedlines, NULL }, + { "line2", NULL, NULL }, +#if OPT_TEK4014 + { "tekshow", do_tekshow, NULL }, + { "tekmode", do_tekmode, NULL }, + { "vthide", do_vthide, NULL }, +#endif + { "altscreen", do_altscreen, NULL }, +#if OPT_SIXEL_GRAPHICS + { "sixelScrolling", do_sixelscrolling, NULL }, +#endif +#if OPT_GRAPHICS + { "privateColorRegisters", do_privatecolorregisters, NULL }, +#endif + }; + +MenuEntry fontMenuEntries[] = { + { "fontdefault", do_vtfont, NULL }, + { "font1", do_vtfont, NULL }, + { "font2", do_vtfont, NULL }, + { "font3", do_vtfont, NULL }, + { "font4", do_vtfont, NULL }, + { "font5", do_vtfont, NULL }, + { "font6", do_vtfont, NULL }, + /* this is after the last builtin font; the other entries are special */ + { "fontescape", do_vtfont, NULL }, + { "fontsel", do_vtfont, NULL }, + /* down to here should match NMENUFONTS in ptyx.h */ + +#if OPT_DEC_CHRSET || OPT_BOX_CHARS || OPT_DEC_SOFTFONT + { "line1", NULL, NULL }, + { "allow-bold-fonts", do_allowBoldFonts, NULL }, +#if OPT_BOX_CHARS + { "font-linedrawing",do_font_boxchars,NULL }, + { "font-packed", do_font_packed,NULL }, +#endif +#if OPT_DEC_CHRSET + { "font-doublesize",do_font_doublesize,NULL }, +#endif +#if OPT_DEC_SOFTFONT + { "font-loadable", do_font_loadable,NULL }, +#endif +#endif /* toggles for DEC font extensions */ + +#if OPT_RENDERFONT || OPT_WIDE_CHARS + { "line2", NULL, NULL }, +#if OPT_RENDERFONT + { "render-font", do_font_renderfont,NULL }, +#endif +#if OPT_WIDE_CHARS + { "utf8-mode", do_font_utf8_mode,NULL }, + { "utf8-fonts", do_font_utf8_fonts,NULL }, + { "utf8-title", do_font_utf8_title,NULL }, +#endif +#endif /* toggles for other font extensions */ + +#if OPT_ALLOW_XXX_OPS + { "line3", NULL, NULL }, + { "allow-color-ops",do_allowColorOps,NULL }, + { "allow-font-ops", do_allowFontOps,NULL }, + { "allow-mouse-ops",do_allowMouseOps,NULL }, + { "allow-tcap-ops", do_allowTcapOps,NULL }, + { "allow-title-ops",do_allowTitleOps,NULL }, + { "allow-window-ops",do_allowWindowOps,NULL }, +#endif + + }; + +#if OPT_TEK4014 +MenuEntry tekMenuEntries[] = { + { "tektextlarge", do_tektextlarge, NULL }, + { "tektext2", do_tektext2, NULL }, + { "tektext3", do_tektext3, NULL }, + { "tektextsmall", do_tektextsmall, NULL }, + { "line1", NULL, NULL }, + { "tekpage", do_tekpage, NULL }, + { "tekreset", do_tekreset, NULL }, + { "tekcopy", do_tekcopy, NULL }, + { "line2", NULL, NULL }, + { "vtshow", do_vtshow, NULL }, + { "vtmode", do_vtmode, NULL }, + { "tekhide", do_tekhide, NULL }}; +#endif + +typedef struct { + char *internal_name; + MenuEntry *entry_list; + Cardinal entry_len; +} MenuHeader; + + /* This table is ordered to correspond with MenuIndex */ +#define DATA(name) { (char *)#name, name ## Entries, XtNumber(name ## Entries ) } +static const MenuHeader menu_names[] = { + DATA( mainMenu), + DATA( vtMenu), + DATA( fontMenu), +#if OPT_TEK4014 + DATA( tekMenu), +#endif + { NULL, 0, 0 }, +}; +#undef DATA +/* *INDENT-ON* */ + +/* + * FIXME: These are global data rather than in the xterm widget because they + * are initialized before the widget is created. + */ +typedef struct { + Widget b; /* the toolbar's buttons */ + Widget w; /* the popup shell activated by the button */ + Cardinal entries; +} MenuList; + +static MenuList vt_shell[NUM_POPUP_MENUS]; + +#if OPT_TEK4014 && OPT_TOOLBAR +static MenuList tek_shell[NUM_POPUP_MENUS]; +#endif + +/* + * Returns a pointer to the MenuList entry that matches the popup menu. + */ +static MenuList * +select_menu(Widget w, MenuIndex num) +{ +#if OPT_TEK4014 && OPT_TOOLBAR + while (w != 0) { + if (w == tekshellwidget) { + return &tek_shell[num]; + } + w = XtParent(w); + } +#else + (void) w; +#endif + return &vt_shell[num]; +} + +/* + * Returns a pointer to the given popup menu shell + */ +static Widget +obtain_menu(Widget w, MenuIndex num) +{ + return select_menu(w, num)->w; +} + +/* + * Returns the number of entries in the given popup menu shell + */ +static Cardinal +sizeof_menu(Widget w, MenuIndex num) +{ + return select_menu(w, num)->entries; +} + +/* + * Return an array of flags telling if a given menu item is never going to + * be used, so we can reduce the size of menus. + */ +static Boolean * +unusedEntries(XtermWidget xw, MenuIndex num) +{ + static Boolean result[XtNumber(mainMenuEntries) + + XtNumber(vtMenuEntries) + + XtNumber(fontMenuEntries) +#if OPT_TEK4014 + + XtNumber(tekMenuEntries) +#endif + ]; + TScreen *screen = TScreenOf(xw); + + memset(result, 0, sizeof(result)); + switch (num) { + case mainMenu: +#if OPT_MAXIMIZE + if (resource.fullscreen > 1) { + result[mainMenu_fullscreen] = True; + } +#endif +#if OPT_NUM_LOCK + if (!screen->alt_is_not_meta) { + result[mainMenu_alt_esc] = True; + } +#endif + if (!xtermHasPrinter(xw)) { + result[mainMenu_print] = True; + result[mainMenu_print_redir] = True; + } + if (screen->terminal_id < 200) { + result[mainMenu_8bit_ctrl] = True; + } +#if !defined(SIGTSTP) + result[mainMenu_suspend] = True; +#endif +#if !defined(SIGCONT) + result[mainMenu_continue] = True; +#endif +#ifdef ALLOWLOGGING + if (screen->inhibit & I_LOG) { + result[mainMenu_logging] = True; + } +#endif + if (screen->inhibit & I_SIGNAL) { + int n; + for (n = (int) mainMenu_suspend; n <= (int) mainMenu_quit; ++n) { + result[n] = True; + } + } + break; + case vtMenu: +#ifndef NO_ACTIVE_ICON + if (!getIconicFont(screen)->fs || !screen->iconVwin.window) { + result[vtMenu_activeicon] = True; + } +#endif /* NO_ACTIVE_ICON */ +#if OPT_TEK4014 + if (screen->inhibit & I_TEK) { + int n; + for (n = (int) vtMenu_tekshow; n <= (int) vtMenu_vthide; ++n) { + result[n] = True; + } + } +#endif + break; + case fontMenu: + break; +#if OPT_TEK4014 + case tekMenu: + break; +#endif + case noMenu: + break; + } + return result; +} + +/* + * When using the toolbar configuration, some systems (seen with Solaris 11) + * give a warning that (Xt) cannot find a usable font-set. This does not stop + * the toolbars from working - ignore for now. + */ +#if OPT_TOOLBAR +static void +ignoreWarning( + String p_name, + String p_type, + String p_class, + String p_default, + String *p_params, + Cardinal *p_num_params) +{ + (void) p_name; + (void) p_type; + (void) p_class; + (void) p_default; + (void) p_params; + (void) p_num_params; +} +#endif + +/* + * create_menu - create a popup shell and stuff the menu into it. + */ +static Widget +create_menu(Widget w, XtermWidget xw, MenuIndex num) +{ + static XtCallbackRec cb[2] = + { + {NULL, NULL}, + {NULL, NULL}}; + static Arg arg = + {XtNcallback, (XtArgVal) cb}; + + TScreen *screen = TScreenOf(xw); + const MenuHeader *data = &menu_names[num]; + MenuList *list = select_menu(w, num); + struct _MenuEntry *entries = data->entry_list; + Cardinal nentries = data->entry_len; +#if !OPT_TOOLBAR + char *saveLocale; +#endif + + if (screen->menu_item_bitmap == None) { + /* + * we really want to do these dynamically + */ +#define check_width 9 +#define check_height 8 + static unsigned char check_bits[] = + { + 0x00, 0x01, 0x80, 0x01, 0xc0, 0x00, 0x60, 0x00, + 0x31, 0x00, 0x1b, 0x00, 0x0e, 0x00, 0x04, 0x00 + }; + + screen->menu_item_bitmap = + XCreateBitmapFromData(XtDisplay(xw), + RootWindowOfScreen(XtScreen(xw)), + (char *) check_bits, check_width, check_height); + } +#if !OPT_TOOLBAR + saveLocale = xtermSetLocale(LC_CTYPE, resource.menuLocale); + list->w = XtCreatePopupShell(data->internal_name, + simpleMenuWidgetClass, + toplevel, + NULL, 0); +#endif + if (list->w != 0) { + Boolean *unused = unusedEntries(xw, num); + Cardinal n; +#if OPT_TOOLBAR + Boolean useLocale = !strcmp(resource.menuLocale, ""); + XtErrorMsgHandler warningHandler = 0; + if (!useLocale) + warningHandler = XtAppSetWarningMsgHandler(app_con, ignoreWarning); +#endif + + list->entries = 0; + + for (n = 0; n < nentries; ++n) { + if (!unused[n]) { + cb[0].callback = (XtCallbackProc) entries[n].function; + cb[0].closure = (XtPointer) entries[n].name; + entries[n].widget = XtCreateManagedWidget(entries[n].name, + (entries[n].function + ? smeBSBObjectClass + : smeLineObjectClass), + list->w, + &arg, (Cardinal) 1); + list->entries++; + } + } +#if OPT_TOOLBAR + if (!useLocale) + XtAppSetWarningMsgHandler(app_con, warningHandler); +#endif + } +#if !OPT_TOOLBAR + xtermResetLocale(LC_CTYPE, saveLocale); +#endif + + /* do not realize at this point */ + return list->w; +} + +static MenuIndex +indexOfMenu(String menuName) +{ + MenuIndex me; + switch (*menuName) { + case 'm': + me = mainMenu; + break; + case 'v': + me = vtMenu; + break; + case 'f': + me = fontMenu; + break; +#if OPT_TEK4014 + case 't': + me = tekMenu; + break; +#endif + default: + me = noMenu; + } + return (me); +} + +/* ARGSUSED */ +static Bool +domenu(Widget w, + XEvent *event GCC_UNUSED, + String *params, /* mainMenu, vtMenu, or tekMenu */ + Cardinal *param_count) /* 0 or 1 */ +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + MenuIndex me; + Bool created = False; + Widget mw; + + if (*param_count != 1) { + Bell(xw, XkbBI_MinorError, 0); + return False; + } + + if ((me = indexOfMenu(params[0])) == noMenu) { + Bell(xw, XkbBI_MinorError, 0); + return False; + } + + if ((mw = obtain_menu(w, me)) == 0 + || sizeof_menu(w, me) == 0) { + mw = create_menu(w, xw, me); + created = (mw != 0); + } + if (mw == 0) + return False; + + TRACE(("domenu(%s) %s\n", params[0], created ? "create" : "update")); + switch (me) { + case mainMenu: + if (created) { + update_toolbar(); + update_fullscreen(); + update_securekbd(); + update_allowsends(); + update_logging(); + update_print_redir(); + update_8bit_control(); + update_decbkm(); + update_num_lock(); + update_alt_esc(); + update_meta_esc(); + update_delete_del(); + update_keyboard_type(); +#ifdef OPT_PRINT_ON_EXIT + screen->write_error = !IsEmpty(resource.printFileOnXError); + SetItemSensitivity(mainMenuEntries[mainMenu_write_now].widget, True); + SetItemSensitivity(mainMenuEntries[mainMenu_write_error].widget, screen->write_error); +#endif + } + break; + + case vtMenu: + if (created) { + update_scrollbar(); + update_jumpscroll(); + update_reversevideo(); + update_autowrap(); + update_reversewrap(); + update_autolinefeed(); + update_appcursor(); + update_appkeypad(); + update_scrollkey(); + update_scrollttyoutput(); + update_allow132(); + update_cursesemul(); + update_keepSelection(); + update_selectToClipboard(); + update_visualbell(); + update_poponbell(); + update_bellIsUrgent(); + update_cursorblink(); + update_altscreen(); + update_decsdm(); /* Sixel Display Mode */ + update_titeInhibit(); +#ifndef NO_ACTIVE_ICON + update_activeicon(); +#endif /* NO_ACTIVE_ICON */ + update_privatecolorregisters(); + } + break; + + case fontMenu: + if (created) { + int n; + + set_menu_font(True); + for (n = fontMenu_font1; n <= fontMenu_font6; ++n) { + if (IsEmpty(screen->menu_font_names[n][fNorm])) + SetItemSensitivity(fontMenuEntries[n].widget, False); + } + update_font_escape(); + update_menu_allowBoldFonts(); +#if OPT_BOX_CHARS + update_font_boxchars(); + update_font_packed(); + SetItemSensitivity( + fontMenuEntries[fontMenu_font_packedfont].widget, + True); +#endif +#if OPT_DEC_SOFTFONT /* FIXME: not implemented */ + update_font_loadable(); + SetItemSensitivity( + fontMenuEntries[fontMenu_font_loadable].widget, + False); +#endif +#if OPT_DEC_CHRSET + update_font_doublesize(); + if (TScreenOf(xw)->cache_doublesize == 0) + SetItemSensitivity( + fontMenuEntries[fontMenu_font_doublesize].widget, + False); +#endif +#if OPT_RENDERFONT + update_font_renderfont(); +#endif +#if OPT_WIDE_CHARS + update_font_utf8_mode(); + update_font_utf8_fonts(); + update_font_utf8_title(); +#endif +#if OPT_ALLOW_XXX_OPS + update_menu_allowColorOps(); + update_menu_allowFontOps(); + update_menu_allowMouseOps(); + update_menu_allowTcapOps(); + update_menu_allowTitleOps(); + update_menu_allowWindowOps(); + enable_allow_xxx_ops(!(screen->allowSendEvents)); +#endif + } +#if OPT_TOOLBAR + /* menus for toolbar are initialized once only */ + SetItemSensitivity(fontMenuEntries[fontMenu_fontsel].widget, True); +#else + FindFontSelection(xw, NULL, True); + SetItemSensitivity(fontMenuEntries[fontMenu_fontsel].widget, + (screen->SelectFontName() + ? True + : False)); +#endif + break; + +#if OPT_TEK4014 + case tekMenu: + if (created && tekWidget) { + set_tekfont_menu_item(TekScreenOf(tekWidget)->cur.fontsize, True); + update_vtshow(); + } + break; +#endif + case noMenu: + default: + break; + } + + return True; +} + +/* + * public interfaces + */ + +void +HandleCreateMenu(Widget w, + XEvent *event, + String *params, /* mainMenu, vtMenu, or tekMenu */ + Cardinal *param_count) /* 0 or 1 */ +{ + TRACE(("HandleCreateMenu\n")); + (void) domenu(w, event, params, param_count); +} + +void +HandlePopupMenu(Widget w, + XEvent *event, + String *params, /* mainMenu, vtMenu, or tekMenu */ + Cardinal *param_count) /* 0 or 1 */ +{ + TRACE(("HandlePopupMenu\n")); + if (domenu(w, event, params, param_count)) { + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + +#if OPT_TOOLBAR + w = select_menu(w, mainMenu)->w; +#endif + /* + * The action procedure in SimpleMenu.c, PositionMenu does not expect a + * key translation event when we are popping up a menu. In particular, + * if the pointer is outside the menu, then the action procedure will + * fail in its attempt to determine the location of the pointer within + * the menu. Anticipate that by warping the pointer into the menu when + * a key event is detected. + */ + switch (event->type) { + case KeyPress: + case KeyRelease: + XWarpPointer(screen->display, None, XtWindow(w), 0, 0, 0, 0, 0, 0); + break; + default: + XtCallActionProc(w, "XawPositionSimpleMenu", event, params, 1); + break; + } + XtCallActionProc(w, "MenuPopup", event, params, 1); + } +} + +/* + * private interfaces - keep out! + */ + +/* ARGSUSED */ +static void +handle_send_signal(Widget gw GCC_UNUSED, int sig) +{ +#ifndef VMS + TScreen *screen = TScreenOf(term); + + if (hold_screen > 1) + hold_screen = 0; + if (screen->pid > 1) + kill_process_group(screen->pid, sig); +#endif +} + +#if OPT_VT52_MODE +static void +DisableIfVT52(MenuEntry * menu, int which) +{ + Widget mi = menu[which].widget; + SetItemSensitivity(mi, TScreenOf(term)->vtXX_level != 0); +} + +#else +#define DisableIfVT52(which,val) /* nothing */ +#endif + +static void +UpdateMenuItem( +#if OPT_TRACE + const char *func, +#endif + MenuEntry * menu, + int which, + Bool val) +{ + static Arg menuArgs = + {XtNleftBitmap, (XtArgVal) 0}; + Widget mi = menu[which].widget; + + if (mi) { + menuArgs.value = (XtArgVal) ((val) + ? TScreenOf(term)->menu_item_bitmap + : None); + XtSetValues(mi, &menuArgs, (Cardinal) 1); + } + TRACE(("%s(%d): %s\n", func, which, MtoS(val))); +} + +void +SetItemSensitivity(Widget mi, Bool val) +{ + static Arg menuArgs = + {XtNsensitive, (XtArgVal) 0}; + + if (mi) { + menuArgs.value = (XtArgVal) (val); + XtSetValues(mi, &menuArgs, (Cardinal) 1); + } +} + +/* + * action routines + */ + +static void +do_securekbd(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + Time now = CurrentTime; /* XXX - wrong */ + + if (screen->grabbedKbd) { + XUngrabKeyboard(screen->display, now); + ReverseVideo(xw); + screen->grabbedKbd = False; + } else { + if (XGrabKeyboard(screen->display, XtWindow(CURRENT_EMU()), + True, GrabModeAsync, GrabModeAsync, now) + != GrabSuccess) { + Bell(xw, XkbBI_MinorError, 100); + } else { + ReverseVideo(xw); + screen->grabbedKbd = True; + } + } + update_securekbd(); +} + +/* ARGSUSED */ +void +HandleSecure(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, /* unused */ + String *params GCC_UNUSED, /* [0] = volume */ + Cardinal *param_count GCC_UNUSED) /* 0 or 1 */ +{ + do_securekbd(vt_shell[mainMenu].w, (XtPointer) 0, (XtPointer) 0); +} + +static void +do_allowsends(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->allowSendEvents); + update_allowsends(); +#if OPT_ALLOW_XXX_OPS + enable_allow_xxx_ops(!(screen->allowSendEvents)); +#endif +} + +static void +do_visualbell(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->visualbell); + update_visualbell(); +} + +static void +do_bellIsUrgent(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->bellIsUrgent); + update_bellIsUrgent(); +} + +static void +do_poponbell(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->poponbell); + update_poponbell(); +} + +#ifdef ALLOWLOGGING +static void +do_logging(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + if (screen->logging) { + CloseLog(xw); + } else { + StartLog(xw); + } + /* update_logging done by CloseLog and StartLog */ +} +#endif + +#ifdef OPT_PRINT_ON_EXIT +static void +do_write_now(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = term; + + xtermPrintImmediately(xw, + (IsEmpty(resource.printFileNow) + ? (String) "XTerm" + : resource.printFileNow), + resource.printOptsNow, + resource.printModeNow); +} + +void +HandlePrintImmediate(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_write_now((Widget) 0, (XtPointer) 0, (XtPointer) 0); +} + +static void +do_write_error(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = term; + + if (IsEmpty(resource.printFileOnXError)) { + resource.printFileOnXError = "XTermError"; + } + TScreenOf(xw)->write_error = (Boolean) (!TScreenOf(xw)->write_error); + update_write_error(); +} + +void +HandlePrintOnError(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_write_error((Widget) 0, (XtPointer) 0, (XtPointer) 0); +} +#endif + +static void +do_print(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + xtermPrintScreen(term, True, getPrinterFlags(term, NULL, 0)); +} + +static void +do_print_redir(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + setPrinterControlMode(term, + (PrinterOf(TScreenOf(term)).printer_controlmode + ? 0 + : 2)); +} + +#if OPT_SCREEN_DUMPS +static void +do_dump_html(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + xtermDumpHtml(term); +} + +static void +do_dump_svg(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + xtermDumpSvg(term); +} +#endif + +static void +do_redraw(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + Redraw(); +} + +void +show_8bit_control(Bool value) +{ + if (TScreenOf(term)->control_eight_bits != value) { + TScreenOf(term)->control_eight_bits = (Boolean) value; + update_8bit_control(); + } +} + +static void +do_8bit_control(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + show_8bit_control(!TScreenOf(term)->control_eight_bits); +} + +static void +do_backarrow(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->keyboard.flags ^= MODE_DECBKM; + update_decbkm(); +} + +#if OPT_NUM_LOCK +static void +do_num_lock(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleFlag(term->misc.real_NumLock); + update_num_lock(); +} + +static void +do_alt_esc(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleFlag(TScreenOf(term)->alt_sends_esc); + update_alt_esc(); +} + +static void +do_meta_esc(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleFlag(TScreenOf(term)->meta_sends_esc); + update_meta_esc(); +} +#endif + +static void +do_delete_del(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + if (xtermDeleteIsDEL(term)) + TScreenOf(term)->delete_is_del = False; + else + TScreenOf(term)->delete_is_del = True; + update_delete_del(); +} + +static void +do_old_fkeys(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsLegacy); +} + +#if OPT_HP_FUNC_KEYS +static void +do_hp_fkeys(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsHP); +} +#endif + +#if OPT_SCO_FUNC_KEYS +static void +do_sco_fkeys(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsSCO); +} +#endif + +#if OPT_SUN_FUNC_KEYS +static void +do_sun_fkeys(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsSun); +} +#endif + +#if OPT_SUNPC_KBD +/* + * This really means "Sun/PC keyboard emulating VT220". + */ +static void +do_sun_kbd(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsVT220); +} +#endif + +#if OPT_TCAP_FKEYS +static void +do_tcap_fkeys(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + toggle_keyboard_type(term, keyboardIsTermcap); +} +#endif + +/* + * The following cases use the pid instead of the process group so that we + * don't get hosed by programs that change their process group + */ + +/* ARGSUSED */ +static void +do_suspend(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ +#if defined(SIGTSTP) + handle_send_signal(gw, SIGTSTP); +#endif +} + +/* ARGSUSED */ +static void +do_continue(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ +#if defined(SIGCONT) + handle_send_signal(gw, SIGCONT); +#endif +} + +/* ARGSUSED */ +static void +do_interrupt(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_send_signal(gw, SIGINT); +} + +/* ARGSUSED */ +void +do_hangup(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_send_signal(gw, SIGHUP); +} + +/* ARGSUSED */ +static void +do_terminate(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_send_signal(gw, SIGTERM); +} + +/* ARGSUSED */ +static void +do_kill(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_send_signal(gw, SIGKILL); +} + +static void +do_quit(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + Cleanup(SIGHUP); +} + +/* + * vt menu callbacks + */ + +static void +do_scrollbar(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleScrollBar(term); +} + +static void +do_jumpscroll(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + term->flags ^= SMOOTHSCROLL; + if (term->flags & SMOOTHSCROLL) { + screen->jumpscroll = False; + if (screen->scroll_amt) + FlushScroll(term); + } else { + screen->jumpscroll = True; + } + update_jumpscroll(); +} + +static void +do_reversevideo(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ReverseVideo(term); +} + +static void +do_autowrap(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->flags ^= WRAPAROUND; + update_autowrap(); +} + +static void +do_reversewrap(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->flags ^= REVERSEWRAP; + update_reversewrap(); +} + +static void +do_autolinefeed(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->flags ^= LINEFEED; + update_autolinefeed(); +} + +static void +do_appcursor(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->keyboard.flags ^= MODE_DECCKM; + update_appcursor(); +} + +static void +do_appkeypad(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->keyboard.flags ^= MODE_DECKPAM; + update_appkeypad(); +} + +static void +do_scrollkey(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->scrollkey); + update_scrollkey(); +} + +static void +do_scrollttyoutput(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->scrollttyoutput); + update_scrollttyoutput(); +} + +#if OPT_MENU_KEEPCLIPBOARD +void +update_keepClipboard(void) +{ + UpdateCheckbox("update_keepClipboard", + vtMenuEntries, + vtMenu_keepClipboard, + TScreenOf(term)->keepClipboard); +} +#endif + +static void +do_keepClipboard(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->keepClipboard); + update_keepClipboard(); +} + +static void +do_keepSelection(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->keepSelection); + update_keepSelection(); +} + +static void +do_selectClipboard(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->selectToClipboard); + update_selectToClipboard(); +} + +static void +do_allow132(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->c132); + update_allow132(); +} + +static void +do_cursesemul(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->curses); + update_cursesemul(); +} + +static void +do_marginbell(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + if ((ToggleFlag(screen->marginbell)) == 0) + screen->bellArmed = -1; + update_marginbell(); +} + +#if OPT_TEK4014 +static void +handle_tekshow(Widget gw GCC_UNUSED, Bool allowswitch) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + TRACE(("Show tek-window\n")); + if (!TEK4014_SHOWN(xw)) { /* not showing, turn on */ + set_tek_visibility(True); + } else if (screen->Vshow || allowswitch) { /* is showing, turn off */ + set_tek_visibility(False); + end_tek_mode(); /* WARNING: this does a longjmp */ + } else + Bell(xw, XkbBI_MinorError, 0); +} + +/* ARGSUSED */ +static void +do_tekshow(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_tekshow(gw, True); +} + +/* ARGSUSED */ +static void +do_tekonoff(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_tekshow(gw, False); +} +#endif /* OPT_TEK4014 */ + +#if OPT_BLINK_CURS +/* ARGSUSED */ +static void +do_cursorblink(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleCursorBlink(term); +} +#endif + +/* ARGSUSED */ +static void +do_altscreen(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleAlternate(term); +} + +/* ARGSUSED */ +static void +do_titeInhibit(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleFlag(term->misc.titeInhibit); + update_titeInhibit(); +} + +#ifndef NO_ACTIVE_ICON +/* ARGSUSED */ +static void +do_activeicon(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + if (screen->iconVwin.window) { + Widget shell = XtParent(term); + ToggleFlag(term->work.active_icon); + XtVaSetValues(shell, XtNiconWindow, + term->work.active_icon ? screen->iconVwin.window : None, + (XtPointer) 0); + update_activeicon(); + } +} +#endif /* NO_ACTIVE_ICON */ + +static void +do_softreset(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + VTReset(term, False, False); +} + +static void +do_hardreset(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + VTReset(term, True, False); +} + +static void +do_clearsavedlines(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + VTReset(term, True, True); +} + +#if OPT_TEK4014 +static void +do_tekmode(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + switch_modes(TEK4014_ACTIVE(term)); /* switch to tek mode */ +} + +/* ARGSUSED */ +static void +do_vthide(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + hide_vt_window(); +} +#endif /* OPT_TEK4014 */ + +/* + * vtfont menu + */ + +static void +do_vtfont(Widget gw GCC_UNUSED, + XtPointer closure, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = term; + char *entryname = (char *) closure; + int i; + + TRACE(("do_vtfont(%s)\n", entryname)); + for (i = 0; i < NMENUFONTS; i++) { + if (strcmp(entryname, fontMenuEntries[i].name) == 0) { + SetVTFont(xw, i, True, NULL); + return; + } + } + Bell(xw, XkbBI_MinorError, 0); +} + +#if OPT_DEC_CHRSET +static void +do_font_doublesize(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = term; + + if (TScreenOf(xw)->cache_doublesize != 0) + ToggleFlag(TScreenOf(xw)->font_doublesize); + update_font_doublesize(); + Redraw(); +} +#endif + +#if OPT_BOX_CHARS +static void +do_font_boxchars(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleFlag(TScreenOf(term)->force_box_chars); + update_font_boxchars(); + Redraw(); +} + +static void +do_font_packed(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleFlag(TScreenOf(term)->force_packed); + update_font_packed(); + SetVTFont(term, TScreenOf(term)->menu_font_number, True, NULL); +} +#endif + +#if OPT_DEC_SOFTFONT +static void +do_font_loadable(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + ToggleFlag(term->misc.font_loadable); + update_font_loadable(); +} +#endif + +#if OPT_RENDERFONT +static void +do_font_renderfont(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = (XtermWidget) term; + TScreen *screen = TScreenOf(xw); + int fontnum = screen->menu_font_number; + String name = TScreenOf(xw)->MenuFontName(fontnum); + + DefaultRenderFont(xw); + ToggleFlag(xw->work.render_font); + update_font_renderfont(); + xtermLoadFont(xw, xtermFontName(name), True, fontnum); + ScrnRefresh(term, 0, 0, + MaxRows(screen), + MaxCols(screen), True); +} +#endif + +#if OPT_WIDE_CHARS +static void +setup_wide_fonts(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->wide_chars) { + if (xtermLoadWideFonts(xw, True)) { + SetVTFont(xw, screen->menu_font_number, True, NULL); + } + } else { + ChangeToWide(xw); + } +} + +static void +setup_narrow_fonts(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (xtermLoadDefaultFonts(xw)) { + SetVTFont(xw, screen->menu_font_number, True, NULL); + } +} + +static void +do_font_utf8_mode(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + /* + * If xterm was started with -wc option, it might not have the wide fonts. + * If xterm was not started with -wc, it might not have wide cells. + */ + if (!screen->utf8_mode) { + setup_wide_fonts(xw); + } + switchPtyData(screen, !screen->utf8_mode); + /* + * We don't repaint the screen when switching UTF-8 on/off. When switching + * on - the Latin-1 codes should paint as-is. When switching off, that's + * hard to do properly. + */ +} + +static void +do_font_utf8_fonts(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + ToggleFlag(screen->utf8_fonts); + update_font_utf8_fonts(); + + if (screen->utf8_fonts) { + setup_wide_fonts(xw); + } else { + setup_narrow_fonts(xw); + } +} + +static void +do_font_utf8_title(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->utf8_title); + update_font_utf8_title(); +} +#endif + +/* + * tek menu + */ + +#if OPT_TEK4014 +static void +do_tektextlarge(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSetFontSize(getTekWidget(gw), True, tekMenu_tektextlarge); +} + +static void +do_tektext2(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSetFontSize(getTekWidget(gw), True, tekMenu_tektext2); +} + +static void +do_tektext3(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSetFontSize(getTekWidget(gw), True, tekMenu_tektext3); +} + +static void +do_tektextsmall(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSetFontSize(getTekWidget(gw), True, tekMenu_tektextsmall); +} + +static void +do_tekpage(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSimulatePageButton(getTekWidget(gw), False); +} + +static void +do_tekreset(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekSimulatePageButton(getTekWidget(gw), True); +} + +static void +do_tekcopy(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TekCopy(getTekWidget(gw)); +} + +static void +handle_vtshow(Widget gw GCC_UNUSED, Bool allowswitch) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + TRACE(("Show vt-window\n")); + if (!screen->Vshow) { /* not showing, turn on */ + set_vt_visibility(True); + } else if (TEK4014_SHOWN(xw) || allowswitch) { /* is showing, turn off */ + set_vt_visibility(False); + if (!TEK4014_ACTIVE(xw) && tekRefreshList) + TekRefresh(tekWidget); + end_vt_mode(); /* WARNING: this does a longjmp... */ + } else + Bell(xw, XkbBI_MinorError, 0); +} + +static void +do_vtshow(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_vtshow(gw, True); +} + +static void +do_vtonoff(Widget gw, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + handle_vtshow(gw, False); +} + +static void +do_vtmode(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + switch_modes(TEK4014_ACTIVE(term)); /* switch to vt, or from */ +} + +/* ARGSUSED */ +static void +do_tekhide(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + hide_tek_window(); +} +#endif /* OPT_TEK4014 */ + +/* + * public handler routines + */ +int +decodeToggle(XtermWidget xw, String *params, Cardinal nparams) +{ + int dir = toggleErr; + + switch (nparams) { + case 0: + dir = toggleAll; + break; + case 1: + if (XmuCompareISOLatin1(params[0], "on") == 0) + dir = toggleOn; + else if (XmuCompareISOLatin1(params[0], "off") == 0) + dir = toggleOff; + else if (XmuCompareISOLatin1(params[0], "toggle") == 0) + dir = toggleAll; + break; + } + + if (dir == toggleErr) { + Bell(xw, XkbBI_MinorError, 0); + } + + return dir; +} + +static void +handle_toggle(void (*proc) PROTO_XT_CALLBACK_ARGS, + int var, + String *params, + Cardinal nparams, + Widget w, + XtPointer closure, + XtPointer data) +{ + XtermWidget xw = term; + + switch (decodeToggle(xw, params, nparams)) { + + case toggleAll: + (*proc) (w, closure, data); + break; + + case toggleOff: + if (var) + (*proc) (w, closure, data); + else + Bell(xw, XkbBI_MinorError, 0); + break; + + case toggleOn: + if (!var) + (*proc) (w, closure, data); + else + Bell(xw, XkbBI_MinorError, 0); + break; + } + return; +} + +#define handle_vt_toggle(proc, var, params, nparams, w) \ + handle_toggle(proc, (int) (var), params, nparams, w, (XtPointer)0, (XtPointer)0) + +#define HANDLE_VT_TOGGLE(name) \ + handle_vt_toggle(do_##name, TScreenOf(term)->name, params, *param_count, w) + +#define handle_tek_toggle(proc, var, params, nparams, w) \ + handle_toggle(proc, (int) (var), params, nparams, w, (XtPointer)0, (XtPointer)0) + +void +HandleAllowSends(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_allowsends, TScreenOf(term)->allowSendEvents, + params, *param_count, w); +} + +void +HandleSetVisualBell(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(visualbell); +} + +void +HandleSetPopOnBell(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(poponbell); +} + +#ifdef ALLOWLOGGING +void +HandleLogging(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(logging); +} +#endif + +#if OPT_PRINT_ON_EXIT +void +HandleWriteNow(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_write_now(w, 0, 0); +} + +void +HandleWriteError(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(write_error); +} +#endif + +/* ARGSUSED */ +void +HandlePrintScreen(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + xtermPrintScreen(term, True, getPrinterFlags(term, params, param_count)); +} + +/* ARGSUSED */ +void +HandlePrintEverything(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + xtermPrintEverything(term, getPrinterFlags(term, params, param_count)); +} + +/* ARGSUSED */ +void +HandlePrintControlMode(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_print_redir(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleRedraw(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_redraw(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleSendSignal(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + /* *INDENT-OFF* */ + static const struct sigtab { + const char *name; + int sig; + } signals[] = { +#ifdef SIGTSTP + { "suspend", SIGTSTP }, + { "tstp", SIGTSTP }, +#endif +#ifdef SIGCONT + { "cont", SIGCONT }, +#endif + { "int", SIGINT }, + { "hup", SIGHUP }, + { "quit", SIGQUIT }, + { "alrm", SIGALRM }, + { "alarm", SIGALRM }, + { "term", SIGTERM }, + { "kill", SIGKILL }, + { NULL, 0 }, + }; + /* *INDENT-ON* */ + + if (*param_count == 1) { + const struct sigtab *st; + + for (st = signals; st->name; st++) { + if (XmuCompareISOLatin1(st->name, params[0]) == 0) { + handle_send_signal(w, st->sig); + return; + } + } + /* one could allow numeric values, but that would be a security hole */ + } + + Bell(term, XkbBI_MinorError, 0); +} + +/* ARGSUSED */ +void +HandleQuit(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_quit(w, (XtPointer) 0, (XtPointer) 0); +} + +void +Handle8BitControl(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_8bit_control, TScreenOf(term)->control_eight_bits, + params, *param_count, w); +} + +void +HandleBackarrow(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_backarrow, term->keyboard.flags & MODE_DECBKM, + params, *param_count, w); +} + +#if OPT_MAXIMIZE +#if OPT_TEK4014 +#define WhichEWMH (TEK4014_ACTIVE(xw) != 0) +#else +#define WhichEWMH 0 +#endif +static void +do_fullscreen(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = term; + + if (resource.fullscreen != esNever) + FullScreen(xw, !xw->work.ewmh[WhichEWMH].mode); +} + +/* ARGSUSED */ +void +HandleFullscreen(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + XtermWidget xw = term; + + if (resource.fullscreen != esNever) { + handle_vt_toggle(do_fullscreen, xw->work.ewmh[WhichEWMH].mode, + params, *param_count, w); + } +} + +void +update_fullscreen(void) +{ + XtermWidget xw = term; + + if (resource.fullscreen <= 1) { + UpdateCheckbox("update_fullscreen", + mainMenuEntries, + mainMenu_fullscreen, + xw->work.ewmh[WhichEWMH].mode); + } else { + SetItemSensitivity(mainMenuEntries[mainMenu_fullscreen].widget, + False); + } +} + +#endif /* OPT_MAXIMIZE */ + +#if OPT_SIXEL_GRAPHICS +static void +do_sixelscrolling(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + term->keyboard.flags ^= MODE_DECSDM; + update_decsdm(); +} + +void +update_decsdm(void) +{ + UpdateCheckbox("update_decsdm", + vtMenuEntries, + vtMenu_sixelscrolling, + (term->keyboard.flags & MODE_DECSDM) != 0); +} + +void +HandleSixelScrolling(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_sixelscrolling, term->keyboard.flags & MODE_DECSDM, + params, *param_count, w); +} +#endif + +#if OPT_GRAPHICS +static void +do_privatecolorregisters(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + ToggleFlag(screen->privatecolorregisters); + update_privatecolorregisters(); +} + +void +update_privatecolorregisters(void) +{ + UpdateCheckbox("update_privatecolorregisters", + vtMenuEntries, + vtMenu_privatecolorregisters, + TScreenOf(term)->privatecolorregisters); +} + +void +HandleSetPrivateColorRegisters(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(privatecolorregisters); +} +#endif + +#if OPT_SUN_FUNC_KEYS +void +HandleSunFunctionKeys(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_sun_fkeys, term->keyboard.type == keyboardIsSun, + params, *param_count, w); +} +#endif + +#if OPT_NUM_LOCK +void +HandleNumLock(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_num_lock, term->misc.real_NumLock, + params, *param_count, w); +} + +void +HandleAltEsc(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_alt_esc, !TScreenOf(term)->alt_sends_esc, + params, *param_count, w); +} + +void +HandleMetaEsc(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_meta_esc, TScreenOf(term)->meta_sends_esc, + params, *param_count, w); +} +#endif + +void +HandleDeleteIsDEL(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_delete_del, TScreenOf(term)->delete_is_del, + params, *param_count, w); +} + +void +HandleOldFunctionKeys(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_old_fkeys, term->keyboard.type == keyboardIsLegacy, + params, *param_count, w); +} + +#if OPT_SUNPC_KBD +void +HandleSunKeyboard(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_sun_kbd, term->keyboard.type == keyboardIsVT220, + params, *param_count, w); +} +#endif + +#if OPT_HP_FUNC_KEYS +void +HandleHpFunctionKeys(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_hp_fkeys, term->keyboard.type == keyboardIsHP, + params, *param_count, w); +} +#endif + +#if OPT_SCO_FUNC_KEYS +void +HandleScoFunctionKeys(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_sco_fkeys, term->keyboard.type == keyboardIsSCO, + params, *param_count, w); +} +#endif + +void +HandleScrollbar(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + XtermWidget xw = term; + + if (IsIcon(TScreenOf(xw))) { + Bell(xw, XkbBI_MinorError, 0); + } else { + handle_vt_toggle(do_scrollbar, TScreenOf(xw)->fullVwin.sb_info.width, + params, *param_count, w); + } +} + +void +HandleJumpscroll(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(jumpscroll); +} + +void +HandleKeepClipboard(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(keepClipboard); +} + +void +HandleKeepSelection(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(keepSelection); +} + +void +HandleSetSelect(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_selectClipboard, TScreenOf(term)->selectToClipboard, + params, *param_count, w); +} + +void +HandleReverseVideo(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_reversevideo, (term->misc.re_verse0), + params, *param_count, w); +} + +void +HandleAutoWrap(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_autowrap, (term->flags & WRAPAROUND), + params, *param_count, w); +} + +void +HandleReverseWrap(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_reversewrap, (term->flags & REVERSEWRAP), + params, *param_count, w); +} + +void +HandleAutoLineFeed(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_autolinefeed, (term->flags & LINEFEED), + params, *param_count, w); +} + +void +HandleAppCursor(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_appcursor, (term->keyboard.flags & MODE_DECCKM), + params, *param_count, w); +} + +void +HandleAppKeypad(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_appkeypad, (term->keyboard.flags & MODE_DECKPAM), + params, *param_count, w); +} + +void +HandleScrollKey(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(scrollkey); +} + +void +HandleScrollTtyOutput(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(scrollttyoutput); +} + +void +HandleAllow132(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_allow132, TScreenOf(term)->c132, + params, *param_count, w); +} + +void +HandleCursesEmul(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_cursesemul, TScreenOf(term)->curses, + params, *param_count, w); +} + +void +HandleBellIsUrgent(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(bellIsUrgent); +} + +void +HandleMarginBell(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(marginbell); +} + +#if OPT_BLINK_CURS +void +HandleCursorBlink(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_cursorblink, TScreenOf(term)->cursor_blink, + params, *param_count, w); +} +#endif + +void +HandleAltScreen(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + /* eventually want to see if sensitive or not */ + handle_vt_toggle(do_altscreen, TScreenOf(term)->whichBuf, + params, *param_count, w); +} + +void +HandleTiteInhibit(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + /* eventually want to see if sensitive or not */ + handle_vt_toggle(do_titeInhibit, !(term->misc.titeInhibit), + params, *param_count, w); +} + +/* ARGSUSED */ +void +HandleSoftReset(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_softreset(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleHardReset(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_hardreset(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleClearSavedLines(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_clearsavedlines(w, (XtPointer) 0, (XtPointer) 0); +} + +void +HandleAllowBoldFonts(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(allowBoldFonts); +} + +#if OPT_LOAD_VTFONTS +void +update_font_escape(void) +{ + TScreen *screen = TScreenOf(term); + + SetItemSensitivity(fontMenuEntries[fontMenu_fontescape].widget, + ((screen->allowFontOps && + screen->EscapeFontName()) + ? True : False)); +} +#endif + +#if OPT_DEC_CHRSET +void +HandleFontDoublesize(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(font_doublesize); +} +#endif + +#if OPT_BOX_CHARS +void +HandleFontBoxChars(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_boxchars, TScreenOf(term)->force_box_chars, + params, *param_count, w); +} + +void +HandleFontPacked(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_packed, TScreenOf(term)->force_packed, + params, *param_count, w); +} +#endif + +#if OPT_DEC_SOFTFONT +void +HandleFontLoading(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_loadable, term->misc.font_loadable, + params, *param_count, w); +} +#endif + +#if OPT_RENDERFONT +static void +update_fontmenu(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int n; + + for (n = 0; n <= fontMenu_lastBuiltin; ++n) { + Boolean active = (Boolean) (xw->work.render_font || + (screen->menu_font_sizes[n] >= 0)); + SetItemSensitivity(fontMenuEntries[n].widget, active); + } +} + +void +HandleRenderFont(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + XtermWidget xw = (XtermWidget) term; + + DefaultRenderFont(xw); + + handle_vt_toggle(do_font_renderfont, xw->work.render_font, + params, *param_count, w); + + update_fontmenu(xw); +} +#endif + +#if OPT_WIDE_CHARS +void +HandleUTF8Mode(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_utf8_mode, TScreenOf(term)->utf8_mode, + params, *param_count, w); +} + +void +HandleUTF8Fonts(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_utf8_fonts, TScreenOf(term)->utf8_fonts, + params, *param_count, w); +} + +void +HandleUTF8Title(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + handle_vt_toggle(do_font_utf8_title, TScreenOf(term)->utf8_title, + params, *param_count, w); +} +#endif + +#if OPT_SCREEN_DUMPS +void +HandleDumpHtml(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + xtermDumpHtml(term); +} + +void +HandleDumpSvg(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + xtermDumpSvg(term); +} +#endif + +#if OPT_TEK4014 +void +HandleSetTerminalType(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + XtermWidget xw = term; + + if (*param_count == 1) { + switch (params[0][0]) { + case 'v': + case 'V': + if (TEK4014_ACTIVE(xw)) + do_vtmode(w, (XtPointer) 0, (XtPointer) 0); + break; + case 't': + case 'T': + if (!TEK4014_ACTIVE(xw)) + do_tekmode(w, (XtPointer) 0, (XtPointer) 0); + break; + default: + Bell(xw, XkbBI_MinorError, 0); + } + } else { + Bell(xw, XkbBI_MinorError, 0); + } +} + +void +HandleVisibility(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + XtermWidget xw = term; + + if (*param_count == 2) { + switch (params[0][0]) { + case 'v': + case 'V': + handle_tek_toggle(do_vtonoff, (int) TScreenOf(xw)->Vshow, + params + 1, (*param_count) - 1, w); + break; + case 't': + case 'T': + handle_tek_toggle(do_tekonoff, (int) TEK4014_SHOWN(xw), + params + 1, (*param_count) - 1, w); + break; + default: + Bell(xw, XkbBI_MinorError, 0); + } + } else { + Bell(xw, XkbBI_MinorError, 0); + } +} + +/* ARGSUSED */ +void +HandleSetTekText(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + XtermWidget xw = term; + void (*proc) PROTO_XT_CALLBACK_ARGS = 0; + + switch (*param_count) { + case 0: + proc = do_tektextlarge; + break; + case 1: + switch (TekGetFontSize(params[0])) { + case TEK_FONT_LARGE: + proc = do_tektextlarge; + break; + case TEK_FONT_2: + proc = do_tektext2; + break; + case TEK_FONT_3: + proc = do_tektext3; + break; + case TEK_FONT_SMALL: + proc = do_tektextsmall; + break; + } + break; + } + if (proc) + (*proc) (w, (XtPointer) 0, (XtPointer) 0); + else + Bell(xw, XkbBI_MinorError, 0); +} + +/* ARGSUSED */ +void +HandleTekPage(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_tekpage(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleTekReset(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_tekreset(w, (XtPointer) 0, (XtPointer) 0); +} + +/* ARGSUSED */ +void +HandleTekCopy(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *param_count GCC_UNUSED) +{ + do_tekcopy(w, (XtPointer) 0, (XtPointer) 0); +} +#endif /* OPT_TEK4014 */ + +#if OPT_TOOLBAR +/* + * The normal style of xterm popup menu delays initialization until the menu is + * first requested. When using a toolbar, we can use the same initialization, + * though on the first popup there will be a little geometry layout jitter, + * since the menu is already managed when this callback is invoked. + */ +static void +InitPopup(Widget gw, + XtPointer closure, + XtPointer data GCC_UNUSED) +{ + String params[2]; + Cardinal count = 1; + + params[0] = (char *) closure; + params[1] = 0; + TRACE(("InitPopup(%s)\n", params[0])); + + domenu(gw, (XEvent *) 0, params, &count); + + XtRemoveCallback(gw, XtNpopupCallback, InitPopup, closure); +} + +static Dimension +SetupShell(Widget *menus, MenuList * shell, int n, int m) +{ + char temp[80]; + char *external_name = 0; + Dimension button_height; + Dimension button_border; + char *saveLocale = xtermSetLocale(LC_CTYPE, resource.menuLocale); + + shell[n].w = XtVaCreatePopupShell(menu_names[n].internal_name, + simpleMenuWidgetClass, + *menus, + XtNgeometry, NULL, + (XtPointer) 0); + + XtAddCallback(shell[n].w, XtNpopupCallback, InitPopup, menu_names[n].internal_name); + XtVaGetValues(shell[n].w, + XtNlabel, &external_name, + (XtPointer) 0); + + TRACE(("...SetupShell(%s) -> %s -> %#lx\n", + menu_names[n].internal_name, + external_name, + (long) shell[n].w)); + + sprintf(temp, "%sButton", menu_names[n].internal_name); + shell[n].b = XtVaCreateManagedWidget(temp, + menuButtonWidgetClass, + *menus, + XtNfromHoriz, ((m >= 0) + ? shell[m].b + : 0), + XtNmenuName, menu_names[n].internal_name, + XtNlabel, external_name, + (XtPointer) 0); + XtVaGetValues(shell[n].b, + XtNheight, &button_height, + XtNborderWidth, &button_border, + (XtPointer) 0); + + xtermResetLocale(LC_CTYPE, saveLocale); + return (Dimension) (button_height + (button_border * 2)); +} +#endif /* OPT_TOOLBAR */ + +void +SetupMenus(Widget shell, Widget *forms, Widget *menus, Dimension *menu_high) +{ +#if OPT_TOOLBAR + Dimension button_height = 0; + Dimension toolbar_hSpace; + Arg args[10]; +#endif + + TRACE(("SetupMenus(%s)\n", shell == toplevel ? "vt100" : "tek4014")); + + *menu_high = 0; + + if (shell == toplevel) { + XawSimpleMenuAddGlobalActions(app_con); + XtRegisterGrabAction(HandlePopupMenu, True, + (unsigned) (ButtonPressMask | ButtonReleaseMask), + GrabModeAsync, GrabModeAsync); + } +#if OPT_TOOLBAR + *forms = XtVaCreateManagedWidget("form", + formWidgetClass, shell, + (XtPointer) 0); + xtermAddInput(*forms); + + /* + * Set a nominal value for the preferred pane size, which lets the + * buttons determine the actual height of the menu bar. We don't show + * the grip, because it's too easy to make the toolbar look bad that + * way. + */ + XtSetArg(args[0], XtNorientation, XtorientHorizontal); + XtSetArg(args[1], XtNtop, XawChainTop); + XtSetArg(args[2], XtNbottom, XawChainTop); + XtSetArg(args[3], XtNleft, XawChainLeft); + XtSetArg(args[4], XtNright, XawChainLeft); + + if (resource.toolBar) { + *menus = XtCreateManagedWidget("menubar", boxWidgetClass, *forms, + args, 5); + } else { + *menus = XtCreateWidget("menubar", boxWidgetClass, *forms, args, 5); + } + + /* + * The toolbar widget's height is not necessarily known yet. If the + * toolbar is not created as a managed widget, we can still make a good + * guess about its height by collecting the widget's other resource values. + */ + XtVaGetValues(*menus, + XtNhSpace, &toolbar_hSpace, + (XtPointer) 0); + + if (shell == toplevel) { /* vt100 */ + int j; + for (j = mainMenu; j <= fontMenu; j++) { + button_height = SetupShell(menus, vt_shell, j, j - 1); + } + } +#if OPT_TEK4014 + else { /* tek4014 */ + (void) SetupShell(menus, tek_shell, mainMenu, -1); + button_height = SetupShell(menus, tek_shell, tekMenu, mainMenu); + } +#endif + + /* + * Tell the main program how high the toolbar is, to help with the initial + * layout. + */ + *menu_high = (Dimension) (button_height + 2 * (toolbar_hSpace)); + TRACE(("...menuHeight:%d = (%d + 2 * %d)\n", + *menu_high, button_height, toolbar_hSpace)); + +#else /* !OPT_TOOLBAR */ + *forms = shell; + *menus = shell; +#endif + + TRACE(("...shell=%#lx\n", (long) shell)); + TRACE(("...forms=%#lx\n", (long) *forms)); + TRACE(("...menus=%#lx\n", (long) *menus)); +} + +void +repairSizeHints(void) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + if (XtIsRealized((Widget) xw)) { + getXtermSizeHints(xw); + xtermSizeHints(xw, ScrollbarWidth(screen)); + + XSetWMNormalHints(screen->display, VShellWindow(xw), &xw->hints); + } +} + +#if OPT_TOOLBAR +#define INIT_POPUP(s, n) InitPopup(s[n].w, menu_names[n].internal_name, 0) + +static Bool +InitWidgetMenu(Widget shell) +{ + Bool result = False; + + TRACE(("InitWidgetMenu(%p)\n", (void *) shell)); + if (term != 0) { + if (shell == toplevel) { /* vt100 */ + if (!term->init_menu) { + INIT_POPUP(vt_shell, mainMenu); + INIT_POPUP(vt_shell, vtMenu); + INIT_POPUP(vt_shell, fontMenu); + term->init_menu = True; + TRACE(("...InitWidgetMenu(vt)\n")); + } + result = term->init_menu; + } +#if OPT_TEK4014 + else if (tekWidget) { /* tek4014 */ + if (!tekWidget->init_menu) { + INIT_POPUP(tek_shell, mainMenu); + INIT_POPUP(tek_shell, tekMenu); + tekWidget->init_menu = True; + TRACE(("...InitWidgetMenu(tek)\n")); + } + result = tekWidget->init_menu; + } +#endif + } + TRACE(("...InitWidgetMenu ->%d\n", result)); + return result; +} + +static TbInfo * +toolbar_info(Widget w) +{ + TRACE(("...getting toolbar_info\n")); +#if OPT_TEK4014 + if (w != (Widget) term) + return &(tekWidget->tek.tb_info); +#else + (void) w; +#endif + return &(WhichVWin(TScreenOf(term))->tb_info); +} + +static void +hide_toolbar(Widget w) +{ + if (w != 0) { + TbInfo *info = toolbar_info(w); + + TRACE(("hiding toolbar\n")); + XtVaSetValues(w, + XtNfromVert, (Widget) 0, + (XtPointer) 0); + + if (info->menu_bar != 0) { + repairSizeHints(); + XtUnmanageChild(info->menu_bar); + if (XtIsRealized(info->menu_bar)) { + XtUnmapWidget(info->menu_bar); + } + } + TRACE(("...hiding toolbar (done)\n")); + } +} + +static void +show_toolbar(Widget w) +{ + if (w != 0) { + TbInfo *info = toolbar_info(w); + + TRACE(("showing toolbar\n")); + if (info->menu_bar != 0) { + XtVaSetValues(w, + XtNfromVert, info->menu_bar, + (XtPointer) 0); + if (XtIsRealized(info->menu_bar)) + repairSizeHints(); + XtManageChild(info->menu_bar); + if (XtIsRealized(info->menu_bar)) { + XtMapWidget(info->menu_bar); + } + } + /* + * This is needed to make the terminal widget move down below the + * toolbar. + */ + XawFormDoLayout(XtParent(w), True); + TRACE(("...showing toolbar (done)\n")); + } +} + +/* + * Make the toolbar visible or invisible in the current window(s). + */ +void +ShowToolbar(Bool enable) +{ + XtermWidget xw = term; + + TRACE(("ShowToolbar(%d)\n", enable)); + + if (IsIcon(TScreenOf(xw))) { + Bell(xw, XkbBI_MinorError, 0); + } else { + if (enable) { + if (InitWidgetMenu(toplevel)) + show_toolbar((Widget) xw); +#if OPT_TEK4014 + if (InitWidgetMenu(tekshellwidget)) + show_toolbar((Widget) tekWidget); +#endif + } else { + hide_toolbar((Widget) xw); +#if OPT_TEK4014 + hide_toolbar((Widget) tekWidget); +#endif + } + resource.toolBar = (Boolean) enable; + update_toolbar(); + } +#if OPT_TOOLBAR + /* + * Layout for the toolbar confuses the Shell widget. Remind it that we + * would like to be iconified if the corresponding resource was set. + */ + { + static Bool first = True; + if (first && XtIsRealized(toplevel)) { + Boolean iconic = 0; + + XtVaGetValues(toplevel, + XtNiconic, &iconic, + (XtPointer) 0); + + if (iconic) { + TRACE(("...please iconify window %#lx\n", XtWindow(toplevel))); + xtermIconify(xw); + } + first = False; + } + } +#endif +} + +void +HandleToolbar(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + XtermWidget xw = term; + + if (IsIcon(TScreenOf(xw))) { + Bell(xw, XkbBI_MinorError, 0); + } else { + handle_vt_toggle(do_toolbar, resource.toolBar, + params, *param_count, w); + } +} + +/* ARGSUSED */ +static void +do_toolbar(Widget gw GCC_UNUSED, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = term; + + /* + * Toggle toolbars for both vt100 and tek windows, since they share the + * menu which contains the checkbox indicating whether the toolbar is + * active. + */ + if (IsIcon(TScreenOf(xw))) { + Bell(xw, XkbBI_MinorError, 0); + } else { + ShowToolbar(ToggleFlag(resource.toolBar)); + } +} + +void +update_toolbar(void) +{ + UpdateCheckbox("update_toolbar", + mainMenuEntries, + mainMenu_toolbar, + resource.toolBar); +} +#endif /* OPT_TOOLBAR */ + +void +update_securekbd(void) +{ + UpdateCheckbox("update_securekbd", + mainMenuEntries, + mainMenu_securekbd, + TScreenOf(term)->grabbedKbd); +} + +void +update_allowsends(void) +{ + UpdateCheckbox("update_allowsends", + mainMenuEntries, + mainMenu_allowsends, + TScreenOf(term)->allowSendEvents); +} + +#ifdef ALLOWLOGGING +void +update_logging(void) +{ + UpdateCheckbox("update_logging", + mainMenuEntries, + mainMenu_logging, + TScreenOf(term)->logging); +} +#endif + +#if OPT_PRINT_ON_EXIT +void +update_write_error(void) +{ + UpdateCheckbox("update_write_error", + mainMenuEntries, + mainMenu_write_error, + TScreenOf(term)->write_error); +} +#endif + +void +update_print_redir(void) +{ + UpdateCheckbox("update_print_redir", + mainMenuEntries, + mainMenu_print_redir, + PrinterOf(TScreenOf(term)).printer_controlmode); +} + +void +update_8bit_control(void) +{ + UpdateCheckbox("update_8bit_control", + mainMenuEntries, + mainMenu_8bit_ctrl, + TScreenOf(term)->control_eight_bits); +} + +void +update_decbkm(void) +{ + UpdateCheckbox("update_decbkm", + mainMenuEntries, + mainMenu_backarrow, + (term->keyboard.flags & MODE_DECBKM) != 0); +} + +#if OPT_NUM_LOCK +void +update_num_lock(void) +{ + UpdateCheckbox("update_num_lock", + mainMenuEntries, + mainMenu_num_lock, + term->misc.real_NumLock); +} + +void +update_alt_esc(void) +{ + UpdateCheckbox("update_alt_esc", + mainMenuEntries, + mainMenu_alt_esc, + TScreenOf(term)->alt_sends_esc); +} + +void +update_meta_esc(void) +{ + UpdateCheckbox("update_meta_esc", + mainMenuEntries, + mainMenu_meta_esc, + TScreenOf(term)->meta_sends_esc); +} +#endif + +#if OPT_SUN_FUNC_KEYS +void +update_sun_fkeys(void) +{ + UpdateCheckbox("update_sun_fkeys", + mainMenuEntries, + mainMenu_sun_fkeys, + term->keyboard.type == keyboardIsSun); +} +#endif + +#if OPT_TCAP_FKEYS +void +update_tcap_fkeys(void) +{ + UpdateCheckbox("update_tcap_fkeys", + mainMenuEntries, + mainMenu_tcap_fkeys, + term->keyboard.type == keyboardIsTermcap); +} +#endif + +void +update_old_fkeys(void) +{ + UpdateCheckbox("update_old_fkeys", + mainMenuEntries, + mainMenu_old_fkeys, + term->keyboard.type == keyboardIsLegacy); +} + +void +update_delete_del(void) +{ + UpdateCheckbox("update_delete_del", + mainMenuEntries, + mainMenu_delete_del, + xtermDeleteIsDEL(term)); +} + +#if OPT_SUNPC_KBD +void +update_sun_kbd(void) +{ + UpdateCheckbox("update_sun_kbd", + mainMenuEntries, + mainMenu_sun_kbd, + term->keyboard.type == keyboardIsVT220); +} +#endif + +#if OPT_HP_FUNC_KEYS +void +update_hp_fkeys(void) +{ + UpdateCheckbox("update_hp_fkeys", + mainMenuEntries, + mainMenu_hp_fkeys, + term->keyboard.type == keyboardIsHP); +} +#endif + +#if OPT_SCO_FUNC_KEYS +void +update_sco_fkeys(void) +{ + UpdateCheckbox("update_sco_fkeys", + mainMenuEntries, + mainMenu_sco_fkeys, + term->keyboard.type == keyboardIsSCO); +} +#endif + +void +update_scrollbar(void) +{ + UpdateCheckbox("update_scrollbar", + vtMenuEntries, + vtMenu_scrollbar, + ScrollbarWidth(TScreenOf(term))); +} + +void +update_jumpscroll(void) +{ + UpdateCheckbox("update_jumpscroll", + vtMenuEntries, + vtMenu_jumpscroll, + TScreenOf(term)->jumpscroll); +} + +void +update_reversevideo(void) +{ + UpdateCheckbox("update_reversevideo", + vtMenuEntries, + vtMenu_reversevideo, + (term->misc.re_verse)); +} + +void +update_autowrap(void) +{ + DisableIfVT52(vtMenuEntries, + vtMenu_autowrap); + UpdateCheckbox("update_autowrap", + vtMenuEntries, + vtMenu_autowrap, + (term->flags & WRAPAROUND) != 0); +} + +void +update_reversewrap(void) +{ + DisableIfVT52(vtMenuEntries, + vtMenu_reversewrap); + UpdateCheckbox("update_reversewrap", + vtMenuEntries, + vtMenu_reversewrap, + (term->flags & REVERSEWRAP) != 0); +} + +void +update_autolinefeed(void) +{ + DisableIfVT52(vtMenuEntries, + vtMenu_autolinefeed); + UpdateCheckbox("update_autolinefeed", + vtMenuEntries, + vtMenu_autolinefeed, + (term->flags & LINEFEED) != 0); +} + +void +update_appcursor(void) +{ + DisableIfVT52(vtMenuEntries, + vtMenu_appcursor); + UpdateCheckbox("update_appcursor", + vtMenuEntries, + vtMenu_appcursor, + (term->keyboard.flags & MODE_DECCKM) != 0); +} + +void +update_appkeypad(void) +{ + UpdateCheckbox("update_appkeypad", + vtMenuEntries, + vtMenu_appkeypad, + (term->keyboard.flags & MODE_DECKPAM) != 0); +} + +void +update_scrollkey(void) +{ + UpdateCheckbox("update_scrollkey", + vtMenuEntries, + vtMenu_scrollkey, + TScreenOf(term)->scrollkey); +} + +void +update_scrollttyoutput(void) +{ + UpdateCheckbox("update_scrollttyoutput", + vtMenuEntries, + vtMenu_scrollttyoutput, + TScreenOf(term)->scrollttyoutput); +} + +void +update_keepSelection(void) +{ + UpdateCheckbox("update_keepSelection", + vtMenuEntries, + vtMenu_keepSelection, + TScreenOf(term)->keepSelection); +} + +void +update_selectToClipboard(void) +{ + UpdateCheckbox("update_selectToClipboard", + vtMenuEntries, + vtMenu_selectToClipboard, + TScreenOf(term)->selectToClipboard); +} + +void +update_allow132(void) +{ + DisableIfVT52(vtMenuEntries, + vtMenu_allow132); + UpdateCheckbox("update_allow132", + vtMenuEntries, + vtMenu_allow132, + TScreenOf(term)->c132); +} + +void +update_cursesemul(void) +{ +#if 0 /* 2006-2-12: no longer menu entry */ + UpdateMenuItem("update_cursesemul", vtMenuEntries, vtMenu_cursesemul, + TScreenOf(term)->curses); +#endif +} + +void +update_visualbell(void) +{ + UpdateCheckbox("update_visualbell", + vtMenuEntries, + vtMenu_visualbell, + TScreenOf(term)->visualbell); +} + +void +update_bellIsUrgent(void) +{ + UpdateCheckbox("update_bellIsUrgent", + vtMenuEntries, + vtMenu_bellIsUrgent, + TScreenOf(term)->bellIsUrgent); +} + +void +update_poponbell(void) +{ + UpdateCheckbox("update_poponbell", + vtMenuEntries, + vtMenu_poponbell, + TScreenOf(term)->poponbell); +} + +#ifndef update_marginbell /* 2007-3-7: no longer menu entry */ +void +update_marginbell(void) +{ + UpdateCheckbox("update_marginbell", + vtMenuEntries, + vtMenu_marginbell, + TScreenOf(term)->marginbell); +} +#endif + +#if OPT_BLINK_CURS +void +update_cursorblink(void) +{ + BlinkOps check = TScreenOf(term)->cursor_blink; + + if (check == cbAlways || + check == cbNever) { + SetItemSensitivity(vtMenuEntries[vtMenu_cursorblink].widget, False); + } + UpdateCheckbox("update_cursorblink", + vtMenuEntries, + vtMenu_cursorblink, + (check == cbTrue || + check == cbAlways)); +} +#endif + +void +update_altscreen(void) +{ + UpdateCheckbox("update_altscreen", + vtMenuEntries, + vtMenu_altscreen, + TScreenOf(term)->whichBuf); +} + +void +update_titeInhibit(void) +{ + UpdateCheckbox("update_titeInhibit", + vtMenuEntries, + vtMenu_titeInhibit, + !(term->misc.titeInhibit)); +} + +#ifndef NO_ACTIVE_ICON +void +update_activeicon(void) +{ + UpdateCheckbox("update_activeicon", + vtMenuEntries, + vtMenu_activeicon, + term->work.active_icon); +} +#endif /* NO_ACTIVE_ICON */ + +static void +do_allowBoldFonts(Widget w, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = getXtermWidget(w); + if (xw != 0) { + ToggleFlag(TScreenOf(xw)->allowBoldFonts); + update_menu_allowBoldFonts(); + Redraw(); + } +} + +#if OPT_DEC_CHRSET +void +update_font_doublesize(void) +{ + UpdateCheckbox("update_font_doublesize", + fontMenuEntries, + fontMenu_font_doublesize, + TScreenOf(term)->font_doublesize); +} +#endif + +#if OPT_BOX_CHARS +void +update_font_boxchars(void) +{ + SetItemSensitivity(fontMenuEntries[fontMenu_font_boxchars].widget, + !TScreenOf(term)->broken_box_chars); + UpdateCheckbox("update_font_boxchars", + fontMenuEntries, + fontMenu_font_boxchars, + TScreenOf(term)->force_box_chars || + TScreenOf(term)->broken_box_chars); +} + +void +update_font_packed(void) +{ + UpdateCheckbox("update_font_packed", + fontMenuEntries, + fontMenu_font_packedfont, + TScreenOf(term)->force_packed); +} +#endif + +#if OPT_DEC_SOFTFONT +void +update_font_loadable(void) +{ + UpdateCheckbox("update_font_loadable", + fontMenuEntries, + fontMenu_font_loadable, + term->misc.font_loadable); +} +#endif + +#if OPT_RENDERFONT +void +update_font_renderfont(void) +{ + UpdateCheckbox("update_font_renderfont", + fontMenuEntries, + fontMenu_render_font, + (term->work.render_font == True)); + SetItemSensitivity(fontMenuEntries[fontMenu_render_font].widget, + !IsEmpty(CurrentXftFont(term))); + +#if OPT_BOX_CHARS + if (term->work.render_font) { + TScreenOf(term)->broken_box_chars = term->work.broken_box_chars; + } else { + TScreenOf(term)->broken_box_chars = False; + } +#endif + update_font_boxchars(); + + update_fontmenu(term); +} +#endif + +#if OPT_WIDE_CHARS +void +update_font_utf8_mode(void) +{ + Bool active = (TScreenOf(term)->utf8_mode != uAlways); + Bool enable = (TScreenOf(term)->utf8_mode != uFalse); + + TRACE(("update_font_utf8_mode active %d, enable %d\n", active, enable)); + SetItemSensitivity(fontMenuEntries[fontMenu_utf8_mode].widget, active); + UpdateCheckbox("update_font_utf8_mode", + fontMenuEntries, + fontMenu_utf8_mode, + enable); +} + +void +update_font_utf8_fonts(void) +{ + Bool active = (TScreenOf(term)->utf8_fonts != uAlways); + Bool enable = (TScreenOf(term)->utf8_fonts != uFalse); + + TRACE(("update_font_utf8_fonts active %d, enable %d\n", active, enable)); + SetItemSensitivity(fontMenuEntries[fontMenu_utf8_fonts].widget, active); + UpdateCheckbox("update_font_utf8_fonts", + fontMenuEntries, + fontMenu_utf8_fonts, + enable); +} + +void +update_font_utf8_title(void) +{ + Bool active = (TScreenOf(term)->utf8_mode != uAlways); + Bool enable = (TScreenOf(term)->utf8_mode != uFalse); + + TRACE(("update_font_utf8_title active %d, enable %d\n", active, enable)); + SetItemSensitivity(fontMenuEntries[fontMenu_utf8_title].widget, active); + UpdateCheckbox("update_font_utf8_title", + fontMenuEntries, + fontMenu_utf8_title, + enable); +} +#endif + +#if OPT_DEC_CHRSET || OPT_BOX_CHARS || OPT_DEC_SOFTFONT +void +update_menu_allowBoldFonts(void) +{ + UpdateCheckbox("update_menu_allowBoldFonts", + fontMenuEntries, + fontMenu_allowBoldFonts, + TScreenOf(term)->allowBoldFonts); +} +#endif + +#if OPT_ALLOW_XXX_OPS +static void +enable_allow_xxx_ops(Bool enable) +{ + SetItemSensitivity(fontMenuEntries[fontMenu_allowFontOps].widget, enable); + SetItemSensitivity(fontMenuEntries[fontMenu_allowMouseOps].widget, enable); + SetItemSensitivity(fontMenuEntries[fontMenu_allowTcapOps].widget, enable); + SetItemSensitivity(fontMenuEntries[fontMenu_allowTitleOps].widget, enable); + SetItemSensitivity(fontMenuEntries[fontMenu_allowWindowOps].widget, enable); +} + +static void +do_allowColorOps(Widget w, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = getXtermWidget(w); + if (xw != 0) { + ToggleFlag(TScreenOf(xw)->allowColorOps); + update_menu_allowColorOps(); + } +} + +static void +do_allowFontOps(Widget w, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = getXtermWidget(w); + if (xw != 0) { + ToggleFlag(TScreenOf(xw)->allowFontOps); + update_menu_allowFontOps(); + } +} + +static void +do_allowMouseOps(Widget w, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = getXtermWidget(w); + if (xw != 0) { + ToggleFlag(TScreenOf(xw)->allowMouseOps); + update_menu_allowMouseOps(); + } +} + +static void +do_allowTcapOps(Widget w, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = getXtermWidget(w); + if (xw != 0) { + ToggleFlag(TScreenOf(xw)->allowTcapOps); + update_menu_allowTcapOps(); + } +} + +static void +do_allowTitleOps(Widget w, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = getXtermWidget(w); + if (xw != 0) { + ToggleFlag(TScreenOf(xw)->allowTitleOps); + update_menu_allowTitleOps(); + } +} + +static void +do_allowWindowOps(Widget w, + XtPointer closure GCC_UNUSED, + XtPointer data GCC_UNUSED) +{ + XtermWidget xw = getXtermWidget(w); + if (xw != 0) { + ToggleFlag(TScreenOf(xw)->allowWindowOps); + update_menu_allowWindowOps(); + } +} + +void +HandleAllowColorOps(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(allowColorOps); +} + +void +HandleAllowFontOps(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(allowFontOps); +} + +void +HandleAllowMouseOps(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(allowMouseOps); +} + +void +HandleAllowTcapOps(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(allowTcapOps); +} + +void +HandleAllowTitleOps(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(allowTitleOps); +} + +void +HandleAllowWindowOps(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + HANDLE_VT_TOGGLE(allowWindowOps); +} + +void +update_menu_allowColorOps(void) +{ + UpdateCheckbox("update_menu_allowColorOps", + fontMenuEntries, + fontMenu_allowColorOps, + TScreenOf(term)->allowColorOps); +} + +void +update_menu_allowFontOps(void) +{ + UpdateCheckbox("update_menu_allowFontOps", + fontMenuEntries, + fontMenu_allowFontOps, + TScreenOf(term)->allowFontOps); +} + +void +update_menu_allowMouseOps(void) +{ + UpdateCheckbox("update_menu_allowMouseOps", + fontMenuEntries, + fontMenu_allowMouseOps, + TScreenOf(term)->allowMouseOps); +} + +void +update_menu_allowTcapOps(void) +{ + UpdateCheckbox("update_menu_allowTcapOps", + fontMenuEntries, + fontMenu_allowTcapOps, + TScreenOf(term)->allowTcapOps); +} + +void +update_menu_allowTitleOps(void) +{ + UpdateCheckbox("update_menu_allowTitleOps", + fontMenuEntries, + fontMenu_allowTitleOps, + TScreenOf(term)->allowTitleOps); +} + +void +update_menu_allowWindowOps(void) +{ + UpdateCheckbox("update_menu_allowWindowOps", + fontMenuEntries, + fontMenu_allowWindowOps, + TScreenOf(term)->allowWindowOps); +} +#endif + +#if OPT_TEK4014 +void +update_tekshow(void) +{ + if (!(TScreenOf(term)->inhibit & I_TEK)) { + UpdateCheckbox("update_tekshow", + vtMenuEntries, + vtMenu_tekshow, + TEK4014_SHOWN(term)); + } +} + +void +update_vttekmode(void) +{ + XtermWidget xw = term; + + if (!(TScreenOf(xw)->inhibit & I_TEK)) { + UpdateCheckbox("update_vtmode", + vtMenuEntries, + vtMenu_tekmode, + TEK4014_ACTIVE(xw)); + UpdateCheckbox("update_tekmode", + tekMenuEntries, + tekMenu_vtmode, + !TEK4014_ACTIVE(xw)); + update_fullscreen(); + } +} + +void +update_vtshow(void) +{ + if (!(TScreenOf(term)->inhibit & I_TEK)) { + UpdateCheckbox("update_vtshow", + tekMenuEntries, + tekMenu_vtshow, + TScreenOf(term)->Vshow); + } +} + +void +set_vthide_sensitivity(void) +{ + if (!(TScreenOf(term)->inhibit & I_TEK)) { + SetItemSensitivity( + vtMenuEntries[vtMenu_vthide].widget, + TEK4014_SHOWN(term)); + } +} + +void +set_tekhide_sensitivity(void) +{ + if (!(TScreenOf(term)->inhibit & I_TEK)) { + SetItemSensitivity( + tekMenuEntries[tekMenu_tekhide].widget, + TScreenOf(term)->Vshow); + } +} + +void +set_tekfont_menu_item(int n, int val) +{ + if (!(TScreenOf(term)->inhibit & I_TEK)) { + UpdateCheckbox("set_tekfont_menu_item", tekMenuEntries, FS2MI(n), + (val)); + } +} +#endif /* OPT_TEK4014 */ + +void +set_menu_font(int val) +{ + UpdateCheckbox("set_menu_font", + fontMenuEntries, + TScreenOf(term)->menu_font_number, + (val)); +} diff --git a/ports/xterm/xterm-359/menu.h b/ports/xterm/xterm-359/menu.h new file mode 100644 index 0000000..a1581f4 --- /dev/null +++ b/ports/xterm/xterm-359/menu.h @@ -0,0 +1,590 @@ +/* $XTermId: menu.h,v 1.144 2020/06/02 23:49:05 tom Exp $ */ + +/* + * Copyright 1999-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * + * Copyright 1989 X Consortium + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation. + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of the X Consortium shall + * not be used in advertising or otherwise to promote the sale, use or + * other dealings in this Software without prior written authorization + * from the X Consortium. + */ + +#ifndef included_menu_h +#define included_menu_h +/* *INDENT-OFF* */ + +#include + +#ifndef OPT_MENU_KEEPCLIPBOARD +#define OPT_MENU_KEEPCLIPBOARD 0 /* useful for debugging */ +#endif + +typedef struct _MenuEntry { + const char *name; + void (*function) PROTO_XT_CALLBACK_ARGS; + Widget widget; +} MenuEntry; + +extern MenuEntry mainMenuEntries[], vtMenuEntries[]; +extern MenuEntry fontMenuEntries[]; +#if OPT_TEK4014 +extern MenuEntry tekMenuEntries[]; +#endif + +extern void Handle8BitControl PROTO_XT_ACTIONS_ARGS; +extern void HandleAllow132 PROTO_XT_ACTIONS_ARGS; +extern void HandleAllowBoldFonts PROTO_XT_ACTIONS_ARGS; +extern void HandleAllowColorOps PROTO_XT_ACTIONS_ARGS; +extern void HandleAllowFontOps PROTO_XT_ACTIONS_ARGS; +extern void HandleAllowMouseOps PROTO_XT_ACTIONS_ARGS; +extern void HandleAllowSends PROTO_XT_ACTIONS_ARGS; +extern void HandleAllowTcapOps PROTO_XT_ACTIONS_ARGS; +extern void HandleAllowTitleOps PROTO_XT_ACTIONS_ARGS; +extern void HandleAllowWindowOps PROTO_XT_ACTIONS_ARGS; +extern void HandleAltEsc PROTO_XT_ACTIONS_ARGS; +extern void HandleAltScreen PROTO_XT_ACTIONS_ARGS; +extern void HandleAppCursor PROTO_XT_ACTIONS_ARGS; +extern void HandleAppKeypad PROTO_XT_ACTIONS_ARGS; +extern void HandleAutoLineFeed PROTO_XT_ACTIONS_ARGS; +extern void HandleAutoWrap PROTO_XT_ACTIONS_ARGS; +extern void HandleBackarrow PROTO_XT_ACTIONS_ARGS; +extern void HandleBellIsUrgent PROTO_XT_ACTIONS_ARGS; +extern void HandleClearSavedLines PROTO_XT_ACTIONS_ARGS GCC_NORETURN; +extern void HandleCreateMenu PROTO_XT_ACTIONS_ARGS; +extern void HandleCursesEmul PROTO_XT_ACTIONS_ARGS; +extern void HandleCursorBlink PROTO_XT_ACTIONS_ARGS; +extern void HandleDeleteIsDEL PROTO_XT_ACTIONS_ARGS; +extern void HandleDumpHtml PROTO_XT_ACTIONS_ARGS; +extern void HandleDumpSvg PROTO_XT_ACTIONS_ARGS; +extern void HandleFontBoxChars PROTO_XT_ACTIONS_ARGS; +extern void HandleFontDoublesize PROTO_XT_ACTIONS_ARGS; +extern void HandleFontLoading PROTO_XT_ACTIONS_ARGS; +extern void HandleFontPacked PROTO_XT_ACTIONS_ARGS; +extern void HandleFullscreen PROTO_XT_ACTIONS_ARGS; +extern void HandleHardReset PROTO_XT_ACTIONS_ARGS GCC_NORETURN; +extern void HandleHpFunctionKeys PROTO_XT_ACTIONS_ARGS; +extern void HandleJumpscroll PROTO_XT_ACTIONS_ARGS; +extern void HandleKeepClipboard PROTO_XT_ACTIONS_ARGS; +extern void HandleKeepSelection PROTO_XT_ACTIONS_ARGS; +extern void HandleLogging PROTO_XT_ACTIONS_ARGS; +extern void HandleMarginBell PROTO_XT_ACTIONS_ARGS; +extern void HandleMetaEsc PROTO_XT_ACTIONS_ARGS; +extern void HandleNumLock PROTO_XT_ACTIONS_ARGS; +extern void HandleOldFunctionKeys PROTO_XT_ACTIONS_ARGS; +extern void HandlePopupMenu PROTO_XT_ACTIONS_ARGS; +extern void HandlePrintControlMode PROTO_XT_ACTIONS_ARGS; +extern void HandlePrintEverything PROTO_XT_ACTIONS_ARGS; +extern void HandlePrintImmediate PROTO_XT_ACTIONS_ARGS; +extern void HandlePrintOnError PROTO_XT_ACTIONS_ARGS; +extern void HandlePrintScreen PROTO_XT_ACTIONS_ARGS; +extern void HandleQuit PROTO_XT_ACTIONS_ARGS GCC_NORETURN; +extern void HandleRedraw PROTO_XT_ACTIONS_ARGS; +extern void HandleRenderFont PROTO_XT_ACTIONS_ARGS; +extern void HandleReverseVideo PROTO_XT_ACTIONS_ARGS; +extern void HandleReverseWrap PROTO_XT_ACTIONS_ARGS; +extern void HandleScoFunctionKeys PROTO_XT_ACTIONS_ARGS; +extern void HandleScrollKey PROTO_XT_ACTIONS_ARGS; +extern void HandleScrollTtyOutput PROTO_XT_ACTIONS_ARGS; +extern void HandleScrollbar PROTO_XT_ACTIONS_ARGS; +extern void HandleSecure PROTO_XT_ACTIONS_ARGS; +extern void HandleSendSignal PROTO_XT_ACTIONS_ARGS; +extern void HandleSetPopOnBell PROTO_XT_ACTIONS_ARGS; +extern void HandleSetPrivateColorRegisters PROTO_XT_ACTIONS_ARGS; +extern void HandleSetSelect PROTO_XT_ACTIONS_ARGS; +extern void HandleSetTekText PROTO_XT_ACTIONS_ARGS; +extern void HandleSetTerminalType PROTO_XT_ACTIONS_ARGS; +extern void HandleSetVisualBell PROTO_XT_ACTIONS_ARGS; +extern void HandleSixelScrolling PROTO_XT_ACTIONS_ARGS; +extern void HandleSoftReset PROTO_XT_ACTIONS_ARGS GCC_NORETURN; +extern void HandleSunFunctionKeys PROTO_XT_ACTIONS_ARGS; +extern void HandleSunKeyboard PROTO_XT_ACTIONS_ARGS; +extern void HandleTekCopy PROTO_XT_ACTIONS_ARGS; +extern void HandleTekPage PROTO_XT_ACTIONS_ARGS; +extern void HandleTekReset PROTO_XT_ACTIONS_ARGS; +extern void HandleTiteInhibit PROTO_XT_ACTIONS_ARGS; +extern void HandleToolbar PROTO_XT_ACTIONS_ARGS; +extern void HandleUTF8Fonts PROTO_XT_ACTIONS_ARGS; +extern void HandleUTF8Mode PROTO_XT_ACTIONS_ARGS; +extern void HandleUTF8Title PROTO_XT_ACTIONS_ARGS; +extern void HandleVisibility PROTO_XT_ACTIONS_ARGS; +extern void HandleWriteError PROTO_XT_ACTIONS_ARGS; +extern void HandleWriteNow PROTO_XT_ACTIONS_ARGS; + +extern void SetupMenus (Widget /*shell*/, Widget */*forms*/, Widget */*menus*/, Dimension * /*menu_high*/); + +#if OPT_TOOLBAR +extern void ShowToolbar(Bool); +#endif + +/* + * The following definitions MUST match the order of entries given in + * the mainMenuEntries, vtMenuEntries, and tekMenuEntries arrays in menu.c. + */ + +/* + * items in primary menu + */ +typedef enum { +#if OPT_TOOLBAR + mainMenu_toolbar, +#endif +#if OPT_MAXIMIZE + mainMenu_fullscreen, +#endif + mainMenu_securekbd, + mainMenu_allowsends, + mainMenu_redraw, + mainMenu_line1, +#ifdef ALLOWLOGGING + mainMenu_logging, +#endif +#if OPT_PRINT_ON_EXIT + mainMenu_write_now, + mainMenu_write_error, +#endif + mainMenu_print, + mainMenu_print_redir, +#if OPT_SCREEN_DUMPS + mainMenu_dump_html, + mainMenu_dump_svg, +#endif + mainMenu_line2, + mainMenu_8bit_ctrl, + mainMenu_backarrow, +#if OPT_NUM_LOCK + mainMenu_num_lock, + mainMenu_alt_esc, + mainMenu_meta_esc, +#endif + mainMenu_delete_del, + mainMenu_old_fkeys, +#if OPT_TCAP_FKEYS + mainMenu_tcap_fkeys, +#endif +#if OPT_HP_FUNC_KEYS + mainMenu_hp_fkeys, +#endif +#if OPT_SCO_FUNC_KEYS + mainMenu_sco_fkeys, +#endif +#if OPT_SUN_FUNC_KEYS + mainMenu_sun_fkeys, +#endif +#if OPT_SUNPC_KBD + mainMenu_sun_kbd, +#endif + mainMenu_line3, + mainMenu_suspend, + mainMenu_continue, + mainMenu_interrupt, + mainMenu_hangup, + mainMenu_terminate, + mainMenu_kill, + mainMenu_line4, + mainMenu_quit, + mainMenu_LAST +} mainMenuIndices; + + +/* + * items in vt100 mode menu + */ +typedef enum { + vtMenu_scrollbar, + vtMenu_jumpscroll, + vtMenu_reversevideo, + vtMenu_autowrap, + vtMenu_reversewrap, + vtMenu_autolinefeed, + vtMenu_appcursor, + vtMenu_appkeypad, + vtMenu_scrollkey, + vtMenu_scrollttyoutput, + vtMenu_allow132, + vtMenu_keepSelection, +#if OPT_MENU_KEEPCLIPBOARD + vtMenu_keepClipboard, +#endif + vtMenu_selectToClipboard, + vtMenu_visualbell, + vtMenu_bellIsUrgent, + vtMenu_poponbell, +#if OPT_BLINK_CURS + vtMenu_cursorblink, +#endif + vtMenu_titeInhibit, +#ifndef NO_ACTIVE_ICON + vtMenu_activeicon, +#endif /* NO_ACTIVE_ICON */ + vtMenu_line1, + vtMenu_softreset, + vtMenu_hardreset, + vtMenu_clearsavedlines, + vtMenu_line2, +#if OPT_TEK4014 + vtMenu_tekshow, + vtMenu_tekmode, + vtMenu_vthide, +#endif + vtMenu_altscreen, +#if OPT_SIXEL_GRAPHICS + vtMenu_sixelscrolling, +#endif +#if OPT_GRAPHICS + vtMenu_privatecolorregisters, +#endif + vtMenu_LAST +} vtMenuIndices; + +/* + * items in vt100 font menu + */ +typedef enum { + fontMenu_default, + fontMenu_font1, + fontMenu_font2, + fontMenu_font3, + fontMenu_font4, + fontMenu_font5, + fontMenu_font6, +#define fontMenu_lastBuiltin fontMenu_font6 + fontMenu_fontescape, + fontMenu_fontsel, +/* number of non-line items down to here should match NMENUFONTS in ptyx.h */ + +#if OPT_DEC_CHRSET || OPT_BOX_CHARS || OPT_DEC_SOFTFONT + fontMenu_line1, + fontMenu_allowBoldFonts, +#if OPT_BOX_CHARS + fontMenu_font_boxchars, + fontMenu_font_packedfont, +#endif +#if OPT_DEC_CHRSET + fontMenu_font_doublesize, +#endif +#if OPT_DEC_SOFTFONT + fontMenu_font_loadable, +#endif +#endif + +#if OPT_RENDERFONT || OPT_WIDE_CHARS + fontMenu_line2, +#if OPT_RENDERFONT + fontMenu_render_font, +#endif +#if OPT_WIDE_CHARS + fontMenu_utf8_mode, + fontMenu_utf8_fonts, + fontMenu_utf8_title, +#endif +#endif +#if OPT_ALLOW_XXX_OPS + fontMenu_line3, + fontMenu_allowColorOps, + fontMenu_allowFontOps, + fontMenu_allowMouseOps, + fontMenu_allowTcapOps, + fontMenu_allowTitleOps, + fontMenu_allowWindowOps, +#endif + + fontMenu_LAST +} fontMenuIndices; + +/* + * items in tek4014 mode menu + */ +#if OPT_TEK4014 +typedef enum { + tekMenu_tektextlarge, + tekMenu_tektext2, + tekMenu_tektext3, + tekMenu_tektextsmall, + tekMenu_line1, + tekMenu_tekpage, + tekMenu_tekreset, + tekMenu_tekcopy, + tekMenu_line2, + tekMenu_vtshow, + tekMenu_vtmode, + tekMenu_tekhide, + tekMenu_LAST +} tekMenuIndices; +#endif + + +/* + * functions for updating menus + */ + +extern void SetItemSensitivity(Widget mi, Bool val); + +typedef enum { + toggleErr = -2, + toggleAll = -1, + toggleOff = 0, + toggleOn = 1 +} ToggleEnum; + +extern int decodeToggle(XtermWidget /* xw */, String * /* params */, Cardinal /* nparams */); + +/* + * there should be one of each of the following for each checkable item + */ +#if OPT_TOOLBAR +extern void update_toolbar(void); +#else +#define update_toolbar() /* nothing */ +#endif + +#if OPT_MAXIMIZE +extern void update_fullscreen(void); +#else +#define update_fullscreen() /* nothing */ +#endif + +extern void update_securekbd(void); +extern void update_allowsends(void); + +#ifdef ALLOWLOGGING +extern void update_logging(void); +#else +#define update_logging() /*nothing*/ +#endif + +#if OPT_PRINT_ON_EXIT +extern void update_write_error(void); +#else +#define update_write_error() /*nothing*/ +#endif + +extern void update_print_redir(void); +extern void update_8bit_control(void); +extern void update_decbkm(void); + +#if OPT_NUM_LOCK +extern void update_num_lock(void); +extern void update_alt_esc(void); +extern void update_meta_esc(void); +#else +#define update_num_lock() /*nothing*/ +#define update_alt_esc() /*nothing*/ +#define update_meta_esc() /*nothing*/ +#endif + +extern void update_old_fkeys(void); +extern void update_delete_del(void); + +#if OPT_SUNPC_KBD +extern void update_sun_kbd(void); +#endif + +#if OPT_HP_FUNC_KEYS +extern void update_hp_fkeys(void); +#else +#define update_hp_fkeys() /*nothing*/ +#endif + +#if OPT_SCO_FUNC_KEYS +extern void update_sco_fkeys(void); +#else +#define update_sco_fkeys() /*nothing*/ +#endif + +#if OPT_SUN_FUNC_KEYS +extern void update_sun_fkeys(void); +#else +#define update_sun_fkeys() /*nothing*/ +#endif + +#if OPT_TCAP_FKEYS +extern void update_tcap_fkeys(void); +#else +#define update_tcap_fkeys() /*nothing*/ +#endif + +extern void update_scrollbar(void); +extern void update_jumpscroll(void); +extern void update_reversevideo(void); +extern void update_autowrap(void); +extern void update_reversewrap(void); +extern void update_autolinefeed(void); +extern void update_appcursor(void); +extern void update_appkeypad(void); +extern void update_scrollkey(void); +extern void update_keepSelection(void); +extern void update_selectToClipboard(void); +extern void update_scrollttyoutput(void); +extern void update_allow132(void); +extern void update_cursesemul(void); +extern void update_visualbell(void); +extern void update_bellIsUrgent(void); +extern void update_poponbell(void); + +#if OPT_MENU_KEEPCLIPBOARD +extern void update_keepClipboard(void); +#else +#define update_keepClipboard() /* nothing */ +#endif + +#define update_marginbell() /* nothing */ + +#if OPT_LOAD_VTFONTS +extern void update_font_escape(void); +#else +#define update_font_escape() /* nothing */ +#endif + +#if OPT_ALLOW_XXX_OPS +extern void update_menu_allowColorOps(void); +extern void update_menu_allowFontOps(void); +extern void update_menu_allowMouseOps(void); +extern void update_menu_allowTcapOps(void); +extern void update_menu_allowTitleOps(void); +extern void update_menu_allowWindowOps(void); +#endif + +#if OPT_BLINK_CURS +extern void update_cursorblink(void); +#else +#define update_cursorblink() /* nothing */ +#endif + +extern void update_altscreen(void); +extern void update_titeInhibit(void); + +#ifndef NO_ACTIVE_ICON +extern void update_activeicon(void); +#endif /* NO_ACTIVE_ICON */ + +#if OPT_DEC_CHRSET +extern void update_font_doublesize(void); +#else +#define update_font_doublesize() /* nothing */ +#endif + +#if OPT_BOX_CHARS +extern void update_font_boxchars(void); +extern void update_font_packed(void); +#else +#define update_font_boxchars() /* nothing */ +#define update_font_packed() /* nothing */ +#endif + +#if OPT_SIXEL_GRAPHICS +extern void update_decsdm(void); +#else +#define update_decsdm() /* nothing */ +#endif + +#if OPT_GRAPHICS +extern void update_privatecolorregisters(void); +#else +#define update_privatecolorregisters() /* nothing */ +#endif + +#if OPT_DEC_SOFTFONT +extern void update_font_loadable(void); +#else +#define update_font_loadable() /* nothing */ +#endif + +#if OPT_RENDERFONT +extern void update_font_renderfont(void); +#else +#define update_font_renderfont() /* nothing */ +#endif + +#if OPT_WIDE_CHARS +extern void update_font_utf8_mode(void); +extern void update_font_utf8_fonts(void); +extern void update_font_utf8_title(void); +#else +#define update_font_utf8_mode() /* nothing */ +#define update_font_utf8_fonts() /* nothing */ +#define update_font_utf8_title() /* nothing */ +#endif + +#if OPT_TEK4014 +extern void update_tekshow(void); +extern void update_vttekmode(void); +extern void update_vtshow(void); +extern void set_vthide_sensitivity(void); +extern void set_tekhide_sensitivity(void); +#else +#define update_tekshow() /*nothing*/ +#define update_vttekmode() /*nothing*/ +#define update_vtshow() /*nothing*/ +#define set_vthide_sensitivity() /*nothing*/ +#define set_tekhide_sensitivity() /*nothing*/ +#endif + +#if OPT_DEC_CHRSET || OPT_BOX_CHARS || OPT_DEC_SOFTFONT +extern void update_menu_allowBoldFonts(void); +#else +#define update_menu_allowBoldFonts() /*nothing*/ +#endif + +/* + * macros for mapping font size to tekMenu placement + */ +#define FS2MI(n) (n) /* font_size_to_menu_item */ +#define MI2FS(n) (n) /* menu_item_to_font_size */ + +#if OPT_TEK4014 +extern void set_tekfont_menu_item(int n,int val); +#else +#define set_tekfont_menu_item(n,val) /*nothing*/ +#endif + +extern void set_menu_font(int val); + +/* *INDENT-ON* */ + +#endif /* included_menu_h */ diff --git a/ports/xterm/xterm-359/menu.o b/ports/xterm/xterm-359/menu.o new file mode 100644 index 0000000000000000000000000000000000000000..5953c7b29bcc9ac09b22e88677b5521d4f71de4b GIT binary patch literal 319064 zcmeEvc|6oz7x;`ldxc~v6;hfsg%BDFGeuOAh_Z}*iy5+{5n`H@RHSv3c1j{5Qk1PU zp~YHBF^Ni+wE5lp{mxjbr}urIx99i!{qg$r%-ru?&N=tobIv{Y-1D7hyNS6e4;G8z z{$VkOn9(P0Ee0d|m~Z5PfRqTB85ku@shit;iRm#&jl^^UhREQDWm>)&5qwD;puz9b z(LN*Xr%ljy`2DN)vz&JLO%X1qWq|Kt@HZYIh8X=;=q4n%6a0s9OC&N3V4+w5e6V5Z zC;HHKIGf+K^Z&jbKY$MA;zOR$`6KXue8vwj;;a{7FtH^Bi34}B=xC%rpr1oCz7{`# z%z`@yI4xpynGlhFdkj1+Pz%_Mpkau?2Zl6K6+1wgN;AX|6CmvvqQvs|D2)=+mxIRy zWE@&Ex*Ul=R&W51;EP7^@KOa!-B36vVtfhhW~&!KBXO_OK|+Gyl3!Uxz$?}5#g_Q=FWo5zsn_VfAx?5L0+f>Hh>$KZUCc7zwG^l&;-v%h5F=Jwh2>3qVcuw_zd!P)THfN^=wpWda!Oi?Lwv zJ@LXosyQTDaVW-@7_H`XHL^i*M3*UXI)UjC>AZk2NP!eFVT&KYov>V41|^iyNtd+OA64j*;?olTZqsrm|+fdmwax~ghii{Z}f$P?y8ia^GBl;YW zdt$=Hb6|0SxXa-OVoQkhchIK6g|r`)Z(3mtR1t~>DkAh}2w*Tqm2uU|0)xRqwEnn*`zM>qzp8Y%jY5K*^_TF8}`Qn$pl zLFca>viVzJ8NSrDYK%7u+$YqhMp0zM@QFkYd|3Dg;NRr(2NwPT__<&ak@baz ze*peAF8^WSAArBWn?pY=`~&cFxcq^Ie*nHIa3c`@!@@rR--HVv7XAVFZC)JuVPOP5 zrdj9B-TXp>0Ms35jb+PyBF9i9K+Y%h@TPhKD7l z(_jZ8BO3Cxt90ZU8OMn4oCVI8*AicYFR)#SK#{#2k35dqo^=s-5$q4YTYrRxF-|Ii z7ulVV^DAe45VXYDT8aft4?`gW)D#e};NU_O26+av)&Dm)By@h9Qy02bb)EZ3K7hZ= zL1K<>RT9_YA^_%?5{Uyy!2%o_)bO=2C6pyZIzp^Dy?iXI(fM%%IB)FXV$?AQ6G=h% zd}GYs`$PO?EF6H-;%?kpumzw?IELpY_*&2^KC-bULbx2tP_h8pvEdfv9DoADc3t7F zGw1}?963jDfHUIqJuw(942FQABgONuNWn4UB!MZv8)prvi7laSMfE$8f^TcDiAmLRx6#E64e;u<(SB1Cbpjx`k$*LFb|P`%~=td&s0 zclhbvC<0wAl z>CfU@IUXN;9L0w`{Xu+o97{mUf2fP95&VWKfG46sUJ!RJK-xysVXP$_r%gaG5hD*& z6~;B7oC13@8c*p!XI2DbITEqyP ze^!A*5>mb!3n7A&J7NhS(W}Q0jbQsF(GDD{5n@67=Uss-z=0g2P(>O6NWJV($_3a1c_?{x;0b*zy-h$LVN-2FoxO=u&tHAbJlMi zoe{ny(lp@G)Kd8YKmuaN8Cey+FtSBtY?X`!L2+Qpp)I^ckB9a7@QEm4!opW_=EdPK z!Y>BW2XYMu_LqOp_@H=yus;9-IJ6I-VnIhp7;EOo+A3r`%3T;6XFvZo41$#C5YBdr z95DZz`vuN=aM|{M-@o8E6~&2gxphBt*PpYu5#sY1(m@U?`PVJM9 ziE7lSxlhc8cT%yn5-|+0y6cGaZ%Di}`ZJcgkx2i@84ZE}$dVh;OAswG0eT}2HPYT; zWS{yeP5}1paiIe^7$O6MDW#*qPgIrwto-kw5dcK>eH1PtWsC_V`X^$70j?i-p2b^g86F1liSg|pk#=}?Vc+^iduA`v4$n^PG_?Is%gZ==98h|p>&eC=_(uIjBKP+(kxE7o@PCmx|2o(?|3^7N%`2dMOP#yjqdlO{8VCZ>iUVFzr;@~fWbPM+f41-A*1H>E1o{ubv0uCyUGLHL zYI+V9CEp6{^L%jUWEX;7W7hl!d(qO3z=N?M_P$@jlLuN$%ZI@nu>Js^_iy3d2O&6KIYebP@p6Sy&KFK@CU{|*)x98jziZM#xB{|U$iR%?tt-iUZDL&=g;_$ zf$I!L7CeVWy#~%4hJ6Ec8pDns>BUKo?azZ@@BV%NqH+C&Fzk)L?{6^?!bj~7A6sL5 zXViZg$KP%skKFz|?BR}a#Q&nd0pJnf2aHv-AA;UL&hHq?Zx~BuU-?D*H=xg8JUpqg z_x++>tOaR@NiOUyzi9sk>cDsy>u0b2MSFKM(hieg*!W+x8vyBLWCZ|2&z=OD;eNvp z%_3J{wgGu!WNn7SdtZ-fAC>ZA13|U$hsY<6*#vJrTBZ&o@AC zC5m(5RVRV=orgN%ZY*-`3Fi$IR$B(dbzZyz?k@eE13SMBPK~pljHmw_v?f{b)|;IT zy8q1IDNsH$V0+T9+I>M<0wXI6wg+L=A;kdd~oe_A(+tmO(eE?6{ z2yhqP+!CX23jv-X=R3flSTJvPN&E0HfZxo4&vk#1^Aj8gudIIlnXrMV8G~;U>z{MP>AB{%={|6-Ga7YGY5H5_$bMz-(Y7+-400Q-M1PEdu z68NWrx~`pEe~=r``B(WeV|>qF=G&k+e>yCsvu{R>ESsQ|nflj9Pj z49|}E5|DJFi%5?f9V-zN2DUhEq6kO@X#}kaNGrlq5*=LZbFx-A=`JM3I?PC>49uL7 zB=V~OAT(qYNb4{MHK1CF)1L#}C?8rB*sy@xfZ~Bw1a1|`z)=I;5Cl5h0uf#=!){g( zuPuC%h}i``5fWkU3Vj%*?9-lz$6#(1U@S_BRZclk%4jzB)jmT$u8SLvP%U3g(fd>&qrKJ*joSs zpilTF4#tF)!}LZDbawzfx)dAzg_qjdbqI~8piTiYd~9e$6ktF_Va#H%t-lYW**GKl z65Ko&5SFBhAeYq~`@>0y0rvvX%>dmP0ct3bjAfEUMj;H>5EJ&Z;7o`N0;obFG#mp0 z{b7liIM4_VCP0?pX=w?vz7#TNYak|^lSM=aNCP;I>%cssXB^(+OE{>uah3>BXF_Cf zpGFFxS{pstlnEiT zWy1XhIQ}jilGjp5BQzg^Gy_qo{ejZxB^ZhvhiLSW%{^>G&d#vs;vb>Qc57Gu7`liI zUcg3#g=6U9a1(5+f9?NC6eA~JWIu6J1qOZ}*o%MR{~_Fm)6xXNJ5<%i+#b+iNc%rJ zPmIDFIiJu9{yMz&FV6?Rga-ozfAhTYOL*`A|L5Q_c3A^>Xq4=?2Qs(BpU*?Tqz@i| z{~Uejc@eoa{VjP=4#)UfsDJuP`rrZU&(TLKK+a=-?>zZS`rv`>&(RlMfSf;JF!qn| z4~577$KWw`A?M4=e+lpx@&_&Qn7xC0xJ2y3e|)h>K;!yjWN0kB5&MA7U*KPo`+IrR zAAtvAt{z3YYxW{uo=sf&~(lc@%`V0AqMq(;_YzrtnqtXNY zw_oTdx}PCgG=Ib%(+Xg~<7y5h9e?+8)mJh?CAi;nJzfs8m zoyIPrvE$pftb6887_Gm4)hY9Lb(hE@TOBx0@ssQ5}6xcvrx&R^xLb7Xj|9)UY| zCWOHdCITt2r|F_cVvs=sI1d6Ds2M|9jwlBQ2EuKLYx^JpFbNVAKY(KVKDcV*bOkbo zbq|Rlfg8h2F46Q`UFDp3P8LD|{T4CW5JSlx)8Wh*4NC;^%#oB(muQ%5C~<8+L{FlZ z5pO*gATly!E5Kn0x#y>S=ArPz+)0ot3j3fGaZ*>7(_etV3##h$yGRow`UY5X80=&) zNAmB$c?l|^l9A`k^h4_-# zrr!l6#u+LEFZcb5@%|>j4`bnQ)&4Kx=f?Z-C5(d*HAuxcP(qJ|MUm(|9;X9j9HkE3J9+%Iu-oZm&HXGK12i;q(Gyj*v=y8`_~{O8CxO|a}mfTQTH~rhvWiY zut7E~^8~)&710spLKw<6BE6zZ64|df{k_2(+em+6f>bbP0K@u;BnVMj0leUbV2v=) zh#Mdbi0P6a@oz`&CWcM$?WkNwm&q=tKj*%q2Ht5z*M$V=s+5RPNAOfod%#P}01q+^ z^8`(hECA6W%0!C336E$X%*w|iGCYKqGdv_EVuZm!Qgoyc2w^`1-OSPV>#oCqFMR9s z*+=5VazXHb0q+Az#57L;#72L`QVjvL1O!z!65CDLf^Tw5G@|LtV?a_K z!vt&-+c0Qon)~W2n%hNU*a(3o0xyVbAuv#ML^`rY2n#uLBhpPIjiOB@;VaGHzdN!< zx-B8cX%WhTAYsr2kilUGiw~JASRz+YDY5q{FNX=+IZTjO;A_( zKNt^^*E#R=NyIz_IbFX>VCT53qy7{7Ay^~fk4Mc}&S zFYZ1#D}+!p0*41diO4#bEOKQHJYAW+yMS{i2y8dko{tz_VAdsK=OI(3D31#mv*VCj6qm~m#6w9CC2;9vL{uQ` zoz8t*VvN%~&ig~RFA{ifd?nn>P9=gVaIQYl{Sw^Mf!la~nhu6K1KjngLE|Kg2oJm! z{qaZ&UJnO51c9X6OfBQ;1sL$3=dE)V|3{;?0b1&jQ_H{540JF+uYkJOC=WO^LkD84 zgpHxr5h58mI{p@k2_vo(oH1c0ui6+0zd{J`p$HMIKYVbOPl=TR}`Lij;KM{b<|j*yL9FaL*w7cvgPn_qB~@^@TCL{LUe8sO3hfcH9KBmk9nqxd*@ zCl8If^6y062)vGobR455As~sBC{c{Y!Z=<9y2p;)Vc0>S8+f1RF=HZoCrBgb_z&EC zr+V;946nI4DvXJpE}#oMH|_@-!MSMU?rC7L=Wy8BCB@ClV%URyt_hqoVSn9Hc%DPu z7jR%R0!b#(ojfomyB<9OnbTjG)8BwYJBM6!eL+xYq`{thR6-6#qrb+)#RvM1WDbGQ z42;8>GY*~u*ul$D@SUFmn3>}Rp1==cd11`y;8?-MqSSSOn-BL(Dkb7%jpjNjfh$BcFg0Yt(&qqh z2kttd32_KzaGxKE2Y?AFarpidMj$=2IH_k8L+;{$N^!=H3UK6w%O-`me&Dx|Mt)rg zyi*42z%Ldd%tU@&$Sskvg9vJYHLT_QE(eMJiu0Q_$i$&-YaPMZrW_$3YlhHm3kaMF z)DfW(9g&DV1xWzGBKXeKX#5Ygb10vI|69eOn46_2$U$)zL}O6>M&cn<%Tb58D;el9 zCoaY1KAQ@35cR83iL-tR_UInK{4w(+z`DCg9gI36G<2OszVIb%c>rPbes=uJ2s1c| zWzef3#3LBM>yE?h`2ZLyha7s?kndyT*_`P?7LFc-|BZJ{5kO#`KiyBD{O0DLXO@8( z7H2_smc0eMz6S1>k!9w#JKRRvp~uQz{fqWYv>iI7Z2T|UzoG5W?_^K>MY}~Q0w21T z><@WA<3EPBL+_FO5N$`e_ai?>{P90@|2^WO{~>rIUi%+{H{!_uA$TLc{U3ri;_m52s2Khe}LK%@Y5ggchI0XsleZ` zpl;6SDO{v6 ze_$sZ|A(bvOE8-;c#J$o90LOFKm6HRlLLJ*DnZ6n3dP?K<4g9Vu5$7vW84D$eTn{o zo?#eJ>+j}MI`;ak6f0MvK|3FL-H7J1W=ZbOj2N0b7!FXSc57~`^3G{ULpdg@} zodOX^HsnAG#?~ps%0I}H;_2_V*3&n@hin0mVc>_Ae*iTA8i@1d#UnkJl$J39DhgAViXy-t35SaoiT>Jw-V%U`mjOe+c;U^>;-e zdU%3wNUkf{&57zmLCSdKb0PA%2>H}RKDCffZRC?274hUPA=YL$ag;q&efml>_ZOn3?pL#!D5gDk&zfG#Z3o?kcX5| zXh@ObNde0UVJ_m}bMg1_55)Ng1aY1bxTBB0{?s7ym}UwfdF&&EH|80T=?W$R#|OCt z`uq4m8StX|2B1%X%3yL}5IGpI%pc=KrTB*gg7xIoB4t2o84Nje1txKIOwfVhE@ zH#s!G$&~{aJa9@BN~k}T5CI_q~`;c9rv|#{mLCM;GnU80Hv%gcI zD<;@8i0b6yOa@C1KS)9AfN%gw3h)o`_d}{ttj>TCZw%lWndIl;=?p~-fD9&k0@=d^ z`MXh2`S1WR(UOY~*(or{DVXdErw{}s2N4$VjVwnn1rZh}9}3_HnGAqUsBIg7K zhbTd|`%!&yKK?G=05t^%WEki=#R)060!~xNIL{y)C}Dsgn^OIdHCRaw1=9ecGp-_t z>i6R_=!h;6MD6KEB|{AdbW;O>o;&%u167Br?db<626?RcgGC$v2;Uh3j_)u3V9#GR zfJ$CY+fVis4*K8U|2XhJ4*ZV;|Kq^_IPgCX{Eq|wG=;Da&yGH^$)8ft z%;*)EFsL}RCwz_O7~lIu4|pviM{8gc9+>a+)nd&9ewZqqnfh|?QD&z>*DB{3Lkqs!`Hu0J>r@1 zz&6F`HKw}I{n?)Gh%{~Unfs@`X%7t9a=oyiIeO7f&uiiF)dtP4rm+L}23|K?6vDem z$!B^`^47aH`3oW#8y-BMiawKjqb?=>Ecw14rukCdRoa9sor0!a3!k`0`hUwkxtDds zNv_#ld!WfVSu*UV`^D(I*25 zGn&w1_wIi2=0DSm{ha#y`J zF?Cp*nS5;uzO(k9{6J9cvA|T--T~+Jhx}d$91I!e#L7wOUYSp2+f%zn2j03ia-C>8=fuE$95$)Z|=|0(NbM(yA3yRGS)Q6Lf#|&&>O?Dg7kauo$qfo zJy*z=Jn+gw0pC1j{=TzD?4AorU|F&e;buwYX{DAAG0=ARZ zM7=LMeC0vlD~tZvcXcOQQqw)_72nnP?0!G!-TsJqZ2l%MvgeA^0&!iR5-gW#KP-rp z61!CNjBx zO>SNPPafCBzHC2dul*&Nq_Qwm+$Sfm2dUF zz^dacmJCEEWo%O3aC1erI4N6vW%eGT-S@lp^A4-;?Y&_Z^lEkcisK(6&E5w4zK=Vx zkvP;Z_9gy`$@{waBPUMe4^3=)Jw?ec(g=LbT%|i<^4X&?^unW^We%$-ZS!XfY)RQK z)b_I5TS~uRi-mJ?nnm)7wzAG-&mc?U;X_HPsY$A2Ws7X^&*5-;zGmf%!vW$XV?)gi zHB~Biy>~1-UY3?oHe*wp)v7it$2KcMGu0dW*7ZrIw9wSV%Fo-S=~pi7#$8NOzMido zeV6j}3(D6ID-TJf3_NmZT%S^VW#@rCTIrOGIj3E4a}>QNhdekZuG45xTo4nHSh*&5 z8or9$aJW9D&r6B@$g1|@zV!7jq|2&h4w0)~9^O)EF(LGv=>F#2vUw9K@2gbelq+#6 zmF~o(2M3h%l9cn3Rq|$}o62;3%b8_rbPd-vkJQ_c)IN~ZE}qoBC#ijvazxs!>x-Pe z*|nbSG){M1wcgmq9WQcp2OoMLbPcIKWDwxt7muQ!K!#Xcu zsdG-n74k6+QjZ3yn2@9o{#hmI6SKcYbf;C%oW`vNh9^R&m zZ=I-MMp7_asZdT-C|{vaPEsge`FKu}j?7904L@1$V0MgzMh7Q)42$KFDq~h*13SAaCnYt@_0& zo%ggVLk#dXR!_D*(?5Cn>c&Inrz3q9YE`FLo}K@=;pzJ;>=$C%;;dag!p@qO4Raml z%-MP{{rRJ$9Z!hDj_PxC>=%AfXzK}hM%ZyGY1NDTeUdB67xqOs-%#5+FL7)0ybrc& zAM#Dwwp=WGseS&!Ccd&bY)HkyJI=;>wzX>?m8z6^qL~NqZ%FmL*+A+_R=s_R16|Yqb zo18f(=%$HtedE2NgJlCT`CojKn05B|zKN4qB&FApDXz8WC%tYp&1R=#gKnBlqIleI zez(6K+w=`vnO%|Omle&M z66-K6Sn$dAqXHVbgQR1zvr8Gv`iS(9#(yHWk+MA`Z!3?r73w3*A!2vHS^< z%u@s`^I4QJVLRr7!l&7lZj;M5CTkGxc3eH*VO8>JZH2Jl%qe<{y2CJwy1!1HMYz^+ zb(M?e=C5`&;?g3@PuomeEAXY;UhF2k-gY=qPNJ+yZ^#gPK+Kir!V89hkpm)$hx)CmreB)2KrST@XEiJF(Nj{|VS?QDGd8rc>bgf7VGlb`hldtFj>WhO zR#C4+6!djJeKh5`3~?3HNwvvo-aFvyosMevd1LTkz%R3F+cydO&YbgxMbj^;ZaZu7 zk=?P#z2r&3k=B+&4kam>ebXKq&5M!FpMBAvDwjXIYj3$^dWyG!#k)Ii_WICTZIjw) zsf7w9p|*)_w3hQcthfzXdV;$1=$OxfG6(XWJn#Fi%5Q<4PdIxbdZEuA-pv@*6<6+_ zkx;hY;-+t~R=x0cZS9SVGF26(h!THUF z{*>l@t9%S(dKlIBbHCm{GWR`yW9Gw$uZyI&3Y(R?UUPpWc6(J##L=Ba8<$f^ch;XP zm-+I-;i2^Fl(rWKH`s}Fyf`l%dB#bi!Rda5z}2k8xP%*t_$xae2*_7QRQo-@<@w6n zz9M5&MIBFZok*kAvw`e)qV5xy1g2JRGg*`I$?Q_#kcMUa=`R(#Vr*aS%`n%J>3MX? z{oOs^8Od?Z4BRagDk zSWYDK_I>*8iU+5?><7)gk{-wIJ9f8s*R^AYmD5&D&#KzgUiT@idMZ*de)|o6Ksm!e{(44!e^4gs<#*rVi%v9NF zsfu$OW`=p`-n5qD3HRJ^MA&56BzERRxxHf9J8L`7TP7^9D5=2Uww#K6x<_o|mGIIB zmtvOcSkF2&cMH3J=1a{*HVw&(9oOUu3B?+&5sfkS&kf#kSla5|tjRQ%kjZ>wqSWV# zE{I{*oz}S2T(?(1!7)|7-n};YNqXo` z759u|`@gt2+>aW#mS7w5(QWSQ;Lm+?Kljy1FVAmPl@<-TnQ_)5zaw*{`r+BFxhk>e ztKDm4@Zy?-ti(-qvcr;T143tnw3>HYUolq6Sb0ir-CL_F=F4okI_CWg0S|fGpI5o7 zk`vM%NHsmUcPTI7SSaIS<7vYIV{!SY4>+m5EkaGib3(1!lm(vQ zv^PbwyoGc+4=npA(v}dceXLQrQKjRnaPX4p-G`S=#&$>a9X;B5@NKYRn4h@1ppAn} zck(jztT3do@|c)pdboJz6}c@|dv>T|44x`#etLM^+;kDmF;z-au=9RT4n{{K?wVod zs>1w=Dc$?8H`iX__3I-K$ceEu@V9s-V`?6x9Wg$`)Au0le)~L{NTA1r6TAzQ;#BWM z(4tbeWlA~nEl`VF<&c4q^{GvJZAY6iZwD2#ES1%dDLupz!<4299Ko6{XmK>rGcim0 za$%R-r-l2qi-dx8SIUXIE%ehr=7vwxKXz$>M&`U)c2#}uL6h2z2ZL6owRG)rJhrTQ zp`P7C@4##8WrA;N$0hSqa!y_i@>oivSf_pE#gRX4}9TVz2BURE?l@ew#(_Vwx*@cJt@cqqbl^26^1SGua!Ce7sV?8mni>>j=^D^Q8EnFZ?Z zr}gt%W;7iN1Z7JD+YQQ(PabWnnt7#X^VF2tkDc8dkK3+X6Si)jt%`1rzCXWhmE5In z{a4BSVRo@|PxLfb=dQ_2xx8U#|9VDi_10^&FtO7;TSYP#^1n?hBRozqJaWy4ZdP-7 zMxJ+tK-2xtpWU@WtB#00JSOPj%$lZ@9Th6aTOr`KRv=OAUfooJ_JSjLn$Ko!cT7Wx z&n--LR6`QhmG`PN?BfmlXp1VzAL>pr^J;7;(O>fA!QtSlBZ{)#%I6yOf&`? z*xtdoWnaj|O&^agpWXFt1udwbMy|YwDVUw@-7v?0p!!hP)wQi}Ps}|>K6@k7$g$rJ zz~GftOuwPaVt&&HUuxOU+|S<7J+x(6)sbZl3NKZa*SYEJJ@a5e@L3y${w^c+Rr|xP z>Y7#U5^Kagc<0qS|5WPw>fm+PHmX{zka0?F`e?FO^P+gyF>Thd?&J+8Iwa1$>IruH zW>frhfN*)Py4j+4m+yox+(7bK@KTLG=GJzbOUWeOH-;abs+>GUh;oCi%P9exs$E-)-z%}gfEyYOylN%W-=5z$t1q?L)&IV%P26njUVWUYN#x*?k36k70wMBsYEQIN!RJ#k<80QjR$GO6TwEth`UqzqCGAE!Sjs zdH-Qk)%uA7hmG3oT3kXdG-#DvG71*E;;j>Nv}9K3(X#NbP5ZJg-ntYaH+M(|FSy}D zYH8-mQy1SfDk|H(cz*k9=NK7KvOn&Q? z?X6mv?DS+_@O`%@3c(iH-n$%v8npI0RA+k|7ACtq>3wTga!LAWZlZ&Fwzo=f=Dkbn zp61Riv~hW|HXm0dSb;5dvyDSCFHyxF_BpXZ zkG2ivq}nwn4jO-N*9?mzIW03P@Ynf%CMoA=bLs65(d8mL&zZ$dNVw;<@9xe7xdfln zcVk`hbbT8?1spKFGka^2iBp^Z^2OJbHALkv-dQv`-F?3B>`t7cy`|{v$J&!}`_ltb z1?A|CpPgkBk2o*1l0L+qbm)A6R>j$t<9VI2*?jxvIMt@_Ye`wLO615hp@k_sgXTQ< z&^x!G=xoQG(nYspc!1k@`@C=_XL(bDGjCneYRHu-eC+l_@2y>mgC+S%*ju|3 z4)R&v%YuE|FHTH2EqRo z^K$9V(8I@ypT*3o*}b{9Da)w5TW^WezUC=zv*&Gn+yuX>p2i=`Dmh8$EnFbOpP%ur zwB2d0`jSv3A1RRyf~A*Ky4y9JLgKogWEGYM3kh{BPKt|qd+GVU1#`B`b@eKU$x{#4 z@@uQ#9QM2JO|KXhGV>UYGaH>dQ7J3rLJOMwlJl>ynROd<)NNSa*F~OANO|My?2JPXuY9@;+vej zAXeB1Rl#M(#Lk{)w5P*2&jnAvZkeGFblPdltrSlu=6)eyrS9vs_r}a zA-kg0POB$>NPgt#1ft9^B}o6wbVuHd#31P5vIg zdT+O-wo@oN7XUw(q*jf4|$kv2$On zbE;m0&5HV9g8u3U#u4B{pp9Hu)MNL4WiZP@B(ic3LH|?;Pn%uv<5~6b`nL)@XN2t# zUs+yxi4YxHeferjkB&;pTdc^-jT^JiPD@iw^~!s$m)fxVk^MG`%T-p+<#f-bq`HqP z7GG8#c2x4zBkZMIcvWxDOI>(IcfXeH;!eE{trbQ#!!GeP0_IX;{VH)h8@?Sdvcbz; zDimBhi}v=DDZAZ3z1U6jg7w9A*_Ql^u@<2j)4ICU7Kq2ITk)06!U?oZ2$(3jcxbtj zUoVMp!`eZ#EW}Pl;~~kS%Ecz|f?ovj;1Ro<#TvR6i|5P{Nx1RUt0(G{c78iqFSKlj zL&%W(8?t?)t2;Z@XX3<8VFOct>1_59^?o0@+=KUqa%?i6Bu#NV=Fq+G-a5UZll(`- z5BW+@RyRLRuGG~Z?66Q=>)JoJ?|oKpebw4>(T^$}Z(gjdUVx9Rbpqo=g^%?C0r z)Vm{uy7=v$uKRk|?-e|Iq)=oue5KGL{M58l;R!lntE&haq^X_K2FBB0p1(4+U(+&S zebm-1PiIQUEv7uqyOgxpY4@W;#i!-Nw^8bzx$e4VN7|g$7**bctt-FEL{(+bgU!n_1pFprkN zXTEb2SZ4`mvE6Obi&*Z2v%K8`UIKl(Rzb`n0*+S9<24~iqEnRluH>pTYtX~15&Ml6 zu1JflU(}2HR)GDMUhcKp*Bjp_V(iENS=vLMHG|nrxM}oR9GuFRL`4dI=IfMTT1I`Z zZ-{rDlK5bAr@E3@rK`i5<3{*FyzF=GPI5K!E6&AZ51IbY>y=S)UfM zdI=9P))2uv>N9T(uO_C`kr_o8#ES70O!rv8;w3DjP2-aj?vrFKU{VRCQPTwEJhLX= z4`Z(0>3C$mAy2}sqWc6Fv7+niynXoP_J%h_?Gi1zO7)+@ip?LK#o}A`&c9^|pXS8D zK0Q$j`gF^4baX8L|SI5;Pl(ub|z8z8Ng9 z=>Cs}JOz_I1X&I{@r*M#R*Qf)shGzu+V;Y!eg_e2-cHAu3_;5Dybazvr)e(iY_GFs z#wGTsH!jE#zvd{?C&c>Z8zxZ{aN*tRS$a*of)slUc7}IFO%n_g=$uf|gvn`L;Ca@4 zGHb2PHk$`kPY9O0zSuB&fh1>JK+hMoeZJNbwxxvr#Sz%CsxBCT7lI7^w z2L4~_D&n2;(YT^jn9njEb6FCmed-sVEfVR(uoRflJB?EAz2;TaKKU`D`KnN7ywd?& z4-n$g*T5>8T+rujXDsi@Gxo#O&NTn*rZmYYfk!Hy>BGYhxGjt=l8_SkjH$phic2j! zx`Z}~P)IXp8W2(^2Co`cXD%dsp=C?0c{@}~;-teFK9AA26>rOahffmXfd zd1N;4W0V}BbtZEsL4}Y2oKVDh;M2OLBwax4RaMN|*Jo?@pV(~U65t0fqQImge6 zCg7r`@#yh-C|Y?l?WsYw-~;CiHa z?(dA53v9#%UI#&Ic@ID3=u63uc?%4aJ`}Ixk;C3+EH7r3E@jHk^6~RGWLYHU33(W@ z6bT|U8QvDr96pa3Rufn_pf!H{b^;W6pfycVHW(a_-Gm$+=h|*@@2C|s@dZ;{cv-da ztMU%}3D^nbNPFn^0-1g^@#B<6Cv1WG?ZfvkH!h+qX6+?-)5Niv{Jqr8ozs*QI~@V- zhRlu3FHyo#(=Zpr`;@E!QEEf zXTcm~Zko^fvX5BXwn3JnPyuzXqJQ}a@=qb>Txwmv-`rMbl z^H1|56ss-Eja%5h*R11Bh&s(5oHB)KclKf6tpL7itIFf6w(jyC zoToKdEk2klS#0<*&NTU)S;oqcl-Vus+=9>D&y(Ksu2Sstmc$3I1x~gbs_#AACvMOC zCb|C9>q3L>)Q!BfQ$)?Lp_cer@(I}st2#Eg5G;n|><{3U_{G*R*bxd z0}=h{N>z8CgD+#v^nRI(vtw7=+~|0JXAv_rv{coyPet8i7UgntMDs<_9G-K+#+Ry( zEI9czB}2GRqc~B9EcPa>IB{pV{3m0%U3XPakl3%+b}tN1$zGM9_Mv~$tH!EZy%)>>QcdA!^u$7jn1?^8Xvt%J*3E}9PVe256x zUf&;hw|&_|(F>xR);I{pf8RnY!Q#V{ENU&5 zwtVsuULSw?gp!OSUn}1m!9E#aq3nT$DpIu2JnwY#6K+Vn=fla5^I4KiU&1nA-{l1Q zu&e;!TFs&v^2tr;o5)gQDiUr4MDl0~cuZm0G9S?HV!H)yUo_r-f>#=BZF6hnbv-U< z4DrvaNLhK4@33&6G;1F7@&|>>a>Y^94s3U+fumN$-VPb;H%amr!%&kCE}AP+vY+sL z+tKkDt7v-kMx)NI@EeVv6gx>un|8l4a-@6UlMO=BLKD(_HfQcCv+B*bMz5)r?w{<- zn;p8qROWcO%!8L#p0DWgYfWclUYI|z?h0|qaT|9x(I!&FdE4v-G7+1kVt3&OryW>v zMX2abwFg=0;(4-5Zsf@|E+$@@6Ux8qJd0ej_j=dCd$xyKZ_5m1$ZAX#C6{mQaaWUe z(Pm=~$TLo?KmIy$XYc!so0!>GY;P>RpC@{-G{`&ZLfLKp$3~nDsd!;XFPyEz(bRo058_NZfrrf>VXH$}5sr$D3-TshA z=J69(sO0ME;@#REHZRqhb2q20v(5Hss~w|fbAm`¬>D*EI6Y1GznO@GeK=T`rWl z*xjQ>%n0?omyXRe*KPTHBr>Y5EB(r>MmD~-oyYOxlvVlqGSfWDwHC>^m!BBAz3pDQ z*|WTC*Bdi!cJ5SPe!g&$@kL$-X-0WQcy81s0WV>SnDI5<0-1BXthcs1wBuT6ugeyC zX!zn-RQ%&6-QBYbquxZNO1;bqw{<)g0gw(#YMcwn7}ggf1s+Xy22 zJh$@|NN*I!w8$`Wve&$lWOZK=$_zTQ=T3m3jHgG-k)`6LL$*g>GnU;E#nH(%+4qWv zj8BjrJi7YU-j7-Fjday+@VBk#3?zVlIy z>w3vXg~yswGnTkaXsm8y2Th?gDcqI9SlWb#-#KiXI%#fp520|ehbx@Wiq7j?UjVS!edu z8Pvj|4#~(>s<}diR7_92UU}IX#;F?omHMP}LFV(;O``6hpH4PC=Hh&wyt?C%trx#n zFzw*h=}IMD$wdKf^Qg0VGqF9+OtBK+2JqWf?^*rQW5b(i0s%SmsMC3M?2^M0D{no_ zu3sklJjTgOkypn(IqXo>2h83qp@7bL{c1?XQGAK+)%q}jOPH-uSOvY6zRsAqnl(qJ z=F2@_CvXY7^;ncQwso^;fHtmQ^{RZ$nbWOqx8Q>~ZwTf_b%`_0S9Bis6D?{IZLh4Y zaMu1PGNw@0R{Xs#ug*a7=N(Z8G0*T>!q3eFY;S{Jaj(5dOkIg9epbB{IYpZ zZ(_u+F6r9RIk#W_x^a8^(lwg1vNxt4X{vd<@PK<+^VNmy#o{_TOH7|B&^D$vP4k~m zaJ{ZbtO`>-VW{Jy*4=z{YtWK|>?QT?g%|aDYUU4Lx_4jP`nBN#=cmI54H`C{dgm=R zy#1&EHYr2kn%V|+Q zp!huhW1((Opo3z_P}=qS``H$^R5VT`>K~t*f9y`liq@WqCnq;XCEsprT#~%kDB^25 zPpsLl>-pkS?6w{lxVYHLcZt>U%cT^NXBQ62vnSNIh)eZT5Ba`$lJj^C)B4gtn%lgo zl}$d~v&1YESmlRF{%QPAf}gKbJhS(aLB{IG!CtQE(kB~)yOM@!)CLa`(NBjB7A6(z z-v7Mq%q!n{xZs;^Wo8@N<38t{$dMgzU-iLrY3Y5FX;~)5jYbJ?(|2@6=bF-ur1pQf zn4G$_3Ku;zZBDoSesbE`MYbQ8Ru)K~3D+w1DfgETyKG#3(X8Q}pwl$|l`>7!oa|PA zREto-%A@#{FL~a zv~Cy>*jI5iiZ6lL;6ZY2|47*0G~2u>ZoxKP(bj3vhkBPyHv5?0aLaP}`VR^TY-*jy z7k#yD`MA9lv&}76X7Z=LF?w7c=ANVY-1Cdc4Bv?--=`>r->Mxn9#|e1l#-}zDn5<9 zSIB$shvo4p2QmVrJ|92owDkV;$TlXZcTqD;Y_cdtNPyA6a--w_Xo?J zqg!1KP;xR2W9>P#=$t}?=k8-}^{*DOFR3(k_pkG+xNy2?$F7gI>7hjVaM9B zwn<-Rs=!CTY2i0=j96!l$s%*VM1M=zrZlV1R6HHt94^cD4-YymD5Yf7dF%h->YL*;3A#0BGI3^NYvR0b%!zH=n%K4{ zwr$(CC$??d*1q%Y-FtWUpQo$3PS<&=&Z+L|{#BjE(G9t`i&0z?FF3a#x8%<`=LhJi z27k=@?}Dz`pPC?%U>^G zf!S9Dee|FNuf0HZM|%m-ebeh%0A>{QD-?5C4}#wrhE9qHn8@@S=q|7YwYs<%sg0es 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

    |bNI^BiKp&O>jDT*)Sx$`P_yYEMoLR&6q~ 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 E1L?g=G5`Po literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/minstall b/ports/xterm/xterm-359/minstall new file mode 100644 index 0000000..77a1232 --- /dev/null +++ b/ports/xterm/xterm-359/minstall @@ -0,0 +1,173 @@ +#!/bin/sh +# $XTermId: minstall.in,v 1.25 2019/07/19 00:53:57 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2001-2016,2019 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Install manpages, substituting a reasonable section value since XFree86 4.x +# and derived imakes do not use constants... +# +# Parameters: +# $1 = program to invoke as "install" +# $2 = manpage to install +# $3 = final installed-path +# $4 = app-defaults directory +# $5 = app-defaults class +# $6 = application name, normally "xterm" +# $7 = application name transformed +# $8 = pixmap directory +# +# Other values correspond to definitions in xtermcfg.h, and cannot be directly +# modified using "make". They are substituted directly into this script. +# + +# override locale... +LANG=C; export LANG +LANGUAGE=C; export LANGUAGE +LC_ALL=C; export LC_ALL +LC_CTYPE=C; export LC_CTYPE +XTERM_LOCALE=C export XTERM_LOCALE + +# avoid interference by the "man" command. +for p in /bin /usr/bin +do +if test -f $p/cat ; then +MANPAGER=cat; export MANPAGER +PAGER=cat; export PAGER +break +fi +done + +# get parameters +MINSTALL="$1" +OLD_FILE="$2" +END_FILE="$3" +APPS_DIR="$4" +APP_TYPE="$5" +APP_name="$6" +USE_name="$7" +XPMS_DIR="$8" + +suffix=`echo "$END_FILE" | sed -e 's%^.*\.%%'` +NEW_FILE=temp$$ + +MY_MANSECT=$suffix + +# utmp and wtmp have different pathnames on different systems, but there +# are only a few common choices. Note that they may not necessarily appear +# in the same directories. Prefer utmpx/wtmpx to utmp/wtmp, since that's +# the way the configure script is designed. +UTMP_NAME=utmp +UTMP_PATH=/etc +for name in /etc /var/adm /var/run /var/log +do + if test -f $name/utmpx ; then + UTMP_NAME=utmpx + UTMP_PATH=$name + break + elif test -f $name/utmp ; then + UTMP_PATH=$name + break + fi +done +UTMP_PATH=$UTMP_PATH/$UTMP_NAME + +WTMP_NAME=wtmp +WTMP_PATH=/etc +for name in /etc /var/adm /var/run /var/log +do + if test -f $name/wtmpx ; then + WTMP_NAME=wtmpx + WTMP_PATH=$name + break + elif test -f $name/wtmp ; then + WTMP_PATH=$name + break + fi +done +WTMP_PATH=$WTMP_PATH/$WTMP_NAME + +# "X" is usually in the miscellaneous section, along with "undocumented". +# Use that to guess an appropriate section. This relies on having the manpage +# installed. +X_MANPAGE=X +X_MANSECT=`man $X_MANPAGE 2>&1 | grep $X_MANPAGE'([^)]*)' | head -n 1 | tr '\012' '\040' | sed -e 's/^[^0123456789]*\([^) ][^) ]*\).*/\1/'` +test -z "$X_MANSECT" && X_MANSECT=$suffix + +VERSION_H=`echo "$OLD_FILE" | sed -e 's,/[^/]*$,/version.h,' -e s',^[^/]*$,version.h,'` +PATCH_NUM=`fgrep XTERM_PATCH $VERSION_H|sed -e 's/[^0-9]*//g'` +PATCH_YMD=`fgrep XTERM_DATE $VERSION_H|sed -e 's,[^0-9/.-]*,,g'` + +# Make capitalization variants +APP_chr0=`echo "$APP_name" | sed -e 's/^\(.\).*/\1/' | tr '[a-z]' '[A-Z]'` +APP_chr1=`echo "$APP_name" | sed -e 's/^.//'` +APP_Name=${APP_chr0}${APP_chr1} +APP_NAME=`echo "$APP_name" | tr '[a-z]' '[A-Z]'` + +# Provide for renaming in test-builds: +USE_chr0=`echo "$USE_name" | sed -e 's/^\(.\).*/\1/' | tr '[a-z]' '[A-Z]'` +USE_chr1=`echo "$USE_name" | sed -e 's/^.//'` +USE_Name=${USE_chr0}${USE_chr1} +USE_NAME=`echo "$USE_name" | tr '[a-z]' '[A-Z]'` + +sed -e 's%__vendorversion__%"X Window System"%' \ + -e 's%__app_version__%Patch\ \#'$PATCH_NUM% \ + -e 's%__app_date__%'$PATCH_YMD% \ + -e "s%^\.TH [^ ][^ ]*%.TH $USE_NAME%" \ + -e "s%^\.ds N $APP_Name%.ds N $USE_Name%" \ + -e "s%^\.ds n $APP_name%.ds n $USE_name%" \ + -e 's%^'"$APP_name"' \\- %'"$USE_name"' \- %' \ + -e s%__default_termname__%xterm% \ + -e s%__default_termid__%420% \ + -e s%__alt_sends_esc__%False% \ + -e s%__meta_sends_esc__%False% \ + -e s%__backarrow_is_bs__%True% \ + -e s%__backarrow_is_erase__%False% \ + -e s%__delete_is_del__%Maybe% \ + -e s%__double_buffer__%False% \ + -e s%__initial_erase__%False% \ + -e s%__default_class__%$APP_TYPE% \ + -e s%__apploaddir__%$APPS_DIR% \ + -e s%__mansuffix__%$MY_MANSECT%g \ + -e s%__miscmansuffix__%$X_MANSECT%g \ + -e s%__pixmapsdir__%$XPMS_DIR% \ + -e s%fIutmp'\\%fI'$UTMP_NAME'\\%g' \ + -e s%/etc/utmp%$UTMP_PATH%g \ + -e s%fIwtmp'\\%fI'$WTMP_NAME'\\%g' \ + -e s%/etc/wtmp%$WTMP_PATH%g \ + -e 's%/\\(\*\*%/*%g' \ + $OLD_FILE >$NEW_FILE +# diff -u $OLD_FILE $NEW_FILE + +echo "$MINSTALL $OLD_FILE $END_FILE" +eval "$MINSTALL $NEW_FILE $END_FILE" + +rm -f $NEW_FILE diff --git a/ports/xterm/xterm-359/minstall.in b/ports/xterm/xterm-359/minstall.in new file mode 100644 index 0000000..edd5097 --- /dev/null +++ b/ports/xterm/xterm-359/minstall.in @@ -0,0 +1,173 @@ +#!/bin/sh +# $XTermId: minstall.in,v 1.25 2019/07/19 00:53:57 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2001-2016,2019 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Install manpages, substituting a reasonable section value since XFree86 4.x +# and derived imakes do not use constants... +# +# Parameters: +# $1 = program to invoke as "install" +# $2 = manpage to install +# $3 = final installed-path +# $4 = app-defaults directory +# $5 = app-defaults class +# $6 = application name, normally "xterm" +# $7 = application name transformed +# $8 = pixmap directory +# +# Other values correspond to definitions in xtermcfg.h, and cannot be directly +# modified using "make". They are substituted directly into this script. +# + +# override locale... +LANG=C; export LANG +LANGUAGE=C; export LANGUAGE +LC_ALL=C; export LC_ALL +LC_CTYPE=C; export LC_CTYPE +XTERM_LOCALE=C export XTERM_LOCALE + +# avoid interference by the "man" command. +for p in /bin /usr/bin +do +if test -f $p/cat ; then +MANPAGER=cat; export MANPAGER +PAGER=cat; export PAGER +break +fi +done + +# get parameters +MINSTALL="$1" +OLD_FILE="$2" +END_FILE="$3" +APPS_DIR="$4" +APP_TYPE="$5" +APP_name="$6" +USE_name="$7" +XPMS_DIR="$8" + +suffix=`echo "$END_FILE" | sed -e 's%^.*\.%%'` +NEW_FILE=temp$$ + +MY_MANSECT=$suffix + +# utmp and wtmp have different pathnames on different systems, but there +# are only a few common choices. Note that they may not necessarily appear +# in the same directories. Prefer utmpx/wtmpx to utmp/wtmp, since that's +# the way the configure script is designed. +UTMP_NAME=utmp +UTMP_PATH=/etc +for name in /etc /var/adm /var/run /var/log +do + if test -f $name/utmpx ; then + UTMP_NAME=utmpx + UTMP_PATH=$name + break + elif test -f $name/utmp ; then + UTMP_PATH=$name + break + fi +done +UTMP_PATH=$UTMP_PATH/$UTMP_NAME + +WTMP_NAME=wtmp +WTMP_PATH=/etc +for name in /etc /var/adm /var/run /var/log +do + if test -f $name/wtmpx ; then + WTMP_NAME=wtmpx + WTMP_PATH=$name + break + elif test -f $name/wtmp ; then + WTMP_PATH=$name + break + fi +done +WTMP_PATH=$WTMP_PATH/$WTMP_NAME + +# "X" is usually in the miscellaneous section, along with "undocumented". +# Use that to guess an appropriate section. This relies on having the manpage +# installed. +X_MANPAGE=X +X_MANSECT=`man $X_MANPAGE 2>&1 | grep $X_MANPAGE'([^)]*)' | head -n 1 | tr '\012' '\040' | sed -e 's/^[^0123456789]*\([^) ][^) ]*\).*/\1/'` +test -z "$X_MANSECT" && X_MANSECT=$suffix + +VERSION_H=`echo "$OLD_FILE" | sed -e 's,/[^/]*$,/version.h,' -e s',^[^/]*$,version.h,'` +PATCH_NUM=`fgrep XTERM_PATCH $VERSION_H|sed -e 's/[^0-9]*//g'` +PATCH_YMD=`fgrep XTERM_DATE $VERSION_H|sed -e 's,[^0-9/.-]*,,g'` + +# Make capitalization variants +APP_chr0=`echo "$APP_name" | sed -e 's/^\(.\).*/\1/' | tr '[a-z]' '[A-Z]'` +APP_chr1=`echo "$APP_name" | sed -e 's/^.//'` +APP_Name=${APP_chr0}${APP_chr1} +APP_NAME=`echo "$APP_name" | tr '[a-z]' '[A-Z]'` + +# Provide for renaming in test-builds: +USE_chr0=`echo "$USE_name" | sed -e 's/^\(.\).*/\1/' | tr '[a-z]' '[A-Z]'` +USE_chr1=`echo "$USE_name" | sed -e 's/^.//'` +USE_Name=${USE_chr0}${USE_chr1} +USE_NAME=`echo "$USE_name" | tr '[a-z]' '[A-Z]'` + +sed -e 's%__vendorversion__%"X Window System"%' \ + -e 's%__app_version__%Patch\ \#'$PATCH_NUM% \ + -e 's%__app_date__%'$PATCH_YMD% \ + -e "s%^\.TH [^ ][^ ]*%.TH $USE_NAME%" \ + -e "s%^\.ds N $APP_Name%.ds N $USE_Name%" \ + -e "s%^\.ds n $APP_name%.ds n $USE_name%" \ + -e 's%^'"$APP_name"' \\- %'"$USE_name"' \- %' \ + -e s%__default_termname__%@default_TERM@% \ + -e s%__default_termid__%@default_termid@% \ + -e s%__alt_sends_esc__%@alt_sends_esc@% \ + -e s%__meta_sends_esc__%@meta_sends_esc@% \ + -e s%__backarrow_is_bs__%@backarrow_is_bs@% \ + -e s%__backarrow_is_erase__%@backarrow_is_erase@% \ + -e s%__delete_is_del__%@delete_is_del@% \ + -e s%__double_buffer__%@double_buffer@% \ + -e s%__initial_erase__%@initial_erase@% \ + -e s%__default_class__%$APP_TYPE% \ + -e s%__apploaddir__%$APPS_DIR% \ + -e s%__mansuffix__%$MY_MANSECT%g \ + -e s%__miscmansuffix__%$X_MANSECT%g \ + -e s%__pixmapsdir__%$XPMS_DIR% \ + -e s%fIutmp'\\%fI'$UTMP_NAME'\\%g' \ + -e s%/etc/utmp%$UTMP_PATH%g \ + -e s%fIwtmp'\\%fI'$WTMP_NAME'\\%g' \ + -e s%/etc/wtmp%$WTMP_PATH%g \ + -e 's%/\\(\*\*%/*%g' \ + $OLD_FILE >$NEW_FILE +# diff -u $OLD_FILE $NEW_FILE + +echo "$MINSTALL $OLD_FILE $END_FILE" +eval "$MINSTALL $NEW_FILE $END_FILE" + +rm -f $NEW_FILE diff --git a/ports/xterm/xterm-359/misc.c b/ports/xterm/xterm-359/misc.c new file mode 100644 index 0000000..e3dfb77 --- /dev/null +++ b/ports/xterm/xterm-359/misc.c @@ -0,0 +1,7379 @@ +/* $XTermId: misc.c,v 1.952 2020/08/03 23:19:49 tom Exp $ */ + +/* + * Copyright 1999-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#if HAVE_X11_SUNKEYSYM_H +#include +#endif + +#ifdef HAVE_LIBXPM +#include +#endif + +#ifdef HAVE_LANGINFO_CODESET +#include +#endif + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#ifdef VMS +#define XTERM_VMS_LOGFILE "SYS$SCRATCH:XTERM_LOG.TXT" +#ifdef ALLOWLOGFILEEXEC +#undef ALLOWLOGFILEEXEC +#endif +#endif /* VMS */ + +#if USE_DOUBLE_BUFFER +#include +#endif + +#if OPT_WIDE_CHARS +#include +#endif + +#if OPT_TEK4014 +#define OUR_EVENT(event,Type) \ + (event.type == Type && \ + (event.xcrossing.window == XtWindow(XtParent(xw)) || \ + (tekWidget && \ + event.xcrossing.window == XtWindow(XtParent(tekWidget))))) +#else +#define OUR_EVENT(event,Type) \ + (event.type == Type && \ + (event.xcrossing.window == XtWindow(XtParent(xw)))) +#endif + +#define VB_DELAY screen->visualBellDelay +#define EVENT_DELAY TScreenOf(term)->nextEventDelay + +static Boolean xtermAllocColor(XtermWidget, XColor *, const char *); +static Cursor make_hidden_cursor(XtermWidget); + +static char emptyString[] = ""; + +#if OPT_EXEC_XTERM +/* Like readlink(2), but returns a malloc()ed buffer, or NULL on + error; adapted from libc docs */ +static char * +Readlink(const char *filename) +{ + char *buf = NULL; + size_t size = 100; + + for (;;) { + int n; + char *tmp = TypeRealloc(char, size, buf); + if (tmp == NULL) { + free(buf); + return NULL; + } + buf = tmp; + memset(buf, 0, size); + + n = (int) readlink(filename, buf, size); + if (n < 0) { + free(buf); + return NULL; + } + + if ((unsigned) n < size) { + return buf; + } + + size *= 2; + } +} +#endif /* OPT_EXEC_XTERM */ + +static void +Sleep(int msec) +{ + static struct timeval select_timeout; + + select_timeout.tv_sec = 0; + select_timeout.tv_usec = msec * 1000; + select(0, 0, 0, 0, &select_timeout); +} + +static void +selectwindow(XtermWidget xw, int flag) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("selectwindow(%d) flag=%d\n", screen->select, flag)); + +#if OPT_TEK4014 + if (TEK4014_ACTIVE(xw)) { + if (!Ttoggled) + TCursorToggle(tekWidget, TOGGLE); + screen->select |= flag; + if (!Ttoggled) + TCursorToggle(tekWidget, TOGGLE); + } else +#endif + { +#if OPT_INPUT_METHOD + TInput *input = lookupTInput(xw, (Widget) xw); + if (input && input->xic) + XSetICFocus(input->xic); +#endif + + if (screen->cursor_state && CursorMoved(screen)) + HideCursor(); + screen->select |= flag; + if (screen->cursor_state) + ShowCursor(); + } + GetScrollLock(screen); +} + +static void +unselectwindow(XtermWidget xw, int flag) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("unselectwindow(%d) flag=%d\n", screen->select, flag)); + + if (screen->hide_pointer && screen->pointer_mode < pFocused) { + screen->hide_pointer = False; + xtermDisplayCursor(xw); + } + + if (!screen->always_highlight) { +#if OPT_TEK4014 + if (TEK4014_ACTIVE(xw)) { + if (!Ttoggled) + TCursorToggle(tekWidget, TOGGLE); + screen->select &= ~flag; + if (!Ttoggled) + TCursorToggle(tekWidget, TOGGLE); + } else +#endif + { +#if OPT_INPUT_METHOD + TInput *input = lookupTInput(xw, (Widget) xw); + if (input && input->xic) + XUnsetICFocus(input->xic); +#endif + + screen->select &= ~flag; + if (screen->cursor_state && CursorMoved(screen)) + HideCursor(); + if (screen->cursor_state) + ShowCursor(); + } + } +} + +static void +DoSpecialEnterNotify(XtermWidget xw, XEnterWindowEvent *ev) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("DoSpecialEnterNotify(%d)\n", screen->select)); + TRACE_FOCUS(xw, ev); + if (((ev->detail) != NotifyInferior) && + ev->focus && + !(screen->select & FOCUS)) + selectwindow(xw, INWINDOW); +} + +static void +DoSpecialLeaveNotify(XtermWidget xw, XEnterWindowEvent *ev) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("DoSpecialLeaveNotify(%d)\n", screen->select)); + TRACE_FOCUS(xw, ev); + if (((ev->detail) != NotifyInferior) && + ev->focus && + !(screen->select & FOCUS)) + unselectwindow(xw, INWINDOW); +} + +#ifndef XUrgencyHint +#define XUrgencyHint (1L << 8) /* X11R5 does not define */ +#endif + +static void +setXUrgency(XtermWidget xw, Bool enable) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->bellIsUrgent) { + XWMHints *h = XGetWMHints(screen->display, VShellWindow(xw)); + if (h != 0) { + if (enable && !(screen->select & FOCUS)) { + h->flags |= XUrgencyHint; + } else { + h->flags &= ~XUrgencyHint; + } + XSetWMHints(screen->display, VShellWindow(xw), h); + } + } +} + +void +do_xevents(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (xtermAppPending() + || +#if defined(VMS) || defined(__VMS) + screen->display->qlen > 0 +#else + GetBytesAvailable(ConnectionNumber(screen->display)) > 0 +#endif + ) + xevents(xw); +} + +void +xtermDisplayCursor(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->Vshow) { + if (screen->hide_pointer) { + TRACE(("Display hidden_cursor\n")); + XDefineCursor(screen->display, VWindow(screen), screen->hidden_cursor); + } else { + TRACE(("Display pointer_cursor\n")); + recolor_cursor(screen, + screen->pointer_cursor, + T_COLOR(screen, MOUSE_FG), + T_COLOR(screen, MOUSE_BG)); + XDefineCursor(screen->display, VWindow(screen), screen->pointer_cursor); + } + } +} + +void +xtermShowPointer(XtermWidget xw, Bool enable) +{ + static int tried = -1; + TScreen *screen = TScreenOf(xw); + +#if OPT_TEK4014 + if (TEK4014_SHOWN(xw)) + enable = True; +#endif + + /* + * Whether we actually hide the pointer depends on the pointer-mode and + * the mouse-mode: + */ + if (!enable) { + switch (screen->pointer_mode) { + case pNever: + enable = True; + break; + case pNoMouse: + if (screen->send_mouse_pos != MOUSE_OFF) + enable = True; + break; + case pAlways: + case pFocused: + break; + } + } + + if (enable) { + if (screen->hide_pointer) { + screen->hide_pointer = False; + xtermDisplayCursor(xw); + switch (screen->send_mouse_pos) { + case ANY_EVENT_MOUSE: + break; + default: + MotionOff(screen, xw); + break; + } + } + } else if (!(screen->hide_pointer) && (tried <= 0)) { + if (screen->hidden_cursor == 0) { + screen->hidden_cursor = make_hidden_cursor(xw); + } + if (screen->hidden_cursor == 0) { + tried = 1; + } else { + tried = 0; + screen->hide_pointer = True; + xtermDisplayCursor(xw); + MotionOn(screen, xw); + } + } +} + +/* true if p contains q */ +#define ExposeContains(p,q) \ + ((p)->y <= (q)->y \ + && (p)->x <= (q)->x \ + && ((p)->y + (p)->height) >= ((q)->y + (q)->height) \ + && ((p)->x + (p)->width) >= ((q)->x + (q)->width)) + +static XtInputMask +mergeExposeEvents(XEvent *target) +{ + XEvent next_event; + XExposeEvent *p; + + XtAppNextEvent(app_con, target); + p = (XExposeEvent *) target; + + while (XtAppPending(app_con) + && XtAppPeekEvent(app_con, &next_event) + && next_event.type == Expose) { + Boolean merge_this = False; + XExposeEvent *q = (XExposeEvent *) (&next_event); + + XtAppNextEvent(app_con, &next_event); + TRACE_EVENT("pending", &next_event, (String *) 0, 0); + + /* + * If either window is contained within the other, merge the events. + * The traces show that there are also cases where a full repaint of + * a window is broken into 3 or more rectangles, which do not arrive + * in the same instant. We could merge those if xterm were modified + * to skim several events ahead. + */ + if (p->window == q->window) { + if (ExposeContains(p, q)) { + TRACE(("pending Expose...merged forward\n")); + merge_this = True; + next_event = *target; + } else if (ExposeContains(q, p)) { + TRACE(("pending Expose...merged backward\n")); + merge_this = True; + } + } + if (!merge_this) { + XtDispatchEvent(target); + } + *target = next_event; + } + XtDispatchEvent(target); + return XtAppPending(app_con); +} + +/* + * On entry, we have peeked at the event queue and see a configure-notify + * event. Remove that from the queue so we can look further. + * + * Then, as long as there is a configure-notify event in the queue, remove + * that. If the adjacent events are for different windows, process the older + * event and update the event used for comparing windows. If they are for the + * same window, only the newer event is of interest. + * + * Finally, process the (remaining) configure-notify event. + */ +static XtInputMask +mergeConfigureEvents(XEvent *target) +{ + XEvent next_event; + XConfigureEvent *p; + + XtAppNextEvent(app_con, target); + p = (XConfigureEvent *) target; + + if (XtAppPending(app_con) + && XtAppPeekEvent(app_con, &next_event) + && next_event.type == ConfigureNotify) { + Boolean merge_this = False; + XConfigureEvent *q = (XConfigureEvent *) (&next_event); + + XtAppNextEvent(app_con, &next_event); + TRACE_EVENT("pending", &next_event, (String *) 0, 0); + + if (p->window == q->window) { + TRACE(("pending Configure...merged\n")); + merge_this = True; + } + if (!merge_this) { + TRACE(("pending Configure...skipped\n")); + XtDispatchEvent(target); + } + *target = next_event; + } + XtDispatchEvent(target); + return XtAppPending(app_con); +} + +/* + * Work around a bug in the X mouse code, which delivers duplicate events. + */ +static XtInputMask +mergeButtonEvents(XEvent *target) +{ + XEvent next_event; + XButtonEvent *p; + + XtAppNextEvent(app_con, target); + p = (XButtonEvent *) target; + + if (XtAppPending(app_con) + && XtAppPeekEvent(app_con, &next_event) + && !memcmp(target, &next_event, sizeof(XButtonEvent))) { + Boolean merge_this = False; + XButtonEvent *q = (XButtonEvent *) (&next_event); + + XtAppNextEvent(app_con, &next_event); + TRACE_EVENT("pending", &next_event, (String *) 0, 0); + + if (p->window == q->window) { + TRACE(("pending ButtonEvent...merged\n")); + merge_this = True; + } + if (!merge_this) { + TRACE(("pending ButtonEvent...skipped\n")); + XtDispatchEvent(target); + } + *target = next_event; + } + XtDispatchEvent(target); + return XtAppPending(app_con); +} + +/* + * Filter redundant Expose- and ConfigureNotify-events. This is limited to + * adjacent events because there could be other event-loop processing. Absent + * that limitation, it might be possible to scan ahead to find when the screen + * would be completely updated, skipping unnecessary re-repainting before that + * point. + * + * Note: all cases should allow doing XtAppNextEvent if result is true. + */ +XtInputMask +xtermAppPending(void) +{ + XtInputMask result = XtAppPending(app_con); + XEvent this_event; + Boolean found = False; + + while (result && XtAppPeekEvent(app_con, &this_event)) { + found = True; + TRACE_EVENT("pending", &this_event, (String *) 0, 0); + if (this_event.type == Expose) { + result = mergeExposeEvents(&this_event); + } else if (this_event.type == ConfigureNotify) { + result = mergeConfigureEvents(&this_event); + } else if (this_event.type == ButtonPress || + this_event.type == ButtonRelease) { + result = mergeButtonEvents(&this_event); + } else { + break; + } + } + + /* + * With NetBSD, closing a shell results in closing the X input event + * stream, which interferes with the "-hold" option. Wait a short time in + * this case, to avoid max'ing the CPU. + */ + if (hold_screen && caught_intr && !found) { + Sleep(EVENT_DELAY); + } + return result; +} + +void +xevents(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + XEvent event; + XtInputMask input_mask; + + if (need_cleanup) + NormalExit(); + + if (screen->scroll_amt) + FlushScroll(xw); + /* + * process timeouts, relying on the fact that XtAppProcessEvent + * will process the timeout and return without blockng on the + * XEvent queue. Other sources i.e., the pty are handled elsewhere + * with select(). + */ + while ((input_mask = xtermAppPending()) != 0) { + if (input_mask & XtIMTimer) + XtAppProcessEvent(app_con, (XtInputMask) XtIMTimer); +#if OPT_SESSION_MGT + /* + * Session management events are alternative input events. Deal with + * them in the same way. + */ + else if (input_mask & XtIMAlternateInput) + XtAppProcessEvent(app_con, (XtInputMask) XtIMAlternateInput); +#endif + else + break; + } + + /* + * If there are no XEvents, don't wait around... + */ + if ((input_mask & XtIMXEvent) != XtIMXEvent) + return; + do { + /* + * This check makes xterm hang when in mouse hilite tracking mode. + * We simply ignore all events except for those not passed down to + * this function, e.g., those handled in in_put(). + */ + if (screen->waitingForTrackInfo) { + Sleep(EVENT_DELAY); + return; + } + XtAppNextEvent(app_con, &event); + /* + * Hack to get around problems with the toolkit throwing away + * eventing during the exclusive grab of the menu popup. By + * looking at the event ourselves we make sure that we can + * do the right thing. + */ + if (OUR_EVENT(event, EnterNotify)) { + DoSpecialEnterNotify(xw, &event.xcrossing); + } else if (OUR_EVENT(event, LeaveNotify)) { + DoSpecialLeaveNotify(xw, &event.xcrossing); + } else if (event.xany.type == MotionNotify + && event.xcrossing.window == XtWindow(xw)) { + switch (screen->send_mouse_pos) { + case ANY_EVENT_MOUSE: +#if OPT_DEC_LOCATOR + case DEC_LOCATOR: +#endif /* OPT_DEC_LOCATOR */ + SendMousePosition(xw, &event); + xtermShowPointer(xw, True); + continue; + case BTN_EVENT_MOUSE: + SendMousePosition(xw, &event); + xtermShowPointer(xw, True); + } + } + + /* + * If the event is interesting (and not a keyboard event), turn the + * mouse pointer back on. + */ + if (screen->hide_pointer) { + if (screen->pointer_mode >= pFocused) { + switch (event.xany.type) { + case MotionNotify: + xtermShowPointer(xw, True); + break; + } + } else { + switch (event.xany.type) { + case KeyPress: + case KeyRelease: + case ButtonPress: + case ButtonRelease: + /* also these... */ + case Expose: + case GraphicsExpose: + case NoExpose: + case PropertyNotify: + case ClientMessage: + break; + default: + xtermShowPointer(xw, True); + break; + } + } + } + + if (!event.xany.send_event || + screen->allowSendEvents || + ((event.xany.type != KeyPress) && + (event.xany.type != KeyRelease) && + (event.xany.type != ButtonPress) && + (event.xany.type != ButtonRelease))) { + + if (event.xany.type == MappingNotify) { + XRefreshKeyboardMapping(&(event.xmapping)); + VTInitModifiers(xw); + } + XtDispatchEvent(&event); + } + } while (xtermAppPending() & XtIMXEvent); +} + +static Cursor +make_hidden_cursor(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Cursor c; + Display *dpy = screen->display; + XFontStruct *fn; + + static XColor dummy; + + /* + * Prefer nil2 (which is normally available) to "fixed" (which is supposed + * to be "always" available), since it's a smaller glyph in case the + * server insists on drawing _something_. + */ + TRACE(("Ask for nil2 font\n")); + if ((fn = XLoadQueryFont(dpy, "nil2")) == 0) { + TRACE(("...Ask for fixed font\n")); + fn = XLoadQueryFont(dpy, DEFFONT); + } + + if (fn != 0) { + /* a space character seems to work as a cursor (dots are not needed) */ + c = XCreateGlyphCursor(dpy, fn->fid, fn->fid, 'X', ' ', &dummy, &dummy); + XFreeFont(dpy, fn); + } else { + c = 0; + } + TRACE(("XCreateGlyphCursor ->%#lx\n", c)); + return (c); +} + +/* + * Xlib uses Xcursor to customize cursor coloring, which interferes with + * xterm's pointerColor resource. Work around this by providing our own + * default theme. Testing seems to show that we only have to provide this + * until the window is initialized. + */ +void +init_colored_cursor(Display *dpy) +{ +#ifdef HAVE_LIB_XCURSOR + static const char theme[] = "index.theme"; + static const char pattern[] = "xtermXXXXXX"; + char *env = getenv("XCURSOR_THEME"); + + xterm_cursor_theme = 0; + /* + * The environment variable overrides a (possible) resource Xcursor.theme + */ + if (IsEmpty(env)) { + env = XGetDefault(dpy, "Xcursor", "theme"); + } + /* + * If neither found, provide our own default theme. + */ + if (IsEmpty(env)) { + const char *tmp_dir; + char *filename; + size_t needed; + + if ((tmp_dir = getenv("TMPDIR")) == 0) { + tmp_dir = P_tmpdir; + } + needed = strlen(tmp_dir) + 4 + strlen(theme) + strlen(pattern); + if ((filename = malloc(needed)) != 0) { + sprintf(filename, "%s/%s", tmp_dir, pattern); + +#ifdef HAVE_MKDTEMP + xterm_cursor_theme = mkdtemp(filename); +#else + if (mktemp(filename) != 0 + && mkdir(filename, 0700) == 0) { + xterm_cursor_theme = filename; + } +#endif + if (xterm_cursor_theme != filename) + free(filename); + /* + * Actually, Xcursor does what _we_ want just by steering its + * search path away from home. We are setting up the complete + * theme just in case the library ever acquires a maintainer. + */ + if (xterm_cursor_theme != 0) { + char *leaf = xterm_cursor_theme + strlen(xterm_cursor_theme); + FILE *fp; + + strcat(leaf, "/"); + strcat(leaf, theme); + if ((fp = fopen(xterm_cursor_theme, "w")) != 0) { + fprintf(fp, "[Icon Theme]\n"); + fclose(fp); + *leaf = '\0'; + xtermSetenv("XCURSOR_PATH", xterm_cursor_theme); + *leaf = '/'; + } + atexit(cleanup_colored_cursor); + } + } + } +#else + (void) dpy; +#endif /* HAVE_LIB_XCURSOR */ +} + +/* + * Once done, discard the file and directory holding it. + */ +void +cleanup_colored_cursor(void) +{ +#ifdef HAVE_LIB_XCURSOR + if (xterm_cursor_theme != 0) { + char *my_path = getenv("XCURSOR_PATH"); + struct stat sb; + if (!IsEmpty(my_path) + && stat(my_path, &sb) == 0 + && (sb.st_mode & S_IFMT) == S_IFDIR) { + unlink(xterm_cursor_theme); + rmdir(my_path); + free(xterm_cursor_theme); + xterm_cursor_theme = 0; + } + } +#endif /* HAVE_LIB_XCURSOR */ +} + +Cursor +make_colored_cursor(unsigned cursorindex, /* index into font */ + unsigned long fg, /* pixel value */ + unsigned long bg) /* pixel value */ +{ + TScreen *screen = TScreenOf(term); + Cursor c; + Display *dpy = screen->display; + + c = XCreateFontCursor(dpy, cursorindex); + if (c != None) { + recolor_cursor(screen, c, fg, bg); + } + return (c); +} + +/* ARGSUSED */ +void +HandleKeyPressed(Widget w GCC_UNUSED, + XEvent *event, + String *params GCC_UNUSED, + Cardinal *nparams GCC_UNUSED) +{ + TRACE(("Handle insert-seven-bit for %p\n", (void *) w)); + Input(term, &event->xkey, False); +} + +/* ARGSUSED */ +void +HandleEightBitKeyPressed(Widget w GCC_UNUSED, + XEvent *event, + String *params GCC_UNUSED, + Cardinal *nparams GCC_UNUSED) +{ + TRACE(("Handle insert-eight-bit for %p\n", (void *) w)); + Input(term, &event->xkey, True); +} + +/* ARGSUSED */ +void +HandleStringEvent(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *nparams) +{ + + if (*nparams != 1) + return; + + if ((*params)[0] == '0' && (*params)[1] == 'x' && (*params)[2] != '\0') { + const char *abcdef = "ABCDEF"; + const char *xxxxxx; + Char c; + UString p; + unsigned value = 0; + + for (p = (UString) (*params + 2); (c = CharOf(x_toupper(*p))) != + '\0'; p++) { + value *= 16; + if (c >= '0' && c <= '9') + value += (unsigned) (c - '0'); + else if ((xxxxxx = (strchr) (abcdef, c)) != 0) + value += (unsigned) (xxxxxx - abcdef) + 10; + else + break; + } + if (c == '\0') { + Char hexval[2]; + hexval[0] = (Char) value; + hexval[1] = 0; + StringInput(term, hexval, (size_t) 1); + } + } else { + StringInput(term, (const Char *) *params, strlen(*params)); + } +} + +#if OPT_EXEC_XTERM + +#ifndef PROCFS_ROOT +#define PROCFS_ROOT "/proc" +#endif + +/* + * Determine the current working directory of the child so that we can + * spawn a new terminal in the same directory. + * + * If we cannot get the CWD of the child, just use our own. + */ +char * +ProcGetCWD(pid_t pid) +{ + char *child_cwd = NULL; + + if (pid) { + char child_cwd_link[sizeof(PROCFS_ROOT) + 80]; + sprintf(child_cwd_link, PROCFS_ROOT "/%lu/cwd", (unsigned long) pid); + child_cwd = Readlink(child_cwd_link); + } + return child_cwd; +} + +/* ARGSUSED */ +void +HandleSpawnTerminal(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *nparams) +{ + TScreen *screen = TScreenOf(term); + char *child_cwd = NULL; + char *child_exe; + pid_t pid; + + /* + * Try to find the actual program which is running in the child process. + * This works for Linux. If we cannot find the program, fall back to the + * xterm program (which is usually adequate). Give up if we are given only + * a relative path to xterm, since that would not always match $PATH. + */ + child_exe = Readlink(PROCFS_ROOT "/self/exe"); + if (!child_exe) { + if (strncmp(ProgramName, "./", (size_t) 2) + && strncmp(ProgramName, "../", (size_t) 3)) { + child_exe = xtermFindShell(ProgramName, True); + } else { + xtermWarning("Cannot exec-xterm given \"%s\"\n", ProgramName); + } + if (child_exe == 0) + return; + } + + child_cwd = ProcGetCWD(screen->pid); + + /* The reaper will take care of cleaning up the child */ + pid = fork(); + if (pid == -1) { + xtermWarning("Could not fork: %s\n", SysErrorMsg(errno)); + } else if (!pid) { + /* We are the child */ + if (child_cwd) { + IGNORE_RC(chdir(child_cwd)); /* We don't care if this fails */ + } + + if (setuid(screen->uid) == -1 + || setgid(screen->gid) == -1) { + xtermWarning("Cannot reset uid/gid\n"); + } else { + unsigned myargc = *nparams + 1; + char **myargv = TypeMallocN(char *, myargc + 1); + + if (myargv != 0) { + unsigned n = 0; + + myargv[n++] = child_exe; + + while (n < myargc) { + myargv[n++] = (char *) *params++; + } + + myargv[n] = 0; + execv(child_exe, myargv); + } + + /* If we get here, we've failed */ + xtermWarning("exec of '%s': %s\n", child_exe, SysErrorMsg(errno)); + } + _exit(0); + } + + /* We are the parent; clean up */ + if (child_cwd) + free(child_cwd); + free(child_exe); +} +#endif /* OPT_EXEC_XTERM */ + +/* + * Rather than sending characters to the host, put them directly into our + * input queue. That lets a user have access to any of the control sequences + * for a key binding. This is the equivalent of local function key support. + * + * NOTE: This code does not support the hexadecimal kludge used in + * HandleStringEvent because it prevents us from sending an arbitrary string + * (but it appears in a lot of examples - so we are stuck with it). The + * standard string converter does recognize "\" for newline ("\n") and for + * octal constants (e.g., "\007" for BEL). So we assume the user can make do + * without a specialized converter. (Don't try to use \000, though). + */ +/* ARGSUSED */ +void +HandleInterpret(Widget w GCC_UNUSED, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + if (*param_count == 1) { + const char *value = params[0]; + int need = (int) strlen(value); + int used = (int) (VTbuffer->next - VTbuffer->buffer); + int have = (int) (VTbuffer->last - VTbuffer->buffer); + + if (have - used + need < BUF_SIZE) { + + fillPtyData(term, VTbuffer, value, (int) strlen(value)); + + TRACE(("Interpret %s\n", value)); + VTbuffer->update++; + } + } +} + +/*ARGSUSED*/ +void +HandleEnterWindow(Widget w GCC_UNUSED, + XtPointer eventdata GCC_UNUSED, + XEvent *event GCC_UNUSED, + Boolean *cont GCC_UNUSED) +{ + /* NOP since we handled it above */ + TRACE(("HandleEnterWindow ignored\n")); + TRACE_FOCUS(w, event); +} + +/*ARGSUSED*/ +void +HandleLeaveWindow(Widget w GCC_UNUSED, + XtPointer eventdata GCC_UNUSED, + XEvent *event GCC_UNUSED, + Boolean *cont GCC_UNUSED) +{ + /* NOP since we handled it above */ + TRACE(("HandleLeaveWindow ignored\n")); + TRACE_FOCUS(w, event); +} + +/*ARGSUSED*/ +void +HandleFocusChange(Widget w GCC_UNUSED, + XtPointer eventdata GCC_UNUSED, + XEvent *ev, + Boolean *cont GCC_UNUSED) +{ + XFocusChangeEvent *event = (XFocusChangeEvent *) ev; + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + TRACE(("HandleFocusChange type=%s, mode=%s, detail=%s\n", + visibleEventType(event->type), + visibleNotifyMode(event->mode), + visibleNotifyDetail(event->detail))); + TRACE_FOCUS(xw, event); + + if (screen->quiet_grab + && (event->mode == NotifyGrab || event->mode == NotifyUngrab)) { + /* EMPTY */ ; + } else if (event->type == FocusIn) { + if (event->detail != NotifyPointer) { + setXUrgency(xw, False); + } + + /* + * NotifyNonlinear only happens (on FocusIn) if the pointer was not in + * one of our windows. Use this to reset a case where one xterm is + * partly obscuring another, and X gets (us) confused about whether the + * pointer was in the window. In particular, this can happen if the + * user is resizing the obscuring window, causing some events to not be + * delivered to the obscured window. + */ + if (event->detail == NotifyNonlinear + && (screen->select & INWINDOW) != 0) { + unselectwindow(xw, INWINDOW); + } + selectwindow(xw, + ((event->detail == NotifyPointer) + ? INWINDOW + : FOCUS)); + SendFocusButton(xw, event); + } else { +#if OPT_FOCUS_EVENT + if (event->type == FocusOut) { + SendFocusButton(xw, event); + } +#endif + /* + * XGrabKeyboard() will generate NotifyGrab event that we want to + * ignore. + */ + if (event->mode != NotifyGrab) { + unselectwindow(xw, + ((event->detail == NotifyPointer) + ? INWINDOW + : FOCUS)); + } + if (screen->grabbedKbd && (event->mode == NotifyUngrab)) { + Bell(xw, XkbBI_Info, 100); + ReverseVideo(xw); + screen->grabbedKbd = False; + update_securekbd(); + } + } +} + +static long lastBellTime; /* in milliseconds */ + +#if defined(HAVE_XKB_BELL_EXT) +static Atom +AtomBell(XtermWidget xw, int which) +{ +#define DATA(name) { XkbBI_##name, XkbBN_##name } + static struct { + int value; + const char *name; + } table[] = { + DATA(Info), + DATA(MarginBell), + DATA(MinorError), + DATA(TerminalBell) + }; +#undef DATA + Cardinal n; + Atom result = None; + + for (n = 0; n < XtNumber(table); ++n) { + if (table[n].value == which) { + result = XInternAtom(XtDisplay(xw), table[n].name, False); + break; + } + } + return result; +} +#endif + +void +xtermBell(XtermWidget xw, int which, int percent) +{ + TScreen *screen = TScreenOf(xw); +#if defined(HAVE_XKB_BELL_EXT) + Atom tony = AtomBell(xw, which); +#endif + + switch (which) { + case XkbBI_Info: + case XkbBI_MinorError: + case XkbBI_MajorError: + case XkbBI_TerminalBell: + switch (screen->warningVolume) { + case bvOff: + percent = -100; + break; + case bvLow: + break; + case bvHigh: + percent = 100; + break; + } + break; + case XkbBI_MarginBell: + switch (screen->marginVolume) { + case bvOff: + percent = -100; + break; + case bvLow: + break; + case bvHigh: + percent = 100; + break; + } + break; + default: + break; + } + +#if defined(HAVE_XKB_BELL_EXT) + if (tony != None) { + XkbBell(screen->display, VShellWindow(xw), percent, tony); + } else +#endif + XBell(screen->display, percent); +} + +void +Bell(XtermWidget xw, int which, int percent) +{ + TScreen *screen = TScreenOf(xw); + struct timeval curtime; + + TRACE(("BELL %d %d%%\n", which, percent)); + if (!XtIsRealized((Widget) xw)) { + return; + } + + setXUrgency(xw, True); + + /* has enough time gone by that we are allowed to ring + the bell again? */ + if (screen->bellSuppressTime) { + long now_msecs; + + if (screen->bellInProgress) { + do_xevents(xw); + if (screen->bellInProgress) { /* even after new events? */ + return; + } + } + X_GETTIMEOFDAY(&curtime); + now_msecs = 1000 * curtime.tv_sec + curtime.tv_usec / 1000; + if (lastBellTime != 0 && now_msecs - lastBellTime >= 0 && + now_msecs - lastBellTime < screen->bellSuppressTime) { + return; + } + lastBellTime = now_msecs; + } + + if (screen->visualbell) { + VisualBell(); + } else { + xtermBell(xw, which, percent); + } + + if (screen->poponbell) + XRaiseWindow(screen->display, VShellWindow(xw)); + + if (screen->bellSuppressTime) { + /* now we change a property and wait for the notify event to come + back. If the server is suspending operations while the bell + is being emitted (problematic for audio bell), this lets us + know when the previous bell has finished */ + Widget w = CURRENT_EMU(); + XChangeProperty(XtDisplay(w), XtWindow(w), + XA_NOTICE, XA_NOTICE, 8, PropModeAppend, NULL, 0); + screen->bellInProgress = True; + } +} + +static void +flashWindow(TScreen *screen, Window window, GC visualGC, unsigned width, unsigned height) +{ + int y = 0; + int x = 0; + + if (screen->flash_line) { + y = CursorY(screen, screen->cur_row); + height = (unsigned) FontHeight(screen); + } + XFillRectangle(screen->display, window, visualGC, x, y, width, height); + XFlush(screen->display); + Sleep(VB_DELAY); + XFillRectangle(screen->display, window, visualGC, x, y, width, height); +} + +void +VisualBell(void) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + if (VB_DELAY > 0) { + Pixel xorPixel = (T_COLOR(screen, TEXT_FG) ^ + T_COLOR(screen, TEXT_BG)); + XGCValues gcval; + GC visualGC; + + gcval.function = GXxor; + gcval.foreground = xorPixel; + visualGC = XtGetGC((Widget) xw, GCFunction + GCForeground, &gcval); +#if OPT_TEK4014 + if (TEK4014_ACTIVE(xw)) { + TekScreen *tekscr = TekScreenOf(tekWidget); + flashWindow(screen, TWindow(tekscr), visualGC, + TFullWidth(tekscr), + TFullHeight(tekscr)); + } else +#endif + { + flashWindow(screen, VWindow(screen), visualGC, + FullWidth(screen), + FullHeight(screen)); + } + XtReleaseGC((Widget) xw, visualGC); + } +} + +/* ARGSUSED */ +void +HandleBellPropertyChange(Widget w GCC_UNUSED, + XtPointer data GCC_UNUSED, + XEvent *ev, + Boolean *more GCC_UNUSED) +{ + TScreen *screen = TScreenOf(term); + + if (ev->xproperty.atom == XA_NOTICE) { + screen->bellInProgress = False; + } +} + +void +xtermWarning(const char *fmt, ...) +{ + int save_err = errno; + va_list ap; + + fflush(stdout); + +#if OPT_TRACE + va_start(ap, fmt); + Trace("xtermWarning: "); + TraceVA(fmt, ap); + va_end(ap); +#endif + + fprintf(stderr, "%s: ", ProgramName); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + (void) fflush(stderr); + + va_end(ap); + errno = save_err; +} + +void +xtermPerror(const char *fmt, ...) +{ + int save_err = errno; + char *msg = strerror(errno); + va_list ap; + + fflush(stdout); + +#if OPT_TRACE + va_start(ap, fmt); + Trace("xtermPerror: "); + TraceVA(fmt, ap); + va_end(ap); +#endif + + fprintf(stderr, "%s: ", ProgramName); + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + fprintf(stderr, ": %s\n", msg); + (void) fflush(stderr); + + va_end(ap); + errno = save_err; +} + +Window +WMFrameWindow(XtermWidget xw) +{ + Window win_root, win_current, *children; + Window win_parent = 0; + unsigned int nchildren; + + win_current = XtWindow(xw); + + /* find the parent which is child of root */ + do { + if (win_parent) + win_current = win_parent; + XQueryTree(TScreenOf(xw)->display, + win_current, + &win_root, + &win_parent, + &children, + &nchildren); + XFree(children); + } while (win_root != win_parent); + + return win_current; +} + +#if OPT_DABBREV +/* + * The following code implements `dynamic abbreviation' expansion a la + * Emacs. It looks in the preceding visible screen and its scrollback + * to find expansions of a typed word. It compares consecutive + * expansions and ignores one of them if they are identical. + * (Tomasz J. Cholewo, t.cholewo@ieee.org) + */ + +#define IS_WORD_CONSTITUENT(x) ((x) != ' ' && (x) != '\0') + +static int +dabbrev_prev_char(TScreen *screen, CELL *cell, LineData **ld) +{ + int result = -1; + int firstLine = -(screen->savedlines); + + *ld = getLineData(screen, cell->row); + while (cell->row >= firstLine) { + if (--(cell->col) >= 0) { + result = (int) (*ld)->charData[cell->col]; + break; + } + if (--(cell->row) < firstLine) + break; /* ...there is no previous line */ + *ld = getLineData(screen, cell->row); + cell->col = MaxCols(screen); + if (!LineTstWrapped(*ld)) { + result = ' '; /* treat lines as separate */ + break; + } + } + return result; +} + +static char * +dabbrev_prev_word(XtermWidget xw, CELL *cell, LineData **ld) +{ + TScreen *screen = TScreenOf(xw); + char *abword; + int c; + char *ab_end = (xw->work.dabbrev_data + MAX_DABBREV - 1); + char *result = 0; + + abword = ab_end; + *abword = '\0'; /* end of string marker */ + + while ((c = dabbrev_prev_char(screen, cell, ld)) >= 0 && + IS_WORD_CONSTITUENT(c)) { + if (abword > xw->work.dabbrev_data) /* store only the last chars */ + *(--abword) = (char) c; + } + + if (c >= 0) { + result = abword; + } else if (abword != ab_end) { + result = abword; + } + + if (result != 0) { + while ((c = dabbrev_prev_char(screen, cell, ld)) >= 0 && + !IS_WORD_CONSTITUENT(c)) { + ; /* skip preceding spaces */ + } + (cell->col)++; /* can be | > screen->max_col| */ + } + return result; +} + +static int +dabbrev_expand(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int pty = screen->respond; /* file descriptor of pty */ + + static CELL cell; + static char *dabbrev_hint = 0, *lastexpansion = 0; + static unsigned int expansions; + + char *expansion; + size_t hint_len; + int result = 0; + LineData *ld; + + if (!screen->dabbrev_working) { /* initialize */ + expansions = 0; + cell.col = screen->cur_col; + cell.row = screen->cur_row; + + if (dabbrev_hint != 0) + free(dabbrev_hint); + + if ((dabbrev_hint = dabbrev_prev_word(xw, &cell, &ld)) != 0) { + + if (lastexpansion != 0) + free(lastexpansion); + + if ((lastexpansion = strdup(dabbrev_hint)) != 0) { + + /* make own copy */ + if ((dabbrev_hint = strdup(dabbrev_hint)) != 0) { + screen->dabbrev_working = True; + /* we are in the middle of dabbrev process */ + } + } else { + return result; + } + } else { + return result; + } + if (!screen->dabbrev_working) { + if (lastexpansion != 0) { + free(lastexpansion); + lastexpansion = 0; + } + return result; + } + } + + if (dabbrev_hint == 0) + return result; + + hint_len = strlen(dabbrev_hint); + for (;;) { + if ((expansion = dabbrev_prev_word(xw, &cell, &ld)) == 0) { + if (expansions >= 2) { + expansions = 0; + cell.col = screen->cur_col; + cell.row = screen->cur_row; + continue; + } + break; + } + if (!strncmp(dabbrev_hint, expansion, hint_len) && /* empty hint matches everything */ + strlen(expansion) > hint_len && /* trivial expansion disallowed */ + strcmp(expansion, lastexpansion)) /* different from previous */ + break; + } + + if (expansion != 0) { + Char *copybuffer; + size_t del_cnt = strlen(lastexpansion) - hint_len; + size_t buf_cnt = del_cnt + strlen(expansion) - hint_len; + + if ((copybuffer = TypeMallocN(Char, buf_cnt)) != 0) { + /* delete previous expansion */ + memset(copybuffer, screen->dabbrev_erase_char, del_cnt); + memmove(copybuffer + del_cnt, + expansion + hint_len, + strlen(expansion) - hint_len); + v_write(pty, copybuffer, (unsigned) buf_cnt); + /* v_write() just reset our flag */ + screen->dabbrev_working = True; + free(copybuffer); + + free(lastexpansion); + + if ((lastexpansion = strdup(expansion)) != 0) { + result = 1; + expansions++; + } + } + } + + return result; +} + +/*ARGSUSED*/ +void +HandleDabbrevExpand(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *nparams GCC_UNUSED) +{ + XtermWidget xw; + + TRACE(("Handle dabbrev-expand for %p\n", (void *) w)); + if ((xw = getXtermWidget(w)) != 0) { + if (!dabbrev_expand(xw)) + Bell(xw, XkbBI_TerminalBell, 0); + } +} +#endif /* OPT_DABBREV */ + +void +xtermDeiconify(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Display *dpy = screen->display; + Window target = VShellWindow(xw); + XEvent e; + Atom atom_state = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); + + if (xtermIsIconified(xw)) { + TRACE(("...de-iconify window %#lx\n", target)); + XMapWindow(dpy, target); + + memset(&e, 0, sizeof(e)); + e.xclient.type = ClientMessage; + e.xclient.message_type = atom_state; + e.xclient.display = dpy; + e.xclient.window = target; + e.xclient.format = 32; + e.xclient.data.l[0] = 1; + e.xclient.data.l[1] = CurrentTime; + + XSendEvent(dpy, DefaultRootWindow(dpy), False, + SubstructureRedirectMask | SubstructureNotifyMask, &e); + xevents(xw); + } +} + +void +xtermIconify(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Window target = VShellWindow(xw); + + if (!xtermIsIconified(xw)) { + TRACE(("...iconify window %#lx\n", target)); + XIconifyWindow(screen->display, + target, + DefaultScreen(screen->display)); + xevents(xw); + } +} + +Boolean +xtermIsIconified(XtermWidget xw) +{ + XWindowAttributes win_attrs; + TScreen *screen = TScreenOf(xw); + Window target = VShellWindow(xw); + Display *dpy = screen->display; + Boolean result = False; + + if (xtermGetWinAttrs(dpy, target, &win_attrs)) { + Atom actual_return_type; + int actual_format_return = 0; + unsigned long nitems_return = 0; + unsigned long bytes_after_return = 0; + unsigned char *prop_return = 0; + long long_length = 1024; + Atom requested_type = XA_ATOM; + Atom is_hidden = XInternAtom(dpy, "_NET_WM_STATE_HIDDEN", False); + Atom wm_state = XInternAtom(dpy, "_NET_WM_STATE", False); + + /* this works with non-EWMH */ + result = (win_attrs.map_state != IsViewable) ? True : False; + + /* this is a convention used by some EWMH applications */ + if (xtermGetWinProp(dpy, + target, + wm_state, + 0L, + long_length, + requested_type, + &actual_return_type, + &actual_format_return, + &nitems_return, + &bytes_after_return, + &prop_return) + && prop_return != 0 + && actual_return_type == requested_type + && actual_format_return == 32) { + unsigned long n; + for (n = 0; n < nitems_return; ++n) { + unsigned long check = (((unsigned long *) + (void *) prop_return)[n]); + if (check == is_hidden) { + result = True; + break; + } + } + } + } + TRACE(("...window %#lx is%s iconified\n", + target, + result ? "" : " not")); + return result; +} + +#if OPT_MAXIMIZE +/*ARGSUSED*/ +void +HandleDeIconify(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *nparams GCC_UNUSED) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + xtermDeiconify(xw); + } +} + +/*ARGSUSED*/ +void +HandleIconify(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *nparams GCC_UNUSED) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + xtermIconify(xw); + } +} + +int +QueryMaximize(XtermWidget xw, unsigned *width, unsigned *height) +{ + TScreen *screen = TScreenOf(xw); + XSizeHints hints; + long supp = 0; + Window root_win; + int root_x = -1; /* saved co-ordinates */ + int root_y = -1; + unsigned root_border; + unsigned root_depth; + int code; + + if (XGetGeometry(screen->display, + RootWindowOfScreen(XtScreen(xw)), + &root_win, + &root_x, + &root_y, + width, + height, + &root_border, + &root_depth)) { + TRACE(("QueryMaximize: XGetGeometry position %d,%d size %d,%d border %d\n", + root_x, + root_y, + *width, + *height, + root_border)); + + *width -= (root_border * 2); + *height -= (root_border * 2); + + hints.flags = PMaxSize; + if (XGetWMNormalHints(screen->display, + VShellWindow(xw), + &hints, + &supp) + && (hints.flags & PMaxSize) != 0) { + + TRACE(("QueryMaximize: WM hints max_w %#x max_h %#x\n", + hints.max_width, + hints.max_height)); + + if ((unsigned) hints.max_width < *width) + *width = (unsigned) hints.max_width; + if ((unsigned) hints.max_height < *height) + *height = (unsigned) hints.max_height; + } + code = 1; + } else { + *width = 0; + *height = 0; + code = 0; + } + return code; +} + +void +RequestMaximize(XtermWidget xw, int maximize) +{ + TScreen *screen = TScreenOf(xw); + XWindowAttributes wm_attrs, vshell_attrs; + unsigned root_width = 0, root_height = 0; + Boolean success = False; + + TRACE(("RequestMaximize %d:%s\n", + maximize, + (maximize + ? "maximize" + : "restore"))); + + /* + * Before any maximize, ensure that we can capture the current screensize + * as well as the estimated root-window size. + */ + if (maximize + && QueryMaximize(xw, &root_width, &root_height) + && xtermGetWinAttrs(screen->display, + WMFrameWindow(xw), + &wm_attrs) + && xtermGetWinAttrs(screen->display, + VShellWindow(xw), + &vshell_attrs)) { + + if (screen->restore_data != True + || screen->restore_width != root_width + || screen->restore_height != root_height) { + screen->restore_data = True; + screen->restore_x = wm_attrs.x; + screen->restore_y = wm_attrs.y; + screen->restore_width = (unsigned) vshell_attrs.width; + screen->restore_height = (unsigned) vshell_attrs.height; + TRACE(("RequestMaximize: save window position %d,%d size %d,%d\n", + screen->restore_x, + screen->restore_y, + screen->restore_width, + screen->restore_height)); + } + + /* subtract wm decoration dimensions */ + root_width -= (unsigned) (wm_attrs.width - vshell_attrs.width); + root_height -= (unsigned) (wm_attrs.height - vshell_attrs.height); + success = True; + } else if (screen->restore_data) { + success = True; + maximize = 0; + } + + if (success) { + switch (maximize) { + case 3: + FullScreen(xw, 3); /* depends on EWMH */ + break; + case 2: + FullScreen(xw, 2); /* depends on EWMH */ + break; + case 1: + FullScreen(xw, 0); /* overrides any EWMH hint */ + TRACE(("XMoveResizeWindow(Maximize): position %d,%d size %d,%d\n", + 0, + 0, + root_width, + root_height)); + XMoveResizeWindow(screen->display, VShellWindow(xw), + 0, /* x */ + 0, /* y */ + root_width, + root_height); + break; + + default: + FullScreen(xw, 0); /* reset any EWMH hint */ + if (screen->restore_data) { + screen->restore_data = False; + + TRACE(("XMoveResizeWindow(Restore): position %d,%d size %d,%d\n", + screen->restore_x, + screen->restore_y, + screen->restore_width, + screen->restore_height)); + + XMoveResizeWindow(screen->display, + VShellWindow(xw), + screen->restore_x, + screen->restore_y, + screen->restore_width, + screen->restore_height); + } + break; + } + } +} + +/*ARGSUSED*/ +void +HandleMaximize(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *nparams GCC_UNUSED) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + RequestMaximize(xw, 1); + } +} + +/*ARGSUSED*/ +void +HandleRestoreSize(Widget w, + XEvent *event GCC_UNUSED, + String *params GCC_UNUSED, + Cardinal *nparams GCC_UNUSED) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + RequestMaximize(xw, 0); + } +} +#endif /* OPT_MAXIMIZE */ + +void +Redraw(void) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + XExposeEvent event; + + TRACE(("Redraw\n")); + + event.type = Expose; + event.display = screen->display; + event.x = 0; + event.y = 0; + event.count = 0; + + if (VWindow(screen)) { + event.window = VWindow(screen); + event.width = xw->core.width; + event.height = xw->core.height; + (*xw->core.widget_class->core_class.expose) ((Widget) xw, + (XEvent *) &event, + NULL); + if (ScrollbarWidth(screen)) { + (screen->scrollWidget->core.widget_class->core_class.expose) + (screen->scrollWidget, (XEvent *) &event, NULL); + } + } +#if OPT_TEK4014 + if (TEK4014_SHOWN(xw)) { + TekScreen *tekscr = TekScreenOf(tekWidget); + event.window = TWindow(tekscr); + event.width = tekWidget->core.width; + event.height = tekWidget->core.height; + TekExpose((Widget) tekWidget, (XEvent *) &event, NULL); + } +#endif +} + +#ifdef VMS +#define TIMESTAMP_FMT "%s%d-%02d-%02d-%02d-%02d-%02d" +#else +#define TIMESTAMP_FMT "%s%d-%02d-%02d.%02d:%02d:%02d" +#endif + +void +timestamp_filename(char *dst, const char *src) +{ + time_t tstamp; + struct tm *tstruct; + + tstamp = time((time_t *) 0); + tstruct = localtime(&tstamp); + sprintf(dst, TIMESTAMP_FMT, + src, + (int) tstruct->tm_year + 1900, + tstruct->tm_mon + 1, + tstruct->tm_mday, + tstruct->tm_hour, + tstruct->tm_min, + tstruct->tm_sec); +} + +FILE * +create_printfile(XtermWidget xw, const char *suffix) +{ + TScreen *screen = TScreenOf(xw); + char fname[1024]; + int fd; + FILE *fp; + +#ifdef VMS + sprintf(fname, "sys$scratch:xterm%s", suffix); +#elif defined(HAVE_STRFTIME) + { + char format[1024]; + time_t now; + struct tm *ltm; + + now = time((time_t *) 0); + ltm = localtime(&now); + + sprintf(format, "xterm%s%s", FMT_TIMESTAMP, suffix); + if (strftime(fname, sizeof fname, format, ltm) == 0) { + sprintf(fname, "xterm%s", suffix); + } + } +#else + sprintf(fname, "xterm%s", suffix); +#endif + fd = open_userfile(screen->uid, screen->gid, fname, False); + fp = (fd >= 0) ? fdopen(fd, "wb") : NULL; + return fp; +} + +int +open_userfile(uid_t uid, gid_t gid, char *path, Bool append) +{ + int fd; + struct stat sb; + +#ifdef VMS + if ((fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0) { + int the_error = errno; + xtermWarning("cannot open %s: %d:%s\n", + path, + the_error, + SysErrorMsg(the_error)); + return -1; + } + chown(path, uid, gid); +#else + if ((access(path, F_OK) != 0 && (errno != ENOENT)) + || (creat_as(uid, gid, append, path, 0644) <= 0) + || ((fd = open(path, O_WRONLY | O_APPEND)) < 0)) { + int the_error = errno; + xtermWarning("cannot open %s: %d:%s\n", + path, + the_error, + SysErrorMsg(the_error)); + return -1; + } +#endif + + /* + * Doublecheck that the user really owns the file that we've opened before + * we do any damage, and that it is not world-writable. + */ + if (fstat(fd, &sb) < 0 + || sb.st_uid != uid + || (sb.st_mode & 022) != 0) { + xtermWarning("you do not own %s\n", path); + close(fd); + return -1; + } + return fd; +} + +#ifndef VMS +/* + * Create a file only if we could with the permissions of the real user id. + * We could emulate this with careful use of access() and following + * symbolic links, but that is messy and has race conditions. + * Forking is messy, too, but we can't count on setreuid() or saved set-uids + * being available. + * + * Note: When called for user logging, we have ensured that the real and + * effective user ids are the same, so this remains as a convenience function + * for the debug logs. + * + * Returns + * 1 if we can proceed to open the file in relative safety, + * -1 on error, e.g., cannot fork + * 0 otherwise. + */ +int +creat_as(uid_t uid, gid_t gid, Bool append, char *pathname, unsigned mode) +{ + int fd; + pid_t pid; + int retval = 0; + int childstat = 0; +#ifndef HAVE_WAITPID + int waited; + void (*chldfunc) (int); + + chldfunc = signal(SIGCHLD, SIG_DFL); +#endif /* HAVE_WAITPID */ + + TRACE(("creat_as(uid=%d/%d, gid=%d/%d, append=%d, pathname=%s, mode=%#o)\n", + (int) uid, (int) geteuid(), + (int) gid, (int) getegid(), + append, + pathname, + mode)); + + if (uid == geteuid() && gid == getegid()) { + fd = open(pathname, + O_WRONLY | O_CREAT | (append ? O_APPEND : O_EXCL), + mode); + if (fd >= 0) + close(fd); + return (fd >= 0); + } + + pid = fork(); + switch (pid) { + case 0: /* child */ + if (setgid(gid) == -1 + || setuid(uid) == -1) { + /* we cannot report an error here via stderr, just quit */ + retval = 1; + } else { + fd = open(pathname, + O_WRONLY | O_CREAT | (append ? O_APPEND : O_EXCL), + mode); + if (fd >= 0) { + close(fd); + retval = 0; + } else { + retval = 1; + } + } + _exit(retval); + /* NOTREACHED */ + case -1: /* error */ + return retval; + default: /* parent */ +#ifdef HAVE_WAITPID + while (waitpid(pid, &childstat, 0) < 0) { +#ifdef EINTR + if (errno == EINTR) + continue; +#endif /* EINTR */ +#ifdef ERESTARTSYS + if (errno == ERESTARTSYS) + continue; +#endif /* ERESTARTSYS */ + break; + } +#else /* HAVE_WAITPID */ + waited = wait(&childstat); + signal(SIGCHLD, chldfunc); + /* + Since we had the signal handler uninstalled for a while, + we might have missed the termination of our screen child. + If we can check for this possibility without hanging, do so. + */ + do + if (waited == TScreenOf(term)->pid) + NormalExit(); + while ((waited = nonblocking_wait()) > 0) ; +#endif /* HAVE_WAITPID */ +#ifndef WIFEXITED +#define WIFEXITED(status) ((status & 0xff) != 0) +#endif + if (WIFEXITED(childstat)) + retval = 1; + return retval; + } +} +#endif /* !VMS */ + +int +xtermResetIds(TScreen *screen) +{ + int result = 0; + if (setgid(screen->gid) == -1) { + xtermWarning("unable to reset group-id\n"); + result = -1; + } + if (setuid(screen->uid) == -1) { + xtermWarning("unable to reset user-id\n"); + result = -1; + } + return result; +} + +#ifdef ALLOWLOGGING + +/* + * Logging is a security hole, since it allows a setuid program to write + * arbitrary data to an arbitrary file. So it is disabled by default. + */ + +#ifdef ALLOWLOGFILEEXEC +static void +handle_SIGPIPE(int sig GCC_UNUSED) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + DEBUG_MSG("handle:logpipe\n"); +#ifdef SYSV + (void) signal(SIGPIPE, SIG_IGN); +#endif /* SYSV */ + if (screen->logging) + CloseLog(xw); +} + +/* + * Open a command to pipe log data to it. + * Warning, enabling this "feature" allows arbitrary programs + * to be run. If ALLOWLOGFILECHANGES is enabled, this can be + * done through escape sequences.... You have been warned. + */ +static void +StartLogExec(TScreen *screen) +{ + int pid; + int p[2]; + static char *shell; + struct passwd pw; + + if ((shell = x_getenv("SHELL")) == NULL) { + + if (x_getpwuid(screen->uid, &pw)) { + char *name = x_getlogin(screen->uid, &pw); + if (*(pw.pw_shell)) { + shell = pw.pw_shell; + } + free(name); + } + } + + if (shell == 0) { + static char dummy[] = "/bin/sh"; + shell = dummy; + } + + if (access(shell, X_OK) != 0) { + xtermPerror("Can't execute `%s'\n", shell); + return; + } + + if (pipe(p) < 0) { + xtermPerror("Can't make a pipe connection\n"); + return; + } else if ((pid = fork()) < 0) { + xtermPerror("Can't fork...\n"); + return; + } + if (pid == 0) { /* child */ + /* + * Close our output (we won't be talking back to the + * parent), and redirect our child's output to the + * original stderr. + */ + close(p[1]); + dup2(p[0], 0); + close(p[0]); + dup2(fileno(stderr), 1); + dup2(fileno(stderr), 2); + + close(fileno(stderr)); + close(ConnectionNumber(screen->display)); + close(screen->respond); + + signal(SIGHUP, SIG_DFL); + signal(SIGCHLD, SIG_DFL); + + /* (this is redundant) */ + if (xtermResetIds(screen) < 0) + exit(ERROR_SETUID); + + execl(shell, shell, "-c", &screen->logfile[1], (void *) 0); + xtermWarning("Can't exec `%s -c %s'\n", shell, &screen->logfile[1]); + exit(ERROR_LOGEXEC); + } + close(p[0]); + screen->logfd = p[1]; + signal(SIGPIPE, handle_SIGPIPE); +} +#endif /* ALLOWLOGFILEEXEC */ + +/* + * Generate a path for a logfile if no default path is given. + */ +static char * +GenerateLogPath(void) +{ + static char *log_default = NULL; + + /* once opened we just reuse the same log name */ + if (log_default) + return (log_default); + +#if defined(HAVE_GETHOSTNAME) && defined(HAVE_STRFTIME) + { +#define LEN_HOSTNAME 255 + /* Internet standard limit (RFC 1035): ``To simplify implementations, + * the total length of a domain name (i.e., label octets and label + * length octets) is restricted to 255 octets or less.'' + */ +#define LEN_GETPID 9 + /* + * This is arbitrary... + */ + const char form[] = "Xterm.log.%s%s.%lu"; + char where[LEN_HOSTNAME + 1]; + char when[LEN_TIMESTAMP]; + time_t now = time((time_t *) 0); + struct tm *ltm = (struct tm *) localtime(&now); + + if ((gethostname(where, sizeof(where)) == 0) && + (strftime(when, sizeof(when), FMT_TIMESTAMP, ltm) > 0) && + ((log_default = (char *) malloc((sizeof(form) + + strlen(where) + + strlen(when) + + LEN_GETPID))) != NULL)) { + (void) sprintf(log_default, + form, + where, when, + ((unsigned long) getpid()) % ((unsigned long) 1e10)); + } + } +#else + static const char log_def_name[] = "XtermLog.XXXXXX"; + if ((log_default = x_strdup(log_def_name)) != NULL) { + mktemp(log_default); + } +#endif + + return (log_default); +} + +void +StartLog(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->logging || (screen->inhibit & I_LOG)) + return; +#ifdef VMS /* file name is fixed in VMS variant */ + screen->logfd = open(XTERM_VMS_LOGFILE, + O_CREAT | O_TRUNC | O_APPEND | O_RDWR, + 0640); + if (screen->logfd < 0) + return; /* open failed */ +#else /*VMS */ + + /* if we weren't supplied with a logfile path, generate one */ + if (IsEmpty(screen->logfile)) + screen->logfile = GenerateLogPath(); + + /* give up if we were unable to allocate the filename */ + if (!screen->logfile) + return; + + if (*screen->logfile == '|') { /* exec command */ +#ifdef ALLOWLOGFILEEXEC + StartLogExec(screen); +#else + Bell(xw, XkbBI_Info, 0); + Bell(xw, XkbBI_Info, 0); + return; +#endif + } else if (strcmp(screen->logfile, "-") == 0) { + screen->logfd = STDOUT_FILENO; + } else { + if ((screen->logfd = open_userfile(screen->uid, + screen->gid, + screen->logfile, + True)) < 0) + return; + } +#endif /*VMS */ + screen->logstart = VTbuffer->next; + screen->logging = True; + update_logging(); +} + +void +CloseLog(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (!screen->logging || (screen->inhibit & I_LOG)) + return; + FlushLog(xw); + close(screen->logfd); + screen->logging = False; + update_logging(); +} + +void +FlushLog(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->logging && !(screen->inhibit & I_LOG)) { + Char *cp; + int i; + +#ifdef VMS /* avoid logging output loops which otherwise occur sometimes + when there is no output and cp/screen->logstart are 1 apart */ + if (!tt_new_output) + return; + tt_new_output = False; +#endif /* VMS */ + cp = VTbuffer->next; + if (screen->logstart != 0 + && (i = (int) (cp - screen->logstart)) > 0) { + IGNORE_RC(write(screen->logfd, screen->logstart, (size_t) i)); + } + screen->logstart = VTbuffer->next; + } +} + +#endif /* ALLOWLOGGING */ + +/***====================================================================***/ + +static unsigned +maskToShift(unsigned long mask) +{ + unsigned result = 0; + if (mask != 0) { + while ((mask & 1) == 0) { + mask >>= 1; + ++result; + } + } + return result; +} + +static unsigned +maskToWidth(unsigned long mask) +{ + unsigned result = 0; + while (mask != 0) { + if ((mask & 1) != 0) + ++result; + mask >>= 1; + } + return result; +} + +int +getVisualInfo(XtermWidget xw) +{ +#define MYFMT "getVisualInfo \ +depth %d, \ +type %d (%s), \ +size %d \ +rgb masks (%04lx/%04lx/%04lx)\n" +#define MYARG \ + vi->depth,\ + vi->class,\ + ((vi->class & 1) ? "dynamic" : "static"),\ + vi->colormap_size,\ + vi->red_mask,\ + vi->green_mask,\ + vi->blue_mask + + TScreen *screen = TScreenOf(xw); + Display *dpy = screen->display; + XVisualInfo myTemplate; + + if (xw->visInfo == 0 && xw->numVisuals == 0) { + myTemplate.visualid = XVisualIDFromVisual(DefaultVisual(dpy, + XDefaultScreen(dpy))); + xw->visInfo = XGetVisualInfo(dpy, (long) VisualIDMask, + &myTemplate, &xw->numVisuals); + + if ((xw->visInfo != 0) && (xw->numVisuals > 0)) { + XVisualInfo *vi = xw->visInfo; + xw->rgb_widths[0] = maskToWidth(vi->red_mask); + xw->rgb_widths[1] = maskToWidth(vi->green_mask); + xw->rgb_widths[2] = maskToWidth(vi->blue_mask); + xw->rgb_shifts[0] = maskToShift(vi->red_mask); + xw->rgb_shifts[1] = maskToShift(vi->green_mask); + xw->rgb_shifts[2] = maskToShift(vi->blue_mask); + + xw->has_rgb = ((vi->red_mask != 0) && + (vi->green_mask != 0) && + (vi->blue_mask != 0) && + ((vi->red_mask & vi->green_mask) == 0) && + ((vi->green_mask & vi->blue_mask) == 0) && + ((vi->blue_mask & vi->red_mask) == 0)); + + if (resource.reportColors) { + printf(MYFMT, MYARG); + } + TRACE((MYFMT, MYARG)); + TRACE(("...shifts %u/%u/%u\n", + xw->rgb_shifts[0], + xw->rgb_shifts[1], + xw->rgb_shifts[2])); + } + } + return (xw->visInfo != 0) && (xw->numVisuals > 0); +#undef MYFMT +#undef MYARG +} + +#if OPT_ISO_COLORS +static Bool +ReportAnsiColorRequest(XtermWidget xw, int opcode, int colornum, int final) +{ + Bool result = False; + + if (AllowColorOps(xw, ecGetAnsiColor)) { + XColor color; + Colormap cmap = xw->core.colormap; + char buffer[80]; + + TRACE(("ReportAnsiColorRequest %d\n", colornum)); + color.pixel = GET_COLOR_RES(xw, TScreenOf(xw)->Acolors[colornum]); + XQueryColor(TScreenOf(xw)->display, cmap, &color); + sprintf(buffer, "%d;%d;rgb:%04x/%04x/%04x", + opcode, + (opcode == 5) ? (colornum - NUM_ANSI_COLORS) : colornum, + color.red, + color.green, + color.blue); + unparseputc1(xw, ANSI_OSC); + unparseputs(xw, buffer); + unparseputc1(xw, final); + result = True; + } + return result; +} + +static void +getColormapInfo(XtermWidget xw, unsigned *typep, unsigned *sizep) +{ + if (getVisualInfo(xw)) { + *typep = (unsigned) xw->visInfo->class; + *sizep = (unsigned) xw->visInfo->colormap_size; + } else { + *typep = 0; + *sizep = 0; + } +} + +#define MAX_COLORTABLE 4096 + +/* + * Make only one call to XQueryColors(), since it can be slow. + */ +static Boolean +loadColorTable(XtermWidget xw, unsigned length) +{ + Colormap cmap = xw->core.colormap; + TScreen *screen = TScreenOf(xw); + Boolean result = (screen->cmap_data != 0); + + if (!result + && length != 0 + && length < MAX_COLORTABLE) { + screen->cmap_data = TypeMallocN(XColor, (size_t) length); + + if (screen->cmap_data != 0) { + unsigned i; + + screen->cmap_size = length; + + for (i = 0; i < screen->cmap_size; i++) { + screen->cmap_data[i].pixel = (unsigned long) i; + } + result = (Boolean) (XQueryColors(screen->display, + cmap, + screen->cmap_data, + (int) screen->cmap_size) != 0); + } + } + return result; +} + +/* + * Find closest color for "def" in "cmap". + * Set "def" to the resulting color. + * + * Based on Monish Shah's "find_closest_color()" for Vim 6.0, + * modified with ideas from David Tong's "noflash" library. + * The code from Vim in turn was derived from FindClosestColor() in Tcl/Tk. + * + * Return False if not able to find or allocate a color. + */ +static Boolean +allocateClosestRGB(XtermWidget xw, Colormap cmap, XColor *def) +{ + TScreen *screen = TScreenOf(xw); + Boolean result = False; + unsigned cmap_type; + unsigned cmap_size; + + getColormapInfo(xw, &cmap_type, &cmap_size); + + if ((cmap_type & 1) != 0) { + + if (loadColorTable(xw, cmap_size)) { + char *tried = TypeCallocN(char, (size_t) cmap_size); + + if (tried != 0) { + unsigned attempts; + + /* + * Try (possibly each entry in the color map) to find the best + * approximation to the requested color. + */ + for (attempts = 0; attempts < cmap_size; attempts++) { + Boolean first = True; + double bestRGB = 0.0; + unsigned bestInx = 0; + unsigned i; + + for (i = 0; i < cmap_size; i++) { + if (!tried[bestInx]) { + double diff, thisRGB = 0.0; + + /* + * Look for the best match based on luminance. + * Measure this by the least-squares difference of + * the weighted R/G/B components from the color map + * versus the requested color. Use the Y (luma) + * component of the YIQ color space model for + * weights that correspond to the luminance. + */ +#define AddColorWeight(weight, color) \ + diff = weight * (int) ((def->color) - screen->cmap_data[i].color); \ + thisRGB += diff * diff + + AddColorWeight(0.30, red); + AddColorWeight(0.61, green); + AddColorWeight(0.11, blue); + + if (first || (thisRGB < bestRGB)) { + first = False; + bestInx = i; + bestRGB = thisRGB; + } + } + } + if (XAllocColor(screen->display, cmap, + &screen->cmap_data[bestInx]) != 0) { + *def = screen->cmap_data[bestInx]; + TRACE(("...closest %x/%x/%x\n", def->red, + def->green, def->blue)); + result = True; + break; + } + /* + * It failed - either the color map entry was readonly, or + * another client has allocated the entry. Mark the entry + * so we will ignore it + */ + tried[bestInx] = True; + } + free(tried); + } + } + } + return result; +} + +#ifndef ULONG_MAX +#define ULONG_MAX (unsigned long)(~(0L)) +#endif + +#define CheckColor(result, value) \ + result = 0; \ + if (value.red) \ + result |= 1; \ + if (value.green) \ + result |= 2; \ + if (value.blue) \ + result |= 4 + +#define SelectColor(state, value, result) \ + switch (state) { \ + default: \ + case 1: \ + result = value.red; \ + break; \ + case 2: \ + result = value.green; \ + break; \ + case 4: \ + result = value.blue; \ + break; \ + } + +/* + * Check if the color map consists of values in exactly one of the red, green + * or blue columns. If it is not, we do not know how to use it for the exact + * match. + */ +static int +simpleColors(XColor *colortable, unsigned length) +{ + unsigned n; + int state = 0; + int check; + + for (n = 0; n < length; ++n) { + if (state > 0) { + CheckColor(check, colortable[n]); + if (check > 0 && check != state) { + state = 0; + break; + } + } else { + CheckColor(state, colortable[n]); + } + } + switch (state) { + case 1: + case 2: + case 4: + break; + default: + state = 0; + break; + } + return state; +} + +/* + * Shift the mask left or right to put its most significant bit at the 16-bit + * mark. + */ +static unsigned +normalizeMask(unsigned mask) +{ + while (mask < 0x8000) { + mask <<= 1; + } + while (mask >= 0x10000) { + mask >>= 1; + } + return mask; +} + +static unsigned +searchColors(XColor *colortable, unsigned mask, unsigned length, unsigned + color, int state) +{ + unsigned result = 0; + unsigned n; + unsigned long best = ULONG_MAX; + unsigned value; + + mask = normalizeMask(mask); + for (n = 0; n < length; ++n) { + unsigned long diff; + + SelectColor(state, colortable[n], value); + diff = ((color & mask) - (value & mask)); + diff *= diff; + if (diff < best) { +#if 0 + TRACE(("...%d:looking for %x, found %x/%x/%x (%lx)\n", + n, color, + colortable[n].red, + colortable[n].green, + colortable[n].blue, + diff)); +#endif + result = n; + best = diff; + } + } + SelectColor(state, colortable[result], value); + return value; +} + +/* + * This is a workaround for a longstanding defect in the X libraries. + * + * According to + * http://www.unix.com/man-page/all/3x/XAllocColoA/ + * + * XAllocColor() acts differently on static and dynamic visuals. On Pseu- + * doColor, DirectColor, and GrayScale visuals, XAllocColor() fails if + * there are no unallocated colorcells and no allocated read-only cell + * exactly matches the requested RGB values. On StaticColor, TrueColor, + * and StaticGray visuals, XAllocColor() returns the closest RGB values + * available in the colormap. The colorcell_in_out structure returns the + * actual RGB values allocated. + * + * That is, XAllocColor() should suffice unless the color map is full. In that + * case, allocateClosestRGB() is useful for the dynamic display classes such as + * PseudoColor. It is not useful for TrueColor, since XQueryColors() does not + * return regular RGB triples (unless a different scheme was used for + * specifying the pixel values); only the blue value is filled in. However, it + * is filled in with the colors that the server supports. + * + * Also (the reason for this function), XAllocColor() does not really work as + * described. For some TrueColor configurations it merely returns a close + * approximation, but not the closest. + */ +static Boolean +allocateExactRGB(XtermWidget xw, Colormap cmap, XColor *def) +{ + XColor save = *def; + TScreen *screen = TScreenOf(xw); + Boolean result = (Boolean) (XAllocColor(screen->display, cmap, def) != 0); + + /* + * If this is a statically allocated display with too many items to store + * in our array, i.e., TrueColor, see if we can improve on the result by + * using the color values actually supported by the server. + */ + if (result) { + unsigned cmap_type; + unsigned cmap_size; + + getColormapInfo(xw, &cmap_type, &cmap_size); + + if (cmap_type == TrueColor) { + XColor temp = *def; + int state; + + if (loadColorTable(xw, cmap_size) + && (state = simpleColors(screen->cmap_data, cmap_size)) > 0) { +#define SearchColors(which) \ + temp.which = (unsigned short) searchColors(screen->cmap_data, \ + (unsigned) xw->visInfo->which##_mask,\ + cmap_size, \ + save.which, \ + state) + SearchColors(red); + SearchColors(green); + SearchColors(blue); + if (XAllocColor(screen->display, cmap, &temp) != 0) { +#if OPT_TRACE + if (temp.red != save.red + || temp.green != save.green + || temp.blue != save.blue) { + TRACE(("...improved %x/%x/%x ->%x/%x/%x\n", + save.red, save.green, save.blue, + temp.red, temp.green, temp.blue)); + } else { + TRACE(("...no improvement for %x/%x/%x\n", + save.red, save.green, save.blue)); + } +#endif + *def = temp; + } + } + } + } + + return result; +} + +/* + * Allocate a color for the "ANSI" colors. That actually includes colors up + * to 256. + * + * Returns + * -1 on error + * 0 on no change + * 1 if a new color was allocated. + */ +static int +AllocateAnsiColor(XtermWidget xw, + ColorRes * res, + const char *spec) +{ + int result; + XColor def; + + if (xtermAllocColor(xw, &def, spec)) { + if ( +#if OPT_COLOR_RES + res->mode == True && +#endif + EQL_COLOR_RES(res, def.pixel)) { + result = 0; + } else { + result = 1; + SET_COLOR_RES(res, def.pixel); + res->red = def.red; + res->green = def.green; + res->blue = def.blue; + TRACE(("AllocateAnsiColor[%d] %s (rgb:%04x/%04x/%04x, pixel 0x%06lx)\n", + (int) (res - TScreenOf(xw)->Acolors), spec, + def.red, + def.green, + def.blue, + def.pixel)); +#if OPT_COLOR_RES + if (!res->mode) + result = 0; + res->mode = True; +#endif + } + } else { + TRACE(("AllocateAnsiColor %s (failed)\n", spec)); + result = -1; + } + return (result); +} + +#if OPT_COLOR_RES +Pixel +xtermGetColorRes(XtermWidget xw, ColorRes * res) +{ + Pixel result = 0; + + if (res->mode) { + result = res->value; + } else { + TRACE(("xtermGetColorRes for Acolors[%d]\n", + (int) (res - TScreenOf(xw)->Acolors))); + + if (res >= TScreenOf(xw)->Acolors) { + assert(res - TScreenOf(xw)->Acolors < MAXCOLORS); + + if (AllocateAnsiColor(xw, res, res->resource) < 0) { + res->value = TScreenOf(xw)->Tcolors[TEXT_FG].value; + res->mode = -True; + xtermWarning("Cannot allocate color \"%s\"\n", + NonNull(res->resource)); + } + result = res->value; + } else { + result = 0; + } + } + return result; +} +#endif + +static int +ChangeOneAnsiColor(XtermWidget xw, int color, const char *name) +{ + int code; + + if (color < 0 || color >= MAXCOLORS) { + code = -1; + } else { + ColorRes *res = &(TScreenOf(xw)->Acolors[color]); + + TRACE(("ChangeAnsiColor for Acolors[%d]\n", color)); + code = AllocateAnsiColor(xw, res, name); + } + return code; +} + +/* + * Set or query entries in the Acolors[] array by parsing pairs of color/name + * values from the given buffer. + * + * The color can be any legal index into Acolors[], which consists of the + * 16/88/256 "ANSI" colors, followed by special color values for the various + * colorXX resources. The indices for the special color values are not + * simple to work with, so an alternative is to use the calls which pass in + * 'first' set to the beginning of those indices. + * + * If the name is "?", report to the host the current value for the color. + */ +static Bool +ChangeAnsiColorRequest(XtermWidget xw, + int opcode, + char *buf, + int first, + int final) +{ + int repaint = False; + int code; + int last = (MAXCOLORS - first); + int queried = 0; + + TRACE(("ChangeAnsiColorRequest string='%s'\n", buf)); + + while (buf && *buf) { + int color; + char *name = strchr(buf, ';'); + + if (name == NULL) + break; + *name = '\0'; + name++; + color = atoi(buf); + if (color < 0 || color >= last) + break; /* quit on any error */ + buf = strchr(name, ';'); + if (buf) { + *buf = '\0'; + buf++; + } + if (!strcmp(name, "?")) { + if (ReportAnsiColorRequest(xw, opcode, color + first, final)) + ++queried; + } else { + code = ChangeOneAnsiColor(xw, color + first, name); + if (code < 0) { + /* stop on any error */ + break; + } else if (code > 0) { + repaint = True; + } + /* FIXME: free old color somehow? We aren't for the other color + * change style (dynamic colors). + */ + } + } + if (queried) + unparse_end(xw); + + return (repaint); +} + +static Bool +ResetOneAnsiColor(XtermWidget xw, int color, int start) +{ + Bool repaint = False; + int last = MAXCOLORS - start; + + if (color >= 0 && color < last) { + ColorRes *res = &(TScreenOf(xw)->Acolors[color + start]); + + if (res->mode) { + /* a color has been allocated for this slot - test further... */ + if (ChangeOneAnsiColor(xw, color + start, res->resource) > 0) { + repaint = True; + } + } + } + return repaint; +} + +int +ResetAnsiColorRequest(XtermWidget xw, char *buf, int start) +{ + int repaint = 0; + int color; + + TRACE(("ResetAnsiColorRequest(%s)\n", buf)); + if (*buf != '\0') { + /* reset specific colors */ + while (!IsEmpty(buf)) { + char *next; + + color = (int) (strtol) (buf, &next, 10); + if (!PartS2L(buf, next) || (color < 0)) + break; /* no number at all */ + if (next != 0) { + if (strchr(";", *next) == 0) + break; /* unexpected delimiter */ + ++next; + } + + if (ResetOneAnsiColor(xw, color, start)) { + ++repaint; + } + buf = next; + } + } else { + TRACE(("...resetting all %d colors\n", MAXCOLORS)); + for (color = 0; color < MAXCOLORS; ++color) { + if (ResetOneAnsiColor(xw, color, start)) { + ++repaint; + } + } + } + TRACE(("...ResetAnsiColorRequest ->%d\n", repaint)); + return repaint; +} +#else +#define allocateClosestRGB(xw, cmap, def) 0 +#define allocateExactRGB(xw, cmap, def) XAllocColor(TScreenOf(xw)->display, cmap, def) +#endif /* OPT_ISO_COLORS */ + +Boolean +allocateBestRGB(XtermWidget xw, XColor *def) +{ + Colormap cmap = xw->core.colormap; + + return allocateExactRGB(xw, cmap, def) || allocateClosestRGB(xw, cmap, def); +} + +static Boolean +xtermAllocColor(XtermWidget xw, XColor *def, const char *spec) +{ + Boolean result = False; + TScreen *screen = TScreenOf(xw); + Colormap cmap = xw->core.colormap; + + if (XParseColor(screen->display, cmap, spec, def)) { + XColor save_def = *def; + if (resource.reportColors) { + printf("color %04x/%04x/%04x = \"%s\"\n", + def->red, def->green, def->blue, + spec); + } + if (allocateBestRGB(xw, def)) { + if (resource.reportColors) { + if (def->red != save_def.red || + def->green != save_def.green || + def->blue != save_def.blue) { + printf("color %04x/%04x/%04x ~ \"%s\"\n", + def->red, def->green, def->blue, + spec); + } + } + TRACE(("xtermAllocColor -> %x/%x/%x\n", + def->red, def->green, def->blue)); + result = True; + } + } + return result; +} + +/* + * This provides an approximation (the closest color from xterm's palette) + * rather than the "exact" color (whatever the display could provide, actually) + * because of the context in which it is used. + */ +#define ColorDiff(given,cache) ((long) ((cache) >> 8) - (long) (given)) +int +xtermClosestColor(XtermWidget xw, int find_red, int find_green, int find_blue) +{ + int result = -1; +#if OPT_COLOR_RES && OPT_ISO_COLORS + int n; + int best_index = -1; + unsigned long best_value = 0; + unsigned long this_value; + long diff_red, diff_green, diff_blue; + + TRACE(("xtermClosestColor(%x/%x/%x)\n", find_red, find_green, find_blue)); + + for (n = NUM_ANSI_COLORS - 1; n >= 0; --n) { + ColorRes *res = &(TScreenOf(xw)->Acolors[n]); + + /* ensure that we have a value for each of the colors */ + if (!res->mode) { + (void) AllocateAnsiColor(xw, res, res->resource); + } + + /* find the closest match */ + if (res->mode == True) { + TRACE2(("...lookup %lx -> %x/%x/%x\n", + res->value, res->red, res->green, res->blue)); + diff_red = ColorDiff(find_red, res->red); + diff_green = ColorDiff(find_green, res->green); + diff_blue = ColorDiff(find_blue, res->blue); + this_value = (unsigned long) ((diff_red * diff_red) + + (diff_green * diff_green) + + (diff_blue * diff_blue)); + if (best_index < 0 || this_value < best_value) { + best_index = n; + best_value = this_value; + } + } + } + TRACE(("...best match at %d with diff %lx\n", best_index, best_value)); + result = best_index; +#else + (void) xw; + (void) find_red; + (void) find_green; + (void) find_blue; +#endif + return result; +} + +#if OPT_DIRECT_COLOR +int +getDirectColor(XtermWidget xw, int red, int green, int blue) +{ +#define nRGB(name,shift) \ + ((unsigned long)(name << xw->rgb_shifts[shift]) \ + & xw->visInfo->name ##_mask) + MyPixel result = (MyPixel) (nRGB(red, 0) | nRGB(green, 1) | nRGB(blue, 2)); + return (int) result; +} + +static void +formatDirectColor(char *target, XtermWidget xw, unsigned value) +{ +#define fRGB(name, shift) \ + (value & xw->visInfo->name ## _mask) >> xw->rgb_shifts[shift] + sprintf(target, "%lu:%lu:%lu", fRGB(red, 0), fRGB(green, 1), fRGB(blue, 2)); +} +#endif /* OPT_DIRECT_COLOR */ + +#define fg2SGR(n) \ + (n) >= 8 ? 9 : 3, \ + (n) >= 8 ? (n) - 8 : (n) +#define bg2SGR(n) \ + (n) >= 8 ? 10 : 4, \ + (n) >= 8 ? (n) - 8 : (n) + +#define EndOf(s) (s) + strlen(s) + +char * +xtermFormatSGR(XtermWidget xw, char *target, unsigned attr, int fg, int bg) +{ + TScreen *screen = TScreenOf(xw); + char *msg = target; + + strcpy(target, "0"); + if (attr & BOLD) + strcat(msg, ";1"); + if (attr & UNDERLINE) + strcat(msg, ";4"); + if (attr & BLINK) + strcat(msg, ";5"); + if (attr & INVERSE) + strcat(msg, ";7"); + if (attr & INVISIBLE) + strcat(msg, ";8"); +#if OPT_WIDE_ATTRS + if (attr & ATR_FAINT) + strcat(msg, ";2"); + if (attr & ATR_ITALIC) + strcat(msg, ";3"); + if (attr & ATR_STRIKEOUT) + strcat(msg, ";9"); + if (attr & ATR_DBL_UNDER) + strcat(msg, ";21"); +#endif +#if OPT_256_COLORS || OPT_88_COLORS + if_OPT_ISO_COLORS(screen, { + if (attr & FG_COLOR) { + if_OPT_DIRECT_COLOR2_else(screen, hasDirectFG(attr), { + strcat(msg, ";38:2::"); + formatDirectColor(EndOf(msg), xw, (unsigned) fg); + }) if (fg >= 16) { + sprintf(EndOf(msg), ";38:5:%d", fg); + } else { + sprintf(EndOf(msg), ";%d%d", fg2SGR(fg)); + } + } + if (attr & BG_COLOR) { + if_OPT_DIRECT_COLOR2_else(screen, hasDirectBG(attr), { + strcat(msg, ";48:2::"); + formatDirectColor(EndOf(msg), xw, (unsigned) bg); + }) if (bg >= 16) { + sprintf(EndOf(msg), ";48:5:%d", bg); + } else { + sprintf(EndOf(msg), ";%d%d", bg2SGR(bg)); + } + } + }); +#elif OPT_ISO_COLORS + if_OPT_ISO_COLORS(screen, { + if (attr & FG_COLOR) { + sprintf(EndOf(msg), ";%d%d", fg2SGR(fg)); + } + if (attr & BG_COLOR) { + sprintf(EndOf(msg), ";%d%d", bg2SGR(bg)); + } + }); +#else + (void) screen; + (void) fg; + (void) bg; +#endif + return target; +} + +#if OPT_PASTE64 +static void +ManipulateSelectionData(XtermWidget xw, TScreen *screen, char *buf, int final) +{ +#define PDATA(a,b) { a, #b } + static struct { + char given; + String result; + } table[] = { + PDATA('s', SELECT), + PDATA('p', PRIMARY), + PDATA('q', SECONDARY), + PDATA('c', CLIPBOARD), + PDATA('0', CUT_BUFFER0), + PDATA('1', CUT_BUFFER1), + PDATA('2', CUT_BUFFER2), + PDATA('3', CUT_BUFFER3), + PDATA('4', CUT_BUFFER4), + PDATA('5', CUT_BUFFER5), + PDATA('6', CUT_BUFFER6), + PDATA('7', CUT_BUFFER7), + }; + + const char *base = buf; + Cardinal j, n = 0; + + TRACE(("Manipulate selection data\n")); + + while (*buf != ';' && *buf != '\0') { + ++buf; + } + + if (*buf == ';') { + char *used; + + *buf++ = '\0'; + + if (*base == '\0') + base = "s0"; + + if ((used = x_strdup(base)) != 0) { + String *select_args; + + if ((select_args = TypeCallocN(String, 2 + strlen(base))) != 0) { + while (*base != '\0') { + for (j = 0; j < XtNumber(table); ++j) { + if (*base == table[j].given) { + used[n] = *base; + select_args[n++] = table[j].result; + TRACE(("atom[%d] %s\n", n, table[j].result)); + break; + } + } + ++base; + } + used[n] = 0; + + if (!strcmp(buf, "?")) { + if (AllowWindowOps(xw, ewGetSelection)) { + TRACE(("Getting selection\n")); + unparseputc1(xw, ANSI_OSC); + unparseputs(xw, "52"); + unparseputc(xw, ';'); + + unparseputs(xw, used); + unparseputc(xw, ';'); + + /* Tell xtermGetSelection data is base64 encoded */ + screen->base64_paste = n; + screen->base64_final = final; + + screen->selection_time = + XtLastTimestampProcessed(TScreenOf(xw)->display); + + /* terminator will be written in this call */ + xtermGetSelection((Widget) xw, + screen->selection_time, + select_args, n, + NULL); + /* + * select_args is used via SelectionReceived, cannot + * free it here. + */ + } else { + free(select_args); + } + } else { + if (AllowWindowOps(xw, ewSetSelection)) { + char *old = buf; + + TRACE(("Setting selection(%s) with %s\n", used, buf)); + screen->selection_time = + XtLastTimestampProcessed(TScreenOf(xw)->display); + + for (j = 0; j < n; ++j) { + buf = old; + ClearSelectionBuffer(screen, select_args[j]); + while (*buf != '\0') { + AppendToSelectionBuffer(screen, + CharOf(*buf++), + select_args[j]); + } + } + CompleteSelection(xw, select_args, n); + } + free(select_args); + } + } + free(used); + } + } +} +#endif /* OPT_PASTE64 */ + +/***====================================================================***/ + +#define IsSetUtf8Title(xw) (IsTitleMode(xw, tmSetUtf8) \ + || (xw->screen.utf8_title) \ + || (xw->screen.c1_printable)) + +static Bool +xtermIsPrintable(XtermWidget xw, Char **bufp, Char *last) +{ + TScreen *screen = TScreenOf(xw); + Bool result = False; + Char *cp = *bufp; + Char *next = cp; + + (void) screen; + (void) last; + +#if OPT_WIDE_CHARS + if (xtermEnvUTF8() && IsSetUtf8Title(xw)) { + PtyData data; + + if (decodeUtf8(screen, fakePtyData(&data, cp, last))) { + if (data.utf_data != UCS_REPL + && (data.utf_data >= 128 || + ansi_table[data.utf_data] == CASE_PRINT)) { + next += (data.utf_size - 1); + result = True; + } else { + result = False; + } + } else { + result = False; + } + } else +#endif +#if OPT_C1_PRINT + if (screen->c1_printable + && (*cp >= 128 && *cp < 160)) { + result = True; + } else +#endif + if (ansi_table[*cp] == CASE_PRINT) { + result = True; + } + *bufp = next; + return result; +} + +/***====================================================================***/ + +/* + * Enum corresponding to the actual OSC codes rather than the internal + * array indices. Compare with TermColors. + */ +typedef enum { + OSC_TEXT_FG = 10 + ,OSC_TEXT_BG + ,OSC_TEXT_CURSOR + ,OSC_MOUSE_FG + ,OSC_MOUSE_BG +#if OPT_TEK4014 + ,OSC_TEK_FG = 15 + ,OSC_TEK_BG +#endif +#if OPT_HIGHLIGHT_COLOR + ,OSC_HIGHLIGHT_BG = 17 +#endif +#if OPT_TEK4014 + ,OSC_TEK_CURSOR = 18 +#endif +#if OPT_HIGHLIGHT_COLOR + ,OSC_HIGHLIGHT_FG = 19 +#endif + ,OSC_NCOLORS +} OscTextColors; + +/* + * Map codes to OSC controls that can reset colors. + */ +#define OSC_RESET 100 +#define OSC_Reset(code) (code) + OSC_RESET + +static Bool +GetOldColors(XtermWidget xw) +{ + if (xw->work.oldColors == NULL) { + int i; + + xw->work.oldColors = TypeXtMalloc(ScrnColors); + if (xw->work.oldColors == NULL) { + xtermWarning("allocation failure in GetOldColors\n"); + return (False); + } + xw->work.oldColors->which = 0; + for (i = 0; i < NCOLORS; i++) { + xw->work.oldColors->colors[i] = 0; + xw->work.oldColors->names[i] = NULL; + } + GetColors(xw, xw->work.oldColors); + } + return (True); +} + +static int +oppositeColor(XtermWidget xw, int n) +{ + Boolean reversed = (xw->misc.re_verse); + + switch (n) { + case TEXT_FG: + n = reversed ? TEXT_FG : TEXT_BG; + break; + case TEXT_BG: + n = reversed ? TEXT_BG : TEXT_FG; + break; + case MOUSE_FG: + n = MOUSE_BG; + break; + case MOUSE_BG: + n = MOUSE_FG; + break; +#if OPT_TEK4014 + case TEK_FG: + n = reversed ? TEK_FG : TEK_BG; + break; + case TEK_BG: + n = reversed ? TEK_BG : TEK_FG; + break; +#endif +#if OPT_HIGHLIGHT_COLOR + case HIGHLIGHT_FG: + n = HIGHLIGHT_BG; + break; + case HIGHLIGHT_BG: + n = HIGHLIGHT_FG; + break; +#endif + default: + break; + } + return n; +} + +static Bool +ReportColorRequest(XtermWidget xw, int ndx, int final) +{ + Bool result = False; + + if (AllowColorOps(xw, ecGetColor)) { + XColor color; + Colormap cmap = xw->core.colormap; + char buffer[80]; + + /* + * ChangeColorsRequest() has "always" chosen the opposite color when + * reverse-video is set. Report this as the original color index, but + * reporting the opposite color which would be used. + */ + int i = (xw->misc.re_verse) ? oppositeColor(xw, ndx) : ndx; + + GetOldColors(xw); + color.pixel = xw->work.oldColors->colors[ndx]; + XQueryColor(TScreenOf(xw)->display, cmap, &color); + sprintf(buffer, "%d;rgb:%04x/%04x/%04x", i + 10, + color.red, + color.green, + color.blue); + TRACE(("ReportColorRequest #%d: 0x%06lx as %s\n", + ndx, xw->work.oldColors->colors[ndx], buffer)); + unparseputc1(xw, ANSI_OSC); + unparseputs(xw, buffer); + unparseputc1(xw, final); + result = True; + } + return result; +} + +static Bool +UpdateOldColors(XtermWidget xw, ScrnColors * pNew) +{ + int i; + + /* if we were going to free old colors, this would be the place to + * do it. I've decided not to (for now), because it seems likely + * that we'd have a small set of colors we use over and over, and that + * we could save some overhead this way. The only case in which this + * (clearly) fails is if someone is trying a boatload of colors, in + * which case they can restart xterm + */ + for (i = 0; i < NCOLORS; i++) { + if (COLOR_DEFINED(pNew, i)) { + if (xw->work.oldColors->names[i] != NULL) { + XtFree(xw->work.oldColors->names[i]); + xw->work.oldColors->names[i] = NULL; + } + if (pNew->names[i]) { + xw->work.oldColors->names[i] = pNew->names[i]; + } + xw->work.oldColors->colors[i] = pNew->colors[i]; + } + } + return (True); +} + +/* + * OSC codes are constant, but the indices for the color arrays depend on how + * xterm is compiled. + */ +static int +OscToColorIndex(OscTextColors mode) +{ + int result = 0; + +#define CASE(name) case OSC_##name: result = name; break + switch (mode) { + CASE(TEXT_FG); + CASE(TEXT_BG); + CASE(TEXT_CURSOR); + CASE(MOUSE_FG); + CASE(MOUSE_BG); +#if OPT_TEK4014 + CASE(TEK_FG); + CASE(TEK_BG); +#endif +#if OPT_HIGHLIGHT_COLOR + CASE(HIGHLIGHT_BG); + CASE(HIGHLIGHT_FG); +#endif +#if OPT_TEK4014 + CASE(TEK_CURSOR); +#endif + case OSC_NCOLORS: + break; + } + return result; +} + +static Bool +ChangeColorsRequest(XtermWidget xw, + int start, + char *names, + int final) +{ + Bool result = False; + ScrnColors newColors; + + TRACE(("ChangeColorsRequest start=%d, names='%s'\n", start, names)); + + if (GetOldColors(xw)) { + int i; + int queried = 0; + + newColors.which = 0; + for (i = 0; i < NCOLORS; i++) { + newColors.names[i] = NULL; + } + for (i = start; i < OSC_NCOLORS; i++) { + int ndx = OscToColorIndex((OscTextColors) i); + if (xw->misc.re_verse) + ndx = oppositeColor(xw, ndx); + + if (IsEmpty(names)) { + newColors.names[ndx] = NULL; + } else { + char *thisName = ((names[0] == ';') ? NULL : names); + + names = strchr(names, ';'); + if (names != NULL) { + *names++ = '\0'; + } + if (thisName != 0) { + if (!strcmp(thisName, "?")) { + if (ReportColorRequest(xw, ndx, final)) + ++queried; + } else if (!xw->work.oldColors->names[ndx] + || strcmp(thisName, xw->work.oldColors->names[ndx])) { + AllocateTermColor(xw, &newColors, ndx, thisName, False); + } + } + } + } + + if (newColors.which != 0) { + ChangeColors(xw, &newColors); + UpdateOldColors(xw, &newColors); + } else if (queried) { + unparse_end(xw); + } + result = True; + } + return result; +} + +static Bool +ResetColorsRequest(XtermWidget xw, + int code) +{ + Bool result = False; + + (void) xw; + (void) code; + + TRACE(("ResetColorsRequest code=%d\n", code)); + +#if OPT_COLOR_RES + if (GetOldColors(xw)) { + ScrnColors newColors; + const char *thisName; + int ndx = OscToColorIndex((OscTextColors) (code - OSC_RESET)); + + if (xw->misc.re_verse) + ndx = oppositeColor(xw, ndx); + + thisName = xw->screen.Tcolors[ndx].resource; + + newColors.which = 0; + newColors.names[ndx] = NULL; + + if (thisName != 0 + && xw->work.oldColors->names[ndx] != 0 + && strcmp(thisName, xw->work.oldColors->names[ndx])) { + AllocateTermColor(xw, &newColors, ndx, thisName, False); + + if (newColors.which != 0) { + ChangeColors(xw, &newColors); + UpdateOldColors(xw, &newColors); + } + } + result = True; + } +#endif + return result; +} + +#if OPT_SHIFT_FONTS +/* + * Initially, 'source' points to '#' or '?'. + * + * Look for an optional sign and optional number. If those are found, lookup + * the corresponding menu font entry. + */ +static int +ParseShiftedFont(XtermWidget xw, String source, String *target) +{ + TScreen *screen = TScreenOf(xw); + int num = screen->menu_font_number; + int rel = 0; + + if (*++source == '+') { + rel = 1; + source++; + } else if (*source == '-') { + rel = -1; + source++; + } + + if (isdigit(CharOf(*source))) { + int val = atoi(source); + if (rel > 0) + rel = val; + else if (rel < 0) + rel = -val; + else + num = val; + } + + if (rel != 0) { + num = lookupRelativeFontSize(xw, + screen->menu_font_number, rel); + + } + TRACE(("ParseShiftedFont(%s) ->%d (%s)\n", *target, num, source)); + *target = source; + return num; +} + +static void +QueryFontRequest(XtermWidget xw, String buf, int final) +{ + if (AllowFontOps(xw, efGetFont)) { + TScreen *screen = TScreenOf(xw); + Bool success = True; + int num; + String base = buf + 1; + const char *name = 0; + + num = ParseShiftedFont(xw, buf, &buf); + if (num < 0 + || num > fontMenu_lastBuiltin) { + Bell(xw, XkbBI_MinorError, 0); + success = False; + } else { +#if OPT_RENDERFONT + if (UsingRenderFont(xw)) { + name = getFaceName(xw, False); + } else +#endif + if ((name = screen->MenuFontName(num)) == 0) { + success = False; + } + } + + unparseputc1(xw, ANSI_OSC); + unparseputs(xw, "50"); + + if (success) { + unparseputc(xw, ';'); + if (buf >= base) { + /* identify the font-entry, unless it is the current one */ + if (*buf != '\0') { + char temp[10]; + + unparseputc(xw, '#'); + sprintf(temp, "%d", num); + unparseputs(xw, temp); + if (*name != '\0') + unparseputc(xw, ' '); + } + } + unparseputs(xw, name); + } + + unparseputc1(xw, final); + unparse_end(xw); + } +} + +static void +ChangeFontRequest(XtermWidget xw, String buf) +{ + if (AllowFontOps(xw, efSetFont)) { + TScreen *screen = TScreenOf(xw); + Bool success = True; + int num; + VTFontNames fonts; + char *name; + + /* + * If the font specification is a "#", followed by an optional sign and + * optional number, lookup the corresponding menu font entry. + * + * Further, if the "#", etc., is followed by a font name, use that + * to load the font entry. + */ + if (*buf == '#') { + num = ParseShiftedFont(xw, buf, &buf); + + if (num < 0 + || num > fontMenu_lastBuiltin) { + Bell(xw, XkbBI_MinorError, 0); + success = False; + } else { + /* + * Skip past the optional number, and any whitespace to look + * for a font specification within the control. + */ + while (isdigit(CharOf(*buf))) { + ++buf; + } + while (isspace(CharOf(*buf))) { + ++buf; + } +#if OPT_RENDERFONT + if (UsingRenderFont(xw)) { + /* EMPTY */ + /* there is only one font entry to load */ + ; + } else +#endif + { + /* + * Normally there is no font specified in the control. + * But if there is, simply overwrite the font entry. + */ + if (*buf == '\0') { + if ((buf = screen->MenuFontName(num)) == 0) { + success = False; + } + } + } + } + } else { + num = screen->menu_font_number; + } + name = x_strtrim(buf); + if (screen->EscapeFontName()) { + FREE_STRING(screen->EscapeFontName()); + screen->EscapeFontName() = 0; + } + if (success && !IsEmpty(name)) { +#if OPT_RENDERFONT + if (UsingRenderFont(xw)) { + setFaceName(xw, name); + xtermUpdateFontInfo(xw, True); + } else +#endif + { + memset(&fonts, 0, sizeof(fonts)); + fonts.f_n = name; + SetVTFont(xw, num, True, &fonts); + if (num == screen->menu_font_number && + num != fontMenu_fontescape) { + screen->EscapeFontName() = x_strdup(name); + } + } + } else { + Bell(xw, XkbBI_MinorError, 0); + } + update_font_escape(); + free(name); + } +} +#endif /* OPT_SHIFT_FONTS */ + +/***====================================================================***/ + +void +do_osc(XtermWidget xw, Char *oscbuf, size_t len, int final) +{ + TScreen *screen = TScreenOf(xw); + int mode; + Char *cp; + int state = 0; + char *buf = 0; + char temp[2]; +#if OPT_ISO_COLORS + int ansi_colors = 0; +#endif + Bool need_data = True; + Bool optional_data = False; + + TRACE(("do_osc %s\n", oscbuf)); + + (void) screen; + + /* + * Lines should be of the form number ; string , however + * older xterms can accept as a final character. We will respond + * with the same final character as the application sends to make this + * work better with shell scripts, which may have trouble reading an + * , which is the 7-bit equivalent to . + */ + mode = 0; + for (cp = oscbuf; *cp != '\0'; cp++) { + switch (state) { + case 0: + if (isdigit(*cp)) { + mode = 10 * mode + (*cp - '0'); + if (mode > 65535) { + TRACE(("do_osc found unknown mode %d\n", mode)); + return; + } + break; + } else { + switch (*cp) { + case 'I': + xtermLoadIcon(xw, (char *) ++cp); + return; + case 'l': + ChangeTitle(xw, (char *) ++cp); + return; + case 'L': + ChangeIconName(xw, (char *) ++cp); + return; + } + } + /* FALLTHRU */ + case 1: + if (*cp != ';') { + TRACE(("do_osc did not find semicolon offset %d\n", + (int) (cp - oscbuf))); + return; + } + state = 2; + break; + case 2: + buf = (char *) cp; + state = 3; + /* FALLTHRU */ + default: + if (!xtermIsPrintable(xw, &cp, oscbuf + len)) { + switch (mode) { + case 0: + case 1: + case 2: + break; + default: + TRACE(("do_osc found nonprinting char %02X offset %d\n", + CharOf(*cp), + (int) (cp - oscbuf))); + return; + } + } + } + } + + /* + * Check if the palette changed and there are no more immediate changes + * that could be deferred to the next repaint. + */ + if (xw->work.palette_changed) { + switch (mode) { + case 03: /* change X property */ + case 30: /* Konsole (unused) */ + case 31: /* Konsole (unused) */ + case 50: /* font operations */ + case 51: /* Emacs (unused) */ +#if OPT_PASTE64 + case 52: /* selection data */ +#endif + TRACE(("forced repaint after palette changed\n")); + xw->work.palette_changed = False; + xtermRepaint(xw); + break; + default: + xtermNeedSwap(xw, 1); + break; + } + } + + /* + * Most OSC controls other than resets require data. Handle the others as + * a special case. + */ + switch (mode) { + case 50: +#if OPT_ISO_COLORS + case OSC_Reset(4): + case OSC_Reset(5): + need_data = False; + optional_data = True; + break; + case OSC_Reset(OSC_TEXT_FG): + case OSC_Reset(OSC_TEXT_BG): + case OSC_Reset(OSC_TEXT_CURSOR): + case OSC_Reset(OSC_MOUSE_FG): + case OSC_Reset(OSC_MOUSE_BG): +#if OPT_HIGHLIGHT_COLOR + case OSC_Reset(OSC_HIGHLIGHT_BG): + case OSC_Reset(OSC_HIGHLIGHT_FG): +#endif +#if OPT_TEK4014 + case OSC_Reset(OSC_TEK_FG): + case OSC_Reset(OSC_TEK_BG): + case OSC_Reset(OSC_TEK_CURSOR): +#endif + need_data = False; + break; +#endif + default: + break; + } + + /* + * Check if we have data when we want, and not when we do not want it. + * Either way, that is a malformed control sequence, and will be ignored. + */ + if (IsEmpty(buf)) { + if (need_data) { + TRACE(("do_osc found no data\n")); + return; + } + temp[0] = '\0'; + buf = temp; + } else if (!need_data && !optional_data) { + TRACE(("do_osc found unwanted data\n")); + return; + } + + switch (mode) { + case 0: /* new icon name and title */ + ChangeIconName(xw, buf); + ChangeTitle(xw, buf); + break; + + case 1: /* new icon name only */ + ChangeIconName(xw, buf); + break; + + case 2: /* new title only */ + ChangeTitle(xw, buf); + break; + + case 3: /* change X property */ + if (AllowWindowOps(xw, ewSetXprop)) + ChangeXprop(buf); + break; +#if OPT_ISO_COLORS + case 5: + ansi_colors = NUM_ANSI_COLORS; + /* FALLTHRU */ + case 4: + if (ChangeAnsiColorRequest(xw, mode, buf, ansi_colors, final)) + xw->work.palette_changed = True; + break; + case 6: + /* FALLTHRU */ + case OSC_Reset(6): + TRACE(("parse colorXXMode:%s\n", buf)); + while (*buf != '\0') { + long which = 0; + long value = 0; + char *next; + if (*buf == ';') { + ++buf; + } else { + which = strtol(buf, &next, 10); + if (!PartS2L(buf, next) || (which < 0)) + break; + buf = next; + if (*buf == ';') + ++buf; + } + if (*buf == ';') { + ++buf; + } else { + value = strtol(buf, &next, 10); + if (!PartS2L(buf, next) || (value < 0)) + break; + buf = next; + if (*buf == ';') + ++buf; + } + TRACE(("updating colorXXMode which=%ld, value=%ld\n", which, value)); + switch (which) { + case 0: + screen->colorBDMode = (value != 0); + break; + case 1: + screen->colorULMode = (value != 0); + break; + case 2: + screen->colorBLMode = (value != 0); + break; + case 3: + screen->colorRVMode = (value != 0); + break; +#if OPT_WIDE_ATTRS + case 4: + screen->colorITMode = (value != 0); + break; +#endif + default: + TRACE(("...unknown colorXXMode\n")); + break; + } + } + break; + case OSC_Reset(5): + ansi_colors = NUM_ANSI_COLORS; + /* FALLTHRU */ + case OSC_Reset(4): + if (ResetAnsiColorRequest(xw, buf, ansi_colors)) + xw->work.palette_changed = True; + break; +#endif + case OSC_TEXT_FG: + case OSC_TEXT_BG: + case OSC_TEXT_CURSOR: + case OSC_MOUSE_FG: + case OSC_MOUSE_BG: +#if OPT_HIGHLIGHT_COLOR + case OSC_HIGHLIGHT_BG: + case OSC_HIGHLIGHT_FG: +#endif +#if OPT_TEK4014 + case OSC_TEK_FG: + case OSC_TEK_BG: + case OSC_TEK_CURSOR: +#endif + if (xw->misc.dynamicColors) { + ChangeColorsRequest(xw, mode, buf, final); + } + break; + case OSC_Reset(OSC_TEXT_FG): + case OSC_Reset(OSC_TEXT_BG): + case OSC_Reset(OSC_TEXT_CURSOR): + case OSC_Reset(OSC_MOUSE_FG): + case OSC_Reset(OSC_MOUSE_BG): +#if OPT_HIGHLIGHT_COLOR + case OSC_Reset(OSC_HIGHLIGHT_BG): + case OSC_Reset(OSC_HIGHLIGHT_FG): +#endif +#if OPT_TEK4014 + case OSC_Reset(OSC_TEK_FG): + case OSC_Reset(OSC_TEK_BG): + case OSC_Reset(OSC_TEK_CURSOR): +#endif + if (xw->misc.dynamicColors) { + ResetColorsRequest(xw, mode); + } + break; + + case 30: + case 31: + /* reserved for Konsole (Stephan Binner ) */ + break; + +#ifdef ALLOWLOGGING + case 46: /* new log file */ +#ifdef ALLOWLOGFILECHANGES + /* + * Warning, enabling this feature allows people to overwrite + * arbitrary files accessible to the person running xterm. + */ + if (strcmp(buf, "?")) { + char *bp; + if ((bp = x_strdup(buf)) != NULL) { + if (screen->logfile) + free(screen->logfile); + screen->logfile = bp; + break; + } + } +#endif + Bell(xw, XkbBI_Info, 0); + Bell(xw, XkbBI_Info, 0); + break; +#endif /* ALLOWLOGGING */ + + case 50: +#if OPT_SHIFT_FONTS + if (*buf == '?') { + QueryFontRequest(xw, buf, final); + } else if (xw->misc.shift_fonts) { + ChangeFontRequest(xw, buf); + } +#endif /* OPT_SHIFT_FONTS */ + break; + case 51: + /* reserved for Emacs shell (Rob Mayoff ) */ + break; + +#if OPT_PASTE64 + case 52: + ManipulateSelectionData(xw, screen, buf, final); + break; +#endif + /* + * One could write code to send back the display and host names, + * but that could potentially open a fairly nasty security hole. + */ + default: + TRACE(("do_osc - unrecognized code\n")); + break; + } + unparse_end(xw); +} + +/* + * Parse one nibble of a hex byte from the OSC string. We have removed the + * string-terminator (replacing it with a null), so the only other delimiter + * that is expected is semicolon. Ignore other characters (Ray Neuman says + * "real" terminals accept commas in the string definitions). + */ +static int +udk_value(const char **cp) +{ + int result = -1; + + for (;;) { + int c; + + if ((c = **cp) != '\0') + *cp = *cp + 1; + if (c == ';' || c == '\0') + break; + if ((result = x_hex2int(c)) >= 0) + break; + } + + return result; +} + +void +reset_decudk(XtermWidget xw) +{ + int n; + for (n = 0; n < MAX_UDK; n++) { + if (xw->work.user_keys[n].str != 0) { + free(xw->work.user_keys[n].str); + xw->work.user_keys[n].str = 0; + xw->work.user_keys[n].len = 0; + } + } +} + +/* + * Parse the data for DECUDK (user-defined keys). + */ +static void +parse_decudk(XtermWidget xw, const char *cp) +{ + while (*cp) { + const char *base = cp; + char *str = malloc(strlen(cp) + 3); + unsigned key = 0; + int len = 0; + + if (str == NULL) + break; + + while (isdigit(CharOf(*cp))) + key = (key * 10) + (unsigned) (*cp++ - '0'); + + if (*cp == '/') { + int lo, hi; + + cp++; + while ((hi = udk_value(&cp)) >= 0 + && (lo = udk_value(&cp)) >= 0) { + str[len++] = (char) ((hi << 4) | lo); + } + } + if (len > 0 && key < MAX_UDK) { + str[len] = '\0'; + if (xw->work.user_keys[key].str != 0) + free(xw->work.user_keys[key].str); + xw->work.user_keys[key].str = str; + xw->work.user_keys[key].len = len; + TRACE(("parse_decudk %d:%.*s\n", key, len, str)); + } else { + free(str); + } + if (*cp == ';') + cp++; + if (cp == base) /* badly-formed sequence - bail out */ + break; + } +} + +/* + * Parse numeric parameters. Normally we use a state machine to simplify + * interspersing with control characters, but have the string already. + */ +static void +parse_ansi_params(ANSI *params, const char **string) +{ + const char *cp = *string; + ParmType nparam = 0; + int last_empty = 1; + + memset(params, 0, sizeof(*params)); + while (*cp != '\0') { + Char ch = CharOf(*cp++); + + if (isdigit(ch)) { + last_empty = 0; + if (nparam < NPARAM) { + params->a_param[nparam] = + (ParmType) ((params->a_param[nparam] * 10) + + (ch - '0')); + } + } else if (ch == ';') { + last_empty = 1; + nparam++; + } else if (ch < 32) { + /* EMPTY */ ; + } else { + /* should be 0x30 to 0x7e */ + params->a_final = ch; + break; + } + } + + *string = cp; + if (!last_empty) + nparam++; + if (nparam > NPARAM) + params->a_nparam = NPARAM; + else + params->a_nparam = nparam; +} + +#if OPT_TRACE +#define SOFT_WIDE 10 +#define SOFT_HIGH 20 + +static void +parse_decdld(ANSI *params, const char *string) +{ + char DscsName[8]; + int len; + int Pfn = params->a_param[0]; + int Pcn = params->a_param[1]; + int Pe = params->a_param[2]; + int Pcmw = params->a_param[3]; + int Pw = params->a_param[4]; + int Pt = params->a_param[5]; + int Pcmh = params->a_param[6]; + int Pcss = params->a_param[7]; + + int start_char = Pcn + 0x20; + int char_wide = ((Pcmw == 0) + ? (Pcss ? 6 : 10) + : (Pcmw > 4 + ? Pcmw + : (Pcmw + 3))); + int char_high = ((Pcmh == 0) + ? ((Pcmw >= 2 && Pcmw <= 4) + ? 10 + : 20) + : Pcmh); + Char ch; + Char bits[SOFT_HIGH][SOFT_WIDE]; + Bool first = True; + Bool prior = False; + int row = 0, col = 0; + + TRACE(("Parsing DECDLD\n")); + TRACE((" font number %d\n", Pfn)); + TRACE((" starting char %d\n", Pcn)); + TRACE((" erase control %d\n", Pe)); + TRACE((" char-width %d\n", Pcmw)); + TRACE((" font-width %d\n", Pw)); + TRACE((" text/full %d\n", Pt)); + TRACE((" char-height %d\n", Pcmh)); + TRACE((" charset-size %d\n", Pcss)); + + if (Pfn > 1 + || Pcn > 95 + || Pe > 2 + || Pcmw > 10 + || Pcmw == 1 + || Pt > 2 + || Pcmh > 20 + || Pcss > 1 + || char_wide > SOFT_WIDE + || char_high > SOFT_HIGH) { + TRACE(("DECDLD illegal parameter\n")); + return; + } + + len = 0; + while (*string != '\0') { + ch = CharOf(*string++); + if (ch >= ANSI_SPA && ch <= 0x2f) { + if (len < 2) + DscsName[len++] = (char) ch; + } else if (ch >= 0x30 && ch <= 0x7e) { + DscsName[len++] = (char) ch; + break; + } + } + DscsName[len] = 0; + TRACE((" Dscs name '%s'\n", DscsName)); + + TRACE((" character matrix %dx%d\n", char_high, char_wide)); + while (*string != '\0') { + if (first) { + TRACE(("Char %d:\n", start_char)); + if (prior) { + for (row = 0; row < char_high; ++row) { + TRACE(("%.*s\n", char_wide, bits[row])); + } + } + prior = False; + first = False; + for (row = 0; row < char_high; ++row) { + for (col = 0; col < char_wide; ++col) { + bits[row][col] = '.'; + } + } + row = col = 0; + } + ch = CharOf(*string++); + if (ch >= 0x3f && ch <= 0x7e) { + int n; + + ch = CharOf(ch - 0x3f); + for (n = 0; n < 6; ++n) { + bits[row + n][col] = CharOf((ch & (1 << n)) ? '*' : '.'); + } + col += 1; + prior = True; + } else if (ch == '/') { + row += 6; + col = 0; + } else if (ch == ';') { + first = True; + ++start_char; + } + } +} +#else +#define parse_decdld(p,q) /* nothing */ +#endif + +#if OPT_DEC_RECTOPS +static const char * +skip_params(const char *cp) +{ + while (*cp == ';' || (*cp >= '0' && *cp <= '9')) + ++cp; + return cp; +} + +static int +parse_int_param(const char **cp) +{ + int result = 0; + const char *s = *cp; + while (*s != '\0') { + if (*s == ';') { + ++s; + break; + } else if (*s >= '0' && *s <= '9') { + result = (result * 10) + (*s++ - '0'); + } else { + s += strlen(s); + } + } + TRACE(("parse-int %s ->%d, %#x->%s\n", *cp, result, result, s)); + *cp = s; + return result; +} + +static int +parse_chr_param(const char **cp) +{ + int result = 0; + const char *s = *cp; + if (*s != '\0') { + if ((result = CharOf(*s++)) != 0) { + if (*s == ';') { + ++s; + } else if (*s != '\0') { + result = 0; + } + } + } + TRACE(("parse-chr %s ->%d, %#x->%s\n", *cp, result, result, s)); + *cp = s; + return result; +} + +static void +restore_DECCIR(XtermWidget xw, const char *cp) +{ + TScreen *screen = TScreenOf(xw); + int value; + + /* row */ + if ((value = parse_int_param(&cp)) <= 0 || value > MaxRows(screen)) + return; + screen->cur_row = (value - 1); + + /* column */ + if ((value = parse_int_param(&cp)) <= 0 || value > MaxCols(screen)) + return; + screen->cur_col = (value - 1); + + /* page */ + if ((value = parse_int_param(&cp)) != 1) + return; + + /* rendition */ + if (((value = parse_chr_param(&cp)) & 0xf0) != 0x40) + return; + UIntClr(xw->flags, (INVERSE | BLINK | UNDERLINE | BOLD)); + xw->flags |= (value & 8) ? INVERSE : 0; + xw->flags |= (value & 4) ? BLINK : 0; + xw->flags |= (value & 2) ? UNDERLINE : 0; + xw->flags |= (value & 1) ? BOLD : 0; + + /* attributes */ + if (((value = parse_chr_param(&cp)) & 0xfe) != 0x40) + return; + screen->protected_mode &= ~DEC_PROTECT; + screen->protected_mode |= (value & 1) ? DEC_PROTECT : 0; + + /* flags */ + if (((value = parse_chr_param(&cp)) & 0xf0) != 0x40) + return; + screen->do_wrap = (value & 8) ? True : False; + screen->curss = (Char) ((value & 4) ? 3 : ((value & 2) ? 2 : 0)); + UIntClr(xw->flags, ORIGIN); + xw->flags |= (value & 1) ? ORIGIN : 0; + + if ((value = (parse_chr_param(&cp) - '0')) < 0 || value >= NUM_GSETS) + return; + screen->curgl = (Char) value; + + if ((value = (parse_chr_param(&cp) - '0')) < 0 || value >= NUM_GSETS) + return; + screen->curgr = (Char) value; + + /* character-set size */ + if ((value = parse_chr_param(&cp)) != 0x4f) /* works for xterm */ + return; + + /* SCS designators */ + for (value = 0; value < NUM_GSETS; ++value) { + if (*cp == '%') { + xtermDecodeSCS(xw, value, '%', *++cp); + } else if (*cp != '\0') { + xtermDecodeSCS(xw, value, '\0', *cp); + } else { + return; + } + cp++; + } + + TRACE(("...done DECCIR\n")); +} + +static void +restore_DECTABSR(XtermWidget xw, const char *cp) +{ + int stop = 0; + Bool fail = False; + + TabZonk(xw->tabs); + while (*cp != '\0' && !fail) { + if ((*cp) >= '0' && (*cp) <= '9') { + stop = (stop * 10) + ((*cp) - '0'); + } else if (*cp == '/') { + --stop; + if (OkTAB(stop)) { + TabSet(xw->tabs, stop); + stop = 0; + } else { + fail = True; + } + } else { + fail = True; + } + ++cp; + } + --stop; + if (OkTAB(stop)) + TabSet(xw->tabs, stop); + + TRACE(("...done DECTABSR\n")); +} +#endif + +void +do_dcs(XtermWidget xw, Char *dcsbuf, size_t dcslen) +{ + TScreen *screen = TScreenOf(xw); + char reply[BUFSIZ]; + const char *cp = (const char *) dcsbuf; + Bool okay; + ANSI params; +#if OPT_DEC_RECTOPS + char psarg = '0'; +#endif + + TRACE(("do_dcs(%s:%lu)\n", (char *) dcsbuf, (unsigned long) dcslen)); + + if (dcslen != strlen(cp)) + /* shouldn't have nulls in the string */ + return; + + switch (*cp) { /* intermediate character, or parameter */ + case '$': /* DECRQSS */ + okay = True; + + cp++; + if (*cp == 'q') { + *reply = '\0'; + cp++; + if (!strcmp(cp, "\"q")) { /* DECSCA */ + TRACE(("DECRQSS -> DECSCA\n")); + sprintf(reply, "%d%s", + (screen->protected_mode == DEC_PROTECT) + && (xw->flags & PROTECTED) ? 1 : 0, + cp); + } else if (!strcmp(cp, "\"p")) { /* DECSCL */ + if (screen->vtXX_level < 2) { + /* actually none of DECRQSS is valid for vt100's */ + break; + } + TRACE(("DECRQSS -> DECSCL\n")); + sprintf(reply, "%d%s%s", + (screen->vtXX_level ? + screen->vtXX_level : 1) + 60, + (screen->vtXX_level >= 2) + ? (screen->control_eight_bits + ? ";0" : ";1") + : "", + cp); + } else if (!strcmp(cp, "r")) { /* DECSTBM */ + TRACE(("DECRQSS -> DECSTBM\n")); + sprintf(reply, "%d;%dr", + screen->top_marg + 1, + screen->bot_marg + 1); + } else if (!strcmp(cp, "s")) { /* DECSLRM */ + if (screen->vtXX_level >= 4) { /* VT420 */ + TRACE(("DECRQSS -> DECSLRM\n")); + sprintf(reply, "%d;%ds", + screen->lft_marg + 1, + screen->rgt_marg + 1); + } else { + okay = False; + } + } else if (!strcmp(cp, "m")) { /* SGR */ + TRACE(("DECRQSS -> SGR\n")); + xtermFormatSGR(xw, reply, xw->flags, xw->cur_foreground, xw->cur_background); + strcat(reply, "m"); + } else if (!strcmp(cp, " q")) { /* DECSCUSR */ + int code = STEADY_BLOCK; + if (isCursorUnderline(screen)) + code = STEADY_UNDERLINE; + else if (isCursorBar(screen)) + code = STEADY_BAR; +#if OPT_BLINK_CURS + if (screen->cursor_blink_esc != 0) + code -= 1; +#endif + TRACE(("reply DECSCUSR\n")); + sprintf(reply, "%d%s", code, cp); + } else if (!strcmp(cp, "t")) { /* DECSLPP */ + sprintf(reply, "%d%s", + ((screen->max_row > 24) ? screen->max_row : 24), + cp); + TRACE(("reply DECSLPP\n")); + } else if (!strcmp(cp, "$|")) { /* DECSCPP */ + TRACE(("reply DECSCPP\n")); + sprintf(reply, "%d%s", + ((xw->flags & IN132COLUMNS) ? 132 : 80), + cp); + } else if (!strcmp(cp, "*|")) { /* DECSNLS */ + TRACE(("reply DECSNLS\n")); + sprintf(reply, "%d%s", + screen->max_row + 1, + cp); + } else { + okay = False; + } + + unparseputc1(xw, ANSI_DCS); + unparseputc(xw, okay ? '1' : '0'); + unparseputc(xw, '$'); + unparseputc(xw, 'r'); + cp = reply; + unparseputs(xw, cp); + unparseputc1(xw, ANSI_ST); + } else { + unparseputc(xw, ANSI_CAN); + } + break; + case '+': + cp++; + switch (*cp) { +#if OPT_TCAP_QUERY + case 'p': + if (AllowTcapOps(xw, etSetTcap)) { + set_termcap(xw, cp + 1); + } + break; + case 'q': + if (AllowTcapOps(xw, etGetTcap)) { + Bool fkey; + unsigned state; + int code; + const char *tmp; + const char *parsed = ++cp; + + code = xtermcapKeycode(xw, &parsed, &state, &fkey); + + unparseputc1(xw, ANSI_DCS); + + unparseputc(xw, code >= 0 ? '1' : '0'); + + unparseputc(xw, '+'); + unparseputc(xw, 'r'); + + while (*cp != 0 && (code >= -1)) { + if (cp == parsed) + break; /* no data found, error */ + + for (tmp = cp; tmp != parsed; ++tmp) + unparseputc(xw, *tmp); + + if (code >= 0) { + unparseputc(xw, '='); + screen->tc_query_code = code; + screen->tc_query_fkey = fkey; +#if OPT_ISO_COLORS + /* XK_COLORS is a fake code for the "Co" entry (maximum + * number of colors) */ + if (code == XK_COLORS) { + unparseputn(xw, (unsigned) NUM_ANSI_COLORS); + } else +#if OPT_DIRECT_COLOR + if (code == XK_RGB) { + if (TScreenOf(xw)->direct_color && xw->has_rgb) { + if (xw->rgb_widths[0] == xw->rgb_widths[1] && + xw->rgb_widths[1] == xw->rgb_widths[2]) { + unparseputn(xw, xw->rgb_widths[0]); + } else { + char temp[1024]; + sprintf(temp, "%d/%d/%d", + xw->rgb_widths[0], + xw->rgb_widths[1], + xw->rgb_widths[2]); + unparseputs(xw, temp); + } + } else { + unparseputs(xw, "-1"); + } + } else +#endif +#endif + if (code == XK_TCAPNAME) { + unparseputs(xw, resource.term_name); + } else { + XKeyEvent event; + memset(&event, 0, sizeof(event)); + event.state = state; + Input(xw, &event, False); + } + screen->tc_query_code = -1; + } else { + break; /* no match found, error */ + } + + cp = parsed; + if (*parsed == ';') { + unparseputc(xw, *parsed++); + cp = parsed; + code = xtermcapKeycode(xw, &parsed, &state, &fkey); + } + } + unparseputc1(xw, ANSI_ST); + } + break; +#endif +#if OPT_XRES_QUERY + case 'Q': + ++cp; + if (AllowXResOps(xw)) { + Boolean first = True; + while (*cp != '\0') { + const char *parsed = 0; + const char *tmp; + char *name = x_decode_hex(cp, &parsed); + char *value; + char *result; + if (cp == parsed || name == NULL) { + free(name); + break; /* no data found, error */ + } + TRACE(("query-feature '%s'\n", name)); + if ((value = vt100ResourceToString(xw, name)) != 0) { + okay = True; /* valid */ + } else { + okay = False; /* invalid */ + } + if (first) { + unparseputc1(xw, ANSI_DCS); + unparseputc(xw, okay ? '1' : '0'); + unparseputc(xw, '+'); + unparseputc(xw, 'R'); + first = False; + } + + for (tmp = cp; tmp != parsed; ++tmp) + unparseputc(xw, *tmp); + + if (value != 0) { + unparseputc1(xw, '='); + result = x_encode_hex(value); + unparseputs(xw, result); + } else { + result = NULL; + } + + free(name); + free(value); + free(result); + + cp = parsed; + if (*parsed == ';') { + unparseputc(xw, *parsed++); + cp = parsed; + } + } + if (!first) + unparseputc1(xw, ANSI_ST); + } + break; +#endif + } + break; +#if OPT_DEC_RECTOPS + case '1': + /* FALLTHRU */ + case '2': + if (*skip_params(cp) == '$') { + psarg = *cp++; + if ((*cp++ == '$') + && (*cp++ == 't') + && (screen->vtXX_level >= 3)) { + switch (psarg) { + case '1': + TRACE(("DECRSPS (DECCIR)\n")); + restore_DECCIR(xw, cp); + break; + case '2': + TRACE(("DECRSPS (DECTABSR)\n")); + restore_DECTABSR(xw, cp); + break; + } + } + break; + } +#endif + /* FALLTHRU */ + default: + if (GraphicsId(screen) == 125 || + screen->vtXX_level >= 2) { /* VT220 */ + parse_ansi_params(¶ms, &cp); + switch (params.a_final) { + case 'p': +#if OPT_REGIS_GRAPHICS + if (GraphicsId(screen) == 125 || + optRegisGraphics(screen)) { + parse_regis(xw, ¶ms, cp); + } +#else + TRACE(("ignoring ReGIS graphic (compilation flag not enabled)\n")); +#endif + break; + case 'q': +#if OPT_SIXEL_GRAPHICS + if (GraphicsId(screen) == 125 || + optSixelGraphics(screen)) { + (void) parse_sixel(xw, ¶ms, cp); + } +#else + TRACE(("ignoring sixel graphic (compilation flag not enabled)\n")); +#endif + break; + case '|': /* DECUDK */ + if (screen->vtXX_level >= 2) { /* VT220 */ + if (params.a_param[0] == 0) + reset_decudk(xw); + parse_decudk(xw, cp); + } + break; + case L_CURL: /* DECDLD */ + if (screen->vtXX_level >= 2) { /* VT220 */ + parse_decdld(¶ms, cp); + } + break; + } + } + break; + } + unparse_end(xw); +} + +#if OPT_DEC_RECTOPS +enum { + mdUnknown = 0, + mdMaybeSet = 1, + mdMaybeReset = 2, + mdAlwaysSet = 3, + mdAlwaysReset = 4 +}; + +#define MdBool(bool) ((bool) ? mdMaybeSet : mdMaybeReset) +#define MdFlag(mode,flag) MdBool((mode) & (flag)) + +/* + * Reply is the same format as the query, with pair of mode/value: + * 0 - not recognized + * 1 - set + * 2 - reset + * 3 - permanently set + * 4 - permanently reset + * Only one mode can be reported at a time. + */ +void +do_ansi_rqm(XtermWidget xw, int nparams, int *params) +{ + ANSI reply; + int count = 0; + + TRACE(("do_ansi_rqm %d:%d\n", nparams, params[0])); + memset(&reply, 0, sizeof(reply)); + + if (nparams >= 1) { + int result = mdUnknown; + + /* DECRQM can only ask about one mode at a time */ + switch (params[0]) { + case 1: /* GATM */ + result = mdAlwaysReset; + break; + case 2: + result = MdFlag(xw->keyboard.flags, MODE_KAM); + break; + case 3: /* CRM */ + result = mdMaybeReset; + break; + case 4: + result = MdFlag(xw->flags, INSERT); + break; + case 5: /* SRTM */ + case 7: /* VEM */ + case 10: /* HEM */ + case 11: /* PUM */ + result = mdAlwaysReset; + break; + case 12: + result = MdFlag(xw->keyboard.flags, MODE_SRM); + break; + case 13: /* FEAM */ + case 14: /* FETM */ + case 15: /* MATM */ + case 16: /* TTM */ + case 17: /* SATM */ + case 18: /* TSM */ + case 19: /* EBM */ + result = mdAlwaysReset; + break; + case 20: + result = MdFlag(xw->flags, LINEFEED); + break; + } + reply.a_param[count++] = (ParmType) params[0]; + reply.a_param[count++] = (ParmType) result; + } + reply.a_type = ANSI_CSI; + reply.a_nparam = (ParmType) count; + reply.a_inters = '$'; + reply.a_final = 'y'; + unparseseq(xw, &reply); +} + +void +do_dec_rqm(XtermWidget xw, int nparams, int *params) +{ + ANSI reply; + int count = 0; + + TRACE(("do_dec_rqm %d:%d\n", nparams, params[0])); + memset(&reply, 0, sizeof(reply)); + + if (nparams >= 1) { + TScreen *screen = TScreenOf(xw); + int result = mdUnknown; + + /* DECRQM can only ask about one mode at a time */ + switch ((DECSET_codes) params[0]) { + case srm_DECCKM: + result = MdFlag(xw->keyboard.flags, MODE_DECCKM); + break; + case srm_DECANM: /* ANSI/VT52 mode */ +#if OPT_VT52_MODE + result = MdBool(screen->vtXX_level >= 1); +#else + result = mdMaybeSet; +#endif + break; + case srm_DECCOLM: + result = MdFlag(xw->flags, IN132COLUMNS); + break; + case srm_DECSCLM: /* (slow scroll) */ + result = MdFlag(xw->flags, SMOOTHSCROLL); + break; + case srm_DECSCNM: + result = MdFlag(xw->flags, REVERSE_VIDEO); + break; + case srm_DECOM: + result = MdFlag(xw->flags, ORIGIN); + break; + case srm_DECAWM: + result = MdFlag(xw->flags, WRAPAROUND); + break; + case srm_DECARM: + result = mdAlwaysReset; + break; + case srm_X10_MOUSE: /* X10 mouse */ + result = MdBool(screen->send_mouse_pos == X10_MOUSE); + break; +#if OPT_TOOLBAR + case srm_RXVT_TOOLBAR: + result = MdBool(resource.toolBar); + break; +#endif +#if OPT_BLINK_CURS + case srm_ATT610_BLINK: /* AT&T 610: Start/stop blinking cursor */ + result = MdBool(screen->cursor_blink_esc); + break; + case srm_CURSOR_BLINK_OPS: + switch (screen->cursor_blink) { + case cbTrue: + result = mdMaybeSet; + break; + case cbFalse: + result = mdMaybeReset; + break; + case cbAlways: + result = mdAlwaysSet; + break; + case cbLAST: + /* FALLTHRU */ + case cbNever: + result = mdAlwaysReset; + break; + } + break; + case srm_XOR_CURSOR_BLINKS: + result = (screen->cursor_blink_xor + ? mdAlwaysSet + : mdAlwaysReset); + break; +#endif + case srm_DECPFF: /* print form feed */ + result = MdBool(PrinterOf(screen).printer_formfeed); + break; + case srm_DECPEX: /* print extent */ + result = MdBool(PrinterOf(screen).printer_extent); + break; + case srm_DECTCEM: /* Show/hide cursor (VT200) */ + result = MdBool(screen->cursor_set); + break; + case srm_RXVT_SCROLLBAR: + result = MdBool(screen->fullVwin.sb_info.width != OFF); + break; +#if OPT_SHIFT_FONTS + case srm_RXVT_FONTSIZE: + result = MdBool(xw->misc.shift_fonts); + break; +#endif +#if OPT_TEK4014 + case srm_DECTEK: + result = MdBool(TEK4014_ACTIVE(xw)); + break; +#endif + case srm_132COLS: + result = MdBool(screen->c132); + break; + case srm_CURSES_HACK: + result = MdBool(screen->curses); + break; + case srm_DECNRCM: /* national charset (VT220) */ + if (screen->vtXX_level >= 2) { + result = MdFlag(xw->flags, NATIONAL); + } else { + result = 0; + } + break; + case srm_MARGIN_BELL: /* margin bell */ + result = MdBool(screen->marginbell); + break; + case srm_REVERSEWRAP: /* reverse wraparound */ + result = MdFlag(xw->flags, REVERSEWRAP); + break; +#ifdef ALLOWLOGGING + case srm_ALLOWLOGGING: /* logging */ +#ifdef ALLOWLOGFILEONOFF + result = MdBool(screen->logging); +#else + result = ((MdBool(screen->logging) == mdMaybeSet) + ? mdAlwaysSet + : mdAlwaysReset); +#endif /* ALLOWLOGFILEONOFF */ + break; +#endif + case srm_OPT_ALTBUF_CURSOR: /* alternate buffer & cursor */ + /* FALLTHRU */ + case srm_OPT_ALTBUF: + /* FALLTHRU */ + case srm_ALTBUF: + result = MdBool(screen->whichBuf); + break; + case srm_DECNKM: + result = MdFlag(xw->keyboard.flags, MODE_DECKPAM); + break; + case srm_DECBKM: + result = MdFlag(xw->keyboard.flags, MODE_DECBKM); + break; + case srm_DECLRMM: + if (screen->vtXX_level >= 4) { /* VT420 */ + result = MdFlag(xw->flags, LEFT_RIGHT); + } else { + result = 0; + } + break; +#if OPT_SIXEL_GRAPHICS + case srm_DECSDM: + result = MdFlag(xw->keyboard.flags, MODE_DECSDM); + break; +#endif + case srm_DECNCSM: + if (screen->vtXX_level >= 5) { /* VT510 */ + result = MdFlag(xw->flags, NOCLEAR_COLM); + } else { + result = 0; + } + break; + case srm_VT200_MOUSE: /* xterm bogus sequence */ + result = MdBool(screen->send_mouse_pos == VT200_MOUSE); + break; + case srm_VT200_HIGHLIGHT_MOUSE: /* xterm sequence w/hilite tracking */ + result = MdBool(screen->send_mouse_pos == VT200_HIGHLIGHT_MOUSE); + break; + case srm_BTN_EVENT_MOUSE: + result = MdBool(screen->send_mouse_pos == BTN_EVENT_MOUSE); + break; + case srm_ANY_EVENT_MOUSE: + result = MdBool(screen->send_mouse_pos == ANY_EVENT_MOUSE); + break; +#if OPT_FOCUS_EVENT + case srm_FOCUS_EVENT_MOUSE: + result = MdBool(screen->send_focus_pos); + break; +#endif + case srm_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_SGR_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_URXVT_EXT_MODE_MOUSE: + /* FALLTHRU */ + case srm_PIXEL_POSITION_MOUSE: + result = MdBool(screen->extend_coords == params[0]); + break; + case srm_ALTERNATE_SCROLL: + result = MdBool(screen->alternateScroll); + break; + case srm_RXVT_SCROLL_TTY_OUTPUT: + result = MdBool(screen->scrollttyoutput); + break; + case srm_RXVT_SCROLL_TTY_KEYPRESS: + result = MdBool(screen->scrollkey); + break; + case srm_EIGHT_BIT_META: + result = MdBool(screen->eight_bit_meta); + break; +#if OPT_NUM_LOCK + case srm_REAL_NUMLOCK: + result = MdBool(xw->misc.real_NumLock); + break; + case srm_META_SENDS_ESC: + result = MdBool(screen->meta_sends_esc); + break; +#endif + case srm_DELETE_IS_DEL: + result = MdBool(xtermDeleteIsDEL(xw)); + break; +#if OPT_NUM_LOCK + case srm_ALT_SENDS_ESC: + result = MdBool(screen->alt_sends_esc); + break; +#endif + case srm_KEEP_SELECTION: + result = MdBool(screen->keepSelection); + break; + case srm_SELECT_TO_CLIPBOARD: + result = MdBool(screen->selectToClipboard); + break; + case srm_BELL_IS_URGENT: + result = MdBool(screen->bellIsUrgent); + break; + case srm_POP_ON_BELL: + result = MdBool(screen->poponbell); + break; + case srm_KEEP_CLIPBOARD: + result = MdBool(screen->keepClipboard); + break; + case srm_ALLOW_ALTBUF: + result = MdBool(xw->misc.titeInhibit); + break; + case srm_SAVE_CURSOR: + result = MdBool(screen->sc[screen->whichBuf].saved); + break; +#if OPT_TCAP_FKEYS + case srm_TCAP_FKEYS: + result = MdBool(xw->keyboard.type == keyboardIsTermcap); + break; +#endif +#if OPT_SUN_FUNC_KEYS + case srm_SUN_FKEYS: + result = MdBool(xw->keyboard.type == keyboardIsSun); + break; +#endif +#if OPT_HP_FUNC_KEYS + case srm_HP_FKEYS: + result = MdBool(xw->keyboard.type == keyboardIsHP); + break; +#endif +#if OPT_SCO_FUNC_KEYS + case srm_SCO_FKEYS: + result = MdBool(xw->keyboard.type == keyboardIsSCO); + break; +#endif + case srm_LEGACY_FKEYS: + result = MdBool(xw->keyboard.type == keyboardIsLegacy); + break; +#if OPT_SUNPC_KBD + case srm_VT220_FKEYS: + result = MdBool(xw->keyboard.type == keyboardIsVT220); + break; +#endif +#if OPT_PASTE64 || OPT_READLINE + case srm_PASTE_IN_BRACKET: + result = MdBool(SCREEN_FLAG(screen, paste_brackets)); + break; +#endif +#if OPT_READLINE + case srm_BUTTON1_MOVE_POINT: + result = MdBool(SCREEN_FLAG(screen, click1_moves)); + break; + case srm_BUTTON2_MOVE_POINT: + result = MdBool(SCREEN_FLAG(screen, paste_moves)); + break; + case srm_DBUTTON3_DELETE: + result = MdBool(SCREEN_FLAG(screen, dclick3_deletes)); + break; + case srm_PASTE_QUOTE: + result = MdBool(SCREEN_FLAG(screen, paste_quotes)); + break; + case srm_PASTE_LITERAL_NL: + result = MdBool(SCREEN_FLAG(screen, paste_literal_nl)); + break; +#endif /* OPT_READLINE */ +#if OPT_GRAPHICS + case srm_PRIVATE_COLOR_REGISTERS: + result = MdBool(screen->privatecolorregisters); + break; +#endif +#if OPT_SIXEL_GRAPHICS + case srm_SIXEL_SCROLLS_RIGHT: + result = MdBool(screen->sixel_scrolls_right); + break; +#endif + default: + TRACE(("DATA_ERROR: requested report for unknown private mode %d\n", + params[0])); + } + reply.a_param[count++] = (ParmType) params[0]; + reply.a_param[count++] = (ParmType) result; + TRACE(("DECRPM(%d) = %d\n", params[0], result)); + } + reply.a_type = ANSI_CSI; + reply.a_pintro = '?'; + reply.a_nparam = (ParmType) count; + reply.a_inters = '$'; + reply.a_final = 'y'; + unparseseq(xw, &reply); +} +#endif /* OPT_DEC_RECTOPS */ + +char * +udk_lookup(XtermWidget xw, int keycode, int *len) +{ + char *result = NULL; + if (keycode >= 0 && keycode < MAX_UDK) { + *len = xw->work.user_keys[keycode].len; + result = xw->work.user_keys[keycode].str; + TRACE(("udk_lookup(%d) = %.*s\n", keycode, *len, result)); + } else { + TRACE(("udk_lookup(%d) = \n", keycode)); + } + return result; +} + +#if OPT_REPORT_ICONS +void +report_icons(const char *fmt, ...) +{ + if (resource.reportIcons) { + va_list ap; + va_start(ap, fmt); + vfprintf(stdout, fmt, ap); + va_end(ap); +#if OPT_TRACE + va_start(ap, fmt); + TraceVA(fmt, ap); + va_end(ap); +#endif + } +} +#endif + +#ifdef HAVE_LIBXPM + +#ifndef PIXMAP_ROOTDIR +#define PIXMAP_ROOTDIR "/usr/share/pixmaps/" +#endif + +typedef struct { + const char *name; + const char *const *data; +} XPM_DATA; + +static char * +x_find_icon(char **work, int *state, const char *filename, const char *suffix) +{ + const char *prefix = PIXMAP_ROOTDIR; + const char *larger = "_48x48"; + char *result = 0; + + if (*state >= 0) { + if ((*state & 1) == 0) + suffix = ""; + if ((*state & 2) == 0) + larger = ""; + if ((*state & 4) == 0) { + prefix = ""; + } else if (!strncmp(filename, "/", (size_t) 1) || + !strncmp(filename, "./", (size_t) 2) || + !strncmp(filename, "../", (size_t) 3)) { + *state = -1; + } else if (*state >= 8) { + *state = -1; + } + } + + if (*state >= 0) { + size_t length; + + if (*work) { + free(*work); + *work = 0; + } + length = 3 + strlen(prefix) + strlen(filename) + strlen(larger) + + strlen(suffix); + if ((result = malloc(length)) != 0) { + sprintf(result, "%s%s%s%s", prefix, filename, larger, suffix); + *work = result; + } + *state += 1; + } + TRACE(("x_find_icon %d:%s ->%s\n", *state, filename, NonNull(result))); + return result; +} + +#if OPT_BUILTIN_XPMS + +static const XPM_DATA * +built_in_xpm(const XPM_DATA * table, Cardinal length, const char *find) +{ + const XPM_DATA *result = 0; + if (!IsEmpty(find)) { + Cardinal n; + for (n = 0; n < length; ++n) { + if (!x_strcasecmp(find, table[n].name)) { + result = table + n; + ReportIcons(("use builtin-icon %s\n", table[n].name)); + break; + } + } + + /* + * As a fallback, check if the icon name matches without the lengths, + * which are all _HHxWW format. + */ + if (result == 0) { + const char *base = table[0].name; + const char *last = strchr(base, '_'); + if (last != 0 + && !x_strncasecmp(find, base, (unsigned) (last - base))) { + result = table + length - 1; + ReportIcons(("use builtin-icon %s\n", table[0].name)); + } + } + } + return result; +} +#define BuiltInXPM(name) built_in_xpm(name, XtNumber(name), icon_hint) +#endif /* OPT_BUILTIN_XPMS */ + +typedef enum { + eHintDefault = 0 /* use the largest builtin-icon */ + ,eHintNone + ,eHintSearch +} ICON_HINT; +#endif /* HAVE_LIBXPM */ + +int +getVisualDepth(XtermWidget xw) +{ + int result = 0; + + if (getVisualInfo(xw)) { + result = xw->visInfo->depth; + } + return result; +} + +/* + * WM_ICON_SIZE should be honored if possible. + */ +void +xtermLoadIcon(XtermWidget xw, const char *icon_hint) +{ +#ifdef HAVE_LIBXPM + Display *dpy = XtDisplay(xw); + Pixmap myIcon = 0; + Pixmap myMask = 0; + char *workname = 0; + ICON_HINT hint = eHintDefault; +#include + + ReportIcons(("load icon (hint: %s)\n", NonNull(icon_hint))); + if (!IsEmpty(icon_hint)) { + if (!x_strcasecmp(icon_hint, "none")) { + hint = eHintNone; + } else { + hint = eHintSearch; + } + } + + if (hint == eHintSearch) { + int state = 0; + while (x_find_icon(&workname, &state, icon_hint, ".xpm") != 0) { + Pixmap resIcon = 0; + Pixmap shapemask = 0; + XpmAttributes attributes; + struct stat sb; + + attributes.depth = (unsigned) getVisualDepth(xw); + attributes.valuemask = XpmDepth; + + if (IsEmpty(workname) + || lstat(workname, &sb) != 0 + || !S_ISREG(sb.st_mode)) { + TRACE(("...failure (no such file)\n")); + } else { + int rc = XpmReadFileToPixmap(dpy, + DefaultRootWindow(dpy), + workname, + &resIcon, + &shapemask, + &attributes); + if (rc == XpmSuccess) { + myIcon = resIcon; + myMask = shapemask; + TRACE(("...success\n")); + ReportIcons(("found/loaded icon-file %s\n", workname)); + break; + } else { + TRACE(("...failure (%s)\n", XpmGetErrorString(rc))); + } + } + } + } + + /* + * If no external file was found, look for the name in the built-in table. + * If that fails, just use the biggest mini-icon. + */ + if (myIcon == 0 && hint != eHintNone) { + char **data; +#if OPT_BUILTIN_XPMS + const XPM_DATA *myData = 0; + myData = BuiltInXPM(mini_xterm_xpms); + if (myData == 0) + myData = BuiltInXPM(filled_xterm_xpms); + if (myData == 0) + myData = BuiltInXPM(xterm_color_xpms); + if (myData == 0) + myData = BuiltInXPM(xterm_xpms); + if (myData == 0) + myData = &mini_xterm_xpms[XtNumber(mini_xterm_xpms) - 1]; + data = (char **) myData->data; +#else + data = (char **) &mini_xterm_48x48_xpm; +#endif + if (XpmCreatePixmapFromData(dpy, + DefaultRootWindow(dpy), + data, + &myIcon, &myMask, 0) == 0) { + ReportIcons(("loaded built-in pixmap icon\n")); + } else { + myIcon = 0; + myMask = 0; + } + } + + if (myIcon != 0) { + XWMHints *hints = XGetWMHints(dpy, VShellWindow(xw)); + if (!hints) + hints = XAllocWMHints(); + + if (hints) { + hints->flags |= IconPixmapHint; + hints->icon_pixmap = myIcon; + if (myMask) { + hints->flags |= IconMaskHint; + hints->icon_mask = myMask; + } + + XSetWMHints(dpy, VShellWindow(xw), hints); + XFree(hints); + ReportIcons(("updated window-manager hints\n")); + } + } + + if (workname != 0) + free(workname); + +#else + (void) xw; + (void) icon_hint; +#endif +} + +void +ChangeGroup(XtermWidget xw, const char *attribute, char *value) +{ + Arg args[1]; + Boolean changed = True; + Widget w = CURRENT_EMU(); + Widget top = SHELL_OF(w); + + char *my_attr = NULL; + char *old_value = value; +#if OPT_WIDE_CHARS + Boolean titleIsUTF8; +#endif + + if (!AllowTitleOps(xw)) + return; + + /* + * Ignore empty or too-long requests. + */ + if (value == 0 || strlen(value) > 1000) + return; + + if (IsTitleMode(xw, tmSetBase16)) { + const char *temp; + char *test; + + /* this allocates a new string, if no error is detected */ + value = x_decode_hex(value, &temp); + if (value == 0 || *temp != '\0') { + free(value); + return; + } + for (test = value; *test != '\0'; ++test) { + if (CharOf(*test) < 32) { + *test = '\0'; + break; + } + } + } +#if OPT_WIDE_CHARS + /* + * By design, xterm uses the XtNtitle resource of the X Toolkit for setting + * the WM_NAME property, rather than doing this directly. That relies on + * the application to tell it if the format should be something other than + * STRING, i.e., by setting the XtNtitleEncoding resource. + * + * The ICCCM says that WM_NAME is TEXT (i.e., uninterpreted). In X11R6, + * the ICCCM listed STRING and COMPOUND_TEXT as possibilities; XFree86 + * added UTF8_STRING (the documentation for that was discarded by an Xorg + * developer, although the source-code provides this feature). + * + * Since X11R5, if the X11 library fails to store a text property as + * STRING, it falls back to COMPOUND_TEXT. For best interoperability, we + * prefer to use STRING if the data fits, or COMPOUND_TEXT. In either + * case, limit the resulting characters to the printable ISO-8859-1 set. + */ + titleIsUTF8 = isValidUTF8((Char *) value); + if (IsSetUtf8Title(xw) && titleIsUTF8) { + char *testc = malloc(strlen(value) + 1); + Char *nextc = (Char *) value; + Boolean ok8bit = True; + + if (testc != NULL) { + /* + * Check if the data fits in STRING. Along the way, replace + * control characters. + */ + Char *lastc = (Char *) testc; + while (*nextc != '\0') { + unsigned ch; + nextc = convertFromUTF8(nextc, &ch); + if (ch > 255) { + ok8bit = False; + } else if (!IsLatin1(ch)) { + ch = OnlyLatin1(ch); + } + *lastc++ = (Char) ch; + } + *lastc = '\0'; + if (ok8bit) { + TRACE(("ChangeGroup: UTF-8 converted to ISO-8859-1\n")); + if (value != old_value) + free(value); + value = testc; + titleIsUTF8 = False; + } else { + TRACE(("ChangeGroup: UTF-8 NOT converted to ISO-8859-1:\n" + "\t%s\n", value)); + free(testc); + nextc = (Char *) value; + while (*nextc != '\0') { + unsigned ch; + Char *skip = convertFromUTF8(nextc, &ch); + if (iswcntrl((wint_t) ch)) { + memset(nextc, BAD_ASCII, (size_t) (skip - nextc)); + } + nextc = skip; + } + } + } + } else +#endif + { + Char *c1 = (Char *) value; + + TRACE(("ChangeGroup: assume ISO-8859-1\n")); + for (c1 = (Char *) value; *c1 != '\0'; ++c1) { + *c1 = (Char) OnlyLatin1(*c1); + } + } + + my_attr = x_strdup(attribute); + + ReportIcons(("ChangeGroup(attribute=%s, value=%s)\n", my_attr, value)); + +#if OPT_WIDE_CHARS + /* + * If we're running in UTF-8 mode, and have not been told that the + * title string is in UTF-8, it is likely that non-ASCII text in the + * string will be rejected because it is not printable in the current + * locale. So we convert it to UTF-8, allowing the X library to + * convert it back. + */ + TRACE(("ChangeGroup: value is %sUTF-8\n", titleIsUTF8 ? "" : "NOT ")); + if (xtermEnvUTF8() && !titleIsUTF8) { + size_t limit = strlen(value); + Char *c1 = (Char *) value; + int n; + + for (n = 0; c1[n] != '\0'; ++n) { + if (c1[n] > 127) { + Char *converted; + if ((converted = TypeMallocN(Char, 1 + (6 * limit))) != 0) { + Char *temp = converted; + while (*c1 != 0) { + temp = convertToUTF8(temp, *c1++); + } + *temp = 0; + if (value != old_value) + free(value); + value = (char *) converted; + ReportIcons(("...converted{%s}\n", value)); + } + break; + } + } + } +#endif + +#if OPT_SAME_NAME + /* If the attribute isn't going to change, then don't bother... */ + if (resource.sameName) { + char *buf = 0; + XtSetArg(args[0], my_attr, &buf); + XtGetValues(top, args, 1); + TRACE(("...comparing{%s}\n", NonNull(buf))); + if (buf != 0 && strcmp(value, buf) == 0) + changed = False; + } +#endif /* OPT_SAME_NAME */ + + if (changed) { + ReportIcons(("...updating %s\n", my_attr)); + ReportIcons(("...value is %s\n", value)); + XtSetArg(args[0], my_attr, value); + XtSetValues(top, args, 1); + } +#if OPT_WIDE_CHARS + if (xtermEnvUTF8()) { + Display *dpy = XtDisplay(xw); + const char *propname = (!strcmp(my_attr, XtNtitle) + ? "_NET_WM_NAME" + : "_NET_WM_ICON_NAME"); + Atom my_atom = XInternAtom(dpy, propname, False); + + if (my_atom != None) { + changed = True; + + if (IsSetUtf8Title(xw)) { +#if OPT_SAME_NAME + if (resource.sameName) { + Atom actual_type; + Atom requested_type = XA_UTF8_STRING(dpy); + int actual_format = 0; + long long_length = 1024; + unsigned long nitems = 0; + unsigned long bytes_after = 0; + unsigned char *prop = 0; + + if (xtermGetWinProp(dpy, + VShellWindow(xw), + my_atom, + 0L, + long_length, + requested_type, + &actual_type, + &actual_format, + &nitems, + &bytes_after, + &prop) + && actual_type == requested_type + && actual_format == 8 + && prop != 0 + && nitems == strlen(value) + && memcmp(value, prop, nitems) == 0) { + changed = False; + } + } +#endif /* OPT_SAME_NAME */ + if (changed) { + ReportIcons(("...updating %s\n", propname)); + ReportIcons(("...value is %s\n", value)); + XChangeProperty(dpy, VShellWindow(xw), my_atom, + XA_UTF8_STRING(dpy), 8, + PropModeReplace, + (Char *) value, + (int) strlen(value)); + } + } else { + ReportIcons(("...deleting %s\n", propname)); + XDeleteProperty(dpy, VShellWindow(xw), my_atom); + } + } + } +#endif + if (value != old_value) { + free(value); + } + free(my_attr); + + return; +} + +void +ChangeIconName(XtermWidget xw, char *name) +{ + if (name == 0) { + name = emptyString; + } + if (!showZIconBeep(xw, name)) + ChangeGroup(xw, XtNiconName, name); +} + +void +ChangeTitle(XtermWidget xw, char *name) +{ + ChangeGroup(xw, XtNtitle, name); +} + +#define Strlen(s) strlen((const char *)(s)) + +void +ChangeXprop(char *buf) +{ + Display *dpy = XtDisplay(toplevel); + Window w = XtWindow(toplevel); + XTextProperty text_prop; + Atom aprop; + Char *pchEndPropName = (Char *) strchr(buf, '='); + + if (pchEndPropName) + *pchEndPropName = '\0'; + aprop = XInternAtom(dpy, buf, False); + if (pchEndPropName == NULL) { + /* no "=value" given, so delete the property */ + XDeleteProperty(dpy, w, aprop); + } else { + text_prop.value = pchEndPropName + 1; + text_prop.encoding = XA_STRING; + text_prop.format = 8; + text_prop.nitems = Strlen(text_prop.value); + XSetTextProperty(dpy, w, &text_prop, aprop); + } +} + +/***====================================================================***/ + +/* + * This is part of ReverseVideo(). It reverses the data stored for the old + * "dynamic" colors that might have been retrieved using OSC 10-18. + */ +void +ReverseOldColors(XtermWidget xw) +{ + ScrnColors *pOld = xw->work.oldColors; + Pixel tmpPix; + char *tmpName; + + if (pOld) { + /* change text cursor, if necessary */ + if (pOld->colors[TEXT_CURSOR] == pOld->colors[TEXT_FG]) { + pOld->colors[TEXT_CURSOR] = pOld->colors[TEXT_BG]; + if (pOld->names[TEXT_CURSOR]) { + XtFree(xw->work.oldColors->names[TEXT_CURSOR]); + pOld->names[TEXT_CURSOR] = NULL; + } + if (pOld->names[TEXT_BG]) { + if ((tmpName = x_strdup(pOld->names[TEXT_BG])) != 0) { + pOld->names[TEXT_CURSOR] = tmpName; + } + } + } + + EXCHANGE(pOld->colors[TEXT_FG], pOld->colors[TEXT_BG], tmpPix); + EXCHANGE(pOld->names[TEXT_FG], pOld->names[TEXT_BG], tmpName); + + EXCHANGE(pOld->colors[MOUSE_FG], pOld->colors[MOUSE_BG], tmpPix); + EXCHANGE(pOld->names[MOUSE_FG], pOld->names[MOUSE_BG], tmpName); + +#if OPT_TEK4014 + EXCHANGE(pOld->colors[TEK_FG], pOld->colors[TEK_BG], tmpPix); + EXCHANGE(pOld->names[TEK_FG], pOld->names[TEK_BG], tmpName); +#endif + } + return; +} + +Bool +AllocateTermColor(XtermWidget xw, + ScrnColors * pNew, + int ndx, + const char *name, + Bool always) +{ + Bool result = False; + + if (always || AllowColorOps(xw, ecSetColor)) { + XColor def; + char *newName; + + result = True; + if (!x_strcasecmp(name, XtDefaultForeground)) { + def.pixel = xw->old_foreground; + } else if (!x_strcasecmp(name, XtDefaultBackground)) { + def.pixel = xw->old_background; + } else if (!xtermAllocColor(xw, &def, name)) { + result = False; + } + + if (result + && (newName = x_strdup(name)) != 0) { + if (COLOR_DEFINED(pNew, ndx)) { + free(pNew->names[ndx]); + } + SET_COLOR_VALUE(pNew, ndx, def.pixel); + SET_COLOR_NAME(pNew, ndx, newName); + TRACE(("AllocateTermColor #%d: %s (pixel 0x%06lx)\n", + ndx, newName, def.pixel)); + } else { + TRACE(("AllocateTermColor #%d: %s (failed)\n", ndx, name)); + result = False; + } + } + return result; +} +/***====================================================================***/ + +/* ARGSUSED */ +void +Panic(const char *s GCC_UNUSED, int a GCC_UNUSED) +{ + if_DEBUG({ + xtermWarning(s, a); + }); +} + +const char * +SysErrorMsg(int code) +{ + static const char unknown[] = "unknown error"; + char *s = strerror(code); + return s ? s : unknown; +} + +const char * +SysReasonMsg(int code) +{ + /* *INDENT-OFF* */ + static const struct { + int code; + const char *name; + } table[] = { + { ERROR_FIONBIO, "main: ioctl() failed on FIONBIO" }, + { ERROR_F_GETFL, "main: ioctl() failed on F_GETFL" }, + { ERROR_F_SETFL, "main: ioctl() failed on F_SETFL", }, + { ERROR_OPDEVTTY, "spawn: open() failed on /dev/tty", }, + { ERROR_TIOCGETP, "spawn: ioctl() failed on TIOCGETP", }, + { ERROR_PTSNAME, "spawn: ptsname() failed", }, + { ERROR_OPPTSNAME, "spawn: open() failed on ptsname", }, + { ERROR_PTEM, "spawn: ioctl() failed on I_PUSH/\"ptem\"" }, + { ERROR_CONSEM, "spawn: ioctl() failed on I_PUSH/\"consem\"" }, + { ERROR_LDTERM, "spawn: ioctl() failed on I_PUSH/\"ldterm\"" }, + { ERROR_TTCOMPAT, "spawn: ioctl() failed on I_PUSH/\"ttcompat\"" }, + { ERROR_TIOCSETP, "spawn: ioctl() failed on TIOCSETP" }, + { ERROR_TIOCSETC, "spawn: ioctl() failed on TIOCSETC" }, + { ERROR_TIOCSETD, "spawn: ioctl() failed on TIOCSETD" }, + { ERROR_TIOCSLTC, "spawn: ioctl() failed on TIOCSLTC" }, + { ERROR_TIOCLSET, "spawn: ioctl() failed on TIOCLSET" }, + { ERROR_INIGROUPS, "spawn: initgroups() failed" }, + { ERROR_FORK, "spawn: fork() failed" }, + { ERROR_EXEC, "spawn: exec() failed" }, + { ERROR_PTYS, "get_pty: not enough ptys" }, + { ERROR_PTY_EXEC, "waiting for initial map" }, + { ERROR_SETUID, "spawn: setuid() failed" }, + { ERROR_INIT, "spawn: can't initialize window" }, + { ERROR_TIOCKSET, "spawn: ioctl() failed on TIOCKSET" }, + { ERROR_TIOCKSETC, "spawn: ioctl() failed on TIOCKSETC" }, + { ERROR_LUMALLOC, "luit: command-line malloc failed" }, + { ERROR_SELECT, "in_put: select() failed" }, + { ERROR_VINIT, "VTInit: can't initialize window" }, + { ERROR_KMMALLOC1, "HandleKeymapChange: malloc failed" }, + { ERROR_TSELECT, "Tinput: select() failed" }, + { ERROR_TINIT, "TekInit: can't initialize window" }, + { ERROR_BMALLOC2, "SaltTextAway: malloc() failed" }, + { ERROR_LOGEXEC, "StartLog: exec() failed" }, + { ERROR_XERROR, "xerror: XError event" }, + { ERROR_XIOERROR, "xioerror: X I/O error" }, + { ERROR_SCALLOC, "Alloc: calloc() failed on base" }, + { ERROR_SCALLOC2, "Alloc: calloc() failed on rows" }, + { ERROR_SAVE_PTR, "ScrnPointers: malloc/realloc() failed" }, + }; + /* *INDENT-ON* */ + + Cardinal n; + const char *result = "?"; + + for (n = 0; n < XtNumber(table); ++n) { + if (code == table[n].code) { + result = table[n].name; + break; + } + } + return result; +} + +void +SysError(int code) +{ + int oerrno = errno; + + fprintf(stderr, "%s: Error %d, errno %d: ", ProgramName, code, oerrno); + fprintf(stderr, "%s\n", SysErrorMsg(oerrno)); + fprintf(stderr, "Reason: %s\n", SysReasonMsg(code)); + + Cleanup(code); +} + +void +NormalExit(void) +{ + static Bool cleaning; + + /* + * Process "-hold" and session cleanup only for a normal exit. + */ + if (cleaning) { + hold_screen = 0; + return; + } + + cleaning = True; + need_cleanup = False; + + if (hold_screen) { + hold_screen = 2; + while (hold_screen) { + xtermFlushDbe(term); + xevents(term); + Sleep(EVENT_DELAY); + } + } +#if OPT_SESSION_MGT + if (resource.sessionMgt) { + XtVaSetValues(toplevel, + XtNjoinSession, False, + (void *) 0); + } +#endif + Cleanup(0); +} + +#if USE_DOUBLE_BUFFER +void +xtermFlushDbe(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + if (resource.buffered && screen->needSwap) { + XdbeSwapInfo swap; + swap.swap_window = VWindow(screen); + swap.swap_action = XdbeCopied; + XdbeSwapBuffers(XtDisplay(xw), &swap, 1); + XFlush(XtDisplay(xw)); + screen->needSwap = 0; + ScrollBarDrawThumb(xw, 2); + X_GETTIMEOFDAY(&screen->buffered_at); + } +} + +void +xtermTimedDbe(XtermWidget xw) +{ + if (resource.buffered) { + TScreen *screen = TScreenOf(xw); + struct timeval now; + long elapsed; + long limit = DbeMsecs(xw); + + X_GETTIMEOFDAY(&now); + if (screen->buffered_at.tv_sec) { + elapsed = (1000L * (now.tv_sec - screen->buffered_at.tv_sec) + + (now.tv_usec - screen->buffered_at.tv_usec) / 1000L); + } else { + elapsed = limit; + } + if (elapsed >= limit) { + xtermNeedSwap(xw, 1); + xtermFlushDbe(xw); + } + } +} +#endif + +/* + * cleanup by sending SIGHUP to client processes + */ +void +Cleanup(int code) +{ + TScreen *screen = TScreenOf(term); + + TRACE(("Cleanup %d\n", code)); + + if (screen->pid > 1) { + (void) kill_process_group(screen->pid, SIGHUP); + } + Exit(code); +} + +#ifndef S_IXOTH +#define S_IXOTH 1 +#endif + +Boolean +validProgram(const char *pathname) +{ + Boolean result = False; + struct stat sb; + + if (!IsEmpty(pathname) + && *pathname == '/' + && strstr(pathname, "/..") == 0 + && stat(pathname, &sb) == 0 + && (sb.st_mode & S_IFMT) == S_IFREG + && (sb.st_mode & S_IXOTH) != 0) { + result = True; + } + return result; +} + +#ifndef VMS +#ifndef PATH_MAX +#define PATH_MAX 512 /* ... is not defined consistently in Xos.h */ +#endif +char * +xtermFindShell(char *leaf, Bool warning) +{ + char *s0; + char *s; + char *d; + char *tmp; + char *result = leaf; + Bool allocated = False; + + TRACE(("xtermFindShell(%s)\n", leaf)); + + if (!strncmp("./", result, (size_t) 2) + || !strncmp("../", result, (size_t) 3)) { + size_t need = PATH_MAX; + size_t used = strlen(result) + 2; + char *buffer = malloc(used + need); + if (buffer != 0) { + if (getcwd(buffer, need) != 0) { + sprintf(buffer + strlen(buffer), "/%s", result); + result = buffer; + allocated = True; + } else { + free(buffer); + } + } + } else if (*result != '\0' && strchr("+/-", *result) == 0) { + /* find it in $PATH */ + if ((s = s0 = x_getenv("PATH")) != 0) { + if ((tmp = TypeMallocN(char, strlen(leaf) + strlen(s) + 2)) != 0) { + Bool found = False; + while (*s != '\0') { + strcpy(tmp, s); + for (d = tmp;; ++d) { + if (*d == ':' || *d == '\0') { + int skip = (*d != '\0'); + *d = '/'; + strcpy(d + 1, leaf); + if (skip) + ++d; + s += (d - tmp); + if (validProgram(tmp)) { + result = x_strdup(tmp); + found = True; + allocated = True; + } + break; + } + } + if (found) + break; + } + free(tmp); + } + free(s0); + } + } + TRACE(("...xtermFindShell(%s)\n", result)); + if (!validProgram(result)) { + if (warning) + xtermWarning("No absolute path found for shell: %s\n", result); + if (allocated) + free(result); + result = 0; + } + /* be consistent, so that caller can always free the result */ + if (result != 0 && !allocated) + result = x_strdup(result); + return result; +} +#endif /* VMS */ + +#define ENV_HUNK(n) (unsigned) ((((n) + 1) | 31) + 1) + +/* + * If we do not have unsetenv(), make consistent updates for environ[]. + * This could happen on some older machines due to the uneven standardization + * process for the two functions. + * + * That is, putenv() makes a copy of environ, and some implementations do not + * update the environ pointer, so the fallback when unsetenv() is missing would + * not work as intended. Likewise, the reverse could be true, i.e., unsetenv + * could copy environ. + */ +#if defined(HAVE_PUTENV) && !defined(HAVE_UNSETENV) +#undef HAVE_PUTENV +#elif !defined(HAVE_PUTENV) && defined(HAVE_UNSETENV) +#undef HAVE_UNSETENV +#endif + +/* + * copy the environment before Setenv'ing. + */ +void +xtermCopyEnv(char **oldenv) +{ +#ifdef HAVE_PUTENV + (void) oldenv; +#else + unsigned size; + char **newenv; + + for (size = 0; oldenv[size] != NULL; size++) { + ; + } + + newenv = TypeCallocN(char *, ENV_HUNK(size)); + memmove(newenv, oldenv, size * sizeof(char *)); + environ = newenv; +#endif +} + +#if !defined(HAVE_PUTENV) || !defined(HAVE_UNSETENV) +static int +findEnv(const char *var, int *lengthp) +{ + char *test; + int envindex = 0; + size_t len = strlen(var); + int found = -1; + + TRACE(("findEnv(%s=..)\n", var)); + + while ((test = environ[envindex]) != NULL) { + if (strncmp(test, var, len) == 0 && test[len] == '=') { + found = envindex; + break; + } + envindex++; + } + *lengthp = envindex; + return found; +} +#endif + +/* + * sets the value of var to be arg in the Unix 4.2 BSD environment env. + * Var should end with '=' (bindings are of the form "var=value"). + * This procedure assumes the memory for the first level of environ + * was allocated using calloc, with enough extra room at the end so not + * to have to do a realloc(). + */ +void +xtermSetenv(const char *var, const char *value) +{ + if (value != 0) { +#ifdef HAVE_PUTENV + char *both = malloc(2 + strlen(var) + strlen(value)); + TRACE(("xtermSetenv(%s=%s)\n", var, value)); + if (both) { + sprintf(both, "%s=%s", var, value); + putenv(both); + } +#else + size_t len = strlen(var); + int envindex; + int found = findEnv(var, &envindex); + + TRACE(("xtermSetenv(%s=%s)\n", var, value)); + + if (found < 0) { + unsigned need = ENV_HUNK(envindex + 1); + unsigned have = ENV_HUNK(envindex); + + if (need > have) { + char **newenv; + newenv = TypeMallocN(char *, need); + if (newenv == 0) { + xtermWarning("Cannot increase environment\n"); + return; + } + memmove(newenv, environ, have * sizeof(*newenv)); + free(environ); + environ = newenv; + } + + found = envindex; + environ[found + 1] = NULL; + environ = environ; + } + + environ[found] = malloc(2 + len + strlen(value)); + if (environ[found] == 0) { + xtermWarning("Cannot allocate environment %s\n", var); + return; + } + sprintf(environ[found], "%s=%s", var, value); +#endif + } +} + +void +xtermUnsetenv(const char *var) +{ + TRACE(("xtermUnsetenv(%s)\n", var)); +#ifdef HAVE_UNSETENV + unsetenv(var); +#else + { + int ignore; + int item = findEnv(var, &ignore); + if (item >= 0) { + while ((environ[item] = environ[item + 1]) != 0) { + ++item; + } + } + } +#endif +} + +/*ARGSUSED*/ +int +xerror(Display *d, XErrorEvent *ev) +{ + xtermWarning("warning, error event received:\n"); + TRACE_X_ERR(d, ev); + (void) XmuPrintDefaultErrorMessage(d, ev, stderr); + Exit(ERROR_XERROR); + return 0; /* appease the compiler */ +} + +void +ice_error(IceConn iceConn) +{ + (void) iceConn; + + xtermWarning("ICE IO error handler doing an exit(), pid = %ld, errno = %d\n", + (long) getpid(), errno); + + Exit(ERROR_ICEERROR); +} + +/*ARGSUSED*/ +int +xioerror(Display *dpy) +{ + int the_error = errno; + + xtermWarning("fatal IO error %d (%s) or KillClient on X server \"%s\"\r\n", + the_error, SysErrorMsg(the_error), + DisplayString(dpy)); + + Exit(ERROR_XIOERROR); + return 0; /* appease the compiler */ +} + +void +xt_error(String message) +{ + xtermWarning("Xt error: %s\n", message); + + /* + * Check for the obvious - Xt does a poor job of reporting this. + */ + if (x_getenv("DISPLAY") == 0) { + xtermWarning("DISPLAY is not set\n"); + } + exit(1); +} + +int +XStrCmp(char *s1, char *s2) +{ + if (s1 && s2) + return (strcmp(s1, s2)); + if (s1 && *s1) + return (1); + if (s2 && *s2) + return (-1); + return (0); +} + +#if OPT_TEK4014 +static void +withdraw_window(Display *dpy, Window w, int scr) +{ + TRACE(("withdraw_window %#lx\n", (long) w)); + (void) XmuUpdateMapHints(dpy, w, NULL); + XWithdrawWindow(dpy, w, scr); + return; +} +#endif + +void +set_vt_visibility(Bool on) +{ + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + TRACE(("set_vt_visibility(%d)\n", on)); + if (on) { + if (!screen->Vshow && xw) { + VTInit(xw); + XtMapWidget(XtParent(xw)); +#if OPT_TOOLBAR + /* we need both of these during initialization */ + XtMapWidget(SHELL_OF(xw)); + ShowToolbar(resource.toolBar); +#endif + screen->Vshow = True; + } + } +#if OPT_TEK4014 + else { + if (screen->Vshow && xw) { + withdraw_window(XtDisplay(xw), + VShellWindow(xw), + XScreenNumberOfScreen(XtScreen(xw))); + screen->Vshow = False; + } + } + set_vthide_sensitivity(); + set_tekhide_sensitivity(); + update_vttekmode(); + update_tekshow(); + update_vtshow(); +#endif + return; +} + +#if OPT_TEK4014 +void +set_tek_visibility(Bool on) +{ + XtermWidget xw = term; + + TRACE(("set_tek_visibility(%d)\n", on)); + + if (on) { + if (!TEK4014_SHOWN(xw)) { + if (tekWidget == 0) { + TekInit(); /* will exit on failure */ + } + if (tekWidget != 0) { + Widget tekParent = SHELL_OF(tekWidget); + XtRealizeWidget(tekParent); + XtMapWidget(XtParent(tekWidget)); +#if OPT_TOOLBAR + /* we need both of these during initialization */ + XtMapWidget(tekParent); + XtMapWidget(tekWidget); +#endif + XtOverrideTranslations(tekParent, + XtParseTranslationTable + ("WM_PROTOCOLS: DeleteWindow()")); + (void) XSetWMProtocols(XtDisplay(tekParent), + XtWindow(tekParent), + &wm_delete_window, 1); + TEK4014_SHOWN(xw) = True; + } + } + } else { + if (TEK4014_SHOWN(xw) && tekWidget) { + withdraw_window(XtDisplay(tekWidget), + TShellWindow, + XScreenNumberOfScreen(XtScreen(tekWidget))); + TEK4014_SHOWN(xw) = False; + } + } + set_tekhide_sensitivity(); + set_vthide_sensitivity(); + update_vtshow(); + update_tekshow(); + update_vttekmode(); + return; +} + +void +end_tek_mode(void) +{ + XtermWidget xw = term; + + if (TEK4014_ACTIVE(xw)) { + FlushLog(xw); + TEK4014_ACTIVE(xw) = False; + xtermSetWinSize(xw); + longjmp(Tekend, 1); + } + return; +} + +void +end_vt_mode(void) +{ + XtermWidget xw = term; + + if (!TEK4014_ACTIVE(xw)) { + FlushLog(xw); + set_tek_visibility(True); + TEK4014_ACTIVE(xw) = True; + TekSetWinSize(tekWidget); + longjmp(VTend, 1); + } + return; +} + +void +switch_modes(Bool tovt) /* if true, then become vt mode */ +{ + if (tovt) { + if (tekRefreshList) + TekRefresh(tekWidget); + end_tek_mode(); /* WARNING: this does a longjmp... */ + } else { + end_vt_mode(); /* WARNING: this does a longjmp... */ + } +} + +void +hide_vt_window(void) +{ + set_vt_visibility(False); + if (!TEK4014_ACTIVE(term)) + switch_modes(False); /* switch to tek mode */ +} + +void +hide_tek_window(void) +{ + set_tek_visibility(False); + tekRefreshList = (TekLink *) 0; + if (TEK4014_ACTIVE(term)) + switch_modes(True); /* does longjmp to vt mode */ +} +#endif /* OPT_TEK4014 */ + +static const char * +skip_punct(const char *s) +{ + while (*s == '-' || *s == '/' || *s == '+' || *s == '#' || *s == '%') { + ++s; + } + return s; +} + +static int +cmp_options(const void *a, const void *b) +{ + const char *s1 = skip_punct(((const OptionHelp *) a)->opt); + const char *s2 = skip_punct(((const OptionHelp *) b)->opt); + return strcmp(s1, s2); +} + +static int +cmp_resources(const void *a, const void *b) +{ + return strcmp(((const XrmOptionDescRec *) a)->option, + ((const XrmOptionDescRec *) b)->option); +} + +XrmOptionDescRec * +sortedOptDescs(XrmOptionDescRec * descs, Cardinal res_count) +{ + static XrmOptionDescRec *res_array = 0; + +#ifdef NO_LEAKS + if (descs == 0) { + if (res_array != 0) { + free(res_array); + res_array = 0; + } + } else +#endif + if (res_array == 0) { + Cardinal j; + + /* make a sorted index to 'resources' */ + res_array = TypeCallocN(XrmOptionDescRec, res_count); + if (res_array != 0) { + for (j = 0; j < res_count; j++) + res_array[j] = descs[j]; + qsort(res_array, (size_t) res_count, sizeof(*res_array), cmp_resources); + } + } + return res_array; +} + +/* + * The first time this is called, construct sorted index to the main program's + * list of options, taking into account the on/off options which will be + * compressed into one token. It's a lot simpler to do it this way than + * maintain the list in sorted form with lots of ifdef's. + */ +OptionHelp * +sortedOpts(OptionHelp * options, XrmOptionDescRec * descs, Cardinal numDescs) +{ + static OptionHelp *opt_array = 0; + +#ifdef NO_LEAKS + if (descs == 0 && opt_array != 0) { + sortedOptDescs(descs, numDescs); + free(opt_array); + opt_array = 0; + return 0; + } else if (options == 0 || descs == 0) { + return 0; + } +#endif + + if (opt_array == 0) { + size_t opt_count, j; +#if OPT_TRACE + Cardinal k; + XrmOptionDescRec *res_array = sortedOptDescs(descs, numDescs); + int code; + const char *mesg; +#else + (void) descs; + (void) numDescs; +#endif + + /* count 'options' and make a sorted index to it */ + for (opt_count = 0; options[opt_count].opt != 0; ++opt_count) { + ; + } + opt_array = TypeCallocN(OptionHelp, opt_count + 1); + for (j = 0; j < opt_count; j++) + opt_array[j] = options[j]; + qsort(opt_array, opt_count, sizeof(OptionHelp), cmp_options); + + /* supply the "turn on/off" strings if needed */ +#if OPT_TRACE + for (j = 0; j < opt_count; j++) { + if (!strncmp(opt_array[j].opt, "-/+", (size_t) 3)) { + char temp[80]; + const char *name = opt_array[j].opt + 3; + for (k = 0; k < numDescs; ++k) { + const char *value = res_array[k].value; + if (res_array[k].option[0] == '-') { + code = -1; + } else if (res_array[k].option[0] == '+') { + code = 1; + } else { + code = 0; + } + sprintf(temp, "%.*s", + (int) sizeof(temp) - 2, + opt_array[j].desc); + if (x_strindex(temp, "inhibit") != 0) + code = -code; + if (code != 0 + && res_array[k].value != 0 + && !strcmp(name, res_array[k].option + 1)) { + if (((code < 0) && !strcmp(value, "on")) + || ((code > 0) && !strcmp(value, "off")) + || ((code > 0) && !strcmp(value, "0"))) { + mesg = "turn on/off"; + } else { + mesg = "turn off/on"; + } + if (strncmp(mesg, opt_array[j].desc, strlen(mesg))) { + if (strncmp(opt_array[j].desc, "turn ", (size_t) 5)) { + char *s = malloc(strlen(mesg) + + strlen(opt_array[j].desc) + + 2); + if (s != 0) { + sprintf(s, "%s %s", mesg, opt_array[j].desc); + opt_array[j].desc = s; + } + } else { + TRACE(("OOPS ")); + } + } + TRACE(("%s: %s %s: %s (%s)\n", + mesg, + res_array[k].option, + res_array[k].value, + opt_array[j].opt, + opt_array[j].desc)); + break; + } + } + } + } +#endif + } + return opt_array; +} + +/* + * Report the character-type locale that xterm was started in. + */ +String +xtermEnvLocale(void) +{ + static String result; + + if (result == 0) { + if ((result = x_nonempty(setlocale(LC_CTYPE, 0))) == 0) { + result = x_strdup("C"); + } else { + result = x_strdup(result); + } + TRACE(("xtermEnvLocale ->%s\n", result)); + } + return result; +} + +char * +xtermEnvEncoding(void) +{ + static char *result; + + if (result == 0) { +#ifdef HAVE_LANGINFO_CODESET + result = nl_langinfo(CODESET); +#else + const char *locale = xtermEnvLocale(); + if (!strcmp(locale, "C") || !strcmp(locale, "POSIX")) { + result = x_strdup("ASCII"); + } else { + result = x_strdup("ISO-8859-1"); + } +#endif + TRACE(("xtermEnvEncoding ->%s\n", result)); + } + return result; +} + +#if OPT_WIDE_CHARS +/* + * Tell whether xterm was started in a locale that uses UTF-8 encoding for + * characters. That environment is inherited by subprocesses and used in + * various library calls. + */ +Bool +xtermEnvUTF8(void) +{ + static Bool init = False; + static Bool result = False; + + if (!init) { + init = True; +#ifdef HAVE_LANGINFO_CODESET + result = (strcmp(xtermEnvEncoding(), "UTF-8") == 0); +#else + { + char *locale = x_strdup(xtermEnvLocale()); + int n; + for (n = 0; locale[n] != 0; ++n) { + locale[n] = x_toupper(locale[n]); + } + if (strstr(locale, "UTF-8") != 0) + result = True; + else if (strstr(locale, "UTF8") != 0) + result = True; + free(locale); + } +#endif + TRACE(("xtermEnvUTF8 ->%s\n", BtoS(result))); + } + return result; +} +#endif /* OPT_WIDE_CHARS */ + +/* + * Check if the current widget, or any parent, is the VT100 "xterm" widget. + */ +XtermWidget +getXtermWidget(Widget w) +{ + XtermWidget xw; + + if (w == 0) { + xw = (XtermWidget) CURRENT_EMU(); + if (!IsXtermWidget(xw)) { + xw = 0; + } + } else if (IsXtermWidget(w)) { + xw = (XtermWidget) w; + } else { + xw = getXtermWidget(XtParent(w)); + } + TRACE2(("getXtermWidget %p -> %p\n", w, xw)); + return xw; +} + +#if OPT_SESSION_MGT +static void +die_callback(Widget w GCC_UNUSED, + XtPointer client_data GCC_UNUSED, + XtPointer call_data GCC_UNUSED) +{ + NormalExit(); +} + +static void +save_callback(Widget w GCC_UNUSED, + XtPointer client_data GCC_UNUSED, + XtPointer call_data) +{ + XtCheckpointToken token = (XtCheckpointToken) call_data; + /* we have nothing to save */ + token->save_success = True; +} + +static void +icewatch(IceConn iceConn, + IcePointer clientData GCC_UNUSED, + Bool opening, + IcePointer * watchData GCC_UNUSED) +{ + if (opening) { + ice_fd = IceConnectionNumber(iceConn); + TRACE(("got IceConnectionNumber %d\n", ice_fd)); + } else { + ice_fd = -1; + TRACE(("reset IceConnectionNumber\n")); + } +} + +void +xtermOpenSession(void) +{ + if (resource.sessionMgt) { + TRACE(("Enabling session-management callbacks\n")); + XtAddCallback(toplevel, XtNdieCallback, die_callback, NULL); + XtAddCallback(toplevel, XtNsaveCallback, save_callback, NULL); + } +} + +void +xtermCloseSession(void) +{ + IceRemoveConnectionWatch(icewatch, NULL); +} +#endif /* OPT_SESSION_MGT */ + +Widget +xtermOpenApplication(XtAppContext * app_context_return, + String my_class, + XrmOptionDescRec * options, + Cardinal num_options, + int *argc_in_out, + char **argv_in_out, + String *fallback_resources, + WidgetClass widget_class, + ArgList args, + Cardinal num_args) +{ + Widget result; + + XtSetErrorHandler(xt_error); +#if OPT_SESSION_MGT + result = XtOpenApplication(app_context_return, + my_class, + options, + num_options, + argc_in_out, + argv_in_out, + fallback_resources, + widget_class, + args, + num_args); + IceAddConnectionWatch(icewatch, NULL); +#else + (void) widget_class; + (void) args; + (void) num_args; + result = XtAppInitialize(app_context_return, + my_class, + options, + num_options, + argc_in_out, + argv_in_out, + fallback_resources, + NULL, 0); +#endif /* OPT_SESSION_MGT */ + init_colored_cursor(XtDisplay(result)); + + XtSetErrorHandler(NULL); + + return result; +} + +static int x11_errors; + +static int +catch_x11_error(Display *display, XErrorEvent *error_event) +{ + (void) display; + (void) error_event; + ++x11_errors; + return 0; +} + +Boolean +xtermGetWinAttrs(Display *dpy, Window win, XWindowAttributes * attrs) +{ + Boolean result = False; + Status code; + + memset(attrs, 0, sizeof(*attrs)); + if (win != None) { + XErrorHandler save = XSetErrorHandler(catch_x11_error); + x11_errors = 0; + code = XGetWindowAttributes(dpy, win, attrs); + XSetErrorHandler(save); + result = (Boolean) ((code != 0) && !x11_errors); + if (result) { + TRACE_WIN_ATTRS(attrs); + } else { + xtermWarning("invalid window-id %ld\n", (long) win); + } + } + return result; +} + +Boolean +xtermGetWinProp(Display *display, + Window win, + Atom property, + long long_offset, + long long_length, + Atom req_type, + Atom *actual_type_return, + int *actual_format_return, + unsigned long *nitems_return, + unsigned long *bytes_after_return, + unsigned char **prop_return) +{ + Boolean result = False; + + if (win != None) { + XErrorHandler save = XSetErrorHandler(catch_x11_error); + x11_errors = 0; + if (XGetWindowProperty(display, + win, + property, + long_offset, + long_length, + False, + req_type, + actual_type_return, + actual_format_return, + nitems_return, + bytes_after_return, + prop_return) == Success + && x11_errors == 0) { + result = True; + } + XSetErrorHandler(save); + } + return result; +} + +void +xtermEmbedWindow(Window winToEmbedInto) +{ + Display *dpy = XtDisplay(toplevel); + XWindowAttributes attrs; + + TRACE(("checking winToEmbedInto %#lx\n", winToEmbedInto)); + if (xtermGetWinAttrs(dpy, winToEmbedInto, &attrs)) { + XtermWidget xw = term; + TScreen *screen = TScreenOf(xw); + + XtRealizeWidget(toplevel); + + TRACE(("...reparenting toplevel %#lx into %#lx\n", + XtWindow(toplevel), + winToEmbedInto)); + XReparentWindow(dpy, + XtWindow(toplevel), + winToEmbedInto, 0, 0); + + screen->embed_high = (Dimension) attrs.height; + screen->embed_wide = (Dimension) attrs.width; + } +} + +void +free_string(String value) +{ + free((void *) value); +} + +/* Set tty's idea of window size, using the given file descriptor 'fd'. */ +void +update_winsize(int fd, int rows, int cols, int height, int width) +{ +#ifdef TTYSIZE_STRUCT + TTYSIZE_STRUCT ts; + int code; + + setup_winsize(ts, rows, cols, height, width); + TRACE_RC(code, SET_TTYSIZE(fd, ts)); + trace_winsize(ts, "from SET_TTYSIZE"); + (void) code; +#endif + + (void) rows; + (void) cols; + (void) height; + (void) width; +} + +/* + * Update stty settings to match the values returned by dtterm window + * manipulation 18 and 19. + */ +void +xtermSetWinSize(XtermWidget xw) +{ +#if OPT_TEK4014 + if (!TEK4014_ACTIVE(xw)) +#endif + if (XtIsRealized((Widget) xw)) { + TScreen *screen = TScreenOf(xw); + + TRACE(("xtermSetWinSize\n")); + update_winsize(screen->respond, + MaxRows(screen), + MaxCols(screen), + Height(screen), + Width(screen)); + } +} + +#if OPT_XTERM_SGR + +#if OPT_TRACE +static char * +traceIFlags(IFlags flags) +{ + static char result[1000]; + result[0] = '\0'; +#define DATA(name) if (flags & name) { strcat(result, " " #name); } + DATA(INVERSE); + DATA(UNDERLINE); + DATA(BOLD); + DATA(BLINK); + DATA(INVISIBLE); + DATA(BG_COLOR); + DATA(FG_COLOR); + +#if OPT_WIDE_ATTRS + DATA(ATR_FAINT); + DATA(ATR_ITALIC); + DATA(ATR_STRIKEOUT); + DATA(ATR_DBL_UNDER); + DATA(ATR_DIRECT_FG); + DATA(ATR_DIRECT_BG); +#endif +#undef DATA + return result; +} + +static char * +traceIStack(unsigned flags) +{ + static char result[1000]; + result[0] = '\0'; +#define DATA(name) if (flags & xBIT(ps##name - 1)) { strcat(result, " " #name); } + DATA(INVERSE); + DATA(UNDERLINE); + DATA(BOLD); + DATA(BLINK); + DATA(INVISIBLE); +#if OPT_ISO_COLORS + DATA(BG_COLOR); + DATA(FG_COLOR); +#endif + +#if OPT_WIDE_ATTRS + DATA(ATR_FAINT); + DATA(ATR_ITALIC); + DATA(ATR_STRIKEOUT); + DATA(ATR_DBL_UNDER); + /* direct-colors are a special case of ISO-colors (see above) */ +#endif +#undef DATA + return result; +} +#endif + +void +xtermPushSGR(XtermWidget xw, int value) +{ + SavedSGR *s = &(xw->saved_sgr); + + TRACE(("xtermPushSGR %d mask %#x %s\n", + s->used + 1, (unsigned) value, traceIStack((unsigned) value))); + + if (s->used < MAX_SAVED_SGR) { + s->stack[s->used].mask = (IFlags) value; +#define PUSH_FLAG(name) \ + s->stack[s->used].name = xw->name;\ + TRACE(("...may pop %s 0x%04X %s\n", #name, xw->name, traceIFlags(xw->name))) +#define PUSH_DATA(name) \ + s->stack[s->used].name = xw->name;\ + TRACE(("...may pop %s %d\n", #name, xw->name)) + PUSH_FLAG(flags); +#if OPT_ISO_COLORS + PUSH_DATA(sgr_foreground); + PUSH_DATA(sgr_background); + PUSH_DATA(sgr_38_xcolors); +#endif + } + s->used++; +} + +#define IAttrClr(dst,bits) dst = dst & (IAttr) ~(bits) + +void +xtermReportSGR(XtermWidget xw, XTermRect *value) +{ + TScreen *screen = TScreenOf(xw); + char reply[BUFSIZ]; + CellData working; + int row, col; + Boolean first = True; + + TRACE(("xtermReportSGR %d,%d - %d,%d\n", + value->top, value->left, + value->bottom, value->right)); + + memset(&working, 0, sizeof(working)); + for (row = value->top - 1; row < value->bottom; ++row) { + LineData *ld = getLineData(screen, row); + if (ld == 0) + continue; + for (col = value->left - 1; col < value->right; ++col) { + if (first) { + first = False; + saveCellData(screen, &working, 0, ld, NULL, col); + } + working.attribs &= ld->attribs[col]; +#if OPT_ISO_COLORS + if (working.attribs & FG_COLOR + && GetCellColorFG(working.color) + != GetCellColorFG(ld->color[col])) { + IAttrClr(working.attribs, FG_COLOR); + } + if (working.attribs & BG_COLOR + && GetCellColorBG(working.color) + != GetCellColorBG(ld->color[col])) { + IAttrClr(working.attribs, BG_COLOR); + } +#endif + } + } + xtermFormatSGR(xw, reply, + working.attribs, + GetCellColorFG(working.color), + GetCellColorBG(working.color)); + unparseputc1(xw, ANSI_CSI); + unparseputs(xw, reply); + unparseputc(xw, 'm'); + unparse_end(xw); +} + +void +xtermPopSGR(XtermWidget xw) +{ + SavedSGR *s = &(xw->saved_sgr); + + TRACE(("xtermPopSGR %d\n", s->used)); + + if (s->used > 0) { + if (s->used-- <= MAX_SAVED_SGR) { + IFlags mask = s->stack[s->used].mask; + Boolean changed = False; + + TRACE(("...mask %#x %s\n", mask, traceIStack(mask))); + TRACE(("...old: %s\n", traceIFlags(xw->flags))); + TRACE(("...new: %s\n", traceIFlags(s->stack[s->used].flags))); +#define POP_FLAG(name) \ + if (xBIT(ps##name - 1) & mask) { \ + if ((xw->flags & name) ^ (s->stack[s->used].flags & name)) { \ + changed = True; \ + UIntClr(xw->flags, name); \ + UIntSet(xw->flags, (s->stack[s->used].flags & name)); \ + TRACE(("...pop " #name " = %s\n", BtoS(xw->flags & name))); \ + } \ + } +#define POP_FLAG2(name,part) \ + if (xBIT(ps##name - 1) & mask) { \ + if ((xw->flags & part) ^ (s->stack[s->used].flags & part)) { \ + changed = True; \ + UIntClr(xw->flags, part); \ + UIntSet(xw->flags, (s->stack[s->used].flags & part)); \ + TRACE(("...pop " #part " = %s\n", BtoS(xw->flags & part))); \ + } \ + } +#define POP_DATA(name,value) \ + if (xBIT(ps##name - 1) & mask) { \ + Bool always = False; \ + if ((xw->flags & name) ^ (s->stack[s->used].flags & name)) { \ + always = changed = True; \ + UIntClr(xw->flags, name); \ + UIntSet(xw->flags, (s->stack[s->used].flags & name)); \ + TRACE(("...pop " #name " = %s\n", BtoS(xw->flags & name))); \ + } \ + if (always || (xw->value != s->stack[s->used].value)) { \ + TRACE(("...pop " #name " %d => %d\n", xw->value, s->stack[s->used].value)); \ + xw->value = s->stack[s->used].value; \ + changed = True; \ + } \ + } + POP_FLAG(BOLD); + POP_FLAG(UNDERLINE); + POP_FLAG(BLINK); + POP_FLAG(INVERSE); + POP_FLAG(INVISIBLE); +#if OPT_WIDE_ATTRS + if (xBIT(psATR_ITALIC - 1) & mask) { + xtermUpdateItalics(xw, s->stack[s->used].flags, xw->flags); + } + POP_FLAG(ATR_ITALIC); + POP_FLAG(ATR_FAINT); + POP_FLAG(ATR_STRIKEOUT); + POP_FLAG(ATR_DBL_UNDER); +#endif +#if OPT_ISO_COLORS + POP_DATA(FG_COLOR, sgr_foreground); + POP_DATA(BG_COLOR, sgr_background); + POP_DATA(BG_COLOR, sgr_38_xcolors); +#if OPT_DIRECT_COLOR + POP_FLAG2(FG_COLOR, ATR_DIRECT_FG); + POP_FLAG2(BG_COLOR, ATR_DIRECT_BG); +#endif + if (changed) { + setExtendedColors(xw); + } +#else + (void) changed; +#endif + } +#if OPT_ISO_COLORS + TRACE(("xtermP -> flags%s, fg=%d bg=%d%s\n", + traceIFlags(xw->flags), + xw->sgr_foreground, + xw->sgr_background, + xw->sgr_38_xcolors ? " (SGR 38)" : "")); +#else + TRACE(("xtermP -> flags%s\n", + traceIFlags(xw->flags))); +#endif + } +} + +#if OPT_ISO_COLORS +static ColorSlot * +allocColorSlot(XtermWidget xw, int slot) +{ + SavedColors *s = &(xw->saved_colors); + ColorSlot *result = NULL; + + if (slot >= 0 && slot < MAX_SAVED_SGR) { + ColorSlot *palette; + if ((palette = s->palettes[slot]) == 0) { + s->palettes[slot] = (ColorSlot *) calloc(1, + sizeof(ColorSlot) + + (sizeof(ColorRes) + * MAXCOLORS)); + } + result = s->palettes[slot]; + } + return result; +} + +static void +popOldColors(XtermWidget xw, ScrnColors * source) +{ + Boolean changed = False; + ScrnColors *target = xw->work.oldColors; + + if (source->which != target->which) { + changed = True; + } else { + int n; + for (n = 0; n < NCOLORS; ++n) { + if (COLOR_DEFINED(source, n)) { + if (COLOR_DEFINED(target, n)) { + if (source->colors[n] != target->colors[n]) { + changed = True; + break; + } + } else { + changed = True; + break; + } + } else if (COLOR_DEFINED(target, n)) { + changed = True; + break; + } + } + } + if (changed) { + ChangeColors(xw, source); + UpdateOldColors(xw, source); + } +} +#endif /* OPT_ISO_COLORS */ + +#define DiffColorSlot(d,s,n) (memcmp((d), (s), (n) * sizeof(ColorRes)) ? True : False) +#define CopyColorSlot(d,s,n) memcpy((d), (s), (n) * sizeof(ColorRes)) + +/* + * By default, a "push" increments the stack after copying to the current + * slot. But a specific target allows one to copy into a specific slot. + */ +void +xtermPushColors(XtermWidget xw, int value) +{ +#if OPT_ISO_COLORS + SavedColors *s = &(xw->saved_colors); + int pushed = s->used; + int actual = (value <= 0) ? pushed : (value - 1); + + TRACE(("xtermPushColors %d:%d\n", actual, pushed)); + if (actual < MAX_SAVED_SGR && actual >= 0) { + TScreen *screen = TScreenOf(xw); + ColorSlot *palette; + + if ((palette = allocColorSlot(xw, actual)) != NULL) { + GetColors(xw, &(palette->base)); + CopyColorSlot(&(palette->ansi[0]), screen->Acolors, MAXCOLORS); + if (value < 0) { + s->used++; + if (s->last < s->used) + s->last = s->used; + } else { + s->used = value; + } + } + } +#else + (void) xw; + (void) value; +#endif +} + +void +xtermPopColors(XtermWidget xw, int value) +{ +#if OPT_ISO_COLORS + SavedColors *s = &(xw->saved_colors); + int popped = (s->used - 1); + int actual = (value <= 0) ? popped : (value - 1); + + TRACE(("xtermPopColors %d:%d\n", actual, popped)); + if (actual < MAX_SAVED_SGR && actual >= 0) { + TScreen *screen = TScreenOf(xw); + ColorSlot *palette; + + if ((palette = s->palettes[actual]) != NULL) { + Boolean changed = DiffColorSlot(screen->Acolors, + palette->ansi, + MAXCOLORS); + + GetOldColors(xw); + popOldColors(xw, &(palette->base)); + CopyColorSlot(screen->Acolors, &(palette->ansi[0]), MAXCOLORS); + s->used = actual; + if (changed) + xtermRepaint(xw); + } + } +#else + (void) xw; + (void) value; +#endif +} + +void +xtermReportColors(XtermWidget xw) +{ + ANSI reply; + SavedColors *s = &(xw->saved_colors); + + memset(&reply, 0, sizeof(reply)); + reply.a_type = ANSI_CSI; + reply.a_pintro = '?'; + reply.a_param[reply.a_nparam++] = (ParmType) s->used; + reply.a_param[reply.a_nparam++] = (ParmType) s->last; + reply.a_inters = '#'; + reply.a_final = 'Q'; + unparseseq(xw, &reply); +} +#endif /* OPT_XTERM_SGR */ diff --git a/ports/xterm/xterm-359/misc.o b/ports/xterm/xterm-359/misc.o new file mode 100644 index 0000000000000000000000000000000000000000..f885235c96e25628e8f2e303d843c9e5da8aa079 GIT binary patch literal 375784 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 z�-3*X8@AI2qkKP(evM#W)E--Uu?Ma#~XQyD7>9u_m{#9(rgu8)9t+b9g%z4k=Aq z@HE|ghsAcvejr`B4DV{r8i5VJ3fTIQhp7UrjbgzX(*e}K zt6M}GmB){XFKZ%a5J39^SW_iL=K4*o7`j_xoVZx+JgBIqfqLnPXFcvSk0%veCi;_s>@%IkHff}0VTtlt z2R>gCww|p?5u1(bEvtgZ?rO=a-=2ZmJl>6EFmaG}6}||x)LC;8!iP)+wkkg0oI3a@-e8*u}V4%WYExTuO* z!qS<9cEBpZ#k9-N+}Y=hwRZL=_f~xQPe>l>(C74*Wdksl87%SFbtd{8V|ZRhCOJb= z-bodbHCemXcCs`$pcCFd9Rt=t#HXI-F7FKt--{0as`VE^MAw~0V zEHbouUm?HEK*yh0iqPhawsxMtR`d>k3>@Cf60H>*mvsnR;~T&X@9~zhTF+2>xK{=3 z$K$!BJx(kWu|I4?8Yuvoh?KZ&Enm)-jG7vSz5j{)i9r#F$s zT63aqY2Z~-=|LWnf#SV02>$WsrFs>emXIlp$4C>S=h`fvIej-$7!thBkHhrs*)0_P0ex?{^hIqZRGgR*0q@j~Hv&Gsmv))!2=mXsJ zb^;ZqH+8ljsAwBF*69&5xtzpv8t{^B;~rs!(bgc3XB#^v_+i8E>5G!Vbbb9qv?Zgs zF`I6Sjo(eH2bO7{*?)QSEOEAVQkyEhMhav?4+>Z}8D3_V0t^K~&r_nVvT``suX7{$ zTeK@qnmPX(P((EomP1VX<3+8E4?Z`Vw9#BFWwj{v2_Drb`JtNL2;bUA6Gi%2v^}m} zvnFlN#B3!p&#!ObF#&YVmmF@E;TMThwlolkmexntKe|erdxL9E$+h*TR`P~q+AL2&O7C4rxxSa$EFG_t9S#cvNXU2|-*@;+ z*OzTvA5EIfWo=)0EnMGNrhD0rbe$4GVQBJ0i>wT(Z}Y1d8n3W|zA8qpc`Ldl>|qvw zgQ8*1)eB~k9eW391 zfmB{wS-eIblq2+to_lnDEoqS&6smUi959d%hn$8S|M7O8bg3l}zQBud*kA$+=1lZyqP{*xx+G7l$aX zvJvre73+nof&>s2+ojOdZs#7r)r3~%#x9`a>P67 zDqE^gH4QK5it5Kyq)ElkUKypePVQo{<;pbWH461uv<0;j_7HwJpUe&Z-&I|#{kFI3Wg5RG<*P&Y8^!JicHiD4r>1ZscNuX4;YTPL4TDAuSeRo!97LjrvR;igCrlGmz~2z7oASJOZ~?ZjPl zA9@%>5PMNmwZJwR#D@?1WW}5<4^9`0m%GC;g9NI?kO!uERE41FH9F$2z>G#mV0~Xs z573*w{lwz;Ya@~nzGZ-wl$3!40?*^XRdj$(t_QWSH2kC5lh#9nH@uP62G@D(p$bhS z9Bv*Brkjed!R!qMb7@Vbu2P*pzqn|X%b>S4W3wth@Q-|z#WFXjQ?|g9b1U`_n#Ie6 z&^?rq&~oNMZO|Z#vLEfES=Tf`G_R1Ww!2ErLxFX6mejMe1WeDwUBIaNPY&E-Omm=) zl>y$5^PtM|#wfw@Xc<@>i4bwSg}3f~F-&WuxtVw~B=oNnSpZ&i%-SGm;_V;~XtxOYH8iS6cUx41EF` z_BapMm_9&Z4%GksHMjPgbEX{9{nYk7Y`0fqzv2rbhGt?>Gt`OPvp`6evfKlvRR3GI zE<7_>QBqALrpYZ8pq`b2zEj$e=4h7-H}cT)VXjirt$?EKdJ+#9?5>6Fa( z@{!`sD_Qye=bsEdmvm0ixu54J|EclVy-U?f^OBJR4W!2}2OK0g)?E1XHgZUYsYK-o zQ+UXaWPp!;jG*o>w#|G7WQJA)h;K%W)dhc97Ncp;;>aa1JmQud!OJBr%Z)&Ywvd8Q zIo%6U_9on^we3vCXJ7qMmS}eV4zFnYpV_Q%GR8iCNu8Y2oQ1Qz1;&e!zV(>AHvSr@ z3Bp=XOnv9Bx-Yi1ugWa;k&>A*W@=9ly{|^Q#sL7CebRAj(By#|Ueb5YSq_co;qAp| zqow_w1uY~quMB4#~^k&H&yvnb)i zkPJb7=D1tg@Zo|?4geUas?_J>tVyojsXN~iGLOT}75H1BF8}@NfBLWpI<+m6H+ST4 zK*aFbREG6Uxl9*rahm22$va2z%vcb$L55|co>fpT zuw?J1Xzq|ykZYe$iMnLK^Agi+tmHHv(Wxjp6z2BCPk2_kCLJiXXbSCFg!{ST!$P)} zDRyY=uy>&Ml_5sTY=Ltgo-#iGw*^$X9nGIp1NAl##NKJeyS#1BDEZK67uf4|hK6MF zu;*xgbU@s45q$fXzORm;4(o4oyOhe&dm;yfQ?aJ3STa*lUlU%C5z#XNT@y;3xF-gb zpG6PNoHS=OHS-FcTD?(y{nKqAHD3B#up@uG)M52uy}>$>Zn`X|eWlDEw2R*E*qhDf zRM!g@fh;FRmJf_cN1QgIYqNk*irR4{f_xME9uZaLG@y_8!CM{cOqfVm8I`9g(4GeK zO>-$duPFUTcsaf|V4Z6n$uP3mg6{PtDgcLssOt$dx|1{fUtCu>!m+20}xdNvjpBNVh%*yq}*CDE+KMRyPdhpZimdH+oG*bI^B_iS7*@`q6+N*FsUS zr5Ne?8JvFYe$UYn@P1AAacMPepD8KuTvB*b_4c|M%7C(rVh4S!lxA($TlU_Yy^cBm zB{{put4wLxxkQTIkk_){i(h(3AIyRo-h(~8RcW9EF5YM>w=9#4noP&KE&5Ygk?JR^ z>z_ft|Kd1WGLQ^yiO@$EwVG9KpSY}oC?v=qt9Nt$JmDBTjLH1$hIDBL)b+X;wY*4o zdUlj&c;i~PNhgkEX%ymtpDZ#PiU_{=g)5TI^4-H(Xrt;#~di2o6X`w;1u70Kj>TXbjWlx%{)On$}+`ZfL`4j7~>r`Wh(bk@aU9 z{%GKWwfM+v6+l5OcGO9%50hefHFy`TKj%SXOSui{8Jb(*?Gc?eXSoGJOHO_jpBM;O zpzhaJ2Kk%eUuvUQekUfD&+Avbx|pvYF|bQ8Bv7+ZWBsCj{1x>fdx3rU;XzL5L1L;V zLYY_Yr1`7dSxpaJlyBbx(IBevIdE8e>ms|ID}b~epB}M8XJNTBMmnv2D8nMR0v|U! zGktULD^1dHYl%PxX{^m$ShlNXchI6~Q6+@AFZJ%9qD0IAkX41WwmG|noqqGlV^>`< zA@#ZZ@L^ct+1LH!t@);HNh^h1?EMq(Uh{%;#QB&EN72*0xv12q#Ufbkr8Jy1uru!9 zu?W<1IPAB#_~E}YUzYRcFp}`j6kk0K_bSA!SH^>gM9ai}BP~D_`?0RqIloM8d;z_( z4MZ*Y!QC&3U|LDI%B~pHr^?*DK@pYFi_O5la772yX1!>|&n^mzNOW`6_!JjWx|7xC z#SG8wfAL7o(-{-G%flP@UBtv2m!tHyj)so|L0jBzI~bGSfH|bk#WY7fWn2BQOmX$7 zSIXzbz@8z#g&lLO;Xza0N09zO(X$qO5CzErL#wXf$XBwbm_;WeefYD?rlcBVc-7DR z$<$rK+Dw0&7&o|<cS1!ivS;UAncAw3@E|SS!L2tVVqpC%>p43c&PQ`CC#Ur_h zALX}qF?$`h;x~gM=@2)>o11ymjM-6cp%rAd=*;mT?Vz3{O3Ym&I(Dw|PhyADgyt&3 zJpu&rIqo*hcjmS9&^EJvHm@Wy^yAdC!s+zxEE(YY^3t#_Ykr-0aeRn9uVbg_bGsHS zRFijGW9eL}hvnX}i#6{W&uo^AGk5-K$p|+XxevZEp?8=My7sKp^+bFV%A0~!zcAMH zlXX1wy>iP#`TDLa?B+Up69W{^lMK`Oe%Z&PsyzkhD)y;+9bS?LxRVO(7`!x&c%M>S5ohb{jaJN(`7 zYnJCP_iN+a&8@n8vpHW8j!6KrbCKnXPL|wg26==8N2jfhi`L z7dxq~VKz?#+*Z9j-sm&~K((RM{6fU?JEOzc$A9||iiPo>vn`zDwWNx7tnC-NEyDom z?Ls_E=RJl_@{GbQho4x0M_RJ)O!vI0^7y-m%#7=~Y zH#@`|5{3sQp!WtpiUb_PQg~gU<3n5kAr6yQy!&v^n_rs2xDk!&otyL>@BSt_UbAI> zMHY^XiBV^|dzj7g`0%5hbC%^Kkg-&tIuHbkn$8>M%L=S|&Q*xhDvap2?CPKqKq~RE zXz{mQ%AHYMhNW@q!M2zS`*cpYOVq!;hL8Vbhu- ztX4A37iGrB`<>)j|5l6cj~V)#e=_E(t|1q0IjyhbGP{d+h-4o2gVVxaMQLS^s49Qk z+ciu);{hwG*GV7JB<`@i`iz`h`w-Z8TN#;dH>LL&Trr5EjX9)MMXV8{QUQ-WFis%T zt{Hqf%phJTmRoVfAXnG)SA3Vrz6DgXJ>8g8 zOF3u1Mt{yn7#yen1l?9W5M_G*q*o8fa?n{zDM|Z+lA&?=R8B(|{2^K7)0~8DIV{rA zepovxU#tuFCQZE2kI>^4r2KP%;+ZH+y3#RjYR=Mup;$ZeE2dZ7YF&!LpK|*CU;y!V zQdQB2Sk83H<0~?|9EPcTwqW zpQ>SZFw#3@&1Kd|01PfwaxnolddhSLMz}k+;{7S^!}BDVQy}jN?jDj|vARXU{hW~4 z|FqF!v|(Kuya2n?P$1AphdrbdKhZ`<Gm?t9qd+b-G#X?ijbVtJIvWKHLz6M5~^aV;edt zdxtVcWBav8Ud%_p+9i{AOhxH^r#fP)06(RcL#d|nryT#nuV^cAy$&Gfm(_IG;cMys zQ;#VIHQc?OK@XG$mglJl=(TWZ3F8-)o#nF>lrjHM>T-66O%P^>&ckc&{;7@waPu@2 z=B!!dbt=~W;+m&(PkriJTe1~`IgFDCKVjsB&xU! zu6E^{E&NoiF!`g+q&V?(I;)FC)3im#V{-H2>{;p!mGXAbyOhrRQ}-YpNtr9GC|ee3 z*c-9xz>Ew-n4WD4TF=aZXJJLHa?qjsB(0sPhr(nFz-aLF#?4;Pz_|HSN~ZI-GDLIs z=2*kby#?7S4caE5xUS9G%k%qVW)R*0V1Q1Qv+AAEJu_NiyMR@XB?#55UetUqmdv6m zTrPt%AOcJQf{(1-ay%j`z^AZ{!xp`0o+kY?KTD>+Nc@aFS}d5#+;Qjym49c)B1&IpoHQ%vvSr2A=ja8}agzZ1EVBjpkqStUPd@7mT;xxwxbu-?OoS+LW~}rZEtM0&CYa?Hk!H=_qEaX*L#z zM;85g+XMO%sB?pJ5be&U{NXgP5Xa&$C6R|2-!7<(c%^44bM9hFE0(%IDQHGDD>-zM zWPJKr^wf5@wpk@D%@m=b{a#I1?B=`v<`OS=C-=sW@lQ6sgd(7W1R@}nOfmWbltuVP z1)h{P2^%#IM|rA-v}Rr)K;6_#akP-&_(IYgKax?AgI@KNo%tD{9IcaGKl@`~SA|nj;WodQV|$2nWxej4nHQ?2yOI)A z5QCuGX{b^ibS|OIelw5(sMIIb+{`8qn}yJw+q3wD(Pv>P#CG8g=CSXsaK0m$Rbbve z!w^lhk5TPTVG|{Jfnh9ZNoDd+BRnGu?wqb_4gq8R61oPu+u80Qp0MoHT#&&96t(IIf)47zF8#XSZi)V^ly^k?i<(#rDrs@*HfRPx%n$Z@82S zu|zPaJEk?r;%}b1Z`yzN)Tc`G91x&WYL81LG`q$fQaLP*W1LqN?n~-p?C|Uhu}H02 zMZZGTQ!0le<>_9kgN0tz)zns!a-tyIC|wBBC4P@1p$ckSV_r+SQsS`hEsA1ynZb z0b%UqDrW}+hL2WyE)-$54Js2S5-xHqA!fEd{X`4KU!#v2^U2DRw3)Bn#a;MM1A;ZX zqQ?&1L9ingIScz0`8Yd<2zz8EGlqiou`AiAhgB%VBF{mg5LX=o0+?35pFrC@6vs3L zMe|tY$PgfLJ!xgcMf4fqIj)otMCUPaLiU}CXNxFgsO+vS#4&!W=_JV@+apl;ln1s9 z0$5anl=YH$Z;8Z~+i7inU7<#*vq;Z%ndX4y_wLp_b2O$$Au;o7hwD)LrE0sd@H?P5 zqF^g26y2d7Kfa5n1%(sjSZ}XXR`!IC)~n19?xs@lgkMaj^{J$3x<5{`Wve9~*-dr- zrDTo;PwXMJeZE%reD2An)B02*)te`G(>xhVa{sN9&w7qmpY@k&=E|Sk=9L%ic$ABJ z%35Kj6UI}aw`kDK7;vpM_Z=F?8V$-h*32EE#W+W`-X6e_`BvT_-j6vj_d_&%L9j}? z1TVRrnrb9sI$TNfY%ln5Lie&8W_4P%W8>|vIX-Z=q3%CK@%D`RKw1?ctVRiMbS|8v zver1XVWOiJ4PDrJTm*&?IG0A1(*X3T;6iQ%l}%0p7zjpJ)rH$I=cr=Gl#1CY6*q-y zh2&r!L+8`Xx|+dgoSbCO6|ea~jdaSRRekd5gPxMeh%nSM{Q-8#G?i9J)CA@m3RW1HtJWE3CT;YEAopHi(!lKqomaB{Dp^SHE_da$_A zmU!mOocX3IZ5%Z&i!>|j?P$hYwX&s7EztIATpJ7j*db($RR_9G8 zhAxfHKXfN4WkNqX4s}%D{IkAcw$NPNZ1u@Il~M2ICfI5^q&8u&z_yJ%b#er>eqaPk zZ@zcX<8VG&nH|#n@_(stJ~j;xjL4k=on9$Zut$wc9$X zyLZ~Sd*}W*a+!*pm+LhL#W@p~C-JU+d zFrnJ1=00Cj90qvi8lyiA8|jg6?i2|32D-4^0TO598iWqRzfJYj4A4Q-44!gUN{`KT zn}sK{NPggXbk>^3dfnQCll_ROVt&GdGR;>H4Lb~ZzQQY0Qf)*xWKT_4^n0XrgVcNx z@1BXY`gsGwq%r)KY+rCB;)TbLV^Z|RCa9PP=@L-3uNVBqGlQCa_qD^!oA}Se>PP%A zj|4SCJmRs9{B*55V}ooq*{jjNj-hy~OAPO4r|w|gAhkD0;@LLAUUwchBR zix>N(i3f|(hk7hLLA!-OPtkTB(7g&!CR6s__-(7bgcZ0^!6b%3h*k71Tl2P&F{o!x z8n3ANrpmNN6!TZB^q9cyD#y=FqCf8#!M(v|sp^sH2gN)e8CpE+(it^juhOI03* zviV!j(@^5K4(IJN%a3faD``L6<^9a``ixB;&MN2StiLQQ zA3&7XLz&XkY>=ckxz#@)^J&gQQExT3W{X4aROV9+wRcY%YQbY=OASQ^#nPwy-Plk= z<RP3Vk`M&R z-6S&zt*Zdf;Q8oS*5i8hp2}z@)~PP`Hg^ihFT#}V+6r=9cU+dKZ@t;=B?xWsVRz!m zFCuq+ZGYhMn6q)Z2)F3lHs&~S>ka7L-l2&@1)dl@LqT;N=&l*Fuq(Q^cCG84(ucO$ z>S2Mte^;Q+a<_%jIdzln&|*6Jniq0*RE1iCvQwR|e|xF;%@K_svqg0sdFGmOo?g@z zQ^MvEAX{Qb?9t)84RPq&L&=C!!c0lon(FC2)bcj>w+|2VX!~ElrhSRg^l)o`cl!ZjE;L)-4h} zoq7PX?UFjT6>(jP2hm;>(u?TD(LkeH{N0J{{9&p!T}|S&O?QgzYZYw&Lkl+lp#@t{ zU$A&e!P2y@Q|gtA6=d#9opJhRCQfOl@LDr?b-`Ju7A*Y%1$El`KPAY${NZWm1=@G! zpt_B1@FXu=u|0QW1IYWF`*3{G#-O{U3>CmN0(`p*N!VP9rk^agmk zLt)_guWQo&O65TmrVRp@>S$iop)Ap(yq9ob3h~it1DnJI<4$*P^xUD?o@vbL`PdnX zWJ~qph>p}>*fcqGe}22y?-kXCL5oa)Z!F+q{dro-Hk>le%p@f9w#8$TEQc2U7&S*X zVy*Rw9RAxCjG%F&G@CvLW_~&TdtjIwnRsM~SwkW|q5CEZ+D6%_fa#a0;VIwbPaiwriN7Pk0P8e zNxbDj^K`9AP9CS6k;HvGCML02*4XdHW3T7_?Hl4vizQ_^5U4>R3(N4y>+{lPzCW8< z=6SRdu8(aO8tdktW^?Wzj%TSGTXJLp)wj@qpBoLvo$T0QKLg{zy5rAv3v8!UuaK&h zl2}3Z?M^l#4{twi)wJK>y%HUXFu4aiIx#sX-i2vGiuYsup9_Xc81G=OPWt7Fpr|3; z^W2FouY{=qw`WhT(T#?Oh5UT60`)|Eb^8weSrwl5{{bI25fcFb00000005SX00000 z0003100000004NLbzR$X;!3iuPuV{(C)#%3_QQF=SauW5?SR~-=cPhO0<;a1MiMs6 z*PmROStSY66EWLBbCIg@vNCgJRvkzAKFd>EMv2)M`SvgVPnI`k)yxa}n^tB=e`*^a z8dIgUjjAd-n>5Lq`{TwYQ4^Vm!EbwK=&gr1Du1Tu+H8uvnWXvAM*Ds79%juxot3p& z7gds0w#-iH-W*ZzC75_K2Ac@(C@B~8*|LdsH#)D-cGQ;nhjucX2H{}w+tkrpYMXPJ znzA{M@~p|CeNaVpYAjaZlX;lihhP{6KTWYu>|3-yre<9guPLtUc$zJT^3E@pcSsk2 z8(cMX7r*ea+8mqBcZ;{xwl@298dX`ol|?@0b+*mZgcmwV>o}#q{MNL={ian_R3<+j z?7oO!ja>zAc*iQh>+(3-H?~gmq_*^N+L*VLZv3T+N)sQVQf{(J%c5#l3tSAZo^8_C zdRM%g_*m6NW!JR#ujUlb%9O6gtTxR&YG@yGx{)EjWx0#!i&o7djrO!n^Qwr=Y7`fF zwmH*oCG=g^4#puZvAy}!d3b`QE7wkxTo*XuN%Bf zOd0J{+6h|F^)cHwS#A&MAui7*r=LGWO>LsMIYxW>&E{C;y5Dr?_B~6QohgfQwoiso zqgqyOKyn)M3+6yy_nMw#XxHYr-`Ap2Q5>gbL-$8ZPIsUSMR$Hk`O<>X(~r>Jk3u^k zb)t15Ew=R8g1*64*>=~MG>_J_Oc2hjwmDtSAteKWPyY&UKYb!qd|n2m?Bl^Qgtje5 zt6*%G!^LboUfKnI!GtWLbidGs^|^u3+0ZTMy^87wi-C3Oj~ASd+lS|w{WTbm9_-^{ zHlYQa&z7Tb^edp>dYYQmBq~eVUXiJ$$j`hNq%#nx(a@}Ed+2HXYJNm{vQHmU6?e1x zzhhdRLs~1dst!eo)mgq~<#bSO`NI>wl41CJ9@x?JVe~W#m!IwAUd&m@OOu|ODzfzd zyxvFnhT6PGRZds*tJoiDrR95RXW6tu9ScGjLsn0X6|-`HOlS19cAYhJ-zLk;BmE=37cbR@%$yDB!}jqB zdUd`pyeN64zyrH3PVtWP#>D@;s^D$zn`m!HKS>g+jIKVnboaO-vJAmuItT;ZZj(gy z&K8>uwmGk2`<%b##d~hZC&iGg-LXmdIa?xggkcv467MtKL?hC-XP?oo{p>m9#s7x2 zhwO#J!Q4Ln41O=o$qROs{)ems{dAfp%XeA_*jv(@BT2%^l9fsGH>Z+Q($4g-Vhcw? z8_ezfZ@Ziih5;@6c9icjS~z;gI!)}37P1wPX+hFq2KVrhx7bD6HGO)ge?RNrFKi%2 z`Ke(-9nHa{8oKQtNCN2#AbC)IL#noez4CG{x)By~|T#Dg<;@2ei zgazyV*pS{D?7DnMQS25vagyrgXVQX0X=RHafVIV1s2w*o`2@CB-c05C1uS526|(J;bZ@G(?QXt|9>O1rYmziRCa<&;Y5YoZ z=+WVA`|z%P__=-frG5C7FLRc&thXxr0YCv`eG(he_VotZVj&P+ zJfXO#EawCbu}%DZDTbdP2l<=oH9xhgRn0Cvu;~JxX2VNJ918K4H3So0vSyc%)l+=@ zejvd_=&}mwI|yTocG%GjE;AKB|4x>IzP-XuP;5ZrR~)jK6c5g4F`QU{wYtAC%jMuH zSVAo*0-@XK`R1>NJlL_E;HV3dDp&y|S zI}WCdZ61zIywgz9JNLR5huISuq!YPk_$4wQ3*L@RwkNk>x3M|UrkK@3x*@}?b{o*# zHtoj4X5Ywy5BCKHA&q#2K0pqJqsd@QxOhZn;br(I_#Dm*%cmebLd|lq4`OT$Eg1z$ zsb$0g9EF8mtbTw`%V9T*S~)o2BpL2 z#d5Zg@ES{dKp3+piJ@JktE2^_0Nq_B?;5RNbZm+kOJeF>wrM0TzY5oBK}bSLHAvn` zLSW|Vj@cwgylU8Hq^}y4|4h&Fs3dTb(k9RklGNmTICoADqzTyqbG2JhcOSaLX z$7-fe*}-mn9)^UfpT=Nm;p?>F54zpK^kE6KD`3Qmw_<5056OQiMx!susv1j8qIn{_ zOEReu<;vkKS)VxR>MLIn2^M}BCUHh)3F|X@AYU_j91RB{0Z%)a&&T@MbbtnSemPuP zGLG~FMuQDLx%I1o0PSkz17Nb3jhV5n_>t~QvkZnaLSrQT!`VXs!?|j64S*vA;GC)= z<&d~YWy3#AwmOsBm_q=D0((B;^@C}A_&+9mg=~O+Et&08l5NS1(Sqc2irNNv|F(+C zT^83iJ(Wd$qz{_M&_0iV!wjK>vn?pprt9gfTP>bECm6e>57dGSJt$mgprfvbHn(R2 z40%a1H_5HW{9&QFk+kF}9V(Zz;ZV2~pq-32S3*7)!1{ zE=mn=n9$FN;pFsDC#AC>VZt^h64CLuWM&WdNmiMk=4QU2Yj=Cauf3a;5PpLs90ev* z#3Xc+ux`_StX67vi-M=wYUkmbZ9 z{yhMXvL1vBX!z)7Kmtfc>!-6>Z6Gq(9}3!%;*|hom6Ej}jEP^8OCxW8%*CS0C++=s zH2rC3^JNz|F9;!zN1+V|_jWn@cVI+8)wof}-7&}agnU!hLP>(MZ%pAu0b9-b?FYiv zPC&^X)&jc3ujB(>?Iz0hMm!Z+A1|jAy%B1)Y*xwh=IdggAV14ySwc#&N|IXzn2|u{ z2P_8i$QlXmiuZpb#c`jeWxL*^8mleH6aUKi;AA-|Otyz`L%1I0o1%mF;Qt?eTI&V6 z3(KEFGsO2&L`Mo!!>l4Zh~MF~^+$j3iBkwH2;^AQwHD=>kRgP`@{)2$SaZs_wYVB@ zKV%jCptxa8%RJ5&lgA)OVVAZo5zJx=%iLpM2>) z`PzN*t^4GA_sQR896WYHe@kjamUg}fhQR{?&j0MOzxHWCaocG6WDvM8wkFtBl!Cf8 zHj=Ei0KEr-!zPT@1g_zd-vFE#_mXAJta!4|-%p>v+f#X9i!)lz>=W(Zt6d&TWHQ)> z+UU?2q!c^3ZwmL2-{^%3#I5D?Rqx@J}PSB-^0(_&XA(7$7 zn53_|KP%1Qz^FmsS&LaW2=sR^+Zx!WwFT1a6Fpd&jyPJF@-J^cd7X9(;HH`1io>eod7RI zjR7AC2_KGgpd^J%Tw|D!u0&fh5I@>~P^}#n1Re;CCfVj}Z))+6WDxQWXy@g$xIuDY zqBJgvx;&GWkLn_y)LTZg`07qg2iqwBnJg|}Si&{qqKi#JcC(vNzRW$%7My!(-TjF* zwdVY<24)nRT3KEaDT0pyuX`ZxqZnT#llW6}QojLhT z7wPWlqm|@DYaeVv%EaQMvLTT*S$J1dY!GMP(>mRJZPPa*1s;-iV?;!ysF$#U6Dq-P z+xx{}_>)3U3QZYn#rq6d8SGk$svhU=xS&W5{5khHlq7aXnk*4Z@GDp>gO|l%ZmdH{ zy9^*+tOA8%(1hakJ5s#Ra@0LZg3=R&gszd^M=DX9oPD<;mq!BOpuZ%_3t;NE1{DBj zJxG_mWDgD~h;Z4eL-#W?9HsFX7^8hU*YhYOg@I}W+!@CLVy zM1XlOs#ga9$tGU8gK!j*CyeYS%V{&R+U~LhU@+&L4Q(~)3N3P0(x!^2Vdq?Yf^FhD z9O>s72ELcjBGD$3cgQq$C)qZVwPBBQMZ&v~r3KzxQgFaJSlSyBb^=|M_cEC%`Uz}H))TLLwJ+v|e7f|wo~p%&^Dix!jghJJ~R zIS?@_%PYxBGHCB*u5SBJ?=C9v48|^0Z$v9Dc@(K@!SjCojAF`BGn-|^spnIaU&vE8 zo53DUOekY1W>dt7WgQ+6T@zGJKKOV@t%rV`S8w0&)#Y9k z9vqHb+{!ujw`_y$dsJJFf(=(AxiHh&4=#SBhru47Ba@;^?GVVQ9;e$VKAZV~1l)#3 zLPx}ZT)P}SO#zOloG^_v4=MIUf}^WZ5YmLQn{-Vj=kht;B@gT}GONy=97NAPXyuid z9G5_bl5GyjO7xn}n=?C-_KuvNB*VZylu&b(5F)=wIpQ9(4Y1Z5S(}7nQjYRSB;Uwk z+k#|Y7UOyP5G?4Ci)q#a>5 z9d~RFrK=6Yc(Mr*;~pTnd!IEOBj0iH*P<2L0bg}%i`WQYDy}5}evz=Oh0UZDLayhv z-!>V{ZAj*RHkE`WmD6}NMgp0X#P)i9+SKsvc>Z@Pa+5bq_Rr-GQ4d1T5`u*yw ze`5>D2MowFWifA`*4cT_Na#p3IR;SB6)Z->evT9y#Fh>Ol8ZIh5{a_QhQY*eG6fpg za)tomHC@WKk+$zg8YQIa&yevp`q-4HtsY9q4M{9tY>#jOpj^D?Ox;UT!kunEhXvpi znG7dBq){b>gbcoD;~tBO1UP=>-$%K%;wp$@7cD6Oy>QV)3r13^lqzM2g_6>wR3)V# zDYZzhg9HR@34aaQHiDyMmdCZ@Ah5A*27GDkG%e@amrZqyg(DIkt5+b%YcU9I04#J! zsGL4rrWFa@%jA(TdFrTY^eKhac08Cq*}**l^-9-b#leZ@{>a?2Z~R12dqZ%pWLkv< zS>Zv`eD|~QL$8cIo)O?e4Z_CEL}PJ)VPgfYXfrLxaU9V!MJa_f(B!NpMXqQ*XP~Yc z(ylSr+M!k&dB+r0Z0!5G6&IIPW}HAq!j;FC!|?(U1rxuut072M+akCE*HzD@lvJV6>GckuXtk4pIb8Ig>8I!_Bnj~?(PA! zO(bwA)RLSHvQ5IEK-Q3yW<8L2mec#~>jM?=kdu43h}AHw;^Q8GodFU!SZC$OICZ#J zT@ZsV|ENKnXF|U`J|=_36GGcyJeCr11@j28AunRLYD+yJ z6{OwgnK%jBMM_!52i|8s_gwPUn%6pt9j%`1R(KWU@*6A2Xm*SHJ7fi`2)0Mzv?=hUOGyw1)8;ScgL$y%`Bn$RBb19M=9j93Ck4b{zUHXbPNA*I_AtA zV`{R5SfchwNt3LB`9nrluXq&F%?~xgB7k%d*1@&#e>M#V!%#^A;8tn`AsDpYf*4jz z@clkRK1PDW4$l=C`C34Ac)Bni+*%6U$J14?6bhRqLg$$3sQSA zp=^FPFC&*`fhX@I=s}874hX9}SbhzG!h5=BChd`svv7MDQ?FsC9pPLF*c6|}HzZJ6 zGez;HpZ0X6v~a>1XmggZmw$O&LhJT=-SxSA4oqElke@GBt64L zYL*liuk}KO9ZV8mA+7NcxCArTx41V1l|o)%%@m;OSGRdmAy34vPJ9C0iZ|##APo{= z)(nwDow~ZqV64dz#kg9T$QABgC|NKWjK*AlA;8T^q%eI21+>Gt)qIr8v`LaOF-pLf z+_v3x9GhSmcN-ionfQj{QzYQ6q*Yofh$mU(Y~u;0W+@oCZw;15OTQFrv-IPRnq5{) zp^=3Q0hw(y0PkWzUryA|Z7Hrsp>9i|aMMCi)TlO5oC<+s)q~3xhWmp1angE}FUgXx zM@?3L#q~hU2tcODZgyy1p5P?%p}ZP2mw*w-L3hYZWHM#~u~*HnsBNKc2~Hn1f>VWf%+|es|In zJ`afh{F_#Q3nB5YV$OV;CP)$yF5%sg0+8~uI^a<@T<)OTqeAONR{Bz7n>U+-)FV~9 znoEO>q;m8O)Qlu>FVb$%NzyEbGb7B%T=^B2`30g^&(N{9{|g=z*Kb0*b@1Z~gYIR> z47!FEoi2$GB><*?K)^>!%FE2%gIa}C+l0pD0d1opEf+z28ftA4#e9wi?>h}kz2~=x zjhSsgH@ijHS0ET6Yd22GAx|mpCig?IplIrnJdihJf&ftQIc0_9hx|4IPmn!YjCwig z2e6$xXoySM)teMt67+YV;!c)`KpsP?fyuVMviti*@M|QLGI%ga zZ1xJ~w-f@hv~|3>L7CqJ$n{iB#<4K5LeRybJp^zdmL+p9R#`%^U+Vy zR>f!v*u1+eiL$FQvIQV((GTP(md!Q*7p)wkDU!vI93%LJ>og&JTeN+bWuMLKvVwLv zATt0BbsaL?ywi!+H4r9CafDiWC|)Cg)DW!~hHyOru^n((eRWT?*eRx_n`T`8p4@}s zG!C?xXB<2YhQGC)=NgoyZIE6WQfZWcuS6vuGI!n0|4Me8nQ!tf^t61S=u%rghCk3l zAf=3<&_}M_5YkJ}gQozBS+k|=l(Q{DM1l1OpC|7Kgs(x2mK1g7uK+1_jKbtU?xuB%FpsGbyx~37Alw2{6$1DA}0z3YiVVrL81wka|qt$KZ?uU$2@VKOXwUkuOGD zPT5+H!ilTBTr$sQbl)rP4;9(uD52y0xL^U$=(zRBdt8=W7SChc?$Wg3z~LOGB%{!l z(^g0?%Db%!)TfksJFJSjZu2hOEh~P?Sw7EGLt&ZgS0(B<^z$MlVITB zBe6mo5beudBm|M6bM%@9BkkZ?|Mi6l@5iW3H3j%EIsH-tyU7Ww5*qFpioH6e&pY)% zD0j0mF~>D9K@l#Z3xMM_tWNElsjMj-46itV*t|;w?V28jOdfC-<|`R(Z!PJ>w(Pb8&dFXJDF91d zMwQbdx~=3Cguu%xKge z3lbLFEwE6EQg%oCFUslNJ*8l)$?yV0zjQ&gPj-7#M0ikH;#j(S3Q@9pr@U{gyf^6~cSk>rK~(}oP^URxNrA}c{P zsB?KLJyAlu5dfK%kB?3>rHa7S*|;dr7D2W>bsnExmu{P%-WRACaCy8Nz#Vgt*AAV8 zyBny1_=5}UofN&J?M%*+LS1$EliH?EA|AJ<8j~FuAGFn()ud>LKv=evYu$W}g%CEG zO~M47Zipml;t$Pekn^SSt=+=1@f@LZ#a;xcqktPeCU|(sz{|Rg8dV{6XvoE4X^VA%H zYW{`4`QCA$yy|^6CEF@8z-jp-1pD*_tOeE+?~J4+QW>Y%l-qUxYyPGyL@M`!PpO8Q z1r}6#HvF_U6yCpG6b}~D;cuV>@MxI@wEe8v4!M_wlp5J!iFAEvT+xiO{G_W|NZT&% z27r!9{aQ+@G!52i7Jn|;8D24?j>HWr(P;YQ8}>MB6Xjf-8B_;Qh-3?~_sijuqH_4y zJMCtv#n4I7tF?75`NU!mbDYMu`p?1FS2@&Pm4^wl&l|r$XCO>f>7PiFZqz;kHcu4b>#CdRVtj0HoY{1N`E{M4wiHVQ{Gx&Z9!K zyI%AbO|Q(*?Y{cC_v{Nc1658jl+1zd{`p;f@fMWnh@JmjH5oxY(ih;exj{&6NmV{JM4z%@oJ`jqu^X*AD9 z_c$4>+E_wRABqDU?>Ta+j={N#tqFconDqtLkm#{=$_&XFAZxw==nbIqf4& z%juYmXU4n4%EI}Ap~Q{XgbYbQZg6r%3Z8X^+9L}Qeo;nC^(yLnspWDSCujOdmjc9- zEKG51E=KD3?26_*Iq#@>Oq7LTv9#U98CKWZ32#Iui5AEXqdZFBmB1M?hcg#DMJc)d z2LJ3whDd?RlQKvlSs&kPdlC{uQO5vV=oVJIvU*($lDH&k%7xxX)xG$I4!!Lj1s6*q zC!hwI=awD8)nes#pxBbY$YDy6{$Tnhz4aaXrINgrLRiq_4yW=WN8f*X+kbjzE_#}~ z|M;c<^lSg=xBk=bX5%vxt06a;XoHmF`}jF2-X-yfmz!nC6L8ul1?17i9dKCB0D0q9 ze(2#USwJdKxbkkyT^6qjP-G;6+dZbxQRNw5uIrUSpC*YvW-4GUkI+|>`-p*8Eb z*=8eJitGq)oVY`W#~ShluGr9TAaCh3gwW#m#2e(3e{?n{)qz^mF*4CXk}@1G%@?Cz zLd8a7(js^oEyG{|rnhA}Dk*!zu(>lpgR5DCUxDKX=qxlJG-%x?%X5-5hi)Vj$lW9^ z6UaPd?-e|efGd&cvhV{SxC@}0FyT*XX^WGH2xE(~M5;?mjxB>YMMjSsmRCNj*h~3= zFU-SilpY{Bl0+@W#@RJ;oowjm&&wZ{F$LWy^JsjWFU`?wvl2(+qfRaDNlP9Qn9?{U z3n?GUc#4hHLLS?HOzoNF0?kZ!{2I3ilZTXMANG)42k|tR-#BiGCv_RLlJSq&od*Xe^13T@`#WUPWs3#rMymb6}!^z_jZk}-E_wDUp|zU7uqP*_G-J;=_R~x z`cH5BPw!0FaN;lNzy6sFae?BkD*&$xotDBqbOgHD5lWTpViHe$Y^Lcu^OIT&Z!U1a z%Z06bxiEGw9c$Nr{@I+wBCtk{XHQRP)$PCM+r{(m7tjBeimQ!klhqtSaQ2#z>w29g zKi5gu+|+_P+sQSrq&8$MODS=yJ+~kisVU_|3uiC*8p$1V7oMcvoqcf~3cUt=E_87Y zmPJ;Owh|d-h!?(_M7m;X1y3hI2K%UU8?3Z>(T51`FVZLh88IxhIks*K))LhDbO1KbW2{^K16v|?{2TYde`Lx>7lJd#7k4zw4);uf%O(#?#9^v)m1pGx3$KCBVMwM8>&`4iqcQ-lv^ z%h>B4>jyi}>?>LgR5`i#XrJa=xFlMlSStd(31ur;Dw&438sys1=4!!Fl2rYa(Sl2i zI&2Ds?^^mU1#6FiwB$;Zzi&?RbUB(ICJFgIKkoiPWQia` zz@zrW%gjkmSBn#tMpeT0CHmr-G2-NHN?v=nPeAMCjYbBg;NelMfu#P79x>a8C*S7j zyPBf%y#46uzP@;5Juv%Xk;$3B2yq&8Jy%-jCCe&O2u&ccl>B9dc&D)1Vz$+U=Wo(sHH= zImF?#Nr%_CNtkM`i>#9Gl!x&brfcF_vjc>#XMoBblG&p;1>?zgs&m#5TOx?-L!pGz zrW`PMMpjcx!-nLJbqL&5&h}z43eoY(bwT#rH3>W$ql=O=r*|;|Ct44AK4{HbE@T@_ z7-eP`@0x^8<`ipj*ryDAjiA>9!fYG%K!kxO0Jj>7DyEge{jNhLSy zAZBM`bCACUE_>nGuRQ)({iwEzA@j@4GPTh(5;w-UnT}03S;#1a;BbVG%<80WxW!KM zQ6o&H;NEu~@dlDF8X6FDg<_hXhOHXD=)!kfkQs=w7XiuM%|mKY43}S#+R{A4uaLQ; zob#7Z?4RSI)N-q8;Sui;6{nvs$p?e1=ygxcW7C`^YXGdfk(tZVhDct?VRjw9iIg93 zREKDU1&xw7Xog-$ay%T)MyId{BLjR#%r?|~M@x_=IW95B#|04;25*Dj6v<@F;=Sg2 zybS#kA2lEs#V}i@5yb09vg2tRFTtObwY0qOYy!IeC>L`lJPD@-GW1vgCs)TXZCx^3 z-D?}po~I$1fx-RlA6~yR?MxytZ8ZVPwy#Hq;fk)%_&DjKgtw>tx!es~V4wxJzUg+n zXEJ0UQDJIpH`($DoC;JIg;+rvEuNSM4qJB>phhjx4?);uU=dpI)GUN4LZsJpz<4p4 zz{UCzE}?dBkzir8i?ru6FI`wBoDTm(4ng*f*~*N8NMe*vb&UhSW8?aL*64QC~nl2t%gOFt|pZdCey9D3d1o5!aWC=U>q#C>bF?gJ1oQ#OE>(_qgA4 zXW2$4rExOkd8!<_PKUM0in!Us$1hUM2EKIj!1gTOtsDC>m-($y4K)&bO2jE~rd+pN ztwfa)OX_IWE4Y|eRSMkW014zJ92G=|l5~&8 zI=+GOT1xj809||>dK@L2$PIVs^>;WaF{#hN-n&boIcAb=ch_db&7>SfoB@rSx=^&5Pee;t_gp-pAgWz(a z9<4@G4G*O&K6ABBo3Pxt{RgqoT?Q`V9yx#nl?k8V=vyMhZv;AP(Bji~*Q4V!tIu4~ zv?^D&WiYuGz&d4AeOEWeL$8cb4Is$epMA-rx468#uuOx(e#zaz)H;-;^`8wu*qq|6 z_`;$P266-p1g+$0V>icu5o+e1o; zDx&z*i`g)3ImopvvO>b>@xAiqv#ZA=ULmdc)D(7A>FYYtTTqEsP$^7VcT*I5`FfqLYkzs zY#FodQ#H6Y^mW~E_lZ`w6;=G4bQlvdQH>8Wdf>g{aR5Sez+6*8Eb6Xh;2P_cn(G%F zTvBpcQ%0c*eZ|dB@sajG2@_%@YB^U4f+e&U9?Qgoi&b)S6hKKasp z^0oWqTbqun{dpO~9s42-geE~kM+$a{w{<6LmEt`4NwHG zCi)|^{NkoMytFOGbT5zOvm{y6Ib4U!^xXFatCzchK3sHC&<->_{Fuz+l$9ewG6745 zlXNPoj757z4Kh@G=9A}?_3D}UE6ta`W%eX)i}jSxYE4`mtLa8e`o*8OJAT?hz$xBcQZo z@Zd{nQkX=gR3BygTVC#EbT!o6ZQpi%$6gY?4189a83Im1k7WE5O>lRmpPSlq8DDt- zE)&8z`XT2ijK%3F z&Bvj7sD{nawy2F0VZntbg5UWuc4w8e2`QNgBmG|2rqKK0Y|@`j`^&*8vU+Z&B!A>_ zHVt`>vU*IZSow*1TvFE3@tII!XZWu>48nHcZ##RBCv9Oa8hW}@ivP>H!@om0j4+61 zk!rfBQ~U6Y9e+nT=*@Ljo#JPn*G-=sJ}(x*boiSUeKu~TLW|(s62iU;wN=4a3MYKx zftw~I_1mA1CX>@R&8%~!TM{2Ai=NfbEV(p(>Wmz3n_y zH!3o7OM{A4(;KVRVj>^zGz8;rri;B5caNE9nDE{btN9lN!QFiCo(KVW;gF5M#n~dzshE4ov9WTJ zopp24RzIy$z@D`;Pd^9%xk+kaAhCw)B&F45I}v|>Z))t7bUhS7CML5->LkJ8(|OkB z-$LQx>3Bkib@ARcbIL9teRp#}5u_1J;6AqrU`JZY!N#4r%7N^xto9N zv-i%#U70kgM{2Ze4>@qBS=&q}NNjMA@l}vb;3Sq_*;tD$mel`~4|~z(Ja-4T_`VVT z&l8Bz0!B5l?PjmM{NWV7OY785t^1S5=(WOOnunheN{c$wo??~o7Czgm%Ldx7|ZSA%%Na4 zCqw}Ch6;3ufzo(jwb+e+>{}N{?mI}beiWy!$v}^y(KOPx>&{LE|A%~?30xM{*T+Y2LD5GtH7Y79Ei@MtR4h{v6i`$IRB{Or z9t35R=V5WlD9y|jx6;zWGPPWCtE@CNH7(6>Dc4FoZWiU2f4<|?PbL@oPyFYdmJ`ZqT1Dr^ z77kkM<6Wz9!|zVasXZZmbhDE1HqW+L-Z*5}r|(+Bg5L5zGosn@bAQjdKKSRs?Y^Ju zJ^Rx@M6&Q#UCC2aPsqUOZOeh-*oC~%}qV#jUF|k%wzla8_qx1t?sXl>x|z% zJ#I))?FOsgfAz@zxAGJ2tK0A52i;q_8vDL>|H(0Bm;3y(IJx7egO_w|=Q(0Umwk`4 zUp;nG?XTwl5?pfZO8gt2)cAGYkliz4HuZlfWa6ziz8iCE&GXwn-!ePA!OM+%?0VwN zquwV9M~+^zu}kNhJNtb0nQxy7^$))Lz`}uVkNx(!nm@ET7BH#YFYxubipvA zC+Dx3yEJdqxQxIbHV=$w?!Et=i*4>}`oHCUX0QLY>yZmJ->N-m=G%uZPq{Xt%LjEH zDSRUHLf_Hv<}aUqAadXOCQoj4U-|U8$I1_8pL-;K^vTa(ZClvtNP^eJSwr_FJ>IKZ zqhC+Yw5DBo@@Pch_0I}!KV5(Cua3LQH+}iWJ3qhs)ydx;IkUd`V2_LG3p?-1`Ruv5 zUgzUSv`ii{roQv#hCX-Po;I!MXmLsCxA!)i92C>P`MEiFhpy>(WX!O|O=DC2-Wa^$ z*Of_`Bc{DEsdo0{*O$FnC*r#a7h~?dFuljTCohCL?!TRX?8`&(z4te{{=^5_tB-kp zG-TPLUyjDy9d@$wyf0>aarRK%w=Xvx7x!w|`{z0oeHGgN>Ar7m>Dl+SA8Q7+{c>*V zwP~#vJ>)8y`rEYDpKti9){s3ZyT+be>^J*ZXYVaH+OD`7^~zRPytVyY-?#FcO|04H zz@@m>pRX^zadmIS+VxSZUf(ct&;{qD*iC;OS-kt4a9mTyD&)^OY6CAlxZRrtVf`{t1^H?$}%d;0fhpPlwo(zgi}6B@^SoE}!x=6JuZ*W;c_{l2?zr@UT{ z=u7vdv~=}}?C@yq7dEYIv;DwNYcDiSocxK$;lKwQ#m}5Er@^>BX<5I_-M^_-%=h8H zY^JipK8|j=GvkCUp*1}+ovbye*9h1lB@6T zE$sDR{=j`_QXU<@J?b~dr^R&{Gz?Gw^=+CRGo1T9N$=U)E#`K9mv z`nx~;#>fw2-LLigy#IuqV~6!={b~Jk=byNL#8(x4r~O#(!45?q%{e_TX8Vzwb%%LA zdf?jGKJ7==^>rS4(>u2HF8^*`eSdi1j^}s84$K``cm5~Wc3$4rC}P=HYoZ?itnG`3 z4t;rWNJQGjfvZCvDf}t3-GPS^Z`VBdziUAQm&7&d9rsbGJ9uW_OTn9R4}ErX;Wv$E zHW+e$^Pk_yO^a&w;%P~<-ZAFd!Do*Iwu*jpX^R8jeRp~N=o=3&e&^xL`nyve@^gNh zn_BOeZO)U+&koEybM*C~#UX`{PWiiA_qSgI4#`)}nHGlf%RQJ)3otWn7yS?_$smZAc-}l}6&1)b2c6-CSPp@m-#dF>x1s5Ml zZoM;a+NAhR{Zf7pUU7G)^7gHp-}}Rpf9!s7Wa<1GF{y92TX+5Ar;oh%^!?wgI#Ohv z$o}BZGbxwMo-VZx+I|cwXSVWj6e3wiG$m-CS01|ZbSVwK2!S@ zZo0I;^9!5%JUOd-(i?M=dp(xa`pc)+1O=Tx^ZBtQ8DanQ_$m08E;|oJrOz98dUfvy z<7++oR_8w-yY2OK;hei4{_CZ)k41(zZQLL!e@1A7qd%YQ8xi(-%b2v8!E5&X{nyX_ z;};%uUmo9~WbF4({4(M7kFw^RX|Zy8UfhDA6?Lv0ardeFT;l8v*T28fWp%5;_XV}6 z_x@cw?oTUwv_s1c8((>7Wl`h6cjB5|Z2t0?s~h@%pZe3m@qc$2cDdVekNLh+bNG?h)nio$MLz@Sj+7SUrbtgu|!1!z;?$Rk`2K+asy+ptm<% z77W`q*f8bc4`n9;?L?p*kN%(szrj#-4QSy?N6>9;Ru;nC(;o+uAUHX4Kn8x!!g{9sdSE?(`N_3aevyt) zw8#p7NmpaeSakMULgrm`+VE9)ZM z+as&;pqIBB_H{4nXX9F;`G;fs4uLJWCj5XjntYq?0WM7T?5+CT zd%94n^LjiF2T`i;#K6UvcOG4KEH=ewgEK)bm!6P z;f?v1Q(h0?HIUHGSz-+;^H=qy#>hy=l^Pz`dFjKvvFyIJ@oLM;#UH8-dklfXhk5sR zcws&vbiON|ha%vZ7elNBnW|gpYco7!9RAaBOr4Bl-o)A-&<6rwoUa__BE5S%0(vrl z?PLMj3MQXt;P^@HKLW?+NJoi>r*93>-f_rO;~Wr zxV~8(G-6p>$(LCkk^dgct8AfH9)qhj1|9w-#}to&j#8LL7r<5q+X^VwT90VB3hYO~ zR!Vt2P+3=MK2!Z8(ot5!FA{@!NU@81Rb6!tx&n3{x37~OEu*wfpipW1;_80Qkw9;obFYJRT1pC)^D!WdMyQo?a|AK8kAeeJVa(XtqFK-(VT}-lYZ6sIFxS#rttYGwN~(3Cm$x4O z$yNun1qsKpG-6RW?}GiA9=)(`V9mqp#^YmA6KcL~2A3?Q>%(DRkHs)&PQ>{(%Pi+q zAJ|8_%?))v)wkJ5TwC>Wly~=R;Zbda!s*ZQh0U)%{D9OQ>n0Mqh{vli1w?vd9f#1l zx;W0NF#s0W*f(Kex>=VP*vEvni-~=WAkuNFhQ}nZ-NPHt&7*U7<2luS z2C2GAgTu9SZUD~js;;0h)4KXU>$#Geo^`8lFwmXWRNtMT^a)_vw*mZsbP0c`I)gEv z`cu_h2Hn+TRz1~OVP#R-t$KK;0gP0uGX`;9%_F;CqFq%sk7w1Q0uDoAE2Z-zsXtIZ z7HtJ?89Y{2m#=CEhsj0dA0VB#BoUbbB*}Dc-=sU5BlhZeFl z==@)J9_nF+NALfx)jZ_gO1N5cl+d+3@mfge<2+*64_Up!Bm%bwv__Bge#$HX)HQqP zn(6<(2F89|j?qOCRTts7e2cF6j_PE(hgzGcXAp2R=owkV5!Kxh+s6?V<_LxL36D!C zT;GLmIMn!9)&9Uwj|r7|_VA9V+>iDi1N+btVH)b|ZTW+Z60$J|_H|i%!K$tZCd(dp zt6?PrUP_vWD*JQQm}lyp?qP9$np*Ar)YBU#|7xbrK6>8rYJ?6{JtxA@_z^SrRmcK~ z(Jh7QhY`d&p#c>Kcuq9gv#-Nn_ro+g-@5X=?!V)S_p0RTzC^V}%xe*y55)73LSS1< z%!BHznsr`azF3w(sMWQX=-R3O&$S-Eii=@h$2lqBPV@kpzxsh=2|QeawFI7vpmR88 zVE>rtk*Ln$Jef@AitwDehpbx9d&E~ZVXGCKo=)1uq~&WaH0cZLI%qjP%>2BW^y>Z; zp5Np_t}xuFG4m*$Yl*ht+yLmS=<5~YImm}PeBj0xo0&Bp4(sD!3km*6fU3vp*AMi} zYHbbA2diH{z}#9<18z@xKttBIDWLroNvtA!fR@8{6qenm;08uL;=nqdPWhYl+jJa9 zCgZb#L6u#oyEnwIuZn}3Tei_PG^|2wk!4W_I#+GW0Pl3czp5o||>?;`utajiWWpSw=1 zsTPlY_&6J(=7^b1Gh{KY}1z-+y4|!8)lROsv1NJ0a5p-@4UI!@#wnSocX{?!r&(3Yv zsbQYOt6zhudtrPou!8KVbuY9Ren0QI$D?wF+wu86xNn(QbF$}j50A8ZJ79$Q9D2(> z^cL&+3fb8T`_|xU?(1Mp1C!Uko-2082mSvdk>1I0c^3=}B=d}>`hI4ft$LiTwz2fZ z`LUYY+U|PXEu%aNF(Y*k0(}q0T|BHVVYq8rzu&IzoM+{?Apbt=Y2n2B-{c9FWby(4 z->FpMQ?!R&3As5oZS`T|S4c;)x#scT@IU8~xSi@q< z(;w--|@lfLG`w6ipo#L+IMBd}qJE6i(C&g=96(p=r=W(rA1N`@* z_!y3-JuPyQwD{2*^yq)Gx*4YDvA~mv``n|&CHliEB3}N82I~10>`ozmDnN7fEDCmC zBW^vW`9=LAJ zJlQexowwo?e9$FRyS@`XF%D~=(soQeHdp$Z>YftMn0g5``oUVS?(1OpNzx~3Tp96R z#Qg;yNSubDO8s!+rrnsD8%5k4n@=}!)^nViZWI6$1RH;<)x|MO+MjSsp zt*W>&47{pd{>@F)IYm3BRFa!J0m*40@ox-vXp;R8H_`m}2~Ud}Il~K~yj9;OSDkpB zc!MgW_TC~+%iPMdD~QXSR};r^ny2-|+i?i{9}@2*_-5kW1m8})r{JFx$F%}a`a8^8 zmCxYKxr3y?-vIhNLLAp_Jbg#JghSXrLtL%@*|`hEQyIhE--x>ezfOFb;D0G@T7A{Y z8fw0&WtCPTwO5Du>w-5RzD)2tiGM8k-NX+F{s3{DPk3rh9On(59wUB}L)dReTz#L& z&UGT*-gHnp_ayOn!NZB;xXx3w;$D^Gm^s%^aoNf(YXET>=^?~r4^C0MmQ^hB9YK7s z;Mv3%3+^KRvfyKgeIJs#|fTET=&C23eKA$7LP4E|q!_w|wX$J8S z!RIPo%bFtcT}XVY;BSzfWMSuR((8U%mGw&E2ZWt<#7hPLkhmUis_bkbuE&omzJvH_ zVdo3tx}R0)zb5XZKCAdQ#P1aRBysbOkGbMU;thlz*WYrkz-xZD;dS7?r8<2R8~%U| zZ*9XLx8Xf)cz+u{)P|?p@R2sW$c9g_;nQvSTQ>Y%;Eka1oA;vDQH5={(c`-W)x|#t zmh#o{!!~wK*znUf{3jd!rw#Y4UA;dIZFo}~-qMCYZo|WDc!CX2vEi9EJkN#~+3?9W zdvroE|;lb9PL_ZS?Ur^Xw=a{dgNboANEC=eO!R z6v%h6jeZ&F%jrSpd&*18+GwNSYQuMtof1E7U@JA~Z*BA!NFPcMo*p3mpEmlMFyBQ}3mM3y;|7+u87Nva{_$?SEg2L!6C1mGnLj{aar^Jej!po@Km^oynxn zdsy3!G<`54J)kv6=a4Ic;`>s`GZ4{^uu&oB+Q(PxuB zwujcK_fugP-#4wUTrZJ6xwqESu%g~U#e7SNf2~hjON>571M`gqzL$#n65{H6dXRhy zyt;h%+VC?r{C69E!-hA2N5<&SsaWmjCG!7n;MMs9e+aZ%9%RGA$$oi%ZTL&FpJ1aO zM*6ZiEmZHf!fvjOew+=TLUv*YX*<*$teM1Dx_I7YGcSBkcCL_}56RBYHg^&?(RT)pcGSv9w@)5?Yi+wdMXyt57OWy9aMxlh??!{co1Bm!6cl)f-i@8d#w z({1$GHoSoBtfd={3sjGjZS=Ej_{%nYg$>_k!^>^>k2d^Q;24Lz;o9-`~;c zUrYMGNPiFT>e_#E8y;xvq-p~_$xbM7^UJ~s#QWIT8A|%(G%cJ?`qgy*a)r2hw-?Th zw6QbJhEKEM3n<_6be*A@kKVP>e`v$^*zlud-#3Gc@CBQ{q;Z=H|ZsA>#hT;jw^9fxzM4e^O`C2a>)MDMD@ZLrI@U z`qrdRx6x;lzKry}NMA_&3h_YV6Nvj~Yv4fzE(H$%{*#v5@U1qy+=l;P!!O%#PY5`i z`cG8#~}+we?jSIQoBz>?|fbcMvZbt$}%dr8XRYSD`w8_S^8|HvBAbjC1TX9rr%^!@5emjCd^Z zn(*AYx_lb}M>|(Y56d2vn%U@|B)$3t15nN-eVmOx&4w4+aQxi|^rvjPHf+Y9#l)`= ze~0p2ZS*rV*hTzP8~gi7pEpwr&3t{FcnR@-Waom7o!>}bPI?oE+s6JZZJ;gLsSnS` ztBe1gz*TukPt{=g+vwZc@W;tcV5!c~w1-~AONi6$oHdB}DdOt=e7H2-#(usHf7aNa zqw_WQ`_pXni*5K?vU7@FaNbIB+eWT?M&;Lo8yK&-H8M8M>um*$Fza# z-SBsaGE<#Jn4MMZcIIdI%qnnYL=1PDvkJyL-Oijsg9hZKrMR8_vUIktHkq#c6tI(< zmzV3xbUT$Z2BJH;dG5^I9G8`zmEy`6l$n#3TLgY&IaA$9?#ygwZh^Z^yI`vzN3$X= zaOY<_)7rG_Xr&coXOC&qt^*X@4G!kCY1iIzXE?K+ZQ2D{kxqA&A5Vy>@KPVwQs!fNW z&QO~e?WEm9h||t_@OG1*xlo)Kx)BAEd5@I)dDT)V0Ct+F+#*R{CI-Z?Gn);cIV9n@7F)!B~fYzM7Z*LF~LIw+eRwO-}eQC-zR+3Bc>(sxw) zj#{tmbX1y7>e^1~s!l4GPAbPv>e^1~s!qy6Cv|Nnb!{hgZHT%yL|ql4EQF|QL)5h) z>Z%ZBAw*ppqOR?%l%18bvsNl=ot3rD%35c2ZD)0DXLYt+pgye(bq=u-+_@u0WI5BU zq{x_l-NRy%`t|G?-y(0%xR3|LROG?Et z+L@M=syx#JB^@NGu?R-5tjwHIR(^I`X1wE;kJ2NvRp5lG0N$v#dlMllnx# z$n8=EG5aw7CZ(rY(Wx+4^4)|k8u$|?~(Qz!Mvo0k{s%t^yRDJ2iXo&(N@RY7&o*IDfDQRsxpEYXdQ zGTb& zG&hWuR(fupGY2|rdQm=1aaMXN&KVYz28L{CZKGg>{&yRp!eZH|tWhaBX<5$R&M~nt zJiDMULFJ+TXaS~*@?#Z=jB5O8kjI#wHF-i z)jGgRhnkOdkBLZer?pKBgP3U5F)BFaF($W^-pCSrqkSPD{<6t#Rg`&3R1H4 zX*WbHG92myI+8QR<%E506i>(IL+tY1WAucm8{D9je4N~%lfe2WCl|XSbU>(XmpcvC z16F!EE<-H1bOfw%`li5K2WLQQ6{b_;PIULtogDI}9$xG=%cUgf531?IfYAe2P}&`6 zpP<%-#I-@@aOfc}?NY2>X+cc&&Y(U$A!`#6J(48oeuO_&h@xH5&_*-UVX49_n*v*^ z>Gw$~&dkO!1+$KH=4LzH`D17>(9^yi5@?N3Deqa3l?5FgTWw;W+(KuZ(*;)kRb`c0 z<%}La!(o8{gQIF|aETknEj6OWIn!XUuo9qi6vH~rY2k1IBNVL9pmjKNFvM63S;%$i z;Bx5cX)tm+-6Jy7@S^}eAhf#fqjS=8EgT)Nrx;i1R7B7G+-$wC%F3^(T3a`iSwpDQ5x8I}H!4?N6sF3>TX(*4qm`UC1b#+j!dRv)X}djfo#l>?jKjX+bSI@b zQw!2YS!uaRX{jz4#9_VXa>B5g+KwNv{Yp_1j8n80cV!kkv$XvP7&_CO@!|1SaZ-k} zxIGLsum`ySMPL=WVU~mvseYM|tNS%bU_ovqsxnhk@?bzf#xjTQ0Y2ln1*a`o?+?y} zIR`%Dq1QthQeb(Sls`J#T;g($Rz-8BDyj@eKo500qg@d_Vk{^+^gNtjAsl(R`7kg- zb9PnLaD+3@P4@*jlw)HDUvb!hPL5-1VqUf$)MGP?vs3c0($yf7sOs3va9PmK+%R~8 zI?kDr2J?_JAy;2P%jCp77$hurZeEtN5Mqh*d;$#fl|2bs8M{saE_Lml`4ZxJKYUIOxjF!2=a8b33GuaM7IxH%C@D zuFfI1Q82J3f$wmy z9X)1~L;kFs)dbB0479R(w2Qc(&_Ja`s+W|EqQaEeMQa5?j_ zLt81S=#-UCu~&wj;43sqbslOlUG??!G`x@|T3r-9=_JNEVI||rfQC3cHzhx<56sCp zXb*(dSf;yAZW<1Juqug%uFxkJGLFUjKODtX)buI^8(=Zi7Or}rS9c!+18!I$tcTRy zDm6)LcA4ogDnb@C!a)=56Yv0gy-gs=>e-W6$)q*IBltYwa~&NyffBV&rFHg z1+iF-H1g`!3w50`!ihKYGzUUfdC)Y9Gjr*xcz1p{bXl;KR0#hvU75o(vohVVTvQ|j z3JHaSAp};!2E(fSKb+!F2zTS7vef{k0|SRHSP7aq6}r_?qMjJ^g0^3}nI^Ie^iu?= za9R-$%5-Po6h#%O8<|?#C*uv0w)I~^bDafE>aCfiMTSOQ3i&f z%Kc0iz|1tIhrS1~fqR79Y;~NJ7?y-PN%0AB(S0K=Xl`uzN9u%JrOk8|rNUY|3yTJB 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

    AChN)e;_}K@!u8wQTIzl^q=(P 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 Sat, 25 Jul 2020 13:48:12 -0400 + +xterm-dev (358) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sun, 05 Jul 2020 20:35:21 -0400 + +xterm-dev (357) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 18 May 2020 16:21:11 -0400 + +xterm-dev (356) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sat, 02 May 2020 06:19:22 -0400 + +xterm-dev (355) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 27 Apr 2020 14:58:28 -0400 + +xterm-dev (354) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Fri, 28 Feb 2020 19:23:02 -0500 + +xterm-dev (353) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sat, 18 Jan 2020 10:53:11 -0500 + +xterm-dev (352) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 18 Nov 2019 04:22:56 -0500 + +xterm-dev (351) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 04 Nov 2019 16:16:46 -0500 + +xterm-dev (350) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 23 Sep 2019 16:16:38 -0400 + +xterm-dev (349) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Tue, 23 Jul 2019 16:06:11 -0400 + +xterm-dev (348) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sun, 30 Jun 2019 20:15:46 -0400 + +xterm-dev (347) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Tue, 28 May 2019 20:19:05 -0400 + +xterm-dev (346) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sun, 19 May 2019 04:44:47 -0400 + +xterm-dev (345) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Tue, 26 Feb 2019 17:33:30 -0500 + +xterm-dev (344) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 14 Jan 2019 13:12:18 -0500 + +xterm-dev (343) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 07 Jan 2019 18:09:07 -0500 + +xterm-dev (342) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Tue, 01 Jan 2019 12:29:29 -0500 + +xterm-dev (341) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Tue, 18 Dec 2018 05:25:26 -0500 + +xterm-dev (340) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Thu, 13 Dec 2018 19:11:25 -0500 + +xterm-dev (339) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 10 Dec 2018 19:01:55 -0500 + +xterm-dev (338) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sun, 23 Sep 2018 12:47:17 -0400 + +xterm-dev (337) unstable; urgency=low + + * errata from #336 + + -- Thomas E. Dickey Thu, 20 Sep 2018 17:28:53 -0400 + +xterm-dev (336) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Thu, 16 Aug 2018 04:47:52 -0400 + +xterm-dev (335) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 13 Aug 2018 16:24:45 -0400 + +xterm-dev (334) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Fri, 04 May 2018 17:08:25 -0400 + +xterm-dev (333) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sun, 15 Apr 2018 20:46:52 -0400 + +xterm-dev (332) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 01 Jan 2018 11:13:30 -0500 + +xterm-dev (331) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Tue, 08 Aug 2017 19:08:43 -0400 + +xterm-dev (330) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 12 Jun 2017 17:34:51 -0400 + +xterm-dev (329) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sun, 04 Jun 2017 09:40:17 -0400 + +xterm-dev (328) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 24 Oct 2016 18:07:15 -0400 + +xterm-dev (327) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sun, 02 Oct 2016 19:18:09 -0400 + +xterm-dev (326) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Wed, 07 Sep 2016 21:12:23 -0400 + +xterm-dev (325) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Thu, 12 May 2016 19:25:56 -0400 + +xterm-dev (324) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Thu, 10 Mar 2016 19:19:50 -0500 + +xterm-dev (323) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Wed, 27 Jan 2016 04:48:15 -0500 + +xterm-dev (322) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sat, 02 Jan 2016 08:42:56 -0500 + +xterm-dev (321) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sun, 27 Sep 2015 19:17:50 -0400 + +xterm-dev (320) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Wed, 26 Aug 2015 17:52:20 -0400 + +xterm-dev (319) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Wed, 22 Apr 2015 20:44:42 -0400 + +xterm-dev (318) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 06 Apr 2015 06:31:31 -0400 + +xterm-dev (317) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Fri, 20 Mar 2015 19:54:44 -0400 + +xterm-dev (316) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Thu, 05 Mar 2015 15:52:55 -0500 + +xterm-dev (315) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Fri, 02 Jan 2015 07:49:44 -0500 + +xterm-dev (314) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 01 Dec 2014 04:54:46 -0500 + +xterm-dev (313) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 06 Oct 2014 05:26:37 -0400 + +xterm-dev (312) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Fri, 26 Sep 2014 18:42:15 -0400 + +xterm-dev (311) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 28 Jul 2014 17:36:30 -0400 + +xterm-dev (310) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 14 Jul 2014 19:36:58 -0400 + +xterm-dev (309) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sat, 28 Jun 2014 10:34:28 -0400 + +xterm-dev (308) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Thu, 19 Jun 2014 15:58:13 -0400 + +xterm-dev (307) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Wed, 04 Jun 2014 18:58:36 -0400 + +xterm-dev (306) unstable; urgency=low + + * fix incomplete implementation of new SGRs + + -- Thomas E. Dickey Tue, 03 Jun 2014 16:25:02 -0400 + +xterm-dev (305) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Mon, 05 May 2014 14:51:42 -0400 + +xterm-dev (304) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Wed, 09 Apr 2014 20:27:40 -0400 + +xterm-dev (303) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Tue, 04 Mar 2014 17:46:25 -0500 + +xterm-dev (302) unstable; urgency=low + + * maintenance updates + + -- Thomas E. Dickey Sat, 15 Feb 2014 16:19:35 -0500 + +xterm-dev (301) unstable; urgency=high + + * miscellaneous fixes + + -- Thomas E. Dickey Mon, 09 Dec 2013 07:59:24 -0500 + +xterm-dev (300) unstable; urgency=high + + * fix a regression from #298 changes + + -- Thomas E. Dickey Tue, 03 Dec 2013 18:59:58 -0500 + +xterm-dev (299) unstable; urgency=low + + * fix remaining regression from #297 changes + + -- Thomas E. Dickey Sun, 01 Dec 2013 11:48:42 -0500 + +xterm-dev (298) unstable; urgency=low + + * miscellaneous fixes + + -- Thomas E. Dickey Wed, 11 Sep 2013 17:16:37 -0400 + +xterm-dev (297) unstable; urgency=low + + * miscellaneous fixes for old issues + + -- Thomas E. Dickey Sun, 04 Aug 2013 08:58:31 -0400 + +xterm-dev (296) unstable; urgency=low + + * Build-fix for #295 changes + + -- Thomas E. Dickey Tue, 09 Jul 2013 21:20:04 -0400 + +xterm-dev (295) unstable; urgency=low + + * Workaround for problem with ld --as-needed option + + -- Thomas E. Dickey Sat, 06 Jul 2013 21:20:33 -0400 + +xterm-dev (294) unstable; urgency=low + + * Add experimental support for sixel graphics + + -- Thomas E. Dickey Sun, 23 Jun 2013 10:36:52 -0400 + +xterm-dev (293) unstable; urgency=low + + * Miscellaneous fixes. + + -- Thomas E. Dickey Wed, 08 May 2013 18:29:21 -0400 + +xterm-dev (292) unstable; urgency=low + + * Miscellaneous fixes. + + -- Thomas E. Dickey Tue, 26 Mar 2013 19:11:17 -0400 + +xterm-dev (291) unstable; urgency=low + + * Fix a different #282 change (Redhat #874327). + + -- Thomas E. Dickey Tue, 26 Feb 2013 19:09:32 -0500 + +xterm-dev (290) unstable; urgency=low + + * Fix incomplete revert of #282 change. + + -- Thomas E. Dickey Tue, 12 Feb 2013 19:48:21 -0500 + +xterm-dev (289) unstable; urgency=low + + * Miscellaneous fixes. + * Fix regression with XTERM_SHELL feature. + + -- Thomas E. Dickey Sun, 03 Feb 2013 13:59:20 -0500 + +xterm-dev (288) unstable; urgency=low + + * Miscellaneous fixes. + + -- Thomas E. Dickey Mon, 26 Nov 2012 20:53:23 -0500 + +xterm-dev (287) unstable; urgency=low + + * Miscellaneous fixes. + * Redhat #874327, #875305. + + -- Thomas E. Dickey Mon, 19 Nov 2012 04:53:39 -0500 + +xterm-dev (286) unstable; urgency=low + + * Redhat #869959 + + -- Thomas E. Dickey Thu, 25 Oct 2012 06:56:35 -0400 + +xterm-dev (285) unstable; urgency=low + + * Miscellaneous fixes. + + -- Thomas E. Dickey Mon, 15 Oct 2012 06:57:38 -0400 + +xterm-dev (284) unstable; urgency=low + + * fix documentation errata + * fix regression in --enable-regex + + -- Thomas E. Dickey Wed, 10 Oct 2012 18:17:35 -0400 + +xterm-dev (283) unstable; urgency=low + + * Miscellaneous fixes. + + -- Thomas E. Dickey Mon, 01 Oct 2012 20:45:50 -0400 + +xterm-dev (282) unstable; urgency=low + + * Miscellaneous fixes. + + -- Thomas E. Dickey Mon, 20 Aug 2012 17:55:32 -0400 + +xterm-dev (281) unstable; urgency=low + + * fix regression in keyboard configuration. + + -- Thomas E. Dickey Tue, 26 Jun 2012 04:36:36 -0400 + +xterm-dev (280) unstable; urgency=low + + * Add Debian menu-file. + * modify to support icon-theme + * Miscellaneous fixes. + + -- Thomas E. Dickey Fri, 25 May 2012 05:36:50 -0400 + +xterm-dev (279) unstable; urgency=low + + * Miscellaneous fixes. + + -- Thomas E. Dickey Wed, 14 Mar 2012 20:33:27 -0400 + +xterm-dev (278) unstable; urgency=low + + * Fix regression in eightBitInput logic. + * Fix regression in Darwin 9.x + + -- Thomas E. Dickey Thu, 12 Jan 2012 08:10:50 -0500 + +xterm-dev (277) unstable; urgency=low + + * Minor keyboard fix. + + -- Thomas E. Dickey Tue, 11 Oct 2011 20:12:14 -0400 + +xterm-dev (276) unstable; urgency=low + + * Regressions in #272, #274. + + -- Thomas E. Dickey Wed, 28 Sep 2011 17:34:20 -0400 + +xterm-dev (275) unstable; urgency=low + + * Regressions in #272, #274. + + -- Thomas E. Dickey Sun, 11 Sep 2011 09:46:57 -0400 + +xterm-dev (274) unstable; urgency=low + + * Various build-fixes. + + -- Thomas E. Dickey Sun, 28 Aug 2011 20:07:29 -0400 + +xterm-dev (273) unstable; urgency=low + + * Build-fixes/regressions from #272. + + -- Thomas E. Dickey Thu, 25 Aug 2011 05:42:58 -0400 + +xterm-dev (272) unstable; urgency=low + + * Build-fix for termcap systems. + + -- Thomas E. Dickey Fri, 15 Jul 2011 20:41:30 -0400 + +xterm-dev (271) unstable; urgency=low + + * Ubuntu #756273 (accommodate function keys as popup-menu triggers) + + -- Thomas E. Dickey Fri, 29 Apr 2011 20:30:29 -0400 + +xterm-dev (270) unstable; urgency=low + + * more fixes for fullscreen toggle. + + -- Thomas E. Dickey Sun, 20 Mar 2011 14:53:54 -0400 + +xterm-dev (269) unstable; urgency=low + + * amend translations for fullscreen toggle. + + -- Thomas E. Dickey Sun, 13 Feb 2011 19:20:48 -0500 + +xterm-dev (268) unstable; urgency=low + + * build-fixes, etc. + + -- Thomas E. Dickey Wed, 24 Nov 2010 06:17:16 -0500 + +xterm-dev (267) unstable; urgency=low + + * build-fixes, etc. + + -- Thomas E. Dickey Wed, 10 Nov 2010 18:46:41 -0500 + +xterm-dev (266) unstable; urgency=low + + * add build-script for testing, adapted from Debian xterm package. + + -- Thomas E. Dickey Fri, 22 Oct 2010 17:15:59 -0400 diff --git a/ports/xterm/xterm-359/package/debian/color.sed b/ports/xterm/xterm-359/package/debian/color.sed new file mode 100644 index 0000000..6029c59 --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/color.sed @@ -0,0 +1,4 @@ +s/! Uncomment this for "white" text on a dark background./! Set the default text foreground and background colors./ +s/!\*VT100\*foreground: gray90/*VT100*foreground: gray90/ +s/!\*VT100\*background: black/*VT100*background: black/ +/!\*VT100.scrollbar.thumb:[ ]*vlines2/,/!lines[ ]*-1,0,0,0,0,-1/s/!// diff --git a/ports/xterm/xterm-359/package/debian/compat b/ports/xterm/xterm-359/package/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/compat @@ -0,0 +1 @@ +9 diff --git a/ports/xterm/xterm-359/package/debian/control b/ports/xterm/xterm-359/package/debian/control new file mode 100644 index 0000000..79c68f3 --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/control @@ -0,0 +1,23 @@ +Source: xterm-dev +Section: x11 +Priority: optional +Maintainer: Thomas E. Dickey +Homepage: https://invisible-island.net/xterm/ +Build-Depends: debhelper (>= 7), xorg-docs-core +Standards-Version: 3.8.2 + +Package: xterm-dev +Architecture: any +Depends: xbitmaps, libc6 (>= 2.7), libfontconfig1, libice6 (>= 1:1.0.0), libutempter0 (>= 1.1.5), libx11-6, libxaw7, libxft2 (>> 2.1.1), libxmu6, libxt6 +Provides: x-terminal-emulator +Recommends: x11-utils | xutils | bluit +Description: X terminal emulator (development version) + xterm is the standard terminal emulator for the X Window System. + It provides DEC VT102 and Tektronix 4014 compatible terminals for + programs that cannot use the window system directly. This version + implements ISO/ANSI colors, Unicode, and most of the control sequences + used by DEC VT220 terminals. + . + This package contains a development version of xterm. It is + configured to use "xterm-dev" and "XTermDev" for the program + and its resource class, to avoid conflict with other packages. diff --git a/ports/xterm/xterm-359/package/debian/copyright b/ports/xterm/xterm-359/package/debian/copyright new file mode 100644 index 0000000..1ea0b28 --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/copyright @@ -0,0 +1,223 @@ +Upstream source https://invisible-island.net/xterm/xterm.html + +------------------------------------------------------------------------------- +Except as noted below, all copyrights use the same wording, denoted MIT-X11. +That is not in Debian's list under /usr/share/licenses. Here is the common +wording: + +All Rights Reserved + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name(s) of the above copyright +holders shall not be used in advertising or otherwise to promote the +sale, use or other dealings in this Software without prior written +authorization. + +------------------------------------------------------------------------------- +Files: * */* +License: MIT-X11 + +Copyright 1996-2019,2020 by Thomas E. Dickey + +(date ranges vary, depending on when the respective files were first changed +significantly, and run through the most recent change date). + +------------------------------------------------------------------------------- +Files: 88colres.pl +License: MIT-X11 + +Copyright 1999-2016,2017 by Thomas E. Dickey +Copyright 1999-2000 by Steve Wall + +------------------------------------------------------------------------------- +Files: vttests/88colors2.pl +License: MIT-X11 + +Copyright 1999-2014,2016 by Thomas E. Dickey +Copyright 1999 by Steve Wall + +------------------------------------------------------------------------------- +Files: vttests/256colors2.pl +License: MIT-X11 + +Copyright 1999-2014,2016 by Thomas E. Dickey +Copyright 2002 by Steve Wall +Copyright 1999 by Todd Larason + +------------------------------------------------------------------------------- +Files: xcharmouse.h + +Copyright 1998 by Jason Bacon + +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of the above listed +copyright holder(s) not be used in advertising or publicity pertaining +to distribution of the software without specific, written prior +permission. + +THE ABOVE LISTED COPYRIGHT HOLDER(S) DISCLAIM ALL WARRANTIES WITH REGARD +TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS, IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE +LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +------------------------------------------------------------------------------- +Files: xutf8.* +License: MIT-X11 + +Copyright (C) 2001 by Juliusz Chroboczek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +------------------------------------------------------------------------------- +Files: ctlseqs.ms install-sh +License: MIT-X11 + +Copyright 1984-1994 X Consortium + +------------------------------------------------------------------------------- +Copyright 1987,1988 by Digital Equipment Corporation, Maynard, Massachusetts. + +All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital Equipment +Corporation not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +------------------------------------------------------------------------------- +Copyright 1988,1989 X Consortium + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of the X Consortium shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from the X Consortium. + +------------------------------------------------------------------------------- +Files: koi8rxterm.man uxterm.man +License: MIT-X11 + +Copyright 2001, 2004 Branden Robinson + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +SOFTWARE IN THE PUBLIC INTEREST, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +------------------------------------------------------------------------------- +Files: charclass.* + +Markus Kuhn -- 2000-07-03 + +Permission to use, copy, modify, and distribute this software +for any purpose and without fee is hereby granted. The author +disclaims all warranties with regard to this software. + +------------------------------------------------------------------------------- +Files: wcwidth.c + +Copyright 2002-2016,2017 by Thomas E. Dickey +Markus Kuhn -- 2007-05-25 + +Permission to use, copy, modify, and distribute this software +for any purpose and without fee is hereby granted. The author +disclaims all warranties with regard to this software. + +------------------------------------------------------------------------------- +Files: config.guess config.sub +License: GPL-3 + + Copyright 1992-2017 Free Software Foundation, Inc. + +On Debian systems, see "/usr/share/common-licenses/GPL-3" for details. + +------------------------------------------------------------------------------- +Files: configure +License: GPL-2 + + Copyright 1992-2001 Free Software Foundation, Inc. + +On Debian systems, see "/usr/share/common-licenses/GPL-2" for details. + +------------------------------------------------------------------------------- diff --git a/ports/xterm/xterm-359/package/debian/postinst b/ports/xterm/xterm-359/package/debian/postinst new file mode 100644 index 0000000..d2efe3c --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/postinst @@ -0,0 +1,25 @@ +#! /bin/sh +echo "** postinst script for xterm: $*" + +set -e + +PRI=60 +ALT=x-terminal-emulator +PKG=xterm-dev + +BINDIR=/usr/bin +MANDIR=/usr/share/man/man1 + +if [ $1 != "upgrade" ] +then + update-alternatives \ + --install \ + $BINDIR/$ALT $ALT \ + $BINDIR/$PKG $PRI \ + --slave $MANDIR/$ALT.1.gz $ALT.1.gz \ + $MANDIR/$PKG.1.gz +fi + +#DEBHELPER# + +exit 0 diff --git a/ports/xterm/xterm-359/package/debian/prerm b/ports/xterm/xterm-359/package/debian/prerm new file mode 100644 index 0000000..1231a03 --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/prerm @@ -0,0 +1,12 @@ +#! /bin/sh +echo "** prerm script for xterm: $*" + +set -e + +if [ "x$1" != "xupgrade" ]; then + update-alternatives --remove x-terminal-emulator /usr/bin/xterm-dev +fi + +#DEBHELPER# + +exit 0 diff --git a/ports/xterm/xterm-359/package/debian/rules b/ports/xterm/xterm-359/package/debian/rules new file mode 100755 index 0000000..a0de82c --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/rules @@ -0,0 +1,197 @@ +#!/usr/bin/make -f +# Made with the aid of dh_make, by Craig Small +# Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess. +# Some lines taken from debmake, by Cristoph Lameter. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + +DESKTOP_VENDOR = dickey + +PKG_SUFFIX = -dev +PKG_CLASS = XTermDev + +PACKAGE := $(shell dpkg-parsechangelog| \ + sed -n 's/^Source: \(.*\)$$/\1/p') + +PKG_APPDEFAULTS := /etc/X11/app-defaults +PKG_DESKTOP := /usr/share/applications + +DSTDIR := $(CURDIR)/debian/$(PACKAGE) +MY_DESKTOP := $(DSTDIR)/usr/share/applications + +CPPFLAGS := $(shell dpkg-buildflags --get CPPFLAGS) +CFLAGS := $(shell dpkg-buildflags --get CFLAGS) +LDFLAGS := $(shell dpkg-buildflags --get LDFLAGS) + +ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) +DEBOP=--enable-debug +else +DEBOP= +endif + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + +configure: configure-stamp +configure-stamp: + dh_testdir + + CPPFLAGS="$(CPPFLAGS)" \ + CFLAGS="$(CFLAGS)" \ + LDFLAGS="$(LDFLAGS)" \ + ./configure \ + --host=$(DEB_HOST_GNU_TYPE) \ + --build=$(DEB_BUILD_GNU_TYPE) \ + --program-suffix=$(PKG_SUFFIX) \ + --prefix=/usr \ + --libexecdir=\$${prefix}/lib \ + --mandir=\$${prefix}/share/man \ + --sysconfdir=/etc/$(PACKAGE) \ + --localstatedir=/var \ + --libdir=/etc/$(PACKAGE) \ + --with-app-class=$(PKG_CLASS) \ + --without-xterm-symlink \ + --disable-imake \ + --enable-dabbrev \ + --enable-dec-locator \ + --enable-double-buffer \ + --enable-exec-xterm \ + --enable-hp-fkeys \ + --enable-load-vt-fonts \ + --enable-logfile-exec \ + --enable-logging \ + --enable-mini-luit \ + --enable-regis-graphics \ + --enable-sco-fkeys \ + --enable-toolbar \ + --enable-xmc-glitch \ + --with-app-defaults=$(PKG_APPDEFAULTS) \ + --with-icondir=\$${prefix}/share/icons \ + --with-pixmapdir=\$${prefix}/share/pixmaps \ + --with-own-terminfo=\$${prefix}/share/terminfo \ + --with-icon-theme \ + --with-terminal-type=xterm-new \ + --with-utempter \ + --with-icon-name=mini.xterm \ + --with-xpm ${DEBOP} + + touch configure-stamp + +build: build-stamp +build-stamp: configure-stamp + dh_testdir + + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + + [ ! -f Makefile ] || $(MAKE) distclean + + dh_clean + +install: install-stamp +install-stamp: build-stamp + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + $(MAKE) install \ + DESTDIR=$(CURDIR)/debian/$(PACKAGE) + + touch install-stamp + +install: install-indep install-arch +install-indep: + +install-arch: + dh_testdir + dh_testroot + dh_prep -s + dh_installdirs -s + + $(MAKE) install-bin \ + DESTDIR=$(DSTDIR) + +# Build architecture-independent files here. +binary-indep: build install + dh_testdir + dh_testroot + + # This overwrites the Debian package's copy of app-defaults and icons. + # But the resources are not the same; they are patched. + sed -i -f package/debian/color.sed XTerm-col.ad + sed -i -f package/debian/xterm-xres.sed XTerm.ad + + $(MAKE) install-app \ + install-icon \ + install-man \ + DESTDIR=$(DSTDIR) + + # Follow-up with a check against the installed resource files. + ( cd $(DSTDIR)$(PKG_APPDEFAULTS) \ + && $(SHELL) -c 'for p in *; do \ + test -f $(PKG_APPDEFAULTS)/$$p && \ + diff -u $(PKG_APPDEFAULTS)/$$p $$p; \ + done' ; \ + exit 0 ) + + # The Debian package stopped installing xterm's desktop files; a + # subsequent revision added that back with limitations. xterm's + # configure script checks for categories which are used by other + # terminal emulators. The Debian package overrides that to a single + # category. + # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=486317 + $(MAKE) install-desktop \ + DESKTOP_FLAGS="--dir $(MY_DESKTOP)" + + ( cd $(DSTDIR)$(PKG_DESKTOP) \ + && $(SHELL) -c 'for p in *;do \ + test -f $(PKG_DESKTOP)/$$p && \ + diff -u $(PKG_DESKTOP)/$$p $$p; \ + test -n "$(PKG_SUFFIX)" && mv $$p `basename $$p .desktop`$(PKG_SUFFIX).desktop; \ + done' ; \ + exit 0 ) + + dh_icons + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installdebconf + dh_lintian + dh_installdocs + dh_installmenu + dh_installmime + dh_installexamples tektests vttests + dh_installchangelogs + dh_install + dh_link + dh_strip + dh_compress -Xexamples + dh_fixperms + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install install-stamp diff --git a/ports/xterm/xterm-359/package/debian/source/format b/ports/xterm/xterm-359/package/debian/source/format new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/ports/xterm/xterm-359/package/debian/watch b/ports/xterm/xterm-359/package/debian/watch new file mode 100644 index 0000000..44a0015 --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/watch @@ -0,0 +1,4 @@ +version=3 + +opts=passive ftp://ftp.invisible-island.net/xterm/current/xterm\.tar.gz \ + debian uupdate diff --git a/ports/xterm/xterm-359/package/debian/xterm-dev.docs b/ports/xterm/xterm-359/package/debian/xterm-dev.docs new file mode 100644 index 0000000..302ebb4 --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/xterm-dev.docs @@ -0,0 +1,7 @@ +README.i18n +THANKS +ctlseqs.ms +ctlseqs.txt +termcap +terminfo +xterm.log.html diff --git a/ports/xterm/xterm-359/package/debian/xterm-dev.lintian-overrides b/ports/xterm/xterm-359/package/debian/xterm-dev.lintian-overrides new file mode 100644 index 0000000..0712ca7 --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/xterm-dev.lintian-overrides @@ -0,0 +1,25 @@ +# Ignore this, but keep in mind: +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=741573 +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=707851 +xterm-dev: command-in-menu-file-and-desktop-file xterm-dev usr/share/menu/xterm-dev:7 +xterm-dev: command-in-menu-file-and-desktop-file uxterm-dev usr/share/menu/xterm-dev:14 + +# The lintian warning is incorrect: there is no portable path for Perl. +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=906901 +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=904409 +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/256colors.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/256colors2.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/88colors.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/88colors2.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/closest-rgb.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/dynamic.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/paste64.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/query-color.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/query-fonts.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/query-status.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/report-sgr.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/resize.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/sgrPushPop.pl (#!/usr/bin/env != /usr/bin/perl) +xterm-dev: wrong-path-for-interpreter usr/share/doc/xterm-dev/examples/vttests/tcapquery.pl (#!/usr/bin/env != /usr/bin/perl) + +# vile: confmode diff --git a/ports/xterm/xterm-359/package/debian/xterm-dev.menu b/ports/xterm/xterm-359/package/debian/xterm-dev.menu new file mode 100644 index 0000000..6e13c71 --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/xterm-dev.menu @@ -0,0 +1,14 @@ +?package(xterm-dev):\ + needs="x11"\ + section="Applications/Terminal Emulators"\ + longtitle="XTerm: terminal emulator for X (development)"\ + title="XTermDev"\ + icon="/usr/share/pixmaps/xterm-dev-color_32x32.xpm"\ + command="xterm-dev" +?package(xterm-dev):\ + needs="x11"\ + section="Applications/Terminal Emulators"\ + longtitle="XTerm: terminal emulator for X with Unicode support (development)"\ + title="XTermDev (Unicode)"\ + icon="/usr/share/pixmaps/xterm-dev-color_32x32.xpm"\ + command="uxterm-dev" diff --git a/ports/xterm/xterm-359/package/debian/xterm-xres.sed b/ports/xterm/xterm-359/package/debian/xterm-xres.sed new file mode 100644 index 0000000..68a651a --- /dev/null +++ b/ports/xterm/xterm-359/package/debian/xterm-xres.sed @@ -0,0 +1,7 @@ +/\*tek4014\*fontSmall:[ ]*6x10/a\ +\ +! Debian package customizations follow.\ +*backarrowKeyIsErase: true\ +*ptyInitialErase: true +/!*allowWindowOps: false/a\ +*allowWindowOps: true diff --git a/ports/xterm/xterm-359/package/freebsd/Makefile b/ports/xterm/xterm-359/package/freebsd/Makefile new file mode 100644 index 0000000..8aceaf4 --- /dev/null +++ b/ports/xterm/xterm-359/package/freebsd/Makefile @@ -0,0 +1,109 @@ +# $XTermId: Makefile,v 1.80 2020/07/25 17:48:12 tom Exp $ +# $FreeBSD: head/x11/xterm/Makefile 492827 2019-02-13 06:43:36Z ehaupt $ + +# This is adapted from the FreeBSD port, installing as "xterm-dev" with +# separate resource- and manpage files. +# copy "xterm-${PORTVERSION}.tgz to the port's distfiles directory +# and "make makesum". + +PORTNAME= xterm +PORTVERSION= 359 +CATEGORIES= x11 +MASTER_SITES= ftp://ftp.invisible-island.net/xterm/:src1 \ + https://invisible-mirror.net/archives/xterm/:src1 +PKGNAMESUFFIX= -dev +DISTFILES= ${DISTNAME}${EXTRACT_SUFX}:src1 + +MAINTAINER= ehaupt@FreeBSD.org +COMMENT= Terminal emulator for the X Window System + +LICENSE= MIT +LICENSE_FILE= ${WRKSRC}/COPYING + +USES= cpe ncurses tar:tgz +USE_XORG= xft xmu xt x11 xpm ice + +GNU_CONFIGURE= yes + +CPE_VENDOR= invisible-island + +CONFIGURE_ARGS+= --with-utempter --enable-narrowproto + +CONFLICTS= x11iraf-[0-9]* + +CPPFLAGS+= -I${LOCALBASE}/include +LIBS+= -L${LOCALBASE}/lib + +ICONVERSION= 1 + +OPTIONS_DEFINE= WCHAR LUIT DECTERM PCRE DABBREV 256COLOR SIXEL GNOME LOGGING \ + SCRNDUMP REGIS TOOLBAR XINERAMA +OPTIONS_RADIO= 3D +OPTIONS_RADIO_3D= XAW3D XAW3DXFT NEXTAW + +DABBREV_DESC= Enable support for dabbrev-expand +DECTERM_DESC= Enable DECterm Locator support +LUIT_DESC= Use LUIT for locale conversion from/to UTF-8 +SIXEL_DESC= Enable Sixel graphics support +REGIS_DESC= Enable ReGIS graphics support +WCHAR_DESC= Enable wide-character support +256COLOR_DESC= Enable 256-color support +LOGGING_DESC= Enable logging terminal I/O to a file +XAW3D_DESC= Link with Xaw 3d library +XAW3DXFT_DESC= Link with Xaw 3d xft (extended fonts) library +NEXTAW_DESC= Link with neXT Athena library +SCRNDUMP_DESC= Enable XHTML and SVG screen dumps +TOOLBAR_DESC= Enable pulldown menus with a toolbar + +OPTIONS_DEFAULT=WCHAR LUIT 256COLOR + +256COLOR_CONFIGURE_ENABLE= 256-color +LUIT_BUILD_DEPENDS= luit:x11/luit +LUIT_CONFIGURE_ENABLE= luit +LUIT_IMPLIES= WCHAR +WCHAR_CONFIGURE_ENABLE= wide-chars +WCHAR_VARS= PKGMESSAGE="${PKGDIR}/pkg-message.wchar" +DECTERM_CONFIGURE_ENABLE= dec-locator +PCRE_CONFIGURE_WITH= pcre +PCRE_LIB_DEPENDS= libpcre.so:devel/pcre +DABBREV_CONFIGURE_ENABLE= dabbrev +SIXEL_CONFIGURE_ENABLE= sixel-graphics +REGIS_CONFIGURE_ENABLE= regis-graphics +GNOME_USES= desktop-file-utils +LOGGING_CONFIGURE_ENABLE= logging +SCRNDUMP_CONFIGURE_ENABLE= screen-dumps +XAW3D_CONFIGURE_WITH= Xaw3d +XAW3D_LIB_DEPENDS= libXaw3d.so:x11-toolkits/Xaw3d +XAW3DXFT_CONFIGURE_WITH= Xaw3dxft +XAW3DXFT_LIB_DEPENDS= libXaw3dxft.so:x11-toolkits/libxaw3dxft +NEXTAW_CONFIGURE_WITH= neXtaw +NEXTAW_LIB_DEPENDS= libneXtaw.so:x11-toolkits/neXtaw +TOOLBAR_CONFIGURE_ENABLE= toolbar +WCHAR_LIB_DEPENDS= libfreetype.so:print/freetype2 +XINERAMA_USE= XORG=xinerama,xorgproto +XINERAMA_CONFIGURE_OFF= --without-xinerama + +PKG_CLASS= XTermDev +LIB_DEPENDS+= libfontconfig.so:x11-fonts/fontconfig + +.include + +CONFIGURE_ARGS+= --program-suffix=${PKGNAMESUFFIX} --with-app-class=${PKG_CLASS} --without-xterm-symlink + +.if ! ${PORT_OPTIONS:MXAW3D} && ! ${PORT_OPTIONS:MXAW3DXFT} && ! ${PORT_OPTIONS:MNEXTAW} +USE_XORG+= xaw +.endif + +#post-extract: +# @${CP} ${WRKDIR}/bsd-xterm-icons-1/*.png \ +# ${WRKDIR}/bsd-xterm-icons-1/*.xpm \ +# ${WRKSRC}/icons/ + +post-install: +.for f in koi8rxterm${PKGNAMESUFFIX} resize${PKGNAMESUFFIX} uxterm${PKGNAMESUFFIX} xterm${PKGNAMESUFFIX} + @${CHMOD} ${BINMODE} ${STAGEDIR}${PREFIX}/bin/${f} +.endfor + ${INSTALL_DATA} ${WRKSRC}/xterm.desktop \ + ${STAGEDIR}${PREFIX}/share/applications/xterm${PKGNAMESUFFIX}.desktop + +.include diff --git a/ports/xterm/xterm-359/package/freebsd/distinfo b/ports/xterm/xterm-359/package/freebsd/distinfo new file mode 100644 index 0000000..704ae9b --- /dev/null +++ b/ports/xterm/xterm-359/package/freebsd/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1593990998 +SHA256 (xterm-357.tgz) = a2fbe692f7d9324f6db8820ace7ec4696e838d3053edb45d13801fd684dabdc3 +SIZE (xterm-357.tgz) = 1422256 diff --git a/ports/xterm/xterm-359/package/freebsd/pkg-descr b/ports/xterm/xterm-359/package/freebsd/pkg-descr new file mode 100644 index 0000000..706c9ff --- /dev/null +++ b/ports/xterm/xterm-359/package/freebsd/pkg-descr @@ -0,0 +1,10 @@ +The xterm program is the standard terminal emulator for the X +Window System. It provides DEC VT102/VT220 and Tektronix 4014 +compatible terminals for programs that can't use the window +system directly. If the underlying operating system supports +terminal resizing capabilities (for example, the SIGWINCH +signal in systems derived from 4.3bsd), xterm will use the +facilities to notify programs running in the window whenever it +is resized. + +WWW: https://invisible-island.net/xterm/ diff --git a/ports/xterm/xterm-359/package/freebsd/pkg-message b/ports/xterm/xterm-359/package/freebsd/pkg-message new file mode 100644 index 0000000..1de1a06 --- /dev/null +++ b/ports/xterm/xterm-359/package/freebsd/pkg-message @@ -0,0 +1,10 @@ +================================================================================ +You installed xterm with wide chars support. This introduces some limitations +comparing to the plain single chars version: this version of xterm will use +UTF-8 charset for selection buffers, breaking 8-bit copy/paste support unless +you are using UTF-8 or ISO8859-1 locale. If you want 8-bit charset selections to +work as before, use "eightBitSelectTypes" XTerm resource setting. + +For further information refer to the SELECT/PASTE section of xterm(1) manual +page. +================================================================================ diff --git a/ports/xterm/xterm-359/package/freebsd/pkg-message.wchar b/ports/xterm/xterm-359/package/freebsd/pkg-message.wchar new file mode 100644 index 0000000..1de1a06 --- /dev/null +++ b/ports/xterm/xterm-359/package/freebsd/pkg-message.wchar @@ -0,0 +1,10 @@ +================================================================================ +You installed xterm with wide chars support. This introduces some limitations +comparing to the plain single chars version: this version of xterm will use +UTF-8 charset for selection buffers, breaking 8-bit copy/paste support unless +you are using UTF-8 or ISO8859-1 locale. If you want 8-bit charset selections to +work as before, use "eightBitSelectTypes" XTerm resource setting. + +For further information refer to the SELECT/PASTE section of xterm(1) manual +page. +================================================================================ diff --git a/ports/xterm/xterm-359/package/freebsd/pkg-plist b/ports/xterm/xterm-359/package/freebsd/pkg-plist new file mode 100644 index 0000000..26278dd --- /dev/null +++ b/ports/xterm/xterm-359/package/freebsd/pkg-plist @@ -0,0 +1,23 @@ +bin/koi8rxterm-dev +bin/resize-dev +bin/uxterm-dev +bin/xterm-dev +lib/X11/app-defaults/KOI8RXTermDev +lib/X11/app-defaults/KOI8RXTermDev-color +lib/X11/app-defaults/UXTermDev +lib/X11/app-defaults/UXTermDev-color +lib/X11/app-defaults/XTermDev +lib/X11/app-defaults/XTermDev-color +man/man1/resize-dev.1.gz +man/man1/koi8rxterm-dev.1.gz +man/man1/uxterm-dev.1.gz +man/man1/xterm-dev.1.gz +share/applications/xterm-dev.desktop +share/pixmaps/filled-xterm-dev_32x32.xpm +share/pixmaps/filled-xterm-dev_48x48.xpm +share/pixmaps/mini.xterm-dev_32x32.xpm +share/pixmaps/mini.xterm-dev_48x48.xpm +share/pixmaps/xterm-dev-color_32x32.xpm +share/pixmaps/xterm-dev-color_48x48.xpm +share/pixmaps/xterm-dev_32x32.xpm +share/pixmaps/xterm-dev_48x48.xpm diff --git a/ports/xterm/xterm-359/package/pkgsrc/DESCR b/ports/xterm/xterm-359/package/pkgsrc/DESCR new file mode 100644 index 0000000..70b8dbb --- /dev/null +++ b/ports/xterm/xterm-359/package/pkgsrc/DESCR @@ -0,0 +1,7 @@ +The xterm program is a terminal emulator for the X Window System. It provides +DEC VT102 and Tektronix 4014 compatible terminals for programs that can't use +the window system directly. + +This version implements ISO/ANSI colors using the "new" color model +(i.e., background color erase). It also implements most of the control +sequences for VT220. diff --git a/ports/xterm/xterm-359/package/pkgsrc/Makefile b/ports/xterm/xterm-359/package/pkgsrc/Makefile new file mode 100644 index 0000000..68ebe78 --- /dev/null +++ b/ports/xterm/xterm-359/package/pkgsrc/Makefile @@ -0,0 +1,65 @@ +# $NetBSD: Makefile,v 1.117 2018/03/12 11:18:00 wiz Exp $ + +DISTNAME= xterm-359 +PKGREVISION= 1 +CATEGORIES= x11 +MASTER_SITES= ftp://ftp.invisible-island.net/xterm/ +EXTRACT_SUFX= .tgz + +MAINTAINER= pkgsrc-users@NetBSD.org +HOMEPAGE= https://invisible-island.net/xterm/xterm.html +COMMENT= Latest terminal emulator for the X Window System +LICENSE= x11 + +GNU_CONFIGURE= yes +USE_TOOLS+= tbl pkg-config + +WRKSRC= ${WRKDIR}/${PKGNAME_NOREV} + +CONFIGURE_ARGS+= --enable-88-color +CONFIGURE_ARGS+= --enable-256-color +CONFIGURE_ARGS+= --enable-paste64 +CONFIGURE_ARGS+= --enable-readline-mouse + +CONFIGURE_ARGS.standard=# empty +CONFIGURE_ARGS.3d= --with-Xaw3d +CONFIGURE_ARGS.xpm= --with-Xaw3d +CONFIGURE_ARGS.neXtaw= --with-neXtaw +CONFIGURE_ARGS+= ${${CONFIGURE_ARGS.${XAW_TYPE}}:L} + +INSTALLATION_DIRS= share/applications + +.include "../../mk/bsd.prefs.mk" + +.if ${X11_TYPE} == "modular" +CONFIGURE_ARGS+= --disable-imake +CONFIGURE_ARGS+= --enable-narrowproto +.endif + +.if exists(/usr/include/wchar.h) +CONFIGURE_ARGS+= --enable-wide-chars +.endif + +.include "../../x11/libX11/buildlink3.mk" +.include "../../x11/libXt/buildlink3.mk" +### +### For detection of XKB bell extension. +### +BUILDLINK_DEPMETHOD.libxkbfile?= build +.include "../../x11/libxkbfile/buildlink3.mk" + +post-install: + ${INSTALL_DATA} ${WRKSRC}/xterm.desktop \ + ${DESTDIR}${PREFIX}/share/applications && \ + ${INSTALL_DATA} ${WRKSRC}/uxterm.desktop \ + ${DESTDIR}${PREFIX}/share/applications + cd ${DESTDIR}${PREFIX}/${PKGMANDIR}/man1 && tbl xterm.1 \ + > xterm.1.tbl && mv xterm.1.tbl xterm.1 + +.include "options.mk" + +.include "../../mk/curses.buildlink3.mk" +.include "../../mk/termcap.buildlink3.mk" +.include "../../sysutils/desktop-file-utils/desktopdb.mk" +.include "../../mk/xaw.buildlink3.mk" +.include "../../mk/bsd.pkg.mk" diff --git a/ports/xterm/xterm-359/package/pkgsrc/PLIST b/ports/xterm/xterm-359/package/pkgsrc/PLIST new file mode 100644 index 0000000..9085ac0 --- /dev/null +++ b/ports/xterm/xterm-359/package/pkgsrc/PLIST @@ -0,0 +1,25 @@ +@comment $NetBSD: PLIST,v 1.9 2012/10/10 13:50:56 wiz Exp $ +bin/koi8rxterm +bin/resize +bin/uxterm +bin/xterm +lib/X11/app-defaults/KOI8RXTerm +lib/X11/app-defaults/KOI8RXTerm-color +lib/X11/app-defaults/UXTerm +lib/X11/app-defaults/UXTerm-color +lib/X11/app-defaults/XTerm +lib/X11/app-defaults/XTerm-color +man/man1/koi8rxterm.1 +man/man1/resize.1 +man/man1/uxterm.1 +man/man1/xterm.1 +share/applications/uxterm.desktop +share/applications/xterm.desktop +share/pixmaps/filled-xterm_32x32.xpm +share/pixmaps/filled-xterm_48x48.xpm +share/pixmaps/mini.xterm_32x32.xpm +share/pixmaps/mini.xterm_48x48.xpm +share/pixmaps/xterm-color_32x32.xpm +share/pixmaps/xterm-color_48x48.xpm +share/pixmaps/xterm_32x32.xpm +share/pixmaps/xterm_48x48.xpm diff --git a/ports/xterm/xterm-359/package/pkgsrc/distinfo b/ports/xterm/xterm-359/package/pkgsrc/distinfo new file mode 100644 index 0000000..59f4267 --- /dev/null +++ b/ports/xterm/xterm-359/package/pkgsrc/distinfo @@ -0,0 +1,6 @@ +$NetBSD: distinfo,v 1.82 2017/07/04 08:52:38 wiz Exp $ + +SHA1 (xterm-349.tgz) = fd4f1029148dac5a2b23de87330ba6599cf6b21e +RMD160 (xterm-349.tgz) = b419e56c1391fa2d582a0c9f5c1dae9965f90ba7 +SHA512 (xterm-349.tgz) = a93b35a9086bd33685ac6b8a030b43287978e769c6d446faeedeeaec8789c5fb173deab10e85ee8b800c22026bfdf8f5143afad309c327710c25832e02404715 +Size (xterm-349.tgz) = 1381954 bytes diff --git a/ports/xterm/xterm-359/package/pkgsrc/options.mk b/ports/xterm/xterm-359/package/pkgsrc/options.mk new file mode 100644 index 0000000..f008b70 --- /dev/null +++ b/ports/xterm/xterm-359/package/pkgsrc/options.mk @@ -0,0 +1,51 @@ +# $NetBSD: options.mk,v 1.14 2013/07/11 11:44:07 wiz Exp $ + +PKG_OPTIONS_VAR= PKG_OPTIONS.xterm +PKG_SUPPORTED_OPTIONS= debug pcre freetype luit xpm xterm-toolbar +PKG_SUGGESTED_OPTIONS= freetype luit xpm + +.include "../../mk/bsd.options.mk" + +.if !empty(PKG_OPTIONS:Mdebug) +CONFIGURE_ARGS+= --enable-trace +CONFIGURE_ARGS+= --enable-warnings +.elif defined(PKG_DEVELOPER) && !empty(PKG_DEVELOPER:M[Yy][Ee][Ss]) +CONFIGURE_ARGS+= --enable-warnings +.endif + +.if !empty(PKG_OPTIONS:Mfreetype) +CONFIGURE_ARGS+= --enable-freetype +. include "../../x11/libXft/buildlink3.mk" +.else +CONFIGURE_ARGS+= --disable-freetype +.endif +### +### XXX The configure test checks for pcreposix_regcomp in libpcreposix. +### However, there is no such function [insofar as I can tell]. +### Moreover, libc's regex(3) functions are weak-aliased to those +### within libc's namespace, so we should have no problems. +### +.if !empty(PKG_OPTIONS:Mpcre) +CONFIGURE_ARGS+= --with-pcre +CONFIGURE_ENV+= ac_cv_lib_pcreposix_pcreposix_regcomp=yes +. include "../../devel/pcre/buildlink3.mk" +.endif + +.if !empty(PKG_OPTIONS:Mluit) +DEPENDS+= luit-[0-9]*:../../x11/luit +CONFIGURE_ARGS+= --enable-luit --enable-mini-luit +.else +CONFIGURE_ARGS+= --disable-luit --disable-mini-luit +.endif + +.if !empty(PKG_OPTIONS:Mxpm) +### nothing +.else +CONFIGURE_ARGS+= --without-xpm +.endif + +.if !empty(PKG_OPTIONS:Mxterm-toolbar) +CONFIGURE_ARGS+= --enable-toolbar +.else +CONFIGURE_ARGS+= --disable-toolbar +.endif diff --git a/ports/xterm/xterm-359/package/xterm.spec b/ports/xterm/xterm-359/package/xterm.spec new file mode 100644 index 0000000..ad8a22a --- /dev/null +++ b/ports/xterm/xterm-359/package/xterm.spec @@ -0,0 +1,274 @@ +# $XTermId: xterm.spec,v 1.134 2020/07/25 18:19:28 tom Exp $ +Summary: X terminal emulator (development version) +%global my_middle xterm +%global my_suffix -dev +%global fullname %{my_middle}%{my_suffix} +%global my_class XTermDev +Name: %{fullname} +Version: 359 +Release: 1 +License: X11 +Group: User Interface/X +Source: xterm-%{version}.tgz +URL: ftp://ftp.invisible-island.net/xterm/ +Provides: x-terminal-emulator >= %{version} + +# This part (the build-requires) would be useful if the various distributions +# had provided stable package-naming, or virtual packages to cover transitions. +# However, they have not done this in the past. +%define use_x_manpage %(test "x$_use_x_manpage" = xyes && echo 1 || echo 0) +%if "%{use_x_manpage}" + +%global is_mandriva %(test -f /etc/mandriva-release && echo %{use_x_manpage} || echo 0) +%global is_redhat %(test -f /etc/redhat-release && echo %{use_x_manpage} || echo 0) +%global is_suse %(test -f /etc/SuSE-release && echo %{use_x_manpage} || echo 0) + +%if %{is_mandriva} +BuildRequires: x11-docs +%else +%if %{is_redhat} +BuildRequires: xorg-x11-docs +%else +%if %{is_suse} +BuildRequires: xorg-docs +%endif +%endif +%endif + +%endif + +%description +xterm is the standard terminal emulator for the X Window System. +It provides DEC VT102 and Tektronix 4014 compatible terminals for +programs that cannot use the window system directly. This version +implements ISO/ANSI colors, Unicode, and most of the control sequences +used by DEC VT220 terminals. + +This package provides four commands: + a) %{fullname}, which is the actual terminal emulator + b) u%{fullname}, which is a wrapper around %{fullname} + which sets %{fullname} to use UTF-8 encoding when + the user's locale supports this, + c) koi8r%{fullname}, a wrapper similar to u%{fullname} + for locales that use the KOI8-R character set, and + d) resize%{my_suffix}. + +A complete list of control sequences supported by the X terminal emulator +is provided in /usr/share/doc/%{fullname}. + +The %{fullname} program uses bitmap images provided by the xbitmaps package. + +Those interested in using koi8r%{fullname} will likely want to install the +xfonts-cyrillic package as well. + +This package is configured to use "%{fullname}" and "%{my_class}" +for the program and its resource class, to avoid conflict with other packages. + +%prep + +%global target_appdata %{fullname}.appdata.xml + +%define desktop_utils %(if which desktop-file-install 2>&1 >/dev/null ; then echo 1 || echo 0 ; fi) +%define icon_theme %(test -d /usr/share/icons/hicolor && echo 1 || echo 0) +%define apps_x11r6 %(test -d /usr/X11R6/lib/X11/app-defaults && echo 1 || echo 0) +%define apps_shared %(test -d /usr/share/X11/app-defaults && echo 1 || echo 0) +%define apps_syscnf %(test -d /etc/X11/app-defaults && echo 1 || echo 0) + +%if %{apps_x11r6} +%define _xresdir %{_prefix}/X11R6/lib/X11/app-defaults +%else +%if %{apps_shared} +%define _xresdir %{_datadir}/X11/app-defaults +%else +%define _xresdir %{_sysconfdir}/X11/app-defaults +%endif +%endif + +%define _iconsdir %{_datadir}/icons +%define _pixmapsdir %{_datadir}/pixmaps +%define my_docdir %{_datadir}/doc/%{fullname} + +# no need for debugging symbols... +%define debug_package %{nil} + +%setup -q -n xterm-%{version} + +%build +CPPFLAGS="-DMISC_EXP -DEXP_HTTP_HEADERS" \ +%configure \ + --target %{_target_platform} \ + --prefix=%{_prefix} \ + --bindir=%{_bindir} \ + --datadir=%{_datadir} \ + --mandir=%{_mandir} \ +%if "%{my_suffix}" != "" + --program-suffix=%{my_suffix} \ + --without-xterm-symlink \ +%endif +%if "%{icon_theme}" + --with-icon-symlink=%{fullname} \ + --with-icon-theme \ + --with-icondir=%{_iconsdir} \ +%endif + --with-app-class=%{my_class} \ + --disable-imake \ + --enable-dabbrev \ + --enable-dec-locator \ + --enable-double-buffer \ + --enable-exec-xterm \ + --enable-hp-fkeys \ + --enable-load-vt-fonts \ + --enable-logfile-exec \ + --enable-logging \ + --enable-mini-luit \ + --enable-regis-graphics \ + --enable-sco-fkeys \ + --enable-toolbar \ + --enable-xmc-glitch \ + --with-app-defaults=%{_xresdir} \ + --with-pixmapdir=%{_pixmapsdir} \ + --with-own-terminfo=%{_datadir}/terminfo \ + --with-terminal-type=xterm-new \ + --with-utempter \ + --with-icon-name=mini.xterm \ + --with-xpm +make + +chmod u+w XTerm.ad +cat >>XTerm.ad <xterm\.desktop%{fullname}.desktopXTerm%{my_class}/dev/null 2>/dev/null ) + then + WARNED=`eval $LINKIT $OPT $* 2>&1` + case ".$WARNED" in + *Warning*|*nsupported*|*nrecognized*|*nknown*) + ;; + *) + LINKIT="$LINKIT $OPT $*" + break + ;; + esac + fi + fi + + OPT="$1" + shift + case $OPT in + -k*) + OPT=`echo "$OPT" | sed -e 's/^-k/-l/'` + LINKIT="$LINKIT $OPT" + ;; + -l*) + echo "testing if $OPT is needed" + if ( eval $LINKIT $* >/dev/null 2>/dev/null ) + then + : echo ...no + else + echo ...yes + LINKIT="$LINKIT $OPT" + fi + ;; + *) + LINKIT="$LINKIT $OPT" + ;; + esac +done +eval $LINKIT diff --git a/ports/xterm/xterm-359/precompose.c b/ports/xterm/xterm-359/precompose.c new file mode 100644 index 0000000..f6f746d --- /dev/null +++ b/ports/xterm/xterm-359/precompose.c @@ -0,0 +1,1064 @@ +/* + * Canonical Compositions + * + * DO NOT EDIT BY HAND! This is generated by the script + * unicode/make-precompose.sh + */ +/* $XTermId: precompose.c,v 1.11 2016/05/22 13:26:20 tom Exp $ */ + +#include + +static struct { + int replacement; + int base; + int comb; +} precompositions[] = { +{ 0x226E, 0x003C, 0x0338}, +{ 0x2260, 0x003D, 0x0338}, +{ 0x226F, 0x003E, 0x0338}, +{ 0x00C0, 0x0041, 0x0300}, +{ 0x00C1, 0x0041, 0x0301}, +{ 0x00C2, 0x0041, 0x0302}, +{ 0x00C3, 0x0041, 0x0303}, +{ 0x0100, 0x0041, 0x0304}, +{ 0x0102, 0x0041, 0x0306}, +{ 0x0226, 0x0041, 0x0307}, +{ 0x00C4, 0x0041, 0x0308}, +{ 0x1EA2, 0x0041, 0x0309}, +{ 0x00C5, 0x0041, 0x030A}, +{ 0x01CD, 0x0041, 0x030C}, +{ 0x0200, 0x0041, 0x030F}, +{ 0x0202, 0x0041, 0x0311}, +{ 0x1EA0, 0x0041, 0x0323}, +{ 0x1E00, 0x0041, 0x0325}, +{ 0x0104, 0x0041, 0x0328}, +{ 0x1E02, 0x0042, 0x0307}, +{ 0x1E04, 0x0042, 0x0323}, +{ 0x1E06, 0x0042, 0x0331}, +{ 0x0106, 0x0043, 0x0301}, +{ 0x0108, 0x0043, 0x0302}, +{ 0x010A, 0x0043, 0x0307}, +{ 0x010C, 0x0043, 0x030C}, +{ 0x00C7, 0x0043, 0x0327}, +{ 0x1E0A, 0x0044, 0x0307}, +{ 0x010E, 0x0044, 0x030C}, +{ 0x1E0C, 0x0044, 0x0323}, +{ 0x1E10, 0x0044, 0x0327}, +{ 0x1E12, 0x0044, 0x032D}, +{ 0x1E0E, 0x0044, 0x0331}, +{ 0x00C8, 0x0045, 0x0300}, +{ 0x00C9, 0x0045, 0x0301}, +{ 0x00CA, 0x0045, 0x0302}, +{ 0x1EBC, 0x0045, 0x0303}, +{ 0x0112, 0x0045, 0x0304}, +{ 0x0114, 0x0045, 0x0306}, +{ 0x0116, 0x0045, 0x0307}, +{ 0x00CB, 0x0045, 0x0308}, +{ 0x1EBA, 0x0045, 0x0309}, +{ 0x011A, 0x0045, 0x030C}, +{ 0x0204, 0x0045, 0x030F}, +{ 0x0206, 0x0045, 0x0311}, +{ 0x1EB8, 0x0045, 0x0323}, +{ 0x0228, 0x0045, 0x0327}, +{ 0x0118, 0x0045, 0x0328}, +{ 0x1E18, 0x0045, 0x032D}, +{ 0x1E1A, 0x0045, 0x0330}, +{ 0x1E1E, 0x0046, 0x0307}, +{ 0x01F4, 0x0047, 0x0301}, +{ 0x011C, 0x0047, 0x0302}, +{ 0x1E20, 0x0047, 0x0304}, +{ 0x011E, 0x0047, 0x0306}, +{ 0x0120, 0x0047, 0x0307}, +{ 0x01E6, 0x0047, 0x030C}, +{ 0x0122, 0x0047, 0x0327}, +{ 0x0124, 0x0048, 0x0302}, +{ 0x1E22, 0x0048, 0x0307}, +{ 0x1E26, 0x0048, 0x0308}, +{ 0x021E, 0x0048, 0x030C}, +{ 0x1E24, 0x0048, 0x0323}, +{ 0x1E28, 0x0048, 0x0327}, +{ 0x1E2A, 0x0048, 0x032E}, +{ 0x00CC, 0x0049, 0x0300}, +{ 0x00CD, 0x0049, 0x0301}, +{ 0x00CE, 0x0049, 0x0302}, +{ 0x0128, 0x0049, 0x0303}, +{ 0x012A, 0x0049, 0x0304}, +{ 0x012C, 0x0049, 0x0306}, +{ 0x0130, 0x0049, 0x0307}, +{ 0x00CF, 0x0049, 0x0308}, +{ 0x1EC8, 0x0049, 0x0309}, +{ 0x01CF, 0x0049, 0x030C}, +{ 0x0208, 0x0049, 0x030F}, +{ 0x020A, 0x0049, 0x0311}, +{ 0x1ECA, 0x0049, 0x0323}, +{ 0x012E, 0x0049, 0x0328}, +{ 0x1E2C, 0x0049, 0x0330}, +{ 0x0134, 0x004A, 0x0302}, +{ 0x1E30, 0x004B, 0x0301}, +{ 0x01E8, 0x004B, 0x030C}, +{ 0x1E32, 0x004B, 0x0323}, +{ 0x0136, 0x004B, 0x0327}, +{ 0x1E34, 0x004B, 0x0331}, +{ 0x0139, 0x004C, 0x0301}, +{ 0x013D, 0x004C, 0x030C}, +{ 0x1E36, 0x004C, 0x0323}, +{ 0x013B, 0x004C, 0x0327}, +{ 0x1E3C, 0x004C, 0x032D}, +{ 0x1E3A, 0x004C, 0x0331}, +{ 0x1E3E, 0x004D, 0x0301}, +{ 0x1E40, 0x004D, 0x0307}, +{ 0x1E42, 0x004D, 0x0323}, +{ 0x01F8, 0x004E, 0x0300}, +{ 0x0143, 0x004E, 0x0301}, +{ 0x00D1, 0x004E, 0x0303}, +{ 0x1E44, 0x004E, 0x0307}, +{ 0x0147, 0x004E, 0x030C}, +{ 0x1E46, 0x004E, 0x0323}, +{ 0x0145, 0x004E, 0x0327}, +{ 0x1E4A, 0x004E, 0x032D}, +{ 0x1E48, 0x004E, 0x0331}, +{ 0x00D2, 0x004F, 0x0300}, +{ 0x00D3, 0x004F, 0x0301}, +{ 0x00D4, 0x004F, 0x0302}, +{ 0x00D5, 0x004F, 0x0303}, +{ 0x014C, 0x004F, 0x0304}, +{ 0x014E, 0x004F, 0x0306}, +{ 0x022E, 0x004F, 0x0307}, +{ 0x00D6, 0x004F, 0x0308}, +{ 0x1ECE, 0x004F, 0x0309}, +{ 0x0150, 0x004F, 0x030B}, +{ 0x01D1, 0x004F, 0x030C}, +{ 0x020C, 0x004F, 0x030F}, +{ 0x020E, 0x004F, 0x0311}, +{ 0x01A0, 0x004F, 0x031B}, +{ 0x1ECC, 0x004F, 0x0323}, +{ 0x01EA, 0x004F, 0x0328}, +{ 0x1E54, 0x0050, 0x0301}, +{ 0x1E56, 0x0050, 0x0307}, +{ 0x0154, 0x0052, 0x0301}, +{ 0x1E58, 0x0052, 0x0307}, +{ 0x0158, 0x0052, 0x030C}, +{ 0x0210, 0x0052, 0x030F}, +{ 0x0212, 0x0052, 0x0311}, +{ 0x1E5A, 0x0052, 0x0323}, +{ 0x0156, 0x0052, 0x0327}, +{ 0x1E5E, 0x0052, 0x0331}, +{ 0x015A, 0x0053, 0x0301}, +{ 0x015C, 0x0053, 0x0302}, +{ 0x1E60, 0x0053, 0x0307}, +{ 0x0160, 0x0053, 0x030C}, +{ 0x1E62, 0x0053, 0x0323}, +{ 0x0218, 0x0053, 0x0326}, +{ 0x015E, 0x0053, 0x0327}, +{ 0x1E6A, 0x0054, 0x0307}, +{ 0x0164, 0x0054, 0x030C}, +{ 0x1E6C, 0x0054, 0x0323}, +{ 0x021A, 0x0054, 0x0326}, +{ 0x0162, 0x0054, 0x0327}, +{ 0x1E70, 0x0054, 0x032D}, +{ 0x1E6E, 0x0054, 0x0331}, +{ 0x00D9, 0x0055, 0x0300}, +{ 0x00DA, 0x0055, 0x0301}, +{ 0x00DB, 0x0055, 0x0302}, +{ 0x0168, 0x0055, 0x0303}, +{ 0x016A, 0x0055, 0x0304}, +{ 0x016C, 0x0055, 0x0306}, +{ 0x00DC, 0x0055, 0x0308}, +{ 0x1EE6, 0x0055, 0x0309}, +{ 0x016E, 0x0055, 0x030A}, +{ 0x0170, 0x0055, 0x030B}, +{ 0x01D3, 0x0055, 0x030C}, +{ 0x0214, 0x0055, 0x030F}, +{ 0x0216, 0x0055, 0x0311}, +{ 0x01AF, 0x0055, 0x031B}, +{ 0x1EE4, 0x0055, 0x0323}, +{ 0x1E72, 0x0055, 0x0324}, +{ 0x0172, 0x0055, 0x0328}, +{ 0x1E76, 0x0055, 0x032D}, +{ 0x1E74, 0x0055, 0x0330}, +{ 0x1E7C, 0x0056, 0x0303}, +{ 0x1E7E, 0x0056, 0x0323}, +{ 0x1E80, 0x0057, 0x0300}, +{ 0x1E82, 0x0057, 0x0301}, +{ 0x0174, 0x0057, 0x0302}, +{ 0x1E86, 0x0057, 0x0307}, +{ 0x1E84, 0x0057, 0x0308}, +{ 0x1E88, 0x0057, 0x0323}, +{ 0x1E8A, 0x0058, 0x0307}, +{ 0x1E8C, 0x0058, 0x0308}, +{ 0x1EF2, 0x0059, 0x0300}, +{ 0x00DD, 0x0059, 0x0301}, +{ 0x0176, 0x0059, 0x0302}, +{ 0x1EF8, 0x0059, 0x0303}, +{ 0x0232, 0x0059, 0x0304}, +{ 0x1E8E, 0x0059, 0x0307}, +{ 0x0178, 0x0059, 0x0308}, +{ 0x1EF6, 0x0059, 0x0309}, +{ 0x1EF4, 0x0059, 0x0323}, +{ 0x0179, 0x005A, 0x0301}, +{ 0x1E90, 0x005A, 0x0302}, +{ 0x017B, 0x005A, 0x0307}, +{ 0x017D, 0x005A, 0x030C}, +{ 0x1E92, 0x005A, 0x0323}, +{ 0x1E94, 0x005A, 0x0331}, +{ 0x00E0, 0x0061, 0x0300}, +{ 0x00E1, 0x0061, 0x0301}, +{ 0x00E2, 0x0061, 0x0302}, +{ 0x00E3, 0x0061, 0x0303}, +{ 0x0101, 0x0061, 0x0304}, +{ 0x0103, 0x0061, 0x0306}, +{ 0x0227, 0x0061, 0x0307}, +{ 0x00E4, 0x0061, 0x0308}, +{ 0x1EA3, 0x0061, 0x0309}, +{ 0x00E5, 0x0061, 0x030A}, +{ 0x01CE, 0x0061, 0x030C}, +{ 0x0201, 0x0061, 0x030F}, +{ 0x0203, 0x0061, 0x0311}, +{ 0x1EA1, 0x0061, 0x0323}, +{ 0x1E01, 0x0061, 0x0325}, +{ 0x0105, 0x0061, 0x0328}, +{ 0x1E03, 0x0062, 0x0307}, +{ 0x1E05, 0x0062, 0x0323}, +{ 0x1E07, 0x0062, 0x0331}, +{ 0x0107, 0x0063, 0x0301}, +{ 0x0109, 0x0063, 0x0302}, +{ 0x010B, 0x0063, 0x0307}, +{ 0x010D, 0x0063, 0x030C}, +{ 0x00E7, 0x0063, 0x0327}, +{ 0x1E0B, 0x0064, 0x0307}, +{ 0x010F, 0x0064, 0x030C}, +{ 0x1E0D, 0x0064, 0x0323}, +{ 0x1E11, 0x0064, 0x0327}, +{ 0x1E13, 0x0064, 0x032D}, +{ 0x1E0F, 0x0064, 0x0331}, +{ 0x00E8, 0x0065, 0x0300}, +{ 0x00E9, 0x0065, 0x0301}, +{ 0x00EA, 0x0065, 0x0302}, +{ 0x1EBD, 0x0065, 0x0303}, +{ 0x0113, 0x0065, 0x0304}, +{ 0x0115, 0x0065, 0x0306}, +{ 0x0117, 0x0065, 0x0307}, +{ 0x00EB, 0x0065, 0x0308}, +{ 0x1EBB, 0x0065, 0x0309}, +{ 0x011B, 0x0065, 0x030C}, +{ 0x0205, 0x0065, 0x030F}, +{ 0x0207, 0x0065, 0x0311}, +{ 0x1EB9, 0x0065, 0x0323}, +{ 0x0229, 0x0065, 0x0327}, +{ 0x0119, 0x0065, 0x0328}, +{ 0x1E19, 0x0065, 0x032D}, +{ 0x1E1B, 0x0065, 0x0330}, +{ 0x1E1F, 0x0066, 0x0307}, +{ 0x01F5, 0x0067, 0x0301}, +{ 0x011D, 0x0067, 0x0302}, +{ 0x1E21, 0x0067, 0x0304}, +{ 0x011F, 0x0067, 0x0306}, +{ 0x0121, 0x0067, 0x0307}, +{ 0x01E7, 0x0067, 0x030C}, +{ 0x0123, 0x0067, 0x0327}, +{ 0x0125, 0x0068, 0x0302}, +{ 0x1E23, 0x0068, 0x0307}, +{ 0x1E27, 0x0068, 0x0308}, +{ 0x021F, 0x0068, 0x030C}, +{ 0x1E25, 0x0068, 0x0323}, +{ 0x1E29, 0x0068, 0x0327}, +{ 0x1E2B, 0x0068, 0x032E}, +{ 0x1E96, 0x0068, 0x0331}, +{ 0x00EC, 0x0069, 0x0300}, +{ 0x00ED, 0x0069, 0x0301}, +{ 0x00EE, 0x0069, 0x0302}, +{ 0x0129, 0x0069, 0x0303}, +{ 0x012B, 0x0069, 0x0304}, +{ 0x012D, 0x0069, 0x0306}, +{ 0x00EF, 0x0069, 0x0308}, +{ 0x1EC9, 0x0069, 0x0309}, +{ 0x01D0, 0x0069, 0x030C}, +{ 0x0209, 0x0069, 0x030F}, +{ 0x020B, 0x0069, 0x0311}, +{ 0x1ECB, 0x0069, 0x0323}, +{ 0x012F, 0x0069, 0x0328}, +{ 0x1E2D, 0x0069, 0x0330}, +{ 0x0135, 0x006A, 0x0302}, +{ 0x01F0, 0x006A, 0x030C}, +{ 0x1E31, 0x006B, 0x0301}, +{ 0x01E9, 0x006B, 0x030C}, +{ 0x1E33, 0x006B, 0x0323}, +{ 0x0137, 0x006B, 0x0327}, +{ 0x1E35, 0x006B, 0x0331}, +{ 0x013A, 0x006C, 0x0301}, +{ 0x013E, 0x006C, 0x030C}, +{ 0x1E37, 0x006C, 0x0323}, +{ 0x013C, 0x006C, 0x0327}, +{ 0x1E3D, 0x006C, 0x032D}, +{ 0x1E3B, 0x006C, 0x0331}, +{ 0x1E3F, 0x006D, 0x0301}, +{ 0x1E41, 0x006D, 0x0307}, +{ 0x1E43, 0x006D, 0x0323}, +{ 0x01F9, 0x006E, 0x0300}, +{ 0x0144, 0x006E, 0x0301}, +{ 0x00F1, 0x006E, 0x0303}, +{ 0x1E45, 0x006E, 0x0307}, +{ 0x0148, 0x006E, 0x030C}, +{ 0x1E47, 0x006E, 0x0323}, +{ 0x0146, 0x006E, 0x0327}, +{ 0x1E4B, 0x006E, 0x032D}, +{ 0x1E49, 0x006E, 0x0331}, +{ 0x00F2, 0x006F, 0x0300}, +{ 0x00F3, 0x006F, 0x0301}, +{ 0x00F4, 0x006F, 0x0302}, +{ 0x00F5, 0x006F, 0x0303}, +{ 0x014D, 0x006F, 0x0304}, +{ 0x014F, 0x006F, 0x0306}, +{ 0x022F, 0x006F, 0x0307}, +{ 0x00F6, 0x006F, 0x0308}, +{ 0x1ECF, 0x006F, 0x0309}, +{ 0x0151, 0x006F, 0x030B}, +{ 0x01D2, 0x006F, 0x030C}, +{ 0x020D, 0x006F, 0x030F}, +{ 0x020F, 0x006F, 0x0311}, +{ 0x01A1, 0x006F, 0x031B}, +{ 0x1ECD, 0x006F, 0x0323}, +{ 0x01EB, 0x006F, 0x0328}, +{ 0x1E55, 0x0070, 0x0301}, +{ 0x1E57, 0x0070, 0x0307}, +{ 0x0155, 0x0072, 0x0301}, +{ 0x1E59, 0x0072, 0x0307}, +{ 0x0159, 0x0072, 0x030C}, +{ 0x0211, 0x0072, 0x030F}, +{ 0x0213, 0x0072, 0x0311}, +{ 0x1E5B, 0x0072, 0x0323}, +{ 0x0157, 0x0072, 0x0327}, +{ 0x1E5F, 0x0072, 0x0331}, +{ 0x015B, 0x0073, 0x0301}, +{ 0x015D, 0x0073, 0x0302}, +{ 0x1E61, 0x0073, 0x0307}, +{ 0x0161, 0x0073, 0x030C}, +{ 0x1E63, 0x0073, 0x0323}, +{ 0x0219, 0x0073, 0x0326}, +{ 0x015F, 0x0073, 0x0327}, +{ 0x1E6B, 0x0074, 0x0307}, +{ 0x1E97, 0x0074, 0x0308}, +{ 0x0165, 0x0074, 0x030C}, +{ 0x1E6D, 0x0074, 0x0323}, +{ 0x021B, 0x0074, 0x0326}, +{ 0x0163, 0x0074, 0x0327}, +{ 0x1E71, 0x0074, 0x032D}, +{ 0x1E6F, 0x0074, 0x0331}, +{ 0x00F9, 0x0075, 0x0300}, +{ 0x00FA, 0x0075, 0x0301}, +{ 0x00FB, 0x0075, 0x0302}, +{ 0x0169, 0x0075, 0x0303}, +{ 0x016B, 0x0075, 0x0304}, +{ 0x016D, 0x0075, 0x0306}, +{ 0x00FC, 0x0075, 0x0308}, +{ 0x1EE7, 0x0075, 0x0309}, +{ 0x016F, 0x0075, 0x030A}, +{ 0x0171, 0x0075, 0x030B}, +{ 0x01D4, 0x0075, 0x030C}, +{ 0x0215, 0x0075, 0x030F}, +{ 0x0217, 0x0075, 0x0311}, +{ 0x01B0, 0x0075, 0x031B}, +{ 0x1EE5, 0x0075, 0x0323}, +{ 0x1E73, 0x0075, 0x0324}, +{ 0x0173, 0x0075, 0x0328}, +{ 0x1E77, 0x0075, 0x032D}, +{ 0x1E75, 0x0075, 0x0330}, +{ 0x1E7D, 0x0076, 0x0303}, +{ 0x1E7F, 0x0076, 0x0323}, +{ 0x1E81, 0x0077, 0x0300}, +{ 0x1E83, 0x0077, 0x0301}, +{ 0x0175, 0x0077, 0x0302}, +{ 0x1E87, 0x0077, 0x0307}, +{ 0x1E85, 0x0077, 0x0308}, +{ 0x1E98, 0x0077, 0x030A}, +{ 0x1E89, 0x0077, 0x0323}, +{ 0x1E8B, 0x0078, 0x0307}, +{ 0x1E8D, 0x0078, 0x0308}, +{ 0x1EF3, 0x0079, 0x0300}, +{ 0x00FD, 0x0079, 0x0301}, +{ 0x0177, 0x0079, 0x0302}, +{ 0x1EF9, 0x0079, 0x0303}, +{ 0x0233, 0x0079, 0x0304}, +{ 0x1E8F, 0x0079, 0x0307}, +{ 0x00FF, 0x0079, 0x0308}, +{ 0x1EF7, 0x0079, 0x0309}, +{ 0x1E99, 0x0079, 0x030A}, +{ 0x1EF5, 0x0079, 0x0323}, +{ 0x017A, 0x007A, 0x0301}, +{ 0x1E91, 0x007A, 0x0302}, +{ 0x017C, 0x007A, 0x0307}, +{ 0x017E, 0x007A, 0x030C}, +{ 0x1E93, 0x007A, 0x0323}, +{ 0x1E95, 0x007A, 0x0331}, +{ 0x1FED, 0x00A8, 0x0300}, +{ 0x0385, 0x00A8, 0x0301}, +{ 0x1FC1, 0x00A8, 0x0342}, +{ 0x1EA6, 0x00C2, 0x0300}, +{ 0x1EA4, 0x00C2, 0x0301}, +{ 0x1EAA, 0x00C2, 0x0303}, +{ 0x1EA8, 0x00C2, 0x0309}, +{ 0x01DE, 0x00C4, 0x0304}, +{ 0x01FA, 0x00C5, 0x0301}, +{ 0x01FC, 0x00C6, 0x0301}, +{ 0x01E2, 0x00C6, 0x0304}, +{ 0x1E08, 0x00C7, 0x0301}, +{ 0x1EC0, 0x00CA, 0x0300}, +{ 0x1EBE, 0x00CA, 0x0301}, +{ 0x1EC4, 0x00CA, 0x0303}, +{ 0x1EC2, 0x00CA, 0x0309}, +{ 0x1E2E, 0x00CF, 0x0301}, +{ 0x1ED2, 0x00D4, 0x0300}, +{ 0x1ED0, 0x00D4, 0x0301}, +{ 0x1ED6, 0x00D4, 0x0303}, +{ 0x1ED4, 0x00D4, 0x0309}, +{ 0x1E4C, 0x00D5, 0x0301}, +{ 0x022C, 0x00D5, 0x0304}, +{ 0x1E4E, 0x00D5, 0x0308}, +{ 0x022A, 0x00D6, 0x0304}, +{ 0x01FE, 0x00D8, 0x0301}, +{ 0x01DB, 0x00DC, 0x0300}, +{ 0x01D7, 0x00DC, 0x0301}, +{ 0x01D5, 0x00DC, 0x0304}, +{ 0x01D9, 0x00DC, 0x030C}, +{ 0x1EA7, 0x00E2, 0x0300}, +{ 0x1EA5, 0x00E2, 0x0301}, +{ 0x1EAB, 0x00E2, 0x0303}, +{ 0x1EA9, 0x00E2, 0x0309}, +{ 0x01DF, 0x00E4, 0x0304}, +{ 0x01FB, 0x00E5, 0x0301}, +{ 0x01FD, 0x00E6, 0x0301}, +{ 0x01E3, 0x00E6, 0x0304}, +{ 0x1E09, 0x00E7, 0x0301}, +{ 0x1EC1, 0x00EA, 0x0300}, +{ 0x1EBF, 0x00EA, 0x0301}, +{ 0x1EC5, 0x00EA, 0x0303}, +{ 0x1EC3, 0x00EA, 0x0309}, +{ 0x1E2F, 0x00EF, 0x0301}, +{ 0x1ED3, 0x00F4, 0x0300}, +{ 0x1ED1, 0x00F4, 0x0301}, +{ 0x1ED7, 0x00F4, 0x0303}, +{ 0x1ED5, 0x00F4, 0x0309}, +{ 0x1E4D, 0x00F5, 0x0301}, +{ 0x022D, 0x00F5, 0x0304}, +{ 0x1E4F, 0x00F5, 0x0308}, +{ 0x022B, 0x00F6, 0x0304}, +{ 0x01FF, 0x00F8, 0x0301}, +{ 0x01DC, 0x00FC, 0x0300}, +{ 0x01D8, 0x00FC, 0x0301}, +{ 0x01D6, 0x00FC, 0x0304}, +{ 0x01DA, 0x00FC, 0x030C}, +{ 0x1EB0, 0x0102, 0x0300}, +{ 0x1EAE, 0x0102, 0x0301}, +{ 0x1EB4, 0x0102, 0x0303}, +{ 0x1EB2, 0x0102, 0x0309}, +{ 0x1EB1, 0x0103, 0x0300}, +{ 0x1EAF, 0x0103, 0x0301}, +{ 0x1EB5, 0x0103, 0x0303}, +{ 0x1EB3, 0x0103, 0x0309}, +{ 0x1E14, 0x0112, 0x0300}, +{ 0x1E16, 0x0112, 0x0301}, +{ 0x1E15, 0x0113, 0x0300}, +{ 0x1E17, 0x0113, 0x0301}, +{ 0x1E50, 0x014C, 0x0300}, +{ 0x1E52, 0x014C, 0x0301}, +{ 0x1E51, 0x014D, 0x0300}, +{ 0x1E53, 0x014D, 0x0301}, +{ 0x1E64, 0x015A, 0x0307}, +{ 0x1E65, 0x015B, 0x0307}, +{ 0x1E66, 0x0160, 0x0307}, +{ 0x1E67, 0x0161, 0x0307}, +{ 0x1E78, 0x0168, 0x0301}, +{ 0x1E79, 0x0169, 0x0301}, +{ 0x1E7A, 0x016A, 0x0308}, +{ 0x1E7B, 0x016B, 0x0308}, +{ 0x1E9B, 0x017F, 0x0307}, +{ 0x1EDC, 0x01A0, 0x0300}, +{ 0x1EDA, 0x01A0, 0x0301}, +{ 0x1EE0, 0x01A0, 0x0303}, +{ 0x1EDE, 0x01A0, 0x0309}, +{ 0x1EE2, 0x01A0, 0x0323}, +{ 0x1EDD, 0x01A1, 0x0300}, +{ 0x1EDB, 0x01A1, 0x0301}, +{ 0x1EE1, 0x01A1, 0x0303}, +{ 0x1EDF, 0x01A1, 0x0309}, +{ 0x1EE3, 0x01A1, 0x0323}, +{ 0x1EEA, 0x01AF, 0x0300}, +{ 0x1EE8, 0x01AF, 0x0301}, +{ 0x1EEE, 0x01AF, 0x0303}, +{ 0x1EEC, 0x01AF, 0x0309}, +{ 0x1EF0, 0x01AF, 0x0323}, +{ 0x1EEB, 0x01B0, 0x0300}, +{ 0x1EE9, 0x01B0, 0x0301}, +{ 0x1EEF, 0x01B0, 0x0303}, +{ 0x1EED, 0x01B0, 0x0309}, +{ 0x1EF1, 0x01B0, 0x0323}, +{ 0x01EE, 0x01B7, 0x030C}, +{ 0x01EC, 0x01EA, 0x0304}, +{ 0x01ED, 0x01EB, 0x0304}, +{ 0x01E0, 0x0226, 0x0304}, +{ 0x01E1, 0x0227, 0x0304}, +{ 0x1E1C, 0x0228, 0x0306}, +{ 0x1E1D, 0x0229, 0x0306}, +{ 0x0230, 0x022E, 0x0304}, +{ 0x0231, 0x022F, 0x0304}, +{ 0x01EF, 0x0292, 0x030C}, +{ 0x0344, 0x0308, 0x0301}, +{ 0x1FBA, 0x0391, 0x0300}, +{ 0x0386, 0x0391, 0x0301}, +{ 0x1FB9, 0x0391, 0x0304}, +{ 0x1FB8, 0x0391, 0x0306}, +{ 0x1F08, 0x0391, 0x0313}, +{ 0x1F09, 0x0391, 0x0314}, +{ 0x1FBC, 0x0391, 0x0345}, +{ 0x1FC8, 0x0395, 0x0300}, +{ 0x0388, 0x0395, 0x0301}, +{ 0x1F18, 0x0395, 0x0313}, +{ 0x1F19, 0x0395, 0x0314}, +{ 0x1FCA, 0x0397, 0x0300}, +{ 0x0389, 0x0397, 0x0301}, +{ 0x1F28, 0x0397, 0x0313}, +{ 0x1F29, 0x0397, 0x0314}, +{ 0x1FCC, 0x0397, 0x0345}, +{ 0x1FDA, 0x0399, 0x0300}, +{ 0x038A, 0x0399, 0x0301}, +{ 0x1FD9, 0x0399, 0x0304}, +{ 0x1FD8, 0x0399, 0x0306}, +{ 0x03AA, 0x0399, 0x0308}, +{ 0x1F38, 0x0399, 0x0313}, +{ 0x1F39, 0x0399, 0x0314}, +{ 0x1FF8, 0x039F, 0x0300}, +{ 0x038C, 0x039F, 0x0301}, +{ 0x1F48, 0x039F, 0x0313}, +{ 0x1F49, 0x039F, 0x0314}, +{ 0x1FEC, 0x03A1, 0x0314}, +{ 0x1FEA, 0x03A5, 0x0300}, +{ 0x038E, 0x03A5, 0x0301}, +{ 0x1FE9, 0x03A5, 0x0304}, +{ 0x1FE8, 0x03A5, 0x0306}, +{ 0x03AB, 0x03A5, 0x0308}, +{ 0x1F59, 0x03A5, 0x0314}, +{ 0x1FFA, 0x03A9, 0x0300}, +{ 0x038F, 0x03A9, 0x0301}, +{ 0x1F68, 0x03A9, 0x0313}, +{ 0x1F69, 0x03A9, 0x0314}, +{ 0x1FFC, 0x03A9, 0x0345}, +{ 0x1FB4, 0x03AC, 0x0345}, +{ 0x1FC4, 0x03AE, 0x0345}, +{ 0x1F70, 0x03B1, 0x0300}, +{ 0x03AC, 0x03B1, 0x0301}, +{ 0x1FB1, 0x03B1, 0x0304}, +{ 0x1FB0, 0x03B1, 0x0306}, +{ 0x1F00, 0x03B1, 0x0313}, +{ 0x1F01, 0x03B1, 0x0314}, +{ 0x1FB6, 0x03B1, 0x0342}, +{ 0x1FB3, 0x03B1, 0x0345}, +{ 0x1F72, 0x03B5, 0x0300}, +{ 0x03AD, 0x03B5, 0x0301}, +{ 0x1F10, 0x03B5, 0x0313}, +{ 0x1F11, 0x03B5, 0x0314}, +{ 0x1F74, 0x03B7, 0x0300}, +{ 0x03AE, 0x03B7, 0x0301}, +{ 0x1F20, 0x03B7, 0x0313}, +{ 0x1F21, 0x03B7, 0x0314}, +{ 0x1FC6, 0x03B7, 0x0342}, +{ 0x1FC3, 0x03B7, 0x0345}, +{ 0x1F76, 0x03B9, 0x0300}, +{ 0x03AF, 0x03B9, 0x0301}, +{ 0x1FD1, 0x03B9, 0x0304}, +{ 0x1FD0, 0x03B9, 0x0306}, +{ 0x03CA, 0x03B9, 0x0308}, +{ 0x1F30, 0x03B9, 0x0313}, +{ 0x1F31, 0x03B9, 0x0314}, +{ 0x1FD6, 0x03B9, 0x0342}, +{ 0x1F78, 0x03BF, 0x0300}, +{ 0x03CC, 0x03BF, 0x0301}, +{ 0x1F40, 0x03BF, 0x0313}, +{ 0x1F41, 0x03BF, 0x0314}, +{ 0x1FE4, 0x03C1, 0x0313}, +{ 0x1FE5, 0x03C1, 0x0314}, +{ 0x1F7A, 0x03C5, 0x0300}, +{ 0x03CD, 0x03C5, 0x0301}, +{ 0x1FE1, 0x03C5, 0x0304}, +{ 0x1FE0, 0x03C5, 0x0306}, +{ 0x03CB, 0x03C5, 0x0308}, +{ 0x1F50, 0x03C5, 0x0313}, +{ 0x1F51, 0x03C5, 0x0314}, +{ 0x1FE6, 0x03C5, 0x0342}, +{ 0x1F7C, 0x03C9, 0x0300}, +{ 0x03CE, 0x03C9, 0x0301}, +{ 0x1F60, 0x03C9, 0x0313}, +{ 0x1F61, 0x03C9, 0x0314}, +{ 0x1FF6, 0x03C9, 0x0342}, +{ 0x1FF3, 0x03C9, 0x0345}, +{ 0x1FD2, 0x03CA, 0x0300}, +{ 0x0390, 0x03CA, 0x0301}, +{ 0x1FD7, 0x03CA, 0x0342}, +{ 0x1FE2, 0x03CB, 0x0300}, +{ 0x03B0, 0x03CB, 0x0301}, +{ 0x1FE7, 0x03CB, 0x0342}, +{ 0x1FF4, 0x03CE, 0x0345}, +{ 0x03D3, 0x03D2, 0x0301}, +{ 0x03D4, 0x03D2, 0x0308}, +{ 0x0407, 0x0406, 0x0308}, +{ 0x04D0, 0x0410, 0x0306}, +{ 0x04D2, 0x0410, 0x0308}, +{ 0x0403, 0x0413, 0x0301}, +{ 0x0400, 0x0415, 0x0300}, +{ 0x04D6, 0x0415, 0x0306}, +{ 0x0401, 0x0415, 0x0308}, +{ 0x04C1, 0x0416, 0x0306}, +{ 0x04DC, 0x0416, 0x0308}, +{ 0x04DE, 0x0417, 0x0308}, +{ 0x040D, 0x0418, 0x0300}, +{ 0x04E2, 0x0418, 0x0304}, +{ 0x0419, 0x0418, 0x0306}, +{ 0x04E4, 0x0418, 0x0308}, +{ 0x040C, 0x041A, 0x0301}, +{ 0x04E6, 0x041E, 0x0308}, +{ 0x04EE, 0x0423, 0x0304}, +{ 0x040E, 0x0423, 0x0306}, +{ 0x04F0, 0x0423, 0x0308}, +{ 0x04F2, 0x0423, 0x030B}, +{ 0x04F4, 0x0427, 0x0308}, +{ 0x04F8, 0x042B, 0x0308}, +{ 0x04EC, 0x042D, 0x0308}, +{ 0x04D1, 0x0430, 0x0306}, +{ 0x04D3, 0x0430, 0x0308}, +{ 0x0453, 0x0433, 0x0301}, +{ 0x0450, 0x0435, 0x0300}, +{ 0x04D7, 0x0435, 0x0306}, +{ 0x0451, 0x0435, 0x0308}, +{ 0x04C2, 0x0436, 0x0306}, +{ 0x04DD, 0x0436, 0x0308}, +{ 0x04DF, 0x0437, 0x0308}, +{ 0x045D, 0x0438, 0x0300}, +{ 0x04E3, 0x0438, 0x0304}, +{ 0x0439, 0x0438, 0x0306}, +{ 0x04E5, 0x0438, 0x0308}, +{ 0x045C, 0x043A, 0x0301}, +{ 0x04E7, 0x043E, 0x0308}, +{ 0x04EF, 0x0443, 0x0304}, +{ 0x045E, 0x0443, 0x0306}, +{ 0x04F1, 0x0443, 0x0308}, +{ 0x04F3, 0x0443, 0x030B}, +{ 0x04F5, 0x0447, 0x0308}, +{ 0x04F9, 0x044B, 0x0308}, +{ 0x04ED, 0x044D, 0x0308}, +{ 0x0457, 0x0456, 0x0308}, +{ 0x0476, 0x0474, 0x030F}, +{ 0x0477, 0x0475, 0x030F}, +{ 0x04DA, 0x04D8, 0x0308}, +{ 0x04DB, 0x04D9, 0x0308}, +{ 0x04EA, 0x04E8, 0x0308}, +{ 0x04EB, 0x04E9, 0x0308}, +{ 0xFB2E, 0x05D0, 0x05B7}, +{ 0xFB2F, 0x05D0, 0x05B8}, +{ 0xFB30, 0x05D0, 0x05BC}, +{ 0xFB31, 0x05D1, 0x05BC}, +{ 0xFB4C, 0x05D1, 0x05BF}, +{ 0xFB32, 0x05D2, 0x05BC}, +{ 0xFB33, 0x05D3, 0x05BC}, +{ 0xFB34, 0x05D4, 0x05BC}, +{ 0xFB4B, 0x05D5, 0x05B9}, +{ 0xFB35, 0x05D5, 0x05BC}, +{ 0xFB36, 0x05D6, 0x05BC}, +{ 0xFB38, 0x05D8, 0x05BC}, +{ 0xFB1D, 0x05D9, 0x05B4}, +{ 0xFB39, 0x05D9, 0x05BC}, +{ 0xFB3A, 0x05DA, 0x05BC}, +{ 0xFB3B, 0x05DB, 0x05BC}, +{ 0xFB4D, 0x05DB, 0x05BF}, +{ 0xFB3C, 0x05DC, 0x05BC}, +{ 0xFB3E, 0x05DE, 0x05BC}, +{ 0xFB40, 0x05E0, 0x05BC}, +{ 0xFB41, 0x05E1, 0x05BC}, +{ 0xFB43, 0x05E3, 0x05BC}, +{ 0xFB44, 0x05E4, 0x05BC}, +{ 0xFB4E, 0x05E4, 0x05BF}, +{ 0xFB46, 0x05E6, 0x05BC}, +{ 0xFB47, 0x05E7, 0x05BC}, +{ 0xFB48, 0x05E8, 0x05BC}, +{ 0xFB49, 0x05E9, 0x05BC}, +{ 0xFB2A, 0x05E9, 0x05C1}, +{ 0xFB2B, 0x05E9, 0x05C2}, +{ 0xFB4A, 0x05EA, 0x05BC}, +{ 0xFB1F, 0x05F2, 0x05B7}, +{ 0x0622, 0x0627, 0x0653}, +{ 0x0623, 0x0627, 0x0654}, +{ 0x0625, 0x0627, 0x0655}, +{ 0x0624, 0x0648, 0x0654}, +{ 0x0626, 0x064A, 0x0654}, +{ 0x06C2, 0x06C1, 0x0654}, +{ 0x06D3, 0x06D2, 0x0654}, +{ 0x06C0, 0x06D5, 0x0654}, +{ 0x0958, 0x0915, 0x093C}, +{ 0x0959, 0x0916, 0x093C}, +{ 0x095A, 0x0917, 0x093C}, +{ 0x095B, 0x091C, 0x093C}, +{ 0x095C, 0x0921, 0x093C}, +{ 0x095D, 0x0922, 0x093C}, +{ 0x0929, 0x0928, 0x093C}, +{ 0x095E, 0x092B, 0x093C}, +{ 0x095F, 0x092F, 0x093C}, +{ 0x0931, 0x0930, 0x093C}, +{ 0x0934, 0x0933, 0x093C}, +{ 0x09DC, 0x09A1, 0x09BC}, +{ 0x09DD, 0x09A2, 0x09BC}, +{ 0x09DF, 0x09AF, 0x09BC}, +{ 0x09CB, 0x09C7, 0x09BE}, +{ 0x09CC, 0x09C7, 0x09D7}, +{ 0x0A59, 0x0A16, 0x0A3C}, +{ 0x0A5A, 0x0A17, 0x0A3C}, +{ 0x0A5B, 0x0A1C, 0x0A3C}, +{ 0x0A5E, 0x0A2B, 0x0A3C}, +{ 0x0A33, 0x0A32, 0x0A3C}, +{ 0x0A36, 0x0A38, 0x0A3C}, +{ 0x0B5C, 0x0B21, 0x0B3C}, +{ 0x0B5D, 0x0B22, 0x0B3C}, +{ 0x0B4B, 0x0B47, 0x0B3E}, +{ 0x0B48, 0x0B47, 0x0B56}, +{ 0x0B4C, 0x0B47, 0x0B57}, +{ 0x0B94, 0x0B92, 0x0BD7}, +{ 0x0BCA, 0x0BC6, 0x0BBE}, +{ 0x0BCC, 0x0BC6, 0x0BD7}, +{ 0x0BCB, 0x0BC7, 0x0BBE}, +{ 0x0C48, 0x0C46, 0x0C56}, +{ 0x0CC0, 0x0CBF, 0x0CD5}, +{ 0x0CCA, 0x0CC6, 0x0CC2}, +{ 0x0CC7, 0x0CC6, 0x0CD5}, +{ 0x0CC8, 0x0CC6, 0x0CD6}, +{ 0x0CCB, 0x0CCA, 0x0CD5}, +{ 0x0D4A, 0x0D46, 0x0D3E}, +{ 0x0D4C, 0x0D46, 0x0D57}, +{ 0x0D4B, 0x0D47, 0x0D3E}, +{ 0x0DDA, 0x0DD9, 0x0DCA}, +{ 0x0DDC, 0x0DD9, 0x0DCF}, +{ 0x0DDE, 0x0DD9, 0x0DDF}, +{ 0x0DDD, 0x0DDC, 0x0DCA}, +{ 0x0F69, 0x0F40, 0x0FB5}, +{ 0x0F43, 0x0F42, 0x0FB7}, +{ 0x0F4D, 0x0F4C, 0x0FB7}, +{ 0x0F52, 0x0F51, 0x0FB7}, +{ 0x0F57, 0x0F56, 0x0FB7}, +{ 0x0F5C, 0x0F5B, 0x0FB7}, +{ 0x0F73, 0x0F71, 0x0F72}, +{ 0x0F75, 0x0F71, 0x0F74}, +{ 0x0F81, 0x0F71, 0x0F80}, +{ 0x0FB9, 0x0F90, 0x0FB5}, +{ 0x0F93, 0x0F92, 0x0FB7}, +{ 0x0F9D, 0x0F9C, 0x0FB7}, +{ 0x0FA2, 0x0FA1, 0x0FB7}, +{ 0x0FA7, 0x0FA6, 0x0FB7}, +{ 0x0FAC, 0x0FAB, 0x0FB7}, +{ 0x0F76, 0x0FB2, 0x0F80}, +{ 0x0F78, 0x0FB3, 0x0F80}, +{ 0x1026, 0x1025, 0x102E}, +{ 0x1B06, 0x1B05, 0x1B35}, +{ 0x1B08, 0x1B07, 0x1B35}, +{ 0x1B0A, 0x1B09, 0x1B35}, +{ 0x1B0C, 0x1B0B, 0x1B35}, +{ 0x1B0E, 0x1B0D, 0x1B35}, +{ 0x1B12, 0x1B11, 0x1B35}, +{ 0x1B3B, 0x1B3A, 0x1B35}, +{ 0x1B3D, 0x1B3C, 0x1B35}, +{ 0x1B40, 0x1B3E, 0x1B35}, +{ 0x1B41, 0x1B3F, 0x1B35}, +{ 0x1B43, 0x1B42, 0x1B35}, +{ 0x1E38, 0x1E36, 0x0304}, +{ 0x1E39, 0x1E37, 0x0304}, +{ 0x1E5C, 0x1E5A, 0x0304}, +{ 0x1E5D, 0x1E5B, 0x0304}, +{ 0x1E68, 0x1E62, 0x0307}, +{ 0x1E69, 0x1E63, 0x0307}, +{ 0x1EAC, 0x1EA0, 0x0302}, +{ 0x1EB6, 0x1EA0, 0x0306}, +{ 0x1EAD, 0x1EA1, 0x0302}, +{ 0x1EB7, 0x1EA1, 0x0306}, +{ 0x1EC6, 0x1EB8, 0x0302}, +{ 0x1EC7, 0x1EB9, 0x0302}, +{ 0x1ED8, 0x1ECC, 0x0302}, +{ 0x1ED9, 0x1ECD, 0x0302}, +{ 0x1F02, 0x1F00, 0x0300}, +{ 0x1F04, 0x1F00, 0x0301}, +{ 0x1F06, 0x1F00, 0x0342}, +{ 0x1F80, 0x1F00, 0x0345}, +{ 0x1F03, 0x1F01, 0x0300}, +{ 0x1F05, 0x1F01, 0x0301}, +{ 0x1F07, 0x1F01, 0x0342}, +{ 0x1F81, 0x1F01, 0x0345}, +{ 0x1F82, 0x1F02, 0x0345}, +{ 0x1F83, 0x1F03, 0x0345}, +{ 0x1F84, 0x1F04, 0x0345}, +{ 0x1F85, 0x1F05, 0x0345}, +{ 0x1F86, 0x1F06, 0x0345}, +{ 0x1F87, 0x1F07, 0x0345}, +{ 0x1F0A, 0x1F08, 0x0300}, +{ 0x1F0C, 0x1F08, 0x0301}, +{ 0x1F0E, 0x1F08, 0x0342}, +{ 0x1F88, 0x1F08, 0x0345}, +{ 0x1F0B, 0x1F09, 0x0300}, +{ 0x1F0D, 0x1F09, 0x0301}, +{ 0x1F0F, 0x1F09, 0x0342}, +{ 0x1F89, 0x1F09, 0x0345}, +{ 0x1F8A, 0x1F0A, 0x0345}, +{ 0x1F8B, 0x1F0B, 0x0345}, +{ 0x1F8C, 0x1F0C, 0x0345}, +{ 0x1F8D, 0x1F0D, 0x0345}, +{ 0x1F8E, 0x1F0E, 0x0345}, +{ 0x1F8F, 0x1F0F, 0x0345}, +{ 0x1F12, 0x1F10, 0x0300}, +{ 0x1F14, 0x1F10, 0x0301}, +{ 0x1F13, 0x1F11, 0x0300}, +{ 0x1F15, 0x1F11, 0x0301}, +{ 0x1F1A, 0x1F18, 0x0300}, +{ 0x1F1C, 0x1F18, 0x0301}, +{ 0x1F1B, 0x1F19, 0x0300}, +{ 0x1F1D, 0x1F19, 0x0301}, +{ 0x1F22, 0x1F20, 0x0300}, +{ 0x1F24, 0x1F20, 0x0301}, +{ 0x1F26, 0x1F20, 0x0342}, +{ 0x1F90, 0x1F20, 0x0345}, +{ 0x1F23, 0x1F21, 0x0300}, +{ 0x1F25, 0x1F21, 0x0301}, +{ 0x1F27, 0x1F21, 0x0342}, +{ 0x1F91, 0x1F21, 0x0345}, +{ 0x1F92, 0x1F22, 0x0345}, +{ 0x1F93, 0x1F23, 0x0345}, +{ 0x1F94, 0x1F24, 0x0345}, +{ 0x1F95, 0x1F25, 0x0345}, +{ 0x1F96, 0x1F26, 0x0345}, +{ 0x1F97, 0x1F27, 0x0345}, +{ 0x1F2A, 0x1F28, 0x0300}, +{ 0x1F2C, 0x1F28, 0x0301}, +{ 0x1F2E, 0x1F28, 0x0342}, +{ 0x1F98, 0x1F28, 0x0345}, +{ 0x1F2B, 0x1F29, 0x0300}, +{ 0x1F2D, 0x1F29, 0x0301}, +{ 0x1F2F, 0x1F29, 0x0342}, +{ 0x1F99, 0x1F29, 0x0345}, +{ 0x1F9A, 0x1F2A, 0x0345}, +{ 0x1F9B, 0x1F2B, 0x0345}, +{ 0x1F9C, 0x1F2C, 0x0345}, +{ 0x1F9D, 0x1F2D, 0x0345}, +{ 0x1F9E, 0x1F2E, 0x0345}, +{ 0x1F9F, 0x1F2F, 0x0345}, +{ 0x1F32, 0x1F30, 0x0300}, +{ 0x1F34, 0x1F30, 0x0301}, +{ 0x1F36, 0x1F30, 0x0342}, +{ 0x1F33, 0x1F31, 0x0300}, +{ 0x1F35, 0x1F31, 0x0301}, +{ 0x1F37, 0x1F31, 0x0342}, +{ 0x1F3A, 0x1F38, 0x0300}, +{ 0x1F3C, 0x1F38, 0x0301}, +{ 0x1F3E, 0x1F38, 0x0342}, +{ 0x1F3B, 0x1F39, 0x0300}, +{ 0x1F3D, 0x1F39, 0x0301}, +{ 0x1F3F, 0x1F39, 0x0342}, +{ 0x1F42, 0x1F40, 0x0300}, +{ 0x1F44, 0x1F40, 0x0301}, +{ 0x1F43, 0x1F41, 0x0300}, +{ 0x1F45, 0x1F41, 0x0301}, +{ 0x1F4A, 0x1F48, 0x0300}, +{ 0x1F4C, 0x1F48, 0x0301}, +{ 0x1F4B, 0x1F49, 0x0300}, +{ 0x1F4D, 0x1F49, 0x0301}, +{ 0x1F52, 0x1F50, 0x0300}, +{ 0x1F54, 0x1F50, 0x0301}, +{ 0x1F56, 0x1F50, 0x0342}, +{ 0x1F53, 0x1F51, 0x0300}, +{ 0x1F55, 0x1F51, 0x0301}, +{ 0x1F57, 0x1F51, 0x0342}, +{ 0x1F5B, 0x1F59, 0x0300}, +{ 0x1F5D, 0x1F59, 0x0301}, +{ 0x1F5F, 0x1F59, 0x0342}, +{ 0x1F62, 0x1F60, 0x0300}, +{ 0x1F64, 0x1F60, 0x0301}, +{ 0x1F66, 0x1F60, 0x0342}, +{ 0x1FA0, 0x1F60, 0x0345}, +{ 0x1F63, 0x1F61, 0x0300}, +{ 0x1F65, 0x1F61, 0x0301}, +{ 0x1F67, 0x1F61, 0x0342}, +{ 0x1FA1, 0x1F61, 0x0345}, +{ 0x1FA2, 0x1F62, 0x0345}, +{ 0x1FA3, 0x1F63, 0x0345}, +{ 0x1FA4, 0x1F64, 0x0345}, +{ 0x1FA5, 0x1F65, 0x0345}, +{ 0x1FA6, 0x1F66, 0x0345}, +{ 0x1FA7, 0x1F67, 0x0345}, +{ 0x1F6A, 0x1F68, 0x0300}, +{ 0x1F6C, 0x1F68, 0x0301}, +{ 0x1F6E, 0x1F68, 0x0342}, +{ 0x1FA8, 0x1F68, 0x0345}, +{ 0x1F6B, 0x1F69, 0x0300}, +{ 0x1F6D, 0x1F69, 0x0301}, +{ 0x1F6F, 0x1F69, 0x0342}, +{ 0x1FA9, 0x1F69, 0x0345}, +{ 0x1FAA, 0x1F6A, 0x0345}, +{ 0x1FAB, 0x1F6B, 0x0345}, +{ 0x1FAC, 0x1F6C, 0x0345}, +{ 0x1FAD, 0x1F6D, 0x0345}, +{ 0x1FAE, 0x1F6E, 0x0345}, +{ 0x1FAF, 0x1F6F, 0x0345}, +{ 0x1FB2, 0x1F70, 0x0345}, +{ 0x1FC2, 0x1F74, 0x0345}, +{ 0x1FF2, 0x1F7C, 0x0345}, +{ 0x1FB7, 0x1FB6, 0x0345}, +{ 0x1FCD, 0x1FBF, 0x0300}, +{ 0x1FCE, 0x1FBF, 0x0301}, +{ 0x1FCF, 0x1FBF, 0x0342}, +{ 0x1FC7, 0x1FC6, 0x0345}, +{ 0x1FF7, 0x1FF6, 0x0345}, +{ 0x1FDD, 0x1FFE, 0x0300}, +{ 0x1FDE, 0x1FFE, 0x0301}, +{ 0x1FDF, 0x1FFE, 0x0342}, +{ 0x219A, 0x2190, 0x0338}, +{ 0x219B, 0x2192, 0x0338}, +{ 0x21AE, 0x2194, 0x0338}, +{ 0x21CD, 0x21D0, 0x0338}, +{ 0x21CF, 0x21D2, 0x0338}, +{ 0x21CE, 0x21D4, 0x0338}, +{ 0x2204, 0x2203, 0x0338}, +{ 0x2209, 0x2208, 0x0338}, +{ 0x220C, 0x220B, 0x0338}, +{ 0x2224, 0x2223, 0x0338}, +{ 0x2226, 0x2225, 0x0338}, +{ 0x2241, 0x223C, 0x0338}, +{ 0x2244, 0x2243, 0x0338}, +{ 0x2247, 0x2245, 0x0338}, +{ 0x2249, 0x2248, 0x0338}, +{ 0x226D, 0x224D, 0x0338}, +{ 0x2262, 0x2261, 0x0338}, +{ 0x2270, 0x2264, 0x0338}, +{ 0x2271, 0x2265, 0x0338}, +{ 0x2274, 0x2272, 0x0338}, +{ 0x2275, 0x2273, 0x0338}, +{ 0x2278, 0x2276, 0x0338}, +{ 0x2279, 0x2277, 0x0338}, +{ 0x2280, 0x227A, 0x0338}, +{ 0x2281, 0x227B, 0x0338}, +{ 0x22E0, 0x227C, 0x0338}, +{ 0x22E1, 0x227D, 0x0338}, +{ 0x2284, 0x2282, 0x0338}, +{ 0x2285, 0x2283, 0x0338}, +{ 0x2288, 0x2286, 0x0338}, +{ 0x2289, 0x2287, 0x0338}, +{ 0x22E2, 0x2291, 0x0338}, +{ 0x22E3, 0x2292, 0x0338}, +{ 0x22AC, 0x22A2, 0x0338}, +{ 0x22AD, 0x22A8, 0x0338}, +{ 0x22AE, 0x22A9, 0x0338}, +{ 0x22AF, 0x22AB, 0x0338}, +{ 0x22EA, 0x22B2, 0x0338}, +{ 0x22EB, 0x22B3, 0x0338}, +{ 0x22EC, 0x22B4, 0x0338}, +{ 0x22ED, 0x22B5, 0x0338}, +{ 0x2ADC, 0x2ADD, 0x0338}, +{ 0x3094, 0x3046, 0x3099}, +{ 0x304C, 0x304B, 0x3099}, +{ 0x304E, 0x304D, 0x3099}, +{ 0x3050, 0x304F, 0x3099}, +{ 0x3052, 0x3051, 0x3099}, +{ 0x3054, 0x3053, 0x3099}, +{ 0x3056, 0x3055, 0x3099}, +{ 0x3058, 0x3057, 0x3099}, +{ 0x305A, 0x3059, 0x3099}, +{ 0x305C, 0x305B, 0x3099}, +{ 0x305E, 0x305D, 0x3099}, +{ 0x3060, 0x305F, 0x3099}, +{ 0x3062, 0x3061, 0x3099}, +{ 0x3065, 0x3064, 0x3099}, +{ 0x3067, 0x3066, 0x3099}, +{ 0x3069, 0x3068, 0x3099}, +{ 0x3070, 0x306F, 0x3099}, +{ 0x3071, 0x306F, 0x309A}, +{ 0x3073, 0x3072, 0x3099}, +{ 0x3074, 0x3072, 0x309A}, +{ 0x3076, 0x3075, 0x3099}, +{ 0x3077, 0x3075, 0x309A}, +{ 0x3079, 0x3078, 0x3099}, +{ 0x307A, 0x3078, 0x309A}, +{ 0x307C, 0x307B, 0x3099}, +{ 0x307D, 0x307B, 0x309A}, +{ 0x309E, 0x309D, 0x3099}, +{ 0x30F4, 0x30A6, 0x3099}, +{ 0x30AC, 0x30AB, 0x3099}, +{ 0x30AE, 0x30AD, 0x3099}, +{ 0x30B0, 0x30AF, 0x3099}, +{ 0x30B2, 0x30B1, 0x3099}, +{ 0x30B4, 0x30B3, 0x3099}, +{ 0x30B6, 0x30B5, 0x3099}, +{ 0x30B8, 0x30B7, 0x3099}, +{ 0x30BA, 0x30B9, 0x3099}, +{ 0x30BC, 0x30BB, 0x3099}, +{ 0x30BE, 0x30BD, 0x3099}, +{ 0x30C0, 0x30BF, 0x3099}, +{ 0x30C2, 0x30C1, 0x3099}, +{ 0x30C5, 0x30C4, 0x3099}, +{ 0x30C7, 0x30C6, 0x3099}, +{ 0x30C9, 0x30C8, 0x3099}, +{ 0x30D0, 0x30CF, 0x3099}, +{ 0x30D1, 0x30CF, 0x309A}, +{ 0x30D3, 0x30D2, 0x3099}, +{ 0x30D4, 0x30D2, 0x309A}, +{ 0x30D6, 0x30D5, 0x3099}, +{ 0x30D7, 0x30D5, 0x309A}, +{ 0x30D9, 0x30D8, 0x3099}, +{ 0x30DA, 0x30D8, 0x309A}, +{ 0x30DC, 0x30DB, 0x3099}, +{ 0x30DD, 0x30DB, 0x309A}, +{ 0x30F7, 0x30EF, 0x3099}, +{ 0x30F8, 0x30F0, 0x3099}, +{ 0x30F9, 0x30F1, 0x3099}, +{ 0x30FA, 0x30F2, 0x3099}, +{ 0x30FE, 0x30FD, 0x3099}, +{ 0xFB2C, 0xFB49, 0x05C1}, +{ 0xFB2D, 0xFB49, 0x05C2}, +{ 0x1109A, 0x11099, 0x110BA}, +{ 0x1109C, 0x1109B, 0x110BA}, +{ 0x110AB, 0x110A5, 0x110BA}, +{ 0x1112E, 0x11131, 0x11127}, +{ 0x1112F, 0x11132, 0x11127}, +{ 0x1134B, 0x11347, 0x1133E}, +{ 0x1134C, 0x11347, 0x11357}, +{ 0x114BC, 0x114B9, 0x114B0}, +{ 0x114BB, 0x114B9, 0x114BA}, +{ 0x114BE, 0x114B9, 0x114BD}, +{ 0x115BA, 0x115B8, 0x115AF}, +{ 0x115BB, 0x115B9, 0x115AF}, +{ 0x1D15E, 0x1D157, 0x1D165}, +{ 0x1D15F, 0x1D158, 0x1D165}, +{ 0x1D160, 0x1D15F, 0x1D16E}, +{ 0x1D161, 0x1D15F, 0x1D16F}, +{ 0x1D162, 0x1D15F, 0x1D170}, +{ 0x1D163, 0x1D15F, 0x1D171}, +{ 0x1D164, 0x1D15F, 0x1D172}, +{ 0x1D1BB, 0x1D1B9, 0x1D165}, +{ 0x1D1BC, 0x1D1BA, 0x1D165}, +{ 0x1D1BD, 0x1D1BB, 0x1D16E}, +{ 0x1D1BF, 0x1D1BB, 0x1D16F}, +{ 0x1D1BE, 0x1D1BC, 0x1D16E}, +{ 0x1D1C0, 0x1D1BC, 0x1D16F}, +}; + +#define UNICODE_SHIFT 21 + +int do_precomposition(int base, int comb) { + int min = 0; + int max = sizeof(precompositions) / sizeof(precompositions[0]) - 1; + unsigned long sought = ((unsigned) base << UNICODE_SHIFT) | (unsigned) comb; + + /* binary search */ + while (max >= min) { + int mid = (min + max) / 2; + unsigned long that = ((unsigned long) precompositions[mid].base << UNICODE_SHIFT) | ((unsigned) precompositions[mid].comb); + if (that < sought) { + min = mid + 1; + } else if (that > sought) { + max = mid - 1; + } else { + return precompositions[mid].replacement; + } + } + /* no match */ + return -1; +} diff --git a/ports/xterm/xterm-359/precompose.h b/ports/xterm/xterm-359/precompose.h new file mode 100644 index 0000000..661bbb1 --- /dev/null +++ b/ports/xterm/xterm-359/precompose.h @@ -0,0 +1,11 @@ +/* $XFree86: xc/programs/xterm/precompose.h,v 1.1 2000/08/26 04:33:54 dawes Exp $ */ + +#ifndef PRECOMPOSE_H +#define PRECOMPOSE_H + +int do_precomposition(int base, int comb); + +/* returns unicode value if a canonical composition exists, + otherwise -1 */ + +#endif diff --git a/ports/xterm/xterm-359/precompose.o b/ports/xterm/xterm-359/precompose.o new file mode 100644 index 0000000000000000000000000000000000000000..2339fd09fa77a12e362d63548d9636814edc5559 GIT binary patch literal 16872 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 +#include +#include +#include +#include + +#include +#include + +#undef CTRL +#define CTRL(c) ((c) & 0x1f) + +#define SHIFT_IN '\017' +#define SHIFT_OUT '\016' + +#define CSET_IN 'A' +#define CSET_OUT '0' + +#define isForm(c) ((c) == '\r' || (c) == '\n' || (c) == '\f') +#define Strlen(a) strlen((const char *)a) +#define Strcmp(a,b) strcmp((const char *)a,(const char *)b) +#define Strncmp(a,b,c) strncmp((const char *)a,(const char *)b,c) + +#define SPS PrinterOf(screen) + +#ifdef VMS +#define VMS_TEMP_PRINT_FILE "sys$scratch:xterm_print.txt" +#endif + +static void charToPrinter(XtermWidget /* xw */ , + unsigned /* chr */ ); +static void printLine(XtermWidget /* xw */ , + int /* row */ , + unsigned /* chr */ , + PrinterFlags * /* p */ ); +static void send_CharSet(XtermWidget /* xw */ , + LineData * /* ld */ ); +static void send_SGR(XtermWidget /* xw */ , + unsigned /* attr */ , + unsigned /* fg */ , + unsigned /* bg */ ); +static void stringToPrinter(XtermWidget /* xw */ , + const char * /*str */ ); + +static void +closePrinter(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + if (SPS.fp != 0) { + if (SPS.toFile) { + fclose(SPS.fp); + SPS.fp = 0; + } else if (xtermHasPrinter(xw) != 0) { +#ifdef VMS + char pcommand[256]; + (void) sprintf(pcommand, "%s %s;", + SPS.printer_command, + VMS_TEMP_PRINT_FILE); +#endif + + DEBUG_MSG("closePrinter\n"); + pclose(SPS.fp); + TRACE(("closed printer, waiting...\n")); +#ifdef VMS /* This is a quick hack, really should use + spawn and check status or system services + and go straight to the queue */ + (void) system(pcommand); +#else /* VMS */ + while (nonblocking_wait() > 0) { + ; + } +#endif /* VMS */ + SPS.fp = 0; + SPS.isOpen = False; + TRACE(("closed printer\n")); + DEBUG_MSG("...closePrinter (done)\n"); + } + } +} + +static void +printCursorLine(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("printCursorLine\n")); + printLine(xw, screen->cur_row, '\n', getPrinterFlags(xw, NULL, 0)); +} + +/* + * DEC's manual doesn't document whether trailing blanks are removed, or what + * happens with a line that is entirely blank. This function prints the + * characters that xterm would allow as a selection (which may include blanks). + */ +static void +printLine(XtermWidget xw, int row, unsigned chr, PrinterFlags *p) +{ + TScreen *screen = TScreenOf(xw); + int inx = ROW2INX(screen, row); + LineData *ld; + int last = MaxCols(screen); +#if OPT_ISO_COLORS && OPT_PRINT_COLORS +#define ColorOf(ld,col) (ld->color[col]) +#endif + Pixel fg = NO_COLOR; + Pixel bg = NO_COLOR; +#if OPT_PRINT_COLORS + Pixel last_fg = NO_COLOR; + Pixel last_bg = NO_COLOR; +#endif + + ld = getLineData(screen, inx); + if (ld == 0) + return; + + TRACE(("printLine(row=%d/%d, top=%d:%d, chr=%d):%s\n", + row, ROW2INX(screen, row), screen->topline, screen->max_row, chr, + visibleIChars(ld->charData, (unsigned) last))); + + while (last > 0) { + if ((ld->attribs[last - 1] & CHARDRAWN) == 0) + last--; + else + break; + } + + if (last) { + int col; + int cs = CSET_IN; + int last_cs = CSET_IN; + + if (p->print_attributes) { + send_CharSet(xw, ld); + send_SGR(xw, 0, NO_COLOR, NO_COLOR); + } + for (col = 0; col < last; col++) { + IAttr attr = 0; + unsigned ch = ld->charData[col]; +#if OPT_PRINT_COLORS + if (screen->colorMode) { + if (p->print_attributes > 1) { + fg = (ld->attribs[col] & FG_COLOR) + ? extract_fg(xw, ColorOf(ld, col), ld->attribs[col]) + : NO_COLOR; + bg = (ld->attribs[col] & BG_COLOR) + ? extract_bg(xw, ColorOf(ld, col), ld->attribs[col]) + : NO_COLOR; + } + } +#endif + if ((((ld->attribs[col] & ATTRIBUTES) != attr) +#if OPT_PRINT_COLORS + || (last_fg != fg) || (last_bg != bg) +#endif + ) + && ch) { + attr = (IAttr) (ld->attribs[col] & ATTRIBUTES); +#if OPT_PRINT_COLORS + last_fg = fg; + last_bg = bg; +#endif + if (p->print_attributes) + send_SGR(xw, attr, (unsigned) fg, (unsigned) bg); + } + + if (ch == 0) + ch = ' '; + +#if OPT_WIDE_CHARS + if (screen->utf8_mode) + cs = CSET_IN; + else +#endif + cs = (ch >= ' ' && ch != ANSI_DEL) ? CSET_IN : CSET_OUT; + if (last_cs != cs) { + if (p->print_attributes) { + charToPrinter(xw, + (unsigned) ((cs == CSET_OUT) + ? SHIFT_OUT + : SHIFT_IN)); + } + last_cs = cs; + } + + /* FIXME: we shouldn't have to map back from the + * alternate character set, except that the + * corresponding charset information is not encoded + * into the CSETS array. + */ + charToPrinter(xw, + ((cs == CSET_OUT) + ? (ch == ANSI_DEL ? 0x5f : (ch + 0x5f)) + : ch)); + if_OPT_WIDE_CHARS(screen, { + size_t off; + for_each_combData(off, ld) { + ch = ld->combData[off][col]; + if (ch == 0) + break; + charToPrinter(xw, ch); + } + }); + } + if (p->print_attributes) { + send_SGR(xw, 0, NO_COLOR, NO_COLOR); + if (cs != CSET_IN) + charToPrinter(xw, SHIFT_IN); + } + } + + /* finish line (protocol for attributes needs a CR */ + if (p->print_attributes) + charToPrinter(xw, '\r'); + + if (chr && !(p->printer_newline)) { + if (LineTstWrapped(ld)) + chr = '\0'; + } + + if (chr) + charToPrinter(xw, chr); + + return; +} + +#define PrintNewLine() (unsigned) (((top < bot) || p->printer_newline) ? '\n' : '\0') + +static void +printLines(XtermWidget xw, int top, int bot, PrinterFlags *p) +{ + TRACE(("printLines, rows %d..%d\n", top, bot)); + while (top <= bot) { + printLine(xw, top, PrintNewLine(), p); + ++top; + } +} + +void +xtermPrintScreen(XtermWidget xw, Bool use_DECPEX, PrinterFlags *p) +{ + if (XtIsRealized((Widget) xw)) { + TScreen *screen = TScreenOf(xw); + Bool extent = (use_DECPEX && p->printer_extent); + Boolean was_open = SPS.isOpen; + + printLines(xw, + extent ? 0 : screen->top_marg, + extent ? screen->max_row : screen->bot_marg, + p); + if (p->printer_formfeed) + charToPrinter(xw, '\f'); + + if (!was_open || SPS.printer_autoclose) { + closePrinter(xw); + } + } else { + Bell(xw, XkbBI_MinorError, 0); + } +} + +/* + * If p->print_everything is zero, use this behavior: + * If the alternate screen is active, we'll print only that. Otherwise, print + * the normal screen plus all scrolled-back lines. The distinction is made + * because the normal screen's buffer is part of the overall scrollback buffer. + * + * Otherwise, decode bits: + * 1 = current screen + * 2 = normal screen + * 4 = alternate screen + * 8 = saved lines + */ +void +xtermPrintEverything(XtermWidget xw, PrinterFlags *p) +{ + TScreen *screen = TScreenOf(xw); + Boolean was_open = SPS.isOpen; + int save_which = screen->whichBuf; + + DEBUG_MSG("xtermPrintEverything\n"); + + if (p->print_everything) { + int done_which = 0; + + if (p->print_everything & 8) { + printLines(xw, -screen->savedlines, -(screen->topline + 1), p); + } + if (p->print_everything & 4) { + screen->whichBuf = 1; + done_which |= 2; + printLines(xw, 0, screen->max_row, p); + screen->whichBuf = save_which; + } + if (p->print_everything & 2) { + screen->whichBuf = 0; + done_which |= 1; + printLines(xw, 0, screen->max_row, p); + screen->whichBuf = save_which; + } + if (p->print_everything & 1) { + if (!(done_which & (1 << screen->whichBuf))) { + printLines(xw, 0, screen->max_row, p); + } + } + } else { + int top = 0; + int bot = screen->max_row; + if (!screen->whichBuf) { + top = -screen->savedlines - screen->topline; + bot -= screen->topline; + } + printLines(xw, top, bot, p); + } + if (p->printer_formfeed) + charToPrinter(xw, '\f'); + + if (!was_open || SPS.printer_autoclose) { + closePrinter(xw); + } +} + +static void +send_CharSet(XtermWidget xw, LineData *ld) +{ +#if OPT_DEC_CHRSET + const char *msg = 0; + + switch (GetLineDblCS(ld)) { + case CSET_SWL: + msg = "\033#5"; + break; + case CSET_DHL_TOP: + msg = "\033#3"; + break; + case CSET_DHL_BOT: + msg = "\033#4"; + break; + case CSET_DWL: + msg = "\033#6"; + break; + } + if (msg != 0) + stringToPrinter(xw, msg); +#else + (void) xw; + (void) ld; +#endif /* OPT_DEC_CHRSET */ +} + +static void +send_SGR(XtermWidget xw, unsigned attr, unsigned fg, unsigned bg) +{ + char msg[80]; + +#if OPT_ISO_COLORS && OPT_PC_COLORS + if ((attr & FG_COLOR) && (fg != NO_COLOR)) { + if (TScreenOf(xw)->boldColors + && fg > 8 + && (attr & BOLD) != 0) + fg -= 8; + } +#endif + strcpy(msg, "\033["); + xtermFormatSGR(xw, msg + strlen(msg), attr, (int) fg, (int) bg); + strcat(msg, "m"); + stringToPrinter(xw, msg); +} + +/* + * This implementation only knows how to write to a pipe. + */ +static void +charToPrinter(XtermWidget xw, unsigned chr) +{ + TScreen *screen = TScreenOf(xw); + + if (!SPS.isOpen && (SPS.toFile || xtermHasPrinter(xw))) { + switch (SPS.toFile) { + /* + * write to a pipe. + */ + case False: +#ifdef VMS + /* + * This implementation only knows how to write to a file. When the + * file is closed the print command executes. Print command must + * be of the form: + * print/queue=name/delete [/otherflags]. + */ + SPS.fp = fopen(VMS_TEMP_PRINT_FILE, "w"); +#else + { + int my_pipe[2]; + pid_t my_pid; + + if (pipe(my_pipe)) + SysError(ERROR_FORK); + if ((my_pid = fork()) < 0) + SysError(ERROR_FORK); + + if (my_pid == 0) { + DEBUG_MSG("charToPrinter: subprocess for printer\n"); + TRACE_CLOSE(); + close(my_pipe[1]); /* printer is silent */ + close(screen->respond); + + close(fileno(stdout)); + dup2(fileno(stderr), 1); + + if (fileno(stderr) != 2) { + dup2(fileno(stderr), 2); + close(fileno(stderr)); + } + + /* don't want privileges! */ + if (xtermResetIds(screen) < 0) + exit(1); + + SPS.fp = popen(SPS.printer_command, "w"); + if (SPS.fp != 0) { + FILE *input; + DEBUG_MSG("charToPrinter: opened pipe to printer\n"); + if ((input = fdopen(my_pipe[0], "r")) != 0) { + clearerr(input); + + for (;;) { + int c; + + if (ferror(input)) { + DEBUG_MSG("charToPrinter: break on ferror\n"); + break; + } else if (feof(input)) { + DEBUG_MSG("charToPrinter: break on feof\n"); + break; + } else if ((c = fgetc(input)) == EOF) { + DEBUG_MSG("charToPrinter: break on EOF\n"); + break; + } + fputc(c, SPS.fp); + if (isForm(c)) + fflush(SPS.fp); + } + } + DEBUG_MSG("charToPrinter: calling pclose\n"); + pclose(SPS.fp); + if (input) + fclose(input); + } + exit(0); + } else { + close(my_pipe[0]); /* won't read from printer */ + if ((SPS.fp = fdopen(my_pipe[1], "w")) != 0) { + DEBUG_MSG("charToPrinter: opened printer in parent\n"); + TRACE(("opened printer from pid %d/%d\n", + (int) getpid(), (int) my_pid)); + } else { + TRACE(("failed to open printer:%s\n", strerror(errno))); + DEBUG_MSG("charToPrinter: could not open in parent\n"); + } + } + } +#endif + break; + case True: + TRACE(("opening \"%s\" as printer output\n", SPS.printer_command)); + SPS.fp = fopen(SPS.printer_command, "w"); + break; + } + SPS.isOpen = True; + } + if (SPS.fp != 0) { +#if OPT_WIDE_CHARS + if (chr > 127) { + Char temp[10]; + *convertToUTF8(temp, chr) = 0; + fputs((char *) temp, SPS.fp); + } else +#endif + fputc((int) chr, SPS.fp); + if (isForm(chr)) + fflush(SPS.fp); + } +} + +static void +stringToPrinter(XtermWidget xw, const char *str) +{ + while (*str) + charToPrinter(xw, CharOf(*str++)); +} + +/* + * This module implements the MC (Media Copy) and related printing control + * sequences for VTxxx emulation. This is based on the description in the + * VT330/VT340 Programmer Reference Manual EK-VT3XX-TP-001 (Digital Equipment + * Corp., March 1987). + */ +void +xtermMediaControl(XtermWidget xw, int param, int private_seq) +{ + TRACE(("MediaCopy param=%d, private=%d\n", param, private_seq)); + + if (private_seq) { + switch (param) { + case 1: + printCursorLine(xw); + break; + case 4: + setPrinterControlMode(xw, 0); + break; + case 5: + setPrinterControlMode(xw, 1); + break; + case 10: /* VT320 */ + xtermPrintScreen(xw, False, getPrinterFlags(xw, NULL, 0)); + break; + case 11: /* VT320 */ + xtermPrintEverything(xw, getPrinterFlags(xw, NULL, 0)); + break; + } + } else { + switch (param) { + case -1: + case 0: + xtermPrintScreen(xw, True, getPrinterFlags(xw, NULL, 0)); + break; + case 4: + setPrinterControlMode(xw, 0); + break; + case 5: + setPrinterControlMode(xw, 2); + break; +#if OPT_SCREEN_DUMPS + case 10: + xtermDumpHtml(xw); + break; + case 11: + xtermDumpSvg(xw); + break; +#endif + } + } +} + +/* + * When in autoprint mode, the printer prints a line from the screen when you + * move the cursor off that line with an LF, FF, or VT character, or an + * autowrap occurs. The printed line ends with a CR and the character (LF, FF + * or VT) that moved the cursor off the previous line. + */ +void +xtermAutoPrint(XtermWidget xw, unsigned chr) +{ + TScreen *screen = TScreenOf(xw); + + if (SPS.printer_controlmode == 1) { + TRACE(("AutoPrint %d\n", chr)); + printLine(xw, screen->cursorp.row, chr, getPrinterFlags(xw, NULL, 0)); + if (SPS.fp != 0) + fflush(SPS.fp); + } +} + +/* + * When in printer controller mode, the terminal sends received characters to + * the printer without displaying them on the screen. The terminal sends all + * characters and control sequences to the printer, except NUL, XON, XOFF, and + * the printer controller sequences. + * + * This function eats characters, returning 0 as long as it must buffer or + * divert to the printer. We're only invoked here when in printer controller + * mode, and handle the exit from that mode. + */ +#define LB '[' + +int +xtermPrinterControl(XtermWidget xw, int chr) +{ + TScreen *screen = TScreenOf(xw); + /* *INDENT-OFF* */ + static const struct { + const Char seq[5]; + int active; + } tbl[] = { + { { ANSI_CSI, '5', 'i' }, 2 }, + { { ANSI_CSI, '4', 'i' }, 0 }, + { { ANSI_ESC, LB, '5', 'i' }, 2 }, + { { ANSI_ESC, LB, '4', 'i' }, 0 }, + }; + /* *INDENT-ON* */ + + static Char bfr[10]; + static size_t length; + size_t n; + + TRACE(("In printer:%04X\n", chr)); + + switch (chr) { + case 0: + case CTRL('Q'): + case CTRL('S'): + return 0; /* ignored by application */ + + case ANSI_CSI: + case ANSI_ESC: + case '[': + case '4': + case '5': + case 'i': + bfr[length++] = CharOf(chr); + for (n = 0; n < sizeof(tbl) / sizeof(tbl[0]); n++) { + size_t len = Strlen(tbl[n].seq); + + if (length == len + && Strcmp(bfr, tbl[n].seq) == 0) { + setPrinterControlMode(xw, tbl[n].active); + if (SPS.printer_autoclose + && SPS.printer_controlmode == 0) + closePrinter(xw); + length = 0; + return 0; + } else if (len > length + && Strncmp(bfr, tbl[n].seq, length) == 0) { + return 0; + } + } + length--; + + /* FALLTHRU */ + + default: + for (n = 0; n < length; n++) + charToPrinter(xw, bfr[n]); + bfr[0] = CharOf(chr); + length = 1; + return 0; + } +} + +/* + * If there is no printer command, we will ignore printer controls. + * + * If we do have a printer command, we still have to verify that it will + * (perhaps) work if we pass it to popen(). At a minimum, the program + * must exist and be executable. If not, warn and disable the feature. + */ +Bool +xtermHasPrinter(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Bool result = SPS.printer_checked; + + if (strlen(SPS.printer_command) != 0 && !result) { + char **argv = x_splitargs(SPS.printer_command); + if (argv) { + if (argv[0]) { + char *myShell = xtermFindShell(argv[0], False); + if (myShell == 0) { + xtermWarning("No program found for printerCommand: %s\n", SPS.printer_command); + SPS.printer_command = x_strdup(""); + } else { + free(myShell); + SPS.printer_checked = True; + result = True; + } + } + x_freeargs(argv); + } + TRACE(("xtermHasPrinter:%d\n", result)); + } + + return result; +} + +#define showPrinterControlMode(mode) \ + (((mode) == 0) \ + ? "normal" \ + : ((mode) == 1 \ + ? "autoprint" \ + : "printer controller")) + +void +setPrinterControlMode(XtermWidget xw, int mode) +{ + TScreen *screen = TScreenOf(xw); + + if (xtermHasPrinter(xw) + && SPS.printer_controlmode != mode) { + TRACE(("%s %s mode\n", + (mode + ? "set" + : "reset"), + (mode + ? showPrinterControlMode(mode) + : showPrinterControlMode(SPS.printer_controlmode)))); + SPS.printer_controlmode = mode; + update_print_redir(); + } +} + +PrinterFlags * +getPrinterFlags(XtermWidget xw, String *params, Cardinal *param_count) +{ + /* *INDENT-OFF* */ + static const struct { + const char *name; + unsigned offset; + int value; + } table[] = { + { "noFormFeed", XtOffsetOf(PrinterFlags, printer_formfeed), 0 }, + { "FormFeed", XtOffsetOf(PrinterFlags, printer_formfeed), 1 }, + { "noNewLine", XtOffsetOf(PrinterFlags, printer_newline), 0 }, + { "NewLine", XtOffsetOf(PrinterFlags, printer_newline), 1 }, + { "noAttrs", XtOffsetOf(PrinterFlags, print_attributes), 0 }, + { "monoAttrs", XtOffsetOf(PrinterFlags, print_attributes), 1 }, + { "colorAttrs", XtOffsetOf(PrinterFlags, print_attributes), 2 }, + }; + /* *INDENT-ON* */ + + TScreen *screen = TScreenOf(xw); + PrinterFlags *result = &(screen->printer_flags); + + TRACE(("getPrinterFlags %d params\n", param_count ? *param_count : 0)); + + result->printer_extent = SPS.printer_extent; + result->printer_formfeed = SPS.printer_formfeed; + result->printer_newline = SPS.printer_newline; + result->print_attributes = SPS.print_attributes; + result->print_everything = SPS.print_everything; + + if (param_count != 0 && *param_count != 0) { + Cardinal j; + unsigned k; + for (j = 0; j < *param_count; ++j) { + TRACE(("param%d:%s\n", j, params[j])); + for (k = 0; k < XtNumber(table); ++k) { + if (!x_strcasecmp(params[j], table[k].name)) { + int *ptr = (int *) (void *) ((char *) result + table[k].offset); + TRACE(("...PrinterFlags(%s) %d->%d\n", + table[k].name, + *ptr, + table[k].value)); + *ptr = table[k].value; + break; + } + } + } + } + + return result; +} + +/* + * Print a timestamped copy of everything. + */ +void +xtermPrintImmediately(XtermWidget xw, String filename, int opts, int attrs) +{ + TScreen *screen = TScreenOf(xw); + PrinterState save_state = screen->printer_state; + char *my_filename = malloc(TIMESTAMP_LEN + strlen(filename)); + + if (my_filename != 0) { + mode_t save_umask = umask(0177); + + timestamp_filename(my_filename, filename); + SPS.fp = 0; + SPS.isOpen = False; + SPS.toFile = True; + SPS.printer_command = my_filename; + SPS.printer_autoclose = True; + SPS.printer_formfeed = False; + SPS.printer_newline = True; + SPS.print_attributes = attrs; + SPS.print_everything = opts; + xtermPrintEverything(xw, getPrinterFlags(xw, NULL, 0)); + + umask(save_umask); + screen->printer_state = save_state; + } +} + +void +xtermPrintOnXError(XtermWidget xw, int n) +{ +#if OPT_PRINT_ON_EXIT + /* + * The user may have requested that the contents of the screen will be + * written to a file if an X error occurs. + */ + if (TScreenOf(xw)->write_error && !IsEmpty(resource.printFileOnXError)) { + Boolean printIt = False; + + switch (n) { + case ERROR_XERROR: + /* FALLTHRU */ + case ERROR_XIOERROR: + /* FALLTHRU */ + case ERROR_ICEERROR: + printIt = True; + break; + } + + if (printIt) { + xtermPrintImmediately(xw, + resource.printFileOnXError, + resource.printOptsOnXError, + resource.printModeOnXError); + } + } +#else + (void) xw; + (void) n; +#endif +} diff --git a/ports/xterm/xterm-359/print.o b/ports/xterm/xterm-359/print.o new file mode 100644 index 0000000000000000000000000000000000000000..a1155276d7d54127fbb55b27920c9cde1f18f526 GIT binary patch literal 95664 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

    OxZRqC&`rg?-Ti=0f2g zL-EilaZ}yXW@yI%yoJ^P8e&4w_{4&nX>p@mJDW_Vnf(@|e7f9C1^ehyVJU9wrX_Y^ zyJzoddFu4$w~IxO@Zc@f)$*w)t*oEnM?&2F8@bDt*;dZitu+rHi#!(~UT71c4f zLX^!**T(WF8Ru0bI=Y5}7y7aKrDC)wxUxom<;Ik?E0lLVZBG9bZ2@Z5Pvx3hDoy_Y z=@_uGHv0Uy&KX+$gNIi7Df?xTtdfp*zO>;Yo125i&!a41|B-jhXDr7A=%g$sKRoy_ zNWB9>v`vh@bIRTdmnLubC+UanRv)k0C7nIT{3K=Rv7*$A!?CkcnyzP2D64-k-Jc<- zA>=5IYd)QWp+H?XJV8$32sI7l#~p)T)4f)ruG`pB8#Uc;nE7)u4$opo!toSV>cl}6{ zsQ)a_QH?-f!E35O`4SI>ZEx;|IHxOSPUX)kFr|+lKOU5fCmHnf{nfah%Mx6qqsyXHqmrD9XHsnjM=D<=%f1tsNN9^;ES z`$3qVM4?5oUQ@|9HJD4Aft$nF{9ubbUj&`At$e1^KyG$c|BdN0wVhkmP{Y!S4C+{qpw@qKYbOzwr;s` zOjz&WhV*a}5gj!MfF_7to&oYICHFwDVXW)C(0`eU|>AH6AP3 z%YVJWDEwz-udZb~dT)cUqJH)9W~xl8KEYRR#TUP5+9%4vvP<7cBJ_5oEq^Z}itK&9kov(&33~@f`+&)&%GLH4 zYT#*ZF(fIsefzm0;`zc5kukQjWRo%WPGW~!KkRu$uWslf@zcJvAx7E;!;!SP-o^CH zb`9gil^h%DU+;W`-TPdhvS9?gt0_{TNb3=K7~98 zK5~JxtVXOsd=$cmp5^Lt%+$^7TX`NXOH02Wt7E0 z0f~-k+?dOhQsxE49}yqAUey+-)$FZVbD5XNK?6-f7i)s}AUeZLGmE*BM`ij=vjcYN zKYRM?8m?MN&^LR+urq)D>~D=(11@chJouxdl|rm+x?ANIbmN#eLY*aFb>{pNlJ2@X zRWu9zjYT{hSfAZJfV?7ATV(ld7kQPU#+&p+G5ahhKB%ds?U@(P@%L%sTh|6`fv*hE zCllbt?|UEqL^LlPFKO$@`ZwTw-p&4X(mc1R{Q_rJ$KBccPXjUZ%icVJsPE&%CCACv zUiOarxVi>%kM*c|Hs3P)zIN@F>UU_c-y~K`7B%(#vGit$0Ykm-LHD+GAfji7c_NRc z<<>8wIfUWbB)9Pqe^3&?#TZKihm0D-BuPX=7OgpC5gI<1{(rZmW ztYxz_JFLyBtT+##x157mzECe>r$OPcXzQf0?iY(R-_!nPf9DLaA0i5jdH5vzU!^t>hrr#x19ADB)+`Jn&a3< zk^xaO^=lUAO=@aYX`DqVz8o6Mb4!)5Zyp|b89y5pm>&EjjiIBmf5VndoVw!l>)asU zN-Ou^6hhjCEi|fmKNEE4!m+VnlCC{<*AUC<~Q|TuF9p8$OY!S zEtC24-Y@lw&GbfBnt(T6hn#%QU(<|-NP;C=$6x*k&*@OP-AbhOi75AQ9)TmCGJj0m zi22plj}}2!?~}q?aSNq~TfWF2@7qtYhHvEfagY4l`WC2lj!*k@HBB-i&Dk|V$*2dL zgYw6(nO$9RzX#FQe{oycH}*&~n!(O};sgAC9{)x39F#T8xpDs8{96B+11m{;~v>O!z!Vnz!C#=fwaJq*kv&Z zcoMFWiN{UYy}68Ozyo-O4h$}~@-rzj3Xtkpy zOMNx1Mi$U;{^~sV;WsgtoLxaJd%|6w7w`Dd)cm7fc{^>iUn{=?XB!5T(7eVL6VhV^ ziNlJL!x)0=F}?c%m6Ev97p?>>$1~G>Sj)I@vsb32qVL&;cu1jL;4GjiPp*FaBU&#FsS9I#rF>9Ec@xl2Vt=wkx`WwS6L68LEm|&7ZGOlK zi}v~$B9MGF^y^goyKAWxe6B~ZjmT-!`RVZm@5fxSv73jqV}KH!?qh@G-PvN=59VI= z-MD-2nlQj$vVrJoJUDbzl25t=V^S1DBO=@c_H}hzveXFW_+#ZoJXG5|&pOF`3#?K! z9$eFYBZ-prpDva7anqx3pSw9Ilt$=!p_C@(E8P1&jy-@cu$0u|s}{z&;@He9WKyvk z{yt%6(3;;*;|-c243ptOOts-b?7oZjumbrIj8w)<9MlC&eHjFR4u&}ny6*-JoFui&-n7`0!%9E5SlT|oHz9An)gb;I{f{WYE@BqYs})!gavYeV(W zr}=!s&q^ER@@7Q46F#My_brvReKK{4ndi1hvvka?PvOoX&*<%T5F5(et8k7#BWGJ( z>Za9i_D&!TZDEyWw0sfs(ePVAa7&8c2lXM@6lCm>WyZWsOsz%8jzOnUzI#dKY4t0` zpF?c2#WnNPuhTD$JM(&MMC+`^Uyu0Vv6^l0sP6<#EEVcEi21&fsBLl0v~-5XtjXl< zy*mG>%1~YnUljaNU;EHiny~3DM`bKSBY{@!6Z=`BMv|JIDrr9~>WIZx+!~-jqNccv zdWz#j`YTi6mN?T!*doRWS_^O+?*a`fNaed6vJA116Gk?_wDGzD_se%JR^5Bam#0$h< zkUVS==NkP2?YQh4!BFtSL7Q3NC|DIlnzqJ(g_q_mi5<(Vv(rw2p$wLMh(Upa8fptb z?3_ejbVspf5X{LKPT2ioS^-I%SZul)lAQ2VN(4m-2Ior^*W#o~z(}AYCFgMb?^Z+5 zYh#RlPzQ-FsRL&Tmjg`+=8+S45bTYhDgrYdb%&{Ix&Appq;pDA8YD{5fqKI2!nifx zi@wKlirZL^koqu$g&0Dp=(278MYtlO5R8ZckStgOB$n*X=kU;h%YkH*3i%u#y`!ANM@Pl39yA@PK+#i~Y1Q4Ie% z&_-srjobJ%@w=#IS;S0{(D1+Lf z4WgUl;CX?k-cwz}9a%Q9kqXEJ_O@nTz=8|=mbU}fCY6X{5Nx5Dwc24BF#Sa8sS}1 zh+cgVplgOyd0mdVz!5wd?U?pfBak2gfkX0lBKWO%=hO}u7`}fn=W*1KFxy$w(pTms za&!~f%!g0~>qIcZnkx`|cCl2l!>}B|m$UC?u`fh6DUoTJNp-Lsh3r6(PX3TDcsOhk zLpCY(5+o2N2WY{a1zwcBeYP*_i+L>UB#9q@#g-Iq@kYc#zGzAlRtL#POs&!5%o3}I zFD6$%aEQ*D07 z5c7h@{{*3Pw=g(;jI{sK6W%I%-qiC9X^c=oT8*{N{uxj})+5*u2byU| zlhuUB`HpfMBLPUAFMQ#NkGORrL<++QaP~n&Dk2y`u}Q8wyV54T0PM$LKwHaSB~2!{pfY&w0hGt*#=OSme#PGd(n3|= zyND2g7{)a|cQ|H+yuOz%#dt@5;h+G90lp{5wuBAK3BECZ!?2-qXn{=@DAPmzsI1m@ zuh^ESgb05U_`DQN3#+!)GbwUOE0y?Ho5O-2@4>+! zV8n$&wJPWuWCptC%kj*?BtmsJu{NBmj}xn4{r?>D}1COf*4U&@$AA! zAFr{y|9WNzumGMiHQE<+gJ7Gx9U9H)A&HXf32P{z(wizsPox$?8YBTT3UdWiU|s`i z@S!}L+Q^rP34|>|46$Yu+ba19r=p7fg1eEjW>k1Hb5b11jr2igJLCp}e9b1vYUV7&bW_WFci%vuMH~IxrV97{QFZM(81#z?29rggVN5+(UNMivgOgC)dx5d=VP~$Ux6|tQLVD zb0m(@JD*)~n4H4msFfxY%oQ`($prf91?{F6(g~U2se%@4TUg}R=z`5qrANg062O2d zHZIJ7PMPprif~pub<0`z7iUo$j9Wz{7-LrC)s`7D)kE{ANs3BR>CiFU+KlMpnO&>bhs8%wZn#12nKv4w4qaC>jXi*5WoFS>i~o0 zO3!1kXxK4LQPbXN{hS^ka5RJcbF~`KIK`C&`oKfhWB)}UBs0M-JGhfXt}N&i%h4X z=e+`D4_?LvzB&{?_MD@KHnveWcZe%mzA%bdoys(P*q{@{0of<7#O@1T5qoId-#9>J znNlvaZ#p+m-P<_D&pN?YQO$rK{knFMn2C7id32kQ3ud4B=H(vpR%cD_`9`YH(fesT zlADLK!6a-u1xCO*>zWMztZwg@pPA^E%Z|P>EdB~bUnvNahpnnc7rV%fFiTYCVtWIw zyNIs~>zXJH*y`t>=y9LQl+@3MMMpXz;}8!T0B+Psp)k`1fB;dd*?x&~2zmgKDAlo) z1HFT^gUlw8w0}*JWC)&cgzn7 z$qHZ+#i#*7i8mFInn=}$S8k5`J%|~E4#=x~i=0mEuZW*+$nOjKaa4yl#l1iu<^u%d z9as=Zg*6u<6#ZOjH>(CYQjK7V(^m_AvYUZ2^|Z$r+d-I6LVq(*verxGcpZilnehGMWMB|!DQQ7v%&El^n3>EmE^eznu`F_ME_3a)%*Lk4r_e@RN zqhEMBEXc-CIrABfF%dU(nnMi1%yFoC;U%IgltYK%wDOq9`}i>7BW;cuklS}9!D8_m zAx^Bi`eb;c^cI^pl;+Jx9Q8?9Km5{HoJCG%NP%^eDJNV;mtQ}* zh4NZ|Vu4V;crQIHw1MOO!&lGdO#zm6#FxnzSf8gWJ0*@~R0(Oj$a}C7&lPl4^YeP5 zv^RG@UYc%w5(>ml?Voa<l(gRBlsw89YMFj3I$OCz#_=r_jlJzeitB=) zeUH9dBU^^sIM$*bSAhoC1UifE7KZA8Yn(GoP^=PcXkl8xRuxsv_r5}SuZs=9{*T5sp7K^dRM0Tmf=7X-LBWy_}Jn7G;x7ufGt zRojn>@a*osJ^rCC9mp&-UViOZ2F(MX|G947*rMKJLl!4+DfIB+vW^Q`~!tLu&_MT)}tmko_ZwL0oIk zXiMZ?B3m7`tk*6=_;@+TKL@}uFEU5NkJ0?yU2@5d&=}1Eg+e0t=fNcr&a#M`yAXZk z@b2@k3{`1XlFz9-8N%vmjL=Sn%Q2gKs_?6lmbKe^2p_-5J&(5{T6)-N9>zlGi_vQJ zl;AAgJj(0*?ZGr-*1$0RnspLd$Wj*HM0!9N}2zyC^J%X*#9?o6tUIGBEzWcn$>TssuchGPq?r_Td}51E7gVNw`i@&0#o^| z<>D$omRh+qr|SahR|Gai$co9=JGX>OI3eAVA=x**s!q8Ax0k}_X@d^2w-uweA0Mka zQ+@7GZZLoc3}3=ej%q{HMgsg0-c!|x6O90siP@$xVP5itHNZlTv1nWDFLu8*I)UFu zv5qBwLt}MszP`Ubv6xV~w%k9tr1oNb9eTP%C#xC=Y4PG#I}P=78o4d#d1oBGFMhxn z;i{)!waqUgW@*lj(r`SgPP~=+K&6F1hg9wzm{}aMC^;yypd|d8yYd%LZ&Q) zL@|oD>E28l%SeYCc|Ajfsc+`9zR{;RmQs78**U|Yajf)}|9k!;_tggQ!dv+0N1}j7 zh1X1<*63@~5y4}~f-cUu9R`N+Ilhv=_-%_L0VCU1Gg7N9NA3=@7w{8{mIU%^e#>H_ zQxS&}SklEdi?n?%Jw@-F$dikbN(<0Y0SfkV`h~ZPPUr%$e8q^P;hyf(HwO{;mztwB zk0?47)fM?RRA==*1?;@8Dpud}WF-~PatnTWbID(}qi)Igz_sjK%v{eDU!JPZRN&x= zeBFXo$lSHto>y~arS5s!N*Kc1f{PcuniM# zLZ#a86UyuplU{)F8{)^Kkb%_0I6ZJl8wXxhD^4DlKLAM_MV)zUGv<5L%=R!Wh*)(MbM@PIWF6@a-$OTqkZ-b9$Y^XGjzdnu9%rOY?ewwHrc&gu1SRa4 z*_yGLNE*FVsf)Hwr#N_nw;Pi%QN0LM^tTVsU8$FQmSNZt(vnwHV^;Do8YY}j(&+ok zldB%7MMixwnDZ>v!IB_-lH4f)28@qK7nZ{I_Z)j_BqZbr9AnFFt|j4(J#b^95txT( zy#@H@r#8gWe6=rp{E7ZS(q?DMo5fl;d%U?{AsK%2YtmSe0cHB-R>nc9{ny-};oYcs#@E`30r9Dn?CJ=`6 zWY8=*);?_?FE=E}e8b04zh>_}9kEe(EKHSIeJaoVIp43Fc&YQxxQV9ERNT0UAGXE* zrbRH-?K+e+w9xG+uIQxHHOyQw=ux%-h}}6faf&reV%J>}-H(TXZZ$Z_cydL2)+y^k zb~ujj(kc`9iKa)jn)}^42bHW^E6!DJduY5CEdT$=8#IFZ?f>MJUsi(Af)0f-MQ+32 zp`QI8yTT#^aff}UKx7EbO&q?trt?WCT0Zc&5bj(?QQ8rkN5>G6`;fcP0pr7a>~FZN zdKIb4LWpnuFd&V>Bcwy<#t?rKLGUKc-}#>n8(Ejq8#$7l@=ugUDD-EpViLbUSE!(b z!3!e;K)h^5xD~8M9*jqg&qp zD6`_#H?Lt__{5Ppa1pl3X5C#IUkSXF|rf2w@xO|J#2_z-QZsO3}g)E*UgpQ0SpEd z2O;!B-UG+iJLOG|gP4X5NG3Fu)0wZL&ang6MUVMt_=b9H5q~@%Ie2g-#$-Uo6;>6JvYu6SL{L-ZRUsV?$v&A` z2ETRITYu2nlszO`D3QRc*cJaL(?JeCsA=EAx4iB`(oi;Ey!uo$!B$((_u`! zqj=A*_=nG;!p4tI@nO8uODfkRxsR>Hh8cTv;>?S6moBwM(;LePef(S!q$YtK;yZ7! zZF@fLg=bbV&8~k#4{*?#3xIj*&XC49md8ntoeq#yW}HT7@zp$M`XEg25#sJJ$r-^Z z&P-jdUj4GB)5Qd`DJjhI*WY<0;xez+TFp1AZmBhCF;+g$EwAu}4ZkPFQ~HEc)d>OR z&|_`UtR~;QG~MJb$xU&)*v%Llma1WuZsx}?c#rH03RV~jw5VzfJWTk6+*(COq*a;i znFF$|L#C->L{k2wq~?%>Zk9={eA?z>VNDi(N67gu{zl}ZOj*mSvM@(7``c6X2sJPt;H`$fLHlEhsq6b0 zCz=-QPl&0r3C?F;-85q2-SxVqOBQ0~`A3}>B^I7Lx7WC~5|F*t9^KMFmx!pY?B|N~ zv5(|B6uWSB2slTXSrn92<|hze%WP|PQzq6SLdATmlmwY6AV#ztHmBG2$674iDFe3QD z(qF!B_15N9!x&ee$e&Sjh@Gm1{Vd1MoM0C_HF?NhYqh(X6F`1koDBtq<= z-&-*BGd-NmCtMNpN(xRYrySAy&byy_ZZ)vJ+YBp#CpqfuJ?CT$Q*GLV?`joV`53b? zjtMk4`Y}{38qu7U$G3s2Z2KwCDzFPJW;{&auwINi6J9vGguU6~n3md_GHD-a1RSi3 z?)b|KR6kfgP`hQU0EN=V8a=7YCN&mwu`Fa2EUBUYKp#Nr05)TaG1w_!Fi11=mOo-?}%oOytdIpttCh z@zAKde;?leTLumHpCjNuW5NILzY_la{IT*M?0@&D&ma9Q>KI^(u#xvaBz&n<-0cot zOrPP(y?a{m20Ii&Zt|#0JhniHvxAJ(fP}9CO2>AFj*XQ9rOLTzj)}=oNPlW(|6)3S zYw$wmgsunvUdnYLBj0Y<@#_27h4JvbaX$#B{{th>i|mh8NVh_Krf}uQe3?`dQB~xp z=$-D=k>YhJJAO?5F>^c}!`nuA>X&e-LGrYqoQ7WGx8m}4jX?%_8RmU~4UW6B;X+?T z$oVra+s-y*%78)%a-4szeTMW^s3kP z)y4C$9Ma|}pCUdotxPI?qVRAf1+`2rE}*C;0iF&O>=CD_vzCN_F)0_u(_5ke`QJ6z<{{+iC|SdFoNt%L6|)?>39oJ01Fxzb}2>M5t`ZeUTasuvEWL{QkpC zr$KVNz^^p!^pUzP!TaJrkf_!%h&a+%)%pv2P+>Fbr;B6Sy%BA7d5-7rsp{FeKONXZ z`u(kbC28=4%LYrVilQfO(5g!|y#VxOI8D18Q$8|&8=Gd|yZEF_rfr9%j1}VH)0Ig2 z%DqcDV(g)?(4R@{glJV2FPI$P58jtgAAPdlaSaQOP&?|I_gwmLvZ`fkes!+rvCtzI z46}(175zJ_;$^cr`;38>&JS*|&dH$#9~WCw-9CCo;Fxce!lP)MA{{#(gWQiDwFEz| z)Q1<}l6@&|6WTD5k?SuCYUqhTUUX-jY-yMH$jiUmIk$3hKdH=kDyh<@rP%*l(T9x^psjN98Gl^r#copG4#qG*n+=KciLj=;Ag_*t0V?9Z6> zrfqW+GF^}-l~qv$Gx%_tC*7TAQU*n115YY2--Q^H(GAJucYo+s>JNR=>^q=@-)u&`1noeQ*8+u|-rJ{0RU-B2!2?#?e zALdR73%Zm-!CzCASVasE_M^*#z!X1I!XI8>J?7sI ziZ0pxFpuoRUrtn3)6%Tu_0uUmeZ7KaDM%XwqqF*C354)^PIB%etR5x^mx889=|wz8 zF;BLg6TFI;S?E=3_Fw%U1~h9sNy)ZE%dbq@WAiiCG2ZD;uXqHYnb@Y!EVv1nL(5x!YhbCwuIz`w%hOccag%3htY6nJGsCK*+u2`kgRkaI zt)M64WCC@f_>4zvyEFcoM+qMl^Y(MR z_QAem<^x#7Yx=PZ!Z@WSO0(yr!Rcc8`rdCVrsw#^mNFju^}Q8x+Q-nBb+R%)F-uuA z&HvTokGDPO`F4wIcuhXWBZLfH`z*UWTl;E?=8*`8zbBLwS@>Z5;Y;y9sjsEjH_aWN z>gSxOy*C46&k{pQ;X`N{a-{+f6r+1?t^(v|VAKHBD#A`2CuYRw(m z!-3!SN^K6IJ!E{Nj-f<^bGh0$rGK1D318INQS9_xb>C9nMr+dABX9Tc-g^vG=h*(3 zmhAQ6fjs;C_z{Ch->c~^qcN!IWZS!3VK%R^I!Mzo zH~b8klWGPf@Nz}e=Uv9Nb4Q(v;rg3uy6lUqQqiAPwCmoKsy;s=(!>|ow3y2T3~Y?> zRL==+CE_v}TK+w+o=E(2Apg5ZoyTS~K6AaPsLvO!U$Ui&DH16E8trnaVe{#`8d$Id| zaJ%%t#Xfdg`K85P0)1dfV~}No!BB1^zsH%O+;)IIQ6b;;zb}hiFBfLL*=c7#xxRe1IuR|&CXmo6{eyqUGM{n1e&J^v`8ze4u4p~Z~f^)^U& zMwcSH@u51|)bW{$FtmuEvNqU4N``E)=InVw(wz8Drg2Sw`?ALRLPZiK!5Y5j6&)^3 z7#0SNsp5;W%382Ln^=Ca!cJ22HnoC6#0gAIz?(Ch`HyZaakr(PV$M#7==1A3GJft@ zw@VUhTVyx#KKOr1yA!CIzW)#Sw}FZjB}FJIR2qp=l18Z%MP#U?Q3I8Tk|A?s$e4tT zNn{=>A(TvIj>?b>8AHZ+&gp!%|MmX)u4k?1Icw$K^J?FH_Wtbg4qflRd)_%;>g;9y z;IqMm(QW#@8z1^K|B{RA1T(v+XO=&+R;;tEx#MukPy5`Gq{MpxTN-5!FPfzoUvb~c z?7;ryue*ZhoKr3sc+6t6&lu^0dn=0zM{0~r%t>f_Bje7Z#1Xa8W3rCT(`c)|yL{9B zABy?OCt?h%I#0E2>F3#BN`AzxA0wxgOda<0^1Ypnb7Ib4c1V0!a=vT3J>Ibzxz?>y z9Oh2(e%d2NeUg3a>me1!ZxrHRy;r(Aw$0-O_G%Sd4YI0d8%LS>T%Gy(ed6hd5$ms~ z-!41s{3OEC{HEijyPd9?7oD;`I=yMB;?I<&BlSj|>hirX=;5Ffog~V)oN*fI^JwkF z@Kf`BOJ|jex>`C_M{IXr|J^&uF`(~@XRl{|JNR(PSd9y1J+7YKwfNe)yroV~0}I#L zm!2(%dbhD+SN+uZ1k2jsF;BnM4LcKb>+Vi4*LS7kkL z;wIEI^PugYOPxPn^V?k#ax_kHU-^o86;tfj-nsN#R`=?eGX1VMt@^kweJ0oO#&gS} zITs5aZ=2B|A9?SyyQ|zI)2-KM*HyJu+2w!HM--KQ$u6}|ALn-qtu4OJH0e>MGv$Hu zljq6$CIcR)937`w*1C9IRnL}1J2lRD4pProeDo@(R!MnGE5({oN~Is-t>jg76AFj- z$}7Kd*Lir>>}iXv>W_Nmb?Wx$T8C}pZ_LWLzb!dTuYXCe;MTQc)m4t^sePZE*znVR=C>mOT5e6nI>}`%bU< z)4w`SbZ&Zn{$<+we(KzJm1vC#HtW0dMAkLSdY4ke9r=rP#@4x>l+JqFqTIeLqJ#Rf zDGxR*eXQB>d1b$^a?gepei%BdcVD{$@=9m=&hY!(>fV{hiia=7ZR(;jCrD9i+QmgD zyY(n+3^tKJ)Jehp%=e+k_eYr(&e)!Qb>dOe{I!AFjZz3*k~qnmbC_^v3r9o*3BgvG%Hb2jyN7^8L2W_GI|R%z0SSwW4%wQP38 ztvqkrd3-TWfL~>p2cO~8HeYtg3xk8PUWlpl@7S9WNlHaepn5+4Gx_yq;(Zfw0 za{|>5Wan(z=J$M6#|>?irx#xCR@bI$;O;#pHs)#FI(unpF0&qY@aNNp*`xeqLnMc6 zT%MM$JM7`MTH{3P;mIm%Uu?WxcftBmvPN8=zO?~chgF?*)LGoZyd>q=+~A@tb)WO9 z;|uB%4;4L_-E{fWUKv~Oj6i9plauC88T#Z>`qev|C3U9kUby7+EYbPNAMK5HsCw^C zzx&f(G+b+q(b4Kn%Q}6VnBB2>TiX{A?XP(}(|TmOc>nWmmRr7_eiGlZ-^el2M(+8c zZAaQpQERd8Z0U{chpRW2UO9I?EncU`(d3gc?+Q)VH;z#HB7Gx0?tuL&*_K-y547|i z)T3c+H^o8zBBK)14*5gUdZzzuA6=WGWw}1=SIM3;rl*gGNsH7?->+0I&*>{EdKhv* z?z*F-%Grz%jT3D(<~%;t?&GIxW@DZPYnZ6y-z+gGuoXFCJq?9KKi$M3i;DUplc60*y{ zXSJ2oNZU^jauzq%C6+DqsMWc$q_;*{X|C_kAlb~1$#49d8XCi9zn5(nKYyKy+*pGy zeU{}_uK6^?c#fe+P0l!L4rZ|}Dl6>HI|cg&LO>l@c6 zTQ_*w73|t&^2_$8rD(bNf%Lq+MQSs>f*j3Tg{MpIYDgI^3fsI}6e%(Oy3D{V)zPOL z=4cP;b@Wn@MT&}h!L=Lf-Ch_KJ&VaJxwTRIb@yZ$(|1$HRF3L;G^fI>+Br-Ane3R? zmH|t?zcY-iD(|nUwDN>QPqWy0r*gWL8me~)>^yeZlycv89yh$ZxvE*sc$!!hId-#? z)tP6?3+@}JHntpdq^(oL!WnP!##ue6DOsT1`)2;_`i&W~s)ZTzTI(Fhb*(PAc_iw= zkErPQFoh0D5d$9YO|0q_AGjEWU_b9UBv#n8U;>NV{z$+kP8RgnHG;dse| zNuu@^?ibU%+YMYGyD*{p&?6TO8!J_HO|RG0A6-sfQ{47OJF?5$R)?+Ms65nJuYF_B z@=u==Cm6dnF0!4u*W|K&Uz?)1_1Eo=snqIUHZwc#Cvj=i_yDE4;hx>3Mt={jH&`p@ zck@}tzDklZV?4 zN|o1iDaee;yt3+N$i`Pgr@qfNd${dvw{GoM2RUYpE_=M^)QM-hwhQA-&g%~u9ejKJ zuL%-4kr|V1e=HA)x_@GI_>gTkwHEJQX`oS3Gky4+I4cRMky4@yGn1#+gqO`7X!%HH zZQrF^hv+(P$@T5vI3P>9Qd4K{oXqzNChZthsB*jC&9o5};R|ZsK7JC}V@u9j^%a%v zvmbJ=&izuU7@l6+$;RrluhR2RaXPmvk0!n?Zfkzk=9p9;53eITG-f@D8#K7J+^&Qq z&!R&;uN#;tUcA+Q^oOh4`lS@kOmH|9KVyxdo#)6&b``5?l~a=)4kfrtZ@Pt#Rr^5GdDru}yN`lQ!S(-z0# zG?eyyst(zH?sL<_MVs2zPE&4ua^EViH@hqP&e%RQdFSfN!y$>=51mLI-b*TfOIo(0 zLAFfj*p~ zp}I=r!s-Vv?*DLaeZGgXU$>El{s-#wKV5j}ShxCQR12AbYsMy=8I!)I;=sn}fW&Tx zbDEz2Dmos @Nl$Wqw|*Yeb7JJ!2+bU*y@!lG?wDwn=?a~}7ux0>16YoP}+*1cR2 zpV`^=l7#2oUIPXX8C5m=Rz&IT1;4Wsi@%@fH0*xO@oBm(X6r3jADXE==W%9aSgQr+ ztj^?QMs~ew71yI;xl5o^#FP2!j;*|AYwR*oYWWuL4e|FZ8&?+iIG-p@md}YiXQA-5 z_F0kbWr=(1bu{|x*qW&(dW2>E+%q+7)EA}H38(L9II6tpF!HAUi_1R;Mrw5Fv_R3V zQKYHm&|+_U&)dE7UfrAFPGH#*x+bkFoil~1WsU}m_x{dLDD@g@rt3tF7pTGe3o z)Pb$HA9ZVZ)WwpOjV3Rotj^svm;Dj;HuKa}-=wPrFPaLw$=N#v zhHX;6oufL{DZY5`=T6sLtCJ>cH%PZH|5ZC&C++nvgO0o8>^^#{soA){dO7)aR->C< zzg}G*tPqX#-2Wk-XoSsB|d1 zFrNE9MR*=CztKd7brf?@jGpKnLen-?gTj zdTuUFC>*_bzGKkyo{HNm_l4UGxHM~3#ga8cUZ20Q!0r5LujI6yzCm%u58KXa?B`{n zY_}v~>kw0~0_}ziu3h)-_`G+~uif7==jklzKfc#C^9ybssU07FS^T5cPj$G;PWk8+ z-BilY?Qjkb?!IwR_}WGD-D|@33~gM!#kI}yp)E}he)5gZe6lgV&%1(m>2ErnsTt-o zaOvn(=Lfn^@$5TI^-0S?n>*>~#<|;y+*W=riT=54(2uHXsgvVnt|x}LE_nX+qfXg9 z^^-QoY+GhttjV|<9;Use*wW+l{Cirrqf>J8Qrnuk$ki{dNYt!$H@y(q?rXin@=^D# z8qd^u_HP>T@$H&Y;rG-oO2!;i z-nL@$pvy{aR6KNMNe_y(y;?fr_v;lE?T2-fUSV`eYWR|X^}jmq-XobiS6O}Mlj^JM z-i%$jeQtx->4c=`x3wKq?+jAgan;F7wc)C&_1!n^5=^pRkN4V^J-g}Bpr&cns-0Kf zuB+XtR-TeNT(x$C%{{qkDpeQer)J#DpPjzMI{VbjvH`vA^u~L%?HSp^a(e%@s%BDO zR#Y6x*tOoFc%IIHgS{=Z11@MdC`a$?RJK|5d2%8%{`Il4&uhjT^*4&D zzYy)Xwfea4nF$h0{SUU&cc}C`Fy^Vn_5o57Hb1nz-}(hiGwYeRRXIQN-RyR;XFH8u z-`PWM`;we7nukp{dPkg39QWq?8|Bka_x~8ZZoX{hYze=$OJhyGJzBIbt7j*NK!YwV zhrQH|bv^sxz_xI!2U|vzWLbyoAC<0I+`ZSVjHOLS<|*&Yj9ruzG$8HS{ja6#jUv|^ zyS315*Ee0uHOh|`kDit4Bp+TCIS_Mee>?$J(tn%#n^H^+um2N#APKJfa%5XUi+a|f6>Kbcj0qI<2>Io;K6 zy4PKf7;QQpThS+>@vgUbzn>OAe!DG+QZwo|t#Zycw}riB^mDJ?Tj9_medrF~4TIbz zfA$VLb0&MaQ-qBC?JtT?`gW>Vff z&`SBLSNE-6ky(9SI4@qk;+^4?DUTHn&WhxoaCequ)<%$^Bvmu4=E+^N|86cG$bxtic!r{?ZDXT{X37Y$AH>4Tg8XlWfx637Wx>DCe z-4<>A*k$^Lk6%|*Mb&((-aIGgaKbZ*Tj8S$OQ8cjmtPUNcXd@mcdFkk>})nKv*)|Qv*ru@&TO`6%H1|9rS)S~Tb;F*sqcT^nx=N(dh~@r zgRODg$9%`!*uKy#LU(KXqWf1;GB)?y^!nM6i^(Y)^go?4_Oq`#J#Jd-#IsM!p17ai zxc*>6#^tdyH!W%Zp}bzgRTO%pJh0cP^3)eGdVZzphDUw}mt>^41e`go8Z*W1bIZ3g zzTBEHC-eO9xK=kSPVJqRn2`PET!n?gdNY;ZhmA4!ujV(+x>+lMGMX77#( zU1P9sn05YJ?^GA*(9zcdlT(&@w_USC@zdmW`SUVoM8G zyR}^%&KdOZ$-kX+Z}7vFj}&F~6?VKxGD*+Keiw7KZr!YV${ra??Q-j!4L;_Lxjx&% zbtiHth2AqkF&0|od!%El_TT3YVPiSN37oKp4|WC{LjUctFkh8nME7> zj&!Ti*xd7bx0PN!8-M#q49?2A{>^p6wViFuD~ggbPZ~@PIC?A9bA#E-)vt^9>MWA% ze?nPiOa7}(4ugNFysQ5z|8<9UQ&8osbtMgRipM{hDisxdXwk*nRTn1qU*@p5Rp_vb zOZ2|C+t}l4(z$cD>xtEbDgDf>eVZ1gzw|v>(qU~);m0-K>WB4T8eLsP~Ze}33`am0j4>$`N3uoT^TCSx>K`D)m&C66R6<>kYnK1CnR&G^QabnNy~JZVZyhrmuH*-J zXyhOCdEq$x?fpr9DTUpV3gSm^TJ-$5(X#sA-=hh8R`N%=YNf?hlw z5py;n&2#FQ3#n~ZJ?-%;L4K$0j!r`pPqq1(Br|?V(%c*dDt4g&o=@hRdj}h8O$x&(6{MJOvv%x^}{TSe#|J6l9FGzZNNF11)`J! zMY+Sd{iKezoOxZzuYK*?%HY)N2ljQIdD6?#HPZY2nPipXBAaW+@@&mlC+}1??4Pw$ ztM8q2Uk_R5WFD#xGB{}-w0xOI`}kFZ65gCll|K3DtNw}JOD&}?8ya4%w9Ko%ed}l5 ziFFH3&RDUr;{LanW9NIR+>tZ)v5=i+z9G)^po4y^XSa?#a^8NUueWJSjr-dh?#Qia zJ!x(KEmMEre9-e|o09J({?>Jgr)S+PcdI+K>$Ok6!usXo#>^^c+Ot}3h+OTi1utv7 zt~a`_-JCWccDT-fibL&J-jBcS-pb}mn8?Y_Zh&Slr(q*?HBC$mO$?1i{Kr8xxgY+E zIyvV)*&$KH8+$)Ug3jeQ{GO{bV#9KMmVu3i)M;)+#7W#qq;Rm5FBMRKr$+CnL=IP;|^w^C3W zOeJc|{rWYf9ZI*&b*I4e;mu2-t&f6ibG@6trJJKD-klWM&X<&QYo#D-&wm_*&&!-1 zr^^4HJ9u*?vuzf^{K&3|SuELby4B=n`BGGmT!P?}^u4Hu8)lJ0cA zJcw{ACE~u@_#cN+0a!oK)oN%Y9>UWR!1sRDgeMXjG)g!#^@KKr}2W zI>JBPVMb`Ii2H8iSe9eV^w8LV5Ox+Z*>`%t^w3GMA-21P~2`cC5t z;~T-1iu)Gi&_9nK9qZ;F&Rt3r%fT94Y(S$Z#{S* z^`9@`D|-o7mf|M>?qKz8LjzI~T$>Lzcc_EEr1h^SxE;-RX5h1FJs1G)L*vvD{3uN- zp5Ts@-Vgj9zc_P81h@>p=yAtP@I=1i+_4QjpZaY9cq+xQ4BVaKa}T^b%_q;mC(-z7 z0I#Ng@*BK0wYxmUo3+;jO4kv5DaE-5_{wfVeJ#L`({+b|&oL6xj|C6Y55j>9;qAuVYTMFs*!E5NcY+uLnZ=)rocY^e7=zJu2FfFhF;OzCZso+;>p-uu% zrRy#Sm!|QO4&F%pBpck1)`gSc+i3l|0sfuFQ8joY%>%E&^(b!N!P!1Qmc{{#=TDjk zI)HDbxM_p4IGBQmP(QQ*&!+QX;J>JRr=b8r~c03??czM2QO(W^z-517btEa;3ah3IPj6Q zekFsKQu$Ydvw3DKcmd5nx!`R6$p@d&RVe>u@PoR7zX#t;>&P$gpUOgddFt;hZi8sO z?gV~?^6v$%OZx{a@JKrM1ZVN|2WRn&0%!3|1ZVMF2F~KS5uC+yH#mzYTmM-cSUev< zdKS-@;4GeBz*#(7P@Gu)!zs?n;4Gfq!JpH3u>fcBbOLAbWY1gKby++EAU%ucRB#s0 zBybkb<=`xy>EJA$XTe!KuYtmRIE$w&J&$B@=t=uJ4R97u18^2k zOK=uXXK)rzZ*UgRKyVh%7;qNPx!^3GyTMsJkAky!o(CUF^JF==1w9e30cY`i1D>QH z#Qz64Yp+&(;JJgve<|hP4V=Z_2%N=#AUKP^3pk7a7;qN3%*f2M=8 z^6v#_nJ#@*LiSOuX1o!uNrW9+7Gm#eL9OL ztCuo3t5-L0Rxcy)HMGAP2(C=~XIJofv;hqOXK|Pc&f<^+&f>5foW&s>oW)@;I4l2g za8~|{;F`3Lssd-_uLo!4{|3&=FGF!+?ZV2h0?zuU7C4))Ou?toxidH`r#Cn&XCOE$ zXAC$i=Unh8+8?HZv+^GWXZ`RzIO~Vy;NNK8t^sHJ|F_^8G|#l4$FVrGI4Fa&ICKMN zaWDdBaTo}`n${H;a25w2@b^81d1ER#D<@m8Sov8wmqU71&UA2A&b{EQoX5dgIWK@W zX$s}M1#Ut8yB?gCpS2s7Uq(^Lk2x#93OFmj7C0-v2{EB`6*$lgM{%E4JVYrt7K-+;4n{s3p?l%waJtX)`~Rl!*~ zb--D@T)qEVb0>C4X&dn#K#hx#m5<(#m5_*#U~J)#U}=w#b+)!i_ac#Jp-Yf zXTVuGuY$93J^*LsdY{*BZSeej{*J{(<1EoG#$&=yi=T;OupPU~smN zjRW7IE%dA9;H+KJ!CAfbg0p%Z2WR!V0M6=l6MPY^zmLILz21Xwpx2pYsNZ3`sDQKb zYk{-!n}D6NM@!+iAE&^xogJglTad!yZjK*(wdj7=f#ma9C&dP5M&dTo!&dTot&dMJG9@|Tp z2jajxY6zYTe$G_zHQ=i#eKt6&*9mY|uZ!TUUbnzmy`F%xdc6m?rq_jjfd`Pw)4a~& z&t8X72e+m7b4|fny==f)IfsFdr*S}Gw7JpVAHE>p*9^kAzeZg6IY{93~bv?lS zsNed6%hBt7ap0_+$>6M|-_jL2 z#3yh~Gr=X<=bpGzJ_M}33gE}+^@vX3;k2*l0bWM$hna#urO$_0gICh}I262z#`7rf z@wDDd1pmedkUJv5gDDO(!B5lk$A#e1CPF@|!S!gIZUHx>ePlNHUdsO%cu(?k;6G@- zx(0rb>RSo^#z-h<9e5(uw*kB})$14dr9MJFt?2r!A3mY<9l&4G`)=LAtLb$RLvVZA zzYPG7qj{2j-ilp!CBArYXi>OcMSMm>i<)~=TQHj4Ze_k zId~M6b1!&&3!$93-~;J-M;Uks?Ux>bk0Do}^@_!feQw7Dob`WeaP~Tk3;1_qp`4?^ z4^cS-!H3Z6QPJSsccL{PN#GZ0pO6BsMB{TKxE=MYUEq>5j~xb|ME$=A+@0!m6`Xy3 z>;ZTb!%D{7J-*OjxJZZhw+CnMi|c^*loQgMf~(MYu>rTDd2l#*D%E!actZzK z^D!BGDD|s&aQp5;`laBfDSaxq1hq>#ct>d=pWWb(X*?bVPpA3w4ESkUU&_E$X#a2* zoIMYG3LZh@;vM)zYR4bow`rY~q3f{rrS2e710O`|qb~RcJyG*v2%gtg@Br{nls*ys zJYN9r*b2_(=l$Spem(`xUMIf zQM>m951{@0Fz^?&K8^*yO6?m8KHp3z=M3AgD;@?NYV2-R^R*l9qwoc-j&*21DwU( z5Zs5#=>wim@eBfwqjez~ypq=O72vgWz6pFH#i1Cy1zq& zA;o|nrFPr`-iaoNVsIzQ{}Z^0v=INU^n8Mq$BkYW7z93?_ARd9>#0AF0dGgoLxaHE z(>fIcevslh7knzMkITRhQ+?Khn^4?$fIHASk_X9*xCPBKDs;=@&*s(c;A~zs0%!B86}TeR*BLyF*3D7ib78H^6bp=u_2LEiFWRqu z2H!*bTS=O4So}RGZi?VNX};ENg7y2;?XX`WmK{)+nB7VtFkec*d24ky5;Pu z-$IDNfzKAXx(%KpG)QQ1pi9;`+>iu z{uTi~Pe~~MOmIKC?jrC}lusJ?TdMCi@MW}b%LU&|^WbUl4m7Syz}Y;08+;Mf_X&6i z_1kygDSASEe}bpV3ob{$XYJdU_HP})H`4x43;ZR;(-?d=m2)7thNf`cq2SKcue`wn zXuM1U&lIu|O$C1{C;VbI_&r&{Sv*>Cr>(i4u{7_o=XuQgQ2Dn)KD}w)D+Yf?{pT8Z z9gVLl@Efg!^3;Q`p?>uqybHC^$KP6~g;Z2K)n!YbEe%nh!O=J!qaW z0RKw!yd}61wWAmKCqtpW{@{kxz7gP)D9-WV4%BZKg0t6q*MMIWE-Ts!&h~-(!QChh zr@$R(UwR4Lm-<^Jcro?2I`F&n{GtJzea`O-_(j@JO4B;e+V=~^p%=Im^+PA{pVS}R zz(?>Ia)&4Qd)hbpfTz-Y6%78I#!);t`@6Me;Ou?GV(`t>-yVRozYBc{K7iKuFW^UM zzH3SQcNVv{R9|KAt2Dkm!NVzke{lA>jwtXeCPF+D!N*d&E(0&1*E2VQ_capo*#kb1 z@;MLwp88uUcqdwqu7mr~^Y`1}Eyy2$m(%+D73_;ch4-I=~S;b zkiHf5+mGOJ^!(x*xS5`izlh?;^4FmCOC8*U^6v)zo8r?Gd@t>D48Ymn1NQ-M;0wSV z1Hk*yeCPzehx(frcp=Sulfl{d)x?AEr2WGp@X9U#EEHfoIUZ^bGiD zD(6*jwjR9(SD^kWMe8T3n*$I1)s;R3Er@t+9J@|gn8_P4Xa?@)hE z0XL@cwFz97=AS*_LDVmAf#0L~@G*Egty6Eo*?9a3&g#{cwF6h~*4)o`>OcD6->5&B zfcNh&RJcEQ7VZD7!7ospM}kYz{y6}gy}yksVj?z17izLHS> zv*6RI-?I0$SUzKEe^LeMS5tbnzOnQ>TMGGqgY-)DyhE1i&C(yB`1A(ev6e~tnlNc~_ExHY}57!A(iFbAB)VFfsg!)9;~dfu81&f;?doWumt9qxI-8cscc}li)LG z|8oZXB+VNa!7XS$dIx4S0?z*aY81E| z&2N*y^U0&Z)o6a31Aa$Exb6z@Y-*DY{&dcErj zco%Ay_u$Drg!2CazeKMG%3BJ*XY))E?Q=STFQk2SFYsN$!$tkTO*;y|um{(m`D6sR zW_uyMAGi(e*CWBlQh!STe?;k*g8!s(w*kCA)pr*-`#Y;6;Pt(Qa-IX9NB#B&xGwdd zYH$^LAK^84J-y!e9i02mLYfa*E8&*4mmkd=9l%|wziESSQWqX?3Vwy=PaE)B>LM(_;U&qxmx>c`q^6t%k&xIC3#6P&%zVhG;5vyiV9_zW6fL%|nP zy+(t_kq3d_p!q)*{37+AdEiCVe^!Fuq4Bi^+>O@p9Pne5|0(cZ)Q%?`aC&9o&uD#TcA@ADlIK*Dj*w!xcQ7<|`j?O&WJ0 z;OzV0;=mPXzmyE_OYOKC{3y*cTftvYKgk7eq;}5--$UiU4DQrP)O_3n_oQ~L0~gUe z{0V$t-{x#Yl7ofYKke03IByF+hx$WT@NE>&-rzR$dd&dvO;oQT;EJ@*90guU^M5pW zIL%9Qz}r*3R)B|7yKDwerTS)rv;W`k1o%qI|04KF@>}3_H13{&m$ww+{2ttg=I3AF zxzz6Rwtu(RMT$=+@M9F`Uf}wzg~#^;chMBw9z0%F@DbqUv~K!=52iRof%vm-t+Xy|0KY6DlxG+CFIoqWfXjCi(w_q#O!2<~zM1+-HMlCp?KSu_ng_mvkEZmp zcEa`9_;RK=bO1k0<4YU7KeewZcmeIhZNT?XKEuE>_yTapICLs!7ZI`&EDNx3n%tflJW1P6R(l<9ZqR21>sXe2unH z&fVbb{ja0o?0vNJ;Ou?0a_|(I=WD>(_tU)rccAt32l#!8gPh~v?WIR?Rt0}e{Zj{g zJI%L!zz=8&`3?p@PvhMkT#4d59=x@Vkk4fBkL2;-dbCb00)L_>kPOG`Bm_T)c+rV+fsR6f~#u@<@^HvoZ6*@lkj_fTH~|cqAQ#$gJ;sj-3>gt zhmhU~{8mrF2ZGO`dBX*~FI{&GxCymOFn9vhcN%z0s@HsQU)rCq0%xCF%>=(h{bxV; zX6pZ^!Ee$!SPFibp6}cRXWvis3_OPB`H$eKl)uCfA+D^wj?(^35qy0MAzc@6Z<f z!1u@qZU-Jq>+f*z0CHb&_WuP&fVZG|Y!-MAivJSu>ok7XgSVvgJHZoaT{sMWnC8{9 z;0Gw5>);lqLL92VU&;wy4?d3O$#3AdwT1LDLxo#5?ks7&Qvu&X`vfiU;gr7#_%9k? zgTVXKJnshX)L$saSnx1vmr(F4)K8{^Kb95pSpdF_`okLVt~8Fefp?%d9{}G&&ld{7 zXVdsC123cf@O|*zw7x$FKS{3(eFh&y`AE6^-Ck#Ph4Xgc?EiPv0N14FF9zTdR9{Q* zd|DTr!Rx7idV}wzei8`YiPoJt6)&{eyF5SdR1_9 z>Q_48RWuLx0qUlW|Kx$|X$sdp1J1q|^(y#birWM5_B7AG1m8sc>I=98^`92Qh3m8SQlfpAGI$vE zlWyR#R9_?THB`=l=rm4Uz)#csFb16cf7rp`*J%GR4g3|&d-K76Q~XzfPp9;m;P$lN z+YjDE=}&_jP@M0ATTuUh2L7J*)gQra`v~nJG2-ubX+`soBKQYtuP)#oio)ad!Aoc! zumCrpb;k+ZgX%RBoc;ZO0Qd~5*HrLW6QMjw;A?5TF9%;haYzT3rgdR2cpU9-OTaJF zJl4|l?|8Dm*JuxZg2qvI@J4;%@q@vC)AR9R;J!LS`f=dqeFP5!FQ;)a1N92tQrt4OMR}0BSFTmZEgkLm**VFSRX)odT zZ2n=N<5dD5O5;uwJdEmP2p*&<lV8|ismAovl=KN;LpMJPu) zI4jRyaQ1ha$H86Lx(4n*<$M9ozNg?b_@D0=9rbs7cF?$P2j0?DNT&gAXC$}*_;s4! zEWuaOICTau?k?ox4L+}(;DO**RRoU#XWtJt7o7F0RB-n9I~m~Y?|1frv;UvtB=`i1 z&n0kcn%{1N_u>aKcRU4W{rm$s>*v40SwC;%E#$}M2Nl}ase@b4c+>^oOY?t!@H|>i z9l)n33)k}mA3)<`I=DRTTb6+LHxu&N2(CuycYzPo6w)6Ce@gRb5%|FVLi(%VO0>>a zg0sI*eh%(I_4)+9koFG}qlN3R_#07r1@IHp?&{!~eTB#O0xzZf&A`u5d~CsY(faES zK3`hMe;oK++V6#eyV3LLIB;!R*XDzdq}Rb#f;-dr%>ZAoDU>H0d>G9q$HCd(0~doU z(7IC&eunmA)!>>G&w6kgrlPOlbA)1wT8t6yu=f4ZM>tmkA4$&_G{B|W3+a1<&!&09 z0{j8x?+7kQ>$@lT3yQxV_{|Q&btAxUNC`d@d@r^8BJdjOKWX4?sJ`34D^-R3bJ1zM zp9WW@@mm63Mf1#U@YfX2C*c0{y!9P;4VCjJI`tnpAECUgeeGzTR0U`Ak`_4oyJ`m`wh#%!zus!;HN1*&%kF1 z*^63^74EROeW3MSo}3RmUnNbN_j-$^=eOW$!ox+z;1o8IHMj?*w*_}39|4|3J_>v~ z`6Tch@(}Q?2q|^OmlA4g3Z9O)=;5 zUq$1(TFm);T2cRh0xnJdT+I2R+@<_~i#eY^`#a)RYY#z&lgi`ibSkUpJpRiVdWHPxHLLSbDxZ9(3J6@FC=};IqhQfJcxgiaB2%7kVC@ zBIbORW^q6Ku}aMO^uK9d+AQXLIge8QTfz5}?-X-B|HIr5e`Jd}pFev(byUpx{6A7Y zC&6!%Ujm;>^G_LgAo&e3=dU}L_Tdl2oWE`!rLO^JuM@r&b3UK>`rJR<(MZl0kI#b5 zd#dC4-*Ww!`{DENN&Q?M`~zKA7hIXvF9UEX@;+kDmuC;PmjyX15Bob8AF=d&dB#yb z6TnB42Z%YJKl^{XBE_7~Cz{engGZ827jr%z_PreQ#GKD(F{NJ!o=m<>%=vu2)4IG) z%=vuMDg7q!_2iji&gWxI^INu<^ZDdb`dsjA@_g`e@*?m8@=|hamkP1;{CJtn{qRSP znDgbarsug&!L7(&gAXNt5AI0*jhvOIf?Q!j^X32a+lk~#;N!^E!4t_fz-N*76mvfQ zzIwv-27|Ny769%@^KAq(x}U_Hzb-5PZ!zcdIZ5fIe7O_u zVDr^+a#?a#&W_~jV(Iz(6KK8b2I;p_z04s!d)>oM%=z+MqWqn}&yu@}Ie*>0bX{*T z=kuwh^kcyvk^7OedR?Y+#)GrJcU~lx4}V>G+VHJ{^d6MY9!SsXdkmblOEEZW_v>QL z*Xt*h|0Z}N`F%0x%lS)(`-eN8khA)F(0U~0$N%>K+FgV8)iQp~{HH&tlFN%ZpZ`t` zAzcSC=gY}n*X;yuOZjMsIiC-UgRYqK`Annq2H+9oreeq>ExCi3 z^ZBrK!ClPxeC|+sPw*?`qs5$`&t145{uuAqeA66HKL06vX510t*L?FQ&Mjzv7!JB)>z>;&7MZ@D%(B`Fn6B8mBG%Ma>7F4<&6rR}^!8i)KjawZ)vMIei~7=hF|Q zUpkTV^D5u&k7(ZTfb`9oaQ_5Dde)z(ia8(8Xo|x$@Nn{(V$NTejjv=e=kv*;^ozk4 zkgo;T;~&Hw8^Jr1ZxM6;x@@1eN6h)8fs{T6+?PC0%=vuS_Y#~Ib3W;IN`D4?4tcSd z^ZBsvF}Nn?d{TS9^KwT8xF-2sG3SYzQB*7Dd_JEk{R{9?@{i;aTw1=LOrd#OVIp_J z9c=x*z~A8xCGfN4-N{)#36xKNNMA+iEy3@S+k<~49|GP;?k?thJdaYnJpaRKT5PTt zyU*8)w%sCDe%|<_yKvK-o{zCDo%aBrLFanlGwIwAJcZ8b<;y?$XOQ=U^jGP80QfUH zw+3&db5>qHTzvUk^A+R{N8#qrb=m6-L&41{y%)FxIlUbCC!gWuw5|K&W61*`ANKwK zA>flKeFS(cc{KO}a`w6utM3Z(1W3P{d@lG#@`d2r$d`e$*BMrVpQQ9_!OxO!0>4I{ z3I2e52lz|!z2NW3bHSU)+3O!HK5~*m!V{2Qk-PxB1Nk}dF65WMdyroNHzY3yHz&UX zK8XAQ_z-e74)|&kHK)|1^t_3CF*w_QzDK8ZlfBNz@?p;-I#XPkv*%4#;OzMzdtHsC zXY=hONY7p;nE}pT&q)Diuj3sAXRnLi0@vg_0Dl<9#7D&XPvmZ6qlMcLb}u?G+}|)Z za7L`iaFTzlzsPW6OpM4dI*LExlbaZt|9xu0o$`+nlF-Sdz=_j>eM2LIqPT3D@B2@j z7#$eL&cdSt!b4+X`JDO3Qj%!@$lyTEgwyEA;Qvh%9vT_Q5^$wqcX{@0J`aeBhzN}2 zN*@^&8))b>Y@|UqY&=~%FvK?~+CL&th|K@5e>J&B^C1^s zWB3eh_P)P zp8kvcIcqKp`vs-n;*{-&~3J*aK{)N)AH-=zv?fN5mK_p z^Y!OHV!^J@>d%MgU*&&9*JtYpm#q0X;? zkLTml{CN63y9pdG+*4*iw=6q$Tgy4SFP?M;Jzm`S` +#endif + +/* ptyx.h */ +/* *INDENT-OFF* */ +/* @(#)ptyx.h X10/6.6 11/10/86 */ + +#include +#include /* for XtNdieCallback, etc. */ +#include /* for standard resource names */ +#include /* For Max() and Min(). */ + +#undef bcopy +#undef bzero +#include + +#include +#include +#ifdef XRENDERFONT +#include +#endif + +#include + +#if defined(HAVE_STDINT_H) || !defined(HAVE_CONFIG_H) +#include +#define DECONST(type,s) ((type *)(intptr_t)(const type *)(s)) +#else +#define DECONST(type,s) ((type *)(s)) +#endif + +/* adapted from IntrinsicI.h */ +#define MyStackAlloc(size, stack_cache_array) \ + ((size) <= sizeof(stack_cache_array) \ + ? (XtPointer)(stack_cache_array) \ + : (XtPointer)malloc((size_t)(size))) + +#define MyStackFree(pointer, stack_cache_array) \ + if ((pointer) != ((char *)(stack_cache_array))) free(pointer) + +/* adapted from vile (vi-like-emacs) */ +#define TypeCallocN(type,n) (type *)calloc((size_t) (n), sizeof(type)) +#define TypeCalloc(type) TypeCallocN(type, 1) + +#define TypeMallocN(type,n) (type *)malloc(sizeof(type) * (size_t) (n)) +#define TypeMalloc(type) TypeMallocN(type, 1) + +#define TypeRealloc(type,n,p) (type *)realloc(p, (n) * sizeof(type)) + +#define TypeXtReallocN(t,p,n) (t *)(void *)XtRealloc((char *)(p), (Cardinal)(sizeof(t) * (size_t) (n))) + +#define TypeXtMallocX(type,n) (type *)(void *)XtMalloc((Cardinal)(sizeof(type) + (size_t) (n))) +#define TypeXtMallocN(type,n) (type *)(void *)XtMalloc((Cardinal)(sizeof(type) * (size_t) (n))) +#define TypeXtMalloc(type) TypeXtMallocN(type, 1) + +#define CastMalloc(type) (type *)malloc(sizeof(type)) + +#define BumpBuffer(type, buffer, size, want) \ + if (want >= size) { \ + size = 1 + (want * 2); \ + buffer = TypeRealloc(type, size, buffer); \ + } + +#define BfBuf(type) screen->bf_buf_##type +#define BfLen(type) screen->bf_len_##type + +#define TypedBuffer(type) \ + type *bf_buf_##type; \ + Cardinal bf_len_##type + +#define BumpTypedBuffer(type, want) \ + BumpBuffer(type, BfBuf(type), BfLen(type), want) + +#define FreeTypedBuffer(type) \ + if (BfBuf(type) != 0) { \ + free(BfBuf(type)); \ + BfBuf(type) = 0; \ + } \ + BfLen(type) = 0 + +/* +** System V definitions +*/ + +#ifdef att +#define ATT +#endif + +#ifdef SVR4 +#undef SYSV /* predefined on Solaris 2.4 */ +#define SYSV /* SVR4 is (approx) superset of SVR3 */ +#define ATT +#endif + +#ifdef SYSV +#ifdef X_NOT_POSIX +#if !defined(CRAY) && !defined(SVR4) +#define dup2(fd1,fd2) ((fd1 == fd2) ? fd1 : \ + (close(fd2), fcntl(fd1, F_DUPFD, fd2))) +#endif +#endif +#endif /* SYSV */ + +/* + * Newer versions of have a version number. We use certain + * features from that. + */ +#if defined(XRENDERFONT) && defined(XFT_VERSION) && XFT_VERSION >= 20100 +#define HAVE_TYPE_FCCHAR32 1 /* compatible: XftChar16 */ +#define HAVE_TYPE_XFTCHARSPEC 1 /* new type XftCharSpec */ +#endif + +/* +** Definitions to simplify ifdef's for pty's. +*/ +#define USE_PTY_DEVICE 1 +#define USE_PTY_SEARCH 1 + +#if defined(__osf__) || (defined(linux) && defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1)) || defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__APPLE__) +#undef USE_PTY_DEVICE +#undef USE_PTY_SEARCH +#define USE_PTS_DEVICE 1 +#elif defined(VMS) +#undef USE_PTY_DEVICE +#undef USE_PTY_SEARCH +#elif defined(PUCC_PTYD) +#undef USE_PTY_SEARCH +#elif (defined(sun) && defined(SVR4)) || defined(_ALL_SOURCE) || defined(__CYGWIN__) +#undef USE_PTY_SEARCH +#elif defined(__OpenBSD__) +#undef USE_PTY_SEARCH +#undef USE_PTY_DEVICE +#endif + +#if (defined (__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1))) +#define USE_HANDSHAKE 0 /* "recent" Linux systems do not require handshaking */ +#endif + +#if (defined (__GLIBC__) && ((__GLIBC__ > 2) || (__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1))) +#define USE_USG_PTYS +#elif (defined(ATT) && !defined(__sgi)) || defined(__MVS__) || (defined(SYSV) && defined(i386)) +#define USE_USG_PTYS +#endif + +/* + * More systems than not require pty-handshaking. + */ +#ifndef USE_HANDSHAKE +#define USE_HANDSHAKE 1 +#endif + +/* +** allow for mobility of the pty master/slave directories +*/ +#ifndef PTYDEV +#if defined(__hpux) +#define PTYDEV "/dev/ptym/ptyxx" +#elif defined(__MVS__) +#define PTYDEV "/dev/ptypxxxx" +#else +#define PTYDEV "/dev/ptyxx" +#endif +#endif /* !PTYDEV */ + +#ifndef TTYDEV +#if defined(__hpux) +#define TTYDEV "/dev/pty/ttyxx" +#elif defined(__MVS__) +#define TTYDEV "/dev/ptypxxxx" +#elif defined(USE_PTS_DEVICE) +#define TTYDEV "/dev/pts/0" +#else +#define TTYDEV "/dev/ttyxx" +#endif +#endif /* !TTYDEV */ + +#ifndef PTYCHAR1 +#ifdef __hpux +#define PTYCHAR1 "zyxwvutsrqp" +#else /* !__hpux */ +#define PTYCHAR1 "pqrstuvwxyzPQRSTUVWXYZ" +#endif /* !__hpux */ +#endif /* !PTYCHAR1 */ + +#ifndef PTYCHAR2 +#ifdef __hpux +#define PTYCHAR2 "fedcba9876543210" +#else /* !__hpux */ +#if defined(__DragonFly__) || defined(__FreeBSD__) +#define PTYCHAR2 "0123456789abcdefghijklmnopqrstuv" +#else /* !__FreeBSD__ */ +#define PTYCHAR2 "0123456789abcdef" +#endif /* !__FreeBSD__ */ +#endif /* !__hpux */ +#endif /* !PTYCHAR2 */ + +#ifndef TTYFORMAT +#if defined(CRAY) +#define TTYFORMAT "/dev/ttyp%03d" +#elif defined(__MVS__) +#define TTYFORMAT "/dev/ttyp%04d" +#else +#define TTYFORMAT "/dev/ttyp%d" +#endif +#endif /* TTYFORMAT */ + +#ifndef PTYFORMAT +#ifdef CRAY +#define PTYFORMAT "/dev/pty/%03d" +#elif defined(__MVS__) +#define PTYFORMAT "/dev/ptyp%04d" +#else +#define PTYFORMAT "/dev/ptyp%d" +#endif +#endif /* PTYFORMAT */ + +#ifndef PTYCHARLEN +#ifdef CRAY +#define PTYCHARLEN 3 +#elif defined(__MVS__) +#define PTYCHARLEN 8 /* OS/390 stores, e.g. ut_id="ttyp1234" */ +#else +#define PTYCHARLEN 2 +#endif +#endif + +#ifndef MAXPTTYS +#ifdef CRAY +#define MAXPTTYS 256 +#else +#define MAXPTTYS 2048 +#endif +#endif + +/* Until the translation manager comes along, I have to do my own translation of + * mouse events into the proper routines. */ + +typedef enum { + NORMAL = 0 + , LEFTEXTENSION + , RIGHTEXTENSION +} EventMode; + +/* + * The origin of a screen is 0, 0. Therefore, the number of rows + * on a screen is screen->max_row + 1, and similarly for columns. + */ +#define MaxCols(screen) ((screen)->max_col + 1) +#define MaxRows(screen) ((screen)->max_row + 1) + +typedef unsigned char Char; /* to support 8 bit chars */ +typedef Char *ScrnPtr; +typedef ScrnPtr *ScrnBuf; + +/* + * Declare an X String, but for unsigned chars. + */ +#ifdef _CONST_X_STRING +typedef const Char *UString; +#else +typedef Char *UString; +#endif + +#define IsEmpty(s) ((s) == 0 || *(s) == '\0') +#define IsSpace(c) ((c) == ' ' || (c) == '\t' || (c) == '\r' || (c) == '\n') + +/* + * Check strtol result, using "FullS2L" when no more data is expected, and + * "PartS2L" when more data may follow in the string. + */ +#define FullS2L(s,d) (PartS2L(s,d) && (*(d) == '\0')) +#define PartS2L(s,d) (isdigit(CharOf(*(s))) && (d) != (s) && (d) != 0) + +#define CASETYPE(name) case name: result = #name; break + +#define CharOf(n) ((Char)(n)) + +typedef struct { + int row; + int col; +} CELL; + +typedef struct { + Char *data_buffer; /* the current selection */ + size_t data_limit; /* size of allocated buffer */ + size_t data_length; /* number of significant bytes */ +} SelectedCells; + +#define isSameRow(a,b) ((a)->row == (b)->row) +#define isSameCol(a,b) ((a)->col == (b)->col) +#define isSameCELL(a,b) (isSameRow(a,b) && isSameCol(a,b)) + +#define xBIT(n) (1 << (n)) + +/* + * ANSI emulation, special character codes + */ +#define ANSI_EOT 0x04 +#define ANSI_BEL 0x07 +#define ANSI_BS 0x08 +#define ANSI_HT 0x09 +#define ANSI_LF 0x0A +#define ANSI_VT 0x0B +#define ANSI_FF 0x0C /* C0, C1 control names */ +#define ANSI_CR 0x0D +#define ANSI_SO 0x0E +#define ANSI_SI 0x0F +#define ANSI_XON 0x11 /* DC1 */ +#define ANSI_XOFF 0x13 /* DC3 */ +#define ANSI_NAK 0x15 +#define ANSI_CAN 0x18 +#define ANSI_ESC 0x1B +#define ANSI_SPA 0x20 +#define XTERM_POUND 0x1E /* internal mapping for '#' */ +#define ANSI_DEL 0x7F +#define ANSI_SS2 0x8E +#define ANSI_SS3 0x8F +#define ANSI_DCS 0x90 +#define ANSI_SOS 0x98 +#define ANSI_CSI 0x9B +#define ANSI_ST 0x9C +#define ANSI_OSC 0x9D +#define ANSI_PM 0x9E +#define ANSI_APC 0x9F + +#define BAD_ASCII '?' +#define NonLatin1(c) (((c) != ANSI_LF) && \ + ((c) != ANSI_HT) && \ + (((c) < ANSI_SPA) || \ + ((c) >= ANSI_DEL && (c) <= ANSI_APC))) +#define OnlyLatin1(c) (NonLatin1(c) ? BAD_ASCII : (c)) + +#define L_CURL '{' +#define R_CURL '}' + +#define MIN_DECID 52 /* can emulate VT52 */ +#define MAX_DECID 525 /* ...through VT525 */ + +#ifndef DFT_DECID +#define DFT_DECID "420" /* default VT420 */ +#endif + +#ifndef DFT_KBD_DIALECT +#define DFT_KBD_DIALECT "B" /* default USASCII */ +#endif + +/* constants used for utf8 mode */ +#define UCS_REPL 0xfffd +#define UCS_LIMIT 0x80000000U /* both limit and flag for non-UCS */ + +#define TERMCAP_SIZE 1500 /* 1023 is standard; 'screen' exceeds */ + +#define MAX_XLFD_FONTS 1 +#define MAX_XFT_FONTS 1 +#define NMENUFONTS 9 /* font entries in fontMenu */ + +#define NBOX 5 /* Number of Points in box */ +#define NPARAM 30 /* Max. parameters */ + +typedef struct { + String opt; + String desc; +} OptionHelp; + +typedef struct { + int count; /* number of values in params[] */ + int has_subparams; /* true if there are any sub's */ + int is_sub[NPARAM]; /* true for subparam */ + int params[NPARAM]; /* parameter value */ +} PARAMS; + +typedef short ParmType; +typedef unsigned short UParm; /* unparseputn passes ParmType */ + +typedef struct { + Char a_type; /* CSI, etc., see unparseq() */ + Char a_pintro; /* private-mode char, if any */ + const char * a_delim; /* between parameters (;) */ + Char a_inters; /* special (before final-char) */ + Char a_final; /* final-char */ + ParmType a_nparam; /* # of parameters */ + ParmType a_param[NPARAM]; /* Parameters */ + Char a_radix[NPARAM]; /* Parameters */ +} ANSI; + +#define TEK_FONT_LARGE 0 +#define TEK_FONT_2 1 +#define TEK_FONT_3 2 +#define TEK_FONT_SMALL 3 +#define TEKNUMFONTS 4 + +/* Actually there are 5 types of lines, but four are non-solid lines */ +#define TEKNUMLINES 4 + +typedef struct { + int x; + int y; + int fontsize; + unsigned linetype; +} Tmodes; + +typedef struct { + int Twidth; + int Theight; +} T_fontsize; + +typedef struct { + short *bits; + int x; + int y; + int width; + int height; +} BitmapBits; + +/* bit-assignments for extensions to DECRQCRA */ +typedef enum { + csDEC = 0 + ,csPOSITIVE = xBIT(0) + ,csATTRIBS = xBIT(1) + ,csNOTRIM = xBIT(2) + ,csDRAWN = xBIT(3) + ,csBYTE = xBIT(4) + ,cs8TH = xBIT(5) +} CSBITS; + +#define EXCHANGE(a,b,tmp) tmp = a; a = b; b = tmp + +/***====================================================================***/ + +#if (XtSpecificationRelease < 6) +#ifndef NO_ACTIVE_ICON +#define NO_ACTIVE_ICON 1 /* Note: code relies on an X11R6 function */ +#endif +#endif + +#ifndef OPT_AIX_COLORS +#define OPT_AIX_COLORS 1 /* true if xterm is configured with AIX (16) colors */ +#endif + +#ifndef OPT_ALLOW_XXX_OPS +#define OPT_ALLOW_XXX_OPS 1 /* true if xterm adds "Allow XXX Ops" submenu */ +#endif + +#ifndef OPT_BLINK_CURS +#define OPT_BLINK_CURS 1 /* true if xterm has blinking cursor capability */ +#endif + +#ifndef OPT_BLINK_TEXT +#define OPT_BLINK_TEXT OPT_BLINK_CURS /* true if xterm has blinking text capability */ +#endif + +#ifndef OPT_BOX_CHARS +#define OPT_BOX_CHARS 1 /* true if xterm can simulate box-characters */ +#endif + +#ifndef OPT_BUILTIN_XPMS +#define OPT_BUILTIN_XPMS 0 /* true if all xpm data is compiled-in */ +#endif + +#ifndef OPT_BROKEN_OSC +#ifdef linux +#define OPT_BROKEN_OSC 1 /* man console_codes, 1st paragraph - cf: ECMA-48 */ +#else +#define OPT_BROKEN_OSC 0 /* true if xterm allows Linux's broken OSC parsing */ +#endif +#endif + +#ifndef OPT_BROKEN_ST +#define OPT_BROKEN_ST 1 /* true if xterm allows old/broken OSC parsing */ +#endif + +#ifndef OPT_C1_PRINT +#define OPT_C1_PRINT 1 /* true if xterm allows C1 controls to be printable */ +#endif + +#ifndef OPT_CLIP_BOLD +#define OPT_CLIP_BOLD 1 /* true if xterm uses clipping to avoid bold-trash */ +#endif + +#ifndef OPT_COLOR_CLASS +#define OPT_COLOR_CLASS 1 /* true if xterm uses separate color-resource classes */ +#endif + +#ifndef OPT_COLOR_RES +#define OPT_COLOR_RES 1 /* true if xterm delays color-resource evaluation */ +#endif + +#ifndef OPT_DABBREV +#define OPT_DABBREV 0 /* dynamic abbreviations */ +#endif + +#ifndef OPT_DEC_CHRSET +#define OPT_DEC_CHRSET 1 /* true if xterm is configured for DEC charset */ +#endif + +#ifndef OPT_DEC_LOCATOR +#define OPT_DEC_LOCATOR 0 /* true if xterm supports VT220-style mouse events */ +#endif + +#ifndef OPT_DEC_RECTOPS +#define OPT_DEC_RECTOPS 1 /* true if xterm is configured for VT420 rectangles */ +#endif + +#ifndef OPT_SIXEL_GRAPHICS +#define OPT_SIXEL_GRAPHICS 0 /* true if xterm supports VT240-style sixel graphics */ +#endif + +#ifndef OPT_SCREEN_DUMPS +#define OPT_SCREEN_DUMPS 1 /* true if xterm supports screen dumps */ +#endif + +#ifndef OPT_REGIS_GRAPHICS +#define OPT_REGIS_GRAPHICS 0 /* true if xterm supports VT125/VT240/VT330 ReGIS graphics */ +#endif + +#ifndef OPT_GRAPHICS +#define OPT_GRAPHICS 0 /* true if xterm is configured for any type of graphics */ +#endif + +#ifndef OPT_DEC_SOFTFONT +#define OPT_DEC_SOFTFONT 0 /* true if xterm is configured for VT220 softfonts */ +#endif + +#ifndef OPT_DOUBLE_BUFFER +#define OPT_DOUBLE_BUFFER 0 /* true if using double-buffering */ +#endif + +#ifndef OPT_EBCDIC +#ifdef __MVS__ +#define OPT_EBCDIC 1 +#else +#define OPT_EBCDIC 0 +#endif +#endif + +#ifndef OPT_EXEC_XTERM +#define OPT_EXEC_XTERM 0 /* true if xterm can fork/exec copies of itself */ +#endif + +#ifndef OPT_EXTRA_PASTE +#define OPT_EXTRA_PASTE 1 +#endif + +#ifndef OPT_FIFO_LINES +#define OPT_FIFO_LINES 1 /* optimize save-lines feature using FIFO */ +#endif + +#ifndef OPT_FOCUS_EVENT +#define OPT_FOCUS_EVENT 1 /* focus in/out events */ +#endif + +#ifndef OPT_HP_FUNC_KEYS +#define OPT_HP_FUNC_KEYS 0 /* true if xterm supports HP-style function keys */ +#endif + +#ifndef OPT_I18N_SUPPORT +#if (XtSpecificationRelease >= 5) +#define OPT_I18N_SUPPORT 1 /* true if xterm uses internationalization support */ +#else +#define OPT_I18N_SUPPORT 0 +#endif +#endif + +#ifndef OPT_INITIAL_ERASE +#define OPT_INITIAL_ERASE 1 /* use pty's erase character if it's not 128 */ +#endif + +#ifndef OPT_INPUT_METHOD +#if (XtSpecificationRelease >= 6) +#define OPT_INPUT_METHOD OPT_I18N_SUPPORT /* true if xterm uses input-method support */ +#else +#define OPT_INPUT_METHOD 0 +#endif +#endif + +#ifndef OPT_ISO_COLORS +#define OPT_ISO_COLORS 1 /* true if xterm is configured with ISO colors */ +#endif + +#ifndef OPT_DIRECT_COLOR +#define OPT_DIRECT_COLOR OPT_ISO_COLORS /* true if xterm is configured with direct-colors */ +#endif + +#ifndef OPT_256_COLORS +#define OPT_256_COLORS 1 /* true if xterm is configured with 256 colors */ +#endif + +#ifndef OPT_88_COLORS +#define OPT_88_COLORS 1 /* true if xterm is configured with 88 colors */ +#endif + +#ifndef OPT_HIGHLIGHT_COLOR +#define OPT_HIGHLIGHT_COLOR 1 /* true if xterm supports color highlighting */ +#endif + +#ifndef OPT_LOAD_VTFONTS +#define OPT_LOAD_VTFONTS 0 /* true if xterm has load-vt-fonts() action */ +#endif + +#ifndef OPT_LUIT_PROG +#define OPT_LUIT_PROG 1 /* true if xterm supports luit */ +#endif + +#ifndef OPT_MAXIMIZE +#define OPT_MAXIMIZE 1 /* add actions for iconify ... maximize */ +#endif + +#ifndef OPT_MINI_LUIT +#define OPT_MINI_LUIT 0 /* true if xterm supports built-in mini-luit */ +#endif + +#ifndef OPT_MOD_FKEYS +#define OPT_MOD_FKEYS 1 /* modify cursor- and function-keys in normal mode */ +#endif + +#ifndef OPT_NUM_LOCK +#define OPT_NUM_LOCK 1 /* use NumLock key only for numeric-keypad */ +#endif + +#ifndef OPT_PASTE64 +#define OPT_PASTE64 1 /* program control of select/paste via base64 */ +#endif + +#ifndef OPT_PC_COLORS +#define OPT_PC_COLORS 1 /* true if xterm supports PC-style (bold) colors */ +#endif + +#ifndef OPT_PRINT_ON_EXIT +#define OPT_PRINT_ON_EXIT 1 /* true allows xterm to dump screen on X error */ +#endif + +#ifndef OPT_PTY_HANDSHAKE +#define OPT_PTY_HANDSHAKE USE_HANDSHAKE /* avoid pty races on older systems */ +#endif + +#ifndef OPT_PRINT_COLORS +#define OPT_PRINT_COLORS 1 /* true if we print color information */ +#endif + +#ifndef OPT_READLINE +#define OPT_READLINE 0 /* mouse-click/paste support for readline */ +#endif + +#ifndef OPT_RENDERFONT +#ifdef XRENDERFONT +#define OPT_RENDERFONT 1 +#else +#define OPT_RENDERFONT 0 +#endif +#endif + +#ifndef OPT_RENDERWIDE +#if OPT_RENDERFONT && OPT_WIDE_CHARS && defined(HAVE_TYPE_XFTCHARSPEC) +#define OPT_RENDERWIDE 1 +#else +#define OPT_RENDERWIDE 0 +#endif +#endif + +#ifndef OPT_REPORT_CCLASS +#define OPT_REPORT_CCLASS 1 /* provide "-report-charclass" option */ +#endif + +#ifndef OPT_REPORT_COLORS +#define OPT_REPORT_COLORS 1 /* provide "-report-colors" option */ +#endif + +#ifndef OPT_REPORT_FONTS +#define OPT_REPORT_FONTS 1 /* provide "-report-fonts" option */ +#endif + +#ifndef OPT_REPORT_ICONS +#define OPT_REPORT_ICONS 1 /* provide "-report-icons" option */ +#endif + +#ifndef OPT_SAME_NAME +#define OPT_SAME_NAME 1 /* suppress redundant updates of title, icon, etc. */ +#endif + +#ifndef OPT_SAVE_LINES +#define OPT_SAVE_LINES OPT_FIFO_LINES /* optimize save-lines feature */ +#endif + +#ifndef OPT_SCO_FUNC_KEYS +#define OPT_SCO_FUNC_KEYS 0 /* true if xterm supports SCO-style function keys */ +#endif + +#ifndef OPT_SUN_FUNC_KEYS +#define OPT_SUN_FUNC_KEYS 1 /* true if xterm supports Sun-style function keys */ +#endif + +#ifndef OPT_SCROLL_LOCK +#define OPT_SCROLL_LOCK 1 /* true if xterm interprets fontsize-shifting */ +#endif + +#ifndef OPT_SELECT_REGEX +#define OPT_SELECT_REGEX 1 /* true if xterm supports regular-expression selects */ +#endif + +#ifndef OPT_SELECTION_OPS +#define OPT_SELECTION_OPS 1 /* true if xterm supports operations on selection */ +#endif + +#ifndef OPT_SESSION_MGT +#if defined(XtNdieCallback) && defined(XtNsaveCallback) +#define OPT_SESSION_MGT 1 +#else +#define OPT_SESSION_MGT 0 +#endif +#endif + +#ifndef OPT_SHIFT_FONTS +#define OPT_SHIFT_FONTS 1 /* true if xterm interprets fontsize-shifting */ +#endif + +#ifndef OPT_SUNPC_KBD +#define OPT_SUNPC_KBD 1 /* true if xterm supports Sun/PC keyboard map */ +#endif + +#ifndef OPT_TCAP_FKEYS +#define OPT_TCAP_FKEYS 1 /* true for termcap function-keys */ +#endif + +#ifndef OPT_TCAP_QUERY +#define OPT_TCAP_QUERY 1 /* true for termcap query */ +#endif + +#ifndef OPT_TEK4014 +#define OPT_TEK4014 1 /* true if we're using tek4014 emulation */ +#endif + +#ifndef OPT_TOOLBAR +#define OPT_TOOLBAR 0 /* true if xterm supports toolbar menus */ +#endif + +#ifndef OPT_TRACE +#define OPT_TRACE 0 /* true if we're using debugging traces */ +#endif + +#ifndef OPT_TRACE_FLAGS +#define OPT_TRACE_FLAGS 0 /* additional tracing used for SCRN_BUF_FLAGS */ +#endif + +#ifndef OPT_VT52_MODE +#define OPT_VT52_MODE 1 /* true if xterm supports VT52 emulation */ +#endif + +#ifndef OPT_WIDE_ATTRS +#define OPT_WIDE_ATTRS 1 /* true if xterm supports 16-bit attributes */ +#endif + +#ifndef OPT_WIDE_CHARS +#define OPT_WIDE_CHARS 1 /* true if xterm supports 16-bit characters */ +#endif + +#ifndef OPT_WIDER_ICHAR +#define OPT_WIDER_ICHAR 1 /* true if xterm uses 32-bits for wide-chars */ +#endif + +#ifndef OPT_XMC_GLITCH +#define OPT_XMC_GLITCH 0 /* true if xterm supports xmc (magic cookie glitch) */ +#endif + +#ifndef OPT_XRES_QUERY +#define OPT_XRES_QUERY 1 /* true for resource query */ +#endif + +#ifndef OPT_XTERM_SGR +#define OPT_XTERM_SGR 1 /* true if xterm supports private SGR controls */ +#endif + +#ifndef OPT_ZICONBEEP +#define OPT_ZICONBEEP 1 /* true if xterm supports "-ziconbeep" option */ +#endif + +/***====================================================================***/ + +#if OPT_AIX_COLORS && !OPT_ISO_COLORS +/* You must have ANSI/ISO colors to support AIX colors */ +#undef OPT_AIX_COLORS +#define OPT_AIX_COLORS 0 +#endif + +#if OPT_COLOR_RES && !OPT_ISO_COLORS +/* You must have ANSI/ISO colors to support ColorRes logic */ +#undef OPT_COLOR_RES +#define OPT_COLOR_RES 0 +#endif + +#if OPT_256_COLORS && (OPT_WIDE_CHARS || OPT_RENDERFONT || OPT_XMC_GLITCH) +/* It's actually more complicated than that - but by trimming options you can + * have 256 color resources though. + */ +#define OPT_COLOR_RES2 1 +#else +#define OPT_COLOR_RES2 0 +#endif + +#if OPT_PC_COLORS && !OPT_ISO_COLORS +/* You must have ANSI/ISO colors to support PC colors */ +#undef OPT_PC_COLORS +#define OPT_PC_COLORS 0 +#endif + +#if OPT_PRINT_COLORS && !OPT_ISO_COLORS +/* You must have ANSI/ISO colors to be able to print them */ +#undef OPT_PRINT_COLORS +#define OPT_PRINT_COLORS 0 +#endif + +#if OPT_256_COLORS && !OPT_ISO_COLORS +/* You must have ANSI/ISO colors to support 256 colors */ +#undef OPT_256_COLORS +#define OPT_256_COLORS 0 +#endif + +#if OPT_88_COLORS && !OPT_ISO_COLORS +/* You must have ANSI/ISO colors to support 88 colors */ +#undef OPT_88_COLORS +#define OPT_88_COLORS 0 +#endif + +#if OPT_88_COLORS && OPT_256_COLORS +/* 256 colors supersedes 88 colors */ +#undef OPT_88_COLORS +#define OPT_88_COLORS 0 +#endif + +/***====================================================================***/ + +/* + * Indices for menu_font_names[][] + */ +typedef enum { + fNorm = 0 /* normal font */ + , fBold /* bold font */ +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE + , fItal /* italic font */ + , fBtal /* bold-italic font */ +#endif +#if OPT_WIDE_CHARS + , fWide /* double-width font */ + , fWBold /* double-width bold font */ + , fWItal /* double-width italic font */ + , fWBtal /* double-width bold-italic font */ +#endif + , fMAX +} VTFontEnum; + +/* + * Indices for cachedGCs.c (unrelated to VTFontEnum). + */ +typedef enum { + gcNorm = 0 + , gcBold + , gcNormReverse + , gcBoldReverse + , gcFiller + , gcBorder +#if OPT_BOX_CHARS + , gcLine + , gcDots +#endif +#if OPT_DEC_CHRSET + , gcCNorm + , gcCBold +#endif +#if OPT_WIDE_CHARS + , gcWide + , gcWBold + , gcWideReverse + , gcWBoldReverse +#endif + , gcVTcursNormal + , gcVTcursFilled + , gcVTcursReverse + , gcVTcursOutline +#if OPT_TEK4014 + , gcTKcurs +#endif + , gcMAX +} CgsEnum; + +#define for_each_text_gc(n) for (n = gcNorm; n < gcVTcursNormal; ++n) +#define for_each_curs_gc(n) for (n = gcVTcursNormal; n <= gcVTcursOutline; ++n) +#define for_each_gc(n) for (n = gcNorm; n < gcMAX; ++n) + +/* + * Indices for the normal terminal colors in screen.Tcolors[]. + * See also OscTextColors, which has corresponding values. + */ +typedef enum { + TEXT_FG = 0 /* text foreground */ + , TEXT_BG /* text background */ + , TEXT_CURSOR /* text cursor */ + , MOUSE_FG /* mouse foreground */ + , MOUSE_BG /* mouse background */ +#if OPT_TEK4014 + , TEK_FG = 5 /* tektronix foreground */ + , TEK_BG /* tektronix background */ +#endif +#if OPT_HIGHLIGHT_COLOR + , HIGHLIGHT_BG = 7 /* highlight background */ +#endif +#if OPT_TEK4014 + , TEK_CURSOR = 8 /* tektronix cursor */ +#endif +#if OPT_HIGHLIGHT_COLOR + , HIGHLIGHT_FG = 9 /* highlight foreground */ +#endif + , NCOLORS /* total number of colors */ +} TermColors; + +/* + * Definitions for exec-formatted and insert-formatted actions. + */ +typedef void (*FormatSelect) (Widget, char *, char *, CELL *, CELL *); + +typedef struct { + Boolean done; + char *format; + char *buffer; + FormatSelect format_select; +#if OPT_PASTE64 + Cardinal base64_paste; +#endif +#if OPT_PASTE64 || OPT_READLINE + unsigned paste_brackets; +#endif +} InternalSelect; + +/* + * Constants for titleModes resource + */ +typedef enum { + tmSetBase16 = 1 /* set title using hex-string */ + , tmGetBase16 = 2 /* get title using hex-string */ +#if OPT_WIDE_CHARS + , tmSetUtf8 = 4 /* like utf8Title, but controllable */ + , tmGetUtf8 = 8 /* retrieve title encoded as UTF-8 */ +#endif +} TitleModes; + +#define IsTitleMode(xw,mode) (((xw)->screen.title_modes & mode) != 0) + +#include + +/* + * For readability... + */ +#define nrc_percent 100 +#define nrc_dquote 200 +#define nrc_ampersand 300 +typedef enum { + nrc_ASCII = 0 + ,nrc_British /* vt100 */ + ,nrc_British_Latin_1 /* vt3xx */ + ,nrc_Cyrillic /* vt5xx */ + ,nrc_DEC_Spec_Graphic /* vt100 */ + ,nrc_DEC_Alt_Chars /* vt100 */ + ,nrc_DEC_Alt_Graphics /* vt100 */ + ,nrc_DEC_Supp /* vt2xx */ + ,nrc_DEC_Supp_Graphic /* vt3xx */ + ,nrc_DEC_Technical /* vt3xx */ + ,nrc_Dutch /* vt2xx */ + ,nrc_Finnish /* vt2xx */ + ,nrc_Finnish2 /* vt2xx */ + ,nrc_French /* vt2xx */ + ,nrc_French2 /* vt2xx */ + ,nrc_French_Canadian /* vt2xx */ + ,nrc_French_Canadian2 /* vt3xx */ + ,nrc_German /* vt2xx */ + ,nrc_Greek /* vt5xx */ + ,nrc_DEC_Greek_Supp /* vt5xx */ + ,nrc_ISO_Greek_Supp /* vt5xx */ + ,nrc_DEC_Hebrew_Supp /* vt5xx */ + ,nrc_Hebrew /* vt5xx */ + ,nrc_ISO_Hebrew_Supp /* vt5xx */ + ,nrc_Italian /* vt2xx */ + ,nrc_ISO_Latin_5_Supp /* vt5xx */ + ,nrc_ISO_Latin_Cyrillic /* vt5xx */ + ,nrc_Norwegian_Danish /* vt3xx */ + ,nrc_Norwegian_Danish2 /* vt2xx */ + ,nrc_Norwegian_Danish3 /* vt2xx */ + ,nrc_Portugese /* vt3xx */ + ,nrc_Russian /* vt5xx */ + ,nrc_SCS_NRCS /* vt5xx - probably Serbo/Croatian */ + ,nrc_Spanish /* vt2xx */ + ,nrc_Swedish /* vt2xx */ + ,nrc_Swedish2 /* vt2xx */ + ,nrc_Swiss /* vt2xx */ + ,nrc_DEC_Turkish_Supp /* vt5xx */ + ,nrc_Turkish /* vt5xx */ + ,nrc_Unknown +} DECNRCM_codes; + +/* + * Use this enumerated type to check consistency among dpmodes(), savemodes() + * restoremodes() and do_dec_rqm(). + */ +typedef enum { + srm_DECCKM = 1 + ,srm_DECANM = 2 + ,srm_DECCOLM = 3 + ,srm_DECSCLM = 4 + ,srm_DECSCNM = 5 + ,srm_DECOM = 6 + ,srm_DECAWM = 7 + ,srm_DECARM = 8 + ,srm_X10_MOUSE = SET_X10_MOUSE +#if OPT_TOOLBAR + ,srm_RXVT_TOOLBAR = 10 +#endif +#if OPT_BLINK_CURS + ,srm_ATT610_BLINK = 12 + ,srm_CURSOR_BLINK_OPS = 13 + ,srm_XOR_CURSOR_BLINKS = 14 +#endif + ,srm_DECPFF = 18 + ,srm_DECPEX = 19 + ,srm_DECTCEM = 25 + ,srm_RXVT_SCROLLBAR = 30 +#if OPT_SHIFT_FONTS + ,srm_RXVT_FONTSIZE = 35 +#endif +#if OPT_TEK4014 + ,srm_DECTEK = 38 +#endif + ,srm_132COLS = 40 + ,srm_CURSES_HACK = 41 + ,srm_DECNRCM = 42 + ,srm_MARGIN_BELL = 44 + ,srm_REVERSEWRAP = 45 +#ifdef ALLOWLOGGING + ,srm_ALLOWLOGGING = 46 +#endif + ,srm_ALTBUF = 47 + ,srm_DECNKM = 66 + ,srm_DECBKM = 67 + ,srm_DECLRMM = 69 +#if OPT_SIXEL_GRAPHICS + ,srm_DECSDM = 80 /* Sixel Display Mode */ +#endif + ,srm_DECNCSM = 95 + ,srm_VT200_MOUSE = SET_VT200_MOUSE + ,srm_VT200_HIGHLIGHT_MOUSE = SET_VT200_HIGHLIGHT_MOUSE + ,srm_BTN_EVENT_MOUSE = SET_BTN_EVENT_MOUSE + ,srm_ANY_EVENT_MOUSE = SET_ANY_EVENT_MOUSE +#if OPT_FOCUS_EVENT + ,srm_FOCUS_EVENT_MOUSE = SET_FOCUS_EVENT_MOUSE +#endif + ,srm_EXT_MODE_MOUSE = SET_EXT_MODE_MOUSE + ,srm_SGR_EXT_MODE_MOUSE = SET_SGR_EXT_MODE_MOUSE + ,srm_URXVT_EXT_MODE_MOUSE = SET_URXVT_EXT_MODE_MOUSE + ,srm_PIXEL_POSITION_MOUSE = SET_PIXEL_POSITION_MOUSE + ,srm_ALTERNATE_SCROLL = SET_ALTERNATE_SCROLL + ,srm_RXVT_SCROLL_TTY_OUTPUT = 1010 + ,srm_RXVT_SCROLL_TTY_KEYPRESS = 1011 + ,srm_EIGHT_BIT_META = 1034 +#if OPT_NUM_LOCK + ,srm_REAL_NUMLOCK = 1035 + ,srm_META_SENDS_ESC = 1036 +#endif + ,srm_DELETE_IS_DEL = 1037 +#if OPT_NUM_LOCK + ,srm_ALT_SENDS_ESC = 1039 +#endif + ,srm_KEEP_SELECTION = 1040 + ,srm_SELECT_TO_CLIPBOARD = 1041 + ,srm_BELL_IS_URGENT = 1042 + ,srm_POP_ON_BELL = 1043 + ,srm_KEEP_CLIPBOARD = 1044 + ,srm_ALLOW_ALTBUF = 1046 + ,srm_OPT_ALTBUF = 1047 + ,srm_SAVE_CURSOR = 1048 + ,srm_OPT_ALTBUF_CURSOR = 1049 +#if OPT_TCAP_FKEYS + ,srm_TCAP_FKEYS = 1050 +#endif +#if OPT_SUN_FUNC_KEYS + ,srm_SUN_FKEYS = 1051 +#endif +#if OPT_HP_FUNC_KEYS + ,srm_HP_FKEYS = 1052 +#endif +#if OPT_SCO_FUNC_KEYS + ,srm_SCO_FKEYS = 1053 +#endif + ,srm_LEGACY_FKEYS = 1060 +#if OPT_SUNPC_KBD + ,srm_VT220_FKEYS = 1061 +#endif +#if OPT_GRAPHICS + ,srm_PRIVATE_COLOR_REGISTERS = 1070 +#endif +#if OPT_PASTE64 || OPT_READLINE + ,srm_PASTE_IN_BRACKET = SET_PASTE_IN_BRACKET +#endif +#if OPT_READLINE + ,srm_BUTTON1_MOVE_POINT = SET_BUTTON1_MOVE_POINT + ,srm_BUTTON2_MOVE_POINT = SET_BUTTON2_MOVE_POINT + ,srm_DBUTTON3_DELETE = SET_DBUTTON3_DELETE + ,srm_PASTE_QUOTE = SET_PASTE_QUOTE + ,srm_PASTE_LITERAL_NL = SET_PASTE_LITERAL_NL +#endif /* OPT_READLINE */ +#if OPT_SIXEL_GRAPHICS + ,srm_SIXEL_SCROLLS_RIGHT = 8452 +#endif +} DECSET_codes; + +/* internal codes for selection atoms */ +typedef enum { + PRIMARY_CODE = 0 + ,CLIPBOARD_CODE + ,SECONDARY_CODE + ,MAX_SELECTION_CODES +} SelectionCodes; + +/* indices for mapping multiple clicks to selection types */ +typedef enum { + Select_CHAR=0 + ,Select_WORD + ,Select_LINE + ,Select_GROUP + ,Select_PAGE + ,Select_ALL +#if OPT_SELECT_REGEX + ,Select_REGEX +#endif + ,NSELECTUNITS +} SelectUnit; + +#if OPT_BLINK_CURS +typedef enum { + cbFalse = 0 + , cbTrue + , cbAlways + , cbNever + , cbLAST +} BlinkOps; +#endif + +typedef enum { + ecSetColor = 1 + , ecGetColor + , ecGetAnsiColor + , ecLAST +} ColorOps; + +typedef enum { + efSetFont = 1 + , efGetFont + , efLAST +} FontOps; + +typedef enum { + esFalse = 0 + , esTrue + , esAlways + , esNever + , esLAST +} FullscreenOps; + +#ifndef NO_ACTIVE_ICON +typedef enum { + eiFalse = 0 + , eiTrue + , eiDefault + , eiLAST +} AIconOps; +#endif + +typedef enum { + emX10 = 1 + , emLocator + , emVT200Click + , emVT200Hilite + , emAnyButton + , emAnyEvent + , emFocusEvent + , emExtended + , emSGR + , emURXVT + , emAlternateScroll + , emLAST +} MouseOps; + +typedef enum { + epC0 = 1 + , epBS + , epCR + , epDEL + , epESC + , epFF + , epHT + , epNL + , epLAST +} PasteControls; + +/* + * xterm uses these codes for the its push-SGR feature. They match where + * possible the corresponding SGR coding. The foreground and background colors + * do not fit into that scheme (because they are a set of ranges), so those are + * chosen arbitrarily -TD + */ +typedef enum { + psBOLD = 1 +#if OPT_WIDE_ATTRS + , psATR_FAINT = 2 + , psATR_ITALIC = 3 +#endif + , psUNDERLINE = 4 + , psBLINK = 5 + , psINVERSE = 7 + , psINVISIBLE = 8 +#if OPT_WIDE_ATTRS + , psATR_STRIKEOUT = 9 +#endif + /* SGR 10-19 correspond to primary/alternate fonts, currently unused */ +#if OPT_ISO_COLORS + , psFG_COLOR_obs = 10 + , psBG_COLOR_obs = 11 +#endif +#if OPT_WIDE_ATTRS + , psATR_DBL_UNDER = 21 +#endif + /* SGR 22-29 mostly are used to reset SGR 1-9 */ +#if OPT_ISO_COLORS + , psFG_COLOR = 30 /* stack maps many colors to one state */ + , psBG_COLOR = 31 +#endif + , MAX_PUSH_SGR +} PushSGR; + +typedef enum { + etSetTcap = 1 + , etGetTcap + , etLAST +} TcapOps; + +typedef enum { + /* 1-23 are chosen to be the same as the control-sequence coding */ + ewRestoreWin = 1 + , ewMinimizeWin = 2 + , ewSetWinPosition = 3 + , ewSetWinSizePixels = 4 + , ewRaiseWin = 5 + , ewLowerWin = 6 + , ewRefreshWin = 7 + , ewSetWinSizeChars = 8 +#if OPT_MAXIMIZE + , ewMaximizeWin = 9 + , ewFullscreenWin = 10 +#endif + , ewGetWinState = 11 + , ewGetWinPosition = 13 + , ewGetWinSizePixels = 14 +#if OPT_MAXIMIZE + , ewGetScreenSizePixels = 15 + , ewGetCharSizePixels = 16 +#endif + , ewGetWinSizeChars = 18 +#if OPT_MAXIMIZE + , ewGetScreenSizeChars = 19 +#endif + , ewGetIconTitle = 20 + , ewGetWinTitle = 21 + , ewPushTitle = 22 + , ewPopTitle = 23 + /* these do not fit into that scheme, which is why we use an array */ + , ewSetWinLines + , ewSetXprop + , ewGetSelection + , ewSetSelection + , ewGetChecksum + , ewSetChecksum + /* get the size of the array... */ + , ewLAST +} WindowOps; + +/***====================================================================***/ + +#define COLOR_DEFINED(s,w) ((s)->which & (unsigned) (1<<(w))) +#define COLOR_VALUE(s,w) ((s)->colors[w]) +#define SET_COLOR_VALUE(s,w,v) (((s)->colors[w] = (v)), UIntSet((s)->which, (1<<(w)))) + +#define COLOR_NAME(s,w) ((s)->names[w]) +#define SET_COLOR_NAME(s,w,v) (((s)->names[w] = (v)), ((s)->which |= (unsigned) (1<<(w)))) + +#define UNDEFINE_COLOR(s,w) ((s)->which &= (~((w)<<1))) + +/***====================================================================***/ + +#if OPT_ISO_COLORS +#if OPT_WIDE_ATTRS +#define COLOR_FLAGS (FG_COLOR | BG_COLOR | ATR_DIRECT_FG | ATR_DIRECT_BG) +#else +#define COLOR_FLAGS (FG_COLOR | BG_COLOR) +#endif +#define TERM_COLOR_FLAGS(xw) ((xw)->flags & COLOR_FLAGS) +#define COLOR_0 0 +#define COLOR_1 1 +#define COLOR_2 2 +#define COLOR_3 3 +#define COLOR_4 4 +#define COLOR_5 5 +#define COLOR_6 6 +#define COLOR_7 7 +#define COLOR_8 8 +#define COLOR_9 9 +#define COLOR_10 10 +#define COLOR_11 11 +#define COLOR_12 12 +#define COLOR_13 13 +#define COLOR_14 14 +#define COLOR_15 15 +#define MIN_ANSI_COLORS 16 + +#if OPT_256_COLORS +# define NUM_ANSI_COLORS 256 +#elif OPT_88_COLORS +# define NUM_ANSI_COLORS 88 +#else +# define NUM_ANSI_COLORS MIN_ANSI_COLORS +#endif + +#define okIndexedColor(n) ((n) >= 0 && (n) < NUM_ANSI_COLORS) + +#if NUM_ANSI_COLORS > MIN_ANSI_COLORS +# define OPT_EXT_COLORS 1 +#else +# define OPT_EXT_COLORS 0 +#endif + +#define COLOR_BD (NUM_ANSI_COLORS) /* BOLD */ +#define COLOR_UL (NUM_ANSI_COLORS+1) /* UNDERLINE */ +#define COLOR_BL (NUM_ANSI_COLORS+2) /* BLINK */ +#define COLOR_RV (NUM_ANSI_COLORS+3) /* REVERSE */ + +#if OPT_WIDE_ATTRS +#define COLOR_IT (NUM_ANSI_COLORS+4) /* ITALIC */ +#define MAXCOLORS (NUM_ANSI_COLORS+5) +#else +#define MAXCOLORS (NUM_ANSI_COLORS+4) +#endif + +#ifndef DFT_COLORMODE +#define DFT_COLORMODE True /* default colorMode resource */ +#endif + +#define UseItalicFont(screen) (!(screen)->colorITMode) + +#define ReverseOrHilite(screen,flags,hilite) \ + (( screen->colorRVMode && hilite ) || \ + ( !screen->colorRVMode && \ + (( (flags & INVERSE) && !hilite) || \ + (!(flags & INVERSE) && hilite)) )) + +#else /* !OPT_ISO_COLORS */ + +#define TERM_COLOR_FLAGS(xw) 0 + +#define UseItalicFont(screen) True +#define ReverseOrHilite(screen,flags,hilite) \ + (( (flags & INVERSE) && !hilite) || \ + (!(flags & INVERSE) && hilite)) + +#endif /* OPT_ISO_COLORS */ + +typedef enum { + XK_TCAPNAME = 3 + /* Define fake XK codes, we need those for the fake color response in + * xtermcapKeycode(). + */ +#if OPT_ISO_COLORS + , XK_COLORS + , XK_RGB +#endif +} TcapQuery; + +#if OPT_AIX_COLORS +#define if_OPT_AIX_COLORS(screen, code) if(screen->colorMode) code +#else +#define if_OPT_AIX_COLORS(screen, code) /* nothing */ +#endif + +#if OPT_256_COLORS || OPT_88_COLORS || OPT_ISO_COLORS +# define if_OPT_ISO_COLORS(screen, code) if (screen->colorMode) code +#else +# define if_OPT_ISO_COLORS(screen, code) /* nothing */ +#endif + +#if OPT_DIRECT_COLOR +# define if_OPT_DIRECT_COLOR(screen, code) if (screen->direct_color) code +# define if_OPT_DIRECT_COLOR2(screen, test, code) if (screen->direct_color && (test)) code +#else +# define if_OPT_DIRECT_COLOR(screen, code) /* nothing */ +# define if_OPT_DIRECT_COLOR2(screen, test, code) /* nothing */ +#endif + +#define if_OPT_DIRECT_COLOR2_else(cond, test, stmt) \ + if_OPT_DIRECT_COLOR2(cond, test, stmt else) + +#define COLOR_RES_NAME(root) "color" root + +#if OPT_COLOR_CLASS +#define COLOR_RES_CLASS(root) "Color" root +#else +#define COLOR_RES_CLASS(root) XtCForeground +#endif + +#if OPT_COLOR_RES +#define COLOR_RES(root,offset,value) Sres(COLOR_RES_NAME(root), COLOR_RES_CLASS(root), offset.resource, value) +#define COLOR_RES2(name,class,offset,value) Sres(name, class, offset.resource, value) +#else +#define COLOR_RES(root,offset,value) Cres(COLOR_RES_NAME(root), COLOR_RES_CLASS(root), offset, value) +#define COLOR_RES2(name,class,offset,value) Cres(name, class, offset, value) +#endif + +#define CLICK_RES_NAME(count) "on" count "Clicks" +#define CLICK_RES_CLASS(count) "On" count "Clicks" +#define CLICK_RES(count,offset,value) Sres(CLICK_RES_NAME(count), CLICK_RES_CLASS(count), offset, value) + +/***====================================================================***/ + +#if OPT_DEC_CHRSET +#define if_OPT_DEC_CHRSET(code) code + /* Use 2 bits for encoding the double high/wide sense of characters */ +#define CSET_SWL 0 +#define CSET_DHL_TOP 1 +#define CSET_DHL_BOT 2 +#define CSET_DWL 3 +#define NUM_CHRSET 8 /* normal/bold and 4 CSET_xxx values */ + + /* Use remaining bits for encoding the other character-sets */ +#define CSET_NORMAL(code) ((code) == CSET_SWL) +#define CSET_DOUBLE(code) (!CSET_NORMAL(code) && !CSET_EXTEND(code)) +#define CSET_EXTEND(code) ((int)(code) > CSET_DWL) + +#define DBLCS_BITS 4 +#define DBLCS_MASK BITS2MASK(DBLCS_BITS) + +#define GetLineDblCS(ld) (((ld)->bufHead >> LINEFLAG_BITS) & DBLCS_MASK) +#define SetLineDblCS(ld,cs) (ld)->bufHead = (RowData) ((ld->bufHead & LINEFLAG_MASK) | (cs << LINEFLAG_BITS)) + +#define LineCharSet(screen, ld) \ + (unsigned) ((CSET_DOUBLE(GetLineDblCS(ld))) \ + ? GetLineDblCS(ld) \ + : (screen)->cur_chrset) +#define LineMaxCol(screen, ld) \ + (CSET_DOUBLE(GetLineDblCS(ld)) \ + ? (screen->max_col / 2) \ + : (screen->max_col)) +#define LineCursorX(screen, ld, col) \ + (CSET_DOUBLE(GetLineDblCS(ld)) \ + ? CursorX(screen, 2*(col)) \ + : CursorX(screen, (col))) +#define LineFontWidth(screen, ld) \ + (CSET_DOUBLE(GetLineDblCS(ld)) \ + ? 2*FontWidth(screen) \ + : FontWidth(screen)) +#else + +#define if_OPT_DEC_CHRSET(code) /*nothing*/ +#define CSET_SWL 0 +#define GetLineDblCS(ld) 0U +#define LineCharSet(screen, ld) 0U +#define LineMaxCol(screen, ld) screen->max_col +#define LineCursorX(screen, ld, col) CursorX(screen, col) +#define LineFontWidth(screen, ld) FontWidth(screen) + +#endif + +#if OPT_LUIT_PROG && !OPT_WIDE_CHARS +/* Luit requires the wide-chars configuration */ +#undef OPT_LUIT_PROG +#define OPT_LUIT_PROG 0 +#endif + +/***====================================================================***/ + +#if OPT_EBCDIC +extern int E2A(int); +extern int A2E(int); +#else +#define E2A(a) (a) +#define A2E(a) (a) +#endif + +#define CONTROL(a) (A2E(E2A(a)&037)) + +/***====================================================================***/ + +#if OPT_TEK4014 +#define TEK4014_ACTIVE(xw) ((xw)->misc.TekEmu) +#define TEK4014_SHOWN(xw) ((xw)->misc.Tshow) +#define CURRENT_EMU_VAL(tek,vt) (TEK4014_ACTIVE(term) ? tek : vt) +#define CURRENT_EMU() CURRENT_EMU_VAL((Widget)tekWidget, (Widget)term) +#else +#define TEK4014_ACTIVE(screen) 0 +#define TEK4014_SHOWN(xw) 0 +#define CURRENT_EMU_VAL(tek,vt) (vt) +#define CURRENT_EMU() ((Widget)term) +#endif + +/***====================================================================***/ + +#if OPT_TOOLBAR +#define SHELL_OF(widget) XtParent(XtParent(widget)) +#else +#define SHELL_OF(widget) XtParent(widget) +#endif + +/***====================================================================***/ + +#if OPT_VT52_MODE +#define if_OPT_VT52_MODE(screen, code) if(screen->vtXX_level == 0) code +#else +#define if_OPT_VT52_MODE(screen, code) /* nothing */ +#endif + +/***====================================================================***/ + +#if OPT_XMC_GLITCH +#define if_OPT_XMC_GLITCH(screen, code) if(screen->xmc_glitch) code +#define XMC_GLITCH 1 /* the character we'll show */ +#define XMC_FLAGS (INVERSE|UNDERLINE|BOLD|BLINK) +#else +#define if_OPT_XMC_GLITCH(screen, code) /* nothing */ +#endif + +/***====================================================================***/ + +typedef unsigned IFlags; /* at least 32 bits */ + +#if OPT_WIDE_ATTRS +typedef unsigned short IAttr; /* at least 16 bits */ +#else +typedef unsigned char IAttr; /* at least 8 bits */ +#endif + +/***====================================================================***/ + +#define LO_BYTE(ch) CharOf((ch) & 0xff) +#define HI_BYTE(ch) CharOf((ch) >> 8) + +#if OPT_WIDE_CHARS +#define if_OPT_WIDE_CHARS(screen, code) if(screen->wide_chars) code +#define if_WIDE_OR_NARROW(screen, wide, narrow) if(screen->wide_chars) wide else narrow +#define NARROW_ICHAR 0xffff +#if OPT_WIDER_ICHAR +#define WIDEST_ICHAR 0x1fffff +typedef unsigned IChar; /* for 8-21 bit characters */ +#else +#define WIDEST_ICHAR NARROW_ICHAR +typedef unsigned short IChar; /* for 8-16 bit characters */ +#endif +#else +#define if_OPT_WIDE_CHARS(screen, code) /* nothing */ +#define if_WIDE_OR_NARROW(screen, wide, narrow) narrow +typedef unsigned char IChar; /* for 8-bit characters */ +#endif + +/***====================================================================***/ + +#ifndef RES_OFFSET +#define RES_OFFSET(offset) XtOffsetOf(XtermWidgetRec, offset) +#endif + +#define RES_NAME(name) name +#define RES_CLASS(name) name + +#define Bres(name, class, offset, dftvalue) \ + {RES_NAME(name), RES_CLASS(class), XtRBoolean, sizeof(Boolean), \ + RES_OFFSET(offset), XtRImmediate, (XtPointer) dftvalue} + +#define Cres(name, class, offset, dftvalue) \ + {RES_NAME(name), RES_CLASS(class), XtRPixel, sizeof(Pixel), \ + RES_OFFSET(offset), XtRString, DECONST(char,dftvalue)} + +#define Tres(name, class, offset, dftvalue) \ + COLOR_RES2(name, class, screen.Tcolors[offset], dftvalue) \ + +#define Fres(name, class, offset, dftvalue) \ + {RES_NAME(name), RES_CLASS(class), XtRFontStruct, sizeof(XFontStruct *), \ + RES_OFFSET(offset), XtRString, DECONST(char,dftvalue)} + +#define Ires(name, class, offset, dftvalue) \ + {RES_NAME(name), RES_CLASS(class), XtRInt, sizeof(int), \ + RES_OFFSET(offset), XtRImmediate, (XtPointer) dftvalue} + +#define Dres(name, class, offset, dftvalue) \ + {RES_NAME(name), RES_CLASS(class), XtRFloat, sizeof(float), \ + RES_OFFSET(offset), XtRString, DECONST(char,dftvalue)} + +#define Sres(name, class, offset, dftvalue) \ + {RES_NAME(name), RES_CLASS(class), XtRString, sizeof(char *), \ + RES_OFFSET(offset), XtRString, DECONST(char,dftvalue)} + +#define Wres(name, class, offset, dftvalue) \ + {RES_NAME(name), RES_CLASS(class), XtRWidget, sizeof(Widget), \ + RES_OFFSET(offset), XtRWidget, (XtPointer) dftvalue} + +/***====================================================================***/ + +#define FRG_SIZE resource.minBufSize +#define BUF_SIZE resource.maxBufSize + +typedef struct { + Char *next; + Char *last; + int update; /* HandleInterpret */ +#if OPT_WIDE_CHARS + IChar utf_data; /* resulting character */ + int utf_size; /* ...number of bytes decoded */ + Char *write_buf; + unsigned write_len; +#endif + Char buffer[1]; +} PtyData; + +/***====================================================================***/ + +/* + * Pixel (and its components) are declared as unsigned long, but even for RGB + * we need no more than 32-bits. + */ +typedef uint32_t MyPixel; +typedef int32_t MyColor; + +#if OPT_ISO_COLORS +#if OPT_DIRECT_COLOR +typedef struct { + MyColor fg; + MyColor bg; +} CellColor; + +#define isSameCColor(p,q) (!memcmp(&(p), &(q), sizeof(CellColor))) + +#elif OPT_256_COLORS || OPT_88_COLORS + +#define COLOR_BITS 8 +typedef unsigned short CellColor; + +#else + +#define COLOR_BITS 4 +typedef Char CellColor; + +#endif +#else +typedef unsigned CellColor; +#endif + +#define NO_COLOR ((unsigned)-1) + +#ifndef isSameCColor +#define isSameCColor(p,q) ((p) == (q)) +#endif + +#define BITS2MASK(b) ((1 << b) - 1) + +#define COLOR_MASK BITS2MASK(COLOR_BITS) + +#if OPT_DIRECT_COLOR +#define clrDirectFG(flags) UIntClr(flags, ATR_DIRECT_FG) +#define clrDirectBG(flags) UIntClr(flags, ATR_DIRECT_BG) +#define GetCellColorFG(data) ((data).fg) +#define GetCellColorBG(data) ((data).bg) +#define hasDirectFG(flags) ((flags) & ATR_DIRECT_FG) +#define hasDirectBG(flags) ((flags) & ATR_DIRECT_BG) +#define setDirectFG(flags,test) if (test) UIntSet(flags, ATR_DIRECT_FG); else UIntClr(flags, ATR_DIRECT_FG) +#define setDirectBG(flags,test) if (test) UIntSet(flags, ATR_DIRECT_BG); else UIntClr(flags, ATR_DIRECT_BG) +#elif OPT_ISO_COLORS +#define clrDirectFG(flags) /* nothing */ +#define clrDirectBG(flags) /* nothing */ +#define GetCellColorFG(data) ((data) & COLOR_MASK) +#define GetCellColorBG(data) (((data) >> COLOR_BITS) & COLOR_MASK) +#define hasDirectFG(flags) 0 +#define hasDirectBG(flags) 0 +#define setDirectFG(flags,test) (void)(test) +#define setDirectBG(flags,test) (void)(test) +#else +#define GetCellColorFG(data) 7 +#define GetCellColorBG(data) 0 +#endif +extern CellColor blank_cell_color; + +typedef Char RowData; /* wrap/blink, and DEC single-double chars */ + +#define LINEFLAG_BITS 4 +#define LINEFLAG_MASK BITS2MASK(LINEFLAG_BITS) + +#define GetLineFlags(ld) ((ld)->bufHead & LINEFLAG_MASK) + +#if OPT_DEC_CHRSET +#define SetLineFlags(ld,xx) (ld)->bufHead = (RowData) ((ld->bufHead & (DBLCS_MASK << LINEFLAG_BITS)) | (xx & LINEFLAG_MASK)) +#else +#define SetLineFlags(ld,xx) (ld)->bufHead = (RowData) (xx & LINEFLAG_MASK) +#endif + +typedef IChar CharData; + +/* + * This is the xterm line-data/scrollback structure. + */ +typedef struct { + Dimension lineSize; /* number of columns in this row */ + RowData bufHead; /* flag for wrapped lines */ +#if OPT_WIDE_CHARS + Char combSize; /* number of items in combData[] */ +#endif + IAttr *attribs; /* video attributes */ +#if OPT_ISO_COLORS + CellColor *color; /* foreground+background color numbers */ +#endif + CharData *charData; /* cell's base character */ + CharData *combData[1]; /* first enum past fixed-offsets */ +} LineData; + +typedef const LineData CLineData; + +/* + * We use CellData in a few places, when copying a cell's data to a temporary + * variable. + */ +typedef struct { + IAttr attribs; +#if OPT_WIDE_CHARS + Char combSize; /* number of items in combData[] */ +#endif +#if OPT_ISO_COLORS + CellColor color; /* color-array */ +#endif + CharData charData; /* cell's base character */ + CharData combData[1]; /* array of combining chars */ +} CellData; + +#define for_each_combData(off, ld) for (off = 0; off < ld->combSize; ++off) + +#define Clear1Cell(ld, x) \ + do { \ + ld->charData[x] = ' '; \ + do { \ + if_OPT_WIDE_CHARS(screen, { \ + size_t z; \ + for_each_combData(z, ld) { \ + ld->combData[z][x] = '\0'; \ + } \ + }) } while (0); \ + } while (0) + +#define Clear2Cell(dst, src, x) \ + do { \ + dst->charData[x] = ' '; \ + dst->attribs[x] = src->attribs[x]; \ + do { \ + if_OPT_ISO_COLORS(screen, { \ + dst->color[x] = src->color[x]; \ + }) } while (0); \ + do { \ + if_OPT_WIDE_CHARS(screen, { \ + size_t z; \ + for_each_combData(z, dst) { \ + dst->combData[z][x] = '\0'; \ + } \ + }) } while (0); \ + } while (0) + +/* + * Accommodate older compilers by not using variable-length arrays. + */ +#define SizeOfLineData offsetof(LineData, combData) +#define SizeOfCellData offsetof(CellData, combData) + + /* + * A "row" is the index within the visible part of the screen, and an + * "inx" is the index within the whole set of scrollable lines. + */ +#define ROW2INX(screen, row) ((row) + (screen)->topline) +#define INX2ROW(screen, inx) ((inx) - (screen)->topline) + +/* these are unused but could be useful for debugging */ +#if 0 +#define ROW2ABS(screen, row) ((row) + (screen)->savedlines) +#define INX2ABS(screen, inx) ROW2ABS(screen, INX2ROW(screen, inx)) +#endif + +#define okScrnRow(screen, row) \ + ((row) <= ((screen)->max_row - (screen)->topline) \ + && (row) >= -((screen)->savedlines)) + + /* + * Cache data for "proportional" and other fonts containing a mixture + * of widths. + */ +typedef struct { + Bool mixed; + Dimension min_width; /* nominal cell width for 0..255 */ + Dimension max_width; /* maximum cell width */ +} FontMap; + +#define KNOWN_MISSING 256 + +typedef enum { + fwNever = 0, + fwResource, + fwAlways +} fontWarningTypes; + +typedef struct { + unsigned chrset; + unsigned flags; + fontWarningTypes warn; + XFontStruct * fs; + char * fn; + FontMap map; + Char known_missing[KNOWN_MISSING]; +} XTermFonts; + +#if OPT_RENDERFONT +typedef enum { + erFalse = 0 + , erTrue + , erDefault + , erLast +} RenderFont; + +#define DefaultRenderFont(xw) \ + if ((xw)->work.render_font == erDefault) \ + (xw)->work.render_font = erFalse + +typedef enum { + xcEmpty = 0 /* slot is unused */ + , xcBogus /* ignore this pattern */ + , xcOpened /* slot has open font descriptor */ + , xcUnused /* opened, but unused so far */ +} XftCache; + +typedef struct { + XftFont * font; + XftCache usage; +} XTermXftCache; + +typedef struct { + XftFont * font; /* main font */ + XftPattern * pattern; /* pattern for main font */ + XftFontSet * fontset; /* ordered list of fallback patterns */ + XTermXftCache * cache; + unsigned limit; /* allocated size of cache[] */ + unsigned opened; /* number of slots with xcOpened */ + FontMap map; +} XTermXftFonts; + +typedef struct _ListXftFonts { + struct _ListXftFonts *next; + XftFont * font; +} ListXftFonts; +#endif + +typedef struct { + int top; + int left; + int bottom; + int right; +} XTermRect; + +/***====================================================================***/ + + /* indices into save_modes[] */ +typedef enum { + DP_ALLOW_ALTBUF, + DP_ALTERNATE_SCROLL, + DP_ALT_SENDS_ESC, + DP_BELL_IS_URGENT, + DP_CRS_VISIBLE, + DP_DECANM, + DP_DECARM, + DP_DECAWM, + DP_DECBKM, + DP_DECCKM, + DP_DECCOLM, /* IN132COLUMNS */ + DP_DECKPAM, + DP_DECNRCM, + DP_DECOM, + DP_DECPEX, + DP_DECPFF, + DP_DECSCLM, + DP_DECSCNM, + DP_DECTCEM, + DP_DELETE_IS_DEL, + DP_EIGHT_BIT_META, + DP_KEEP_CLIPBOARD, + DP_KEEP_SELECTION, + DP_KEYBOARD_TYPE, + DP_POP_ON_BELL, + DP_PRN_EXTENT, + DP_PRN_FORMFEED, + DP_RXVT_SCROLLBAR, + DP_RXVT_SCROLL_TTY_KEYPRESS, + DP_RXVT_SCROLL_TTY_OUTPUT, + DP_SELECT_TO_CLIPBOARD, + DP_X_ALTBUF, + DP_X_DECCOLM, + DP_X_EXT_MOUSE, + DP_X_LOGGING, + DP_X_LRMM, + DP_X_MARGIN, + DP_X_MORE, + DP_X_MOUSE, + DP_X_NCSM, + DP_X_REVWRAP, + DP_X_X10MSE, +#if OPT_BLINK_CURS + DP_CRS_BLINK, +#endif +#if OPT_FOCUS_EVENT + DP_X_FOCUS, +#endif +#if OPT_NUM_LOCK + DP_REAL_NUMLOCK, + DP_META_SENDS_ESC, +#endif +#if OPT_SHIFT_FONTS + DP_RXVT_FONTSIZE, +#endif +#if OPT_SIXEL_GRAPHICS + DP_DECSDM, +#endif +#if OPT_TEK4014 + DP_DECTEK, +#endif +#if OPT_TOOLBAR + DP_TOOLBAR, +#endif + DP_X_PRIVATE_COLOR_REGISTERS, +#if OPT_SIXEL_GRAPHICS + DP_SIXEL_SCROLLS_RIGHT, +#endif + DP_LAST +} SaveModes; + +#define DoSM(code,value) screen->save_modes[code] = (unsigned) (value) +#define DoRM(code,value) value = (Boolean) screen->save_modes[code] +#define DoRM0(code,value) value = screen->save_modes[code] + + /* index into vt_shell[] or tek_shell[] */ +typedef enum { + noMenu = -1 + ,mainMenu + ,vtMenu + ,fontMenu +#if OPT_TEK4014 + ,tekMenu +#endif +} MenuIndex; + +typedef enum { + bvOff = -1, + bvLow = 0, + bvHigh +} BellVolume; + +#define NUM_POPUP_MENUS 4 + +#if OPT_COLOR_RES +typedef struct { + String resource; + Pixel value; + unsigned short red, green, blue; + int mode; /* -1=invalid, 0=unset, 1=set */ +} ColorRes; +#else +#define ColorRes Pixel +#endif + +/* these are set in getPrinterFlags */ +typedef struct { + int printer_extent; /* print complete page */ + int printer_formfeed; /* print formfeed per function */ + int printer_newline; /* print newline per function */ + int print_attributes; /* 0=off, 1=normal, 2=color */ + int print_everything; /* 0=all, 1=dft, 2=alt, 3=saved */ +} PrinterFlags; + +typedef struct { + FILE * fp; /* output file/pipe used */ + Boolean isOpen; /* output was opened/tried */ + Boolean toFile; /* true when directly to file */ + Boolean printer_checked; /* printer_command is checked */ + String printer_command; /* pipe/shell command string */ + Boolean printer_autoclose; /* close printer when offline */ + Boolean printer_extent; /* print complete page */ + Boolean printer_formfeed; /* print formfeed per function */ + Boolean printer_newline; /* print newline per function */ + int printer_controlmode; /* 0=off, 1=auto, 2=controller */ + int print_attributes; /* 0=off, 1=normal, 2=color */ + int print_everything; /* 0=all, 1=dft, 2=alt, 3=saved */ +} PrinterState; + +typedef struct { + unsigned which; /* must have NCOLORS bits */ + Pixel colors[NCOLORS]; + char *names[NCOLORS]; +} ScrnColors; + +#define NUM_GSETS 4 + +typedef struct { + Boolean saved; + int row; + int col; + IFlags flags; /* VTxxx saves graphics rendition */ + Char curgl; + Char curgr; + DECNRCM_codes gsets[NUM_GSETS]; + Boolean wrap_flag; +#if OPT_ISO_COLORS + int cur_foreground; /* current foreground color */ + int cur_background; /* current background color */ + int sgr_foreground; /* current SGR foreground color */ + int sgr_background; /* current SGR background color */ + Boolean sgr_38_xcolors; /* true if ISO 8613 extension */ +#endif +} SavedCursor; + +typedef struct _SaveTitle { + struct _SaveTitle *next; + char *iconName; + char *windowName; +} SaveTitle; + +#define SAVED_CURSORS 2 + +typedef struct { + int width; /* if > 0, width of scrollbar, */ + /* and scrollbar is showing */ + Boolean rv_cached; /* see ScrollBarReverseVideo */ + int rv_active; /* ...current reverse-video */ + Pixel bg; /* ...cached background color */ + Pixel fg; /* ...cached foreground color */ + Pixel bdr; /* ...cached border color */ + Pixmap bdpix; /* ...cached border pixmap */ +} SbInfo; + +#if OPT_TOOLBAR +typedef struct { + Widget menu_bar; /* toolbar, if initialized */ + Dimension menu_height; /* ...and its height */ + Dimension menu_border; /* ...and its border */ +} TbInfo; +#define VT100_TB_INFO(name) screen.fullVwin.tb_info.name +#endif + +typedef struct { + Window window; /* X window id */ + int width; /* width of columns */ + int height; /* height of rows */ + Dimension fullwidth; /* full width of window */ + Dimension fullheight; /* full height of window */ + int f_width; /* width of fonts in pixels */ + int f_height; /* height of fonts in pixels */ + int f_ascent; /* ascent of font in pixels */ + int f_descent; /* descent of font in pixels */ + SbInfo sb_info; + GC filler_gc; /* filler's fg/bg */ + GC border_gc; /* inner border's fg/bg */ +#if USE_DOUBLE_BUFFER + Drawable drawable; /* X drawable id */ +#endif +#if OPT_TOOLBAR + Boolean active; /* true if toolbars are used */ + TbInfo tb_info; /* toolbar information */ +#endif +} VTwin; + +typedef struct { + Window window; /* X window id */ + int width; /* width of columns */ + int height; /* height of rows */ + Dimension fullwidth; /* full width of window */ + Dimension fullheight; /* full height of window */ + double tekscale; /* scale factor Tek -> vs100 */ +} TKwin; + +typedef struct { + char *f_n; /* the normal font */ + char *f_b; /* the bold font */ +#if OPT_WIDE_CHARS + char *f_w; /* the normal wide font */ + char *f_wb; /* the bold wide font */ +#endif +} VTFontNames; + +typedef struct { + char **list_n; /* the normal font */ + char **list_b; /* the bold font */ +#if OPT_WIDE_ATTRS || OPT_RENDERWIDE + char **list_i; /* italic font (Xft only) */ + char **list_bi; /* bold-italic font (Xft only) */ +#endif +#if OPT_WIDE_CHARS + char **list_w; /* the normal wide font */ + char **list_wb; /* the bold wide font */ + char **list_wi; /* wide italic font (Xft only) */ + char **list_wbi; /* wide bold-italic font (Xft only) */ +#endif +} VTFontList; + +typedef struct { + VTFontList x11; +#if OPT_RENDERFONT + VTFontList xft; +#endif +} XtermFontNames; + +typedef struct { + VTFontNames default_font; + String menu_font_names[NMENUFONTS][fMAX]; + XtermFontNames fonts; +} SubResourceRec; + +#if OPT_INPUT_METHOD +#define NINPUTWIDGETS 3 +typedef struct { + Widget w; + XIM xim; /* input method attached to 'w' */ + XIC xic; /* input context attached to 'xim' */ +} TInput; +#endif + +typedef enum { + CURSOR_BLOCK = 2 + , CURSOR_UNDERLINE = 4 + , CURSOR_BAR = 6 +} XtCursorShape; + +#define isCursorBlock(s) ((s)->cursor_shape == CURSOR_BLOCK) +#define isCursorUnderline(s) ((s)->cursor_shape == CURSOR_UNDERLINE) +#define isCursorBar(s) ((s)->cursor_shape == CURSOR_BAR) + +typedef enum { + DEFAULT_STYLE = 0 + , BLINK_BLOCK + , STEADY_BLOCK + , BLINK_UNDERLINE + , STEADY_UNDERLINE + , BLINK_BAR + , STEADY_BAR +} XtCursorStyle; + +#if OPT_GRAPHICS +#define GraphicsId(screen) (\ + (screen)->graphics_id \ + ? (screen)->graphics_id \ + : (screen)->terminal_id) +#else +#define GraphicsId(screen) (screen)->terminal_id +#endif + +#if OPT_REGIS_GRAPHICS +#define optRegisGraphics(screen) \ + (GraphicsId(screen) == 240 || \ + GraphicsId(screen) == 241 || \ + GraphicsId(screen) == 330 || \ + GraphicsId(screen) == 340) +#else +#define optRegisGraphics(screen) False +#endif + +#if OPT_SIXEL_GRAPHICS +#define optSixelGraphics(screen) \ + (GraphicsId(screen) == 240 || \ + GraphicsId(screen) == 241 || \ + GraphicsId(screen) == 330 || \ + GraphicsId(screen) == 340 || \ + GraphicsId(screen) == 382) +#else +#define optSixelGraphics(screen) False +#endif + +typedef struct { +/* These parameters apply to both windows */ + Display *display; /* X display for screen */ + int respond; /* socket for responses + (position report, etc.) */ + int nextEventDelay; /* msecs to delay for x-events */ +/* These parameters apply to VT100 window */ + IChar *unparse_bfr; + unsigned unparse_len; + unsigned unparse_max; /* limitResponse resource */ + +#if OPT_TCAP_QUERY + int tc_query_code; + Bool tc_query_fkey; +#endif + pid_t pid; /* pid of process on far side */ + uid_t uid; /* user id of actual person */ + gid_t gid; /* group id of actual person */ + ColorRes Tcolors[NCOLORS]; /* terminal colors */ +#if OPT_HIGHLIGHT_COLOR + Boolean hilite_color; /* hilite colors override */ + Boolean hilite_reverse; /* hilite overrides reverse */ +#endif +#if OPT_ISO_COLORS + XColor * cmap_data; /* color table */ + unsigned cmap_size; + ColorRes Acolors[MAXCOLORS]; /* ANSI color emulation */ + int veryBoldColors; /* modifier for boldColors */ + Boolean boldColors; /* can we make bold colors? */ + Boolean colorMode; /* are we using color mode? */ + Boolean colorULMode; /* use color for underline? */ + Boolean italicULMode; /* italic font for underline? */ + Boolean colorBDMode; /* use color for bold? */ + Boolean colorBLMode; /* use color for blink? */ + Boolean colorRVMode; /* use color for reverse? */ + Boolean colorAttrMode; /* prefer colorUL/BD to SGR */ +#if OPT_WIDE_ATTRS + Boolean colorITMode; /* use color for italics? */ +#endif +#if OPT_DIRECT_COLOR + Boolean direct_color; /* direct-color enabled? */ +#endif +#endif /* OPT_ISO_COLORS */ +#if OPT_DEC_CHRSET + Boolean font_doublesize;/* enable font-scaling */ + int cache_doublesize;/* limit of our cache */ + Char cur_chrset; /* character-set index & code */ + int fonts_used; /* count items in double_fonts */ + XTermFonts double_fonts[NUM_CHRSET]; +#if OPT_RENDERFONT + XftFont * double_xft_fonts[NUM_CHRSET]; +#endif +#endif /* OPT_DEC_CHRSET */ +#if OPT_DEC_RECTOPS + int cur_decsace; /* parameter for DECSACE */ + int checksum_ext; /* extensions for DECRQCRA */ + int checksum_ext0; /* initial checksumExtension */ +#endif +#if OPT_WIDE_CHARS + Boolean wide_chars; /* true when 16-bit chars */ + Boolean vt100_graphics; /* true to allow vt100-graphics */ + Boolean utf8_inparse; /* true to enable UTF-8 parser */ + Boolean normalized_c; /* true to precompose to Form C */ + char * utf8_mode_s; /* use UTF-8 decode/encode */ + char * utf8_fonts_s; /* use UTF-8 decode/encode */ + char * utf8_title_s; /* use UTF-8 titles */ + int utf8_nrc_mode; /* saved UTF-8 mode for DECNRCM */ + Boolean utf8_always; /* special case for wideChars */ + int utf8_mode; /* use UTF-8 decode/encode: 0-2 */ + int utf8_fonts; /* use UTF-8 fonts: 0-2 */ + int utf8_title; /* use UTF-8 EWHM props: 0-2 */ + int max_combining; /* maximum # of combining chars */ + Boolean utf8_latin1; /* use UTF-8 with Latin-1 bias */ + Boolean utf8_weblike; /* use UTF-8 with browser bias */ + int latin9_mode; /* poor man's luit, latin9 */ + int unicode_font; /* font uses unicode encoding */ + int utf_count; /* state of utf_char */ + IChar utf_char; /* in-progress character */ + Boolean char_was_written; + int last_written_col; + int last_written_row; + TypedBuffer(XChar2b); + TypedBuffer(char); +#endif +#if OPT_BROKEN_OSC + Boolean brokenLinuxOSC; /* true to ignore Linux palette ctls */ +#endif +#if OPT_BROKEN_ST + Boolean brokenStringTerm; /* true to match old OSC parse */ +#endif +#if OPT_C1_PRINT || OPT_WIDE_CHARS + Boolean c1_printable; /* true if we treat C1 as print */ +#endif + int border; /* inner border */ + int scrollBarBorder; /* scrollBar border */ + long event_mask; + unsigned send_mouse_pos; /* user wants mouse transition */ + /* and position information */ + int extend_coords; /* support large terminals */ +#if OPT_FOCUS_EVENT + Boolean send_focus_pos; /* user wants focus in/out info */ +#endif + Boolean quiet_grab; /* true if no cursor change on focus */ +#if OPT_PASTE64 + Cardinal base64_paste; /* set to send paste in base64 */ + int base64_final; /* string-terminator for paste */ + /* _qWriteSelectionData expects these to be initialized to zero. + * base64_flush() is the last step of the conversion, it clears these + * variables. + */ + unsigned base64_accu; + unsigned base64_count; + unsigned base64_pad; +#endif +#if OPT_PASTE64 || OPT_READLINE + unsigned paste_brackets; + /* not part of bracketed-paste, these are here to simplify ifdefs */ + unsigned dclick3_deletes; + unsigned paste_literal_nl; +#endif +#if OPT_READLINE + unsigned click1_moves; + unsigned paste_moves; + unsigned paste_quotes; +#endif /* OPT_READLINE */ +#if OPT_DEC_LOCATOR + Boolean locator_reset; /* turn mouse off after 1 report? */ + Boolean locator_pixels; /* report in pixels? */ + /* if false, report in cells */ + unsigned locator_events; /* what events to report */ + Boolean loc_filter; /* is filter rectangle active? */ + int loc_filter_top; /* filter rectangle for DEC Locator */ + int loc_filter_left; + int loc_filter_bottom; + int loc_filter_right; +#endif /* OPT_DEC_LOCATOR */ + int mouse_button; /* current button pressed */ + int mouse_row; /* ...and its row */ + int mouse_col; /* ...and its column */ + int select; /* xterm selected */ + Boolean bellOnReset; /* bellOnReset */ + Boolean visualbell; /* visual bell mode */ + Boolean poponbell; /* pop on bell mode */ + + Boolean eraseSavedLines; /* eraseSavedLines option */ + Boolean eraseSavedLines0; /* initial eraseSavedLines */ + Boolean tabCancelsWrap; /* tabCancelsWrap option */ + + Boolean allowPasteControls; /* PasteControls mode */ + Boolean allowColorOps; /* ColorOps mode */ + Boolean allowFontOps; /* FontOps mode */ + Boolean allowMouseOps; /* MouseOps mode */ + Boolean allowSendEvents;/* SendEvent mode */ + Boolean allowTcapOps; /* TcapOps mode */ + Boolean allowTitleOps; /* TitleOps mode */ + Boolean allowWindowOps; /* WindowOps mode */ + + Boolean allowPasteControl0; /* PasteControls mode */ + Boolean allowColorOp0; /* initial ColorOps mode */ + Boolean allowFontOp0; /* initial FontOps mode */ + Boolean allowMouseOp0; /* initial MouseOps mode */ + Boolean allowSendEvent0;/* initial SendEvent mode */ + Boolean allowTcapOp0; /* initial TcapOps mode */ + Boolean allowTitleOp0; /* initial TitleOps mode */ + Boolean allowWindowOp0; /* initial WindowOps mode */ + + String disallowedColorOps; + char disallow_color_ops[ecLAST]; + + String disallowedFontOps; + char disallow_font_ops[efLAST]; + + String disallowedMouseOps; + char disallow_mouse_ops[emLAST]; + + String disallowedPasteControls; + char disallow_paste_controls[epLAST]; + + String disallowedTcapOps; + char disallow_tcap_ops[etLAST]; + + String disallowedWinOps; + char disallow_win_ops[ewLAST]; + + Boolean awaitInput; /* select-timeout mode */ + Boolean grabbedKbd; /* keyboard is grabbed */ +#ifdef ALLOWLOGGING + int logging; /* logging mode */ + int logfd; /* file descriptor of log */ + char *logfile; /* log file name */ + Char *logstart; /* current start of log buffer */ +#endif + int inhibit; /* flags for inhibiting changes */ + +/* VT window parameters */ + Boolean Vshow; /* VT window showing */ + VTwin fullVwin; + int needSwap; +#ifndef NO_ACTIVE_ICON + VTwin iconVwin; + VTwin *whichVwin; +#endif /* NO_ACTIVE_ICON */ + + int pointer_mode; /* when to use hidden_cursor */ + int pointer_mode0; /* ...initial value */ + Boolean hide_pointer; /* true to use "hidden_cursor" */ + Cursor pointer_cursor; /* pointer cursor in window */ + Cursor hidden_cursor; /* hidden cursor in window */ + + String answer_back; /* response to ENQ */ + + PrinterState printer_state; /* actual printer state */ + PrinterFlags printer_flags; /* working copy of printer flags */ +#if OPT_PRINT_ON_EXIT + Boolean write_error; +#endif + + Boolean fnt_prop; /* true if proportional fonts */ + unsigned fnt_boxes; /* 0=no boxes, 1=old, 2=unicode */ + Boolean force_packed; /* true to override proportional */ +#if OPT_BOX_CHARS + Boolean force_box_chars;/* true if we assume no boxchars */ + Boolean broken_box_chars;/* true if broken boxchars */ + Boolean force_all_chars;/* true to outline missing chars */ + Boolean assume_all_chars;/* true to allow missing chars */ + Boolean allow_packing; /* true to allow packed-fonts */ +#endif + Dimension fnt_wide; + Dimension fnt_high; + float scale_height; /* scaling for font-height */ + XTermFonts fnts[fMAX]; /* normal/bold/etc for terminal */ + Boolean free_bold_box; /* same_font_size's austerity */ + Boolean allowBoldFonts; /* do we use bold fonts at all? */ +#if OPT_WIDE_ATTRS + XTermFonts ifnts[fMAX]; /* normal/bold/etc italic fonts */ + Boolean ifnts_ok; /* true if ifnts[] is cached */ +#endif +#ifndef NO_ACTIVE_ICON + XTermFonts fnt_icon; /* icon font */ + String icon_fontname; /* name of icon font */ + int icon_fontnum; /* number to use for icon font */ +#endif /* NO_ACTIVE_ICON */ + int enbolden; /* overstrike for bold font */ + XPoint *box; /* draw unselected cursor */ + + int cursor_state; /* ON, OFF, or BLINKED_OFF */ + int cursor_busy; /* do not redraw... */ + Boolean cursor_underline; /* true if cursor is in underline mode */ + XtCursorShape cursor_shape; +#if OPT_BLINK_CURS + BlinkOps cursor_blink; /* cursor blink enable */ + BlinkOps cursor_blink_i; /* save cursor blink enable */ + char * cursor_blink_s; /* ...resource cursorBlink */ + int cursor_blink_esc; /* cursor blink escape-state */ + Boolean cursor_blink_xor; /* how to merge menu/escapes */ +#endif +#if OPT_BLINK_TEXT + Boolean blink_as_bold; /* text blink disable */ +#endif +#if OPT_BLINK_CURS || OPT_BLINK_TEXT + int blink_state; /* ON, OFF, or BLINKED_OFF */ + int blink_on; /* cursor on time (msecs) */ + int blink_off; /* cursor off time (msecs) */ + XtIntervalId blink_timer; /* timer-id for cursor-proc */ +#endif +#if OPT_ZICONBEEP + Boolean zIconBeep_flagged; /* True if icon name was changed */ +#endif /* OPT_ZICONBEEP */ + int cursor_GC; /* see ShowCursor() */ + int cursor_set; /* requested state */ + CELL cursorp; /* previous cursor row/column */ + int cur_col; /* current cursor column */ + int cur_row; /* current cursor row */ + int max_col; /* rightmost column */ + int max_row; /* bottom row */ + int top_marg; /* top line of scrolling region */ + int bot_marg; /* bottom line of " " */ + int lft_marg; /* left column of " " */ + int rgt_marg; /* right column of " " */ + Widget scrollWidget; /* pointer to scrollbar struct */ +#if USE_DOUBLE_BUFFER + int buffered_sb; /* nonzero when pending update */ + struct timeval buffered_at; /* reference time, for FPS */ +#define DbeMsecs(xw) (1000L / (long) resource.buffered_fps) +#endif + /* + * Indices used to keep track of the top of the vt100 window and + * the saved lines, taking scrolling into account. + */ + int topline; /* line number of top, <= 0 */ + long saved_fifo; /* number of lines that've ever been saved */ + int savedlines; /* number of lines that've been saved */ + int savelines; /* number of lines off top to save */ + int scroll_amt; /* amount to scroll */ + int refresh_amt; /* amount to refresh */ + /* + * Working variables for getLineData(). + */ + size_t lineExtra; /* extra space for combining chars */ + size_t cellExtra; /* extra space for combining chars */ + /* + * Pointer to the current visible buffer. + */ + ScrnBuf visbuf; /* ptr to visible screen buf (main) */ + /* + * Data for the normal buffer, which may have saved lines to which + * the user can scroll. + */ + ScrnBuf saveBuf_index; + Char *saveBuf_data; + /* + * Data for visible and alternate buffer. + */ + ScrnBuf editBuf_index[2]; + Char *editBuf_data[2]; + int whichBuf; /* 0/1 for normal/alternate buf */ + Boolean is_running; /* true when buffers are legal */ + /* + * Workspace used for screen operations. + */ + Char **save_ptr; /* workspace for save-pointers */ + size_t save_len; /* ...and its length */ + + int scrolllines; /* number of lines to button scroll */ + Boolean alternateScroll; /* scroll-actions become keys */ + Boolean scrollttyoutput; /* scroll to bottom on tty output */ + Boolean scrollkey; /* scroll to bottom on key */ + Boolean cursor_moved; /* scrolling makes cursor move */ + + Boolean do_wrap; /* true if cursor in last column + and character just output */ + + int incopy; /* 0 idle; 1 XCopyArea issued; + -1 first GraphicsExpose seen, + but last not seen */ + int copy_src_x; /* params from last XCopyArea ... */ + int copy_src_y; + unsigned int copy_width; + unsigned int copy_height; + int copy_dest_x; + int copy_dest_y; + + Dimension embed_wide; + Dimension embed_high; + + Boolean c132; /* allow change to 132 columns */ + Boolean curses; /* kludge line wrap for more */ + Boolean hp_ll_bc; /* kludge HP-style ll for xdb */ + Boolean marginbell; /* true if margin bell on */ + int nmarginbell; /* columns from right margin */ + int bellArmed; /* cursor below bell margin */ + BellVolume marginVolume; /* margin-bell volume */ + BellVolume warningVolume; /* warning-bell volume */ + Boolean multiscroll; /* true if multi-scroll */ + int scrolls; /* outstanding scroll count, + used only with multiscroll */ + SavedCursor sc[SAVED_CURSORS]; /* data for restore cursor */ + IFlags save_modes[DP_LAST]; /* save dec/xterm private modes */ + + int title_modes; /* control set/get of titles */ + int title_modes0; /* ...initial value */ + SaveTitle *save_title; + + /* Improved VT100 emulation stuff. */ + String keyboard_dialect; /* default keyboard dialect */ + DECNRCM_codes gsets[NUM_GSETS]; /* G0 through G3. */ + Char curgl; /* Current GL setting. */ + Char curgr; /* Current GR setting. */ + Char curss; /* Current single shift. */ + String term_id; /* resource for terminal_id */ + int terminal_id; /* 100=vt100, 220=vt220, etc. */ + int vtXX_level; /* 0=vt52, 1,2,3 = vt100 ... vt320 */ + int ansi_level; /* dpANSI levels 1,2,3 */ + int protected_mode; /* 0=off, 1=DEC, 2=ISO */ + Boolean always_bold_mode; /* compare normal/bold font */ + Boolean always_highlight; /* whether to highlight cursor */ + Boolean bold_mode; /* use bold font or overstrike */ + Boolean delete_is_del; /* true for compatible Delete key */ + Boolean jumpscroll; /* whether we should jumpscroll */ + Boolean fastscroll; /* whether we should fastscroll */ + Boolean old_fkeys; /* true for compatible fkeys */ + Boolean old_fkeys0; /* ...initial value */ + Boolean underline; /* whether to underline text */ + +#if OPT_MAXIMIZE + Boolean restore_data; + int restore_x; + int restore_y; + unsigned restore_width; + unsigned restore_height; +#endif + +#if OPT_REGIS_GRAPHICS + String graphics_regis_default_font; /* font for "builtin" */ + + String graphics_regis_screensize; /* given a size in pixels */ + Dimension graphics_regis_def_wide; /* ...corresponding width */ + Dimension graphics_regis_def_high; /* ...and height */ +#endif + +#if OPT_GRAPHICS + String graph_id; /* resource for graphics_id */ + int graphics_id; /* based on terminal_id */ + String graphics_max_size; /* given a size in pixels */ + Dimension graphics_max_wide; /* ...corresponding width */ + Dimension graphics_max_high; /* ...and height */ +#endif + +#if OPT_SCROLL_LOCK + Boolean allowScrollLock;/* ScrollLock mode */ + Boolean allowScrollLock0;/* initial ScrollLock mode */ + Boolean scroll_lock; /* true to keep buffer in view */ + Boolean scroll_dirty; /* scrolling makes screen dirty */ +#endif + +#if OPT_SIXEL_GRAPHICS + Boolean sixel_scrolling; /* sixel scrolling */ + Boolean sixel_scrolls_right; /* sixel scrolling moves cursor to right */ +#endif + +#if OPT_GRAPHICS + int numcolorregisters; /* number of supported color registers */ + Boolean privatecolorregisters; /* private color registers for each graphic */ +#endif + +#if OPT_VT52_MODE + IFlags vt52_save_flags; + Char vt52_save_curgl; + Char vt52_save_curgr; + Char vt52_save_curss; + DECNRCM_codes vt52_save_gsets[NUM_GSETS]; +#endif + /* Testing */ +#if OPT_XMC_GLITCH + unsigned xmc_glitch; /* # of spaces to pad on SGR's */ + IAttr xmc_attributes; /* attrs that make a glitch */ + Boolean xmc_inline; /* SGR's propagate only to eol */ + Boolean move_sgr_ok; /* SGR is reset on move */ +#endif + + /* + * Bell + */ + int visualBellDelay; /* msecs to delay for visibleBell */ + int bellSuppressTime; /* msecs after Bell before another allowed */ + Boolean bellInProgress; /* still ringing/flashing prev bell? */ + Boolean bellIsUrgent; /* set XUrgency WM hint on bell */ + Boolean flash_line; /* show visualBell as current line */ + /* + * Select/paste state. + */ + Boolean selectToClipboard; /* primary vs clipboard */ + String *mappedSelect; /* mapping for "SELECT" to "PRIMARY" */ + + Boolean waitingForTrackInfo; + int numberOfClicks; + int maxClicks; + int multiClickTime; /* time between multiclick selects */ + SelectUnit selectUnit; + SelectUnit selectMap[NSELECTUNITS]; + String onClick[NSELECTUNITS + 1]; + + char *charClass; /* for overriding word selection */ + Boolean cutNewline; /* whether or not line cut has \n */ + Boolean cutToBeginningOfLine; /* line cuts to BOL? */ + Boolean highlight_selection; /* controls appearance of selection */ + Boolean show_wrap_marks; /* show lines which are wrapped */ + Boolean trim_selection; /* controls trimming of selection */ + Boolean i18nSelections; + Boolean brokenSelections; + Boolean keepClipboard; /* retain data sent to clipboard */ + Boolean keepSelection; /* do not lose selection on output */ + Boolean replyToEmacs; /* Send emacs escape code when done selecting or extending? */ + + SelectedCells clipboard_data; /* what we sent to the clipboard */ + + EventMode eventMode; + Time selection_time; /* latest event timestamp */ + Time lastButtonUpTime; + unsigned lastButton; + +#define MAX_CUT_BUFFER 8 /* CUT_BUFFER0 to CUT_BUFFER7 */ +#define MAX_SELECTIONS (MAX_SELECTION_CODES + MAX_CUT_BUFFER) + SelectedCells selected_cells[MAX_SELECTIONS]; + + CELL rawPos; /* raw position for selection start */ + CELL startRaw; /* area before selectUnit processing */ + CELL endRaw; /* " " */ + CELL startSel; /* area after selectUnit processing */ + CELL endSel; /* " " */ + CELL startH; /* start highlighted text */ + CELL endH; /* end highlighted text */ + CELL saveStartW; /* saved WORD state, for LINE */ + CELL startExt; /* Start, end of extension */ + CELL endExt; /* " " */ + CELL saveStartR; /* Saved values of raw selection for extend to restore to */ + CELL saveEndR; /* " " */ + int startHCoord, endHCoord; + int firstValidRow; /* Valid rows for selection clipping */ + int lastValidRow; /* " " */ + + Boolean selectToBuffer; /* copy selection to buffer */ + InternalSelect internal_select; + + String default_string; + String eightbit_select_types; + Atom* selection_targets_8bit; +#if OPT_WIDE_CHARS + String utf8_select_types; + Atom* selection_targets_utf8; +#endif + Atom* selection_atoms; /* which selections we own */ + Cardinal sel_atoms_size; /* how many atoms allocated */ + Cardinal selection_count; /* how many atoms in use */ +#if OPT_SELECT_REGEX + char * selectExpr[NSELECTUNITS]; +#endif + /* + * Input/output state. + */ + Boolean input_eight_bits; /* do not send ESC when meta pressed */ + int eight_bit_meta; /* use 8th bit when meta pressed */ + char * eight_bit_meta_s; /* ...resource eightBitMeta */ + Boolean output_eight_bits; /* honor all bits or strip */ + Boolean control_eight_bits; /* send CSI as 8-bits */ + Boolean backarrow_key; /* backspace/delete */ + Boolean alt_is_not_meta; /* use both Alt- and Meta-key */ + Boolean alt_sends_esc; /* Alt-key sends ESC prefix */ + Boolean meta_sends_esc; /* Meta-key sends ESC prefix */ + /* + * Fonts + */ + Pixmap menu_item_bitmap; /* mask for checking items */ + String initial_font; + char * menu_font_names[NMENUFONTS][fMAX]; +#define MenuFontName(n) menu_font_names[n][fNorm] +#define EscapeFontName() MenuFontName(fontMenu_fontescape) +#define SelectFontName() MenuFontName(fontMenu_fontsel) + long menu_font_sizes[NMENUFONTS]; + int menu_font_number; +#if OPT_LOAD_VTFONTS || OPT_WIDE_CHARS + Boolean savedVTFonts; + Boolean mergedVTFonts; + SubResourceRec cacheVTFonts; +#endif +#if OPT_CLIP_BOLD + Boolean use_border_clipping; + Boolean use_clipping; +#endif + void * main_cgs_cache; +#ifndef NO_ACTIVE_ICON + void * icon_cgs_cache; +#endif +#if OPT_RENDERFONT + Boolean force_xft_height; + ListXftFonts *list_xft_fonts; + XTermXftFonts renderFontNorm[NMENUFONTS]; + XTermXftFonts renderFontBold[NMENUFONTS]; + XTermXftFonts renderFontItal[NMENUFONTS]; + XTermXftFonts renderFontBtal[NMENUFONTS]; +#if OPT_RENDERWIDE + XTermXftFonts renderWideNorm[NMENUFONTS]; + XTermXftFonts renderWideBold[NMENUFONTS]; + XTermXftFonts renderWideItal[NMENUFONTS]; + XTermXftFonts renderWideBtal[NMENUFONTS]; + TypedBuffer(XftCharSpec); +#else + TypedBuffer(XftChar8); +#endif + XftDraw * renderDraw; +#endif +#if OPT_DABBREV + Boolean dabbrev_working; /* nonzero during dabbrev process */ + unsigned char dabbrev_erase_char; /* used for deleting inserted completion */ +#endif + char tcapbuf[TERMCAP_SIZE]; + char tcap_area[TERMCAP_SIZE]; +#if OPT_TCAP_FKEYS + char ** tcap_fkeys; +#endif +} TScreen; + +typedef XTermFonts *(*MyGetFont) (TScreen *, int); + +typedef struct _TekPart { + XFontStruct * Tfont[TEKNUMFONTS]; + int tobaseline[TEKNUMFONTS]; /* top-baseline, each font */ + char * initial_font; /* large, 2, 3, small */ + char * gin_terminator_str; /* ginTerminator resource */ +#if OPT_TOOLBAR + TbInfo tb_info; /* toolbar information */ +#endif +} TekPart; + +/* Tektronix window parameters */ +typedef struct _TekScreen { + GC TnormalGC; /* normal painting */ + GC TcursorGC; /* normal cursor painting */ + + Boolean waitrefresh; /* postpone refresh */ + TKwin fullTwin; +#ifndef NO_ACTIVE_ICON + TKwin iconTwin; + TKwin *whichTwin; +#endif /* NO_ACTIVE_ICON */ + + Cursor arrow; /* arrow cursor */ + GC linepat[TEKNUMLINES]; /* line patterns */ + int cur_X; /* current x */ + int cur_Y; /* current y */ + Tmodes cur; /* current tek modes */ + Tmodes page; /* starting tek modes on page */ + int margin; /* 0 -> margin 1, 1 -> margin 2 */ + int pen; /* current Tektronix pen 0=up, 1=dn */ + char *TekGIN; /* nonzero if Tektronix GIN mode*/ + int gin_terminator; /* Tek strap option */ + char tcapbuf[TERMCAP_SIZE]; +} TekScreen; + +#if OPT_PASTE64 || OPT_READLINE +#define SCREEN_FLAG(screenp,f) (1&(screenp)->f) +#define SCREEN_FLAG_set(screenp,f) ((screenp)->f |= 1) +#define SCREEN_FLAG_unset(screenp,f) ((screenp)->f &= (unsigned) ~1L) +#define SCREEN_FLAG_save(screenp,f) \ + ((screenp)->f = (((screenp)->f)<<1) | SCREEN_FLAG(screenp,f)) +#define SCREEN_FLAG_restore(screenp,f) ((screenp)->f = (((screenp)->f)>>1)) +#else +#define SCREEN_FLAG(screenp,f) (0) +#endif + +/* + * After screen-updates, reset the flag that tells us we should do wrapping. + * Likewise, reset (in wide-character mode) the flag that tells us where the + * "previous" character was written. + */ +#if OPT_WIDE_CHARS +#define ResetWrap(screen) \ + (screen)->do_wrap = \ + (screen)->char_was_written = False +#else +#define ResetWrap(screen) \ + (screen)->do_wrap = False +#endif + +/* meaning of bits in screen.select flag */ +#define INWINDOW 01 /* the mouse is in one of the windows */ +#define FOCUS 02 /* one of the windows is the focus window */ + +#define MULTICLICKTIME 250 /* milliseconds */ + +typedef struct { + const char *name; + int code; +} FlagList; + +typedef enum { + keyboardIsLegacy, /* bogus vt220 codes for F1-F4, etc. */ + keyboardIsDefault, + keyboardIsHP, + keyboardIsSCO, + keyboardIsSun, + keyboardIsTermcap, + keyboardIsVT220 +} xtermKeyboardType; + +typedef enum { /* legal values for screen.pointer_mode */ + pNever = 0 + , pNoMouse = 1 + , pAlways = 2 + , pFocused = 3 +} pointerModeTypes; + +typedef enum { /* legal values for screen.utf8_mode */ + uFalse = 0 + , uTrue = 1 + , uAlways = 2 + , uDefault = 3 + , uLast +} utf8ModeTypes; + +typedef enum { /* legal values for screen.eight_bit_meta */ + ebFalse = 0 + , ebTrue = 1 + , ebNever = 2 + , ebLocale = 3 + , ebLast +} ebMetaModeTypes; + +#define NAME_OLD_KT " legacy" + +#if OPT_HP_FUNC_KEYS +#define NAME_HP_KT " hp" +#else +#define NAME_HP_KT /*nothing*/ +#endif + +#if OPT_SCO_FUNC_KEYS +#define NAME_SCO_KT " sco" +#else +#define NAME_SCO_KT /*nothing*/ +#endif + +#if OPT_SUN_FUNC_KEYS +#define NAME_SUN_KT " sun" +#else +#define NAME_SUN_KT /*nothing*/ +#endif + +#if OPT_SUNPC_KBD +#define NAME_VT220_KT " vt220" +#else +#define NAME_VT220_KT /*nothing*/ +#endif + +#if OPT_TCAP_FKEYS +#define NAME_TCAP_KT " tcap" +#else +#define NAME_TCAP_KT /*nothing*/ +#endif + +#define KEYBOARD_TYPES NAME_TCAP_KT NAME_HP_KT NAME_SCO_KT NAME_SUN_KT NAME_VT220_KT + +#if OPT_TRACE +#define TRACE_RC(code,func) code = func +#else +#define TRACE_RC(code,func) func +#endif + +extern const char * visibleKeyboardType(xtermKeyboardType); + +typedef struct +{ + int allow_keys; /* how to handle legacy/vt220 keyboard */ + int cursor_keys; /* how to handle cursor-key modifiers */ + int function_keys; /* how to handle function-key modifiers */ + int keypad_keys; /* how to handle keypad key-modifiers */ + int other_keys; /* how to handle other key-modifiers */ + int string_keys; /* how to handle string() modifiers */ +} TModify; + +typedef struct +{ + xtermKeyboardType type; + IFlags flags; + char *shell_translations; + char *xterm_translations; + char *extra_translations; +#if OPT_INITIAL_ERASE + int reset_DECBKM; /* reset should set DECBKM */ +#endif +#if OPT_MOD_FKEYS + TModify modify_now; /* current modifier value */ + TModify modify_1st; /* original modifier value, for resets */ + int format_keys; /* format of modifyOtherKeys */ +#endif +} TKeyboard; + +#define GravityIsNorthWest(w) ((w)->misc.resizeGravity == NorthWestGravity) +#define GravityIsSouthWest(w) ((w)->misc.resizeGravity == SouthWestGravity) + +typedef struct _Misc { + VTFontNames default_font; + char *geo_metry; + char *T_geometry; +#if OPT_WIDE_CHARS + Boolean cjk_width; /* true for built-in CJK wcwidth() */ + Boolean mk_width; /* true for simpler built-in wcwidth() */ + int mk_samplesize; + int mk_samplepass; +#endif +#if OPT_LUIT_PROG + Boolean callfilter; /* true to invoke luit */ + Boolean use_encoding; /* true to use -encoding option for luit */ + char *locale_str; /* "locale" resource */ + char *localefilter; /* path for luit */ +#endif + fontWarningTypes fontWarnings; + int limit_resize; +#ifdef ALLOWLOGGING + Boolean log_on; +#endif + Boolean color_inner_border; + Boolean login_shell; + Boolean re_verse; + Boolean re_verse0; /* initial value of "-rv" */ + XtGravity resizeGravity; + Boolean reverseWrap; + Boolean autoWrap; + Boolean logInhibit; + Boolean signalInhibit; +#if OPT_TEK4014 + Boolean tekInhibit; + Boolean tekSmall; /* start tek window in small size */ + Boolean TekEmu; /* true if Tektronix emulation */ + Boolean Tshow; /* Tek window showing */ +#endif + Boolean scrollbar; +#ifdef SCROLLBAR_RIGHT + Boolean useRight; +#endif + Boolean titeInhibit; + Boolean tiXtraScroll; /* scroll on ti/te */ + Boolean cdXtraScroll; /* scroll on cd (clear-display) */ + Boolean appcursorDefault; + Boolean appkeypadDefault; +#if OPT_INPUT_METHOD + char* f_x; /* font for XIM */ + char* input_method; + char* preedit_type; + Boolean open_im; /* true if input-method is opened */ + int retry_im; +#endif + Boolean dynamicColors; +#ifndef NO_ACTIVE_ICON + char *active_icon_s; /* use application icon window */ + unsigned icon_border_width; + Pixel icon_border_pixel; +#endif /* NO_ACTIVE_ICON */ +#if OPT_DEC_SOFTFONT + Boolean font_loadable; +#endif +#if OPT_SHIFT_FONTS + Boolean shift_fonts; /* true if we interpret fontsize-shifting */ +#endif +#if OPT_SUNPC_KBD + int ctrl_fkeys; /* amount to add to XK_F1 for ctrl modifier */ +#endif +#if OPT_NUM_LOCK + Boolean real_NumLock; /* true if we treat NumLock key specially */ + Boolean alwaysUseMods; /* true if we always want f-key modifiers */ +#endif +#if OPT_RENDERFONT + VTFontNames default_xft; + float face_size[NMENUFONTS]; + char *render_font_s; + int limit_fontsets; +#endif +} Misc; + +typedef struct _Work { + int dummy; +#ifdef SunXK_F36 +#define MAX_UDK 37 +#else +#define MAX_UDK 35 +#endif + struct { + char *str; + int len; + } user_keys[MAX_UDK]; +#ifndef NO_ACTIVE_ICON + int active_icon; /* use application icon window */ + char *wm_name; +#endif /* NO_ACTIVE_ICON */ +#if OPT_INPUT_METHOD + Boolean cannot_im; /* true if we cannot use input-method */ + XFontSet xim_fs; /* fontset for XIM preedit */ + int xim_fs_ascent; /* ascent of fs */ + TInput inputs[NINPUTWIDGETS]; +#endif + Boolean doing_resize; /* currently in RequestResize */ +#if OPT_MAXIMIZE +#define MAX_EWMH_MODE 3 +#define MAX_EWMH_DATA (1 + OPT_TEK4014) + struct { + int mode; /* fullscreen, etc. */ + Boolean checked[MAX_EWMH_MODE + 1]; + Boolean allowed[MAX_EWMH_MODE + 1]; + } ewmh[MAX_EWMH_DATA]; +#endif +#if OPT_NUM_LOCK + unsigned num_lock; /* modifier for Num_Lock */ + unsigned alt_mods; /* modifier for Alt_L or Alt_R */ + unsigned meta_mods; /* modifier for Meta_L or Meta_R */ +#endif + XtermFontNames fonts; +#if OPT_RENDERFONT + Boolean render_font; + unsigned max_fontsets; +#endif +#if OPT_DABBREV +#define MAX_DABBREV 1024 /* maximum word length as in tcsh */ + char dabbrev_data[MAX_DABBREV]; +#endif + ScrnColors *oldColors; + Boolean palette_changed; + Boolean broken_box_chars; +} Work; + +typedef struct {int foo;} XtermClassPart, TekClassPart; + +typedef struct _XtermClassRec { + CoreClassPart core_class; + XtermClassPart xterm_class; +} XtermClassRec; + +extern WidgetClass xtermWidgetClass; + +#define IsXtermWidget(w) (XtClass(w) == xtermWidgetClass) + +#if OPT_TEK4014 +typedef struct _TekClassRec { + CoreClassPart core_class; + TekClassPart tek_class; +} TekClassRec; + +extern WidgetClass tekWidgetClass; + +#define IsTekWidget(w) (XtClass(w) == tekWidgetClass) + +#endif + +/* define masks for keyboard.flags */ +#define MODE_KAM xBIT(0) /* mode 2: keyboard action mode */ +#define MODE_DECKPAM xBIT(1) /* keypad application mode */ +#define MODE_DECCKM xBIT(2) /* private mode 1: cursor keys */ +#define MODE_SRM xBIT(3) /* mode 12: send-receive mode */ +#define MODE_DECBKM xBIT(4) /* private mode 67: backarrow */ +#define MODE_DECSDM xBIT(5) /* private mode 80: sixel scrolling mode */ + +#define N_MARGINBELL 10 + +#define TAB_BITS_SHIFT 5 /* FIXME: 2**5 == 32 (should derive) */ +#define TAB_BITS_WIDTH (1 << TAB_BITS_SHIFT) +#define TAB_ARRAY_SIZE (1024 / TAB_BITS_WIDTH) +#define MAX_TABS (TAB_BITS_WIDTH * TAB_ARRAY_SIZE) + +#define OkTAB(c) ((c) >= 0 && (c) < MAX_TABS) + +typedef unsigned Tabs [TAB_ARRAY_SIZE]; + +#if OPT_XTERM_SGR +#define MAX_SAVED_SGR 10 +typedef struct { + int used; + struct { + IFlags mask; + IFlags flags; +#if OPT_ISO_COLORS + int sgr_foreground; + int sgr_background; + Boolean sgr_38_xcolors; +#endif + } stack[MAX_SAVED_SGR]; +} SavedSGR; + +typedef struct { + ScrnColors base; + ColorRes ansi[1]; +} ColorSlot; + +typedef struct { + int used; /* currently saved or restored */ + int last; /* maximum number of saved palettes */ + ColorSlot *palettes[MAX_SAVED_SGR]; +} SavedColors; +#endif /* OPT_XTERM_SGR */ + +typedef struct _XtermWidgetRec { + CorePart core; + XSizeHints hints; + XVisualInfo *visInfo; + int numVisuals; + unsigned rgb_shifts[3]; + unsigned rgb_widths[3]; + Bool has_rgb; + Bool init_menu; + TKeyboard keyboard; /* terminal keyboard */ + TScreen screen; /* terminal screen */ + IFlags flags; /* mode flags */ + int cur_foreground; /* current foreground color */ + int cur_background; /* current background color */ + Pixel dft_foreground; /* default foreground color */ + Pixel dft_background; /* default background color */ + Pixel old_foreground; /* original foreground color */ + Pixel old_background; /* original background color */ +#if OPT_ISO_COLORS + int sgr_foreground; /* current SGR foreground color */ + int sgr_background; /* current SGR background color */ + Boolean sgr_38_xcolors; /* true if ISO 8613 extension */ +#endif + IFlags initflags; /* initial mode flags */ + Tabs tabs; /* tabstops of the terminal */ + Misc misc; /* miscellaneous parameters */ + Work work; /* workspace (no resources) */ +#if OPT_XTERM_SGR + SavedSGR saved_sgr; + SavedColors saved_colors; +#endif +} XtermWidgetRec, *XtermWidget; + +#if OPT_TEK4014 +typedef struct _TekWidgetRec { + CorePart core; + XtermWidget vt; /* main widget has border, etc. */ + TekPart tek; /* contains resources */ + TekScreen screen; /* contains working data (no resources) */ + Bool init_menu; + XSizeHints hints; +} TekWidgetRec, *TekWidget; +#endif /* OPT_TEK4014 */ + +/* + * terminal flags + * There are actually two namespaces mixed together here. + * One is the set of flags that can go in screen->visbuf attributes + * and which must fit in a char (see OFF_ATTRS). + * The other is the global setting stored in + * term->flags and screen->save_modes. This need only fit in an unsigned. + */ + +#define AttrBIT(n) xBIT(n) /* text-attributes */ +#define MiscBIT(n) xBIT(n + 16) /* miscellaneous state flags */ + +/* global flags and character flags (visible character attributes) */ +#define INVERSE AttrBIT(0) /* invert the characters to be output */ +#define UNDERLINE AttrBIT(1) /* true if underlining */ +#define BOLD AttrBIT(2) +#define BLINK AttrBIT(3) +/* global flags (also character attributes) */ +#define BG_COLOR AttrBIT(4) /* true if background set */ +#define FG_COLOR AttrBIT(5) /* true if foreground set */ + +/* character flags (internal attributes) */ +#define PROTECTED AttrBIT(6) /* a character that cannot be erased */ +#define CHARDRAWN AttrBIT(7) /* a character has been drawn here on + the screen. Used to distinguish + blanks from empty parts of the + screen when selecting */ + +#if OPT_WIDE_ATTRS +#define ATR_FAINT AttrBIT(8) +#define ATR_ITALIC AttrBIT(9) +#define ATR_STRIKEOUT AttrBIT(10) +#define ATR_DBL_UNDER AttrBIT(11) +#define ATR_DIRECT_FG AttrBIT(12) +#define ATR_DIRECT_BG AttrBIT(13) +#define SGR_MASK2 (ATR_FAINT | ATR_ITALIC | ATR_STRIKEOUT | ATR_DBL_UNDER | ATR_DIRECT_FG | ATR_DIRECT_BG) +#else +#define SGR_MASK2 0 +#endif + +/* + * Other flags + */ +#define WRAPAROUND MiscBIT(0) /* true if auto wraparound mode */ +#define REVERSEWRAP MiscBIT(1) /* true if reverse wraparound mode */ +#define REVERSE_VIDEO MiscBIT(2) /* true if screen white on black */ +#define LINEFEED MiscBIT(3) /* true if in auto linefeed mode */ +#define ORIGIN MiscBIT(4) /* true if in origin mode */ +#define INSERT MiscBIT(5) /* true if in insert mode */ +#define SMOOTHSCROLL MiscBIT(6) /* true if in smooth scroll mode */ +#define IN132COLUMNS MiscBIT(7) /* true if in 132 column mode */ +#define INVISIBLE MiscBIT(8) /* true if writing invisible text */ +#define NATIONAL MiscBIT(9) /* true if writing national charset */ +#define LEFT_RIGHT MiscBIT(10) /* true if left/right margin mode */ +#define NOCLEAR_COLM MiscBIT(11) /* true if no clear on DECCOLM change */ + +#define DrawBIT(n) xBIT(n + 8) /* XTermDraw.draw_flags */ +/* The following attributes are used in the argument of drawXtermText() */ +#define NOBACKGROUND DrawBIT(0) /* Used for overstrike */ +#define NOTRANSLATION DrawBIT(1) /* No scan for chars missing in font */ +#define DOUBLEWFONT DrawBIT(2) /* The actual X-font is double-width */ +#define DOUBLEHFONT DrawBIT(3) /* The actual X-font is double-height */ +#define CHARBYCHAR DrawBIT(4) /* Draw chars one-by-one */ + +/* The following attribute is used in the argument of xtermSpecialFont etc */ +#define NORESOLUTION DrawBIT(5) /* find the font without resolution */ + + +/* + * Groups of attributes + */ + /* mask for video-attributes only */ +#define SGR_MASK (BOLD | BLINK | UNDERLINE | INVERSE) + + /* mask: user-visible attributes */ +#define ATTRIBUTES (SGR_MASK | SGR_MASK2 | BG_COLOR | FG_COLOR | INVISIBLE | PROTECTED) + +/* The toplevel-call to drawXtermText() should have text-attributes guarded: */ +#define DRAWX_MASK (ATTRIBUTES | CHARDRAWN) + +/* + * BOLDATTR is not only nonzero when we will use bold font, but uses the bits + * for BOLD/BLINK to match against the video attributes which were originally + * requested. + */ +#define USE_BOLD(screen) ((screen)->allowBoldFonts) + +#if OPT_BLINK_TEXT +#define BOLDATTR(screen) (unsigned) (USE_BOLD(screen) ? (BOLD | ((screen)->blink_as_bold ? BLINK : 0)) : 0) +#else +#define BOLDATTR(screen) (unsigned) (USE_BOLD(screen) ? (BOLD | BLINK) : 0) +#endif + +/* + * Per-line flags + */ +#define LINEWRAPPED AttrBIT(0) +/* used once per line to indicate that it wraps onto the next line so we can + * tell the difference between lines that have wrapped around and lines that + * have ended naturally with a CR at column max_col. + */ +#define LINEBLINKED AttrBIT(1) +/* set when the line contains blinking text. + */ + +#if OPT_ZICONBEEP || OPT_TOOLBAR || (USE_DOUBLE_BUFFER && OPT_RENDERFONT) +#define HANDLE_STRUCT_NOTIFY 1 +#else +#define HANDLE_STRUCT_NOTIFY 0 +#endif + +/* + * If we've set protected attributes with the DEC-style DECSCA, then we'll have + * to use DECSED or DECSEL to erase preserving protected text. (The normal ED, + * EL won't preserve protected-text). If we've used SPA, then normal ED and EL + * will preserve protected-text. To keep things simple, just remember the last + * control that was used to begin protected-text, and use that to determine how + * erases are performed (otherwise we'd need 2 bits per protected character). + */ +#define OFF_PROTECT 0 +#define DEC_PROTECT 1 +#define ISO_PROTECT 2 + +/***====================================================================***/ + +/* + * Reduce parameter-count of drawXtermText by putting less-modified data here. + */ +typedef struct { + XtermWidget xw; + unsigned attr_flags; + unsigned draw_flags; + unsigned this_chrset; + unsigned real_chrset; + int on_wide; +} XTermDraw; + +/***====================================================================***/ + +#define TScreenOf(xw) (&(xw)->screen) +#define TekScreenOf(tw) (&(tw)->screen) + +#define PrinterOf(screen) (screen)->printer_state + +#ifdef SCROLLBAR_RIGHT +#define OriginX(screen) (((term->misc.useRight)?0:ScrollbarWidth(screen)) + screen->border) +#else +#define OriginX(screen) (ScrollbarWidth(screen) + screen->border) +#endif + +#define OriginY(screen) (screen->border) + +#define CursorMoved(screen) \ + ((screen)->cursor_moved || \ + ((screen)->cursorp.col != (screen)->cur_col || \ + (screen)->cursorp.row != (screen)->cur_row)) + +#define CursorX2(screen,col,fw) ((col) * (int)(fw) + OriginX(screen)) +#define CursorX(screen,col) CursorX2(screen, col, FontWidth(screen)) +#define CursorY2(screen,row) (((row) * FontHeight(screen)) + screen->border) +#define CursorY(screen,row) CursorY2(screen, INX2ROW(screen, row)) + +/* + * These definitions depend on whether xterm supports active-icon. + */ +#ifndef NO_ACTIVE_ICON +#define IsIconWin(screen,win) ((win) == &(screen)->iconVwin) +#define IsIcon(screen) (WhichVWin(screen) == &(screen)->iconVwin) +#define WhichVWin(screen) ((screen)->whichVwin) +#define WhichTWin(screen) ((screen)->whichTwin) + +#define WhichVFont(screen,name) (IsIcon(screen) ? getIconicFont(screen) \ + : getNormalFont(screen, (int)(name)))->fs +#define FontAscent(screen) (IsIcon(screen) ? getIconicFont(screen)->fs->ascent \ + : WhichVWin(screen)->f_ascent) +#define FontDescent(screen) (IsIcon(screen) ? getIconicFont(screen)->fs->descent \ + : WhichVWin(screen)->f_descent) +#else /* NO_ACTIVE_ICON */ + +#define IsIconWin(screen,win) (False) +#define IsIcon(screen) (False) +#define WhichVWin(screen) (&((screen)->fullVwin)) +#define WhichTWin(screen) (&((screen)->fullTwin)) + +#define WhichVFont(screen,name) getNormalFont(screen, (int)(name))->fs +#define FontAscent(screen) WhichVWin(screen)->f_ascent +#define FontDescent(screen) WhichVWin(screen)->f_descent + +#endif /* NO_ACTIVE_ICON */ + +#define okFont(font) ((font) != 0 && (font)->fid != 0) + +/* + * Macro to check if we are iconified; do not use render for that case. + */ +#define UsingRenderFont(xw) (((xw)->work.render_font == True) && !IsIcon(TScreenOf(xw))) + +/* + * These definitions do not depend on whether xterm supports active-icon. + */ +#define VWindow(screen) WhichVWin(screen)->window +#define VShellWindow(xw) XtWindow(SHELL_OF(xw)) +#define TWindow(screen) WhichTWin(screen)->window +#define TShellWindow XtWindow(SHELL_OF(tekWidget)) + +#if USE_DOUBLE_BUFFER +extern Window VDrawable(TScreen * /* screen */); +#else +#define VDrawable(screen) VWindow(screen) +#endif + +#define Width(screen) WhichVWin(screen)->width +#define Height(screen) WhichVWin(screen)->height +#define FullWidth(screen) WhichVWin(screen)->fullwidth +#define FullHeight(screen) WhichVWin(screen)->fullheight +#define FontWidth(screen) WhichVWin(screen)->f_width +#define FontHeight(screen) WhichVWin(screen)->f_height + +#define NormalFont(screen) WhichVFont(screen, fNorm) +#define BoldFont(screen) WhichVFont(screen, fBold) + +#if OPT_WIDE_CHARS +#define NormalWFont(screen) WhichVFont(screen, fWide) +#define BoldWFont(screen) WhichVFont(screen, fWBold) +#endif + +#define ScrollbarWidth(screen) WhichVWin(screen)->sb_info.width + +#define BorderGC(w,sp) WhichVWin(sp)->border_gc +#define FillerGC(w,sp) WhichVWin(sp)->filler_gc +#define NormalGC(w,sp) getCgsGC(w, WhichVWin(sp), gcNorm) +#define ReverseGC(w,sp) getCgsGC(w, WhichVWin(sp), gcNormReverse) +#define NormalBoldGC(w,sp) getCgsGC(w, WhichVWin(sp), gcBold) +#define ReverseBoldGC(w,sp) getCgsGC(w, WhichVWin(sp), gcBoldReverse) + +#define TWidth(screen) WhichTWin(screen)->width +#define THeight(screen) WhichTWin(screen)->height +#define TFullWidth(screen) WhichTWin(screen)->fullwidth +#define TFullHeight(screen) WhichTWin(screen)->fullheight +#define TekScale(screen) WhichTWin(screen)->tekscale + +/* use these before tek4014 is realized, good enough for default "9x15" font */ +#define TDefaultRows 37 +#define TDefaultCols 75 + +#define BorderWidth(w) ((w)->core.border_width) +#define BorderPixel(w) ((w)->core.border_pixel) + +#define AllowXtermOps(w,name) (TScreenOf(w)->name && !TScreenOf(w)->allowSendEvents) + +#define AllowColorOps(w,name) (AllowXtermOps(w, allowColorOps) || \ + !TScreenOf(w)->disallow_color_ops[name]) + +#define AllowFontOps(w,name) (AllowXtermOps(w, allowFontOps) || \ + !TScreenOf(w)->disallow_font_ops[name]) + +#define AllowMouseOps(w,name) (AllowXtermOps(w, allowMouseOps) || \ + !TScreenOf(w)->disallow_mouse_ops[name]) + +#define AllowTcapOps(w,name) (AllowXtermOps(w, allowTcapOps) || \ + !TScreenOf(w)->disallow_tcap_ops[name]) + +#define AllowTitleOps(w) AllowXtermOps(w, allowTitleOps) + +#define AllowXResOps(w) True + +#define SpecialWindowOps(w,name) (!TScreenOf(w)->disallow_win_ops[name]) +#define AllowWindowOps(w,name) (AllowXtermOps(w, allowWindowOps) || \ + SpecialWindowOps(w,name)) + +#if OPT_TOOLBAR +#define ToolbarHeight(w) ((resource.toolBar) \ + ? ((w)->VT100_TB_INFO(menu_height) \ + + (w)->VT100_TB_INFO(menu_border) * 2) \ + : 0) +#else +#define ToolbarHeight(w) 0 +#endif + +#if OPT_TEK4014 +#define TEK_LINK_BLOCK_SIZE 1024 + +typedef struct Tek_Link +{ + struct Tek_Link *next; /* pointer to next TekLink in list + NULL <=> this is last TekLink */ + unsigned short fontsize;/* character size, 0-3 */ + unsigned short count; /* number of chars in data */ + char *ptr; /* current pointer into data */ + char data [TEK_LINK_BLOCK_SIZE]; +} TekLink; +#endif /* OPT_TEK4014 */ + +/* flags for cursors */ +#define OFF 0 +#define ON 1 +#define BLINKED_OFF 2 +#define CLEAR 0 +#define TOGGLE 1 + +/* flags for inhibit */ +#ifdef ALLOWLOGGING +#define I_LOG 0x01 +#endif +#define I_SIGNAL 0x02 +#define I_TEK 0x04 + +/* *INDENT-ON* */ + +#endif /* included_ptyx_h */ diff --git a/ports/xterm/xterm-359/resize b/ports/xterm/xterm-359/resize new file mode 100755 index 0000000000000000000000000000000000000000..bc12c67280f04156466af373a3160107d72d70c1 GIT binary patch literal 62976 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 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/resize.c b/ports/xterm/xterm-359/resize.c new file mode 100644 index 0000000..57da7b5 --- /dev/null +++ b/ports/xterm/xterm-359/resize.c @@ -0,0 +1,606 @@ +/* $XTermId: resize.c,v 1.144 2020/06/03 00:26:23 tom Exp $ */ + +/* + * Copyright 2003-2018,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* resize.c */ + +#include +#include + +#include +#include +#include +#include +#include + +#ifndef USE_TERMINFO /* avoid conflict with configure script */ +#if defined(__QNX__) || defined(__SCO__) || defined(linux) || defined(__OpenBSD__) || defined(__UNIXWARE__) +#define USE_TERMINFO +#endif +#endif + +#if defined(__QNX__) +#include +#endif + +/* + * Some OS's may want to use both, like SCO for example. We catch here anyone + * who hasn't decided what they want. + */ +#if !defined(USE_TERMCAP) && !defined(USE_TERMINFO) +#define USE_TERMINFO +#endif + +#include +#include + +#ifdef USE_IGNORE_RC +int ignore_unused; +#endif + +#ifdef __MVS__ +#define ESCAPE(string) "\047" string +#else +#define ESCAPE(string) "\033" string +#endif + +#define EMULATIONS 2 +#define SUN 1 +#define VT100 0 + +#define TIMEOUT 10 + +#define SHELL_UNKNOWN 0 +#define SHELL_C 1 +#define SHELL_BOURNE 2 + +/* *INDENT-OFF* */ +static struct { + const char *name; + int type; +} shell_list[] = { + { "csh", SHELL_C }, /* vanilla cshell */ + { "jcsh", SHELL_C }, + { "tcsh", SHELL_C }, + { "sh", SHELL_BOURNE }, /* vanilla Bourne shell */ + { "ash", SHELL_BOURNE }, + { "bash", SHELL_BOURNE }, /* GNU Bourne again shell */ + { "dash", SHELL_BOURNE }, + { "jsh", SHELL_BOURNE }, + { "ksh", SHELL_BOURNE }, /* Korn shell (from AT&T toolchest) */ + { "ksh-i", SHELL_BOURNE }, /* another name for Korn shell */ + { "ksh93", SHELL_BOURNE }, /* Korn shell */ + { "mksh", SHELL_BOURNE }, + { "pdksh", SHELL_BOURNE }, + { "zsh", SHELL_BOURNE }, + { NULL, SHELL_BOURNE } /* default (same as xterm's) */ +}; +/* *INDENT-ON* */ + +static const char *const emuname[EMULATIONS] = +{ + "VT100", + "Sun", +}; +static char *myname; +static int shell_type = SHELL_UNKNOWN; +static const char *const getsize[EMULATIONS] = +{ + ESCAPE("7") ESCAPE("[r") ESCAPE("[9999;9999H") ESCAPE("[6n"), + ESCAPE("[18t"), +}; +#if defined(USE_STRUCT_WINSIZE) +static const char *const getwsize[EMULATIONS] = +{ /* size in pixels */ + 0, + ESCAPE("[14t"), +}; +#endif /* USE_STRUCT_WINSIZE */ +static const char *const restore[EMULATIONS] = +{ + ESCAPE("8"), + 0, +}; +static const char *const setsize[EMULATIONS] = +{ + 0, + ESCAPE("[8;%s;%st"), +}; + +#ifdef USE_ANY_SYSV_TERMIO +static struct termio tioorig; +#elif defined(USE_TERMIOS) +static struct termios tioorig; +#else +static struct sgttyb sgorig; +#endif /* USE_ANY_SYSV_TERMIO/USE_TERMIOS */ + +static const char *const size[EMULATIONS] = +{ + ESCAPE("[%d;%dR"), + ESCAPE("[8;%d;%dt"), +}; +static const char sunname[] = "sunsize"; +static int tty; +static FILE *ttyfp; + +#if defined(USE_STRUCT_WINSIZE) +static const char *wsize[EMULATIONS] = +{ + 0, + ESCAPE("[4;%hd;%hdt"), +}; +#endif /* USE_STRUCT_WINSIZE */ + +static void failed(const char *) GCC_NORETURN; +static void onintr(int) GCC_NORETURN; +static void resize_timeout(int) GCC_NORETURN; +static void Usage(void) GCC_NORETURN; + +static void +failed(const char *s) +{ + int save = errno; + IGNORE_RC(write(2, myname, strlen(myname))); + IGNORE_RC(write(2, ": ", (size_t) 2)); + errno = save; + perror(s); + exit(EXIT_FAILURE); +} + +/* ARGSUSED */ +static void +onintr(int sig GCC_UNUSED) +{ +#ifdef USE_ANY_SYSV_TERMIO + (void) ioctl(tty, TCSETAW, &tioorig); +#elif defined(USE_TERMIOS) + (void) tcsetattr(tty, TCSADRAIN, &tioorig); +#else /* not USE_TERMIOS */ + (void) ioctl(tty, TIOCSETP, &sgorig); +#endif /* USE_ANY_SYSV_TERMIO/USE_TERMIOS */ + exit(EXIT_FAILURE); +} + +static void +resize_timeout(int sig) +{ + fprintf(stderr, "\n%s: Time out occurred\r\n", myname); + onintr(sig); +} + +static void +Usage(void) +{ + fprintf(stderr, strcmp(myname, sunname) == 0 ? + "Usage: %s [rows cols]\n" : + "Usage: %s [-v] [-u] [-c] [-s [rows cols]]\n", myname); + exit(EXIT_FAILURE); +} + +#ifdef USE_TERMCAP +static void +print_termcap(const char *termcap) +{ + int ch; + + putchar('\''); + while ((ch = *termcap++) != '\0') { + switch (ch & 0xff) { + case 127: /* undo bug in GNU termcap */ + printf("^?"); + break; + case '\'': /* must escape anyway (unlikely) */ + /* FALLTHRU */ + case '!': /* must escape for SunOS csh */ + putchar('\\'); + /* FALLTHRU */ + default: + putchar(ch); + break; + } + } + putchar('\''); +} +#endif /* USE_TERMCAP */ + +static int +checkdigits(char *str) +{ + while (*str) { + if (!isdigit(CharOf(*str))) + return (0); + str++; + } + return (1); +} + +static void +readstring(FILE *fp, char *buf, const char *str) +{ + int last, c; +#if !defined(USG) && !defined(__minix) + /* What is the advantage of setitimer() over alarm()? */ + struct itimerval it; +#endif + + signal(SIGALRM, resize_timeout); +#if defined(USG) || defined(__minix) + alarm(TIMEOUT); +#else + memset((char *) &it, 0, sizeof(struct itimerval)); + it.it_value.tv_sec = TIMEOUT; + setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL); +#endif + if ((c = getc(fp)) == 0233) { /* meta-escape, CSI */ + c = ESCAPE("")[0]; + *buf++ = (char) c; + *buf++ = '['; + } else { + *buf++ = (char) c; + } + if (c != *str) { + fprintf(stderr, "%s: unknown character, exiting.\r\n", myname); + onintr(0); + } + last = str[strlen(str) - 1]; + while ((*buf++ = (char) getc(fp)) != last) { + ; + } +#if defined(USG) || defined(__minix) + alarm(0); +#else + memset((char *) &it, 0, sizeof(struct itimerval)); + setitimer(ITIMER_REAL, &it, (struct itimerval *) NULL); +#endif + *buf = 0; +} + +/* + resets termcap string to reflect current screen size + */ +int +main(int argc, char **argv ENVP_ARG) +{ +#ifdef USE_TERMCAP + char *env; +#endif + char *ptr; + int emu = VT100; + char *shell; + int i; + int rc; + int rows, cols; +#ifdef USE_ANY_SYSV_TERMIO + struct termio tio; +#elif defined(USE_TERMIOS) + struct termios tio; +#else + struct sgttyb sg; +#endif /* USE_ANY_SYSV_TERMIO/USE_TERMIOS */ +#ifdef USE_TERMCAP + int ok_tcap = 1; + char termcap[TERMCAP_SIZE]; + char newtc[TERMCAP_SIZE]; +#endif /* USE_TERMCAP */ + char buf[BUFSIZ]; +#ifdef TTYSIZE_STRUCT + TTYSIZE_STRUCT ts; +#endif + char *name_of_tty; +#ifdef CANT_OPEN_DEV_TTY + extern char *ttyname(); +#endif + const char *setname = ""; + + myname = x_basename(argv[0]); + if (strcmp(myname, sunname) == 0) + emu = SUN; + for (argv++, argc--; argc > 0 && **argv == '-'; argv++, argc--) { + switch ((*argv)[1]) { + case 's': /* Sun emulation */ + if (emu == SUN) + Usage(); /* Never returns */ + emu = SUN; + break; + case 'u': /* Bourne (Unix) shell */ + shell_type = SHELL_BOURNE; + break; + case 'c': /* C shell */ + shell_type = SHELL_C; + break; + case 'v': + printf("%s\n", xtermVersion()); + exit(EXIT_SUCCESS); + default: + Usage(); /* Never returns */ + } + } + + if (SHELL_UNKNOWN == shell_type) { + /* Find out what kind of shell this user is running. + * This is the same algorithm that xterm uses. + */ + if ((ptr = x_getenv("SHELL")) == NULL) { + uid_t uid = getuid(); + struct passwd pw; + + if (x_getpwuid(uid, &pw)) { + (void) x_getlogin(uid, &pw); + } + if (!OkPasswd(&pw) + || *(ptr = pw.pw_shell) == 0) { + /* this is the same default that xterm uses */ + ptr = x_strdup("/bin/sh"); + } + } + + shell = x_basename(ptr); + + /* now that we know, what kind is it? */ + for (i = 0; shell_list[i].name; i++) { + if (!strcmp(shell_list[i].name, shell)) { + break; + } + } + shell_type = shell_list[i].type; + } + + if (argc == 2) { + if (!setsize[emu]) { + fprintf(stderr, + "%s: Can't set window size under %s emulation\n", + myname, emuname[emu]); + exit(EXIT_FAILURE); + } + if (!checkdigits(argv[0]) || !checkdigits(argv[1])) { + Usage(); /* Never returns */ + } + } else if (argc != 0) { + Usage(); /* Never returns */ + } +#ifdef CANT_OPEN_DEV_TTY + if ((name_of_tty = ttyname(fileno(stderr))) == NULL) +#endif + name_of_tty = x_strdup("/dev/tty"); + + if ((ttyfp = fopen(name_of_tty, "r+")) == NULL) { + fprintf(stderr, "%s: can't open terminal %s\n", + myname, name_of_tty); + exit(EXIT_FAILURE); + } + tty = fileno(ttyfp); +#ifdef USE_TERMCAP + if ((env = x_getenv("TERM")) == 0) { + env = x_strdup(DFT_TERMTYPE); + if (SHELL_BOURNE == shell_type) { + setname = "TERM=" DFT_TERMTYPE ";\nexport TERM;\n"; + } else { + setname = "setenv TERM " DFT_TERMTYPE ";\n"; + } + } + termcap[0] = 0; /* ...just in case we've accidentally gotten terminfo */ + if (tgetent(termcap, env) <= 0 || termcap[0] == 0) { + ok_tcap = 0; + } +#endif /* USE_TERMCAP */ +#ifdef USE_TERMINFO + if (x_getenv("TERM") == 0) { + if (SHELL_BOURNE == shell_type) { + setname = "TERM=" DFT_TERMTYPE ";\nexport TERM;\n"; + } else { + setname = "setenv TERM " DFT_TERMTYPE ";\n"; + } + } +#endif /* USE_TERMINFO */ + +#ifdef USE_ANY_SYSV_TERMIO + rc = ioctl(tty, TCGETA, &tioorig); + tio = tioorig; + UIntClr(tio.c_iflag, (ICRNL | IUCLC)); + UIntClr(tio.c_lflag, (ICANON | ECHO)); + tio.c_cflag |= CS8; + tio.c_cc[VMIN] = 6; + tio.c_cc[VTIME] = 1; +#elif defined(USE_TERMIOS) + rc = tcgetattr(tty, &tioorig); + tio = tioorig; + UIntClr(tio.c_iflag, ICRNL); + UIntClr(tio.c_lflag, (ICANON | ECHO)); + tio.c_cflag |= CS8; + tio.c_cc[VMIN] = 6; + tio.c_cc[VTIME] = 1; +#else /* not USE_TERMIOS */ + rc = ioctl(tty, TIOCGETP, &sgorig); + sg = sgorig; + sg.sg_flags |= RAW; + UIntClr(sg.sg_flags, ECHO); +#endif /* USE_ANY_SYSV_TERMIO/USE_TERMIOS */ + if (rc != 0) + failed("get tty settings"); + + signal(SIGINT, onintr); + signal(SIGQUIT, onintr); + signal(SIGTERM, onintr); + +#ifdef USE_ANY_SYSV_TERMIO + rc = ioctl(tty, TCSETAW, &tio); +#elif defined(USE_TERMIOS) + rc = tcsetattr(tty, TCSADRAIN, &tio); +#else /* not USE_TERMIOS */ + rc = ioctl(tty, TIOCSETP, &sg); +#endif /* USE_ANY_SYSV_TERMIO/USE_TERMIOS */ + if (rc != 0) + failed("set tty settings"); + + if (argc == 2) { /* look for optional parameters of "-s" */ + char *tmpbuf = TypeMallocN(char, + strlen(setsize[emu]) + + strlen(argv[0]) + + strlen(argv[1]) + + 1); + if (tmpbuf == 0) { + fprintf(stderr, "%s: Cannot query size\n", myname); + onintr(0); + } else { + sprintf(tmpbuf, setsize[emu], argv[0], argv[1]); + IGNORE_RC(write(tty, tmpbuf, strlen(tmpbuf))); + free(tmpbuf); + } + } + IGNORE_RC(write(tty, getsize[emu], strlen(getsize[emu]))); + readstring(ttyfp, buf, size[emu]); + if (sscanf(buf, size[emu], &rows, &cols) != 2) { + fprintf(stderr, "%s: Can't get rows and columns\r\n", myname); + onintr(0); + } + if (restore[emu]) + IGNORE_RC(write(tty, restore[emu], strlen(restore[emu]))); +#if defined(USE_STRUCT_WINSIZE) + /* finally, set the tty's window size */ + if (getwsize[emu]) { + /* get the window size in pixels */ + IGNORE_RC(write(tty, getwsize[emu], strlen(getwsize[emu]))); + readstring(ttyfp, buf, wsize[emu]); + if (sscanf(buf, wsize[emu], &ts.ws_xpixel, &ts.ws_ypixel) != 2) { + fprintf(stderr, "%s: Can't get window size\r\n", myname); + onintr(0); + } + setup_winsize(ts, rows, cols, 0, 0); + SET_TTYSIZE(tty, ts); + } else if (ioctl(tty, TIOCGWINSZ, &ts) != -1) { + /* we don't have any way of directly finding out + the current height & width of the window in pixels. We try + our best by computing the font height and width from the "old" + window-size values, and multiplying by these ratios... */ +#define scaled(old,new,len) (old)?((unsigned)(new)*(len)/(old)):(len) + setup_winsize(ts, rows, cols, + scaled(TTYSIZE_ROWS(ts), rows, ts.ws_ypixel), + scaled(TTYSIZE_COLS(ts), cols, ts.ws_xpixel)); + SET_TTYSIZE(tty, ts); + } +#endif /* USE_STRUCT_WINSIZE */ + +#ifdef USE_ANY_SYSV_TERMIO + rc = ioctl(tty, TCSETAW, &tioorig); +#elif defined(USE_TERMIOS) + rc = tcsetattr(tty, TCSADRAIN, &tioorig); +#else /* not USE_TERMIOS */ + rc = ioctl(tty, TIOCSETP, &sgorig); +#endif /* USE_ANY_SYSV_TERMIO/USE_TERMIOS */ + if (rc != 0) + failed("set tty settings"); + + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + +#ifdef USE_TERMCAP + if (ok_tcap) { + /* update termcap string */ + /* first do columns */ + if ((ptr = x_strindex(termcap, "co#")) == NULL) { + fprintf(stderr, "%s: No `co#'\n", myname); + exit(EXIT_FAILURE); + } + + i = (int) (ptr - termcap) + 3; + strncpy(newtc, termcap, (size_t) i); + sprintf(newtc + i, "%d", cols); + if ((ptr = strchr(ptr, ':')) != 0) + strcat(newtc, ptr); + + /* now do lines */ + if ((ptr = x_strindex(newtc, "li#")) == NULL) { + fprintf(stderr, "%s: No `li#'\n", myname); + exit(EXIT_FAILURE); + } + + i = (int) (ptr - newtc) + 3; + strncpy(termcap, newtc, (size_t) i); + sprintf(termcap + i, "%d", rows); + if ((ptr = strchr(ptr, ':')) != 0) + strcat(termcap, ptr); + } +#endif /* USE_TERMCAP */ + + if (SHELL_BOURNE == shell_type) { + +#ifdef USE_TERMCAP + if (ok_tcap) { + printf("%sTERMCAP=", setname); + print_termcap(termcap); + printf(";\nexport TERMCAP;\n"); + } +#endif /* USE_TERMCAP */ +#ifdef USE_TERMINFO + printf("%sCOLUMNS=%d;\nLINES=%d;\nexport COLUMNS LINES;\n", + setname, cols, rows); +#endif /* USE_TERMINFO */ + + } else { /* not Bourne shell */ + +#ifdef USE_TERMCAP + if (ok_tcap) { + printf("set noglob;\n%ssetenv TERMCAP ", setname); + print_termcap(termcap); + printf(";\nunset noglob;\n"); + } +#endif /* USE_TERMCAP */ +#ifdef USE_TERMINFO + printf("set noglob;\n%ssetenv COLUMNS '%d';\nsetenv LINES '%d';\nunset noglob;\n", + setname, cols, rows); +#endif /* USE_TERMINFO */ + } + exit(EXIT_SUCCESS); +} diff --git a/ports/xterm/xterm-359/resize.man b/ports/xterm/xterm-359/resize.man new file mode 100644 index 0000000..a0eedc5 --- /dev/null +++ b/ports/xterm/xterm-359/resize.man @@ -0,0 +1,235 @@ +.\" $XTermId: resize.man,v 1.37 2019/02/07 00:16:12 tom Exp $ +.\" +.\" Copyright 1998-2017,2019 by Thomas E. Dickey +.\" +.\" All Rights Reserved +.\" +.\" Permission is hereby granted, free of charge, to any person obtaining a +.\" copy of this software and associated documentation files (the +.\" "Software"), to deal in the Software without restriction, including +.\" without limitation the rights to use, copy, modify, merge, publish, +.\" distribute, sublicense, and/or sell copies of the Software, and to +.\" permit persons to whom the Software is furnished to do so, subject to +.\" the following conditions: +.\" +.\" The above copyright notice and this permission notice shall be included +.\" in all copies or substantial portions of the Software. +.\" +.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +.\" OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +.\" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +.\" IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +.\" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +.\" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +.\" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +.\" +.\" Except as contained in this notice, the name(s) of the above copyright +.\" holders shall not be used in advertising or otherwise to promote the +.\" sale, use or other dealings in this Software without prior written +.\" authorization. +.\" +.\" updated by Thomas E. Dickey for XFree86, 1998-2006. +.\" +.ds N Resize +.ds n resize +.\" +.\" Bulleted paragraph +.de bP +.ie n .IP \(bu 4 +.el .IP \(bu 2 +.. +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds AQ \(aq +.el .ds AQ ' +.ie \n(.g .ds `` \(lq +.el .ds `` `` +.ie \n(.g .ds '' \(rq +.el .ds '' '' +.TH RESIZE 1 "__app_date__" "__app_version__" "X Window System" +.SH NAME +resize \- set environment and terminal settings to current xterm window size +.SH SYNOPSIS +.B \*n +[ \fB\-v\fP | \fB\-u\fP | \fB\-c\fP ] [ \fB\-s\fP [ \fIrow col\fP ] ] +.SH DESCRIPTION +.I \*N +prints a shell command for setting the appropriate environment variables +to indicate the current size of \fIxterm\fP window from which the command +is run. +.PP +.I \*N +determines the command through several steps: +.bP +first, it finds the name of the user's shell program. +It uses the \fBSHELL\fP variable if set, +otherwise it uses the user's data from /etc/passwd. +.bP +then it decides whether to use Bourne shell syntax or C-Shell syntax. +It uses a built-in table of known shells, +which can be overridden by the \fB\-u\fP and \fB\-c\fP options. +.bP +then \fI\*n\fP asks the operating system for the terminal settings. +This is the same information which can be manipulated using \fIstty\fP. +.bP +then \fI\*n\fP asks the terminal for its size in characters. +Depending on whether the "\fB\-s\fP option is given, +\fI\*n\fP uses a different escape sequence to ask for this information. +.bP +at this point, \fI\*n\fP attempts to update the terminal settings +to reflect the terminal window's size in pixels: +.RS +.bP +if the \fB\-s\fP option is used, +\fI\*n\fP then asks the terminal for its size in pixels. +.bP +otherwise, +\fI\*n\fP asks the operating system for the information +and updates that after ensuring that the window's dimensions are +a multiple of the character height and width. +.bP +in either case, the updated terminal settings are done +using a different system call than used for \fIstty\fP. +.RE +.bP +then \fI\*n\fP updates the terminal settings to reflect any altered +values such as its size in rows or columns. +This affects the values shown by \fIstty\fP. +.bP +finally, \fI\*n\fP generates shell commands for setting the +environment variables, +and writes that to the standard output. +.SH EXAMPLES +For \fI\*n\fP's output to take effect, +\fI\*n\fP must either be evaluated +as part of the command line (usually done with a shell alias or function) or +else redirected to a file which can then be read in. +From the C shell (usually +known as \fI/bin/csh\fP), the following alias could be defined in the +user's \fI.cshrc\fP: +.sp +.nf + % alias rs \*(AQset noglob; eval \fC\`\fP\*n\fC\`\fP\*(AQ +.fi +.sp +After resizing the window, the user would type: +.sp +.nf + % rs +.fi +.sp +Users of versions of the Bourne shell (usually known as \fI/bin/sh\fP) that +don't have command +functions will need to send the output to a temporary file and then read it back +in with the \*(``.\*('' command: +.sp +.nf + $ \*n > /tmp/out + $ .\0/tmp/out +.fi +.SH OPTIONS +The following options may be used with \fI\*n\fP: +.TP 8 +.B \-c +This option indicates that C shell commands should be generated even if the +user's current shell does not appear to use C shell syntax. +.TP 8 +.B \-s \fR[\fIrows columns\fP] +This option indicates that Sun console escape sequences will be used +instead of the VT100-style \fIxterm\fP escape codes. +If \fIrows\fP and +\fIcolumns\fP are given, +\fI\*n\fP will ask the \fIxterm\fP to resize itself using those values. +.IP +Both of the escape sequences used for this option +(first to obtain the window size and +second to modify it) +are subject to \fIxterm\fP's \fBallowWindowOps\fP resource setting. +The window manager may also choose to disallow the change. +.IP +The VT100-style escape sequence used to determine the +screen size always works for VT100-compatible terminals. +VT100s have no corresponding way to modify the screensize. +.TP 8 +.B \-u +This option indicates that Bourne shell commands should be generated even if +the user's current shell does not appear to use Bourne shell syntax. +.TP 8 +.B \-v +This causes \fI\*n\fP to print a version number to the standard output, +and then exit. +.PP +Note that the Sun console escape sequences are recognized +by XFree86 \fIxterm\fP and +by \fIdtterm\fP. +The \fI\*n\fP program may be installed as \fIsunsize\fP, +which causes makes it assume the \fB\-s\fP option. +.PP +The \fIrows\fP and +\fIcolumns\fP arguments must appear last; though they are normally +associated with the \fB\-s\fP option, they are parsed separately. +.SH FILES +.TP 15 +/etc/termcap +for the base termcap entry to modify. +.TP 15 +~/.cshrc +user's alias for the command. +.SH ENVIRONMENT +.TP 15 +SHELL +Unless overridden by the \fB\-c\fP option, +\fI\*n\fP determines the user's current shell by +.RS +.bP +first checking if \fB$SHELL\fP +is set, and using that, +.bP +otherwise \fI\*n\fP looks in the password file +(/etc/passwd). +.RE +.IP +Generally Bourne-shell variants (including \fIksh\fP) +do not modify \fB$SHELL\fP, +so it is possible for \fI\*n\fP to be confused if one runs +\fI\*n\fP from a Bourne shell spawned from a C shell. +.IP +After determining the user's shell, \fI\*n\fP checks the shell's name +against a table of known shell names. +If it does not find the name in its table, \fI\*n\fP will use +C shell syntax for the generated commands to set environment variables. +.TP 15 +TERM +.IR \*N 's +generated shell command +sets this to "__default_termname__" if not already set. +.TP 15 +TERMCAP +.IR \*N 's +generated shell command +sets this variable on systems using termcap, +e.g., when \fI\*n\fP is linked with the \fItermcap\fP library +rather than a \fIterminfo\fP library. +The latter does not provide the complete text for a termcap entry. +.TP 15 +COLUMNS, LINES +.IR \*N 's +generated shell command +sets these variables on systems using terminfo. +Many applications (including the curses library) +use those variables when set to override their screensize. +.SH "SEE ALSO" +use_env(3x) +.br +csh(1), stty(1), tset(1) +.br +xterm(__mansuffix__) +.SH AUTHORS +Mark Vandevoorde (MIT-Athena), Edward Moy (Berkeley) +.br +Thomas Dickey (invisible-island.net). +.br +Copyright (c) 1984, 1985 by X Consortium +.br +See +.IR X (__miscmansuffix__) +for a complete copyright notice. diff --git a/ports/xterm/xterm-359/resize.o b/ports/xterm/xterm-359/resize.o new file mode 100644 index 0000000000000000000000000000000000000000..409b868f9a08f80f9a2f99694c8b187cf04c8890 GIT binary patch literal 33600 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 I)S>JDA16%CFaQ7m literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/run-tic.sh b/ports/xterm/xterm-359/run-tic.sh new file mode 100755 index 0000000..c486d46 --- /dev/null +++ b/ports/xterm/xterm-359/run-tic.sh @@ -0,0 +1,136 @@ +#!/bin/sh +# $XTermId: run-tic.sh,v 1.12 2020/01/18 16:27:34 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2006-2019,2020 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Run tic, either using ncurses' extension feature or filtering out harmless +# messages for the extensions which are otherwise ignored by other versions of +# tic. + +USE_NCURSES=20190609 + +failed() { + echo "? $*" >&2 + exit 1 +} + +need_ncurses() { + failed "This terminal description relies on ncurses 6.1 $USE_NCURSES" +} + +use_ncurses6() { + VER=`infocmp6 -V 2>/dev/null` + test -n "$VER" && INFOCMP_PROG=infocmp6 + VER=`tic6 -V 2>/dev/null` + test -n "$VER" && TIC_PROG=tic6 + test -z "$VER" && need_ncurses +} + +MYTEMP=`mktemp -d 2>/dev/null` +if test -z "$MYTEMP" +then + MYTEMP=${TMPDIR:-/tmp}/run-tic$$ +fi +mkdir -p $MYTEMP || failed "cannot mkdir $MYTEMP" +trap "rm -rf $MYTEMP" EXIT INT QUIT HUP TERM + +STDERR=$MYTEMP/run-tic$$.log +VER=`tic -V 2>/dev/null` +OPT= + +TIC_PROG=tic +TPUT_PROG=tput +INFOCMP_PROG=infocmp +unset TERM +unset TERMINFO_DIRS + +PASS1="$@" +PASS2="$@" + +case "x$VER" in +*ncurses*) + OPT="-x" + # Prefer ncurses 6.1 over 6.0 over any 5, if we can get it, to support + # large numbers (used in xterm-direct) and large entries (an issue with + # xterm-nrc). + case "$VER" in + *\ [7-9].*|*\ 6.[1-9].20[12][0-9]*) + check=`echo "$VER" | sed -e 's/^.*\.//' -e 's/[^0-9].*$//'` + [ "$check" -lt "$USE_NCURSES" ] && use_ncurses6 + ;; + *) + # On systems with only ncurses 5, check for development version + # of ncurses. + use_ncurses6 + ;; + esac + echo "** using tic from $VER" + # If this is 6.1.20180127 or later and using ABI 6, then it supports + # entries larger than 4096 bytes (up to 32768). + case "$VER" in + *\ [7-9].*|*\ 6.[1-9].20[12][0-9]*) + expect=" cols#100000," + cat >$MYTEMP/fake.ti </dev/null + check=`TERMINFO=$MYTEMP TERM=fake $INFOCMP_PROG -1 fake 2>/dev/null |grep "$expect"` + test "x$check" = "x$expect" || BIG=no + ;; + *) + BIG=no + ;; + esac + if test "$BIG" = no + then + # Trim out the SGR 1006 feature, to keep "xterm-nrc" smaller + # than 4096 bytes. + echo "...this version does not support large terminal descriptions" + PASS2=$MYTEMP/input + sed -e 's/use=xterm+sm+1006,//' -e '/^[ ][ ]*$/d' "$PASS1" >$PASS2 + set $PASS2 + fi + ;; +esac + +echo "** $TIC_PROG $OPT" "$PASS1" +$TIC_PROG $OPT "$PASS2" 2>$STDERR +RET=$? + +sed -e "s%$PASS2%$PASS1%" $STDERR | \ +fgrep -v 'Unknown Capability' | \ +fgrep -v 'Capability is not recognized:' | \ +fgrep -v 'tic: Warning near line ' >&2 +rm -f $STDERR + +exit $RET diff --git a/ports/xterm/xterm-359/screen.c b/ports/xterm/xterm-359/screen.c new file mode 100644 index 0000000..edb946d --- /dev/null +++ b/ports/xterm/xterm-359/screen.c @@ -0,0 +1,3192 @@ +/* $XTermId: screen.c,v 1.590 2020/06/07 19:42:38 tom Exp $ */ + +/* + * Copyright 1999-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* screen.c */ + +#include +#include +#include +#include +#include + +#include + +#if OPT_WIDE_ATTRS || OPT_WIDE_CHARS +#include +#endif + +#include + +#include +#include + +#include + +#define inSaveBuf(screen, buf, inx) \ + ((buf) == (screen)->saveBuf_index && \ + ((inx) < (screen)->savelines || (screen)->savelines == 0)) + +#define getMinRow(screen) ((xw->flags & ORIGIN) ? (screen)->top_marg : 0) +#define getMaxRow(screen) ((xw->flags & ORIGIN) ? (screen)->bot_marg : (screen)->max_row) +#define getMinCol(screen) ((xw->flags & ORIGIN) ? (screen)->lft_marg : 0) +#define getMaxCol(screen) ((xw->flags & ORIGIN) ? (screen)->rgt_marg : (screen)->max_col) + +#define MoveLineData(base, dst, src, len) \ + memmove(scrnHeadAddr(screen, base, (unsigned) (dst)), \ + scrnHeadAddr(screen, base, (unsigned) (src)), \ + (size_t) scrnHeadSize(screen, (unsigned) (len))) + +#define SaveLineData(base, src, len) \ + (void) ScrnPointers(screen, len); \ + memcpy (screen->save_ptr, \ + scrnHeadAddr(screen, base, src), \ + (size_t) scrnHeadSize(screen, (unsigned) (len))) + +#define RestoreLineData(base, dst, len) \ + memcpy (scrnHeadAddr(screen, base, dst), \ + screen->save_ptr, \ + (size_t) scrnHeadSize(screen, (unsigned) (len))) + +#if OPT_SAVE_LINES +#define VisBuf(screen) screen->editBuf_index[screen->whichBuf] +#else +#define VisBuf(screen) scrnHeadAddr(screen, screen->saveBuf_index, (unsigned) savelines) +#endif + +/* + * ScrnPtr's can point to different types of data. + */ +#define SizeofScrnPtr(name) \ + (unsigned) sizeof(*((LineData *)0)->name) + +/* + * The pointers in LineData point into a block of text allocated as a single + * chunk for the given number of rows. Ensure that these pointers are aligned + * at least to int-boundaries. + */ +#define AlignMask() (sizeof(int) - 1) +#define IsAligned(value) (((unsigned long) (value) & AlignMask()) == 0) + +#define AlignValue(value) \ + if (!IsAligned(value)) \ + value = (value | (unsigned) AlignMask()) + 1 + +#define SetupScrnPtr(dst,src,type) \ + dst = (type *) (void *) src; \ + assert(IsAligned(dst)); \ + src += skipNcol##type + +#define ScrnBufAddr(ptrs, offset) (ScrnBuf) ((void *) ((char *) (ptrs) + (offset))) +#define LineDataAddr(ptrs, offset) (LineData *) ((void *) ((char *) (ptrs) + (offset))) + +#if OPT_TRACE > 1 +static void +traceScrnBuf(const char *tag, TScreen *screen, ScrnBuf sb, unsigned len) +{ + unsigned j; + + TRACE(("traceScrnBuf %s\n", tag)); + for (j = 0; j < len; ++j) { + LineData *src = (LineData *) scrnHeadAddr(screen, sb, j); + TRACE(("%p %s%3d:%s\n", + src, ((int) j >= screen->savelines) ? "*" : " ", + j, visibleIChars(src->charData, src->lineSize))); + } + TRACE(("...traceScrnBuf %s\n", tag)); +} + +#define TRACE_SCRNBUF(tag, screen, sb, len) traceScrnBuf(tag, screen, sb, len) +#else +#define TRACE_SCRNBUF(tag, screen, sb, len) /*nothing */ +#endif + +#if OPT_WIDE_CHARS +#define scrnHeadSize(screen, count) \ + (unsigned) ((count) * \ + (SizeOfLineData + \ + ((screen)->wide_chars \ + ? (unsigned) (screen)->lineExtra \ + : 0))) +#else +#define scrnHeadSize(screen, count) \ + (unsigned) ((count) * \ + SizeOfLineData) +#endif + +ScrnBuf +scrnHeadAddr(TScreen *screen, ScrnBuf base, unsigned offset) +{ + unsigned size = scrnHeadSize(screen, offset); + ScrnBuf result = ScrnBufAddr(base, size); + + (void) screen; + assert((int) offset >= 0); + + return result; +} + +/* + * Given a block of data, build index to it in the 'base' parameter. + */ +void +setupLineData(TScreen *screen, ScrnBuf base, Char *data, unsigned nrow, unsigned ncol) +{ + unsigned i; + unsigned offset = 0; + unsigned jump = scrnHeadSize(screen, 1); + LineData *ptr; +#if OPT_WIDE_CHARS + unsigned j; +#endif + /* these names are based on types */ + unsigned skipNcolIAttr; + unsigned skipNcolCharData; +#if OPT_ISO_COLORS + unsigned skipNcolCellColor; +#endif + + (void) screen; + AlignValue(ncol); + + skipNcolIAttr = (ncol * SizeofScrnPtr(attribs)); + skipNcolCharData = (ncol * SizeofScrnPtr(charData)); +#if OPT_ISO_COLORS + skipNcolCellColor = (ncol * SizeofScrnPtr(color)); +#endif + + for (i = 0; i < nrow; i++, offset += jump) { + ptr = LineDataAddr(base, offset); + + ptr->lineSize = (Dimension) ncol; + ptr->bufHead = 0; +#if OPT_DEC_CHRSET + SetLineDblCS(ptr, 0); +#endif + SetupScrnPtr(ptr->attribs, data, IAttr); +#if OPT_ISO_COLORS + SetupScrnPtr(ptr->color, data, CellColor); +#endif + SetupScrnPtr(ptr->charData, data, CharData); +#if OPT_WIDE_CHARS + if (screen->wide_chars) { + unsigned extra = (unsigned) screen->max_combining; + + ptr->combSize = (Char) extra; + for (j = 0; j < extra; ++j) { + SetupScrnPtr(ptr->combData[j], data, CharData); + } + } +#endif + } +} + +#define ExtractScrnData(name) \ + memcpy(dstPtrs->name, \ + ((LineData *) srcPtrs)->name,\ + dstCols * sizeof(dstPtrs->name[0])); \ + nextPtr += (srcCols * sizeof(dstPtrs->name[0])) + +/* + * As part of reallocating the screen buffer when resizing, extract from + * the old copy of the screen buffer the data which will be used in the + * new copy of the screen buffer. + */ +static void +extractScrnData(TScreen *screen, + ScrnBuf dstPtrs, + ScrnBuf srcPtrs, + unsigned nrows, + unsigned move_down) +{ + unsigned j; + + TRACE(("extractScrnData(nrows %d)\n", nrows)); + + TRACE_SCRNBUF("extract from", screen, srcPtrs, nrows); + for (j = 0; j < nrows; j++) { + LineData *dst = (LineData *) scrnHeadAddr(screen, + dstPtrs, j + move_down); + LineData *src = (LineData *) scrnHeadAddr(screen, + srcPtrs, j); + copyLineData(dst, src); + } +} + +static ScrnPtr * +allocScrnHead(TScreen *screen, unsigned nrow) +{ + ScrnPtr *result; + unsigned size = scrnHeadSize(screen, 1); + + (void) screen; + result = (ScrnPtr *) calloc((size_t) nrow, (size_t) size); + if (result == 0) + SysError(ERROR_SCALLOC); + + TRACE(("allocScrnHead %d -> %d -> %p..%p\n", nrow, nrow * size, + (void *) result, + (char *) result + (nrow * size) - 1)); + return result; +} + +/* + * Return the size of a line's data. + */ +static unsigned +sizeofScrnRow(TScreen *screen, unsigned ncol) +{ + unsigned result; + unsigned sizeAttribs; +#if OPT_ISO_COLORS + unsigned sizeColors; +#endif + + (void) screen; + + result = (ncol * (unsigned) sizeof(CharData)); + AlignValue(result); + +#if OPT_WIDE_CHARS + if (screen->wide_chars) { + result *= (unsigned) (1 + screen->max_combining); + } +#endif + + sizeAttribs = (ncol * SizeofScrnPtr(attribs)); + AlignValue(sizeAttribs); + result += sizeAttribs; + +#if OPT_ISO_COLORS + sizeColors = (ncol * SizeofScrnPtr(color)); + AlignValue(sizeColors); + result += sizeColors; +#endif + + return result; +} + +Char * +allocScrnData(TScreen *screen, unsigned nrow, unsigned ncol) +{ + Char *result = 0; + size_t length; + + AlignValue(ncol); + length = ((nrow + 1) * sizeofScrnRow(screen, ncol)); + if (length == 0 + || (result = (Char *) calloc(length, sizeof(Char))) == 0) + SysError(ERROR_SCALLOC2); + + TRACE(("allocScrnData %ux%u -> %lu -> %p..%p\n", + nrow, ncol, (unsigned long) length, result, result + length - 1)); + return result; +} + +/* + * Allocates memory for a 2-dimensional array of chars and returns a pointer + * thereto. Each line is formed from a set of char arrays, with an index + * (i.e., the ScrnBuf type). The first pointer in the index is reserved for + * per-line flags, and does not point to data. + * + * After the per-line flags, we have a series of pointers to char arrays: The + * first one is the actual character array, the second one is the attributes, + * the third is the foreground and background colors, and the fourth denotes + * the character set. + * + * We store it all as pointers, because of alignment considerations. + */ +ScrnBuf +allocScrnBuf(XtermWidget xw, unsigned nrow, unsigned ncol, Char **addr) +{ + TScreen *screen = TScreenOf(xw); + ScrnBuf base = 0; + + if (nrow != 0) { + base = allocScrnHead(screen, nrow); + *addr = allocScrnData(screen, nrow, ncol); + + setupLineData(screen, base, *addr, nrow, ncol); + } + + TRACE(("allocScrnBuf %dx%d ->%p\n", nrow, ncol, (void *) base)); + return (base); +} + +#if OPT_SAVE_LINES +/* + * Copy line-data from the visible (edit) buffer to the save-lines buffer. + */ +static void +saveEditBufLines(TScreen *screen, ScrnBuf sb, unsigned n) +{ + unsigned j; + + TRACE(("...copying %d lines from editBuf to saveBuf\n", n)); +#if OPT_FIFO_LINES + (void) sb; +#endif + for (j = 0; j < n; ++j) { +#if OPT_FIFO_LINES + LineData *dst = addScrollback(screen); +#else + unsigned k = (screen->savelines + j - n); + LineData *dst = (LineData *) scrnHeadAddr(screen, sb, k); +#endif + LineData *src = getLineData(screen, (int) j); + copyLineData(dst, src); + } +} + +/* + * Copy line-data from the save-lines buffer to the visible (edit) buffer. + */ +static void +unsaveEditBufLines(TScreen *screen, ScrnBuf sb, unsigned n) +{ + unsigned j; + + TRACE(("...copying %d lines from saveBuf to editBuf\n", n)); + for (j = 0; j < n; ++j) { + int extra = (int) (n - j); + LineData *dst = (LineData *) scrnHeadAddr(screen, sb, j); +#if OPT_FIFO_LINES + CLineData *src; + + if (extra > screen->saved_fifo || extra > screen->savelines) { + TRACE(("...FIXME: must clear text!\n")); + continue; + } + src = getScrollback(screen, -extra); +#else + unsigned k = (screen->savelines - extra); + CLineData *src = CLineData *scrnHeadAddr(screen, + screen->saveBuf_index, k); +#endif + copyLineData(dst, src); + } +} +#endif + +/* + * This is called when the screen is resized. + * Returns the number of lines the text was moved down (neg for up). + * (Return value only necessary with SouthWestGravity.) + */ +static int +Reallocate(XtermWidget xw, + ScrnBuf *sbuf, + Char **sbufaddr, + unsigned nrow, + unsigned ncol, + unsigned oldrow) +{ + TScreen *screen = TScreenOf(xw); + ScrnBuf oldBufHead; + ScrnBuf newBufHead; + Char *newBufData; + unsigned minrows; + Char *oldBufData; + int move_down = 0, move_up = 0; + + if (sbuf == NULL || *sbuf == NULL) { + return 0; + } + + oldBufData = *sbufaddr; + + TRACE(("Reallocate %dx%d -> %dx%d\n", oldrow, MaxCols(screen), nrow, ncol)); + + /* + * realloc sbuf, the pointers to all the lines. + * If the screen shrinks, remove lines off the top of the buffer + * if resizeGravity resource says to do so. + */ + TRACE(("Check move_up, nrow %d vs oldrow %d (resizeGravity %s)\n", + nrow, oldrow, + BtoS(GravityIsSouthWest(xw)))); + if (GravityIsSouthWest(xw)) { + if (nrow < oldrow) { + /* Remove lines off the top of the buffer if necessary. */ + move_up = (int) (oldrow - nrow) + - (TScreenOf(xw)->max_row - TScreenOf(xw)->cur_row); + if (move_up < 0) + move_up = 0; + /* Overlapping move here! */ + TRACE(("move_up %d\n", move_up)); + if (move_up) { + ScrnBuf dst = *sbuf; + unsigned len = (unsigned) ((int) oldrow - move_up); + + TRACE_SCRNBUF("before move_up", screen, dst, oldrow); + SaveLineData(dst, 0, (size_t) move_up); + MoveLineData(dst, 0, (size_t) move_up, len); + RestoreLineData(dst, len, (size_t) move_up); + TRACE_SCRNBUF("after move_up", screen, dst, oldrow); + } + } + } + oldBufHead = *sbuf; + *sbuf = allocScrnHead(screen, (unsigned) nrow); + newBufHead = *sbuf; + + /* + * Create the new buffer space and copy old buffer contents there, line by + * line. + */ + newBufData = allocScrnData(screen, nrow, ncol); + *sbufaddr = newBufData; + + minrows = (oldrow < nrow) ? oldrow : nrow; + if (GravityIsSouthWest(xw)) { + if (nrow > oldrow) { + /* move data down to bottom of expanded screen */ + move_down = Min((int) (nrow - oldrow), TScreenOf(xw)->savedlines); + } + } + + setupLineData(screen, newBufHead, *sbufaddr, nrow, ncol); + extractScrnData(screen, newBufHead, oldBufHead, minrows, +#if OPT_SAVE_LINES + 0 +#else + (unsigned) move_down +#endif + ); + free(oldBufHead); + + /* Now free the old data */ + free(oldBufData); + + TRACE(("...Reallocate %dx%d ->%p\n", nrow, ncol, (void *) newBufHead)); + return move_down ? move_down : -move_up; /* convert to rows */ +} + +#if OPT_WIDE_CHARS +/* + * This function reallocates memory if changing the number of Buf offsets. + * The code is based on Reallocate(). + */ +static void +ReallocateBufOffsets(XtermWidget xw, + ScrnBuf *sbuf, + Char **sbufaddr, + unsigned nrow, + unsigned ncol) +{ + TScreen *screen = TScreenOf(xw); + unsigned i; + ScrnBuf newBufHead; + Char *oldBufData; + ScrnBuf oldBufHead; + + unsigned old_jump = scrnHeadSize(screen, 1); + unsigned new_jump; + unsigned new_ptrs = 1 + (unsigned) (screen->max_combining); + unsigned dstCols = ncol; + unsigned srcCols = ncol; + LineData *dstPtrs; + LineData *srcPtrs; + Char *nextPtr; + + assert(nrow != 0); + assert(ncol != 0); + + oldBufData = *sbufaddr; + oldBufHead = *sbuf; + + /* + * Allocate a new LineData array, retain the old one until we've copied + * the data that it points to, as well as non-pointer data, e.g., bufHead. + * + * Turn on wide-chars temporarily when constructing pointers, since that is + * used to decide whether to address the combData[] array, which affects + * the length of the LineData structure. + */ + screen->wide_chars = True; + + new_jump = scrnHeadSize(screen, 1); + newBufHead = allocScrnHead(screen, nrow); + *sbufaddr = allocScrnData(screen, nrow, ncol); + setupLineData(screen, newBufHead, *sbufaddr, nrow, ncol); + + screen->wide_chars = False; + + nextPtr = *sbufaddr; + + srcPtrs = (LineData *) oldBufHead; + dstPtrs = (LineData *) newBufHead; + for (i = 0; i < nrow; i++) { + dstPtrs->bufHead = srcPtrs->bufHead; + ExtractScrnData(attribs); +#if OPT_ISO_COLORS + ExtractScrnData(color); +#endif + ExtractScrnData(charData); + + nextPtr += ncol * new_ptrs; + srcPtrs = LineDataAddr(srcPtrs, old_jump); + dstPtrs = LineDataAddr(dstPtrs, new_jump); + } + + /* Now free the old data */ + free(oldBufData); + free(oldBufHead); + + *sbuf = newBufHead; + + TRACE(("ReallocateBufOffsets %dx%d ->%p\n", nrow, ncol, *sbufaddr)); +} + +#if OPT_FIFO_LINES +/* + * Allocate a new FIFO index. + */ +static void +ReallocateFifoIndex(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->savelines > 0 && screen->saveBuf_index != 0) { + ScrnBuf newBufHead; + LineData *dstPtrs; + LineData *srcPtrs; + unsigned i; + unsigned old_jump = scrnHeadSize(screen, 1); + unsigned new_jump; + + screen->wide_chars = True; + newBufHead = allocScrnHead(screen, (unsigned) screen->savelines); + new_jump = scrnHeadSize(screen, 1); + + srcPtrs = (LineData *) screen->saveBuf_index; + dstPtrs = (LineData *) newBufHead; + + for (i = 0; i < (unsigned) screen->savelines; ++i) { + memcpy(dstPtrs, srcPtrs, SizeOfLineData); + srcPtrs = LineDataAddr(srcPtrs, old_jump); + dstPtrs = LineDataAddr(dstPtrs, new_jump); + } + + screen->wide_chars = False; + free(screen->saveBuf_index); + screen->saveBuf_index = newBufHead; + } +} +#endif + +/* + * This function dynamically adds support for wide-characters. + */ +void +ChangeToWide(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->wide_chars) + return; + + TRACE(("ChangeToWide\n")); + if (xtermLoadWideFonts(xw, True)) { + int whichBuf = screen->whichBuf; + +#if !OPT_FIFO_LINES || !OPT_SAVE_LINES + int savelines = screen->scrollWidget ? screen->savelines : 0; + + if (savelines < 0) + savelines = 0; +#endif + + /* + * If we're displaying the alternate screen, switch the pointers back + * temporarily so ReallocateBufOffsets() will operate on the proper + * data in the alternate buffer. + */ + if (screen->whichBuf) + SwitchBufPtrs(screen, 0); + +#if OPT_SAVE_LINES +#if OPT_FIFO_LINES + ReallocateFifoIndex(xw); +#else + ReallocateBufOffsets(xw, + &screen->saveBuf_index, + &screen->saveBuf_data, + (unsigned) savelines, + (unsigned) MaxCols(screen)); +#endif + if (screen->editBuf_index[0]) { + ReallocateBufOffsets(xw, + &screen->editBuf_index[0], + &screen->editBuf_data[0], + (unsigned) MaxRows(screen), + (unsigned) MaxCols(screen)); + } +#else + ReallocateBufOffsets(xw, + &screen->saveBuf_index, + &screen->saveBuf_data, + (unsigned) (MaxRows(screen) + savelines), + (unsigned) MaxCols(screen)); +#endif + if (screen->editBuf_index[1]) { + ReallocateBufOffsets(xw, + &screen->editBuf_index[1], + &screen->editBuf_data[1], + (unsigned) MaxRows(screen), + (unsigned) MaxCols(screen)); + } + + screen->wide_chars = True; + screen->visbuf = VisBuf(screen); + + /* + * Switch the pointers back before we start painting on the screen. + */ + if (whichBuf) + SwitchBufPtrs(screen, whichBuf); + + update_font_utf8_mode(); + SetVTFont(xw, screen->menu_font_number, True, NULL); + } + TRACE(("...ChangeToWide\n")); +} +#endif + +/* + * Copy cells, no side-effects. + */ +void +CopyCells(TScreen *screen, LineData *src, LineData *dst, int col, int len, Bool down) +{ + (void) screen; + (void) down; + + if (len > 0) { + int n; + int last = col + len; +#if OPT_WIDE_CHARS + int fix_l = -1; + int fix_r = -1; +#endif + + /* + * If the copy overwrites a double-width character which has one half + * outside the margin, then we will replace both cells with blanks. + */ + if_OPT_WIDE_CHARS(screen, { + if (col > 0) { + if (dst->charData[col] == HIDDEN_CHAR) { + if (down) { + Clear2Cell(dst, src, col - 1); + Clear2Cell(dst, src, col); + } else { + if (src->charData[col] != HIDDEN_CHAR) { + Clear2Cell(dst, src, col - 1); + Clear2Cell(dst, src, col); + } else { + fix_l = col - 1; + } + } + } else if (src->charData[col] == HIDDEN_CHAR) { + Clear2Cell(dst, src, col - 1); + Clear2Cell(dst, src, col); + ++col; + } + } + if (last < (int) src->lineSize) { + if (dst->charData[last] == HIDDEN_CHAR) { + if (down) { + Clear2Cell(dst, src, last - 1); + Clear2Cell(dst, src, last); + } else { + if (src->charData[last] != HIDDEN_CHAR) { + Clear2Cell(dst, src, last); + } else { + fix_r = last - 1; + } + } + } else if (src->charData[last] == HIDDEN_CHAR) { + last--; + Clear2Cell(dst, src, last); + } + } + }); + + for (n = col; n < last; ++n) { + dst->charData[n] = src->charData[n]; + dst->attribs[n] = src->attribs[n]; + } + + if_OPT_ISO_COLORS(screen, { + for (n = col; n < last; ++n) { + dst->color[n] = src->color[n]; + } + }); + + if_OPT_WIDE_CHARS(screen, { + size_t off; + for (n = col; n < last; ++n) { + for_each_combData(off, src) { + dst->combData[off][n] = src->combData[off][n]; + } + } + }); + + if_OPT_WIDE_CHARS(screen, { + if (fix_l >= 0) { + Clear2Cell(dst, src, fix_l); + Clear2Cell(dst, src, fix_l + 1); + } + if (fix_r >= 0) { + Clear2Cell(dst, src, fix_r); + Clear2Cell(dst, src, fix_r + 1); + } + }); + } +} + +static void +FillIAttr(IAttr * target, unsigned source, size_t count) +{ + while (count-- != 0) { + *target++ = (IAttr) source; + } +} + +/* + * Clear cells, no side-effects. + */ +void +ClearCells(XtermWidget xw, int flags, unsigned len, int row, int col) +{ + if (len != 0) { + TScreen *screen = TScreenOf(xw); + LineData *ld; + unsigned n; + + ld = getLineData(screen, row); + + if (((unsigned) col + len) > ld->lineSize) + len = (unsigned) (ld->lineSize - col); + + if_OPT_WIDE_CHARS(screen, { + if (((unsigned) col + len) < ld->lineSize && + ld->charData[col + (int) len] == HIDDEN_CHAR) { + len++; + } + if (col > 0 && + ld->charData[col] == HIDDEN_CHAR) { + len++; + col--; + } + }); + + flags = (int) ((unsigned) flags | TERM_COLOR_FLAGS(xw)); + + for (n = 0; n < len; ++n) { + ld->charData[(unsigned) col + n] = (CharData) ' '; + } + + FillIAttr(ld->attribs + col, (unsigned) flags, (size_t) len); + + if_OPT_ISO_COLORS(screen, { + CellColor p = xtermColorPair(xw); + for (n = 0; n < len; ++n) { + ld->color[(unsigned) col + n] = p; + } + }); + if_OPT_WIDE_CHARS(screen, { + size_t off; + for_each_combData(off, ld) { + memset(ld->combData[off] + col, 0, (size_t) len * sizeof(CharData)); + } + }); + } +} + +/* + * Clear data in the screen-structure (no I/O). + * Check for wide-character damage as well, clearing the damaged cells. + */ +void +ScrnClearCells(XtermWidget xw, int row, int col, unsigned len) +{ +#if OPT_WIDE_CHARS + TScreen *screen = TScreenOf(xw); +#endif + int flags = 0; + + if_OPT_WIDE_CHARS(screen, { + int kl; + int kr; + + if (DamagedCells(screen, len, &kl, &kr, row, col) + && kr >= kl) { + ClearCells(xw, flags, (unsigned) (kr - kl + 1), row, kl); + } + }); + ClearCells(xw, flags, len, row, col); +} + +/* + * Disown the selection and repaint the area that is highlighted so it is no + * longer highlighted. + */ +void +ScrnDisownSelection(XtermWidget xw) +{ + if (ScrnHaveSelection(TScreenOf(xw))) { + TRACE(("ScrnDisownSelection\n")); + if (TScreenOf(xw)->keepSelection) { + UnhiliteSelection(xw); + } else { + DisownSelection(xw); + } + } +} + +/* + * Writes str into buf at screen's current row and column. Characters are set + * to match flags. + */ +void +ScrnWriteText(XtermWidget xw, + IChar *str, + unsigned flags, + CellColor cur_fg_bg, + unsigned length) +{ + TScreen *screen = TScreenOf(xw); + LineData *ld; + IAttr *attrs; + int avail = MaxCols(screen) - screen->cur_col; + IChar *chars; +#if OPT_WIDE_CHARS + IChar starcol1; +#endif + unsigned n; + unsigned real_width = visual_width(str, length); + + (void) cur_fg_bg; /* quiet compiler warnings when unused */ + + if (real_width + (unsigned) screen->cur_col > (unsigned) MaxCols(screen)) { + real_width = (unsigned) (MaxCols(screen) - screen->cur_col); + } + + if (avail <= 0) + return; + if (length > (unsigned) avail) + length = (unsigned) avail; + if (length == 0 || real_width == 0) + return; + + ld = getLineData(screen, screen->cur_row); + + chars = ld->charData + screen->cur_col; + attrs = ld->attribs + screen->cur_col; + +#if OPT_WIDE_CHARS + starcol1 = *chars; +#endif + + /* write blanks if we're writing invisible text */ + for (n = 0; n < length; ++n) { + if ((flags & INVISIBLE)) + chars[n] = ' '; + else + chars[n] = str[n]; + } + +#if OPT_BLINK_TEXT + if ((flags & BLINK) && !(screen->blink_as_bold)) { + LineSetBlinked(ld); + } +#endif + + if_OPT_WIDE_CHARS(screen, { + + if (real_width != length) { + IChar *char1 = chars; + if (screen->cur_col + && starcol1 == HIDDEN_CHAR + && isWide((int) char1[-1])) { + char1[-1] = (CharData) ' '; + } + /* if we are overwriting the right hand half of a + wide character, make the other half vanish */ + while (length) { + int ch = (int) str[0]; + + *char1++ = *str++; + length--; + + if (isWide(ch)) { + *char1++ = (CharData) HIDDEN_CHAR; + } + } + + if (*char1 == HIDDEN_CHAR + && char1[-1] == HIDDEN_CHAR) { + *char1 = (CharData) ' '; + } + /* if we are overwriting the left hand half of a + wide character, make the other half vanish */ + } else { + if (screen->cur_col + && starcol1 == HIDDEN_CHAR + && isWide((int) chars[-1])) { + chars[-1] = (CharData) ' '; + } + /* if we are overwriting the right hand half of a + wide character, make the other half vanish */ + if (chars[length] == HIDDEN_CHAR + && isWide((int) chars[length - 1])) { + chars[length] = (CharData) ' '; + } + } + }); + + flags &= ATTRIBUTES; + flags |= CHARDRAWN; + FillIAttr(attrs, flags, (size_t) real_width); + + if_OPT_WIDE_CHARS(screen, { + size_t off; + for_each_combData(off, ld) { + memset(ld->combData[off] + screen->cur_col, + 0, + real_width * sizeof(CharData)); + } + }); + if_OPT_ISO_COLORS(screen, { + unsigned j; + for (j = 0; j < real_width; ++j) + ld->color[screen->cur_col + (int) j] = cur_fg_bg; + }); + +#if OPT_WIDE_CHARS + screen->last_written_col = screen->cur_col + (int) real_width - 1; + screen->last_written_row = screen->cur_row; +#endif + + TRACE(("text erasing cur_col=%d cur_row=%d real_width=%d\n", + screen->cur_col, + screen->cur_row, + real_width)); + chararea_clear_displayed_graphics(screen, + screen->cur_col, + screen->cur_row, + (int) real_width, 1); + + if_OPT_XMC_GLITCH(screen, { + Resolve_XMC(xw); + }); + + return; +} + +/* + * Saves pointers to the n lines beginning at sb + where, and clears the lines + */ +static void +ScrnClearLines(XtermWidget xw, ScrnBuf sb, int where, unsigned n, unsigned size) +{ + TScreen *screen = TScreenOf(xw); + ScrnPtr *base; + unsigned jump = scrnHeadSize(screen, 1); + unsigned i; + LineData *work; + unsigned flags = TERM_COLOR_FLAGS(xw); +#if OPT_ISO_COLORS + unsigned j; +#endif + + TRACE(("ScrnClearLines(%s:where %d, n %d, size %d)\n", + (sb == screen->saveBuf_index) ? "save" : "edit", + where, n, size)); + + assert((int) n > 0); + assert(size != 0); + + /* save n lines at where */ + SaveLineData(sb, (unsigned) where, (size_t) n); + + /* clear contents of old rows */ + base = screen->save_ptr; + for (i = 0; i < n; ++i) { + work = (LineData *) base; + work->bufHead = 0; +#if OPT_DEC_CHRSET + SetLineDblCS(work, 0); +#endif + + memset(work->charData, 0, size * sizeof(CharData)); + if (TERM_COLOR_FLAGS(xw)) { + FillIAttr(work->attribs, flags, (size_t) size); +#if OPT_ISO_COLORS + { + CellColor p = xtermColorPair(xw); + for (j = 0; j < size; ++j) { + work->color[j] = p; + } + } +#endif + } else { + FillIAttr(work->attribs, 0, (size_t) size); +#if OPT_ISO_COLORS + memset(work->color, 0, size * sizeof(work->color[0])); +#endif + } +#if OPT_WIDE_CHARS + if (screen->wide_chars) { + size_t off; + + for (off = 0; off < work->combSize; ++off) { + memset(work->combData[off], 0, size * sizeof(CharData)); + } + } +#endif + base = ScrnBufAddr(base, jump); + } + + TRACE(("clear lines erasing where=%d screen->savelines=%d n=%d screen->max_col=%d\n", + where, + screen->savelines, + n, + screen->max_col)); + /* FIXME: this looks wrong -- rcombs */ + chararea_clear_displayed_graphics(screen, + where + screen->savelines, + 0, + screen->max_col + 1, + (int) n); +} + +/* + * We're always ensured of having a visible buffer, but may not have saved + * lines. Check the pointer that's sure to work. + */ +#if OPT_SAVE_LINES +#define OkAllocBuf(screen) (screen->editBuf_index[0] != 0) +#else +#define OkAllocBuf(screen) (screen->saveBuf_index != 0) +#endif + +void +ScrnAllocBuf(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (!OkAllocBuf(screen)) { + int nrows = MaxRows(screen); +#if !OPT_SAVE_LINES + int savelines = screen->scrollWidget ? screen->savelines : 0; +#endif + + TRACE(("ScrnAllocBuf %dx%d (%d)\n", + nrows, MaxCols(screen), screen->savelines)); + +#if OPT_SAVE_LINES + if (screen->savelines != 0) { +#if OPT_FIFO_LINES + /* for FIFO, we only need space for the index - addScrollback inits */ + screen->saveBuf_index = allocScrnHead(screen, + (unsigned) (screen->savelines)); +#else + screen->saveBuf_index = allocScrnBuf(xw, + (unsigned) screen->savelines, + (unsigned) MaxCols(screen), + &screen->saveBuf_data); +#endif + } else { + screen->saveBuf_index = 0; + } + screen->editBuf_index[0] = allocScrnBuf(xw, + (unsigned) nrows, + (unsigned) MaxCols(screen), + &screen->editBuf_data[0]); +#else /* !OPT_SAVE_LINES */ + screen->saveBuf_index = allocScrnBuf(xw, + (unsigned) (nrows + screen->savelines), + (unsigned) (MaxCols(screen)), + &screen->saveBuf_data); +#endif /* OPT_SAVE_LINES */ + screen->visbuf = VisBuf(screen); + } + return; +} + +size_t +ScrnPointers(TScreen *screen, size_t len) +{ + size_t result = scrnHeadSize(screen, (unsigned) len); + + if (result > screen->save_len) { + if (screen->save_len) + screen->save_ptr = (ScrnPtr *) realloc(screen->save_ptr, result); + else + screen->save_ptr = (ScrnPtr *) malloc(result); + screen->save_len = len; + if (screen->save_ptr == 0) + SysError(ERROR_SAVE_PTR); + } + TRACE2(("ScrnPointers %ld ->%p\n", (long) len, screen->save_ptr)); + return result; +} + +/* + * Inserts n blank lines at sb + where, treating last as a bottom margin. + */ +void +ScrnInsertLine(XtermWidget xw, ScrnBuf sb, int last, int where, unsigned n) +{ + TScreen *screen = TScreenOf(xw); + unsigned size = (unsigned) MaxCols(screen); + + TRACE(("ScrnInsertLine(last %d, where %d, n %d, size %d)\n", + last, where, n, size)); + + assert(where >= 0); + assert(last >= where); + + assert((int) n > 0); + assert(size != 0); + + /* save n lines at bottom */ + ScrnClearLines(xw, sb, (last -= (int) n - 1), n, size); + if (last < 0) { + TRACE(("...remainder of screen is blank\n")); + return; + } + + /* + * WARNING, overlapping copy operation. Move down lines (pointers). + * + * +----|---------|--------+ + * + * is copied in the array to: + * + * +--------|---------|----+ + */ + assert(last >= where); + /* + * This will never shift from the saveBuf to editBuf, so there is no need + * to handle that case. + */ + MoveLineData(sb, + (unsigned) (where + (int) n), + (unsigned) where, + (unsigned) (last - where)); + + /* reuse storage for new lines at where */ + RestoreLineData(sb, (unsigned) where, n); +} + +/* + * Deletes n lines at sb + where, treating last as a bottom margin. + */ +void +ScrnDeleteLine(XtermWidget xw, ScrnBuf sb, int last, int where, unsigned n) +{ + TScreen *screen = TScreenOf(xw); + unsigned size = (unsigned) MaxCols(screen); + + TRACE(("ScrnDeleteLine(%s:last %d, where %d, n %d, size %d)\n", + (sb == screen->saveBuf_index) ? "save" : "edit", + last, where, n, size)); + + assert(where >= 0); + assert(last >= where + (int) n - 1); + + assert((int) n > 0); + assert(size != 0); + + /* move up lines */ + last -= ((int) n - 1); +#if OPT_SAVE_LINES + if (inSaveBuf(screen, sb, where)) { +#if !OPT_FIFO_LINES + int from = where + n; +#endif + + /* we shouldn't be editing the saveBuf, only scroll into it */ + assert(last >= screen->savelines); + + if (sb != 0) { +#if OPT_FIFO_LINES + /* copy lines from editBuf to saveBuf (allocating as we go...) */ + saveEditBufLines(screen, sb, n); +#else + ScrnClearLines(xw, sb, where, n, size); + + /* move the pointers within saveBuf */ + TRACE(("...%smoving pointers in saveBuf (compare %d %d)\n", + ((screen->savelines > from) + ? "" + : "SKIP "), + screen->savelines, + from)); + if (screen->savelines > from) { + MoveLineData(sb, + (unsigned) where, + (unsigned) from, + (unsigned) (screen->savelines - from)); + } + + /* reuse storage in saveBuf */ + TRACE(("...reuse %d lines storage in saveBuf\n", n)); + RestoreLineData(sb, (unsigned) screen->savelines - n, n); + + /* copy lines from editBuf to saveBuf (into the reused storage) */ + saveEditBufLines(screen, sb, n); +#endif + } + + /* adjust variables to fall-thru into changes only to editBuf */ + TRACE(("...adjusting variables, to work on editBuf alone\n")); + last -= screen->savelines; + where = 0; + sb = screen->visbuf; + } +#endif + /* + * Scroll the visible buffer (editBuf). + */ + ScrnClearLines(xw, sb, where, n, size); + + MoveLineData(sb, + (unsigned) where, + (unsigned) (where + (int) n), + (size_t) (last - where)); + + /* reuse storage for new bottom lines */ + RestoreLineData(sb, (unsigned) last, n); +} + +/* + * Inserts n blanks in screen at current row, col. Size is the size of each + * row. + */ +void +ScrnInsertChar(XtermWidget xw, unsigned n) +{ +#define MemMove(data) \ + for (j = last; j >= (col + (int) n); --j) \ + data[j] = data[j - (int) n] + + TScreen *screen = TScreenOf(xw); + int first = ScrnLeftMargin(xw); + int last = ScrnRightMargin(xw); + int row = screen->cur_row; + int col = screen->cur_col; + int j; + LineData *ld; + + if (col < first || col > last) { + TRACE(("ScrnInsertChar - col %d outside [%d..%d]\n", col, first, last)); + return; + } else if (last < (col + (int) n)) { + n = (unsigned) (last + 1 - col); + } + + assert(screen->cur_col >= 0); + assert(screen->cur_row >= 0); + assert((int) n >= 0); + assert((last + 1) >= (int) n); + + if_OPT_WIDE_CHARS(screen, { + int xx = screen->cur_row; + int kl; + int kr = screen->cur_col; + if (DamagedCells(screen, n, &kl, (int *) 0, xx, kr) && kr > kl) { + ClearCells(xw, 0, (unsigned) (kr - kl + 1), row, kl); + } + kr = last - (int) n + 1; + if (DamagedCells(screen, n, &kl, (int *) 0, xx, kr) && kr > kl) { + ClearCells(xw, 0, (unsigned) (kr - kl + 1), row, kl); + } + }); + + if ((ld = getLineData(screen, row)) != 0) { + MemMove(ld->charData); + MemMove(ld->attribs); + + if_OPT_ISO_COLORS(screen, { + MemMove(ld->color); + }); + if_OPT_WIDE_CHARS(screen, { + size_t off; + for_each_combData(off, ld) { + MemMove(ld->combData[off]); + } + }); + } + ClearCells(xw, CHARDRAWN, n, row, col); + +#undef MemMove +} + +/* + * Deletes n characters at current row, col. + */ +void +ScrnDeleteChar(XtermWidget xw, unsigned n) +{ +#define MemMove(data) \ + for (j = col; j <= last - (int) n; ++j) \ + data[j] = data[j + (int) n] + + TScreen *screen = TScreenOf(xw); + int first = ScrnLeftMargin(xw); + int last = ScrnRightMargin(xw) + 1; + int row = screen->cur_row; + int col = screen->cur_col; + int j; + LineData *ld; + + if (col < first || col > last) { + TRACE(("ScrnDeleteChar - col %d outside [%d..%d]\n", col, first, last)); + return; + } else if (last <= (col + (int) n)) { + n = (unsigned) (last - col); + } + + assert(screen->cur_col >= 0); + assert(screen->cur_row >= 0); + assert((int) n >= 0); + assert(last >= (int) n); + + if_OPT_WIDE_CHARS(screen, { + int kl; + int kr; + if (DamagedCells(screen, n, &kl, &kr, + screen->cur_row, + screen->cur_col)) + ClearCells(xw, 0, (unsigned) (kr - kl + 1), row, kl); + }); + + if ((ld = getLineData(screen, row)) != 0) { + MemMove(ld->charData); + MemMove(ld->attribs); + + if_OPT_ISO_COLORS(screen, { + MemMove(ld->color); + }); + if_OPT_WIDE_CHARS(screen, { + size_t off; + for_each_combData(off, ld) { + MemMove(ld->combData[off]); + } + }); + LineClrWrapped(ld); + if (screen->show_wrap_marks) { + ShowWrapMarks(xw, row, ld); + } + } + ClearCells(xw, 0, n, row, (last - (int) n)); + +#undef MemMove +} + +/* + * This is useful for debugging both xterm and applications that may manipulate + * its line-wrapping state. + */ +void +ShowWrapMarks(XtermWidget xw, int row, CLineData *ld) +{ + TScreen *screen = TScreenOf(xw); + Boolean set = (Boolean) LineTstWrapped(ld); + CgsEnum cgsId = set ? gcVTcursFilled : gcVTcursReverse; + VTwin *currentWin = WhichVWin(screen); + int y = row * FontHeight(screen) + screen->border; + int x = LineCursorX(screen, ld, screen->max_col + 1); + + TRACE2(("ShowWrapMarks %d:%s\n", row, BtoS(set))); + + XFillRectangle(screen->display, VDrawable(screen), + getCgsGC(xw, currentWin, cgsId), + x, y, + (unsigned) screen->border, + (unsigned) FontHeight(screen)); +} + +/* + * Repaints the area enclosed by the parameters. + * Requires: (toprow, leftcol), (toprow + nrows, leftcol + ncols) are + * coordinates of characters in screen; + * nrows and ncols positive. + * all dimensions are based on single-characters. + */ +void +ScrnRefresh(XtermWidget xw, + int toprow, + int leftcol, + int nrows, + int ncols, + Bool force) /* ... leading/trailing spaces */ +{ + TScreen *screen = TScreenOf(xw); + XTermDraw params; + CLineData *ld; + int y = toprow * FontHeight(screen) + screen->border; + int row; + int maxrow = toprow + nrows - 1; + int scrollamt = screen->scroll_amt; + unsigned gc_changes = 0; +#ifdef __CYGWIN__ + static char first_time = 1; +#endif + static int recurse = 0; +#if OPT_WIDE_ATTRS + unsigned old_attrs = xw->flags; +#endif + + TRACE(("ScrnRefresh top %d (%d,%d) - (%d,%d)%s {{\n", + screen->topline, toprow, leftcol, + nrows, ncols, + force ? " force" : "")); + + ++recurse; + + if (screen->cursorp.col >= leftcol + && screen->cursorp.col <= (leftcol + ncols - 1) + && screen->cursorp.row >= ROW2INX(screen, toprow) + && screen->cursorp.row <= ROW2INX(screen, maxrow)) + screen->cursor_state = OFF; + + for (row = toprow; row <= maxrow; y += FontHeight(screen), row++) { +#if OPT_ISO_COLORS + CellColor *fb = 0; +#define ColorOf(col) (fb ? fb[col] : initCColor) +#endif +#if OPT_WIDE_CHARS + int wideness = 0; +#endif +#define BLANK_CEL(cell) (chars[cell] == ' ') + IChar *chars; + const IAttr *attrs; + int col = leftcol; + int maxcol = leftcol + ncols - 1; + int hi_col = maxcol; + int lastind; + unsigned flags; + unsigned test; + CellColor fg_bg = initCColor; + Pixel fg = 0, bg = 0; + int x; + GC gc; + Bool hilite; + + (void) fg; + (void) bg; +#if !OPT_ISO_COLORS + fg_bg = 0; +#endif + + if (row < screen->top_marg || row > screen->bot_marg) + lastind = row; + else + lastind = row - scrollamt; + + if (lastind < 0 || lastind > screen->max_row) + continue; + + TRACE2(("ScrnRefresh row=%d lastind=%d ->%d\n", + row, lastind, ROW2INX(screen, lastind))); + + if ((ld = getLineData(screen, ROW2INX(screen, lastind))) == 0 + || ld->charData == 0 + || ld->attribs == 0) { + break; + } + + if (screen->show_wrap_marks) { + ShowWrapMarks(xw, lastind, ld); + } + + if (maxcol >= (int) ld->lineSize) { + maxcol = ld->lineSize - 1; + hi_col = maxcol; + } + + chars = ld->charData; + attrs = ld->attribs; + + if_OPT_WIDE_CHARS(screen, { + /* This fixes an infinite recursion bug, that leads + to display anomalies. It seems to be related to + problems with the selection. */ + if (recurse < 3) { + /* adjust to redraw all of a widechar if we just wanted + to draw the right hand half */ + if (leftcol > 0 && + chars[leftcol] == HIDDEN_CHAR && + isWide((int) chars[leftcol - 1])) { + leftcol--; + ncols++; + col = leftcol; + } + } else { + xtermWarning("Unexpected recursion drawing hidden characters.\n"); + } + }); + + if (row < screen->startH.row || row > screen->endH.row || + (row == screen->startH.row && maxcol < screen->startH.col) || + (row == screen->endH.row && col >= screen->endH.col)) { +#if OPT_DEC_CHRSET + /* + * Temporarily change dimensions to double-sized characters so + * we can reuse the recursion on this function. + */ + if (CSET_DOUBLE(GetLineDblCS(ld))) { + col /= 2; + maxcol /= 2; + } +#endif + /* + * If row does not intersect selection; don't hilite blanks. + */ + if (!force) { + while (col <= maxcol && (attrs[col] & ~BOLD) == 0 && + BLANK_CEL(col)) + col++; + + while (col <= maxcol && (attrs[maxcol] & ~BOLD) == 0 && + BLANK_CEL(maxcol)) + maxcol--; + } +#if OPT_DEC_CHRSET + if (CSET_DOUBLE(GetLineDblCS(ld))) { + col *= 2; + maxcol *= 2; + } +#endif + hilite = False; + } else { + /* row intersects selection; split into pieces of single type */ + if (row == screen->startH.row && col < screen->startH.col) { + ScrnRefresh(xw, row, col, 1, screen->startH.col - col, + force); + col = screen->startH.col; + } + if (row == screen->endH.row && maxcol >= screen->endH.col) { + ScrnRefresh(xw, row, screen->endH.col, 1, + maxcol - screen->endH.col + 1, force); + maxcol = screen->endH.col - 1; + } + + /* + * If we're highlighting because the user is doing cut/paste, + * trim the trailing blanks from the highlighted region so we're + * showing the actual extent of the text that'll be cut. If + * we're selecting a blank line, we'll highlight one column + * anyway. + * + * We don't do this if the mouse-hilite mode is set because that + * would be too confusing. + * + * The default if the highlightSelection resource isn't set will + * highlight the whole width of the terminal, which is easy to + * see, but harder to use (because trailing blanks aren't as + * apparent). + */ + if (screen->highlight_selection + && screen->send_mouse_pos != VT200_HIGHLIGHT_MOUSE) { + hi_col = screen->max_col; + while (hi_col > 0 && !(attrs[hi_col] & CHARDRAWN)) + hi_col--; + } + + /* remaining piece should be hilited */ + hilite = True; + } + + if (col > maxcol) + continue; + + /* + * Go back to double-sized character dimensions if the line has + * double-width characters. Note that 'hi_col' is already in the + * right units. + */ + if_OPT_DEC_CHRSET({ + if (CSET_DOUBLE(GetLineDblCS(ld))) { + col /= 2; + maxcol /= 2; + } + }); + + flags = attrs[col]; + + if_OPT_WIDE_CHARS(screen, { + wideness = isWide((int) chars[col]); + }); + + if_OPT_ISO_COLORS(screen, { + fb = ld->color; + fg_bg = ColorOf(col); + fg = extract_fg(xw, fg_bg, flags); + bg = extract_bg(xw, fg_bg, flags); + }); + +#if OPT_WIDE_ATTRS + old_attrs = xtermUpdateItalics(xw, flags, old_attrs); +#endif + gc = updatedXtermGC(xw, flags, fg_bg, hilite); + gc_changes |= (flags & (FG_COLOR | BG_COLOR)); + + x = LineCursorX(screen, ld, col); + lastind = col; + + for (; col <= maxcol; col++) { + if ( +#if OPT_WIDE_CHARS + (chars[col] != HIDDEN_CHAR) && +#endif + ((attrs[col] != flags) + || (hilite && (col > hi_col)) +#if OPT_ISO_COLORS + || ((flags & FG_COLOR) + && (extract_fg(xw, ColorOf(col), attrs[col]) != fg)) + || ((flags & BG_COLOR) + && (extract_bg(xw, ColorOf(col), attrs[col]) != bg)) +#endif +#if OPT_WIDE_CHARS + || (isWide((int) chars[col]) != wideness) +#endif + ) + ) { + assert(col >= lastind); + TRACE(("ScrnRefresh looping drawXtermText %d..%d:%s\n", + lastind, col, + visibleIChars((&chars[lastind]), + (unsigned) (col - lastind)))); + + test = flags; + checkVeryBoldColors(test, fg); + + /* *INDENT-EQLS* */ + params.xw = xw; + params.attr_flags = (test & DRAWX_MASK); + params.draw_flags = 0; + params.this_chrset = GetLineDblCS(ld); + params.real_chrset = CSET_SWL; + params.on_wide = 0; + + x = drawXtermText(¶ms, + gc, x, y, + &chars[lastind], + (unsigned) (col - lastind)); + + if_OPT_WIDE_CHARS(screen, { + int i; + size_t off; + + params.draw_flags = NOBACKGROUND; + + for_each_combData(off, ld) { + IChar *com_off = ld->combData[off]; + + for (i = lastind; i < col; i++) { + int my_x = LineCursorX(screen, ld, i); + IChar base = chars[i]; + + if ((params.on_wide = isWide((int) base))) + my_x = LineCursorX(screen, ld, i - 1); + + if (com_off[i] != 0) + drawXtermText(¶ms, + gc, my_x, y, + com_off + i, + 1); + } + } + }); + + resetXtermGC(xw, flags, hilite); + + lastind = col; + + if (hilite && (col > hi_col)) + hilite = False; + + flags = attrs[col]; + if_OPT_ISO_COLORS(screen, { + fg_bg = ColorOf(col); + fg = extract_fg(xw, fg_bg, flags); + bg = extract_bg(xw, fg_bg, flags); + }); + if_OPT_WIDE_CHARS(screen, { + wideness = isWide((int) chars[col]); + }); + +#if OPT_WIDE_ATTRS + old_attrs = xtermUpdateItalics(xw, flags, old_attrs); +#endif + gc = updatedXtermGC(xw, flags, fg_bg, hilite); + gc_changes |= (flags & (FG_COLOR | BG_COLOR)); + } + + if (chars[col] == 0) { + chars[col] = ' '; + } + } + + assert(col >= lastind); + TRACE(("ScrnRefresh calling drawXtermText %d..%d:%s\n", + lastind, col, + visibleIChars(&chars[lastind], (unsigned) (col - lastind)))); + + test = flags; + checkVeryBoldColors(test, fg); + + /* *INDENT-EQLS* */ + params.xw = xw; + params.attr_flags = (test & DRAWX_MASK); + params.draw_flags = 0; + params.this_chrset = GetLineDblCS(ld); + params.real_chrset = CSET_SWL; + params.on_wide = 0; + + drawXtermText(¶ms, + gc, x, y, + &chars[lastind], + (unsigned) (col - lastind)); + + if_OPT_WIDE_CHARS(screen, { + int i; + size_t off; + + params.draw_flags = NOBACKGROUND; + + for_each_combData(off, ld) { + IChar *com_off = ld->combData[off]; + + for (i = lastind; i < col; i++) { + int my_x = LineCursorX(screen, ld, i); + int base = (int) chars[i]; + + if ((params.on_wide = isWide(base))) + my_x = LineCursorX(screen, ld, i - 1); + + if (com_off[i] != 0) + drawXtermText(¶ms, + gc, my_x, y, + com_off + i, + 1); + } + } + }); + + resetXtermGC(xw, flags, hilite); + } + + refresh_displayed_graphics(xw, leftcol, toprow, ncols, nrows); + + /* + * If we're in color mode, reset the various GC's to the current + * screen foreground and background so that other functions (e.g., + * ClearRight) will get the correct colors. + */ +#if OPT_WIDE_ATTRS + (void) xtermUpdateItalics(xw, xw->flags, old_attrs); +#endif + if_OPT_ISO_COLORS(screen, { + if (gc_changes & FG_COLOR) + SGR_Foreground(xw, xw->cur_foreground); + if (gc_changes & BG_COLOR) + SGR_Background(xw, xw->cur_background); + }); + +#if defined(__CYGWIN__) && defined(TIOCSWINSZ) + if (first_time == 1) { + first_time = 0; + update_winsize(screen->respond, nrows, ncols, xw->core.height, xw->core.width); + } +#endif + recurse--; + + TRACE(("...}} ScrnRefresh\n")); + return; +} + +/* + * Call this wrapper to ScrnRefresh() when the data has changed. If the + * refresh region overlaps the selection, we will release the primary selection. + */ +void +ScrnUpdate(XtermWidget xw, + int toprow, + int leftcol, + int nrows, + int ncols, + Bool force) /* ... leading/trailing spaces */ +{ + TScreen *screen = TScreenOf(xw); + + if (ScrnHaveSelection(screen) + && (toprow <= screen->endH.row) + && (toprow + nrows - 1 >= screen->startH.row)) { + ScrnDisownSelection(xw); + } + ScrnRefresh(xw, toprow, leftcol, nrows, ncols, force); +} + +/* + * Sets the rows first though last of the buffer of screen to spaces. + * Requires first <= last; first, last are rows of screen->buf. + */ +void +ClearBufRows(XtermWidget xw, + int first, + int last) +{ + TScreen *screen = TScreenOf(xw); + unsigned len = (unsigned) MaxCols(screen); + int row; + + TRACE(("ClearBufRows %d..%d\n", first, last)); + for (row = first; row <= last; row++) { + LineData *ld = getLineData(screen, row); + if (ld != 0) { + if_OPT_DEC_CHRSET({ + /* clearing the whole row resets the doublesize characters */ + SetLineDblCS(ld, CSET_SWL); + }); + LineClrWrapped(ld); + if (screen->show_wrap_marks) { + ShowWrapMarks(xw, row, ld); + } + ClearCells(xw, 0, len, row, 0); + } + } +} + +/* + Resizes screen: + 1. If new window would have fractional characters, sets window size so as to + discard fractional characters and returns -1. + Minimum screen size is 1 X 1. + Note that this causes another ExposeWindow event. + 2. Enlarges screen->buf if necessary. New space is appended to the bottom + and to the right + 3. Reduces screen->buf if necessary. Old space is removed from the bottom + and from the right + 4. Cursor is positioned as closely to its former position as possible + 5. Sets screen->max_row and screen->max_col to reflect new size + 6. Maintains the inner border (and clears the border on the screen). + 7. Clears origin mode and sets scrolling region to be entire screen. + 8. Returns 0 + */ +int +ScreenResize(XtermWidget xw, + int width, + int height, + unsigned *flags) +{ + TScreen *screen = TScreenOf(xw); + int rows, cols; + const int border = 2 * screen->border; + int move_down_by = 0; + + TRACE(("ScreenResize %dx%d border 2*%d font %dx%d\n", + height, width, screen->border, + FontHeight(screen), FontWidth(screen))); + + assert(width > 0); + assert(height > 0); + + if (screen->is_running) { + /* clear the right and bottom internal border because of NorthWest + gravity might have left junk on the right and bottom edges */ + if (width >= (int) FullWidth(screen)) { + xtermClear2(xw, + FullWidth(screen), 0, /* right edge */ + 0, (unsigned) height); /* from top to bottom */ + } + if (height >= (int) FullHeight(screen)) { + xtermClear2(xw, + 0, FullHeight(screen), /* bottom */ + (unsigned) width, 0); /* all across the bottom */ + } + } + + TRACE(("...computing rows/cols: %.2f %.2f\n", + (double) (height - border) / FontHeight(screen), + (double) (width - border - ScrollbarWidth(screen)) / FontWidth(screen))); + + rows = (height - border) / FontHeight(screen); + cols = (width - border - ScrollbarWidth(screen)) / FontWidth(screen); + if (rows < 1) + rows = 1; + if (cols < 1) + cols = 1; + + /* update buffers if the screen has changed size */ + if (MaxRows(screen) != rows || MaxCols(screen) != cols) { +#if !OPT_SAVE_LINES + int whichBuf = 0; +#endif + int delta_rows = rows - MaxRows(screen); +#if OPT_TRACE + int delta_cols = cols - MaxCols(screen); +#endif + + TRACE(("...ScreenResize chars %dx%d delta %dx%d\n", + rows, cols, delta_rows, delta_cols)); + + if (screen->is_running) { +#if !OPT_FIFO_LINES + int savelines = (screen->scrollWidget + ? screen->savelines + : 0); +#endif + if (screen->cursor_state) + HideCursor(); +#if OPT_SAVE_LINES + /* + * The non-visible buffer is simple, since we will not copy data + * to/from the saved-lines. Do that first. + */ + if (screen->editBuf_index[!screen->whichBuf]) { + (void) Reallocate(xw, + &screen->editBuf_index[!screen->whichBuf], + &screen->editBuf_data[!screen->whichBuf], + (unsigned) rows, + (unsigned) cols, + (unsigned) MaxRows(screen)); + } + + /* + * The save-lines buffer may change width, but will not change its + * height. Deal with the cases where we copy data to/from the + * saved-lines buffer. + */ + if (GravityIsSouthWest(xw) + && delta_rows + && screen->saveBuf_index != 0) { + + if (delta_rows < 0) { + unsigned move_up = (unsigned) (-delta_rows); + ScrnBuf dst = screen->saveBuf_index; + +#if OPT_FIFO_LINES + int amount = ((MaxRows(screen) - (int) move_up - 1) + - screen->cur_row); + + if (amount < 0) { + /* move line-data from visible-buffer to save-buffer */ + saveEditBufLines(screen, dst, (unsigned) -amount); + move_down_by = amount; + } else { + move_down_by = 0; + } +#else /* !OPT_FIFO_LINES */ + int amount = screen->savelines - (int) move_up; + + TRACE_SCRNBUF("before save", screen, dst, screen->savelines); + + /* shift lines in save-buffer to make room */ + TRACE(("...%smoving pointers in saveBuf (compare %d %d)\n", + (amount > 0 + ? "" + : "SKIP "), + screen->savelines, + move_up)); + if (amount > 0) { + SaveLineData(dst, 0, move_up); + + MoveLineData(dst, + 0, + move_up, + (unsigned) amount); + + TRACE(("...reuse %d lines storage in saveBuf\n", move_up)); + RestoreLineData(dst, + (unsigned) amount, + move_up); + TRACE_SCRNBUF("restoresave", screen, dst, screen->savelines); + } + + /* copy line-data from visible-buffer to save-buffer */ + saveEditBufLines(screen, dst, move_up); + + /* after data is copied, reallocate saved-lines */ + (void) Reallocate(xw, + &screen->saveBuf_index, + &screen->saveBuf_data, + (unsigned) savelines, + (unsigned) cols, + (unsigned) savelines); + TRACE_SCRNBUF("reallocSAVE", + screen, + screen->saveBuf_index, + savelines); +#endif /* OPT_FIFO_LINES */ + + /* decrease size of visible-buffer */ + (void) Reallocate(xw, + &screen->editBuf_index[screen->whichBuf], + &screen->editBuf_data[screen->whichBuf], + (unsigned) rows, + (unsigned) cols, + (unsigned) MaxRows(screen)); + TRACE_SCRNBUF("reallocEDIT", + screen, + screen->editBuf_index[screen->whichBuf], + rows); + } else { + unsigned move_down = (unsigned) delta_rows; +#if OPT_FIFO_LINES + long unsave_fifo; +#else + ScrnBuf src = screen->saveBuf_index; +#endif + ScrnBuf dst; + int amount; + + if ((int) move_down > screen->savedlines) { + move_down = (unsigned) screen->savedlines; + } + move_down_by = (int) move_down; + amount = rows - (int) move_down; + + /* increase size of visible-buffer */ + (void) Reallocate(xw, + &screen->editBuf_index[screen->whichBuf], + &screen->editBuf_data[screen->whichBuf], + (unsigned) rows, + (unsigned) cols, + (unsigned) MaxRows(screen)); + + dst = screen->editBuf_index[screen->whichBuf]; + TRACE_SCRNBUF("reallocEDIT", screen, dst, rows); + + TRACE(("...%smoving pointers in editBuf (compare %d %d)\n", + (amount > 0 + ? "" + : "SKIP "), + rows, + move_down)); + if (amount > 0) { + /* shift lines in visible-buffer to make room */ + SaveLineData(dst, (unsigned) amount, (size_t) move_down); + + MoveLineData(dst, + move_down, + 0, + (unsigned) amount); + + TRACE(("...reuse %d lines storage in editBuf\n", move_down)); + RestoreLineData(dst, + 0, + move_down); + + TRACE_SCRNBUF("shifted", screen, dst, rows); + } + + /* copy line-data from save-buffer to visible-buffer */ + unsaveEditBufLines(screen, dst, move_down); + TRACE_SCRNBUF("copied", screen, dst, rows); + +#if OPT_FIFO_LINES + unsave_fifo = (long) move_down; + if (screen->saved_fifo < (int) unsave_fifo) + unsave_fifo = screen->saved_fifo; + + /* free up storage in fifo from the copied lines */ + while (unsave_fifo-- > 0) { + deleteScrollback(screen); + } +#else + amount = (screen->savelines - (int) move_down); + TRACE(("...%smoving pointers in saveBuf (compare %d %d)\n", + (amount > 0 + ? "" + : "SKIP "), + rows, + move_down)); + if (amount > 0) { + /* shift lines in save-buffer to account for copy */ + src = screen->saveBuf_index; + SaveLineData(src, amount, move_down); + + MoveLineData(src, + move_down, + 0, + (unsigned) amount); + + TRACE(("...reuse %d lines storage in saveBuf\n", move_down)); + RestoreLineData(src, + 0, + move_down); + } +#endif + + /* recover storage in save-buffer */ + } + } else { +#if !OPT_FIFO_LINES + (void) Reallocate(xw, + &screen->saveBuf_index, + &screen->saveBuf_data, + (unsigned) savelines, + (unsigned) cols, + (unsigned) savelines); +#endif + (void) Reallocate(xw, + &screen->editBuf_index[screen->whichBuf], + &screen->editBuf_data[screen->whichBuf], + (unsigned) rows, + (unsigned) cols, + (unsigned) MaxRows(screen)); + } +#else /* !OPT_SAVE_LINES */ + if (screen->whichBuf + && GravityIsSouthWest(xw)) { + /* swap buffer pointers back to make this work */ + whichBuf = screen->whichBuf; + SwitchBufPtrs(screen, 0); + } else { + whichBuf = 0; + } + if (screen->editBuf_index[1]) + (void) Reallocate(xw, + &screen->editBuf_index[1], + &screen->editBuf_data[1], + (unsigned) rows, + (unsigned) cols, + (unsigned) MaxRows(screen)); + move_down_by = Reallocate(xw, + &screen->saveBuf_index, + &screen->saveBuf_data, + (unsigned) (rows + savelines), + (unsigned) cols, + (unsigned) (MaxRows(screen) + savelines)); +#endif /* OPT_SAVE_LINES */ + screen->visbuf = VisBuf(screen); + } + + AdjustSavedCursor(xw, move_down_by); + set_max_row(screen, screen->max_row + delta_rows); + set_max_col(screen, cols - 1); + + if (screen->is_running) { + if (GravityIsSouthWest(xw)) { + screen->savedlines -= move_down_by; + if (screen->savedlines < 0) + screen->savedlines = 0; + if (screen->savedlines > screen->savelines) + screen->savedlines = screen->savelines; + if (screen->topline < -screen->savedlines) + screen->topline = -screen->savedlines; + set_cur_row(screen, screen->cur_row + move_down_by); + screen->cursorp.row += move_down_by; + ScrollSelection(screen, move_down_by, True); + +#if !OPT_SAVE_LINES + if (whichBuf) + SwitchBufPtrs(screen, whichBuf); /* put the pointers back */ +#endif + } + } + + /* adjust scrolling region */ + resetMargins(xw); + UIntClr(*flags, ORIGIN); + + if (screen->cur_row > screen->max_row) + set_cur_row(screen, screen->max_row); + if (screen->cur_col > screen->max_col) + set_cur_col(screen, screen->max_col); + + screen->fullVwin.height = height - border; + screen->fullVwin.width = width - border - screen->fullVwin.sb_info.width; + + scroll_displayed_graphics(xw, -move_down_by); + } else if (FullHeight(screen) == height && FullWidth(screen) == width) + return (0); /* nothing has changed at all */ + + screen->fullVwin.fullheight = (Dimension) height; + screen->fullVwin.fullwidth = (Dimension) width; + + ResizeScrollBar(xw); + ResizeSelection(screen, rows, cols); + +#ifndef NO_ACTIVE_ICON + if (screen->iconVwin.window) { + XWindowChanges changes; + screen->iconVwin.width = + MaxCols(screen) * screen->iconVwin.f_width; + + screen->iconVwin.height = + MaxRows(screen) * screen->iconVwin.f_height; + + changes.width = screen->iconVwin.fullwidth = + (Dimension) ((unsigned) screen->iconVwin.width + + 2 * xw->misc.icon_border_width); + + changes.height = screen->iconVwin.fullheight = + (Dimension) ((unsigned) screen->iconVwin.height + + 2 * xw->misc.icon_border_width); + + changes.border_width = (int) xw->misc.icon_border_width; + + TRACE(("resizing icon window %dx%d\n", changes.height, changes.width)); + XConfigureWindow(XtDisplay(xw), screen->iconVwin.window, + CWWidth | CWHeight | CWBorderWidth, &changes); + } +#endif /* NO_ACTIVE_ICON */ + +#ifdef TTYSIZE_STRUCT + update_winsize(screen->respond, rows, cols, height, width); + +#if defined(SIGWINCH) && defined(TIOCGPGRP) + if (screen->pid > 1) { + int pgrp; + + TRACE(("getting process-group\n")); + if (ioctl(screen->respond, TIOCGPGRP, &pgrp) != -1) { + TRACE(("sending SIGWINCH to process group %d\n", pgrp)); + kill_process_group(pgrp, SIGWINCH); + } + } +#endif /* SIGWINCH */ + +#else + TRACE(("ScreenResize cannot do anything to pty\n")); +#endif /* TTYSIZE_STRUCT */ + return (0); +} + +/* + * Return true if any character cell starting at [row,col], for len-cells is + * nonnull. + */ +Bool +non_blank_line(TScreen *screen, + int row, + int col, + int len) +{ + int i; + Bool found = False; + LineData *ld = getLineData(screen, row); + + if (ld != 0) { + for (i = col; i < len; i++) { + if (ld->charData[i]) { + found = True; + break; + } + } + } + return found; +} + +/* + * Limit/map rectangle parameters. + */ +#define minRectRow(screen) (getMinRow(screen) + 1) +#define minRectCol(screen) (getMinCol(screen) + 1) +#define maxRectRow(screen) (getMaxRow(screen) + 1) +#define maxRectCol(screen) (getMaxCol(screen) + 1) + +static int +limitedParseRow(XtermWidget xw, int row, int err) +{ + TScreen *screen = TScreenOf(xw); + int min_row = minRectRow(screen); + int max_row = maxRectRow(screen) + err; + + if (xw->flags & ORIGIN) + row += screen->top_marg; + + if (row < min_row) + row = min_row; + else if (row > max_row) + row = max_row; + + return row; +} + +static int +limitedParseCol(XtermWidget xw, int col, int err) +{ + TScreen *screen = TScreenOf(xw); + int min_col = minRectCol(screen); + int max_col = maxRectCol(screen) + err; + + if (xw->flags & ORIGIN) + col += screen->lft_marg; + + if (col < min_col) + col = min_col; + else if (col > max_col) + col = max_col; + + return col; +} + +#define LimitedParse(num, func, dft, err) \ + func(xw, (nparams > num && params[num] > 0) ? params[num] : dft, err) + +/* + * Copy the rectangle boundaries into a struct, providing default values as + * needed. + */ +void +xtermParseRect(XtermWidget xw, int nparams, int *params, XTermRect *target) +{ + TScreen *screen = TScreenOf(xw); + + memset(target, 0, sizeof(*target)); + target->top = LimitedParse(0, limitedParseRow, minRectRow(screen), 1); + target->left = LimitedParse(1, limitedParseCol, minRectCol(screen), 1); + target->bottom = LimitedParse(2, limitedParseRow, maxRectRow(screen), 0); + target->right = LimitedParse(3, limitedParseCol, maxRectCol(screen), 0); + TRACE(("parsed %d params for rectangle %d,%d %d,%d default %d,%d %d,%d\n", + nparams, + target->top, + target->left, + target->bottom, + target->right, + minRectRow(screen), + minRectCol(screen), + maxRectRow(screen), + maxRectCol(screen))); +} + +static Bool +validRect(XtermWidget xw, XTermRect *target) +{ + TScreen *screen = TScreenOf(xw); + Bool result = (target != 0 + && target->top >= minRectRow(screen) + && target->left >= minRectCol(screen) + && target->top <= target->bottom + && target->left <= target->right + && target->top <= maxRectRow(screen) + && target->right <= maxRectCol(screen)); + + TRACE(("comparing against screensize %dx%d, is%s valid\n", + maxRectRow(screen), + maxRectCol(screen), + result ? "" : " NOT")); + return result; +} + +/* + * Fills a rectangle with the given 8-bit character and video-attributes. + * Colors and double-size attribute are unmodified. + */ +void +ScrnFillRectangle(XtermWidget xw, + XTermRect *target, + int value, + unsigned flags, + Bool keepColors) +{ + IChar actual = (IChar) value; + TScreen *screen = TScreenOf(xw); + + TRACE(("filling rectangle with '%s' flags %#x\n", + visibleIChars(&actual, 1), flags)); + if (validRect(xw, target)) { + LineData *ld; + int top = (target->top - 1); + int left = (target->left - 1); + int right = (target->right - 1); + int bottom = (target->bottom - 1); + int numcols = (right - left) + 1; + int numrows = (bottom - top) + 1; + unsigned attrs = flags; + int row, col; + int b_left = 0; + int b_right = 0; + + (void) numcols; + + attrs &= ATTRIBUTES; + attrs |= CHARDRAWN; + for (row = bottom; row >= top; row--) { + ld = getLineData(screen, row); + + TRACE(("filling %d [%d..%d]\n", row, left, left + numcols)); + + if_OPT_WIDE_CHARS(screen, { + if (left > 0) { + if (ld->charData[left] == HIDDEN_CHAR) { + b_left = 1; + Clear1Cell(ld, left - 1); + Clear1Cell(ld, left); + } + } + if (right + 1 < (int) ld->lineSize) { + if (ld->charData[right + 1] == HIDDEN_CHAR) { + b_right = 1; + Clear1Cell(ld, right); + Clear1Cell(ld, right + 1); + } + } + }); + + /* + * Fill attributes, preserving colors. + */ + for (col = left; col <= right; ++col) { + unsigned temp = ld->attribs[col]; + + if (!keepColors) { + UIntClr(temp, (FG_COLOR | BG_COLOR)); + } + temp = attrs | (temp & (FG_COLOR | BG_COLOR)) | CHARDRAWN; + ld->attribs[col] = (IAttr) temp; + if_OPT_ISO_COLORS(screen, { + if (attrs & (FG_COLOR | BG_COLOR)) { + ld->color[col] = xtermColorPair(xw); + } + }); + } + + for (col = left; col <= right; ++col) + ld->charData[col] = actual; + + if_OPT_WIDE_CHARS(screen, { + size_t off; + for_each_combData(off, ld) { + memset(ld->combData[off] + left, + 0, + (size_t) numcols * sizeof(CharData)); + } + }) + } + ScrnUpdate(xw, + top, + left - b_left, + numrows, + numcols + b_left + b_right, + False); + } +} + +#if OPT_DEC_RECTOPS +/* + * Copies the source rectangle to the target location, including video + * attributes. + * + * This implementation ignores page numbers. + * + * The reference manual does not indicate if it handles overlapping copy + * properly - so we make a local copy of the source rectangle first, then apply + * the target from that. + */ +void +ScrnCopyRectangle(XtermWidget xw, XTermRect *source, int nparam, int *params) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("copying rectangle\n")); + + if (nparam > 4) + nparam = 4; + + if (validRect(xw, source)) { + XTermRect target; + xtermParseRect(xw, + ((nparam > 2) ? 2 : nparam), + params, + &target); + if (validRect(xw, &target)) { + Cardinal high = (Cardinal) (source->bottom - source->top) + 1; + Cardinal wide = (Cardinal) (source->right - source->left) + 1; + Cardinal size = (high * wide); + int row, col; + Cardinal j, k; + LineData *ld; + int b_left = 0; + int b_right = 0; + + CellData *cells = newCellData(xw, size); + + if (cells != 0) { + + TRACE(("OK - make copy %dx%d\n", high, wide)); + target.bottom = target.top + (int) (high - 1); + target.right = target.left + (int) (wide - 1); + + for (row = source->top - 1; row < source->bottom; ++row) { + ld = getLineData(screen, row); + if (ld == 0) + continue; + j = (Cardinal) (row - (source->top - 1)); + TRACE2(("ROW %d\n", row + 1)); + for (col = source->left - 1; col < source->right; ++col) { + k = (Cardinal) (col - (source->left - 1)); + saveCellData(screen, cells, + (j * wide) + k, + ld, source, col); + } + } + for (row = target.top - 1; row < target.bottom; ++row) { + ld = getLineData(screen, row); + if (ld == 0) + continue; + j = (Cardinal) (row - (target.top - 1)); + TRACE2(("ROW %d\n", row + 1)); + for (col = target.left - 1; col < target.right; ++col) { + k = (Cardinal) (col - (target.left - 1)); + if (row >= getMinRow(screen) + && row <= getMaxRow(screen) + && col >= getMinCol(screen) + && col <= getMaxCol(screen) + && (j < high) + && (k < wide)) { + if_OPT_WIDE_CHARS(screen, { + if (ld->charData[col] == HIDDEN_CHAR + && (col + 1) == target.left) { + b_left = 1; + Clear1Cell(ld, col - 1); + } + if ((col + 1) == target.right + && ld->charData[col] == HIDDEN_CHAR) { + b_right = 1; + } + }); + restoreCellData(screen, cells, + (j * wide) + k, + ld, &target, col); + } + ld->attribs[col] |= CHARDRAWN; + } +#if OPT_BLINK_TEXT + if (LineHasBlinking(screen, ld)) { + LineSetBlinked(ld); + } else { + LineClrBlinked(ld); + } +#endif + } + free(cells); + + ScrnUpdate(xw, + (target.top - 1), + (target.left - (1 + b_left)), + (target.bottom - target.top) + 1, + ((target.right - target.left) + (1 + b_left + b_right)), + False); + } + } + } +} + +/* + * Modifies the video-attributes only - so selection (not a video attribute) is + * unaffected. Colors and double-size flags are unaffected as well. + * + * FIXME: our representation for "invisible" does not work with this operation, + * since the attribute byte is fully-allocated for other flags. The logic + * is shown for INVISIBLE because it's harmless, and useful in case the + * CHARDRAWN or PROTECTED flags are reassigned. + */ +void +ScrnMarkRectangle(XtermWidget xw, + XTermRect *target, + Bool reverse, + int nparam, + int *params) +{ + TScreen *screen = TScreenOf(xw); + Bool exact = (screen->cur_decsace == 2); + + TRACE(("%s %s\n", + reverse ? "reversing" : "marking", + (exact + ? "rectangle" + : "region"))); + + if (validRect(xw, target)) { + LineData *ld; + int top = target->top - 1; + int bottom = target->bottom - 1; + int row, col; + int n; + + for (row = top; row <= bottom; ++row) { + int left = ((exact || (row == top)) + ? (target->left - 1) + : getMinCol(screen)); + int right = ((exact || (row == bottom)) + ? (target->right - 1) + : getMaxCol(screen)); + + ld = getLineData(screen, row); + + TRACE(("marking %d [%d..%d]\n", row, left, right)); + for (col = left; col <= right; ++col) { + unsigned flags = ld->attribs[col]; + + for (n = 0; n < nparam; ++n) { +#if OPT_TRACE + if (row == top && col == left) + TRACE(("attr param[%d] %d\n", n + 1, params[n])); +#endif + if (reverse) { + switch (params[n]) { + case 1: + flags ^= BOLD; + break; + case 4: + flags ^= UNDERLINE; + break; + case 5: + flags ^= BLINK; + break; + case 7: + flags ^= INVERSE; + break; + case 8: + flags ^= INVISIBLE; + break; + } + } else { + switch (params[n]) { + case 0: + UIntClr(flags, SGR_MASK); + break; + case 1: + flags |= BOLD; + break; + case 4: + flags |= UNDERLINE; + break; + case 5: + flags |= BLINK; + break; + case 7: + flags |= INVERSE; + break; + case 8: + flags |= INVISIBLE; + break; + case 22: + UIntClr(flags, BOLD); + break; + case 24: + UIntClr(flags, UNDERLINE); + break; + case 25: + UIntClr(flags, BLINK); + break; + case 27: + UIntClr(flags, INVERSE); + break; + case 28: + UIntClr(flags, INVISIBLE); + break; + } + } + } +#if OPT_TRACE + if (row == top && col == left) + TRACE(("first mask-change is %#x\n", + ld->attribs[col] ^ flags)); +#endif + ld->attribs[col] = (IAttr) flags; + } + } + ScrnRefresh(xw, + (target->top - 1), + (exact ? (target->left - 1) : getMinCol(screen)), + (target->bottom - target->top) + 1, + (exact + ? ((target->right - target->left) + 1) + : (getMaxCol(screen) - getMinCol(screen) + 1)), + False); + } +} + +/* + * Resets characters to space, except where prohibited by DECSCA. Video + * attributes (including color) are untouched. + */ +void +ScrnWipeRectangle(XtermWidget xw, + XTermRect *target) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("wiping rectangle\n")); + +#define IsProtected(ld, col) \ + ((screen->protected_mode == DEC_PROTECT) \ + && (ld->attribs[col] & PROTECTED)) + + if (validRect(xw, target)) { + LineData *ld; + int top = target->top - 1; + int left = target->left - 1; + int right = target->right - 1; + int bottom = target->bottom - 1; + int numcols = (right - left) + 1; + int numrows = (bottom - top) + 1; + int row, col; + int b_left = 0; + int b_right = 0; + + for (row = top; row <= bottom; ++row) { + TRACE(("wiping %d [%d..%d]\n", row, left, right)); + + ld = getLineData(screen, row); + + if_OPT_WIDE_CHARS(screen, { + if (left > 0 && !IsProtected(ld, left)) { + if (ld->charData[left] == HIDDEN_CHAR) { + b_left = 1; + Clear1Cell(ld, left - 1); + Clear1Cell(ld, left); + } + } + if (right + 1 < (int) ld->lineSize && !IsProtected(ld, right)) { + if (ld->charData[right + 1] == HIDDEN_CHAR) { + b_right = 1; + Clear1Cell(ld, right); + Clear1Cell(ld, right + 1); + } + } + }); + + for (col = left; col <= right; ++col) { + if (!IsProtected(ld, col)) { + ld->attribs[col] |= CHARDRAWN; + Clear1Cell(ld, col); + } + } + } + ScrnUpdate(xw, + top, + left - b_left, + numrows, + numcols + b_left + b_right, + False); + } +} + +/* + * Compute a checksum, ignoring the page number (since we have only one page). + */ +void +xtermCheckRect(XtermWidget xw, + int nparam, + int *params, + int *result) +{ + TScreen *screen = TScreenOf(xw); + XTermRect target; + LineData *ld; + int total = 0; + int trimmed = 0; + int mode = screen->checksum_ext; + + TRACE(("xtermCheckRect: %s%s%s%s%s%s%s\n", + (mode == csDEC) ? "DEC" : "checksumExtension", + (mode & csPOSITIVE) ? " !negative" : "", + (mode & csATTRIBS) ? " !attribs" : "", + (mode & csNOTRIM) ? " !trimmed" : "", + (mode & csDRAWN) ? " !drawn" : "", + (mode & csBYTE) ? " !byte" : "", + (mode & cs8TH) ? " !7bit" : "")); + + if (nparam > 2) { + nparam -= 2; + params += 2; + } + xtermParseRect(xw, nparam, params, &target); + if (validRect(xw, &target)) { + int top = target.top - 1; + int bottom = target.bottom - 1; + int row, col; + Boolean first = True; + int embedded = 0; + DECNRCM_codes my_GR = screen->gsets[(int) screen->curgr]; + + for (row = top; row <= bottom; ++row) { + int left = (target.left - 1); + int right = (target.right - 1); + + ld = getLineData(screen, row); + if (ld == 0) + continue; + for (col = left; col <= right && col < (int) ld->lineSize; ++col) { + int ch = ((ld->attribs[col] & CHARDRAWN) + ? (int) ld->charData[col] + : ' '); + if (!(mode & csBYTE)) { + unsigned c2 = (unsigned) ch; + if (c2 > 0x7f && my_GR != nrc_ASCII) { + c2 = xtermCharSetIn(xw, c2, my_GR); + if (!(mode & cs8TH) && (c2 < 0x80)) + c2 |= 0x80; + } + ch = (c2 & 0xff); + } + if (!(mode & csATTRIBS)) { + if (ld->attribs[col] & UNDERLINE) + ch += 0x10; + if (ld->attribs[col] & INVERSE) + ch += 0x20; + if (ld->attribs[col] & BLINK) + ch += 0x40; + if (ld->attribs[col] & BOLD) + ch += 0x80; + } + if (first || (ch != ' ') || (ld->attribs[col] & DRAWX_MASK)) { + trimmed += ch + embedded; + embedded = 0; + } else if (ch == ' ') { + if ((mode & csNOTRIM)) + embedded += ch; + } + if ((ld->attribs[col] & CHARDRAWN)) { + total += ch; + if_OPT_WIDE_CHARS(screen, { + /* FIXME - not counted if trimming blanks */ + if (!(mode & csBYTE)) { + size_t off; + for_each_combData(off, ld) { + total += (int) ld->combData[off][col]; + } + } + }) + } else if (!(mode & csDRAWN)) { + total += ch; + } + first = ((mode & csNOTRIM) != 0) ? True : False; + } + if (!(mode & csNOTRIM)) { + embedded = 0; + first = False; + } + } + } + if (!(mode & csNOTRIM)) + total = trimmed; + if (!(mode & csPOSITIVE)) + total = -total; + *result = total; +} +#endif /* OPT_DEC_RECTOPS */ + +#if OPT_MAXIMIZE + +static _Xconst char * +ewmhProperty(int mode) +{ + _Xconst char *result; + switch (mode) { + default: + result = 0; + break; + case 1: + result = "_NET_WM_STATE_FULLSCREEN"; + break; + case 2: + result = "_NET_WM_STATE_MAXIMIZED_VERT"; + break; + case 3: + result = "_NET_WM_STATE_MAXIMIZED_HORZ"; + break; + } + return result; +} + +static void +set_resize_increments(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int min_width = (2 * screen->border) + screen->fullVwin.sb_info.width; + int min_height = (2 * screen->border); + XSizeHints sizehints; + + TRACE(("set_resize_increments\n")); + memset(&sizehints, 0, sizeof(XSizeHints)); + sizehints.width_inc = FontWidth(screen); + sizehints.height_inc = FontHeight(screen); + sizehints.flags = PResizeInc; + TRACE_HINTS(&sizehints); + XSetWMNormalHints(screen->display, VShellWindow(xw), &sizehints); + + TRACE(("setting values for widget %p:\n", (void *) SHELL_OF(xw))); + TRACE((" base width %d\n", min_width)); + TRACE((" base height %d\n", min_width)); + TRACE((" min width %d\n", min_width + FontWidth(screen))); + TRACE((" min height %d\n", min_width + FontHeight(screen))); + TRACE((" width inc %d\n", FontWidth(screen))); + TRACE((" height inc %d\n", FontHeight(screen))); + + XtVaSetValues(SHELL_OF(xw), + XtNbaseWidth, min_width, + XtNbaseHeight, min_height, + XtNminWidth, min_width + FontWidth(screen), + XtNminHeight, min_height + FontHeight(screen), + XtNwidthInc, FontWidth(screen), + XtNheightInc, FontHeight(screen), + (XtPointer) 0); + + XFlush(XtDisplay(xw)); +} + +static void +unset_resize_increments(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + XSizeHints sizehints; + + TRACE(("unset_resize_increments\n")); + memset(&sizehints, 0, sizeof(XSizeHints)); + sizehints.width_inc = 1; + sizehints.height_inc = 1; + sizehints.flags = PResizeInc; + TRACE_HINTS(&sizehints); + XSetWMNormalHints(screen->display, VShellWindow(xw), &sizehints); + + XtVaSetValues(SHELL_OF(xw), + XtNwidthInc, 1, + XtNheightInc, 1, + (XtPointer) 0); + + XFlush(XtDisplay(xw)); +} + +static void +set_ewmh_hint(Display *dpy, Window window, int operation, _Xconst char *prop) +{ + XEvent e; + Atom atom_fullscreen = XInternAtom(dpy, prop, False); + Atom atom_state = XInternAtom(dpy, "_NET_WM_STATE", False); + +#if OPT_TRACE + const char *what = "?"; + switch (operation) { + case _NET_WM_STATE_ADD: + what = "adding"; + break; + case _NET_WM_STATE_REMOVE: + what = "removing"; + break; + } + TRACE(("set_ewmh_hint %s %s\n", what, prop)); +#endif + + memset(&e, 0, sizeof(e)); + e.xclient.type = ClientMessage; + e.xclient.message_type = atom_state; + e.xclient.display = dpy; + e.xclient.window = window; + e.xclient.format = 32; + e.xclient.data.l[0] = operation; + e.xclient.data.l[1] = (long) atom_fullscreen; + + XSendEvent(dpy, DefaultRootWindow(dpy), False, + SubstructureRedirectMask, &e); +} + +/* + * Check if the given property is supported on the root window. + * + * The XGetWindowProperty function returns a list of Atom's which corresponds + * to the output of xprop. The actual list (ignore the manpage, which refers + * to an array of 32-bit values) is constructed by _XRead32, which uses long + * as a datatype. + * + * Alternatively, we could check _NET_WM_ALLOWED_ACTIONS on the application's + * window. + */ +static Boolean +probe_netwm(Display *dpy, _Xconst char *propname) +{ + Atom atom_fullscreen = XInternAtom(dpy, propname, False); + Atom atom_supported = XInternAtom(dpy, "_NET_SUPPORTED", False); + Atom actual_type; + int actual_format; + long long_offset = 0; + long long_length = 128; /* number of items to ask for at a time */ + unsigned int i; + unsigned long nitems, bytes_after; + unsigned char *args; + long *ldata; + Boolean has_capability = False; + Boolean rc; + + while (!has_capability) { + rc = xtermGetWinProp(dpy, + DefaultRootWindow(dpy), + atom_supported, + long_offset, + long_length, + AnyPropertyType, /* req_type */ + &actual_type, /* actual_type_return */ + &actual_format, /* actual_format_return */ + &nitems, /* nitems_return */ + &bytes_after, /* bytes_after_return */ + &args /* prop_return */ + ); + if (!rc + || actual_type != XA_ATOM) { + break; + } + ldata = (long *) (void *) args; + for (i = 0; i < nitems; i++) { +#if OPT_TRACE > 1 + char *name; + if ((name = XGetAtomName(dpy, ldata[i])) != 0) { + TRACE(("atom[%d] = %s\n", i, name)); + XFree(name); + } else { + TRACE(("atom[%d] = ?\n", i)); + } +#endif + if ((Atom) ldata[i] == atom_fullscreen) { + has_capability = True; + break; + } + } + XFree(ldata); + + if (!has_capability) { + if (bytes_after != 0) { + long remaining = (long) (bytes_after / sizeof(long)); + if (long_length > remaining) + long_length = remaining; + long_offset += (long) nitems; + } else { + break; + } + } + } + + TRACE(("probe_netwm(%s) ->%d\n", propname, has_capability)); + return has_capability; +} + +/* + * Alter fullscreen mode for the xterm widget, if the window manager supports + * that feature. + */ +void +FullScreen(XtermWidget xw, int new_ewmh_mode) +{ + TScreen *screen = TScreenOf(xw); + Display *dpy = screen->display; + int old_ewmh_mode; + _Xconst char *oldprop; + _Xconst char *newprop; + + int which = 0; + Window window; + +#if OPT_TEK4014 + if (TEK4014_ACTIVE(xw)) { + which = 1; + window = TShellWindow; + } else +#endif + window = VShellWindow(xw); + + old_ewmh_mode = xw->work.ewmh[which].mode; + oldprop = ewmhProperty(old_ewmh_mode); + newprop = ewmhProperty(new_ewmh_mode); + + TRACE(("FullScreen %d:%s -> %d:%s\n", + old_ewmh_mode, NonNull(oldprop), + new_ewmh_mode, NonNull(newprop))); + + if (new_ewmh_mode == old_ewmh_mode) { + TRACE(("...unchanged\n")); + return; + } else if (new_ewmh_mode < 0 || new_ewmh_mode > MAX_EWMH_MODE) { + TRACE(("BUG: FullScreen %d\n", new_ewmh_mode)); + return; + } else if (new_ewmh_mode == 0) { + xw->work.ewmh[which].checked[new_ewmh_mode] = True; + xw->work.ewmh[which].allowed[new_ewmh_mode] = True; + } else if (resource.fullscreen == esNever) { + xw->work.ewmh[which].checked[new_ewmh_mode] = True; + xw->work.ewmh[which].allowed[new_ewmh_mode] = False; + } else if (!xw->work.ewmh[which].checked[new_ewmh_mode]) { + xw->work.ewmh[which].checked[new_ewmh_mode] = True; + xw->work.ewmh[which].allowed[new_ewmh_mode] = probe_netwm(dpy, newprop); + } + + if (xw->work.ewmh[which].allowed[new_ewmh_mode]) { + TRACE(("...new EWMH mode is allowed\n")); + if (new_ewmh_mode && !xw->work.ewmh[which].mode) { + unset_resize_increments(xw); + set_ewmh_hint(dpy, window, _NET_WM_STATE_ADD, newprop); + } else if (xw->work.ewmh[which].mode && !new_ewmh_mode) { + set_resize_increments(xw); + set_ewmh_hint(dpy, window, _NET_WM_STATE_REMOVE, oldprop); + } else { + set_ewmh_hint(dpy, window, _NET_WM_STATE_REMOVE, oldprop); + set_ewmh_hint(dpy, window, _NET_WM_STATE_ADD, newprop); + } + xw->work.ewmh[which].mode = new_ewmh_mode; + update_fullscreen(); + } else { + Bell(xw, XkbBI_MinorError, 100); + } +} +#endif /* OPT_MAXIMIZE */ diff --git a/ports/xterm/xterm-359/screen.o b/ports/xterm/xterm-359/screen.o new file mode 100644 index 0000000000000000000000000000000000000000..923954c40ee29e64d4051dcee28408b4fbbadc43 GIT binary patch literal 185376 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˿hH6gdvz1HK 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 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/ptydata.c b/ports/xterm/xterm-359/ptydata.c new file mode 100644 index 0000000..3b820fe --- /dev/null +++ b/ports/xterm/xterm-359/ptydata.c @@ -0,0 +1,1004 @@ +/* $XTermId: ptydata.c,v 1.148 2020/08/12 22:16:36 tom Exp $ */ + +/* + * Copyright 1999-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +#include + +#if OPT_WIDE_CHARS +#include +#include +#endif + +#ifdef TEST_DRIVER +#undef TRACE +#define TRACE(p) if (1) printf p +#undef TRACE2 +#define TRACE2(p) if (0) printf p +#define visibleChars(buf, len) "buffer" +#endif + +/* + * Check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX + * systems are broken and return EWOULDBLOCK when they should return EAGAIN. + * Note that this macro may evaluate its argument more than once. + */ +#if defined(EAGAIN) && defined(EWOULDBLOCK) +#define E_TEST(err) ((err) == EAGAIN || (err) == EWOULDBLOCK) +#else +#ifdef EAGAIN +#define E_TEST(err) ((err) == EAGAIN) +#else +#define E_TEST(err) ((err) == EWOULDBLOCK) +#endif +#endif + +#if OPT_WIDE_CHARS +/* + * Convert the 8-bit codes in data->buffer[] into Unicode in data->utf_data. + * The number of bytes converted will be nonzero iff there is data. + */ +Bool +decodeUtf8(TScreen *screen, PtyData *data) +{ + int i; + int length = (int) (data->last - data->next); + int utf_count = 0; + unsigned utf_char = 0; + + data->utf_size = 0; + for (i = 0; i < length; i++) { + unsigned c = data->next[i]; + + /* Combine UTF-8 into Unicode */ + if (c < 0x80) { + /* We received an ASCII character */ + if (utf_count > 0) { + data->utf_data = UCS_REPL; /* prev. sequence incomplete */ + data->utf_size = i; + } else { + data->utf_data = (IChar) c; + data->utf_size = 1; + } + break; + } else if (screen->vt100_graphics + && (c < 0x100) + && (utf_count == 0) + && screen->gsets[(int) screen->curgr] != nrc_ASCII) { + data->utf_data = (IChar) c; + data->utf_size = 1; + break; + } else if (c < 0xc0) { + /* We received a continuation byte */ + if (utf_count < 1) { + /* + * We received a continuation byte before receiving a sequence + * state. Or an attempt to use a C1 control string. Either + * way, it is mapped to the replacement character, unless + * allowed by optional feature. + */ + data->utf_data = (IChar) (screen->c1_printable ? c : UCS_REPL); + data->utf_size = (i + 1); + break; + } else if (screen->utf8_weblike + && (utf_count == 3 + && utf_char == 0x04 + && c >= 0x90)) { + /* The encoding would form a code point beyond U+10FFFF. */ + data->utf_size = i; + data->utf_data = UCS_REPL; + break; + } else if (screen->utf8_weblike + && (utf_count == 2 + && utf_char == 0x0d + && c >= 0xa0)) { + /* The encoding would form a surrogate code point. */ + data->utf_size = i; + data->utf_data = UCS_REPL; + break; + } else { + /* Check for overlong UTF-8 sequences for which a shorter + * encoding would exist and replace them with UCS_REPL. + * An overlong UTF-8 sequence can have any of the following + * forms: + * 1100000x 10xxxxxx + * 11100000 100xxxxx 10xxxxxx + * 11110000 1000xxxx 10xxxxxx 10xxxxxx + * 11111000 10000xxx 10xxxxxx 10xxxxxx 10xxxxxx + * 11111100 100000xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + */ + if (!utf_char && !((c & 0x7f) >> (7 - utf_count))) { + if (screen->utf8_weblike) { + /* overlong sequence continued */ + data->utf_data = UCS_REPL; + data->utf_size = i; + break; + } else { + utf_char = UCS_REPL; + } + } + utf_char <<= 6; + utf_char |= (c & 0x3f); + if ((utf_char >= 0xd800 && + utf_char <= 0xdfff) || + (utf_char == 0xfffe) || + (utf_char == HIDDEN_CHAR)) { + utf_char = UCS_REPL; + } + utf_count--; + if (utf_count == 0) { +#if !OPT_WIDER_ICHAR + /* characters outside UCS-2 become UCS_REPL */ + if (utf_char > NARROW_ICHAR) { + TRACE(("using replacement for %#x\n", utf_char)); + utf_char = UCS_REPL; + } +#endif + data->utf_data = (IChar) utf_char; + data->utf_size = (i + 1); + break; + } + } + } else { + /* We received a sequence start byte */ + if (utf_count > 0) { + /* previous sequence is incomplete */ + data->utf_data = UCS_REPL; + data->utf_size = i; + break; + } + if (screen->utf8_weblike) { + if (c < 0xe0) { + if (!(c & 0x1e)) { + /* overlong sequence start */ + data->utf_data = UCS_REPL; + data->utf_size = (i + 1); + break; + } + utf_count = 1; + utf_char = (c & 0x1f); + } else if (c < 0xf0) { + utf_count = 2; + utf_char = (c & 0x0f); + } else if (c < 0xf5) { + utf_count = 3; + utf_char = (c & 0x07); + } else { + data->utf_data = UCS_REPL; + data->utf_size = (i + 1); + break; + } + } else { + if (c < 0xe0) { + utf_count = 1; + utf_char = (c & 0x1f); + if (!(c & 0x1e)) { + /* overlong sequence */ + utf_char = UCS_REPL; + } + } else if (c < 0xf0) { + utf_count = 2; + utf_char = (c & 0x0f); + } else if (c < 0xf8) { + utf_count = 3; + utf_char = (c & 0x07); + } else if (c < 0xfc) { + utf_count = 4; + utf_char = (c & 0x03); + } else if (c < 0xfe) { + utf_count = 5; + utf_char = (c & 0x01); + } else { + data->utf_data = UCS_REPL; + data->utf_size = (i + 1); + break; + } + } + } + } +#if OPT_TRACE > 1 + TRACE(("UTF-8 char %04X [%d..%d]\n", + data->utf_data, + (int) (data->next - data->buffer), + (int) (data->next - data->buffer + data->utf_size - 1))); +#endif + + return (data->utf_size != 0); +} +#endif + +int +readPtyData(XtermWidget xw, PtySelect * select_mask, PtyData *data) +{ + TScreen *screen = TScreenOf(xw); + int size = 0; + +#ifdef VMS + if (*select_mask & pty_mask) { + trimPtyData(xw, data); + if (read_queue.flink != 0) { + size = tt_read(data->next); + if (size == 0) { + Panic("input: read returned zero\n", 0); + } + } else { + sys$hiber(); + } + } +#else /* !VMS */ + if (FD_ISSET(screen->respond, select_mask)) { + int save_err; + trimPtyData(xw, data); + + size = (int) read(screen->respond, (char *) data->last, (size_t) FRG_SIZE); + save_err = errno; +#if (defined(i386) && defined(SVR4) && defined(sun)) || defined(__CYGWIN__) + /* + * Yes, I know this is a majorly f*ugly hack, however it seems to + * be necessary for Solaris x86. DWH 11/15/94 + * Dunno why though.. + * (and now CYGWIN, alanh@xfree86.org 08/15/01 + */ + if (size <= 0) { + if (save_err == EIO || save_err == 0) + NormalExit(); + else if (!E_TEST(save_err)) + Panic("input: read returned unexpected error (%d)\n", save_err); + size = 0; + } +#else /* !f*ugly */ + if (size < 0) { + if (save_err == EIO) + NormalExit(); + else if (!E_TEST(save_err)) + Panic("input: read returned unexpected error (%d)\n", save_err); + size = 0; + } else if (size == 0) { +#if defined(__FreeBSD__) + NormalExit(); +#else + Panic("input: read returned zero\n", 0); +#endif + } +#endif /* f*ugly */ + } +#endif /* VMS */ + + if (size) { +#if OPT_TRACE + int i; + + TRACE(("read %d bytes from pty\n", size)); + for (i = 0; i < size; i++) { + if (!(i % 16)) + TRACE(("%s", i ? "\n " : "READ")); + TRACE((" %02X", data->last[i])); + } + TRACE(("\n")); +#endif + data->last += size; +#ifdef ALLOWLOGGING + TScreenOf(term)->logstart = VTbuffer->next; +#endif + } + + return (size); +} + +/* + * Return the next value from the input buffer. Note that morePtyData() is + * always called before this function, so we can do the UTF-8 input conversion + * in that function and simply return the result here. + */ +#if OPT_WIDE_CHARS +IChar +nextPtyData(TScreen *screen, PtyData *data) +{ + IChar result; + if (screen->utf8_inparse) { + skipPtyData(data, result); + } else { + result = *((data)->next++); + if (!screen->output_eight_bits) { + result = (IChar) (result & 0x7f); + } + } + TRACE2(("nextPtyData returns %#x\n", result)); + return result; +} +#endif + +#if OPT_WIDE_CHARS +/* + * Called when UTF-8 mode has been turned on/off. + */ +void +switchPtyData(TScreen *screen, int flag) +{ + if (screen->utf8_mode != flag) { + screen->utf8_mode = flag; + screen->utf8_inparse = (Boolean) (flag != 0); + mk_wcwidth_init(screen->utf8_mode); + + TRACE(("turning UTF-8 mode %s\n", BtoS(flag))); + update_font_utf8_mode(); + } +} +#endif + +/* + * Allocate a buffer. + */ +void +initPtyData(PtyData **result) +{ + PtyData *data; + + TRACE2(("initPtyData given minBufSize %d, maxBufSize %d\n", + FRG_SIZE, BUF_SIZE)); + + if (FRG_SIZE < 64) + FRG_SIZE = 64; + if (BUF_SIZE < FRG_SIZE) + BUF_SIZE = FRG_SIZE; + if (BUF_SIZE % FRG_SIZE) + BUF_SIZE = BUF_SIZE + FRG_SIZE - (BUF_SIZE % FRG_SIZE); + + TRACE2(("initPtyData using minBufSize %d, maxBufSize %d\n", + FRG_SIZE, BUF_SIZE)); + + data = TypeXtMallocX(PtyData, (BUF_SIZE + FRG_SIZE)); + + memset(data, 0, sizeof(*data)); + data->next = data->buffer; + data->last = data->buffer; + *result = data; +} + +/* + * Initialize a buffer for the caller, using its data in 'next'. + */ +#if OPT_WIDE_CHARS +PtyData * +fakePtyData(PtyData *result, Char *next, Char *last) +{ + PtyData *data = result; + + memset(data, 0, sizeof(*data)); + data->next = next; + data->last = last; + + return data; +} +#endif + +/* + * Remove used data by shifting the buffer down, to make room for more data, + * e.g., a continuation-read. + */ +void +trimPtyData(XtermWidget xw, PtyData *data) +{ + (void) xw; + FlushLog(xw); + + if (data->next != data->buffer) { + int i; + int n = (int) (data->last - data->next); + + TRACE(("shifting buffer down by %d\n", n)); + for (i = 0; i < n; ++i) { + data->buffer[i] = data->next[i]; + } + data->next = data->buffer; + data->last = data->next + n; + } + +} + +/* + * Insert new data into the input buffer so the next calls to morePtyData() + * and nextPtyData() will return that. + */ +void +fillPtyData(XtermWidget xw, PtyData *data, const char *value, int length) +{ + int size; + int n; + + /* remove the used portion of the buffer */ + trimPtyData(xw, data); + + VTbuffer->last += length; + size = (int) (VTbuffer->last - VTbuffer->next); + + /* shift the unused portion up to make room */ + for (n = size; n >= length; --n) + VTbuffer->next[n] = VTbuffer->next[n - length]; + + /* insert the new bytes to interpret */ + for (n = 0; n < length; n++) + VTbuffer->next[n] = CharOf(value[n]); +} + +#if OPT_WIDE_CHARS +/* + * Convert an ISO-8859-1 code 'c' to UTF-8, storing the result in the target + * 'lp', and returning a pointer past the converted character. + */ +Char * +convertToUTF8(Char *lp, unsigned c) +{ +#define CH(n) (Char)((c) >> ((n) * 8)) + if (c < 0x80) { + /* 0******* */ + *lp++ = (Char) CH(0); + } else if (c < 0x800) { + /* 110***** 10****** */ + *lp++ = (Char) (0xc0 | (CH(0) >> 6) | ((CH(1) & 0x07) << 2)); + *lp++ = (Char) (0x80 | (CH(0) & 0x3f)); + } else if (c < 0x00010000) { + /* 1110**** 10****** 10****** */ + *lp++ = (Char) (0xe0 | ((int) (CH(1) & 0xf0) >> 4)); + *lp++ = (Char) (0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2)); + *lp++ = (Char) (0x80 | (CH(0) & 0x3f)); + } else if (c < 0x00200000) { + *lp++ = (Char) (0xf0 | ((int) (CH(2) & 0x1f) >> 2)); + *lp++ = (Char) (0x80 | + ((int) (CH(1) & 0xf0) >> 4) | + ((int) (CH(2) & 0x03) << 4)); + *lp++ = (Char) (0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2)); + *lp++ = (Char) (0x80 | (CH(0) & 0x3f)); + } else if (c < 0x04000000) { + *lp++ = (Char) (0xf8 | (CH(3) & 0x03)); + *lp++ = (Char) (0x80 | (CH(2) >> 2)); + *lp++ = (Char) (0x80 | + ((int) (CH(1) & 0xf0) >> 4) | + ((int) (CH(2) & 0x03) << 4)); + *lp++ = (Char) (0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2)); + *lp++ = (Char) (0x80 | (CH(0) & 0x3f)); + } else { + *lp++ = (Char) (0xfc | ((int) (CH(3) & 0x40) >> 6)); + *lp++ = (Char) (0x80 | (CH(3) & 0x3f)); + *lp++ = (Char) (0x80 | (CH(2) >> 2)); + *lp++ = (Char) (0x80 | (CH(1) >> 4) | ((CH(2) & 0x03) << 4)); + *lp++ = (Char) (0x80 | (CH(0) >> 6) | ((CH(1) & 0x0f) << 2)); + *lp++ = (Char) (0x80 | (CH(0) & 0x3f)); + } + return lp; +#undef CH +} + +/* + * Convert a UTF-8 multibyte character to an Unicode value, returning a pointer + * past the converted UTF-8 input. The first 256 values align with ISO-8859-1, + * making it possible to use this to convert to Latin-1. + * + * If the conversion fails, return null. + */ +Char * +convertFromUTF8(Char *lp, unsigned *cp) +{ + int want; + + /* + * Find the number of bytes we will need from the source. + */ + if ((*lp & 0x80) == 0) { + want = 1; + } else if ((*lp & 0xe0) == 0xc0) { + want = 2; + } else if ((*lp & 0xf0) == 0xe0) { + want = 3; + } else if ((*lp & 0xf8) == 0xf0) { + want = 4; + } else if ((*lp & 0xfc) == 0xf8) { + want = 5; + } else if ((*lp & 0xfe) == 0xfc) { + want = 6; + } else { + want = 0; + } + + if (want) { + int have = 1; + + while (lp[have] != '\0') { + if ((lp[have] & 0xc0) != 0x80) + break; + ++have; + } + if (want == have) { + unsigned mask = 0; + int j; + int shift = 0; + + *cp = 0; + switch (want) { + case 1: + mask = (*lp); + break; + case 2: + mask = (*lp & 0x1f); + break; + case 3: + mask = (*lp & 0x0f); + break; + case 4: + mask = (*lp & 0x07); + break; + case 5: + mask = (*lp & 0x03); + break; + case 6: + mask = (*lp & 0x01); + break; + default: + mask = 0; + break; + } + + for (j = 1; j < want; j++) { + *cp |= (unsigned) ((lp[want - j] & 0x3f) << shift); + shift += 6; + } + *cp |= mask << shift; + lp += want; + } else { + *cp = BAD_ASCII; + lp = NULL; + } + } else { + *cp = BAD_ASCII; + lp = NULL; + } + return lp; +} + +/* + * Returns true if the entire string is valid UTF-8. + */ +Boolean +isValidUTF8(Char *lp) +{ + Boolean result = True; + while (*lp) { + unsigned ch; + Char *next = convertFromUTF8(lp, &ch); + if (next == NULL || ch == 0) { + result = False; + break; + } + lp = next; + } + return result; +} + +/* + * Write data back to the PTY + */ +void +writePtyData(int f, IChar *d, unsigned len) +{ + unsigned n = (len << 1); + + if (VTbuffer->write_len <= len) { + VTbuffer->write_len = n; + VTbuffer->write_buf = (Char *) XtRealloc((char *) + VTbuffer->write_buf, VTbuffer->write_len); + } + + for (n = 0; n < len; n++) + VTbuffer->write_buf[n] = (Char) d[n]; + + TRACE(("writePtyData %u:%s\n", n, + visibleChars(VTbuffer->write_buf, n))); + v_write(f, VTbuffer->write_buf, n); +} +#endif /* OPT_WIDE_CHARS */ + +#ifdef NO_LEAKS +void +noleaks_ptydata(void) +{ + if (VTbuffer != 0) { +#if OPT_WIDE_CHARS + if (VTbuffer->write_buf != 0) + free(VTbuffer->write_buf); +#endif + free(VTbuffer); + VTbuffer = 0; + } +} +#endif + +#ifdef TEST_DRIVER + +#include "data.c" + +#ifdef ALLOWLOGGING +void +FlushLog(XtermWidget xw) +{ + (void) xw; +} +#endif + +void +v_write(int f, const Char *data, unsigned len) +{ + (void) f; + (void) data; + (void) len; +} + +void +mk_wcwidth_init(int mode) +{ + (void) mode; +} + +void +update_font_utf8_mode(void) +{ +} + +void +NormalExit(void) +{ + fprintf(stderr, "NormalExit!\n"); + exit(EXIT_SUCCESS); +} + +void +Panic(const char *s, int a) +{ + (void) s; + (void) a; + fprintf(stderr, "Panic!\n"); + exit(EXIT_FAILURE); +} + +static int message_level = 0; +static int opt_all = 0; +static int opt_illegal = 0; +static int opt_convert = 0; +static int opt_reverse = 0; +static long total_test = 0; +static long total_errs = 0; + +static void +usage(void) +{ + static const char *msg[] = + { + "Usage: test_ptydata [options] [c1[-c1b] [c2-[c2b] [...]]]", + "", + "Options:", + " -a exercise all legal encode/decode to/from UTF-8", + " -c call convertFromUTF8 rather than decodeUTF8", + " -i ignore illegal UTF-8 when testing -r option", + " -q quieter", + " -r reverse/decode from UTF-8 byte-string to/from Unicode", + " -v more verbose" + }; + size_t n; + for (n = 0; n < sizeof(msg) / sizeof(msg[0]); ++n) { + fprintf(stderr, "%s\n", msg[n]); + } + exit(EXIT_FAILURE); +} + +/* + * http://www.unicode.org/versions/corrigendum1.html, table 3.1B + */ +#define OkRange(n,lo,hi) \ + if (value[n] < lo || value[n] > hi) { \ + result = False; \ + break; \ + } +static Bool +is_legal_utf8(const Char *value) +{ + Bool result = True; + Char ch; + while ((ch = *value) != '\0') { + if (ch <= 0x7f) { + ++value; + } else if (ch >= 0xc2 && ch <= 0xdf) { + OkRange(1, 0x80, 0xbf); + value += 2; + } else if (ch == 0xe0) { + OkRange(1, 0xa0, 0xbf); + OkRange(2, 0x80, 0xbf); + value += 3; + } else if (ch >= 0xe1 && ch <= 0xef) { + OkRange(1, 0x80, 0xbf); + OkRange(2, 0x80, 0xbf); + value += 3; + } else if (ch == 0xf0) { + OkRange(1, 0x90, 0xbf); + OkRange(2, 0x80, 0xbf); + OkRange(3, 0x80, 0xbf); + value += 4; + } else if (ch >= 0xf1 && ch <= 0xf3) { + OkRange(1, 0x80, 0xbf); + OkRange(2, 0x80, 0xbf); + OkRange(3, 0x80, 0xbf); + value += 4; + } else if (ch == 0xf4) { + OkRange(1, 0x80, 0x8f); + OkRange(2, 0x80, 0xbf); + OkRange(3, 0x80, 0xbf); + value += 4; + } else { + result = False; + break; + } + } + return result; +} + +static void +test_utf8_convert(void) +{ + unsigned c_in, c_out; + Char buffer[10]; + Char *result; + unsigned limit = 0x110000; + unsigned success = 0; + unsigned bucket[256]; + + memset(bucket, 0, sizeof(bucket)); + for (c_in = 0; c_in < limit; ++c_in) { + memset(buffer, 0, sizeof(buffer)); + if ((result = convertToUTF8(buffer, c_in)) == 0) { + TRACE(("conversion of U+%04X to UTF-8 failed\n", c_in)); + } else { + if ((result = convertFromUTF8(buffer, &c_out)) == 0) { + TRACE(("conversion of U+%04X from UTF-8 failed\n", c_in)); + } else if (c_in != c_out) { + TRACE(("conversion of U+%04X to/from UTF-8 gave U+%04X\n", + c_in, c_out)); + } else { + while (result-- != buffer) { + bucket[*result]++; + } + ++success; + } + } + } + TRACE(("%u/%u successful\n", success, limit)); + for (c_in = 0; c_in < 256; ++c_in) { + if ((c_in % 8) == 0) { + TRACE((" %02X:", c_in)); + } + TRACE((" %8X", bucket[c_in])); + if (((c_in + 1) % 8) == 0) { + TRACE(("\n")); + } + } +} + +static int +decode_one(const char *source, char **target) +{ + int result = -1; + long check; + int radix = 0; + if ((source[0] == 'u' || source[0] == 'U') && source[1] == '+') { + source += 2; + radix = 16; + } else if (source[0] == '0' && source[1] == 'b') { + source += 2; + radix = 2; + } + check = strtol(source, target, radix); + if (*target != NULL && *target != source) + result = (int) check; + return result; +} + +static int +decode_range(const char *source, int *lo, int *hi) +{ + int result = 0; + char *after1; + char *after2; + if ((*lo = decode_one(source, &after1)) >= 0) { + after1 += strspn(after1, ":-.\t "); + if ((*hi = decode_one(after1, &after2)) < 0) { + *hi = *lo; + } + result = 1; + } + return result; +} + +#define MAX_BYTES 6 + +static void +do_range(const char *source) +{ + int lo, hi; + + TScreen screen; + memset(&screen, 0, sizeof(screen)); + + if (decode_range(source, &lo, &hi)) { + while (lo <= hi) { + unsigned c_in = (unsigned) lo++; + PtyData *data; + Char *next; + Char buffer[MAX_BYTES + 1]; + + if (opt_reverse) { + Bool skip = False; + Bool first = True; + int j, k; + for (j = 0; j < MAX_BYTES; ++j) { + unsigned long bits = ((unsigned long) c_in >> (8 * j)); + if ((buffer[j] = (Char) bits) == 0) { + skip = (bits != 0); + break; + } + } + if (skip) + continue; + initPtyData(&data); + for (k = 0; k <= j; ++k) { + data->buffer[k] = buffer[j - k - 1]; + } + if (opt_illegal && !is_legal_utf8(data->buffer)) { + free(data); + continue; + } + if (message_level > 1) { + printf("TEST "); + for (k = 0; k < j; ++k) { + printf("%02X", data->buffer[k]); + } + } + data->next = data->buffer; + data->last = data->buffer + j; + while (decodeUtf8(&screen, data)) { + total_test++; + if (data->utf_data == UCS_REPL) + total_errs++; + data->next += data->utf_size; + if (message_level > 1) { + printf("%s%04X", first ? " ->" : ", ", data->utf_data); + } + first = False; + } + if (!first) + total_test--; + if (message_level > 1) { + printf("\n"); + fflush(stdout); + } + free(data); + } else if (opt_convert) { + unsigned c_out; + Char *result; + + memset(buffer, 0, sizeof(buffer)); + if ((result = next = convertToUTF8(buffer, c_in)) == 0) { + fprintf(stderr, + "conversion of U+%04X to UTF-8 failed\n", c_in); + } else if ((result = convertFromUTF8(buffer, &c_out)) == 0) { + fprintf(stderr, + "conversion of U+%04X from UTF-8 failed\n", c_in); + total_errs++; + } else if (c_in != c_out) { + fprintf(stderr, + "conversion of U+%04X to/from UTF-8 gave U+%04X\n", + c_in, c_out); + } else if (message_level > 1) { + *next = '\0'; + printf("TEST %04X (%d:%s) ->%04X\n", c_in, + (int) (next - buffer), + buffer, + c_out); + fflush(stdout); + } + } else { + initPtyData(&data); + next = convertToUTF8(data->buffer, c_in); + *next = 0; + data->next = data->buffer; + data->last = next; + decodeUtf8(&screen, data); + if (message_level > 1) { + printf("TEST %04X (%d:%s) ->%04X\n", c_in, + (int) (next - data->buffer), + data->buffer, + data->utf_data); + fflush(stdout); + } + if (c_in != data->utf_data) { + fprintf(stderr, "Mismatch: %04X vs %04X\n", c_in, data->utf_data); + total_errs++; + } + free(data); + } + total_test++; + } + } +} + +int +main(int argc, char **argv) +{ + int ch; + + setlocale(LC_ALL, ""); + while ((ch = getopt(argc, argv, "aciqrv")) != -1) { + switch (ch) { + case 'a': + opt_all = 1; + break; + case 'c': + opt_convert = 1; + break; + case 'i': + opt_illegal = 1; + break; + case 'q': + message_level--; + break; + case 'r': + opt_reverse = 1; + break; + case 'v': + message_level++; + break; + default: + usage(); + } + } + if (opt_all) { + test_utf8_convert(); + } else { + if (optind >= argc) + usage(); + while (optind < argc) { + do_range(argv[optind++]); + } + if (total_test) { + printf("%ld/%ld mismatches (%.0f%%)\n", + total_errs, + total_test, + (100.0 * (double) total_errs) / (double) total_test); + } + } + return EXIT_SUCCESS; +} +#endif diff --git a/ports/xterm/xterm-359/ptydata.o b/ports/xterm/xterm-359/ptydata.o new file mode 100644 index 0000000000000000000000000000000000000000..5d8038e5d69d3f72565d9c58de99a1f9c37240c2 GIT binary patch literal 70696 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

    X-%f9aZ1%yfNB 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 GV)P#nPW2=J literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/scrollback.c b/ports/xterm/xterm-359/scrollback.c new file mode 100644 index 0000000..ae7419e --- /dev/null +++ b/ports/xterm/xterm-359/scrollback.c @@ -0,0 +1,129 @@ +/* $XTermId: scrollback.c,v 1.19 2019/06/30 19:10:00 tom Exp $ */ + +/* + * Copyright 2009-2016,2019 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +#include + +#define REAL_ROW(screen, row) ((row) + (screen)->saved_fifo) +#define ROW2FIFO(screen, row) \ + (unsigned) (REAL_ROW(screen, row) % (screen)->savelines) + +/* + * Given a row-number, find the corresponding data for the line in the VT100 + * widget's saved-line FIFO. The row-number (from getLineData) is negative. + * So we just count backwards from the last saved line. + */ +LineData * +getScrollback(TScreen *screen, int row) +{ + LineData *result = 0; + + if (screen->saved_fifo > 0 && REAL_ROW(screen, row) >= 0) { + unsigned which = ROW2FIFO(screen, row); + ScrnBuf where = scrnHeadAddr(screen, screen->saveBuf_index, which); + result = (LineData *) where; + } + + TRACE(("getScrollback %d -> %d -> %p\n", + row, ROW2FIFO(screen, row), + (void *) result)); + return result; +} + +/* + * Allocate a new row in the scrollback FIFO, returning a pointer to it. + */ +LineData * +addScrollback(TScreen *screen) +{ + ScrnBuf where = 0; + unsigned ncols = (unsigned) MaxCols(screen); + + if (screen->saveBuf_index != 0 && screen->savelines != 0) { + unsigned which; + Char *block; + + TRACE(("addScrollback %lu\n", screen->saved_fifo)); + + /* first, see which index we'll use */ + which = (unsigned) (screen->saved_fifo % screen->savelines); + where = scrnHeadAddr(screen, screen->saveBuf_index, which); + + /* discard any obsolete index data */ + if (screen->saved_fifo > screen->savelines) { + LineData *prior = (LineData *) where; + /* + * setupLineData uses the attribs as the first address used from the + * data block. + */ + if (prior->attribs != 0) { + TRACE(("...freeing prior FIFO data in slot %d: %p->%p\n", + which, (void *) prior, (void *) prior->attribs)); + free(prior->attribs); + prior->attribs = 0; + } + if (screen->saved_fifo > 2 * screen->savelines) { + screen->saved_fifo -= screen->savelines; + } + } + + /* allocate the new data */ + block = allocScrnData(screen, 1, ncols); + + /* record the new data in the index */ + setupLineData(screen, where, (Char *) block, 1, ncols); + + TRACE(("...storing new FIFO data in slot %d: %p->%p\n", + which, (void *) where, block)); + + screen->saved_fifo++; + } + return (LineData *) where; +} + +void +deleteScrollback(TScreen *screen) +{ + unsigned which = ROW2FIFO(screen, -1); + ScrnBuf where = scrnHeadAddr(screen, screen->saveBuf_index, which); + LineData *prior = (LineData *) where; + /* + * setupLineData uses the attribs as the first address used from the + * data block. + */ + if (prior->attribs != 0) { + TRACE(("...freeing prior FIFO data in slot %d: %p->%p\n", + which, (void *) prior, (void *) prior->attribs)); + free(prior->attribs); + prior->attribs = 0; + } + screen->saved_fifo--; +} diff --git a/ports/xterm/xterm-359/scrollback.o b/ports/xterm/xterm-359/scrollback.o new file mode 100644 index 0000000000000000000000000000000000000000..77e55d5540019eb57fc9a7749e7d862bed0e1575 GIT binary patch literal 50712 zcmZ_V1zZ$e-#753r8@-a?nY^rPU#j8)QK`1r!h@1V!4FZUg}-L0bBS zi=FGapLy?RKC-*>-Lq%^=Qn3&XTui?>WaunNDyE_f=EIBXAMvYgrfa_Zp-|0QwBl- zA%`eOry0pXAj+Xb0Zhu4UCKys?>owtaaPxsp&Z>1aed?Hcrdv0UOS*ns zEDn*fWskDxCx0wucDQonKV5`;L2A8DK{;|ha{Zr2LnBu|T+3Af%8?yce$!{jKh2TU zBY&8hK_7J5#4GSGnVMa#UajEM%0nRfy2_EK$|0M#5CZ_RK_nBhigXndFp_BRf9fSr zj{I`d{a1yXQbWqG2Zp2^^7)pjS?6{2z&0wrf4%lU>)zQp+0U{`6sEp57qjRc^$+f= zZ#zP~jDrQRxwyXTYpHY)F>?@kd`iJ#pyPRlPO|+#a+!dH5D61qJ;KMQgzXmkJ`Sv; z1g10``{jV*q9tYCc19GY}~HhZwK ztA<^Ee%9;bIc|8j;A~A|-yjD|;E`G4_{s5JlHl1{`jP`L?M%Y_Y+v~Lht4mw;k)vm+3sb1r1XGn(wCI{g%)3m z1ZU4+M*rH~^Q(V#yZWMr>E;3I2CZV8(mb5fQk>Gzm7n+FN4T`<6DyM@9otU_G1>P1 z<}5hO8?@d_!@Bo_N6IJ=#fVapC6kL!w)k_dL{lghcbW6cCJYJwBR&q^_0icMx#&fa zeR&xSDq6;m(B>}-c@Je`cCqjjT}1qAEL202Cm8Xb7sx;*gNe|JiLD??%aY51)y(hi z%95Wr_;)(Ux55`L9S0@yzSiMhLS+g5ywP~yNO;oa@`KeY@s40x){5PNzNn0M`%6MP zo0V6j3U^3^D)kwD1xlaCJL>s6JAA{Itd&`L#e9j4@EN)F*l)(>>l<(Ney z5td8C8sLEP3pOb&p$EIEuMIE2?v-FA%VZHtxJ48N-bvQLU>>+dScLUjfKiC;3Bek{ z2euKD5=L>lXBuOXcf@k;iiC$syb$KMtWIw|%FN_h%lr6@vN!qYzEZ}nx!`c`t|5BC znLd`zg~O}U$<8o5v<8omKju$CeuDgZ1hE#&}a!V|1a?_cP zco|ZmCqbQQnbm*C=1`=m4rBVta9jJ;y-Mo5GBT8`eD&l>P`K|hy1lL|jw3v(gfJ(6 z^wkiNlFx~icBCP{-Q4vfF8w=H2Y#pbD?6>$D6Q~hGd(X`c)t$`i}{y6WQ&)Q!lr0^ z9LZ})tekAiNVnZclSP8qW{ZM{MCh8Eu~fz5vE+QO{=#LJ?kAMfnTgAqkPp4LlnJZC zaL5TtRE=ALtzwkjViFq<{iP1qf*ZqK8wvA6ky5>|-g+CE_&7iG{ajZWZDVgZFyx$B zI4i8?YnS@E*mz2}?ww(3VTy68fkW!y7}xJg<0+-Ochxrb(%*C_CZ*f&w|7H>ia*$n zJsjw!&rFaLW(>DiG>6@Oo@cZ4bf7!BHs(%(_0p|@?u5()Mqx%Jd&O6H-85A(AC2zr zCPJnek-J&{)CAdbeXCFtW-J$GluuYI+P}NKKvSbt+j0v*)atW98@To)fi#IEQ<-!;b-iZD%89*Ah z$4jT`HhAmWu2DH?Z;9pOIFUv5^VVJFE#2>YYKe7>g2$ZOnpCx>l z<3tJbbN$g@GXB>rvxGUbq*+*7O<4PgO`D|2x>pu!R^Vk-VWzdV&Q`*M-02VlSVc#c zJIW^1)aSAOkH+db2aOitOrInB_1WsuBN@7r^y0Y?<8{fB(gp)vm&&3!xu8v__D!<|`DnOTx1tX*xFZ$2vD zQdD#cYfOZc=;{Jh4Qb>^6-KBMX+pf%ITyH+F z^rEWh#5Z$YJY`*VVEL(s0XZ|?P{DG4BBP8<&uh6IPtAC!KEYK%nUDsw9gAy<`N3=EmjA#CE z5&AUm5FBS8+%}wZ>K}McnP&FK`$qxqI)=tbTxLnGkT$E3w)B(y`wk)(`3CIk@x^)# zZ}6UDQR{d%S$uE0i+x7+kocv6-@UsN248i%ttQvejOu-2tjo!-ZiZgnd}MG}mZ8G= zrM%JMtpzUMmrqkAWx1~Y9N!hEjwMdS&lWqVi78<5$cnPbs$ViX~#ig&p}eRdHX$u`L4}KSPU-V z?q{!RLeuPBdEqhCyWdgoj-uukVM>`1&v5k}s;Bm6%(d z4C5o1TYXC`22Kno{7#0$xi#Wu_Ls*MV}_QnqAog(*iV_1azesk4h}fOBaJepd8ig_ zo8OqV<uSen(Q~VbYXh(iCFSRAROo5&K21{N*Ug+oVO&nSI8k>^Y&9_qb4}#^f)H z;oz^I6E+rKb~2-gg-BT)IPMSWWmlBmQ`j5O)A(Ya8I>l-?n0J3Xry3*?ufpT@~f0z zSJxr6Xe1?5r%t%AYACtv(e6h!OU>p@jva}h(`23T+NX!8-qe;Zn8E_L0|c=jFz&Na zJelce>>m)i=%|=xyZfavWoMZo+)}5BB~HbRQSldXpJaUu1@%XX71wx{#tq{-zi;_e zLZ>VChqEP#%Wwem+ z7JQ^pSJ$#e(~2 zyes$72jkewoMju~RwV1P9b03u@||B=MHN0YBYKfj-3$%n-S=9%ZODCMU54bH#^hTH zBB$~rr^>F*NFtG2I^4v^6%O=M1B5wWRr7nPmT0TK&1m~VM7=?!n7r!51rxZ$i%zJv z4iJx~#wONH%mX1qvaUQJh8nYUCC!%aBO;Y!0px4Q68g<;rbTm~-F9_`ZBGD%+a zobjw|?e5an2uTX`oPFimzRP=w89gi)+`ny8V`(0M?{3e@y_Z|Nq{4f7TkU(7&dQNM z_@Rx!rD)&u((+M_>{LVdSwL$37xNYTw;d+DFXEZ)Rg#Z+jRGpuq(5WXm&PA=a=oAI zd(o39MB001$Q4(Fn<3qi?P-3&7JYZm?^IZg>%i{-*S+P6pfNgN40VS}G6kK)ne zbz=(+^<$3L^ZX*3BTM`jg1-5!;|cc#?tBUkKthu#mVv^nVSKB1K;7jsF1%6 z6_Ho|frpQQ|2LljnpGsAAQ2(w;TcV8#XH2UFF|=$5M;ivA6gC0E!# zW9Q*Vce7&6KsP9!GHwu)a!aRj&`99Z5U;VoZiNg=g0+VNPcr+k#R}3hefL6C-11HS zV9BgMt>jCenr@#L8N;^8?HR|26_8y@CzwUU5V}>n-Hn9w8k3CVIUXBsQ{{Tc@Exl% zQxnw5BiZ{AW#M=tTHMAeb>_BBL+_Pa1`?}7H}jm|=T;AF7%wgV8ee|nzm#=%$yT^A z$mBz*a!b@SP1cVJ9v$Ai$HYm~Stm|P)#_Dmn(EHOZ0=6Ulbatp&rzAK`K`=<>}^@z zZ_0W?Nt4&~^<&e0k2+ngigiVc-VAwOebleL=xOsFq1m|}Qx7piO}Bk&|G8>U(w7me*f}`Ud=Br*SE?v%E5Ao79^YodUdu@h z{8l*_7FOJ^`>T_HTl6c!F|qcM-egv~rj%~H(nC%*mIx%NxC938l-skcxv#O3_s{#C zltVatULRY@jgr5S97xB(DM`DXtG5}qVpnMI#1QJ@R3c{mE_ZDc#z`B&^t>R?_6X$* z2jOrs&iO+@vqfRC&+2V6aB}_;587@b{(cXt=uCQtzE~~q{5J!iA+9Q|CyEZeB=abI zo%n>SXlXDSCpj{eqVd6-QV49R=8q-w> zXn8dFnuzyB!gS8MeiYO8G>`$Q!7vW#`aOI6l5|k5jD4)azSmYDw zdsYocmmR(-v!s0TrqVNKoJ>r&bPT7=Gs!}2#o0-{%0WRc)g0r^MIw4%>4ihWl6IVL z>&}a$wvOkq4y`KO+lNnj%)_>++{~XwWtDu--g|tq{Ur<|YbYpeu5n=U!9+piT`_la z)jr%>pCF9}xd}2wh7l{XH8^VQaeaf}bgrDG|Imm9+_|D!_wKso`A|soM|_IM=ffl~ z(F2j}DO3Jt(t8D%9NO{!`ix#=pU+P2e&6vSlJ#_cFHC5F>o=(o-Rdn0E;SB_TtQ47 zL@o(62hwS!V%v^pZ-UoUV5=egn4CqhV@{O>C+#8=(#Xbd)b7z9A=HvojTECk+$2oS z$Dv{Qo{UdSBhLuZcu&+o-W&5rqL8FP6{?=-KHFO|K1GqYG<*hFvyetTtXZ6rR5C}D z2P{s$)UHvnmcO(9ZY&DpRfd*$RpP`3ZxlFl+;=b3A}!va9_x-9#yyTy46s`%v?ceY z&HU`FK5Wz#&Qc>?_*H24{Nk5TY$#7)*3dgX&bYB6QWL2l=^Op z!^^aD!9KM^$FzeKDYf_wH*oJc`S&S_cG&0ktHys7M5A$ejdl`_83oMWF22Dk7reeI z6uV_`_Bh&0>*|W=^yLB?r#Z8y+}lOV<%EI0TPh4XjYcuKE42j*cXS_9eYc6=>0`Vz zq$-8^-JJi8h-KcRfGwgjjl5)BF>AMK@?UPBx(d$^T>7kB7PBp)47|zTy0{Llu-<;} z{&e>b>8pG{g4g-k$bu@Q9|)(^9+TUQp!cu~O;T!xFIjKNN=pw)rtcU;>yg_&C|$QH zt@1Lo=8dyq0^tMkehjm-YMg71-IUJeMqlJ}gGZt(?eD+ z$sB2o)aoD5Fg%2a*$J27m~DS?1V@vrUS1i zR&L)S&5BO>lfG51qxQ@WO!yA?=hE8l)R|r!In}7|R5~gbJ<3qDirQA@&X^L2UF_4z zSotw*lEGrN-YvvFoUCq^vC=EVJuH#2()UiLC{&=5b@)WUiEfx7gRJjep1PXVlyXt5 z^^|;(hP6+ox@MZa;Bs_6op^ERc68yVzXO-}7A5st__b2p=k;UgKTR*c)sN(C1UtH_ zRrl$=)Xl-g7Ykk9V}iMO^_VR%X;9`rnI|4h{!ZWR-DyTPcwEYiW?2!q4AJb4;=@jT z{;ZAs)i`cS%fe?vZtHn*ih$Ps4JV72mU|l~b9rxP^ZLb4UE6S!R=v>0i0W5GMtR%t zemU~&oh~;lOmJEUv`LV?YSC8wT9hX#`!Hf3&yzT^V$U^0npm!SyJPcAz<%*V!bzos zMw7hv?Ae-EtTH$Mi>6tbN24-Fx5V{UlnM-)=9)(@1)BF`-^Q?2r}3XEiJUH?%jf58 ze9pnwSwvTS;E*u=(KWjx*`(r z8ya*BE~`c;$R3fu+f8W|BEqk~XnSoki%D1?PU1SFk|1c}+k5}jXLI%g{am6*9kq4L z$sEc@DjjY|yWKvQscTc*hVn#u1<2xziQY}`X(uugM%*jU+XsU!l0yxHGdoTu-%44& zY%Ny!eOFakWz|*x<$>LA?&PiP?zmQ-7ZD@`Y$uFD#A-jYE?NwgD1xZUQfKcG@p9jd zA=C3PtMAnNjY8O^Aj<377Bi#0_5M`A zmp#B6*G>334eutueqyMkdC0ULAtXAbYUad^WJqEuw8<{g@;vb%(u<1grVX|5T zdiW&BqZpwdMhI;0IKQ;@$Jla#xC zLT5&ghI}EnBUk$$T%^cE^=HSf~eI1Hvh+A}g zVJe!C-Sg}8@wdgp%_jb#$UYSV_W9cdct^8!qEz%-Ki@kW2I%{4r#jCR*;*;gz7ITv zlm@;IU(u8C4IYW#2+ibxrO=HU`iAJ?Z=&dk94?D|&_Zjb#UJLydb+rEh@oG)mea?J zv{R1sjPERZ9394yqBCo}^FKynvY2fi$NRk4HfLnuc{?}P?s>*+ zvG+kj#a!D%GEQ3?v!#;X`NxM55B>Idr94_Mt&oVmk!g*ApPTh~7XtTkzsgaM`q6Yx zg+J#!mmS25CmMV?aMmI9dV*U*aa)YkX|!pU)1<*ScG@G$ZAFBp(ighail<|?p;7sy z<;${7L8+vFz7g--!kBi5)ZNBJJMo4?EC>5I)~QdGIbqv}&z^fE#~ad9*AkysbS3Xg z+2Prd$K59+{S_<~%<&!;_k15qyB@M1nORS%HWh0y6>=CT7AS@0iRzCohVsr(<0dg9F_W~=-peV=)tYOYC^4? zuvMh&`=htda+`S)| z&TJ}*hLzuM$Igz572H9G7Zv!J?v=rvcr?{u$B}+C1t=Pfq6CTUYptEF1#;Azlp+|a zgN+Pc2{W5L+I?cVx*1lV%nC?hMWBTBZe%Y9)LwZNg9CDaF^Yi;A%)J#Xz|;zmE?U{ zQ<#3L70G<+M_R(~U=Wg-KY$4vh7v<>bE;-)Af+s}uE7lK+{sFWOVIW3nkYx`gvdvb zJQzzDOUU#vF&lz?LdXJ70=FOsXxvB#A!B_q=g>YViVUX=3iK!#J;)#!J;Wd=EZ86< zENCo{2QrJ%MBpK9cW)I5t^mV;GRi!GGD7i#6hmmx&2W5BJup|bwMbX_;S_K&xDos( zObxmL9fh&V{N(yzKM$dF*>V5!uIaWAq4l&(5?8B9Kjk!3SF0XdXmn9Cs%VVIl}=m0wqg^9x4q3++Yn*vwzDlk?R`|<~L znO8MSK2UoQ_j(06aQo)Q8;+_DS!lT4~pa~Q&C{;(?u zPxX7sj^Y2Z77PB>AhF)pOeVMd;MP0MN*UNWTRAed7AL_fjM5dxI}(B7Z{5>CG7MFc z5r(-`+O_`adjNOU;$Fq*%kNx4gXLDPN-Jy|Ba7J^S5&Xs!YuSGkaJ}9M1paqy%Yup z=!R2=8iLYeZ=;dC;}?O_!%we1N!D&Q;;Vdt(Us)o$YH47 z(L;_3qRb=37@;^?K4g3SywsZ_g8bH3a@eZS^x!QMh(lPE{x6l@z%po|*Zt5EQKXTf z)Zso4tqksO0uC~jjvwr+(B7lZ;&5QhB0Gc_kOfZ3&Jk&e!v(Z_;i_5~aDUhT7 z9Jm||3*HG6gvJF9B1>Yeqx#^C+0wwY1nOwYyxSb@({OUx1(RBfiu7b;MA~Xm^hSECi?2Qu!UTS%8gWs%>AC) zN4t^iUH_}^;{5}#Wsze1()u8S!1|Cah07T<6HDDm5z8uVIzQUE~PQD!6$uKAQChDrEoj=xo7OWx!Iccx2CiF=Sl&U{wfa?1*`y)$^2OpL^C*Lp4dW6 z9XiUC@N(i90_u#=gCApiud(~q_at)(wr}_3_Am24+hr+J$rwY~WT+GxUdest_u);V%=--Ha3UIi7QDRE?Pz zC7qngywG=fn^c)l)o3%p=bX>^Y@1xgWAJyp zQwcn&l0TgA0$*A5N!S1Sz8(wZpVfcA&-c#u)S1-jkRjNlm(OQhFzTjfQ-uCO#;@3g z!FMD50;MfeOqMl|eYZAw2+H=Ih6RUbhl$HNuxXEbUi^44E2t$PQ*>t$<@J*VYc)}h zen}Dn0r%j^aLgOzEeM< z?RP(vg%x@1aiOh8eT4scVz%b|&OW{OO~#vKKbAm_;cQXPU%kC5HNwJ=t!7gfbH}gt zC$(}j#)Vpz#gtcbZ+Mg+H;o7AHn28J9_=@{)V-7WdMQ`e48uPWAUf5C(%gG{7HYb$ zPH^ISujto^8GSk4aE9?cce}AfLVo9+H)!(6_vVZ!SMS;pa2)#Nn1^JhG}Q|}CB$ft zY^@l4IMJo`OCl=GQ0O?PYvUfy)B0Aar_Rn6Xgmgr#&;rn)png9m^r7q>2tlxn0uFn znFI@dFqs{=ak&ym)kXm8JMuF5%enk4+vNU_`xI^Lq&jEFWpT=z|MUBaM~EL*0Kc#B z&UT8Ibneh1c=;@hS)hfAgk;AO`Uork0o@{M!sC)3ctTQ;SWfv6aq|10U16_uv{=Yx zB6xHTcdVF+KDya>wLKRPS2jaF_C4vM=KoF|_qm+rdA>70d+4B#t>Ah8)1wL1Hi0F| zcW+>`_?@TW25VoBBnWtYe%$3Jz1kDBzNt~zNA@QOR7t9g_vggdy=CaC9O8Vcw~j?M zQ6HO?X2hB2=2?QacCAC64hUNOa31O1t2i<^t1eVdRdHap=#%;#}@ zj0M@Mw(^ihOBG(TS3@nXNfyUL&~C1)DTw^fH2mk+CN~rE>e2%U;a|DAL3(wC2DxdA zYVC&VJ%)rji4^uv7r;YK|Gyk#wZ-pu$`H&>4p2Rg_8a$N%KVIsd7E9CjxwH5QZf_qz-ye0hr>iWB zeq?v?oD0{9wN$NaizHk24NqSC3ls+C=`7u@7?Hju!*8``3nbxw_?#D# z?DWSn3o)Xbp$6IM{uB87iSr#*zz z*+iW<^fXuOsePhR5QGf(&tmm_f0;An-MIii0~FRQ#wl2i<@u8%Ez5ZRq)9ldl`BqR z?strtOVg={Xy$>b>D{W|gZLPRo-DHyL;7Bl)6Bm$91?3Q;_8|zrpLReSkoq2*IW8r zVz!4ZwU-aR7bw^^IJvPk)v450m2kTFxw;h|7@MXQHaOMHE)-`WKdT-XO5xeqoc`T_ zG2EoFaW=?uI_T&ybD2(JrtL(#;Wf%K`Rn7fo2TsB@P?@<1d?g>Lfj`6(s{QHCB za4xxLZ&O_AD?3FFBQJ%X8<0)@GR*p!m$PRxJm#AwvRJ(qEY_gQ||5n0XK+Z~G<+K)n2?5#ie8XnZI&df1jofhz?h&?);S;X z_RM8?9u188j=%r4t&);f^@X*;cqMbIX3!_jvb$et;j}==c;0!(Wj4F=^%zGA+n>F$ zg2-oW7cp7}jY8F@?>uUWTq@>Aozf1eW=^WM%Fjfyztn1yKgz;RTTn_7^ty0}<0f;i zaoNnDZ920&V7uGI`<62bs=|T2_}N=w z{j5pxnWjJD=7&_W&(sI!eh@WqT|8aU8{HZinR8Wx*a$`r3V!2)EKM&SoDZyi;zm

    Y@^!rN1)45-Tz7{o&5vjrFm~;XiG4MY9}gnd2+Ho7qc)G}Bx*FL$w^ zctLgZHeIR0kAvHS{`9lT?4F3)Qx?Rt$cLX!6nLt%yPD)8zuN1#8(5+Nk%I_)8rB#l z!`Pf!QAwi+YI91guS43Ckd(wX^)4bw44Re|@fNLHn`%KKYink@D^ZVH?DZ}%?o-Gi za-#lx01=au*&e3GynXLh(&c9qJea9 zapz>w3`F`sG*bQ4%q|s;aQ!aTl9_YTppd7oVJW9t$ggSKfM3-FvZ#|HdK5{RzrybE zP^HnQtJHA{{A}Px9&K_`;}N?2jm;{M5**=Y8yDXokqeKKKU{q(mCN%$CmsLkI-#gl zP3vJr`U8}mQ$jo=nUF6u&+_l-BQppeVzy!27k-Sk<-&TM3BwH%yi43iV2`e|0?m3k* z->$=5?K{^GET*OTdrSHqv`QGrflaEZ&1M8 z4Gt%0{3HL1RNkfUyoa7+IiBCWy?OvTDc!Y{hJ!>T{zpB9kwL0cCu{d(8SSA;n6(1Q zpg3GlM*-JZ!q3-8bANgM9ptO2K9l)ngkF!AS6EWtvG{@-Ql@dV5Tim_rLG+ZR{esx zm6i$~Q|echK#_J%X6g<+Z$mjt{Wr_Xn?4KmL<3v(GvlqqljLqs5~K9e$8v~sy%=!~M`Brsq4vnLhX0D&;blpT>*p^p~6X z7qz`4)vNI#V}9(#E5+3O+fE*9Mdh%{nD;B=Ur~>?8KdW~+(MLN3xD1%_UE>xiB)~d zqTi-Tk72q^5YiYOkL9L@&h@4$63#bJsdJ_*l1M!p^sT4=6K@CDHTv z2gE;XNSNX-&mZlhMoau%J8ls@PFG*(6VI+XaX02mw&9EEP^hKR<9w^&m6dRI(WW`| zjczV7JQ{iArBswE(X(>{-Sxj8NYp*PKdwe4qkZrV`GLrk^Hj${$i%~0J*`67C_(-N z+>jcq$DM*a*yhT<4D6h)dA}6bhj9v`>{Zs@IVX_%__g<-M-TqBB=zjoeHhVP&@%i) zQ(G=rl$L{L6~DSV9#w~HD9LE!xsh;BqhPIdRN9F!zb0eiJ6Plp^S9Qs+E_=)(|~4* z5x?bHGkq)Nu3vQ$GP*7*af1@kP4?cXr=GNopD3~fBDJKn3~|Anu*Gv9qk z_?Afzjn9eabpM=&s%sWIHK+c9#PK^-k3a1%P5hO{Bt{bJ7QH5mk*-SHnvRceMbfDL zp!dYK%c&P~F$YuPzrH zy<6=d!>s5hWVK>RiGkMg^-m(xnJV%3#qb*oF<%)6@Y@~pBgJmEH`kXkZ!osy!B*uK zLKFLOdTdkPeLRm{ERo=)Fn^WJt^WBd&WNjC+##xG;6WduM+FwDjIA1iy^wnU!cQnAmexis;QHx6py-U;6D-d?wqc9}=4Puu1ETq?K>qxrFrprN({ACaaPwn?ZdhOzXQk_GCm( zrvBIx54kC%jx7!{{mrFgu819+z3+98&U!U3l;`E2LAn?59HDmOIUB7gVa)ZomYwEuko2f;n9}m_ z7RzCV7mvLxGIW*UDj#B+wr@RFkYlKnx-McPRbhix5hSfC-J_;mmJ_4D( zyPFN>-u6MVcDqA%EuTzL;W5lpt3kU{wYb(@MXzQ@M?^n7){paCWH*Y+djZLLxxO;d z?88JhY4M`2SY1*xt)tP!;p*3X_%9qH@2m=`89HfNe{gD;I+CZMJF@;Vn5Eq+Pld`{ zi(PG`?{!8W4LQ+riF+_;&N6sz&F`CPLOuEgMcEW3L463F=gY79Q%kzF@b|TJ?U3R$WrBn+l zNperkjaWt`j}r4r-(9vV=Is3(d=%GV?#8XqHqv+!`DJ+p#sA4yi>A%3FPrrQwi z4=qaX7D$3^qFB~|MHojlfvFUk->j6?5;|6|^ZcxOQUGt%Eg)?@eyCuR5eugod1`fbXPQ zX0M@AmSDsCC(cd2ncH@>%b@Q>tH+*L%w*x=RG5a8ZZgF(oFf6Po~I`zmgnTIIBNH2 zIEKoZQB8y`l`W)<>lpVd+$Cq6%8gnbxxR#A2lt6N|Akj2Cvw4;ulRq}PO4aBjrCc7 zsM1FV1yy9~{`|r3W=0X2$xfuiX3RIivao4$A3vT9wCQfviKuykTVU5LcB64{ZLOlDn zjZHBcMWl3j^ip0U`98z9Z79{*uSbB<{36%L^QsIgrBxmu*+~=qcER+KxqOGI4s>55KLcc#^XHrXDR`tv-(?drPC+A2z?v-#XC?cX=*O;9HY^o;c-)nTEZ|R^-D7P_nYxm-czkl3{9v~L z*{I}oTnp@63W=59=%O1{bh4WGaY@kv(tNG_YZ%&c?E_gyB?(CCbBum{D7pAA+(v4><*Emim zL=txISHctr6TTfo{XLH}MvdY}exK&m#(!>O-6HPR??2Fb$8P;45p#*lO=sAr&Y9Ut@+D0<+Rup>Oai951j^l7GPeD zLJz8cSJ^K-w{9x^T9dtePUIK0slmePYBlcslY&0G08iaeO_HlCCE3Q{Q$uu^{WHk% z-{PtXt3`LuHC^u?@VIdQkTWCc@t=*4H?q;{-=V8E& z&YwK(b?!vw7sHh;PWRJD78yA}kmM-QDR04MtU>?jVS(QBpddj8vc{c25>>^jDF4HW z^Tao(jA4UysL-cUo-GyVVPos;rR^djuj-(Xj-SSxHR~|PuS0>n#PD0*vJzg0mu}C# zMa2!UN-<5kwer%ic1ZTd;F@X6`Uy~w28|isISkT~=lFWxDlnx9M$p^2VIx>0OzDLB zw#4HB^*$H;kB)_Fq~zlsVsZB7Rg3#_s1%>4y|#DrtXg#Ow1PhhRhz6oEqZ17_!ZiB z?6WSx#0a#I0Bf(aQ(lD4vAU|;Rknr|6cx&>lbuG& zMePgRKCONaC%i{POiN{ccJ&{VP-Fse?hg=3M}7a&Yh3C;{E)q}yXG)r+j8lalC~SX zLp1tceA^TOb3W7^)oFdo@vYbSYdQ4E>id@pm5zSG%6dlTwCm-;xpvWUgq8~w>+yGY zNQxhszF4V?x;*H%48E5uF&vR z?*fC2P;>iLIn~eT8Ocy#eK#R`6rloWvH!w&>_=e|;O%Y-eaWrBZ!9tg*3t@HNZ!#%7S$-`dv1XOBC4 zg*&sSP9_v_T?X2rJ4NJOTD#&7nU_gU;tm*Wf4>mWD5o}QvS7_;M+iEv<58nUVGD+) z44NRdy`{90FX?Z|=r&yS!kRMvqf9lMMQA=ukCBTT8BEic*OB$5;p#UJICN0I=W^fq zTU)%fQWNq%*mz4o=(>}$?6BnY84?*=wZmWjY>pYr!q%X$#6=$>vfpJ`u)+&qtgGz& zQJ4zlaVJNWnKqgyjq9sM}1^h$hN zpG0FJ;h_bXuxM9PVP#K-M`^B*?)@RNwo7n7lqpI^VSv()IeS0SwTK9=R$7w|A?V3! zzeIWP4NdvxW6FQO&mg|}VENzmtN)*<{mHqL4(B(15V=!%z59EW6t7kOhA4vW3L=>a z`JVYWrrD;72I|eDvzN3Y%5*uw?y*DUrO)_EP@Pc7nS!kz!$PCx%8+t`DTs(;9Cg}k zcK)87eB=2LqK*lFl4gp6E8s+$Sry!gE>`)-Z!-5tlfhvD{!80KN>0B=Rm$&Z#uQoe z`x$>#xdZ3K4`U3Mnr87^@0Vj6lcrgxN&2jJ_b?)-$0kx>w%Q%M`n{RoVp?t|bIM98 z8M}w|H!AmNb*p4`#Jwi=kv02E&*Xkmnd2O`{WY#Z$84c~)Y0~s;H1QRnOW&|7jj>C z1#uOMACebiBRfP%PEL%DP3gWqI~_ki4?hndA}7?VYr3mHw5z|Xd#^r+M{2(|U_nBx z1E2enAnri&(Saa&6ChFHVBCtox|86_?;!3IL|hA9T?5ZEeQmOM1Tn}^Jc=+BC>~u1 zDsmSV9t9MSKo;+o9Jc&FHx=-%KGtWuYHD}g{%X;?zPM@=cKx^z6eT=5WaWQaLa$r? z-^+EqsF0n@|JDNK-`ViL??w41h5v2WYbX$m{~!PH|6T&h)!W1WwxB?8{u^KQkN1B# z{{QFKEs6f4ejw}X?60>0coDdQ|K`$He%+4@;sO6`pR3y%SAYMlz0UvP5C0E$zVhq- z=@1j=pY3>M5O+&A7e~j(k1U_?SVC;AJ#_zFhgc}7Ysx~^Ei@Gsbrtk1^q{ip3KrK7 za8|Z{WCgXda)Ugwvigq)*tl6+LmoLgx>#PJv-~5EM-X>w56`FS_RiM-tXWw*T6z4rg? z-}pcLKl{I)>(>joJutJd5cmDl=;{I&apT&r+f*>z0MUOqCgS$>6&c8Z8AXZk>#`7s z$bW?6KidE2tmpp^zkXid>jJKpdpB1QpdM3-8@Qfd*9+j{*I)8oEs8f+|9Ten4P4K= z>jh}?Fsuf-2l)*&gWTkLQd}+Yo2!58tfskvQIPK<))zoNfmr_ya%Gkq zI0iW;VrNG~%ugV<-`5lJY9R#qKGluWfSe4`KPSj5uXlp0MI7YRi1s=lS7E2C)AfnZ z)v^t8V1A$=@&j@XN6ZHTkn_;r^g|7D8m1fP1NjW%IG_M>AU9o*4|3o1^9bZ$5ywdv zkpDqEuRq8;5$n+)&qDN{0dg%wKgA$lK%C;d2e~)m1qXN@AU9!>oBF?l+Vdd#nFqNc zVtf4t`6A+YehP9U#0wiHV*UcpJBDaa4)R^Z^D=`x3o#D`LC(u~Q$G~sorv*jg1iW^ zZVvK~i23XUa$BaG{zE{Xk2s(tfLsD`Jj@084987Bl^|E?Xb*@>@(d?Kwd{f|&oJAn!+PFC~!I zAda5~Apecn|6M^ofT%MTH>KK;<#}DatGX-@ggJUFOZub z!YM$$j(A;T0l6LG{7MMqqqH~u%Yqy@&S-)B6JooXgB&>iID-7aP4^HVkpD!~4+FUb z;(V+Mm|S@{9sGkY_r`fjo;q4&?a`K%UVc2lC7SdF=I% z7q6CLkOO(vgWQqfrhPxifjp-`4&=ECav;w`kOO(5V%|ItkUx+o5y*i&=|B$T$pdmA zPd$(Wc|Ha?kmpm7|3<6_fE=IYrtTP!19@hG+>Q07eF?~c?bQJCRz&*&kOTQogB-|z z4dg)nM<56CN4pOGY60g@400d`dXNJ-@PS+k@qCIP2kO@YIZ*#&kOTEU1vyZE0LX#) z69e-1i1ReyJnQ=I>nZsj@xGu2)E=m_4dg(b10Vdjz2kM7`9H_qv7VgAn2lf{YkOTEU0C@pozjgyTkaHl& zfjVD-9H=uJSK@)R_Wupq@7% z2ewxY$bs$E4)S%5oBGGVj(ESc1ahGMU62FyUw!%c&jQXF59Gl9atGwVxMV>Nj7tmT zz_`po4$MPGkOTA32jsx}hzO8>LwwGe2J+{K{kan4z;d#QgUGIWVqBkZ&T63%MW%>aPSjP=7PX zf%BJynn+7c^~slKhz)xa^M2_AmVvt zK@Q}g1#%z(X?GrHWBLDa{0u^jY}p56Mj8`i zt07{Bvc`}lks33M-CzteME22UUs9B%Qns>&6xpJXRH9@{mQa+027S*x*Zb4=%*u=8ea@VD8*cSo4Y&Gkg@2^`Er;M%-_vlb?-jV!H%Q~o`o-#7 z5N_kPEZklPc^Gch%rW%6St0rsDM_xV6JA_(8qSl3(||tY4;EzrgLjN(6k5?ng9$TlrhUtvsFK|Mm;q z>N^x}{W1amn8wdsxRqxK+{&{aZspktxAJ@gAEJIg37@9@=VkbY2p5NQYrb0hTRHEA zTRFqvR?g~hD`x|^m9r(>%Gnv7q4?hmZu2w^epCC0@$me59yA?p^?eh*PW`wPUO?mX zLwKy>&Ng@}jn6OP)3xvX0dDWxI0GM``2GjHs_sYJhR@dg%BOl;|L%3&?kf&|Q^#TO zbDGyt@U4+9qq^|Q+ITgA|D<+n3s2EFd=}nW$9>?B>UHO#@FO9vJY(S%<&)tVdL8j~ zcpb&V#qfoiU#sCqRQ}EIXua<91>FCkcv+9{;QJ~%|B0^jzri0@JO2%TLgOH}+S~g5 z)!Z)sBJeP^XE}In#p|ZDVK1&>nxZ^1(}K3BsB zs~>m6H*21L2VbApwa;nz^E%Fi+xx6aXna{acl5sTKkkF)tLnTKysY9(LwI*xuQfbI z@AG&DUSDybFZ_h!z%aPo&z%Tgs`AW&N9c9rx8V5{$5z3A)c#}(-1>JP-1_$nyqNO8 z2~XC1$*1vR?Vlok@TQuN?cigBT>r+yTWDPMg%8ki8vF;1 z&lli1RR3An>p zDyq0t3SL3aA0y$FHLj|`59xkoJ$QYUzbV|_C)y4^SMe<#eoXc03m>UCnFepD@{EI@ zR2-NBkJdb$3va0L^Dca=o{wyRpV2<=b9k)U?MwJd^?Odu1M8P-8qXo{=ao+k+~Rpl zxZPLm1h@N&J>ZA5Um6VGsBt?6K3d1K;TGrLhKH;CYv2R4p6-O_(EX5$@V<(}H{eNH zkMo4Ocwp_Bp>a|iZtHP0Jg?%g;0Lrm zHiG9+Ia|YD(|qm%xBKnA;oCHxhr$afK8%B}*F2gEPf&ZVfm>Yt6mD^KAKc>V5AfZZ zk7waC6c7J|SE=mAbCBkx^_SfjE)9Q1ap``zy>I+MxV_K3A^ZuICk{SShV%v-YQO#N~a z9^><#C*ZMcV>QxNBMC(EryuIRKHTXt7zkURMN%=R2S5kSNgb!DI z?gnq8^=lx!tj60&xZOW|8Qxs$)T{8up>6=Z4KJP3`6~Dz0C-QGBQbPtCP z=U3q8RsMhAA&SfSm7n$RXG&KRZui0NgWG+unsD3i{rmg7{%*?a{}-#c(GuwwseL-Z zM`%CX58g%NBpsed<90k;!^ig`e4XOkZ1^gT^N-*i6lcDNFIOBp4$rH&aT;Dh<-Z6| zR)5`qzpeR_JJOAJ>o0p9y(E0~T`pZ4cn&>J>;a#lahnRCq;-5Oe7yQ)8hnw~kvHLW z)ILYy#WWr+!0q+!8}QSiu3mZ65BdCu-ndGa7lYgD{o(L@+K<(Qzo&J%6@0$>s~voZ z%HIjzJGU!mJiLwKOcMO8()WdzQ~E*hGn(&d@W~oCcHh+6=QFkcIHX^v`=a)I-O_i^ z_?d$A&uYHRg7?rknG4UO@wO0tL2>3?c=@|syRCqysQhc-->JXsew&qlr#C44k1a?) zU-jAvpRIVf2mYYi`2f7R(jS7?R{S{%zohbJ=B7RW09Dq`#(p zZzjBeo}UJ(e=MKl+E?U(SCJQh@7DgdDEuAuS1EXc%2S^16~OyI4xV_){9r%15FN4oiJFJ5Lp?+KsZ?CxY2|QEnwgVofb~^z7UHx(lepc7L0N)+z z8tyuLm#$k`M z6RzU>K84o~bwAk$PtW802e^H1&pEi&>n1!zH{}r1>5W zAEj|s172V469ey~a<+os2zBLn8opZX-y1$q*G-4-(SBwF+}=mH3*KDg_9*<8_74}} zU&wF3&&%^Xl)XJi>G^3fcvbBu!{NoXF4urRERTUNS3AeSi>M#Rz&j|PSK;%DxN^S( z5Azlj|6>i@?tdPJ=hnXc3cRh2L-_OgUH<>TW7M9xqutMKUAv_A41wGG#v|d)760qN z2Pg%sru_dc$C_|5xk7n$2Rc&8Yj=fD`~y%2hXK^ zhQkY}JTJh<6m#{Q4fpB!*NXEW!xPn>U%+41^OwW$5^A3_aQpnVKjA;CUO67l-e05i zyuJ{;w%V;6ytCqJ75GZU!@BVI)Gy88+ZE@ZgwInP?he<}4POepM=4jI(Qx~m!O3vD zPc#o+Q~Qvm@TMxy26&fy-E}{Mm(_arE!;lW@hAB2YKP14OB$cI;oB59g6n4Q$NY-( zrQ!B^M+E#E&G%^d0FCp<;8WBNZQ*%s{|~pNm zuch&}7Jk3huWj)CT3^0`zoIyN48B$My$D~XdGt5jes4T)z3ly!rt%kuU)6Oh!eiX& zzMAm%>X%r!y)P#YK2>qJ3p_>lqx!%@OS%iE!^bO*Wx!um`DemAR(1I-f+uSqvJ!s3 z;>l+Ce$B7F@DCL~e}GRe;jViQeoXcK3;w*uNv=oSd0z3nB|k*-t_VCy^$LYQsrVTM zA5+TZ`v`n_sPh)^d20Ws;PKiI^nl+|yQRXvx!>hK7T&(F^QrJnYPUDx$)#QT%ikR&YQq*YMpHlkJo%jgxl|p41|}|KJ$6_F}2$(@S^IM*Wo)fKHq}}tDQfD7tp-e z0q>xCeGPA{czyz&U+w%GypY=SCOlmGnS2eh_v4mOcU%%aMf0K(e3wh^^Z!}+tcQ(< zavBef;Eff}+rVQq{-1@{SN!Y;FQMm6!{G-DxN^JzAExxP;r71v)$p3?uTSA2D(9E* zOvS4o;YphB=ivo4{;$KEM!NFn)&gYh`G)*n_y-{_eHi>Rjfd*+Hfo;+@EMvfE#die z-OljJTK9XwduzWs6n-jgxYg5e38#R=D|0WalRDZOXF$-Jk9p`@XDdStjD+TCMxGo@JO}K zWq6TLU)JL`{4TBI!42Kdtsi}wN2TGTG;Sl{Z>apy@XKoF$KYRSoVSH9(RI7R*D9_i z!$T^#a*u!)FYf#$cwfc;Iq*K^UHZlFA@a5GO+haGHn{zs+gI@0Uc>qy$Kd(2uf7N` zqILgocnh^#-bOAz>#ybV;_ww}hl=or)bBOn@rv`Y@Qg5by*T(G-8bk0zZmM$_kovD z{7i>`p?H!3&y+8O?^nBh0B@)L%qQ^1VXi!T=qmsB@VQEV7H+R|U4`50WjP;p*Rg)F z*UJjS?Q^2b!*6KcUKM^y@vR>GTdgn6;nlP*cZ8qN_)mg&(l{RsAEEVP4E(g_;}m#% z?d#rvx77Gw24A84H^Pf(9PWbeQG7cHk5|8+g4e6$`r~)_qMXkEfiIUAcr1HA?o#`d zfp-XY=_8l35}B@@Enn@K)=9;-{t%oyn6-bcQtWeEly@sb;m{FUDaO|;P!i))!-BF zbNSSV+vk)$4xgrZ*9o3a{o50MK=FA9{HW58gSS(^OoLaE&xaRPd#-@@*SOjQFE0Na z-dOYW5PXi>^EAAa`uz(0@B^+rgPLaVuOO{E1>sk7xpZaW7c@^FfPbv=KMX&wIM5V+ zRB@vNyoSbeH~4YoGYH;7=|{mcRIf?!7qp+B3*V@9VF`S^;>mjW$%?LhcES_YZr{L{ zs5~d(2eiIlf=^JKzXg9${hPm8_I_-wd`iI+BV4-s;ctXGe+Yg;?eHjkuiEVi_$8Gy z9{!iwr$78*tw+znSE~Fk!Y?WAy$YYGc7BJh`LYJSKd-CrR`_C#!~O8YAea6qyo3A# z+}>|+13p*f&(qxHXL0g~%2^D4L2)%49+AVHUjtqzxAPcyH$9JQ1wX2I{xtjvJumJJ z_x~y6tVbHWh2qZy_*3fl8F2eMmkZ(NRh|#v?G^t&fiG6Q_P}o_pYP#6YrdR??^8Zk z;dQhwSwwIlR{0F8z7<;e5`&ecXNZ z4)gl|71TcM3_OqO72Gm=`U#4wRp9eAt{T7_DGodf-=XoDB=@F?N1>W8BapsZs4GWC zfO}o2FzI^<9_*6)rUbZG-_o}44R9|XZ9{x-z_kqe76rJMPX%3gd4PNQJmLT6Jyyb7 zIrgm!a4(;Rk?sdu0^G}|yV7rmca`s!Tf4PXyPbePBfk=mk9S@B`)aq5K34e`Q-N)q zSo@a`aIc&rl|CFkSRN7Jf$df^z`cByDSb5jEqT2F_wu={b)j*9d-?29`sVP@<#7S- z4cTCMy8!p{w{h|;{3kuX=oR4Jb&n{Ye(>+*gXGpAmaPc$gaCUjC<*ekS~s z{59miRQ@h}tb8Z@octX8w!C1R`^LsYZN=@Gt&(bToFHGNf?eB&7#yZw=l9i9=&&eb8)zaHMje<|naZUIF9Y@2z z(s5n5jh_ba8#-x zbC%CUc{EC zFY=}EtMU)vnew&p9620pgxlZY-Y)k}SJEsAm3tQG55i-0+z)R14PVsYVf|AR68&FO zQ{2~H_FYO+zl5mNr1Vr@RQH6`1YcC*;K9DAEbX3@IHYHM@8li>{6EY3J|QtNC26P~ z^&8NwU+=-G*^?)vBqaAt@|!y&CAsJSOw+G-a*`$Rm&3mGI6mvR+kpQ4lal>KN*<7! z6xB4YL)F2l3EleYxM%W^sDUX11}3GX4pUK+dd2rhN$8)X2Kaw|3H6`v^@YVT%Pv;m zq^h6IEw0&d8UHul7B<#EUk56Hyr*ODX`Yvr7gN25wr@T!?s*;yKT=>fgw3 zce;Lh1$W+LmBStV_k26{;_IEx&l~Pi+_Z%HYS%aRh7m52^`l(c7gV=|`pUFj{eGwV z&)MWou=Bn8d+VBA-|C<0H|FV`X`iE}r!O95J(%`Izh;?btaNQu{>O0wlKIB_)8DE5 zyH);@8dzTWgZ=;Pd@KJfzj>FaZa?sU?>+2uwpQ5&#qq!ATd@}S{Z8jUrG>emCH!B` zUuoy-=k}#%J@;Kv1AVpZ?5h{2?fbx_!*zb3dEYbb=YGrM{}&juy>z2>zV*Ln-UH3# zJLxwsPo8h@^PB3O6!75rKl*=mr~W&!*`3r(=X(9;wS}E;{dcEpd#A)c;{ES`{-+9i x+fQ$8<@w&2X6*5k?{a + +#include + +#if defined(HAVE_LIB_XAW) +#include +#elif defined(HAVE_LIB_XAW3D) +#include +#elif defined(HAVE_LIB_XAW3DXFT) +#include +#elif defined(HAVE_LIB_NEXTAW) +#include +#elif defined(HAVE_LIB_XAWPLUS) +#include +#endif + +#if defined(HAVE_XKBQUERYEXTENSION) +#include +#include +#endif + +#include +#include +#include +#include + +/* + * The scrollbar's border overlaps the border of the vt100 window. If there + * is no border for the vt100, there can be no border for the scrollbar. + */ +#define SCROLLBAR_BORDER(xw) (TScreenOf(xw)->scrollBarBorder) +#if OPT_TOOLBAR +#define ScrollBarBorder(xw) (BorderWidth(xw) ? SCROLLBAR_BORDER(xw) : 0) +#else +#define ScrollBarBorder(xw) SCROLLBAR_BORDER(xw) +#endif + +/* Event handlers */ + +static void ScrollTextTo PROTO_XT_CALLBACK_ARGS; +static void ScrollTextUpDownBy PROTO_XT_CALLBACK_ARGS; + +/* Resize the text window for a terminal screen, modifying the + * appropriate WM_SIZE_HINTS and taking advantage of bit gravity. + */ +void +DoResizeScreen(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + int border = 2 * screen->border; + int min_wide = border + screen->fullVwin.sb_info.width; + int min_high = border; + XtGeometryResult geomreqresult; + Dimension reqWidth, reqHeight, repWidth, repHeight; +#ifndef NO_ACTIVE_ICON + VTwin *saveWin = WhichVWin(screen); + + /* all units here want to be in the normal font units */ + WhichVWin(screen) = &screen->fullVwin; +#endif /* NO_ACTIVE_ICON */ + + /* + * I'm going to try to explain, as I understand it, why we + * have to do XGetWMNormalHints and XSetWMNormalHints here, + * although I can't guarantee that I've got it right. + * + * In a correctly written toolkit program, the Shell widget + * parses the user supplied geometry argument. However, + * because of the way xterm does things, the VT100 widget does + * the parsing of the geometry option, not the Shell widget. + * The result of this is that the Shell widget doesn't set the + * correct window manager hints, and doesn't know that the + * user has specified a geometry. + * + * The XtVaSetValues call below tells the Shell widget to + * change its hints. However, since it's confused about the + * hints to begin with, it doesn't get them all right when it + * does the SetValues -- it undoes some of what the VT100 + * widget did when it originally set the hints. + * + * To fix this, we do the following: + * + * 1. Get the sizehints directly from the window, going around + * the (confused) shell widget. + * 2. Call XtVaSetValues to let the shell widget know which + * hints have changed. Note that this may not even be + * necessary, since we're going to right ahead after that + * and set the hints ourselves, but it's good to put it + * here anyway, so that when we finally do fix the code so + * that the Shell does the right thing with hints, we + * already have the XtVaSetValues in place. + * 3. We set the sizehints directly, this fixing up whatever + * damage was done by the Shell widget during the + * XtVaSetValues. + * + * Gross, huh? + * + * The correct fix is to redo VTRealize, VTInitialize and + * VTSetValues so that font processing happens early enough to + * give back responsibility for the size hints to the Shell. + * + * Someday, we hope to have time to do this. Someday, we hope + * to have time to completely rewrite xterm. + */ + + TRACE(("DoResizeScreen\n")); + +#if 1 /* ndef nothack */ + /* + * NOTE: the hints and the XtVaSetValues() must match. + */ + TRACE(("%s@%d -- ", __FILE__, __LINE__)); + TRACE_WM_HINTS(xw); + getXtermSizeHints(xw); + + xtermSizeHints(xw, ScrollbarWidth(screen)); + + /* These are obsolete, but old clients may use them */ + xw->hints.width = MaxCols(screen) * FontWidth(screen) + xw->hints.min_width; + xw->hints.height = MaxRows(screen) * FontHeight(screen) + xw->hints.min_height; +#if OPT_MAXIMIZE + /* assure single-increment resize for fullscreen */ + if (xw->work.ewmh[0].mode) { + xw->hints.width_inc = 1; + xw->hints.height_inc = 1; + } +#endif /* OPT_MAXIMIZE */ +#endif + + XSetWMNormalHints(screen->display, VShellWindow(xw), &xw->hints); + + reqWidth = (Dimension) (MaxCols(screen) * FontWidth(screen) + min_wide); + reqHeight = (Dimension) (MaxRows(screen) * FontHeight(screen) + min_high); + +#if OPT_MAXIMIZE + /* compensate for fullscreen mode */ + if (xw->work.ewmh[0].mode) { + Screen *xscreen = DefaultScreenOfDisplay(xw->screen.display); + reqWidth = (Dimension) WidthOfScreen(xscreen); + reqHeight = (Dimension) HeightOfScreen(xscreen); + ScreenResize(xw, reqWidth, reqHeight, &xw->flags); + } +#endif /* OPT_MAXIMIZE */ + + TRACE(("...requesting screensize chars %dx%d, pixels %dx%d\n", + MaxRows(screen), + MaxCols(screen), + reqHeight, reqWidth)); + + geomreqresult = REQ_RESIZE((Widget) xw, reqWidth, reqHeight, + &repWidth, &repHeight); + + if (geomreqresult == XtGeometryAlmost) { + TRACE(("...almost, retry screensize %dx%d\n", repHeight, repWidth)); + geomreqresult = REQ_RESIZE((Widget) xw, repWidth, + repHeight, NULL, NULL); + } + + if (geomreqresult != XtGeometryYes) { + /* The resize wasn't successful, so we might need to adjust + our idea of how large the screen is. */ + TRACE(("...still no (%d) - resize the core-class\n", geomreqresult)); + xw->core.widget_class->core_class.resize((Widget) xw); + } +#if 1 /* ndef nothack */ + /* + * XtMakeResizeRequest() has the undesirable side-effect of clearing + * the window manager's hints, even on a failed request. This would + * presumably be fixed if the shell did its own work. + */ + if (xw->hints.flags + && repHeight + && repWidth) { + xw->hints.height = repHeight; + xw->hints.width = repWidth; + TRACE_HINTS(&xw->hints); + XSetWMNormalHints(screen->display, VShellWindow(xw), &xw->hints); + } +#endif + XSync(screen->display, False); /* synchronize */ + if (xtermAppPending()) + xevents(xw); + +#ifndef NO_ACTIVE_ICON + WhichVWin(screen) = saveWin; +#endif /* NO_ACTIVE_ICON */ +} + +static Widget +CreateScrollBar(XtermWidget xw, int x, int y, int height) +{ + Widget result; + Arg args[6]; + + XtSetArg(args[0], XtNx, x); + XtSetArg(args[1], XtNy, y); + XtSetArg(args[2], XtNheight, height); + XtSetArg(args[3], XtNreverseVideo, xw->misc.re_verse); + XtSetArg(args[4], XtNorientation, XtorientVertical); + XtSetArg(args[5], XtNborderWidth, ScrollBarBorder(xw)); + + result = XtCreateWidget("scrollbar", scrollbarWidgetClass, + (Widget) xw, args, XtNumber(args)); + XtAddCallback(result, XtNscrollProc, ScrollTextUpDownBy, 0); + XtAddCallback(result, XtNjumpProc, ScrollTextTo, 0); + return (result); +} + +void +ScrollBarReverseVideo(Widget scrollWidget) +{ + XtermWidget xw = getXtermWidget(scrollWidget); + + if (xw != 0) { + SbInfo *sb = &(TScreenOf(xw)->fullVwin.sb_info); + Arg args[4]; + Cardinal nargs = XtNumber(args); + + /* + * Remember the scrollbar's original colors. + */ + if (sb->rv_cached == False) { + XtSetArg(args[0], XtNbackground, &(sb->bg)); + XtSetArg(args[1], XtNforeground, &(sb->fg)); + XtSetArg(args[2], XtNborderColor, &(sb->bdr)); + XtSetArg(args[3], XtNborderPixmap, &(sb->bdpix)); + XtGetValues(scrollWidget, args, nargs); + sb->rv_cached = True; + sb->rv_active = 0; + } + + sb->rv_active = !(sb->rv_active); + if (sb->rv_active) { + XtSetArg(args[0], XtNbackground, sb->fg); + XtSetArg(args[1], XtNforeground, sb->bg); + } else { + XtSetArg(args[0], XtNbackground, sb->bg); + XtSetArg(args[1], XtNforeground, sb->fg); + } + nargs = 2; /* don't set border_pixmap */ + if (sb->bdpix == XtUnspecifiedPixmap) { + /* if not pixmap then pixel */ + if (sb->rv_active) { + /* keep border visible */ + XtSetArg(args[2], XtNborderColor, args[1].value); + } else { + XtSetArg(args[2], XtNborderColor, sb->bdr); + } + nargs = 3; + } + XtSetValues(scrollWidget, args, nargs); + } +} + +void +ScrollBarDrawThumb(XtermWidget xw, int mode) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->scrollWidget != 0) { + int thumbTop, thumbHeight, totalHeight; + +#if USE_DOUBLE_BUFFER + if (resource.buffered) { + if (mode == 1) { + screen->buffered_sb++; + return; + } else if (mode == 2) { + if (screen->buffered_sb == 0) + return; + } + } + screen->buffered_sb = 0; +#else + (void) mode; +#endif + + thumbTop = ROW2INX(screen, screen->savedlines); + thumbHeight = MaxRows(screen); + totalHeight = thumbHeight + screen->savedlines; + + XawScrollbarSetThumb(screen->scrollWidget, + ((float) thumbTop) / (float) totalHeight, + ((float) thumbHeight) / (float) totalHeight); + } +} + +void +ResizeScrollBar(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->scrollWidget != 0) { + int height = screen->fullVwin.height + screen->border * 2; + int width = screen->scrollWidget->core.width; + int ypos = -ScrollBarBorder(xw); +#ifdef SCROLLBAR_RIGHT + int xpos = ((xw->misc.useRight) + ? (screen->fullVwin.fullwidth - + screen->scrollWidget->core.width - + BorderWidth(screen->scrollWidget)) + : -ScrollBarBorder(xw)); +#else + int xpos = -ScrollBarBorder(xw); +#endif + + TRACE(("ResizeScrollBar at %d,%d %dx%d\n", ypos, xpos, height, width)); + + XtConfigureWidget( + screen->scrollWidget, + (Position) xpos, + (Position) ypos, + (Dimension) width, + (Dimension) height, + BorderWidth(screen->scrollWidget)); + ScrollBarDrawThumb(xw, 1); + } +} + +void +WindowScroll(XtermWidget xw, int top, Bool always) +{ + TScreen *screen = TScreenOf(xw); + + (void) always; +#if OPT_SCROLL_LOCK + if (screen->allowScrollLock && (screen->scroll_lock && !always)) { + if (screen->scroll_dirty) { + screen->scroll_dirty = False; + ScrnRefresh(xw, 0, 0, MaxRows(screen), MaxCols(screen), False); + } + } else +#endif + { + int i; + + if (top < -screen->savedlines) { + top = -screen->savedlines; + } else if (top > 0) { + top = 0; + } + + if ((i = screen->topline - top) != 0) { + int lines; + int scrolltop, scrollheight, refreshtop; + + if (screen->cursor_state) + HideCursor(); + lines = i > 0 ? i : -i; + if (lines > MaxRows(screen)) + lines = MaxRows(screen); + scrollheight = screen->max_row - lines + 1; + if (i > 0) + refreshtop = scrolltop = 0; + else { + scrolltop = lines; + refreshtop = scrollheight; + } + scrolling_copy_area(xw, scrolltop, scrollheight, -i); + screen->topline = top; + + ScrollSelection(screen, i, True); + + xtermClear2(xw, + OriginX(screen), + OriginY(screen) + refreshtop * FontHeight(screen), + (unsigned) Width(screen), + (unsigned) (lines * FontHeight(screen))); + ScrnRefresh(xw, refreshtop, 0, lines, MaxCols(screen), False); + +#if OPT_BLINK_CURS || OPT_BLINK_TEXT + RestartBlinking(xw); +#endif + } + } + ScrollBarDrawThumb(xw, 1); +} + +#ifdef SCROLLBAR_RIGHT +/* + * Adjust the scrollbar position if we're asked to turn on scrollbars for the + * first time (or after resizing) after the xterm is already running. That + * makes the window grow after we've initially configured the scrollbar's + * position. (There must be a better way). + */ +void +updateRightScrollbar(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (xw->misc.useRight + && screen->fullVwin.fullwidth < xw->core.width) + XtVaSetValues(screen->scrollWidget, + XtNx, screen->fullVwin.fullwidth - BorderWidth(screen->scrollWidget), + (XtPointer) 0); +} +#endif + +void +ScrollBarOn(XtermWidget xw, Bool init) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->fullVwin.sb_info.width || IsIcon(screen)) + return; + + TRACE(("ScrollBarOn(init %s)\n", BtoS(init))); + if (init) { /* then create it only */ + if (screen->scrollWidget == 0) { + /* make it a dummy size and resize later */ + screen->scrollWidget = CreateScrollBar(xw, + -ScrollBarBorder(xw), + -ScrollBarBorder(xw), + 5); + if (screen->scrollWidget == NULL) { + Bell(xw, XkbBI_MinorError, 0); + } + } + } else if (!screen->scrollWidget || !XtIsRealized((Widget) xw)) { + Bell(xw, XkbBI_MinorError, 0); + Bell(xw, XkbBI_MinorError, 0); + } else { + + ResizeScrollBar(xw); + xtermAddInput(screen->scrollWidget); + XtRealizeWidget(screen->scrollWidget); + TRACE_TRANS("scrollbar", screen->scrollWidget); + + screen->fullVwin.sb_info.rv_cached = False; + + screen->fullVwin.sb_info.width = (screen->scrollWidget->core.width + + BorderWidth(screen->scrollWidget)); + + TRACE(("setting scrollbar width %d = %d + %d\n", + screen->fullVwin.sb_info.width, + screen->scrollWidget->core.width, + BorderWidth(screen->scrollWidget))); + + ScrollBarDrawThumb(xw, 1); + DoResizeScreen(xw); + +#ifdef SCROLLBAR_RIGHT + updateRightScrollbar(xw); +#endif + + XtMapWidget(screen->scrollWidget); + update_scrollbar(); + if (screen->visbuf) { + xtermClear(xw); + Redraw(); + } + } +} + +void +ScrollBarOff(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (!screen->fullVwin.sb_info.width || IsIcon(screen)) + return; + + TRACE(("ScrollBarOff\n")); + if (XtIsRealized((Widget) xw)) { + XtUnmapWidget(screen->scrollWidget); + screen->fullVwin.sb_info.width = 0; + DoResizeScreen(xw); + update_scrollbar(); + if (screen->visbuf) { + xtermClear(xw); + Redraw(); + } + } else { + Bell(xw, XkbBI_MinorError, 0); + } +} + +/* + * Toggle the visibility of the scrollbars. + */ +void +ToggleScrollBar(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (IsIcon(screen)) { + Bell(xw, XkbBI_MinorError, 0); + } else { + TRACE(("ToggleScrollBar{{\n")); + if (screen->fullVwin.sb_info.width) { + ScrollBarOff(xw); + } else { + ScrollBarOn(xw, False); + } + update_scrollbar(); + TRACE(("...ToggleScrollBar}}\n")); + } +} + +/*ARGSUSED*/ +static void +ScrollTextTo( + Widget scrollbarWidget, + XtPointer client_data GCC_UNUSED, + XtPointer call_data) +{ + XtermWidget xw = getXtermWidget(scrollbarWidget); + + if (xw != 0) { + float *topPercent = (float *) call_data; + TScreen *screen = TScreenOf(xw); + int thumbTop; /* relative to first saved line */ + int newTopLine; + + /* + * screen->savedlines : Number of offscreen text lines, + * MaxRows(screen) : Number of onscreen text lines, + */ + thumbTop = (int) (*topPercent + * (float) (screen->savedlines + MaxRows(screen))); + newTopLine = thumbTop - screen->savedlines; + WindowScroll(xw, newTopLine, True); + } +} + +/*ARGSUSED*/ +static void +ScrollTextUpDownBy( + Widget scrollbarWidget, + XtPointer client_data GCC_UNUSED, + XtPointer call_data) +{ + XtermWidget xw = getXtermWidget(scrollbarWidget); + + if (xw != 0) { + long pixels = (long) call_data; + + TScreen *screen = TScreenOf(xw); + int rowOnScreen, newTopLine; + + rowOnScreen = (int) (pixels / FontHeight(screen)); + if (rowOnScreen == 0) { + if (pixels < 0) + rowOnScreen = -1; + else if (pixels > 0) + rowOnScreen = 1; + } + newTopLine = ROW2INX(screen, rowOnScreen); + WindowScroll(xw, newTopLine, True); + } +} + +/* + * assume that b is alphabetic and allow plural + */ +static int +CompareWidths(const char *a, const char *b, int *modifier) +{ + int result; + char ca, cb; + + *modifier = 0; + if (!a || !b) + return 0; + + for (;;) { + ca = x_toupper(*a); + cb = x_toupper(*b); + if (ca != cb || ca == '\0') + break; /* if not eq else both nul */ + a++; + b++; + } + if (cb != '\0') + return 0; + + if (ca == 'S') + ca = *++a; + + switch (ca) { + case '+': + case '-': + *modifier = (ca == '-' ? -1 : 1) * atoi(a + 1); + result = 1; + break; + + case '\0': + result = 1; + break; + + default: + result = 0; + break; + } + return result; +} + +static long +params_to_pixels(TScreen *screen, String *params, Cardinal n) +{ + int mult = 1; + const char *s; + int modifier; + + switch (n > 2 ? 2 : n) { + case 2: + s = params[1]; + if (CompareWidths(s, "PAGE", &modifier)) { + mult = (MaxRows(screen) + modifier) * FontHeight(screen); + } else if (CompareWidths(s, "HALFPAGE", &modifier)) { + mult = ((MaxRows(screen) + modifier) * FontHeight(screen)) / 2; + } else if (CompareWidths(s, "PIXEL", &modifier)) { + mult = 1; + } else { + /* else assume that it is Line */ + mult = FontHeight(screen); + } + mult *= atoi(params[0]); + TRACE(("params_to_pixels(%s,%s) = %d\n", params[0], params[1], mult)); + break; + case 1: + mult = atoi(params[0]) * FontHeight(screen); /* lines */ + TRACE(("params_to_pixels(%s) = %d\n", params[0], mult)); + break; + default: + mult = screen->scrolllines * FontHeight(screen); + TRACE(("params_to_pixels() = %d\n", mult)); + break; + } + return mult; +} + +static long +AmountToScroll(Widget w, String *params, Cardinal nparams) +{ + long result = 0; + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TScreen *screen = TScreenOf(xw); + if (nparams <= 2 + || screen->send_mouse_pos == MOUSE_OFF) { + result = params_to_pixels(screen, params, nparams); + } + } + return result; +} + +static void +AlternateScroll(Widget w, long amount) +{ + XtermWidget xw; + TScreen *screen; + + if ((xw = getXtermWidget(w)) != 0 && + (screen = TScreenOf(xw)) != 0 && + screen->alternateScroll && screen->whichBuf) { + ANSI reply; + + amount /= FontHeight(screen); + memset(&reply, 0, sizeof(reply)); + reply.a_type = ((xw->keyboard.flags & MODE_DECCKM) + ? ANSI_SS3 + : ANSI_CSI); + if (amount > 0) { + reply.a_final = 'B'; + } else { + amount = -amount; + reply.a_final = 'A'; + } + while (amount-- > 0) { + unparseseq(xw, &reply); + } + } else { + ScrollTextUpDownBy(w, (XtPointer) 0, (XtPointer) amount); + } +} + +/*ARGSUSED*/ +void +HandleScrollTo( + Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *nparams) +{ + XtermWidget xw; + TScreen *screen; + + if ((xw = getXtermWidget(w)) != 0 && + (screen = TScreenOf(xw)) != 0 && + *nparams > 0) { + long amount; + int value; + int to_top = (screen->topline - screen->savedlines); + if (!x_strcasecmp(params[0], "begin")) { + amount = to_top * FontHeight(screen); + } else if (!x_strcasecmp(params[0], "end")) { + amount = -to_top * FontHeight(screen); + } else if ((value = atoi(params[0])) >= 0) { + amount = (value + to_top) * FontHeight(screen); + } else { + amount = 0; + } + AlternateScroll(w, amount); + } +} + +/*ARGSUSED*/ +void +HandleScrollForward( + Widget xw, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *nparams) +{ + long amount; + + if ((amount = AmountToScroll(xw, params, *nparams)) != 0) { + AlternateScroll(xw, amount); + } +} + +/*ARGSUSED*/ +void +HandleScrollBack( + Widget xw, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *nparams) +{ + long amount; + + if ((amount = -AmountToScroll(xw, params, *nparams)) != 0) { + AlternateScroll(xw, amount); + } +} + +#if OPT_SCROLL_LOCK +#define SCROLL_LOCK_LED 3 + +#ifdef HAVE_XKBQUERYEXTENSION +/* + * Check for Xkb on client and server. + */ +static int +have_xkb(Display *dpy) +{ + static int initialized = -1; + + if (initialized < 0) { + int xkbmajor = XkbMajorVersion; + int xkbminor = XkbMinorVersion; + int xkbopcode, xkbevent, xkberror; + + initialized = 0; + if (XkbLibraryVersion(&xkbmajor, &xkbminor) + && XkbQueryExtension(dpy, + &xkbopcode, + &xkbevent, + &xkberror, + &xkbmajor, + &xkbminor)) { + TRACE(("we have Xkb\n")); + initialized = 1; +#if OPT_TRACE + { + XkbDescPtr xkb; + unsigned int mask; + + xkb = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd); + if (xkb != NULL) { + int n; + + TRACE(("XkbGetKeyboard ok\n")); + for (n = 0; n < XkbNumVirtualMods; ++n) { + if (xkb->names->vmods[n] != 0) { + char *modStr = XGetAtomName(xkb->dpy, + xkb->names->vmods[n]); + if (modStr != 0) { + XkbVirtualModsToReal(xkb, + (unsigned) (1 << n), + &mask); + TRACE((" name[%d] %s (%#x)\n", n, modStr, mask)); + } + } + } + XkbFreeKeyboard(xkb, 0, True); + } + } +#endif + } + } + return initialized; +} + +static Boolean +getXkbLED(Display *dpy, const char *name, Boolean *result) +{ + Atom my_atom; + Boolean success = False; + Bool state; + + if (have_xkb(dpy)) { + my_atom = XInternAtom(dpy, name, False); + if ((my_atom != None) && + XkbGetNamedIndicator(dpy, my_atom, NULL, &state, NULL, NULL)) { + *result = (Boolean) state; + success = True; + } + } + + return success; +} + +/* + * Use Xkb if we have it (still unreliable, but slightly better than hardcoded). + */ +static Boolean +showXkbLED(Display *dpy, const char *name, Bool enable) +{ + Atom my_atom; + Boolean result = False; + + if (have_xkb(dpy)) { + my_atom = XInternAtom(dpy, name, False); + if ((my_atom != None) && + XkbGetNamedIndicator(dpy, my_atom, NULL, NULL, NULL, NULL) && + XkbSetNamedIndicator(dpy, my_atom, True, enable, False, NULL)) { + result = True; + } + } + + return result; +} +#endif + +/* + * xlsatoms agrees with this list. However Num/Caps lock are generally + * unusable due to special treatment in X. They are used here for + * completeness. + */ +static const char *led_table[] = +{ + "Num Lock", + "Caps Lock", + "Scroll Lock" +}; + +static Boolean +xtermGetLED(TScreen *screen, Cardinal led_number) +{ + Display *dpy = screen->display; + Boolean result = False; + +#ifdef HAVE_XKBQUERYEXTENSION + if (!getXkbLED(dpy, led_table[led_number - 1], &result)) +#endif + { + XKeyboardState state; + unsigned long my_bit = (unsigned long) (1 << (led_number - 1)); + + XGetKeyboardControl(dpy, &state); + + result = (Boolean) ((state.led_mask & my_bit) != 0); + } + + TRACE(("xtermGetLED %d:%s\n", led_number, BtoS(result))); + return result; +} + +/* + * Display the given LED, preferably independent of keyboard state. + */ +void +xtermShowLED(TScreen *screen, Cardinal led_number, Bool enable) +{ + TRACE(("xtermShowLED %d:%s\n", led_number, BtoS(enable))); + if ((led_number >= 1) && (led_number <= XtNumber(led_table))) { + Display *dpy = screen->display; + +#ifdef HAVE_XKBQUERYEXTENSION + if (!showXkbLED(dpy, led_table[led_number - 1], enable)) +#endif + { + XKeyboardState state; + XKeyboardControl values; + unsigned long use_mask; + unsigned long my_bit = (unsigned long) (1 << (led_number - 1)); + + XGetKeyboardControl(dpy, &state); + use_mask = state.led_mask; + if (enable) { + use_mask |= my_bit; + } else { + use_mask &= ~my_bit; + } + + if (state.led_mask != use_mask) { + values.led = (int) led_number; + values.led_mode = enable; + XChangeKeyboardControl(dpy, KBLed | KBLedMode, &values); + } + } + } +} + +void +xtermClearLEDs(TScreen *screen) +{ + Display *dpy = screen->display; + XKeyboardControl values; + + TRACE(("xtermClearLEDs\n")); +#ifdef HAVE_XKBQUERYEXTENSION + ShowScrollLock(screen, False); +#endif + memset(&values, 0, sizeof(values)); + XChangeKeyboardControl(dpy, KBLedMode, &values); +} + +void +ShowScrollLock(TScreen *screen, Bool enable) +{ + xtermShowLED(screen, SCROLL_LOCK_LED, enable); +} + +void +GetScrollLock(TScreen *screen) +{ + if (screen->allowScrollLock) + screen->scroll_lock = xtermGetLED(screen, SCROLL_LOCK_LED); +} + +void +SetScrollLock(TScreen *screen, Bool enable) +{ + if (screen->allowScrollLock) { + if (screen->scroll_lock != enable) { + TRACE(("SetScrollLock %s\n", BtoS(enable))); + screen->scroll_lock = (Boolean) enable; + ShowScrollLock(screen, enable); + } + } +} + +/* ARGSUSED */ +void +HandleScrollLock(Widget w, + XEvent *event GCC_UNUSED, + String *params, + Cardinal *param_count) +{ + XtermWidget xw; + + if ((xw = getXtermWidget(w)) != 0) { + TScreen *screen = TScreenOf(xw); + + if (screen->allowScrollLock) { + + switch (decodeToggle(xw, params, *param_count)) { + case toggleOff: + SetScrollLock(screen, False); + break; + case toggleOn: + SetScrollLock(screen, True); + break; + case toggleAll: + SetScrollLock(screen, !screen->scroll_lock); + break; + } + } + } +} +#endif diff --git a/ports/xterm/xterm-359/scrollbar.o b/ports/xterm/xterm-359/scrollbar.o new file mode 100644 index 0000000000000000000000000000000000000000..285c23adce920ca51ffd9e7ca2851380669bfb43 GIT binary patch literal 105856 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 BOkV&1 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/sinstall.sh b/ports/xterm/xterm-359/sinstall.sh new file mode 100755 index 0000000..fa85ec7 --- /dev/null +++ b/ports/xterm/xterm-359/sinstall.sh @@ -0,0 +1,198 @@ +#!/bin/sh +# $XTermId: sinstall.sh,v 1.18 2010/03/06 16:19:13 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2008,2010 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Install program setuid if the installer is running as root, and if xterm is +# already installed on the system with setuid privilege. This is a safeguard +# for ordinary users installing xterm for themselves on systems where the +# setuid is not needed to access a PTY, but only for things like utmp. +# +# Options: +# u+s, g+s as in chmod +# -u, -g and -m as in install. If any options are given, $3 is ignored. +# +# Parameters: +# $1 = program to invoke as "install" +# $2 = program to install +# $3 = previously-installed program, for reference +# $4 = final installed-path, if different from reference + +trace=: +trace=echo + +# override locale... +# (otherwise GNU ls displays date column in a locale-dependent manner). +LANG=C; export LANG +LANGUAGE=C; export LANGUAGE +LC_ALL=C; export LC_ALL +LC_CTYPE=C; export LC_CTYPE + +OPTS_SUID= +OPTS_SGID= +OPTS_MODE= +OPTS_USR= +OPTS_GRP= + +while test $# != 0 +do + case $1 in + -*) + OPT="$1" + shift + if test $# != 0 + then + case $OPT in + -u) OPTS_USR="$1"; shift;; + -g) OPTS_GRP="$1"; shift;; + -m) OPTS_MODE="$1"; shift;; + esac + else + break + fi + ;; + u+s) shift; OPTS_SUID=4000;; + g+s) shift; OPTS_SGID=2000;; + *) break + ;; + esac +done + +SINSTALL="$1" +SRC_PROG="$2" +REF_PROG="$3" +DST_PROG="$4" + +test -z "$SINSTALL" && SINSTALL=install +test -z "$SRC_PROG" && SRC_PROG=xterm +test -z "$REF_PROG" && REF_PROG=/usr/bin/X11/xterm +test -z "$DST_PROG" && DST_PROG="$REF_PROG" + +test -n "$OPTS_SUID" && test -n "$OPTS_USR" && REF_PROG= +test -n "$OPTS_SGID" && test -n "$OPTS_GRP" && REF_PROG= + +echo checking for presumed installation-mode + +PROG_SUID= +PROG_SGID= +PROG_MODE= +PROG_USR= +PROG_GRP= + +if test -z "$REF_PROG" ; then + $trace "... reference program not used" +elif test -f "$REF_PROG" ; then + cf_option="-l -L" + MYTEMP=${TMPDIR-/tmp}/sinstall$$ + + # Expect listing to have fields like this: + #-r--r--r-- 1 user group 34293 Jul 18 16:29 pathname + ls $cf_option $REF_PROG + ls $cf_option $REF_PROG >$MYTEMP + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest <$MYTEMP + $trace "... if \"$cf_rest\" is null, try the ls -g option" + if test -z "$cf_rest" ; then + cf_option="$cf_option -g" + ls $cf_option $REF_PROG + ls $cf_option $REF_PROG >$MYTEMP + read cf_mode cf_links cf_usr cf_grp cf_size cf_date1 cf_date2 cf_date3 cf_rest <$MYTEMP + fi + rm -f $MYTEMP + + # If we have a pathname, and the date fields look right, assume we've + # captured the group as well. + $trace "... if \"$cf_rest\" is null, we do not look for group" + if test -n "$cf_rest" ; then + cf_test=`echo "${cf_date2}${cf_date3}" | sed -e 's/[0-9:]//g'` + $trace "... if we have date in proper columns ($cf_date1 $cf_date2 $cf_date3), \"$cf_test\" is null" + if test -z "$cf_test" ; then + PROG_USR=$cf_usr; + PROG_GRP=$cf_grp; + fi + fi + $trace "... derived user \"$PROG_USR\", group \"$PROG_GRP\" of previously-installed $SRC_PROG" + + $trace "... see if mode \"$cf_mode\" has s-bit set" + case ".$cf_mode" in #(vi + .???s??s*) #(vi + $trace "... both setuid/setgid" + PROG_SUID=4000 + PROG_SGID=2000 + ;; + .???s*) #(vi + $trace "... setuid" + PROG_SUID=4000 + PROG_GRP= + ;; + .??????s*) + $trace "... setgid" + PROG_SGID=2000 + PROG_USR= + ;; + esac + PROG_MODE=`echo ".$cf_mode" | sed -e 's/^..//' -e 's/rw./7/g' -e 's/r-./5/g' -e 's/---/0/g' -e 's/--[sxt]/1/g' -e 's/[^0-7]//g'` +fi + +# passed-in options override the reference +test -n "$OPTS_SUID" && PROG_SUID="$OPTS_SUID" +test -n "$OPTS_SGID" && PROG_SGID="$OPTS_SGID" +test -n "$OPTS_MODE" && PROG_MODE="$OPTS_MODE" +test -n "$OPTS_USR" && PROG_USR="$OPTS_USR" +test -n "$OPTS_GRP" && PROG_GRP="$OPTS_GRP" + +# we always need a mode +test -z "$PROG_MODE" && PROG_MODE=755 + +if test -n "${PROG_USR}${PROG_GRP}" ; then + cf_uid=`id | sed -e 's/^[^=]*=//' -e 's/(.*$//'` + cf_usr=`id | sed -e 's/^[^(]*(//' -e 's/).*$//'` + cf_grp=`id | sed -e 's/^.* gid=[^(]*(//' -e 's/).*$//'` + $trace "... installing $SRC_PROG as user \"$cf_usr\", group \"$cf_grp\"" + if test "$cf_uid" != 0 ; then + PROG_SUID= + PROG_SGID= + PROG_USR="" + PROG_GRP="" + fi + test "$PROG_USR" = "$cf_usr" && PROG_USR="" + test "$PROG_GRP" = "$cf_grp" && PROG_GRP="" +fi + +test -n "${PROG_SUID}${PROG_SGID}" && PROG_MODE=`expr $PROG_MODE % 1000` +test -n "$PROG_SUID" && PROG_MODE=`expr $PROG_SUID + $PROG_MODE` +test -n "$PROG_SGID" && PROG_MODE=`expr $PROG_SGID + $PROG_MODE` + +test -n "$PROG_USR" && PROG_USR="-o $PROG_USR" +test -n "$PROG_GRP" && PROG_GRP="-g $PROG_GRP" + +echo "$SINSTALL -m $PROG_MODE $PROG_USR $PROG_GRP $SRC_PROG $DST_PROG" +eval "$SINSTALL -m $PROG_MODE $PROG_USR $PROG_GRP $SRC_PROG $DST_PROG" diff --git a/ports/xterm/xterm-359/svg.c b/ports/xterm/xterm-359/svg.c new file mode 100644 index 0000000..b4b5c61 --- /dev/null +++ b/ports/xterm/xterm-359/svg.c @@ -0,0 +1,285 @@ +/* $XTermId: svg.c,v 1.17 2020/06/02 23:24:31 tom Exp $ */ + +/* + * Copyright 2017-2019,2020 Thomas E. Dickey + * Copyright 2015-2016,2017 Jens Schweikhardt + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the sale, + * use or other dealings in this Software without prior written + * authorization. + */ + +#include +#include + +#define MakeDim(color) \ + color = (unsigned short) ((2 * (unsigned) color) / 3) + +#define RGBPCT(c) \ + ((double)c.red / 655.35), \ + ((double)c.green / 655.35), \ + ((double)c.blue / 655.35) + +#define CELLW 10 +#define CELLH 20 + +static void dumpSvgHeader(XtermWidget xw, FILE *fp); +static void dumpSvgScreen(XtermWidget xw, FILE *fp); +static void dumpSvgLine(XtermWidget xw, int row, FILE *fp); +static void dumpSvgFooter(XtermWidget, FILE *fp); + +static int rows = 0; +static int cols = 0; +static Dimension bw = 0; /* borderWidth */ +static int ib = 0; /* internalBorder */ + +void +xtermDumpSvg(XtermWidget xw) +{ + char *saveLocale; + FILE *fp; + + TRACE(("xtermDumpSvg...\n")); + saveLocale = xtermSetLocale(LC_NUMERIC, "C"); + fp = create_printfile(xw, ".svg"); + if (fp != 0) { + dumpSvgHeader(xw, fp); + dumpSvgScreen(xw, fp); + dumpSvgFooter(xw, fp); + fclose(fp); + } + xtermResetLocale(LC_NUMERIC, saveLocale); + TRACE(("...xtermDumpSvg done\n")); +} + +static void +dumpSvgHeader(XtermWidget xw, FILE *fp) +{ + TScreen *s = TScreenOf(xw); + + rows = s->bot_marg - s->top_marg + 1; + cols = MaxCols(s); + bw = BorderWidth(xw); + ib = s->border; + + fputs("\n", fp); + fputs("\n", fp); + fputs("\n", 2 * (bw + ib) + cols * CELLW, 2 * + (bw + ib) + + rows * CELLH); + fprintf(fp, " %s Screen Dump\n", xtermVersion()); + fprintf(fp, + " \n", + 0.80 * CELLH); + xevents(xw); +} + +static void +dumpSvgScreen(XtermWidget xw, FILE *fp) +{ + TScreen *s = TScreenOf(xw); + int row; + + fprintf(fp, " \n", + cols * CELLW + 2 * (bw + ib), rows * CELLH + 2 * (bw + ib), + PixelToCSSColor(xw, xw->core.border_pixel)); + fprintf(fp, " \n", + bw, bw, + MaxCols(s) * CELLW + 2 * ib, + (unsigned) (rows * CELLH + 2 * ib), + PixelToCSSColor(xw, xw->old_background)); + + for (row = s->top_marg; row <= s->bot_marg; ++row) { + fprintf(fp, " \n", row); + dumpSvgLine(xw, row, fp); + } +} + +static void +dumpSvgLine(XtermWidget xw, int row, FILE *fp) +{ + TScreen *s = TScreenOf(xw); + int inx = ROW2INX(s, row); + LineData *ld = getLineData(s, inx); + int col, sal, i; /* sal: same attribute length */ + + if (ld == 0) + return; + + for (col = 0; col < MaxCols(s); col += sal) { + XColor fgcolor, bgcolor; + + /* Count how many consecutive cells have the same color & attributes. */ + for (sal = 1; col + sal < MaxCols(s); ++sal) { +#if OPT_ISO_COLORS + if (!isSameCColor(ld->color[col], ld->color[col + sal])) + break; +#endif + if (ld->attribs[col] != ld->attribs[col + sal]) + break; + } + + fgcolor.pixel = xw->old_foreground; + bgcolor.pixel = xw->old_background; +#if OPT_ISO_COLORS + if (ld->attribs[col] & FG_COLOR) { + Pixel fg = extract_fg(xw, ld->color[col], ld->attribs[col]); +#if OPT_DIRECT_COLOR + if (ld->attribs[col] & ATR_DIRECT_FG) + fgcolor.pixel = fg; + else +#endif + fgcolor.pixel = s->Acolors[fg].value; + } + if (ld->attribs[col] & BG_COLOR) { + Pixel bg = extract_bg(xw, ld->color[col], ld->attribs[col]); +#if OPT_DIRECT_COLOR + if (ld->attribs[col] & ATR_DIRECT_BG) + bgcolor.pixel = bg; + else +#endif + bgcolor.pixel = s->Acolors[bg].value; + } +#endif + + XQueryColor(xw->screen.display, xw->core.colormap, &fgcolor); + XQueryColor(xw->screen.display, xw->core.colormap, &bgcolor); + xevents(xw); + + if (ld->attribs[col] & BLINK) { + /* White on red. */ + fgcolor.red = fgcolor.green = fgcolor.blue = 65535u; + bgcolor.red = 65535u; + bgcolor.green = bgcolor.blue = 0u; + } +#if OPT_WIDE_ATTRS + if (ld->attribs[col] & ATR_FAINT) { + MakeDim(fgcolor.red); + MakeDim(fgcolor.green); + MakeDim(fgcolor.blue); + } +#endif + if (ld->attribs[col] & INVERSE) { + XColor tmp = fgcolor; + fgcolor = bgcolor; + bgcolor = tmp; + } + + /* Draw the background rectangle. */ + fprintf(fp, " \n", RGBPCT(bgcolor)); + + /* Now the . */ + /* + * SVG: Rendering text strings into a given rectangle is a challenge. + * Some renderers accept and do the right thing with the 'textLength' + * attribute, while others ignore it. The only predictable way to place + * (even monospaced) text properly is to do it character by character. + */ + + fprintf(fp, " attribs[col] & BOLD) + fprintf(fp, " font-weight='bold'"); +#if OPT_WIDE_ATTRS + if (ld->attribs[col] & ATR_ITALIC) + fprintf(fp, " font-style='italic'"); +#endif + fprintf(fp, " fill='rgb(%.2f%%, %.2f%%, %.2f%%)'>\n", RGBPCT(fgcolor)); + + for (i = 0; i < sal; ++i) { + IChar chr = ld->charData[col + i]; + + if (chr == ' ') + continue; + fprintf(fp, " ", bw + ib + (col + i) * + CELLW, bw + ib + row * CELLH + (CELLH * 3) / 4); +#if OPT_WIDE_CHARS + if (chr > 127) { + /* Ignore hidden characters. */ + if (chr != HIDDEN_CHAR) { + Char temp[10]; + *convertToUTF8(temp, chr) = 0; + fputs((char *) temp, fp); + } + } else +#endif + switch (chr) { + case 0: + fputc(' ', fp); + break; + case '&': + fputs("&", fp); + break; + case '<': + fputs("<", fp); + break; + case '>': + fputs(">", fp); + break; + default: + fputc((int) chr, fp); + } + fprintf(fp, "\n"); + xevents(xw); + } + fprintf(fp, " \n"); + xevents(xw); + +#define HLINE(x) \ + fprintf(fp, " \n", \ + bw + ib + col * CELLW, bw + ib + row * CELLH + CELLH - (x), \ + bw + ib + (col + sal) * CELLW, bw + ib + row * CELLH + CELLH - (x), \ + RGBPCT(fgcolor)) + + /* Now the line attributes. */ + if (ld->attribs[col] & UNDERLINE) { + HLINE(4); + } +#if OPT_WIDE_ATTRS + if (ld->attribs[col] & ATR_STRIKEOUT) { + HLINE(9); + } + if (ld->attribs[col] & ATR_DBL_UNDER) { + HLINE(3); + HLINE(1); + } +#endif + xevents(xw); + } + xevents(xw); +} + +static void +dumpSvgFooter(XtermWidget xw, FILE *fp) +{ + fputs(" \n\n", fp); + xevents(xw); +} diff --git a/ports/xterm/xterm-359/svg.o b/ports/xterm/xterm-359/svg.o new file mode 100644 index 0000000000000000000000000000000000000000..36b951cab06cd1b59a95ab82d5a3b434930f5ef0 GIT binary patch literal 74336 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 +#include + +#define TAB_INDEX(n) ((n) >> TAB_BITS_SHIFT) +#define TAB_MASK(n) (1U << ((n) & (TAB_BITS_WIDTH-1))) + +#define SET_TAB(tabs,n) UIntSet(tabs[TAB_INDEX(n)], TAB_MASK(n)) +#define CLR_TAB(tabs,n) UIntClr(tabs[TAB_INDEX(n)], TAB_MASK(n)) +#define TST_TAB(tabs,n) (tabs[TAB_INDEX(n)] & (unsigned) TAB_MASK(n)) + +/* + * places tabstops at only every 8 columns + */ +void +TabReset(Tabs tabs) +{ + int i; + + TabZonk(tabs); + + for (i = 0; i < MAX_TABS; i += 8) + TabSet(tabs, i); +} + +/* + * places a tabstop at col + */ +void +TabSet(Tabs tabs, int col) +{ + if (OkTAB(col)) { + SET_TAB(tabs, col); + } +} + +/* + * clears a tabstop at col + */ +void +TabClear(Tabs tabs, int col) +{ + if (OkTAB(col)) { + CLR_TAB(tabs, col); + } +} + +/* + * returns the column of the next tabstop + * (or MAX_TABS - 1 if there are no more). + * A tabstop at col is ignored. + */ +static int +TabNext(XtermWidget xw, Tabs tabs, int col) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->curses && screen->do_wrap && (xw->flags & WRAPAROUND)) { + xtermIndex(xw, 1); + set_cur_col(screen, 0); + col = 0; + ResetWrap(screen); + } + for (++col; col < MAX_TABS; ++col) + if (TST_TAB(tabs, col)) + return (col); + + return (MAX_TABS - 1); +} + +/* + * returns the column of the previous tabstop + * (or 0 if there are no more). + * A tabstop at col is ignored. + */ +static int +TabPrev(Tabs tabs, int col) +{ + for (--col; col >= 0; --col) + if ((col < MAX_TABS) && TST_TAB(tabs, col)) + return (col); + + return (0); +} + +/* + * Tab to the next stop, returning true if the cursor moved + */ +Bool +TabToNextStop(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int saved_column = screen->cur_col; + int next = TabNext(xw, xw->tabs, screen->cur_col); + int max = LineMaxCol(screen, getLineData(screen, screen->cur_row)); + + if (IsLeftRightMode(xw)) + max = TScreenOf(xw)->rgt_marg; + if (next > max) + next = max; + set_cur_col(screen, next); + + return (screen->cur_col > saved_column); +} + +/* + * Tab to the previous stop, returning true if the cursor moved + */ +Bool +TabToPrevStop(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int saved_column = screen->cur_col; + int next_column = TabPrev(xw->tabs, screen->cur_col); + + if (xw->flags & ORIGIN) { + int left = ScrnLeftMargin(xw); + if (next_column < left) + next_column = left; + } + + set_cur_col(screen, next_column); + + return (screen->cur_col < saved_column); +} + +/* + * clears all tabs + */ +void +TabZonk(Tabs tabs) +{ + memset(tabs, 0, sizeof(*tabs) * TAB_ARRAY_SIZE); +} + +/* + * Check if a tab is set for the given column + */ +Bool +TabIsSet(Tabs tabs, int col) +{ + return TST_TAB(tabs, col) ? True : False; +} diff --git a/ports/xterm/xterm-359/tabs.o b/ports/xterm/xterm-359/tabs.o new file mode 100644 index 0000000000000000000000000000000000000000..feade6760527ee9cd477d5749ee33614346c0e9f GIT binary patch literal 59184 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 z z3@1MfqbRXB~~dDEBcDq33%0}otWAP~&PQ5N(cEr9$Co~DKyJ~-XcVS}<&pzLLc_{_P;r4f-(PO^wu)r8JZ=wtMk%jUfK06LM zZ62h=SfqV%CCuZ*5t=W&Gj>1}>PtFbln;vfM(9xfp(SCT4+S*lQ51 OB1sm)68 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 VW!=}F-~5&;^5}C(^#ecu{{Y%1e+d8p literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/tektests/aitest.tek b/ports/xterm/xterm-359/tektests/aitest.tek new file mode 100644 index 0000000..254c4ec --- /dev/null +++ b/ports/xterm/xterm-359/tektests/aitest.tek @@ -0,0 +1 @@ + 1,`g ],`g?C3`t0@$`z0@,cg-F,cj-F,`m-G,lo-G,lr-G,lu-G,mx-G,m{-G,j~-G-ka-G-kd-G-hg-H-ej-H-fm-H-gp-H-as-I-bv-I-cy-I-m{-J-n~-J.la-K.id-K.kg-K.ej-L.gm-L.ep-M.cs-M.av-N.lx-O.j{-O.h~-P/ga-P/bd-Q/`g-R/oi-R/jl-S/eo-T/dr-U/cu-U/nw-V/jz-W/e}-X0``-Y0lb-Z0he-[0gh-[0ck-\0km-]0gp-^0cs-_0hu.A0dx.B0`{.C0i}.D1e`.E1nb.F1ge.G1`h.I1hj.J1bm.K1ko.L1`r.N1it.O1cw.P1hy.R1b|.S1h~.U2ba.V2gc.W2ne.Y2`h.[2jj.\2ll.^2go._2jq/A2ls/C2cv/D2fx/F2iz/H2l|/J2`/L3ga/M3gc/O3je/Q3ng/S3ni/U3nk/W3bn/Y3cp/[3cr/]3`t0@,cg-F,cd-F,`a-G+d~-G+d{-G+dx-G+eu-G+er-G+jo-G+kl-G+ki-G+hf-H+mc-H+n`-H*o}-H*a{-I*bx-I*cu-I*er-J*fo-J*dl-K*ii-K*kf-K*mc-L*o`-L)m}-M)c{-M)ax-N)du-O)jr-O)ho-P)ol-P)bj-Q)`g-R)gd-R)ja-S(m~-T(l{-U(cy-U(fv-V(js-W(mp-X(`n-Y(dk-Z(hh-[(oe-[(cc-\(k`-]'o}-^'c{-_'hx.A'lu.B'`s.C'ip.D'mm.E'fk.F'oh.G'`f.I'hc.J'ba.K&k~.L&`|.N&iy.O&cw.P&ht.R&br.S&ho.U&bm.V&oj.W&fh.Y&`f.[&jc.\&da.^%o~._%j|/A%dz/C%cx/D%nu/F%is/H%dq/J%`o/L%ol/M%oj/O%jh/Q%ff/S%fd/U%fb/W%b`/Y$c~/[$c|/]$`z0@,ag2Y,ad2Y,`a2Y+d~2Y+d{2Y+dx2Y+gu2X+gr2X+jo2X+il2X+ii2X+hf2X+oc2W+n`2W*m}2W*c{2V*bx2V*au2V*gr2U*fo2U*dl2U*ki2T*if2T*oc2S*m`2S)o}2R)a{2R)cx2Q)du2Q)jr2P)ho2P)ml2O)bj2N)`g2N)ed2M)ja2L(o~2K(l{2K(ay2J(fv2I(js2H(op2G(`n2G(dk2F(hh2E(me2D(ac2C(i`2B'm}2A'a{2@'hx1_'lu1^'`s1]'kp1['om1Z'fk1Y'mh1X'`f1W'hc1V'ba1T&i~1S&`|1R&ky1P&aw1O&ht1N&br1L&ho1K&bm1I&mj1H&fh1F&`f1E&jc1C&da1B%m~1@%j|0^%dz0]%ax0[%nu0Y%ks0W%dq0V%`o0T%ml0R%mj0P%jh0N%ff0L%fd0J%fb0H%b`0F$a~0D$a|0B$`z0@,ag2Y,aj2Y,`m2Y,lo2Y,lr2Y,lu2Y,ox2X,o{2X,j~2X-ia2X-id2X-hg2X-gj2W-fm2W-ep2W-cs2V-bv2V-ay2V-o{2U-n~2U.la2U.kd2T.ig2T.gj2S.em2S.gp2R.as2R.cv2Q.lx2Q.j{2P.h~2P/ea2O/bd2N/`g2N/mi2M/jl2L/go2K/dr2K/au2J/nw2I/jz2H/g}2G0``2G0lb2F0he2E0eh2D0ak2C0im2B0ep2A0as2@0hu1_0dx1^0`{1]0k}1[1g`1Z1nb1Y1ee1X1`h1W1hj1V1bm1T1io1S1`r1R1kt1P1aw1O1hy1N1b|1L1h~1K2ba1I2ec1H2ne1F2`h1E2jj1C2ll1B2eo1@2jq0^2ls0]2av0[2fx0Y2kz0W2l|0V2`0T3ea0R3ec0P3je0N3ng0L3ni0J3nk0H3bn0F3ap0D3ar0B3`t0@,ag*O,aj*O,am*O,bp*O,bs*O,gv*O,dy*P,e|*P,f*P-db*Q-ee*Q-gh*Q-ek*R-gn*R-eq*S-gt*S-fw*T-ez*U-d}*V.g`*V.fc*W.ef*X.ai*Y.al*Z.ao*[.ar*\.au*].mw*^.nz*_.o}+@/h`+B/ic+C/ff+D/gi+E/al+G/co+H/mq+J/ot+K/iw+M/dz+O/b}+P0a`+R0lb+T0ke+U0gh+W0bk+Y0nm+[0jp+]0fs+_0nu,A0jx,C0g{,E0l},H1i`,J1bc,L1oe,N1eh,Q1nj,S1hm,V1bp,X1ir,[1cu,]1jw-@1`z-C1g|-E1o~-H2fa-K2jc-N2bf-Q2fh-T2jj-W2bm-Z2go-]2hq.A2ms.D2bv.G2`x.K2ez.N2k|.Q2i~.U3h`.Y3nb.\3md/@3lf/D3oh/G3oj/K3kl/O3kn/S3gp/W3gr/[3`t0@,ag*O,ad*O,aa*O+b~*O+b{*O+ow*O+lt*P+mq*P+nn*P+lk*Q+mh*Q+oe*Q+mb*R*o*R*m|*S*oy*S*nv*T*ms*U*lp*V*om*V*nj*W*mg*X*ae*Y*ab*Z)a*[)a|*\)ay*])ev*^)fs*_)gp+@)hm+B)ij+C)ng+D)od+E)ab+G(c+H(e|+J(gy+K(iv+M(ls+O(bq+P(an+R(dk+T(kh+U(oe+W(bc+Y(f`+['j}+]'nz+_'fx,A'ju,C'or,E'dp,H'im,J'bk,L'gh,N'me,Q'fc,S'h`,V&b~,X&i{,[&cy,]&jv-@&`t-C&oq-E&go-H&nl-K&jj-N&bh-Q&ne-T&jc-W&ba-Z%o~-]%h|.A%ez.D%bx.G%`v.K%ms.N%kq.Q%io.U%hm.Y%fk.\%ei/@%dg/D%ge/G%gc/K%ka/O$k/S$o}/W$o{/[$`z0@,cg5P,cd5P,ca5P+b~5P+b{5P+mw5P+lt5P+oq5O+nn5O+lk5O+oh5N+me5N+ob5M*m5M*o|5L*my5L*nv5K*os5J*lp5J*mm5I*nj5H*og5G*ce5F*cb5E)c5D)c|5C)cy5B)gv5A)fs5@)ep4_)hm4^)kj4\)ng4[)md4Z)cb4X(a4W(g|4U(ey4T(kv4R(ls4Q(bq4O(cn4M(dk4L(ih4J(me4H(bc4F(f`4D'j}4B'nz4@'fx3^'ju3\'mr3Z'dp3X'km3U'bk3S'eh3Q'oe3N'fc3L'h`3J&b~3G&k{3D&ay3B&jv2_&`t2]&mq2Z&eo2W&nl2T&jj2Q&bh2N&ne2K&jc2H&ba2E%m~2B%h|1_%gz1[%bx1X%`v1U%os1Q%iq1N%ko1J%hm1G%fk1C%gi0_%dg0\%ee0X%ec0T%ia0P$i0L$m}0H$m{0D$`z0@,cg5P,cj5P,cm5P,bp5P,bs5P,ev5P,dy5P,g|5O,f5O-db5O-ge5N-eh5N-gk5M-en5M-gq5L-et5L-fw5K-gz5J-d}5J.e`5I.fc5H.gf5G.ci5F.cl5E.co5D.cr5C.cu5B.ow5A.nz5@.m}4_/h`4^/kc4\/ff4[/ei4Z/cl4X/ao4W/oq4U/mt4T/kw4R/dz4Q/b}4O0c`4M0lb4L0ie4J0eh4H0bk4F0nm4D0jp4B0fs4@0nu3^0jx3\0e{3Z0l}3X1k`3U1bc3S1me3Q1gh3N1nj3L1hm3J1bp3G1kr3D1au3B1jw2_1`z2]1e|2Z1m~2W2fa2T2jc2Q2bf2N2fh2K2jj2H2bm2E2eo2B2hq1_2os1[2bv1X2`x1U2gz1Q2i|1N2k~1J3h`1G3nb1C3od0_3lf0\3mh0X3mj0T3il0P3in0L3ep0H3er0D3`t0@,bg'Z,gj'Z,gm'Z,hp'[,ls'[,nv'[,cz'[,e}'\-f`'\-ic']-kf']-ni'^-am'_-`p(@-gs(@-gv(A-ky(B-k|(C-o(D.lb(F.me(G.bi(H.`l(J.ao(K.gr(L.eu(N.dx(P.g{(Q.f~(S/ea(U/dd(W/dg(Y/dj([/dm(]/ep(_/es)A/cv)C/`y)F/a|)H/o~)J0ma)M0kd)O0jg)R0ej)U0`m)X0oo)Z0kr)]0gu*@0cx*C0oz*F0h}*J1e`*M1bc*P1ke*S1eh*W1oj*Z1em*^1`p+B1kr+E1bu+I1iw+M1`z+Q1d|+U1l~+Y2aa+]2ic,A2ne,E2`h,J2ij,N2ol,R2mn,W2cq,[2fs-@2du-E2hw-J2ky-N2k{-S2k}-X2k-]3ka.B3dc.H3ae.M3cg.R3lh.X3jj.]3dl/C3om/H3jo/N3aq/T3hr/Z3`t0@,bg'Z,oc'Z,o`'Z+h}'[+dz'[+fw'[+ct'[+mp'\+nm'\+ij']+kg']+fd'^+aa'_*`~(@*oz(@*ow(A*kt(B*kq(C*gn(D*dk(F*eh(G*be(H*`b(J)a(K)o{(L)mx(N)lu(P)or(Q)no(S)ml(U)li(W)lf(Y)lc([)l`(](m}(_(mz)A(cx)C(`u)F(ar)H(go)J(el)M(ki)O(jf)R(mc)U(`a)X'g~)Z'k{)]'ox*@'cv*C'gs*F'hp*J'mm*M'bk*P'kh*S'me*W'gc*Z'm`*^&`~+B&k{+E&by+I&iv+M&`t+Q&lq+U&do+Y&am+]&ij,A&fh,E&`f,J&ic,N&ga,R%e,W%c},[%nz-@%lx-E%hv-J%kt-N%kr-S%kp-X%kn-]%kl.B%lj.H%ai.M%cg.R%de.X%jc.]%la/C%g`/H$j~/N$a}/T$h{/Z$`z0@,bg8E,mc8E,m`8E+h}8E+dz8E+fw8D+at8D+op8C+nm8C+kj8B+ig8B+fd8A+ca8@*`~8@*mz7_*mw7^*it7]*iq7\*en7[*dk7Z*gh7X*be7W*`b7V)c7T)m{7S)ox7Q)lu7P)mr7N)no7L)ol7J)li7I)lf7G)lc7E)l`7C(o}7@(oz6^(ax6\(`u6Z(cr6W(eo6U(gl6R(ii6P(jf6M(oc6J(`a6H'e~6E'i{6B'mx5_'av5\'es5Y'hp5V'om5R'bk5O'ih5L'oe5H'ec5E'o`5A&`~4^&i{4Z&by4V&kv4R&`t4O&lq4K&do4G&cm4B&kj3^&fh3Z&`f3V&kc3Q&ea3M%g3H%a}3D%nz2_%lx2[%hv2V%it2Q%ir2L%ip2G%in2B%il1]%lj1X%ci1R%ag1M%de1H%jc1B%la0]%e`0W$j~0Q$c}0K$h{0F$`z0@,bg8E,ej8E,em8E,hp8E,ls8E,nv8D,az8D,g}8C-f`8C-kc8B-if8B-ni8A-cm8@-`p8@-es7_-ev7^-iy7]-i|7\-m7[.lb7Z.oe7X.bi7W.`l7V.co7T.er7S.gu7Q.dx7P.e{7N.f~7L/ga7J/dd7I/dg7G/dj7E/dm7C/gp7@/gs6^/av6\/`y6Z/c|6W/m~6U0oa6R0id6P0jg6M0gj6J0`m6H0mo6E0ir6B0eu5_0ax5\0mz5Y0h}5V1g`5R1bc5O1ie5L1gh5H1mj5E1gm5A1`p4^1ir4Z1bu4V1kw4R1`z4O1d|4K1l~4G2ca4B2kc3^2ne3Z2`h3V2kj3Q2ml3M2on3H2aq3D2fs2_2du2[2hw2V2iy2Q2i{2L2i}2G2i2B3ia1]3dc1X3ce1R3ag1M3lh1H3jj1B3dl0]3mm0W3jo0Q3cq0K3hr0F3`t0@,bg%J,jj%J,om%J,gq%J,it%K,bx%K,d{%L,j~%L-ab%M-de%N-oh%N-cl%O-ko%P-or%Q-`v%S-ey%T-n|%U.``%W.fc%X.hf%Z.oi%[.fm%].jp%_.ms&A.nv&C.bz&E.g}&G/h`&J/nc&L/of&N/bj&Q/dm&T/gp&V/fs&Y/jv&\/jy&_/j|'B/j'E0kb'H0ie'L0jh'O0hk'S0jn'V0eq'Z0dt'^0cw(A0oy(E0o|(I0k(M1gb(Q1`e(V1ng(Z1gj(^1am)C1ko)G1fr)L1mt)Q1dw)V1ly)[1d|*@1h~*E2`a*J2ec*O2ne*T2`h*Z2fj*_2dl+E2jn+J2mp+P2lr+V2ot+[2ov,A2ox,G2oz,M2h|,T2i~,Z3f`-@3cb-F3mc-M3ge-S3ag-Z3hh.A3cj.G3jk.N3nl.U3an.\3io/C3np/J3nq/Q3cs/X3`t0@,bg%J,jc%J,g`%J+o|%J+iy%K+bv%K+lr%L+jo%L+al%M+lh%N+ge%N+cb%O*k~%P*g{%Q*`x%S*mt%T*fq%U*`n%W*nj%X*hg%Z*gd%[*n`%])j}%_)ez&A)fw&C)bt&E)op&G)hm&J)fj&L)gg&N)bd&Q)l`&T(o}&V(nz&Y(jw&\(jt&_(jq'B(jn'E(kk'H(ih'L(je'O(hb'S'j'V'm|'Z'ly'^'cw(A'gt(E'gq(I'kn(M'ok(Q'`i(V'ff(Z'oc(^'aa)C&k~)G&n{)L&ey)Q&lv)V&dt)[&lq*@&ho*E&`m*J&mj*O&fh*T&`f*Z&nc*_&la+E%j+J%e}+P%d{+V%gy+[%gw,A%gu,G%gs,M%hq,T%io,Z%nm-@%cl-F%ej-M%oh-S%ag-Z%he.A%cd.G%jb.N%fa.U%a`.\$i~/C$f}/J$f|/Q$c{/X$`z0@,bg:U,jc:U,e`:U+m|:U+ky:T+bv:T+lr:T+jo:S+cl:R+lh:R+ee:Q+ab:P*i~:O*e{:N*`x:M*ot:K*fq:J*`n:I*nj:G*hg:F*ed:D*n`:B)j}:@)gz9^)fw9\)bt9Z)mp9X)hm9V)fj9S)eg9Q)bd9N)l`9L(m}9I(nz9F(jw9C(jt9@(jq8](jn8Z(ik8W(kh8S(je8P(hb8M'j8I'o|8E'ly8B'aw7^'et7Z'eq7V'in7R'mk7N'`i7J'ff7E'mc7A'ca6\&i~6X&n{6S&gy6N&lv6J&dt6E&lq6@&ho5[&`m5V&oj5P&fh5K&`f5F&nc5@&la4[%j4U%g}4O%d{4J%ey4D%ew3^%eu3X%es3R%hq3L%ko3E%nm2_%al2Y%gj2R%mh2L%cg2E%he1_%ad1X%jb1Q%fa1J%c`1C$k~0\$f}0U$f|0N$a{0G$`z0@,bg:U,jj:U,mm:U,eq:U,kt:T,bx:T,d{:T,j~:S-cb:R-de:R-mh:Q-al:P-io:O-mr:N-`v:M-gy:K-n|:J.``:I.fc:G.hf:F.mi:D.fm:B.jp:@.os9^.nv9\.bz9Z.e}9X/h`9V/nc9S/mf9Q/bj9N/dm9L/ep9I/fs9F/jv9C/jy9@/j|8]/j8Z0ib8W0ke8S0jh8P0hk8M0jn8I0gq8E0dt8B0aw7^0my7Z0m|7V0i7R1eb7N1`e7J1ng7E1ej7A1cm6\1io6X1fr6S1ot6N1dw6J1ly6E1d|6@1h~5[2`a5V2gc5P2ne5K2`h5F2fj5@2dl4[2jn4U2op4O2lr4J2mt4D2mv3^2mx3X2mz3R2h|3L2k~3E3f`2_3ab2Y3oc2R3ee2L3cg2E3hh1_3aj1X3jk1Q3nl1J3cn1C3ko0\3np0U3nq0N3as0G3`t0@,ag#@,mj#@,fn#@,cr#@,lu#A,jy#A,a}#B-l`#C-kd#C-ch#D-ok#E-ho#G-as#H-ov#I-ez#K-l}#M.ka#N.be#P.jh#R.fl#T.oo#V.ds#Y.nv#[.dz#^.o}$@/fa$C/id$F/ah$I/ik$L/nn$O/cr$R/iu$V/ox$Y/a|$]/d%A0kb%D0oe%H0oh%L0`l%Q0ao%U0fr%Y0du%^0fx&B0d{&G0g~&K1ca&P1cd&U1of&Z1ki&_1hl'E1ao'J1oq'O1it'U1cw'Z1ny(@1e|(F1m~(L2`a(R2ic(X2me(^2fh)D2kj)J2il)Q2on)W2mp)^2cs*D2bu*K2aw*R2mx*Y2lz+@2h|+G2e~+N3a`+U3ja+\3cc,C3hd,K3bf,R3hg,Z3nh-A3`j-I3gk-P3jl-X3im.@3hn.H3ho.P3kp.W3gq._3cr/G3or/O3hs/X3`t0@,ag#@,ec#@+n#@+c|#@+dx#A+jt#A+aq#B+dm#C+ki#C+cf#D+gb#E*h~#G*a{#H*gw#I*ms#K*dp#M*kl#N*bi#P*je#R*na#T)g~#V)lz#Y)fw#[)ls#^)gp$@)nl$C)ii$F)af$I)ib$L(f$O(c|$R(ix$V(gu$Y(ar$](ln%A(kk%D(gh%H(ge%L(`b%Q'a%U'n{%Y'lx%^'nu&B'lr&G'oo&K'cm&P'cj&U'gg&Z'kd&_'ha'E&a'J&g|'O&iy'U&cw'Z&ft(@&mq(F&eo(L&`m(R&ij(X&eh(^&ne)D&kc)J&ia)Q%g)W%e})^%c{*D%by*K%aw*R%eu*Y%ds+@%hq+G%mo+N%an+U%jl+\%ck,C%hi,K%bh,R%hf,Z%fe-A%`d-I%ob-P%ja-X%i`.@$h.H$h~.P$k}.W$o|._$c|/G$g{/O$hz/X$`z0@,cg<_,gc<_+n<_+a|<_+dx<_+jt<^+cq<]+dm<]+ii<\+af<[+eb_+af>^+`b>]*o}>[*my>Z*nu>X*nq>V*om>T*ni>R*me>P*la>N)m}>K)oy>H)cv>E)`r>C)gn=_)jj=\)if=Y)ob=U(`=R(i{=N(nw=J(bt=F(ip=B(`m<^(ji_-ah>^-`l>]-gp>[-et>Z-fx>X-f|>V.g`>T.fd>R.eh>P.dl>N.ep>K.gt>H.cx>E.`|>C.o=_/jc=\/ig=Y/gk=U/`o=R/ir=N/fv=J/bz=F/i}=B0`a<^0jdY180*ji=Q7bd=Q7bg=B200*hi;[7`d;[7`g;L220*ji:D7bd:D7bg9U240*hi8N7`d8N7`g7_260*ki6W7cd6W7cg6H280*ii5A7ad5A7ag4R300*ki3J7cd3J7cg2[320*ii1T7ad1T7ag1E340*hi/^7`d/^7`g/O 0*ki.G7cd.G7cg-X20*ii,Q7ad,Q7ag,B40*ki*Z7cd*Z7cg*K60*ii)D7ad)D7ag(U80*hi'N7`d'N7`g&_100*ji%W7bd%W7bg%H120*hi$A7`d$A7`g#R140*ji"J7bd"J7bg![160*hi T7`d T7`g E1800d.BP0f|4@0fh1PP+200f|4@1ga4@1kf4@1kk4@1lp4A1cv4@1g{4@2j`4@2me4@2dk4@2kp3_2av3_2k{3^3da3^3bg3]3nl3\3or3[3ox3Z3n~3Y4ae3X4hk3W4ar3U4ox3S4k3Q5jf3O5mm3M5cu3J5o|3G6jd3D6kl3@6cu2\6i}2X6i})K6cu)F6kl)B6hd(_5o|([5`u(Y5mm(V5hf(T4h(R4lx(P4ar(N4kk(L4ae(K3l~(J3lx(I3lr(H3ll(G3ag(F3fa(E2h{(E2av(D2hp(D2fk(C2me(C2h`(C1g{(B1cv(B1op(B1kk(B1kf(B1da(C0e|(C0bw(C0gr(C0am(D0bh(D0lb(E/o}(E/ix(F/ds(G/gn(G/ci(H/kc(I.g~(J.cy(K.hs(M.bn(N.kh(O.mb(Q-d}(S-kw(T-kq(V-hk(Y-ie([,k(],ey)@,mr)C,jl)F,cf)I+f)M+jx)Q+lq)V+oj)Z+lc*@*o|*E*`v*L*co*R*co1P*bv1W*o|1]+nc2C+oj2H+oq2M+hx2R+d2V,cf2Y,il2],mr3@,ey3C,h3F-je3H-kk3J-kq3L-kw3N-f}3P.mb3R.kh3S.an3U.js3V.cy3W.d~3Y/hc3Z/ci3Z/gn3[/fs3\/ix3]/l}3^0nb3^0`h3_0bm3_0gr3_0aw4@0f|4@/gt7US0js>O/j;_S-100js>O0jx>N0m}>M1`c>L1gh>J1im>I1lr>H1bx>F1d}>E2nb>C2ch>A2im>@2bs=^2kx=\2c~=Z3kc=X3gi=V3bo=T3`u=R3b{=O4`a=M4ag=J4em=G4ls=D4cz=@5l`<]5eg_.hf>^.hl>].dr>\.ax>[.m}>Z/ec>Y/mh>X/en>W/ms>V/dy>U/h~>T0lc>S0ci>Q0gn>P0js>O+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+ge*C+mr*B,kb*K,ih*F,mv*Q,iy*M,e|*U-gd*T-fd*_-gk+C-js*_-cr+G-lr+K.fe+Y.`o+Z.gw,K/l`,R/at,U/o,^0oe,^0jh,]0ln,R0lp,I0ln,E0mr,D0ot+\0dr+X0er+S0or+X0dv+Z0gv+T0ft+P0az+U0i{+U0h+R1be+N1ef+F1oi*^1om*Z1gm*X1`p*X1ds*T1`t*V1at*O1mr*Q1es*K1es*D1dv*A1dx)_1dv)_1ot)\1fo)[1do)Z1gv)Z1kw)\1ay)\1fx)Y1nt)P1kl)M1kp)G1gq)E+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+i`*M+ob*E+ad*@+ma)^+ge)Z+lh)V+em)S+ls)R+fy)P,hb)P,hc)T,hg)T,jg)P,hj)R,ki)V,`v)X,lx)X,hy)V-m`)U-dd)V-ii)U-lm)X-j|)Y.be)[.jm)[.nu)].l{)_/ic)^/jh)Y/dl)R/jp)N/aq)M/c})I0fe)P0if)O0ek)O0`n)R0ho)R0ap)O0et)O0lx)R0oz)G0b~)H1f`)J1cg)K1hl)I1hn)G1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1gq)E1ap)D1hn)A1hn(_1nt(Y2b`([2cb(X2ob(T2bb(L2hj(P2dn(P2ip(Q2ir(Q2kr(I2kp(G2ll(G2bj']2jj'Y2fn'W2kr'T2lz'T2n}'U3fb'U3jg'Y3fi'[3nj'[3oj'\3cj'\3jk'_3lj(C3kk(C3oj(E3gi(E3fi(H3gi(K3nj(J3bm(H3am(M3ln(N3fl(N3am(Q3am(U3oj(V3gl(X3ei(\3kd(\3eb(^2n})A2l})C3ia)D3lj)A3ep)@3et)B3hw)G3gy)I3k{)K3k|)M3f})L3e})O3a)O4n`)L4n`)N4gb)M4gc)M4ae)M4oe)M4gh)K4ig)M4ol)M4gh)M4me)O4dc)P4hg)R4ak)S4ko)T4ko)X4dp)Z4gp)T4br)Y4cr)Z4bt)[4bs)]4bs)]4`s)_4lt)_4at)^4nu)]4iz)^4f~*H5ba*H5bd*N5cb*M5ab*Q5ca*M4g~*I4e{*K4e~*O5b`*W5ca*V5bd*[5cf*Z5bf*Y5bh*Y5bf*W5bb*W5`b*V5`c*V5`d*P5`e*P5ah*M5ch*K5bk*N5ak*M5cj*K5`l*I5bm*J5cl*K5`n*P5`p*P5aq*M5bp*H5an*D5`l*A5bf)[5bk)_5ao*B5`q*E5`q*G5du*I5fu*N5et*Q5eu*U5gt*V5gt*Z5ly+C5o{+E5e+F6ib+F6oc+G6od+C6nc+A6`f+C6bf*_6kb*\6kb*X6cf*\6fg*_6eh+B6nk*Y6dn*Z6lp*V6br*W6jt*W6ou*T6dx*V7ea*O7`d*P7lc*M7gc*L7cc*L7kb*L7gb*L7na*L7fa*L7ba*L7i`*L7e`*L6m*L6e*L6`*L6h~*L6d~*L6l}*L6g}*K6nz*H6m~*B6e*B6i*B7b`*B7j`*B7ba*B7ja*B7bb*B7jb*B7bc*B7gc*B7oc*B7bd)L7nc)L7jc)L7fc)L7bc)L7bc)L7nb)L7fb)N7fb)L7ga)I7c`)I6o~)G6ky)K6kt)M6io)M6gk)I6nj)H6dh)E6he)G6ha)G5b~)H5d{)G5ly)G5cz)E5oz)E5my)D5ly)C5m{)B5b}(_5b~)@6n`(]6ed(^6dk(_6hl(V6`m(V6ho(P6np(N6fs(J6kt(E6gs(A6iy(B6e~(@6f}']6m~']6m~'Z7a`'\7ad'\7bd!_7lb!_7mb"B7mb"B7ac"B7ac"B7ec"B7ec"B7jc"B7nc"B7nc"B7bd"B7cd"C7oc"C7nc"C7jc"C7fc"C7fc"C7bc"C7mb"C7mb"C7ib"C7eb"C7eb"C7ab"C7la"C7da"C6k"B6h}"C6`|"E6a|"F6e}"G6n~"I6j}"I6`}"K6e~"L6a}"L6e{"M6d{"N6b}"M6`"O6g}"N6i|"O6g~"R6iy"P6`v"P6es"M6fp"I6io"I6gn"I6`n"H6eo"G6km"C6`l"C6gk"@6gj"@6fk"D6`m"F6kl"F6fk"F6jl"I6cn"J6il"K6kn"L6ko"N6ip"O6op"N6as"R6et"T6iu"T6iu"S6kv"V6iy"Z6a{"Z6k|"\6k}"\6e"Z7l`"\7j`"\7ad"^7cd#A7nc#A7jc#A7jc#A7ec#A7ec#A7ac#A7lb#A7lb#A7hb#A7hb#A7ja#A7ha#C6e#@6a#B6o#C7l`#D7da#F7ic#H7kc#I7oc#I7oc#I7`d#J7cd#V7jc#Y7bd#[7ob#_7`d$C7kb$C7da$C7lb$B7c`$A6j$D6c}$G6i{$I6b{$J6j|$J6e}$I6n~$I6e}$J6d}$L6b{$L6mz$N6n{$N6f$M7``$L7e`$M6n~$N6b|$O6iz$O6hz$Q6i|$R6j}$R6m~$S6k~$S6c}$R6f}$R6bw$S6dx$R6ou$R6du$R6ds$T6mp$W6ap$V6mm$U6jm$V6bo$W6ko$X6dn$Z6il$Z6lk$Y6nj$Y6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6jb$W6ja$U5j}$W5o|$X5g}$Y5n}$Y5i~$X5g$X5h$X6ba$W6ia$X6jb$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6fg$W6mf$V6`d$U6nf$U6lf$S6ke$R6be$S6`c$S6hb$U6bb$U6fc$W6fg$W6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6on$X6kn$W6ml$W6al$X6fm$Y6on$X6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6`p$S6ho$R6cm$R6gi$T6di$V6lj$V6`n$T6`p$S6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6ds$R6gs$P6cq$P6aq$Q6ko$P6io$Q6hp$R6ds$R6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6bz$O6kt$O6aw$Q6nw$P6ex$Q6bz$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6mu$O6hv$N6mu$M6ht$N6es$M6`q$N6cp$O6ht$P6it$O6mu$O6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6`|"_6ky"\6dz#A6b{#@6nz"_6`|"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6dx"_6`y"]6bx"\6ix"[6ev"[6ew"Z6ou"X6gs"X6at"Z6hr"Z6iu"]6mu"]6nu"^6`w#@6aw"^6dx"_6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6`h!]6mg!^6fi!_6hh"A6oj!_6mj!^6`h!]6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6od!Y6`f!X6ke!V6jd!W6gb!T6fc!U6od!Y6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6`d!T6kc!T6`a!R6kc!R6`d!T6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P6k`!P5e~!O6a`!O6c`!P6k`!P6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6c`!N6d`!N5e!M5g!M6c`!N5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5f~!H5a~!G5i}!H5a~!I5f~!H5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5g}!F5k|!F5i|!E5b}!D5g}!F5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5f!D5g!C5k|!A5k|!C5f!D5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5h| ]5fz [5k{ ]5h| ]5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5m{ [5`{ Z5hz Z5j{ [5m{ [5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5m{ Y5e{ X5dz Y5m{ Y5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5oz?E5fz?E5oy?F5my?G5oz?E5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5c|?@5n{?@5k{>]5mz>_5j{?@5c|?@7ad!V7bd!V7nc!V7oc!V7lc!W7lc!W7ic!W7jc!W7jc!W7gc!W7gc!W7dc!X7ec!X7ac!X7bc!X7cc!X7cc!X7lb!Y7mb!Y7mb!Y7`d![6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6jy$N6gy$L6kz$L6gz$J6`y$K6cy$I6lv$K6`v$R6ex$L6mv$O6jy$N5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5lz+G5my+D5iv+B5er+@5an*\5an*^5ak*\5aj*\5`j+E5`i+E5ai+F5`j+G5bj+H5cg+E5`g+G5bj+J5cf+K5cf+M5ak+O5cm+M5`k+K5co+M5`o+K5er+M5fs+H5gr+E5dt+G5du+E5ds+C5lz+G5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5`h*P5af*O5ae*Q5be*R5`d*T5`f*V5af*Q5`h*P2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2ct(V2bt(Y2nt(Y2gv(\2iu(^2hr)G2bq)H2no)L2gn)I2`o)T2aq)O2mq)O2nw)A2nw([2ct(V2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2bg)H2ff)H2ie)K2je)N2ff)N2ng)L2ng)J2bg)H2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2cj*G2kh*G2og*I2ei*K2aj*K2jj*J2cj*G2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2gk)R2cj)R2kh)T2hh)Z2cg)Z2ih)\2aj)\2jj)]2ei)^2di*C2gk*C2gn)\2gn)V2ll)X2hj)X2kj)V2gk)R1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1hn)G1go)E1em)B1ck)C1jj)A1hl)A1nk(_1fm(]1kl(\1mm(\1gm(Z1mm(Z1in(Z1lr(V1gq(V1or(T1ct(T1`t(T1hu(T1jy(N1ez(O1n{(N1`{(N1l{(I1`}(G1h|(E2ic'^2nb']2ic'\2fd'[2nb'Y2lb'T2ke'K2ih'I2kh'G2kj'C2dk'C2`l'A2bo&]2fs&_2`t&_2dv&_2g|&X2d|&X2l}&X2j~&U2f&U2g&T3``&T3ka&T3ha&T3eb&S3cc&R3id&Q3af&O3nj&L3fp&J3bq&H3oq&G3oq&E3dl&G3ig&K3kd&K3`c&N3ha&N3ja&N2i~&O2o}&P2mz&Q2h{&R2ey&S2ow&R2lw&R2c}&K3o`&K3cc&I3eb&I3fe&D3de&G3bf&F3hg&G3gi&E3gi&E3ik&B3am&B3lr%_3av%^3dx%]3oz%X3lz%V3d}%V4o`%R4gb%R4ec%Q4oe%P4`e%R4hf%R4kg%R4ig%Q4kf%P4dh%N4ak%M4im%M4jn%L4fp%L4`r%N4iw%K4e}%M5`d%N5ae%M5bf%N5bi%L5`m%L5bm%N5bk%N5ak%O5ai%O5cj%P5ao%Q5ap%O5er%O5bq%N5bq%L5dr%N5du%N5eu%M5es%M5ds%L5du%L5jw%J5gu%I5jv%F5iw%I5kw%C5oy%C5m{%B5f%D5d%A6lc$_6jb$]6af$\6fg$]6gg$Z6eh$Z6bm$]6nj$Y5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5bn%N5an%M5bp%H5bq%F5fr%F5hv%A5hw%A5iw%B5fu%F5et%I5fr%J5ap%M5bn%N4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4fq&L4gp&K4fq&J4br&J4cs&I4ct&I4bs&J4ct&K4fq&L4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4d})P4jz)N4ky)I4hy)E4kz)E4f|)H4g|)I4e{)K4f})L4d~)P4d})P4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4cw)E4mt)B4bt)A4as)@4ar(\4as(\4bs([4ct(Z4mt(\4bt(]4nt(_4lv)A4`v)C4lv)C4cw)E5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5cg(I5lf(G5ch(G5hg(G5cg(E5gg(C5ci(E5bj(F5`k(I5al(J5cn(J5jn(L5cm(K5cn(L5am(M5hn(N5mo(M5`p(N5kn(P5ao(Q5bo(R5bl(S5kk(T5`l(V5bj(W5kf(V5ce(X5be(_5bd(_5bd)A5bb)A5`b)C4d~)C4f~)A5`a)@5`a(_4e~(_4ky(^4kx(\4g|(\4f|([4g{(Z4e{(Z4f~([5b`([5ba(Z5ia(Y5kb(V5ab(U5ca(U4h(T5h`(T4g}(R4lv(S4at(Q4`t(P4nv(N4d{(P4e|(O5aa(Q4h}(N5a`(O5jc(P5hc(R5hb(R5ad(S5ed(U5gc(V5ed(X5ke(V5ae(U5ef(U5if(S5`f(R5ff(O5eg(M5ii(O5ei(M5bh(K5cg(I5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5gu'V5hv'X5k{'W5b}'V6e`'U6kb'T6dc'T6ld'T6be'U6jf'U6af'S6bg'S6gg'T6fh'S6gg'R6ge'R6af'P6ia'O6da'R6f`'P6a`'Q5j{'S5i}'T5b{'U5oy'T5mz'V5oy'V5hx'V5gw'V5gu'V6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6cb'J6`a'K5k'K6i`'L5d~'M5e'N5j}'N5e}'M5a{'M5gz'O5jy'P5mw'P5`v'R5ot'Q5lt'S5mu'S5ow'R5nw'Q5kx'Q5mz'P5h}'P5e{'O5d}'O5f~'O6d`'O6ma'M6cb'J7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7m`&]7jb&W7fa&W7o`&U7hb&V7nb&T7a`&Q6c&P6`~&N6e}&R6i~&R6o&T6f&U6n&X7f`&X7g`&[6m&\7m`&]2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2ik"V2bl"W2cl"X2ao"W2`o"V2dn"V2im"U2bl"U2ik"V2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2mo"T2jp"S2bq"S2`q"T2kp"T2mo"U2mo"T2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2mq"R2jq"R2hq"T2lq"T2br"R2mq"R2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2`r"O2lr"O2nr"P2fr"P2`r"O2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2gt"J2lt"K2ht"L2ct"K2gt"J/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/hg?D/kg?C/`g?C/jg?B/eg?A/de?@/fd?@/ed?A/ed?C/me?D/bg?D/hg?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-bi?D-li?C-ji?A-kg>_-`h>_-ch>]-`l>]-ol>[-dj>\-mj>[-cl>Z-om>Y-fp>Y-`q>X-as>V-cs>T-op>U-oo>U-el>X-nl>Y-ok>Y-ek>Y-lh>Z-bg>Y-ad>Y-eb>W-ba>W-o`>X,c>Z,h{>Z,hz>[,f|>]-`a?@-fa>_-ac?@-mb?A-`d?B-nd?A-de?C-eg?D-ah?D-bi?D,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,cy>W,j{>W,k{>V,c}>V,c|>T,g}>T,j}>S,l~>T,c~>R,g|>R,iz>P,mx>P,gt>L,fr>I,mp>G,io>G,lm>F,il>D,kj>B,lh>C,mh>E,ji>E,fh>F,nh>G,bh>J,hi>N,en>P,mo>P,gq>Q,fr>T,cs>T,ds>T,`t>T,mv>V,cy>W,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,cc5U,cc5Z,cc5P,cc5U-ka5U-ka5Z-ka5P-ka5U.g`5U.g`5Z.g`5P.g`5U.o~5U.o~5Z.o~5P.o~5U/k}5U/k}5Z/k}5P/k}5U0c|5U0c|5Z0c|5P0c|5U1oz5U1oz5Z1oz5P1oz5U2gy5U2gy5Z2gy5P2gy5U3cx5U3cx5Z3cx5P3cx5U4kv5U4kv5Z4kv5P4kv5U4kv5U+gd5U+ed4W*e4W+ei4W+ed4W+fd3X*f3X+fi3X+fd3X+dd2Z*d2Z+di2Z+dd2Z+ed1[*e1[+ei1[+ed1[+gd0\*g0\+gi0\+gd0\+dd/^*d/^+di/^+dd/^+fd._*f._+fi._+fd._+gd.@*g.@+gi.@+gd.@+ed-B*e-B+ei-B+ed-B+fd,C*f,C+fi,C+fd,C+fd,C+gd5U*oe5U*oe5P*oe5Z*oe5U)cg5U)cg5P)cg5Z)cg5U(kh5U(kh5P(kh5Z(kh5U'oi5U'oi5P'oi5Z'oi5U&gk5U&gk5P&gk5Z&gk5U%kl5U%kl5P%kl5Z%kl5U$cn5U$cn5P$cn5Z$cn5U#go5U#go5P#go5Z#go5U"op5U"op5P"op5Z"op5U!cr5U!cr5P!cr5Z!cr5U!cr5U4kv5U4k{5PN+fd,C*hl,FE!cr5U cy5PS+dd?H*hl>YW%`o @,cc5U,nb5T,nb5S,mb5R,ib5Q,db5P,`b5O,oa5M,ka5L,fa5K,o`5J,k`5I,``5I+h5H+`5G+h~5F+a~5E+j}5D+c}5C+g|5B+h{5B+a{5A+fz5@+ky4_+lx4_+bx4^+gw4]+iv4]+ju4\+lt4\+bt4[+ds4[+fr4Z+dq4Z+fp4Y+eo4Y+kn4X+fm4X+el4X+`k4X+cj4W+nh4W+mg4W+if4W+ie4W+ed4W+ac4W+ab4W+m`4W*n4W*k~4W*h}4X*e|4X*f{4X*cz4X*ey4Y*fx4Y*hw4Z*jv4Z*hu4[*jt4[*ls4\*bs4\*dr4]*gq4]*jp4^*lo4_*co4_*fn5@*im5A*`m5B*gl5B*nk5C*bk5D*ij5E*`j5F*ki5F*ci5G*kh5H*ch5I*og5J*fg5K*cg5L*of5M*hf5O*df5P*af5Q*me5R*ne5S*ne5T*oe5U*le5W*le5X*me5Y*af5Z*ff5[*jf5\*of5]*cg5^*dg6@*og6@*og6@*ch6A*jh6B*bi6C*ji6D*bj6E*ij6F*`k6G*kk6G*gl6H*bm6I*im6J*dn6K*co6K*no6L*hp6M*gq6M*ar6N*`s6O*ns6O*ht6P*fu6P*dv6Q*fw6Q*dx6R*ey6R*cz6R*d{6S*e|6S*j}6S*k~6S*l6T+m`6T+ab6T+ac6T+fd6T+ie6T+if6T+mg6T+lh6T+cj6S+bk6S+el6S+dm6S+kn6R+eo6R+dp6R+bq6Q+`r6Q+bs6P+`t6P+nt6O+hu6O+fv6N+gw6M+`x6M+nx6L+ky6K+dz6K+a{6J+j{6I+g|6H+l|6H+h}6G+a~6F+j~6E+c6D+k6C,c`6B,k`6A,o`6@,da6@,ka5^,oa5],bb5\,fb5[,ib5Z,mb5Y,lb5X,lb5W,cc5U$`l?@$`l?J$`l?E%`u?E%`u?@%`u?J%`j9Y 0.1"$`t9Y 2148 km#`v9YStar position#``9Yin sky plane"`j9YFrom 2:40: 0!`t9YEach 0: 1: 0+fd,C+fi,RSUN->.ke7[.di7[.na7\.ke7[-k{8@SAA.ke7[.`b7L.me7K-g~7L.`b7L-h~6\.eb6[-oz6\-h~6\-lz6L-i~6K-cw6L-lz6L-dw5\-a{5[-ks5\-dw5\-ms5L-jw5K-`p5M-ms5L-ap4\-ns4[-dl4]-ap4\-il4L-fp4K-lh4M-il4L-ai3\-nl3[-de3]-ai3\-fe3L-ci3K-ia3M-fe3L-na2\-ke2[,a~2]-na2\,b~2L-oa2K,ez2M,b~2L,kz1\,d~1\,nv1],kz1\,cw1L,lz1L,fs1M,cw1L,ds0],aw0\,ko0],ds0],lo0M,is0L,cl0M,lo0M,dl/],ap/\,kh/],dl/],ih/M,fl/L,ld/N,ih/M,ae.],nh.\,da.^,ae.],fa.M,ce.L+i}.N,fa.M+n}-],ka-\+az-^+n}-]+gz-M+`~-M+jv-N+gz-M+kv,]+dz,]+nr,^+kv,]+`s,N+mv,M+go,N+`s,N7lv @May 4 1986 Occultation of nepklem 1026 by Triton (N1)7h` @Observed from SAAO Sutherland 74" Long= -20 48 44.3 Lat= -32 22 43.46dj @13.11-magnitude star at RA= 18h 24m 16.1231s Dec=-22d 13' 22.807" + 5`t @ (1950) RA= 18h 22m 5.3070s Dec=-22d 14' 27.910" + 4l} @Closest at 2:45:30 U.T. 4hg @ Radial= 4158.7 km = 0.19"3dq @ Planet= 1600.0 km = 0.07"2`{ @ ET - UT = 56.1709 sec DE-1182ld @ P.A.= 12.7 deg.1hn @ Phase = 1.5 deg = 100.0%0dx @ Alt= 75 d, Az= -36 d0`b @ Sun alt=-30 d, Az= 90 d/lk @ Sun:127.8 d, Moon: 11.9 d.hu @ V =0.0007 "/s = 14.22 km/s-d @ D = 29.619079 A.U.-`i @Doug Mink 16: 4 Nov 11 1985-`i @ diff --git a/ports/xterm/xterm-359/tektests/usmap.tek b/ports/xterm/xterm-359/tektests/usmap.tek new file mode 100644 index 0000000000000000000000000000000000000000..0e62344631157558e0e89887cac91db3b3ca3ce2 GIT binary patch literal 6939 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 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/termcap b/ports/xterm/xterm-359/termcap new file mode 100644 index 0000000..a8869e3 --- /dev/null +++ b/ports/xterm/xterm-359/termcap @@ -0,0 +1,248 @@ +# $XTermId: termcap,v 1.88 2017/12/25 21:24:41 tom Exp $ +# +# These are termcap entries that correspond to xterm's terminfo file. +# The file is formatted using ncurses' "tic -CNx", but is not mechanically +# derived from the terminfo. +# +#------------------------------------------------------------------------------ +# Copyright 1996-2016,2017 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +#------------------------------------------------------------------------------ +# +# Note: +# termcap format is limited to 1023 characters. This set of descriptions +# is a subset of the terminfo, since not all features can be fit into +# that limit. The 'xterm' description supports color. The monochrome +# 'xterm-mono' drops color in favor of additional function keys. If you +# need both, use terminfo. +# +# The 1023-character limit applies to each entry after resolving the +# "tc=" strings. Some implementations may discount all or part of the +# formatting characters in the entry (i.e., the backslash newline tab +# colon). GNU termcap does not have this limit. +# +# I checked the limits using ncurses "captoinfo -CrTUvx", which prints +# the resolved length of each entry in a comment at the end - T.Dickey +# +xf|xterm-new|modern xterm:\ + :XT:*6=\EOF:@7=\EOF:F1=\E[23~:F2=\E[24~:K2=\EOE:Km=\E[M:\ + :k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EOS:k5=\E[15~:k6=\E[17~:\ + :k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kB=\E[Z:kH=\EOF:\ + :kI=\E[2~:kN=\E[6~:kP=\E[5~:kd=\EOB:kh=\EOH:kl=\EOD:\ + :kr=\EOC:ku=\EOA:tc=xterm-basic: +# +# This chunk is used for building the VT220/Sun/PC keyboard variants. +xb|xterm-basic|modern xterm common:\ + :am:bs:km:mi:ms:ut:xn:AX:\ + :Co#8:co#80:kn#12:li#24:pa#64:\ + :AB=\E[4%dm:AF=\E[3%dm:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\ + :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=\E(B:al=\E[L:\ + :as=\E(0:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\ + :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:\ + :ei=\E[4l:ho=\E[H:im=\E[4h:is=\E[!p\E[?3;4l\E[4l\E>\E]104^G:\ + :kD=\E[3~:ke=\E[?1l\E>:ks=\E[?1h\E=:le=^H:md=\E[1m:\ + :me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:op=\E[39;49m:\ + :rc=\E8:rs=\E[!p\E[?3;4l\E[4l\E>\E]104^G:sc=\E7:se=\E[27m:sf=^J:\ + :so=\E[7m:sr=\EM:st=\EH:te=\E[?1049l:ti=\E[?1049h:\ + :ue=\E[24m:up=\E[A:us=\E[4m:ve=\E[?12l\E[?25h:vi=\E[?25l:\ + :vs=\E[?12;25h:tc=xterm+kbs: + +# The xterm-new description has all of the features, but is not completely +# compatible with vt220. If you are using a Sun or PC keyboard, set the +# sunKeyboard resource to true: +# + maps the editing keypad +# + interprets control-function-key as a second array of keys, so a +# 12-fkey keyboard can support vt220's 20-fkeys. +# + maps numeric keypad "+" to ",". +# + uses DEC-style control sequences for the application keypad. +# +vt|xterm-vt220|xterm emulating vt220:\ + :XT:*6=\E[4~:@7=\E[4~:K2=\EOu:Km=\E[M:kB=\E[Z:kH=\E[4~:\ + :kh=\E[1~:tc=xterm-basic: + +v1|xterm-24|xterms|vs100|24x80 xterm:\ + :li#24:tc=xterm-old: +v2|xterm-65|65x80 xterm:\ + :li#65:tc=xterm-old: +vb|xterm-bold|xterm with bold for underline:\ + :so=\E[7m:us=\E[1m:tc=xterm-old: +vB|xterm-boldso|xterm with bold for standout:\ + :se=\E[m:so=\E[1m:tc=xterm-old: +vm|xterm-mono|monochrome xterm:\ + :ut@:\ + :Co@:NC@:kn#20:pa@:\ + :AB@:AF@:Sb@:Sf@:op@:st@:tc=xterm-old: +# +# Alternate terminal description that "works" for interactive shells such as +# tcsh and bash. +xn|xterm-noapp|xterm with cursor keys in normal mode:\ + :kd=\E[B:ke=\E>:kl=\E[D:kr=\E[C:ks=\E=:ku=\E[A:te@:ti@:\ + :tc=xterm: +# +# This should work for the commonly used "color xterm" variations (XFree86 +# xterm, color_xterm, nxterm, rxvt). Note that it does not set 'bce', so for +# XFree86 and rxvt, some applications that use colors will be less efficient, +# and in a few special cases (with "smart" optimization) the wrong color will +# be painted in spots. +vc|xterm-color|generic "ANSI" color xterm:\ + :Co#8:NC@:pa#64:\ + :AB=\E[4%dm:AF=\E[3%dm:ac=:op=\E[m:tc=xterm-r6: +# +# These aliases are for compatibility with the terminfo; termcap cannot provide +# the extra features such as color initialization, but termcap applications +# still want the names. +x1|xterm-16color|xterm alias:\ + :tc=xterm-new: + +x2|xterm-88color|xterm alias:\ + :Co#88:pa#7744:tc=xterm-256color: + +x3|xterm-256color|xterm alias:\ + :Co#256:pa#65536:\ + :AB=\E[48;5;%dm:AF=\E[38;5;%dm:tc=xterm-new: + +# Termcap cannot do direct-colors, but users may expect this name. +x4|xterm-direct|xterm alias:\ + :tc=xterm-256color: + +xi|xterm-nrc|xterm alias:\ + :tc=xterm: +xr|xterm-rep|xterm alias:\ + :tc=xterm: +xx|xterm-xmc|xterm alias:\ + :sg#1:tc=xterm: +# +# An 8-bit description is doable with termcap, but there are probably no +# termcap (or BSD curses) applications that are able to use it. +x8|xterm-8bit|xterm terminal emulator 8-bit controls (X Window System):\ + :am:km:mi:ms:xn:XT:\ + :co#80:it#8:li#24:\ + :AL=\233%dL:DC=\233%dP:DL=\233%dM:DO=\233%dB:IC=\233%d@:\ + :K2=\217y:Km=\233M:LE=\233%dD:RI=\233%dC:UP=\233%dA:\ + :ae=\E(B:al=\233L:as=\E(0:bl=^G:bt=\233Z:cd=\233J:ce=\233K:\ + :cl=\233H\2332J:cm=\233%i%d;%dH:cr=^M:cs=\233%i%d;%dr:\ + :ct=\2333g:dc=\233P:dl=\233M:do=^J:ei=\2334l:ho=\233H:\ + :im=\2334h:\ + :is=\E[62"p\E G\233m\233?7h\E>\E7\233?1;3;4;6l\2334l\233r\E8:\ + :k1=\23311~:k2=\23312~:k3=\23313~:k4=\23314~:k5=\23315~:\ + :k6=\23317~:k7=\23318~:k8=\23319~:k9=\23320~:kD=\2333~:\ + :kI=\2332~:kN=\2336~:kP=\2335~:kd=\217B:ke=\233?1l\E>:\ + :kh=\2331~:kl=\217D:kr=\217C:ks=\233?1h\E=:ku=\217A:le=^H:\ + :mb=\2335m:md=\2331m:me=\233m:mr=\2337m:nd=\233C:rc=\E8:\ + :sc=\E7:se=\23327m:sf=^J:so=\2337m:sr=\215:st=\210:ta=^I:\ + :te=\233?1049l:ti=\233?1049h:ue=\23324m:up=\233A:\ + :us=\2334m:vb=\233?5h\233?5l:ve=\233?25l\233?25h:\ + :vi=\233?25l:vs=\233?12;25h:tc=xterm+kbs: +# +hp|xterm-hp|xterm with hpterm function keys:\ + :@7=\EF:k1=\Ep:k2=\Eq:k3=\Er:k4=\Es:k5=\Et:k6=\Eu:k7=\Ev:\ + :k8=\Ew:kC=\EJ:kD=\EP:kI=\EQ:kN=\ES:kP=\ET:kd=\EB:kh=\Eh:\ + :kl=\ED:kr=\EC:ku=\EA:tc=xterm-basic: +# +xS|xterm-sco|xterm with SCO function keys:\ + :@7=\E[F:F1=\E[W:F2=\E[X:F3=\E[Y:F5=\E[a:F6=\E[b:F7=\E[c:\ + :F8=\E[d:F9=\E[e:FA=\E[f:FB=\E[g:FC=\E[h:FD=\E[i:FE=\E[j:\ + :FF=\E[k:ac=:k1=\E[M:k2=\E[N:k3=\E[O:k4=\E[P:k5=\E[Q:\ + :k6=\E[R:k7=\E[S:k8=\E[T:k9=\E[U:k;=\E[V:kD=\177:kI=\E[L:\ + :kN=\E[G:kP=\E[I:kd=\E[B:kh=\E[H:kl=\E[D:kr=\E[C:ku=\E[A:\ + :tc=xterm-basic: +# +v5|xterm-vt52|xterm emulating vt52:\ + :bs:\ + :co#80:it#8:li#24:\ + :ae=\EG:as=\EF:bl=^G:cd=\EJ:ce=\EK:cl=\EH\EJ:cm=\EY%+ %+ :\ + :cr=^M:do=\EB:ho=\EH:kd=\EB:kl=\ED:kr=\EC:ku=\EA:le=\ED:\ + :nd=\EC:nw=^M^J:sf=^J:sr=\EI:ta=^I:up=\EA:tc=xterm+kbs: +# +xs|xterm-sun|xterm with Sun functionkeys:\ + :%1=\E[196z:&8=\E[195z:@0=\E[200z:@5=\E[197z:@7=\E[220z:\ + :F1=\E[192z:F2=\E[193z:K2=\E[218z:Km=\E[M:k1=\E[224z:\ + :k2=\E[225z:k3=\E[226z:k4=\E[227z:k5=\E[228z:k6=\E[229z:\ + :k7=\E[230z:k8=\E[231z:k9=\E[232z:k;=\E[233z:kD=\E[3z:\ + :kI=\E[2z:kN=\E[222z:kP=\E[216z:kh=\E[214z:\ + :tc=xterm-basic: +# +# vi may work better with this entry, because vi doesn't use insert mode much. +# |xterm-ic|xterm-vi|xterm with insert character instead of insert mode:\ +vi|xterm-ic|xterm-vi|xterm with insert char:\ + :mi@:\ + :IC=\E[%d@:ei@:ic=\E[@:im@:tc=xterm: +# +# Compatible with the X11R6.3 xterm +r6|xterm-r6|xterm-old|X11R6 xterm:\ + :am:bs:km:mi:ms:pt:xn:\ + :co#80:kn#20:li#24:\ + :*6=\E[4~:@0=\E[1~:@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:\ + :DO=\E[%dB:F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~:\ + :F5=\E[28~:F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:\ + :FA=\E[34~:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:ae=^O:al=\E[L:\ + :as=^N:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH:\ + :cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:eA=\E)0:ei=\E[4l:\ + :ho=\E[H:im=\E[4h:\ + :is=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:\ + :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:k5=\E[15~:\ + :k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:\ + :kD=\E[3~:kI=\E[2~:kN=\E[6~:kP=\E[5~:kd=\EOB:ke=\E[?1l\E>:\ + :kh=\E[1~:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EOA:md=\E[1m:\ + :me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:rc=\E8:\ + :rs=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8:sc=\E7:\ + :se=\E[m:sf=^J:so=\E[7m:sr=\EM:te=\E[2J\E[?47l\E8:\ + :ti=\E7\E[?47h:ue=\E[m:up=\E[A:us=\E[4m:tc=xterm+kbs: +# +# Compatible with the R5 xterm +r5|xterm-r5|X11R5 xterm X11R5:\ + :am:bs:km:mi:ms:pt:xn:\ + :co#80:kn#4:li#24:\ + :@7=\E[4~:AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:\ + :IC=\E[%d@:UP=\E[%dA:al=\E[L:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:\ + :cm=\E[%i%d;%dH:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:\ + :ei=\E[4l:ho=\E[H:im=\E[4h:\ + :is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;3;4;6l\E[4l:\ + :k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~:kd=\EOB:\ + :ke=\E[?1l\E>:kh=\E[1~:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:\ + :ku=\EOA:md=\E[1m:me=\E[m:mr=\E[7m:nd=\E[C:rc=\E8:\ + :rs=\E>\E[?1;3;4;5;6l\E[4l\E[?7h\E[m\E[r\E[2J\E[H:\ + :sc=\E7:se=\E[m:sf=^J:so=\E[7m:sr=\EM:te=\E[2J\E[?47l\E8:\ + :ti=\E7\E[?47h:ue=\E[m:up=\E[A:us=\E[4m:tc=xterm+kbs: +# +# Customization begins here. +x0|xterm-xfree86|xterm terminal emulator (XFree86):\ + :tc=xterm-new: +# +# This is the only entry which you should have to customize, since "xterm" +# is widely used for a variety of incompatible terminal emulations including +# color_xterm and rxvt. +v0|xterm|X11 terminal emulator:\ + :tc=xterm-new: +# :tc=xterm-r6: + +# This fragment is for people who cannot agree on what the backspace key +# should send. +xterm+kbs|fragment for backspace key:\ + :kb=^H: +# :kb=\177: diff --git a/ports/xterm/xterm-359/terminfo b/ports/xterm/xterm-359/terminfo new file mode 100644 index 0000000..0c86317 --- /dev/null +++ b/ports/xterm/xterm-359/terminfo @@ -0,0 +1,2650 @@ +# $XTermId: terminfo,v 1.189 2020/06/06 21:15:44 tom Exp $ +# +# Updates/notes/new entries (e.g., xterm-8bit, xterm-16color, xterm-256color) +# - Thomas E. Dickey +# +#------------------------------------------------------------------------------ +# Copyright 1996-2019,2020 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +#------------------------------------------------------------------------------ +# format (ncurses 6.1): tic -I -W -1 -f -x terminfo +#------------------------------------------------------------------------------ +# +# Special Capabilities: +# -------------------- +# ich has a corresponding capability that inserts a single blank. We could +# have used ich1=\E[@, which works with ncurses, but that is not standard +# behavior. If it is set, then SVr4 vi (e.g., Solaris 2.6) emits both +# smir/rmir and ich1. +# meml locks memory above the cursor; memu unlocks (ala HP terminals). This +# is not recognized by some older (e.g., SVr3) tic programs, but none +# do more than warn about it. Ignore the warning. +# smcup clears memory before switching to the alternate screen. The older +# (deprecated) \E[?47h did not do this, requiring applications to +# embed a \E[2J in the rmcup string. However, that behavior cannot +# be disabled via titeInhibit, making that resource not function as +# intended on systems with terminfo. +# rs2/is2 are shorter with XFree86 xterm because it supports DECSTR. We +# use the shorter sequence for compatibility with the termcap, which +# is trimmed to keep it shorter than 1023 characters. It (escape \E[!p) +# replaces these in the conventional vt100 reset-string: +# \E7 - save cursor (fixes origin-mode side-effect) +# \E[r - reset scrolling margins +# \E[m - reset SGR (including color) +# \E[?7h - reset wraparound mode (DECAWM) +# \E[?1l - reset application cursor keys (DECCKM) +# \E[?6l - reset origin mode (DECOM) +# \E8 - restore cursor +# DECSTR is recognized by XFree86 xterm even in vt52 mode. +# +# Editing Keypad: +# -------------- +# XFree86 xterm emulates vt220 if the decTerminalID resource is set to 200 or +# higher. Otherwise it emulates a vt100 or vt52 depending on the value of the +# resource. When emulating a vt220, we support the editing keypad. Sun and PC +# keyboards have an editing keypad which is similar to the vt220: +# +# VT220 editing keypad +# ---------------------------- +# Find Insert Remove +# Select Prev Next +# ---------------------------- +# +# Sun/PC editing keypad +# ---------------------------- +# Insert Home PageUp +# Delete End PageDn +# ---------------------------- +# +# If the sunKeyboard resource is true, we map it this way (adjusting the values +# of Home, End and Delete): +# VT220 Sun/PC +# ---------------------------- +# Find Home +# Select End +# Insert Insert +# Remove Delete +# Prev PageUp +# Next PageDn +# ---------------------------- +# +# Note that all of the keys on the editing keypad transmit escape sequences. A +# vt220 does this only when in vt220 mode; when emulating a vt100 the editing +# keypad is inactive. +# +# Alternative keycodes: +# -------------------- +# Several of the function keys have alternative names, depending on the type of +# host which your xterm is connected to. DEC (i.e., the VMS system) uses F15 +# as the HELP key, F16 as the DO key. Unix applications generally do not do +# this. Curses applications in particular, assign a unique keycode to each +# capability string. These terminal descriptions do not have conflicting +# definitions, to ensure that Unix curses applications use a consistent set of +# keycodes. To get a VMS-bias, make these substitutions: +# 1. change khome to kfnd +# 2. change kend to kslt +# The original xterm-r6 entry does in fact have a VMS bias. +# +# Some legacy applications using the termcap emulation may expect kll where +# we have specified kend. +# +# Function keys with modifiers (Sun/PC): +# ------------------------------------- +# Shift-Fx - kf{12+x} +# Control-Fx - kf{24+x} +# Shift-Control-Fx - kf{36+x} +# +# The terminfo defines some special keys which are documented as "shifted", +# e.g., kDC is shifted-delete-character. +# +# Note however, that even though the terminfo says a key might be sent, there +# may be conflicts which prevent this. For example, it is common to use +# shifted pageup and pagedown for window manager functions. The default +# translation for xterm since X11R4 has overridden shifted Insert, Select, +# PageUp and PageDown, which correspond to terminfo kIC, kEND, kPRV and kNXT +# respectively. +# +xterm-new|modern xterm terminal emulator, + npc, + indn=\E[%p1%dS, + kcbt=\E[Z, + kent=\EOM, + rin=\E[%p1%dT, + use=xterm+keypad, + use=vt420+lrmm, + use=xterm+sm+1006, + use=ansi+rep, + use=ecma+strikeout, + use=xterm+pcfkeys, + use=xterm+tmux, + use=xterm-basic, + +# Left/right margins are supported in xterm since patch #279 (2012/05/10) +vt420+lrmm|VT420 left/right margins, + mgc=\E[?69l, + smglr=\E[?69h\E[%i%p1%d;%p2%ds, + +# These "ansi+XXX" blocks were added in ncurses 5.0: +ansi+rep, + rep=%p1%c\E[%p2%{1}%-%db, + +ansi+enq|ncurses extension for ANSI ENQ, + u6=\E[%i%d;%dR, + u7=\E[6n, + u8=\E[?%[;0123456789]c, + u9=\E[c, + +# Encode modifiers using parameters (see "Xterm Control Sequences" ctlseqs.ms). +# Note that this is unrelated to PCTERM. +# +# Some names are extensions allowed by ncurses, e.g., +# kDN, kDN5, kDN6, kLFT5, kLFT6, kRIT5, kRIT6, kUP, kUP5, kUP6 +# +# The uppercase names are made up, since there are no standards that apply. +# If they were limited to two characters, they could in principle be translated +# to termcap. However, termcap sizes are limited to 1023 bytes, so there is +# little point in ensuring that extended key names can be translated to +# termcap. A terminfo file can be up to 4096 bytes; using all extended keys +# that xterm can generate would in fact exceed that limit. +# +# The numbers correspond to the modifier parameters documented in Xterm +# Control Sequences: +# +# 2 Shift +# 3 Alt +# 4 Shift + Alt +# 5 Control +# 6 Shift + Control +# 7 Alt + Control +# 8 Shift + Alt + Control +# +# X/Open Curses defines some shift combinations, which are also used here +# where applicable. Since it does define some shift combinations, no number +# (2) is used for suffixing the made-up names. Some combinations are not +# useful, e.g., they may reboot your computer, or they may require too many +# fingers. I stopped at modifier 7, just to keep things simple -TD +# +# XTerm resources: +# --------------- +# The xterm+pcfn, xterm+pcf0, xterm+pcf1, xterm+pcf2 and xterm+pcf3 fragments +# correspond to default resource settings for xterm on a 104-key PC keyboard +# with 12 function-keys: +# +# *sunKeyboard:false +# *oldXtermFKeys:false +# *modifyCursorKeys:2 +# *modifyFunctionKeys:2 +# *ctrlFKeys:10 +# +# The key numbers are computed based on the modifiers: +# +# kf1-kf12 are F1-F12 +# kf13-kf24 are shift F1-F12 +# kf25-kf36 are control F1-F12 +# kf37-kf48 are control+shift F1-F12 +# kf49-kf60 are alt F1-F12 +# kf61-kf63 are shift-alt F1-F3 +# +# Note that ncurses would allow definition of kf64 and beyond, if there were +# an application that required it. +# +xterm+pcfkeys|fragment for PC-style keys, + use=xterm+app, + use=xterm+pcf2, + use=xterm+pce2, + use=xterm+pcc2, + +# This chunk is based on suggestions by Ailin Nemui and Nicholas Marriott, who +# asked for some of xterm's advanced features to be added to its terminfo +# entry. It defines extended capabilities not found in standard terminfo or +# termcap. These are useful in tmux, for instance, hence the name. +# +# One caveat in adding extended capabilities in ncurses is that if the names +# are longer than two characters, then they will not be visible through the +# termcap interface. +# +# Ms modifies the selection/clipboard. Its parameters are +# p1 = the storage unit (clipboard, selection or cut buffer) +# p2 = the base64-encoded clipboard content. +# +# Ss is used to set the cursor style as described by the DECSCUSR +# function to a block or underline. +# Se resets the cursor style to the terminal power-on default. +# +# Cs and Ce set and reset the cursor colour. +xterm+tmux|advanced xterm features used in tmux, + Cr=\E]112\007, + Cs=\E]12;%p1%s\007, + Ms=\E]52;%p1%s;%p2%s + \007, + Se=\E[2\sq, + Ss=\E[%p1%d\sq, +# +# The ctrlFKeys resource is only relevant to the xterm+pcfn and xterm+pcfN +# entries, since the modifyFunctionKeys resource overrides ctrlFKeys when it is +# positive. A different choice of ctrlFKeys would give a different set of +# function-key strings. +xterm+pcfn|fragment with modifyFunctionKeys:-1 and ctrlFKeys:10, + kf1=\EOP, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\E[25~, + kf14=\E[26~, + kf15=\E[28~, + kf16=\E[29~, + kf17=\E[31~, + kf18=\E[32~, + kf19=\E[33~, + kf2=\EOQ, + kf20=\E[34~, + kf21=\E[42~, + kf22=\E[43~, + kf23=\E[44~, + kf24=\E[45~, + kf25=\E[46~, + kf26=\E[47~, + kf27=\E[48~, + kf28=\E[49~, + kf29=\E[50~, + kf3=\EOR, + kf30=\E[51~, + kf31=\E[52~, + kf32=\E[53~, + kf33=\E[54~, + kf34=\E[55~, + kf35=\E[56~, + kf36=\E[57~, + kf37=\E[58~, + kf38=\E[59~, + kf39=\E[60~, + kf4=\EOS, + kf40=\E[61~, + kf41=\E[62~, + kf42=\E[63~, + kf43=\E[64~, + kf44=\E[65~, + kf45=\E[66~, + kf46=\E[67~, + kf47=\E[68~, + kf48=\E[69~, + kf5=\E[15~, + kf6=\E[17~, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + +# Changing ctrlFKeys to 12 would let us number the keys using just shift- and +# control- modifiers: +# kf1-kf12 are F1-F12 +# kf13-kf24 are shift F1-F12 +# kf25-kf36 are control F1-F12 +# kf37-kf48 are control+shift F1-F12 +xterm+pcfN|fragment with modifyFunctionKeys:-1 and ctrlFKeys:12, + kf1=\EOP, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\E[25~, + kf14=\E[26~, + kf15=\E[28~, + kf16=\E[29~, + kf17=\E[31~, + kf18=\E[32~, + kf19=\E[33~, + kf2=\EOQ, + kf20=\E[34~, + kf21=\E[42~, + kf22=\E[43~, + kf23=\E[44~, + kf24=\E[45~, + kf25=\E[46~, + kf26=\E[47~, + kf27=\E[48~, + kf28=\E[49~, + kf29=\E[50~, + kf3=\EOR, + kf30=\E[51~, + kf31=\E[52~, + kf32=\E[53~, + kf33=\E[54~, + kf34=\E[55~, + kf35=\E[56~, + kf36=\E[57~, + kf37=\E[58~, + kf38=\E[59~, + kf39=\E[60~, + kf4=\EOS, + kf40=\E[61~, + kf41=\E[62~, + kf42=\E[63~, + kf43=\E[64~, + kf44=\E[65~, + kf45=\E[66~, + kf46=\E[67~, + kf47=\E[68~, + kf48=\E[69~, + kf5=\E[15~, + kf6=\E[17~, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + +xterm+pcf0|fragment with modifyFunctionKeys:0, + kf1=\EOP, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\EO2P, + kf14=\EO2Q, + kf15=\EO2R, + kf16=\EO2S, + kf17=\E[15;2~, + kf18=\E[17;2~, + kf19=\E[18;2~, + kf2=\EOQ, + kf20=\E[19;2~, + kf21=\E[20;2~, + kf22=\E[21;2~, + kf23=\E[23;2~, + kf24=\E[24;2~, + kf25=\EO5P, + kf26=\EO5Q, + kf27=\EO5R, + kf28=\EO5S, + kf29=\E[15;5~, + kf3=\EOR, + kf30=\E[17;5~, + kf31=\E[18;5~, + kf32=\E[19;5~, + kf33=\E[20;5~, + kf34=\E[21;5~, + kf35=\E[23;5~, + kf36=\E[24;5~, + kf37=\EO6P, + kf38=\EO6Q, + kf39=\EO6R, + kf4=\EOS, + kf40=\EO6S, + kf41=\E[15;6~, + kf42=\E[17;6~, + kf43=\E[18;6~, + kf44=\E[19;6~, + kf45=\E[20;6~, + kf46=\E[21;6~, + kf47=\E[23;6~, + kf48=\E[24;6~, + kf49=\EO3P, + kf5=\E[15~, + kf50=\EO3Q, + kf51=\EO3R, + kf52=\EO3S, + kf53=\E[15;3~, + kf54=\E[17;3~, + kf55=\E[18;3~, + kf56=\E[19;3~, + kf57=\E[20;3~, + kf58=\E[21;3~, + kf59=\E[23;3~, + kf6=\E[17~, + kf60=\E[24;3~, + kf61=\EO4P, + kf62=\EO4Q, + kf63=\EO4R, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + +# This is almost the same as xterm+pcf2 because the unmodified keys all happen +# to have a pattern that forces the modifier to the same position. +xterm+pcf1|fragment with modifyFunctionKeys:1, + kf1=\EOP, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\E[2P, + kf14=\E[2Q, + kf15=\E[2R, + kf16=\E[2S, + kf17=\E[15;2~, + kf18=\E[17;2~, + kf19=\E[18;2~, + kf2=\EOQ, + kf20=\E[19;2~, + kf21=\E[20;2~, + kf22=\E[21;2~, + kf23=\E[23;2~, + kf24=\E[24;2~, + kf25=\E[5P, + kf26=\E[5Q, + kf27=\E[5R, + kf28=\E[5S, + kf29=\E[15;5~, + kf3=\EOR, + kf30=\E[17;5~, + kf31=\E[18;5~, + kf32=\E[19;5~, + kf33=\E[20;5~, + kf34=\E[21;5~, + kf35=\E[23;5~, + kf36=\E[24;5~, + kf37=\E[6P, + kf38=\E[6Q, + kf39=\E[6R, + kf4=\EOS, + kf40=\E[6S, + kf41=\E[15;6~, + kf42=\E[17;6~, + kf43=\E[18;6~, + kf44=\E[19;6~, + kf45=\E[20;6~, + kf46=\E[21;6~, + kf47=\E[23;6~, + kf48=\E[24;6~, + kf49=\E[3P, + kf5=\E[15~, + kf50=\E[3Q, + kf51=\E[3R, + kf52=\E[3S, + kf53=\E[15;3~, + kf54=\E[17;3~, + kf55=\E[18;3~, + kf56=\E[19;3~, + kf57=\E[20;3~, + kf58=\E[21;3~, + kf59=\E[23;3~, + kf6=\E[17~, + kf60=\E[24;3~, + kf61=\E[4P, + kf62=\E[4Q, + kf63=\E[4R, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + +xterm+pcf2|fragment with modifyFunctionKeys:2, + kf1=\EOP, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\E[1;2P, + kf14=\E[1;2Q, + kf15=\E[1;2R, + kf16=\E[1;2S, + kf17=\E[15;2~, + kf18=\E[17;2~, + kf19=\E[18;2~, + kf2=\EOQ, + kf20=\E[19;2~, + kf21=\E[20;2~, + kf22=\E[21;2~, + kf23=\E[23;2~, + kf24=\E[24;2~, + kf25=\E[1;5P, + kf26=\E[1;5Q, + kf27=\E[1;5R, + kf28=\E[1;5S, + kf29=\E[15;5~, + kf3=\EOR, + kf30=\E[17;5~, + kf31=\E[18;5~, + kf32=\E[19;5~, + kf33=\E[20;5~, + kf34=\E[21;5~, + kf35=\E[23;5~, + kf36=\E[24;5~, + kf37=\E[1;6P, + kf38=\E[1;6Q, + kf39=\E[1;6R, + kf4=\EOS, + kf40=\E[1;6S, + kf41=\E[15;6~, + kf42=\E[17;6~, + kf43=\E[18;6~, + kf44=\E[19;6~, + kf45=\E[20;6~, + kf46=\E[21;6~, + kf47=\E[23;6~, + kf48=\E[24;6~, + kf49=\E[1;3P, + kf5=\E[15~, + kf50=\E[1;3Q, + kf51=\E[1;3R, + kf52=\E[1;3S, + kf53=\E[15;3~, + kf54=\E[17;3~, + kf55=\E[18;3~, + kf56=\E[19;3~, + kf57=\E[20;3~, + kf58=\E[21;3~, + kf59=\E[23;3~, + kf6=\E[17~, + kf60=\E[24;3~, + kf61=\E[1;4P, + kf62=\E[1;4Q, + kf63=\E[1;4R, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + +xterm+pcf3|fragment with modifyFunctionKeys:3, + kf1=\EOP, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\E[>1;2P, + kf14=\E[>1;2Q, + kf15=\E[>1;2R, + kf16=\E[>1;2S, + kf17=\E[>15;2~, + kf18=\E[>17;2~, + kf19=\E[>18;2~, + kf2=\EOQ, + kf20=\E[>19;2~, + kf21=\E[>20;2~, + kf22=\E[>21;2~, + kf23=\E[>23;2~, + kf24=\E[>24;2~, + kf25=\E[>1;5P, + kf26=\E[>1;5Q, + kf27=\E[>1;5R, + kf28=\E[>1;5S, + kf29=\E[>15;5~, + kf3=\EOR, + kf30=\E[>17;5~, + kf31=\E[>18;5~, + kf32=\E[>19;5~, + kf33=\E[>20;5~, + kf34=\E[>21;5~, + kf35=\E[>23;5~, + kf36=\E[>24;5~, + kf37=\E[>1;6P, + kf38=\E[>1;6Q, + kf39=\E[>1;6R, + kf4=\EOS, + kf40=\E[>1;6S, + kf41=\E[>15;6~, + kf42=\E[>17;6~, + kf43=\E[>18;6~, + kf44=\E[>19;6~, + kf45=\E[>20;6~, + kf46=\E[>21;6~, + kf47=\E[>23;6~, + kf48=\E[>24;6~, + kf49=\E[>1;3P, + kf5=\E[15~, + kf50=\E[>1;3Q, + kf51=\E[>1;3R, + kf52=\E[>1;3S, + kf53=\E[>15;3~, + kf54=\E[>17;3~, + kf55=\E[>18;3~, + kf56=\E[>19;3~, + kf57=\E[>20;3~, + kf58=\E[>21;3~, + kf59=\E[>23;3~, + kf6=\E[17~, + kf60=\E[>24;3~, + kf61=\E[>1;4P, + kf62=\E[>1;4Q, + kf63=\E[>1;4R, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, +# +# The "PC-style" modifier scheme was introduced in xterm patch #94 (1999/3/27) +# and revised in patch #167 (2002/8/24). +# +# The original assignments from patch #94 for cursor-keys had some technical +# issues: +# +# A parameter for a function-key to represent a modifier is just more +# bits. But for a cursor-key it may change the behavior of the +# application. For instance, emacs decodes the first parameter of a +# cursor-key as a repeat count. +# +# A parameterized string should (really) not begin with SS3 (\EO). +# Rather, CSI (\E[) should be used. +# +# For these reasons, the original assignments were deprecated. For +# compatibility reasons, they are still available as a setting of xterm's +# modifyCursorKeys resource. These fragments list the modified cursor-keys +# that might apply to xterm+pcfkeys with different values of that resource. +xterm+pcc3|fragment with modifyCursorKeys:3, + kLFT=\E[>1;2D, + kRIT=\E[>1;2C, + kind=\E[>1;2B, + kri=\E[>1;2A, + kDN=\E[>1;2B, + kDN3=\E[>1;3B, + kDN4=\E[>1;4B, + kDN5=\E[>1;5B, + kDN6=\E[>1;6B, + kDN7=\E[>1;7B, + kLFT3=\E[>1;3D, + kLFT4=\E[>1;4D, + kLFT5=\E[>1;5D, + kLFT6=\E[>1;6D, + kLFT7=\E[>1;7D, + kRIT3=\E[>1;3C, + kRIT4=\E[>1;4C, + kRIT5=\E[>1;5C, + kRIT6=\E[>1;6C, + kRIT7=\E[>1;7C, + kUP=\E[>1;2A, + kUP3=\E[>1;3A, + kUP4=\E[>1;4A, + kUP5=\E[>1;5A, + kUP6=\E[>1;6A, + kUP7=\E[>1;7A, + +xterm+pcc2|fragment with modifyCursorKeys:2, + kLFT=\E[1;2D, + kRIT=\E[1;2C, + kind=\E[1;2B, + kri=\E[1;2A, + kDN=\E[1;2B, + kDN3=\E[1;3B, + kDN4=\E[1;4B, + kDN5=\E[1;5B, + kDN6=\E[1;6B, + kDN7=\E[1;7B, + kLFT3=\E[1;3D, + kLFT4=\E[1;4D, + kLFT5=\E[1;5D, + kLFT6=\E[1;6D, + kLFT7=\E[1;7D, + kRIT3=\E[1;3C, + kRIT4=\E[1;4C, + kRIT5=\E[1;5C, + kRIT6=\E[1;6C, + kRIT7=\E[1;7C, + kUP=\E[1;2A, + kUP3=\E[1;3A, + kUP4=\E[1;4A, + kUP5=\E[1;5A, + kUP6=\E[1;6A, + kUP7=\E[1;7A, + +xterm+pcc1|fragment with modifyCursorKeys:1, + kLFT=\E[2D, + kRIT=\E[2C, + kind=\E[2B, + kri=\E[2A, + kDN=\E[2B, + kDN3=\E[3B, + kDN4=\E[4B, + kDN5=\E[5B, + kDN6=\E[6B, + kDN7=\E[7B, + kLFT3=\E[3D, + kLFT4=\E[4D, + kLFT5=\E[5D, + kLFT6=\E[6D, + kLFT7=\E[7D, + kRIT3=\E[3C, + kRIT4=\E[4C, + kRIT5=\E[5C, + kRIT6=\E[6C, + kRIT7=\E[7C, + kUP=\E[2A, + kUP3=\E[3A, + kUP4=\E[4A, + kUP5=\E[5A, + kUP6=\E[6A, + kUP7=\E[7A, + +xterm+pcc0|fragment with modifyCursorKeys:0, + kLFT=\EO2D, + kRIT=\EO2C, + kind=\EO2B, + kri=\EO2A, + kDN=\EO2B, + kDN3=\EO3B, + kDN4=\EO4B, + kDN5=\EO5B, + kDN6=\EO6B, + kDN7=\EO7B, + kLFT3=\EO3D, + kLFT4=\EO4D, + kLFT5=\EO5D, + kLFT6=\EO6D, + kLFT7=\EO7D, + kRIT3=\EO3C, + kRIT4=\EO4C, + kRIT5=\EO5C, + kRIT6=\EO6C, + kRIT7=\EO7C, + kUP=\EO2A, + kUP3=\EO3A, + kUP4=\EO4A, + kUP5=\EO5A, + kUP6=\EO6A, + kUP7=\EO7A, + +# The home/end keys on the editing keypad are also treated as cursor keys. +xterm+pce3|fragment with modifyCursorKeys:3, + kDC=\E[>3;2~, + kEND=\E[>1;2F, + kHOM=\E[>1;2H, + kIC=\E[>2;2~, + kNXT=\E[>6;2~, + kPRV=\E[>5;2~, + kDC3=\E[>3;3~, + kDC4=\E[>3;4~, + kDC5=\E[>3;5~, + kDC6=\E[>3;6~, + kDC7=\E[>3;7~, + kEND3=\E[>1;3F, + kEND4=\E[>1;4F, + kEND5=\E[>1;5F, + kEND6=\E[>1;6F, + kEND7=\E[>1;7F, + kHOM3=\E[>1;3H, + kHOM4=\E[>1;4H, + kHOM5=\E[>1;5H, + kHOM6=\E[>1;6H, + kHOM7=\E[>1;7H, + kIC3=\E[>2;3~, + kIC4=\E[>2;4~, + kIC5=\E[>2;5~, + kIC6=\E[>2;6~, + kIC7=\E[>2;7~, + kNXT3=\E[>6;3~, + kNXT4=\E[>6;4~, + kNXT5=\E[>6;5~, + kNXT6=\E[>6;6~, + kNXT7=\E[>6;7~, + kPRV3=\E[>5;3~, + kPRV4=\E[>5;4~, + kPRV5=\E[>5;5~, + kPRV6=\E[>5;6~, + kPRV7=\E[>5;7~, + use=xterm+pce0, + +xterm+pce2|fragment with modifyCursorKeys:2, + kDC=\E[3;2~, + kEND=\E[1;2F, + kHOM=\E[1;2H, + kIC=\E[2;2~, + kNXT=\E[6;2~, + kPRV=\E[5;2~, + kDC3=\E[3;3~, + kDC4=\E[3;4~, + kDC5=\E[3;5~, + kDC6=\E[3;6~, + kDC7=\E[3;7~, + kEND3=\E[1;3F, + kEND4=\E[1;4F, + kEND5=\E[1;5F, + kEND6=\E[1;6F, + kEND7=\E[1;7F, + kHOM3=\E[1;3H, + kHOM4=\E[1;4H, + kHOM5=\E[1;5H, + kHOM6=\E[1;6H, + kHOM7=\E[1;7H, + kIC3=\E[2;3~, + kIC4=\E[2;4~, + kIC5=\E[2;5~, + kIC6=\E[2;6~, + kIC7=\E[2;7~, + kNXT3=\E[6;3~, + kNXT4=\E[6;4~, + kNXT5=\E[6;5~, + kNXT6=\E[6;6~, + kNXT7=\E[6;7~, + kPRV3=\E[5;3~, + kPRV4=\E[5;4~, + kPRV5=\E[5;5~, + kPRV6=\E[5;6~, + kPRV7=\E[5;7~, + use=xterm+pce0, + +xterm+pce1|fragment with modifyCursorKeys:1, + kDC=\E[3;2~, + kEND=\E[2F, + kHOM=\E[2H, + kIC=\E[2;2~, + kNXT=\E[6;2~, + kPRV=\E[5;2~, + kDC3=\E[3;3~, + kDC4=\E[3;4~, + kDC5=\E[3;5~, + kDC6=\E[3;6~, + kDC7=\E[3;7~, + kEND3=\E[3F, + kEND4=\E[4F, + kEND5=\E[5F, + kEND6=\E[6F, + kEND7=\E[7F, + kHOM3=\E[3H, + kHOM4=\E[4H, + kHOM5=\E[5H, + kHOM6=\E[6H, + kHOM7=\E[7H, + kIC3=\E[2;3~, + kIC4=\E[2;4~, + kIC5=\E[2;5~, + kIC6=\E[2;6~, + kIC7=\E[2;7~, + kNXT3=\E[6;3~, + kNXT4=\E[6;4~, + kNXT5=\E[6;5~, + kNXT6=\E[6;6~, + kNXT7=\E[6;7~, + kPRV3=\E[5;3~, + kPRV4=\E[5;4~, + kPRV5=\E[5;5~, + kPRV6=\E[5;6~, + kPRV7=\E[5;7~, + use=xterm+pce0, + +xterm+pce0|fragment with modifyCursorKeys:0, + kDC=\E[3;2~, + kEND=\EO2F, + kHOM=\EO2H, + kIC=\E[2;2~, + kNXT=\E[6;2~, + kPRV=\E[5;2~, + kDC3=\E[3;3~, + kDC4=\E[3;4~, + kDC5=\E[3;5~, + kDC6=\E[3;6~, + kDC7=\E[3;7~, + kEND3=\EO3F, + kEND4=\EO4F, + kEND5=\EO5F, + kEND6=\EO6F, + kEND7=\EO7F, + kHOM3=\EO3H, + kHOM4=\EO4H, + kHOM5=\EO5H, + kHOM6=\EO6H, + kHOM7=\EO7H, + kIC3=\E[2;3~, + kIC4=\E[2;4~, + kIC5=\E[2;5~, + kIC6=\E[2;6~, + kIC7=\E[2;7~, + kNXT3=\E[6;3~, + kNXT4=\E[6;4~, + kNXT5=\E[6;5~, + kNXT6=\E[6;6~, + kNXT7=\E[6;7~, + kPRV3=\E[5;3~, + kPRV4=\E[5;4~, + kPRV5=\E[5;5~, + kPRV6=\E[5;6~, + kPRV7=\E[5;7~, + use=xterm+edit, + +# The rmxx/smxx capabilities are an ncurses extension +ecma+strikeout|ECMA-48 strikeout/crossed-out, + rmxx=\E[29m, + smxx=\E[9m, + +# The XM capability is an ncurses extension +xterm+sm+1006|xterm SGR-mouse, + kmous=\E[<, + XM=\E[?1006;1000 + %? + %p1%{1}%= + %th + %e + l + %;, + xm=\E[<%i + %p3%d;%p1%d;%p2%d; + %? + %p4 + %tM + %e + m + %;, + +# By default, ncurses knows that xterm private mode 1000 enables/disables +# the X11 xterm mouse protocol. So XM is not needed here, except for clarity. +xterm+x11mouse|X11 xterm mouse protocol, + kmous=\E[M, + XM=\E[?1000 + %? + %p1%{1}%= + %th + %e + l + %;, + xm=\E[M + %? + %p4 + %t%p3 + %e%{3} + %; + %'\s'%+%c + %p2%'!'%+%c%p1%'!'%+%c, + +# This chunk is used for building the VT220/Sun/PC keyboard variants. +xterm-basic|modern xterm terminal emulator - common, + OTbs, + am, + bce, + km, + mc5i, + mir, + msgr, + xenl, + AX, + XT, + colors#8, + cols#80, + it#8, + lines#24, + pairs#64, + acsc=``aaffggiijjkkllmmnnooppqqr + rssttuuvvwwxxyyzz{{||}}~~, + bel=^G, + blink=\E[5m, + bold=\E[1m, + cbt=\E[Z, + civis=\E[?25l, + clear=\E[H\E[2J, + cnorm=\E[?12l\E[?25h, + cr=\r, + csr=\E[%i%p1%d;%p2%dr, + cub=\E[%p1%dD, + cub1=^H, + cud=\E[%p1%dB, + cud1=\n, + cuf=\E[%p1%dC, + cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, + cuu=\E[%p1%dA, + cuu1=\E[A, + cvvis=\E[?12;25h, + dch=\E[%p1%dP, + dch1=\E[P, + dim=\E[2m, + dl=\E[%p1%dM, + dl1=\E[M, + ech=\E[%p1%dX, + ed=\E[J, + el=\E[K, + el1=\E[1K, + flash=\E[?5h$<100/>\E[?5l, + home=\E[H, + hpa=\E[%i%p1%dG, + ht=^I, + hts=\EH, + ich=\E[%p1%d@, + il=\E[%p1%dL, + il1=\E[L, + ind=\n, + invis=\E[8m, + is2=\E[!p\E[?3;4l\E[4l\E>, + kmous=\E[M, + mc0=\E[i, + mc4=\E[4i, + mc5=\E[5i, + meml=\El, + memu=\Em, + op=\E[39;49m, + rc=\E8, + rev=\E[7m, + ri=\EM, + ritm=\E[23m, + rmacs=\E(B, + rmam=\E[?7l, + rmir=\E[4l, + rmkx=\E[?1l\E>, + rmm=\E[?1034l, + rmso=\E[27m, + rmul=\E[24m, + rs1=\Ec, + rs2=\E[!p\E[?3;4l\E[4l\E>, + sc=\E7, + setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, + setb=\E[4 + %? + %p1%{1}%= + %t4 + %e + %p1%{3}%= + %t6 + %e + %p1%{4}%= + %t1 + %e + %p1%{6}%= + %t3 + %e + %p1%d + %; + m, + setf=\E[3 + %? + %p1%{1}%= + %t4 + %e + %p1%{3}%= + %t6 + %e + %p1%{4}%= + %t1 + %e + %p1%{6}%= + %t3 + %e + %p1%d + %; + m, + sgr= + %? + %p9 + %t\E(0 + %e + \E(B + %; + \E[0 + %? + %p6 + %t;1 + %; + %? + %p5 + %t;2 + %; + %? + %p2 + %t;4 + %; + %? + %p1%p3%| + %t;7 + %; + %? + %p4 + %t;5 + %; + %? + %p7 + %t;8 + %; + m, + sgr0=\E(B\E[m, + sitm=\E[3m, + smacs=\E(0, + smam=\E[?7h, + smir=\E[4h, + smkx=\E[?1h\E=, + smm=\E[?1034h, + smso=\E[7m, + smul=\E[4m, + tbc=\E[3g, + vpa=\E[%i%p1%dd, + E3=\E[3J, + use=ansi+enq, + use=xterm+alt+title, + use=xterm+kbs, +# +# The xterm-new description has all of the features, but is not completely +# compatible with vt220. If you are using a Sun or PC keyboard, set the +# sunKeyboard resource to true: +# + maps the editing keypad +# + interprets control-function-key as a second array of keys, so a +# 12-fkey keyboard can support vt220's 20-fkeys. +# + maps numeric keypad "+" to ",". +# + uses DEC-style control sequences for the application keypad. +# +# Some packagers modify xterm's resource definitions to provide extra function +# keys by using the shift-modifier in the translations resource. However, that +# interferes with the DECUDK functionality. +# +xterm-vt220|xterm emulating vt220, + ka1=\EOw, + ka3=\EOy, + kb2=\EOu, + kc1=\EOq, + kc3=\EOs, + kcbt=\E[Z, + kend=\E[4~, + kent=\EOM, + kf1=\EOP, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\E[25~, + kf14=\E[26~, + kf15=\E[28~, + kf16=\E[29~, + kf17=\E[31~, + kf18=\E[32~, + kf19=\E[33~, + kf2=\EOQ, + kf20=\E[34~, + kf3=\EOR, + kf4=\EOS, + kf5=\E[15~, + kf6=\E[17~, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + khome=\E[1~, + kich1=\E[2~, + knp=\E[6~, + kpp=\E[5~, + ka2=\EOx, + kb1=\EOt, + kb3=\EOv, + kc2=\EOr, + use=xterm+app, + use=xterm+edit, + use=xterm-basic, +# +xterm-vt52|xterm emulating dec vt52, + cols#80, + it#8, + lines#24, + acsc=``aaffggjjkkllmmnnooppqqrrs + sttuuvvwwxxyyzz{{||}}~~, + bel=^G, + clear=\EH\EJ, + cr=\r, + cub1=\ED, + cud1=\EB, + cuf1=\EC, + cup=\EY%p1%'\s'%+%c%p2%'\s'%+%c, + cuu1=\EA, + ed=\EJ, + el=\EK, + home=\EH, + ht=^I, + ind=\n, + kcub1=\ED, + kcud1=\EB, + kcuf1=\EC, + kcuu1=\EA, + nel=\r\n, + ri=\EI, + rmacs=\EG, + smacs=\EF, + use=xterm+kbs, + use=vt52+keypad, + +# from ncurses 6.2: +# DECScope of course had no "function keys", but this building block assigns +# the three blank keys at the top of the auxiliary (numeric) keypad, using +# the same analogy as vt100 (also lacking function-keys). +# +# These assignments use the same layout for 0-9 as vt100+keypad; the vt52 +# keypad had its cursor-keys on the right-column as shown -TD +# _______________________________________ +# | PF1 | PF2 | PF3 | c-up | +# | \EP | \EQ | \ER | \EA | +# |_kf1__k1_|_kf2__k2_|_kf3__k3_|kcuu1_k4_| +# | 7 8 9 c-down | +# | \E?w | \E?x | \E?y | \EB | +# |_kf9__k9_|_kf10_k;_|_kf0__k0_|kcud1____| +# | 4 | 5 | 6 | c-right | +# | \E?t | \E?u | \E?v | \EC | +# |_kf5__k5_|_kf6__k6_|_kf7__k7_|kcuf1_k8_| +# | 1 | 2 | 3 | c-left | +# | \E?q | \E?r | \E?s | \ED | +# |_ka1__K1_|_kb2__K2_|_ka3__K3_|kcub1____| +# | 0 | . | enter | +# | \E?p | \E?n | \E?M | +# |___kc1_______K4____|_kc3__K5_|_kent_@8_| +# +vt52+keypad|DECScope auxiliary keypad, + ka1=\E?q, + ka3=\E?s, + kb2=\E?r, + kc1=\E?p, + kc3=\E?n, + kf0=\E?y, + kf1=\EP, + kf2=\EQ, + kf3=\ER, + kf5=\E?t, + kf6=\E?u, + kf7=\E?v, + kf8=\E?w, + kf9=\E?x, +# +# Sun does not number the function keys this way in their sparse termcap; their +# terminal descriptions ignore the keypads. kb(7M) states that there are codes +# reserved for 64 function keys, 16 each in left, right, top and bottom. Each +# keyboard type has a different number of function keys in different +# arrangements. Using xkeycaps for reference: +# +# Type 3: left 10, top 9, right 15 +# ------ +# kf1-kf9 are XK_F1-XK_F9 +# There is no kf10 on this keyboard type. +# kf11-kf20 are keysyms XK_L1 through XK_L10. +# kf31-kf45 are keysyms XK_R1 through XK_R15. +# +# However, X's keysymdef.h is hard-coded to make +# XK_L1==XK_F11 and +# XK_R1==XK_F21, +# by someone who was unfamiliar with terminal types other than Sun's. So +# xterm uses the internal X keysymbols, but the terminfo entry uses the Sun +# numbering scheme. +# +# Type 4: left 11, top 12, right 15 +# ------ +# The left-keypad contains an unnumbered Help-key. +# The right-keypad also contains NumLock, Ins, Del, Enter, + and - keys which +# do not appear to be part of the R-sequence. +# +# Type 5: left 9, top 12, right (more than one keypad) +# ------ +# These keyboards do not use the same naming convention, look like a hybrid of +# the type 4 and IBM keyboards. +# +# XTerm resources: +# --------------- +# Set the modifyFunctionKeys resource to negative (-1) to make it simple to +# enter the higher function-key values using shift- and control-modifiers. +# +xterm-sun|xterm with sun function keys, + kb2=\E[218z, + kcpy=\E[197z, + kcub1=\EOD, + kcud1=\EOB, + kcuf1=\EOC, + kcuu1=\EOA, + kdch1=\E[3z, + kend=\E[220z, + kent=\EOM, + kf1=\E[224z, + kf10=\E[233z, + kf11=\E[192z, + kf12=\E[193z, + kf13=\E[194z, + kf14=\E[195z, + kf15=\E[196z, + kf17=\E[198z, + kf18=\E[199z, + kf19=\E[200z, + kf2=\E[225z, + kf20=\E[201z, + kf3=\E[226z, + kf31=\E[208z, + kf32=\E[209z, + kf33=\E[210z, + kf34=\E[211z, + kf35=\E[212z, + kf36=\E[213z, + kf38=\E[215z, + kf4=\E[227z, + kf40=\E[217z, + kf42=\E[219z, + kf44=\E[221z, + kf45=\E[222z, + kf46=\E[234z, + kf47=\E[235z, + kf5=\E[228z, + kf6=\E[229z, + kf7=\E[230z, + kf8=\E[231z, + kf9=\E[232z, + kfnd=\E[200z, + khlp=\E[196z, + khome=\E[214z, + kich1=\E[2z, + knp=\E[222z, + kpp=\E[216z, + kund=\E[195z, + use=xterm-basic, +# +xterm-hp|xterm with hpterm function keys, + kclr=\EJ, + kcub1=\ED, + kcud1=\EB, + kcuf1=\EC, + kcuu1=\EA, + kdch1=\EP, + kend=\EF, + kf1=\Ep, + kf2=\Eq, + kf3=\Er, + kf4=\Es, + kf5=\Et, + kf6=\Eu, + kf7=\Ev, + kf8=\Ew, + khome=\Eh, + kich1=\EQ, + knp=\ES, + kpp=\ET, + use=xterm-basic, +# +# scoterm implements 48 function-keys using shift- and control-modifiers to +# multiple 12 function-keys. X has a hard-coded limit of 35 function-keys, +# but xterm can represent larger values. +# +# XTerm resources: +# --------------- +# Set the modifyFunctionKeys resource to negative (-1) to make it simple to +# enter the higher function-key values using shift- and control-modifiers. +# +# Also, set ctrlFKeys resource to 12 (the default is 10) to make xterm see 48 +# function-keys on a keyboard with 12 function-keys and 4 control/shift +# modifier combinations. +# +xterm-sco|xterm with SCO function keys, + kbeg=\E[E, + kdch1=^?, + kf1=\E[M, + kf10=\E[V, + kf11=\E[W, + kf12=\E[X, + kf13=\E[Y, + kf14=\E[Z, + kf15=\E[a, + kf16=\E[b, + kf17=\E[c, + kf18=\E[d, + kf19=\E[e, + kf2=\E[N, + kf20=\E[f, + kf21=\E[g, + kf22=\E[h, + kf23=\E[i, + kf24=\E[j, + kf25=\E[k, + kf26=\E[l, + kf27=\E[m, + kf28=\E[n, + kf29=\E[o, + kf3=\E[O, + kf30=\E[p, + kf31=\E[q, + kf32=\E[r, + kf33=\E[s, + kf34=\E[t, + kf35=\E[u, + kf36=\E[v, + kf37=\E[w, + kf38=\E[x, + kf39=\E[y, + kf4=\E[P, + kf40=\E[z, + kf41=\E[@, + kf42=\E[[, + kf43=\E[\\, + kf44=\E[], + kf45=\E[\^, + kf46=\E[_, + kf47=\E[`, + kf48=\E[{, + kf5=\E[Q, + kf6=\E[R, + kf7=\E[S, + kf8=\E[T, + kf9=\E[U, + kich1=\E[L, + kmous=\E[>M, + knp=\E[G, + kpp=\E[I, + use=xterm+noapp, + use=xterm-basic, +# +# Other variants (these are all very old entries, from X11R5): +xterm-24|xterms|vs100|xterm terminal emulator (X Window System), + lines#24, + use=xterm-old, +xterm-65|xterm with tall window 65x80 (X Window System), + lines#65, + use=xterm-old, +xterm-bold|xterm with bold instead of underline (X Window System), + sgr= + %? + %p9 + %t\016 + %e + \017 + %; + B\E[0 + %? + %p6 + %t;1 + %; + %? + %p2 + %t;1 + %; + %? + %p1%p3%| + %t;7 + %; + m, + smso=\E[7m, + smul=\E[1m, + use=xterm-old, +xterm-boldso|xterm with bold for standout (X Window System), + rmso=\E[m, + smso=\E[1m, + use=xterm-old, +xterm-mono|monochrome xterm, + bce@, + colors@, + ncv@, + pairs@, + op@, + setab@, + setaf@, + setb@, + setf@, + sgr@, + use=xterm-old, +# +# VTxxx terminals are usually set up so that full-screen applications will use +# the cursor application mode strings. This is good for full-screen +# applications, including legacy applications which may have hard-coded +# behavior, but bad for interactive shells (e.g., tcsh, bash) which use arrow +# keys to scroll through a history of command strings. +# +# To see the difference between normal/application modes, consider this example: +# + In normal (non-application) mode, the terminal transmits a down-arrow +# as \E[C, which happens to echo as a down-arrow. +# + In application mode the terminal transmits \EOC, which echoes as C. +# That is because the \EO is the SS3 control, which says to use the +# character from the G3 character set for the next cell. +# +# One example of hard-coded behavior would be for applications written to work +# with VT52 and VT100 terminals. If the application's parser ignores 'O' and +# '?' characters after the escape, then the cursor and keypad strings for the +# two terminals are the same. (Indeed, one of the first curses applications +# which I used did something like this to cover "ANSI" terminals -TD). +# +# To make this work (leaving the cursor keys in normal mode), we have to adjust +# the terminal initialization sequences: +# +# smkx/rmkx set/reset the cursor and keypad application modes. We retain +# the latter (otherwise many applications fail). +# +# smcup/rmcup set/restore cursor-addressing mode for full-screen +# applications. For xterm, this normally means the alternate +# screen, which is not compatible with interactive shells. Some +# programs are "smart" and disable these. +# +xterm-noapp|xterm with cursor keys in normal mode, + rmcup@, + rmkx=\E>, + smcup@, + smkx=\E=, + use=xterm+noapp, + use=xterm, + +xterm+noapp|fragment with cursor keys in normal mode, + kcub1=\E[D, + kcud1=\E[B, + kcuf1=\E[C, + kcuu1=\E[A, + use=xterm+noapp+pc, + +xterm+app|fragment with cursor keys in application mode, + kcub1=\EOD, + kcud1=\EOB, + kcuf1=\EOC, + kcuu1=\EOA, + use=xterm+app+pc, + +xterm+noapp+pc|fragment for noapp pc-style home/end, + kend=\E[F, + khome=\E[H, + +xterm+app+pc|fragment for app pc-style home/end, + kend=\EOF, + khome=\EOH, + +xterm+edit|fragment for 6-key editing-keypad, + kdch1=\E[3~, + kich1=\E[2~, + knp=\E[6~, + kpp=\E[5~, + use=xterm+pc+edit, + +xterm+decedit|fragment for vt220 6-key editing-keypad, + kdch1=\E[3~, + kich1=\E[2~, + knp=\E[6~, + kpp=\E[5~, + use=xterm+vt+edit, + +xterm+pc+edit|fragment for pc-style editing keypad, + kend=\E[4~, + khome=\E[1~, + +xterm+vt+edit|fragment for vt220-style editing keypad, + kfnd=\E[1~, + kslt=\E[4~, + +xterm+noalt|xterm without altscreen, + rmcup@, + smcup@, + +xterm+alt1049|xterm 90 feature, + rmcup=\E[?1049l, + smcup=\E[?1049h, + +xterm+titlestack|xterm 251 feature, + rmcup=\E[23;0;0t, + smcup=\E[22;0;0t, + +xterm+alt+title|xterm 90 and 251 features combined, + rmcup=\E[?1049l\E[23;0;0t, + smcup=\E[?1049h\E[22;0;0t, + +# from development after ncurses 6.1: +# Xterm's emulation of the VT100 numeric keypad on a PC-keyboard runs into the +# problem that the keypad layout is different, and that the natural choice for +# PF1 is NumLock (which happens to be reserved for other use). To work around +# that, PF1-PF4 are emulated via F1-F4, which leaves the "/", "*" and "+" not +# directly related to VT100. +# +# With the VT220 keypad block that uses the 1-9 keys as suggested in +# terminfo(5), the other keys can be handled with user-defined capabilities: +# +# _______________________________________ +# | NumLock | / | * | - | +# | | $Oo | $Oj | $OS | +# |_________|__kpDIV__|__kpMUL__|__kpSUB__| +# | 7 8 9 | | +# | $Ow | $Ox | $Oy | + | +# |_ka1__K1_|_________|_ka3__K3_| $Ok | +# | 4 | 5 | 6 | kpADD | +# | $Ot | $Ou | $Ov | | +# |_________|_kb2__K2_|_________|_________| +# | 1 | 2 | 3 | | +# | $Oq | $Or | $Os | | +# |_kc1__K4_|_________|_kc3__K5_| enter | +# | 0 | . | $OM | +# | $Op | $On | | +# |___________________|_________|_kent_@8_| +xterm+keypad|xterm emulating VT100/VT220 numeric keypad, + kp5=\EOE, + kpADD=\EOk, + kpCMA=\EOl, + kpDIV=\EOo, + kpDOT=\EOn, + kpMUL=\EOj, + kpSUB=\EOm, + kpZRO=\EOp, + use=vt220+keypad, + +# from development after ncurses 5.2: +# A better adaptation to modern keyboards such as the PC's, which have a dozen +# function keys and the keypad 2,4,6,8 keys are labeled with arrows keys, is to +# use the 5-key arrangement to model the arrow keys as suggested in the +# terminfo guidelines: +# _______________________________________ +# | PF1 | PF2 | PF3 | PF4 | +# | $OP | $OQ | $OR | $OS | +# |_kf1__k1_|_kf2__k2_|_kf3__k3_|_kf4__k4_| +# | 7 8 9 - | +# | $Ow | $Ox | $Oy | $Om | +# |_ka1__K1_|_________|_ka3__K3_|_________| +# | 4 | 5 | 6 | , | +# | $Ot | $Ou | $Ov | $Ol | +# |_________|_kb2__K2_|_________|_________| +# | 1 | 2 | 3 | | +# | $Oq | $Or | $Os | enter | +# |_kc1__K4_|_________|_kc3__K5_| $OM | +# | 0 | . | | +# | $Op | $On | | +# |___________________|_________|_kent_@8_| +vt220+keypad|dec vt220 numeric keypad, + ka1=\EOw, + ka3=\EOy, + kb2=\EOu, + kc1=\EOq, + kc3=\EOs, + kent=\EOM, + kf1=\EOP, + kf2=\EOQ, + kf3=\EOR, + kf4=\EOS, + ka2=\EOx, + kb1=\EOt, + kb3=\EOv, + kc2=\EOr, +# +# This should work for the commonly used "color xterm" variations (XFree86 +# xterm, color_xterm, nxterm, rxvt). Note that it does not set 'bce', so for +# XFree86 and and rxvt, some applications that use colors will be less +# efficient, and in a few special cases (with "smart" optimization) the wrong +# color will be painted in spots. +xterm-color|generic "ANSI" color xterm (X Window System), + colors#8, + ncv@, + pairs#64, + op=\E[m, + setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, + use=xterm-r6, +# +# vi may work better with this entry, because vi +# doesn't use insert mode much +xterm-ic|xterm-vi|xterm with insert character instead of insert mode, + mir@, + ich=\E[%p1%d@, + ich1=\E[@, + rmir@, + smir@, + use=xterm, +# +# This is used only for testing (it's not relevant to DEC VTxxx terminals, but +# to ncurses). +xterm-xmc|xterm with magic-cookie glitch, + xmc#1, + use=xterm-new, +# +# This one was originally for testing ncurses. While the ISO 6429 defines the +# REP control, none of the DEC VTxxx terminals (VT52 through VT525) support it. +# +# The feature's inclusion in xterm was prompted by changes in ncurses to +# support testing repeat_char by Alexander Lukyanov, since no readily-available +# terminal supported this: +# +# + Alexander's patch was integrated in ncurses 1996/09/28 +# + xterm patch #32 1996/11/21 was released in XFree86 3.2A 1997/01/26 +# +# In July 2017, the feature was added to xterm-new in ncurses, making this +# entry obsolete (but it is kept for reference). +xterm-rep|xterm with repeat-character control, + rep=%p1%c\E[%p2%{1}%-%db, + use=xterm-new, +# +# This is mainly for testing xterm; the real VT220 will not let you switch +# character sets without first altering the keyboard language in the setup +# screen. Some emulators allow this anyway. (Note that these strings are +# normally used only for printers). The parameter to csnm and scs is the same +# in both cases: the keyboard language parameter returned by CSI ? 2 6 n. +xterm-nrc|xterm with VT220 national replacement character sets, + csnm= + %? + %p1%{1}%= + %tNorth\sAmerican + %e + %p1%{2}%= + %tBritish + %e + %p1%{3}%= + %tFlemish + %e + %p1%{4}%= + %tFrench\sCanadian + %e + %p1%{5}%= + %tDanish + %e + %p1%{6}%= + %tFinnish + %e + %p1%{7}%= + %tGerman + %e + %p1%{8}%= + %tDutch + %e + %p1%{9}%= + %tItalian + %e + %p1%{10}%= + %tSwiss\s(French) + %e + %p1%{11}%= + %tSwiss\s(German) + %e + %p1%{12}%= + %tSwedish + %e + %p1%{13}%= + %tNorwegian + %e + %p1%{14}%= + %tFrench/Belgian + %e + %p1%{15}%= + %tSpanish + %;, + scs= + %? + %p1%{1}%= + %t\E(B + %e + %p1%{2}%= + %t\E(A + %e + %p1%{3}%= + %t\E(R + %e + %p1%{4}%= + %t\E(9 + %e + %p1%{5}%= + %t\E(E + %e + %p1%{6}%= + %t\E(5 + %e + %p1%{7}%= + %t\E(K + %e + %p1%{8}%= + %t\E(4 + %e + %p1%{9}%= + %t\E(Y + %e + %p1%{10}%= + %t\E(= + %e + %p1%{11}%= + %t\E(= + %e + %p1%{12}%= + %t\E(7 + %e + %p1%{13}%= + %t\E(E + %e + %p1%{14}%= + %t\E(R + %e + %p1%{15}%= + %t\E(Z + %;, + use=xterm-new, +# +# Foreground 0-15 maps (with toggles) into 30-37 & 90-97 +# Background 0-15 maps (with toggles) into 40-47 & 100-107 +# +# Originally I suppressed setaf/setab, since ANSI specifies only 8 colors, but +# Stephen Marley persuaded me to allow the "ANSI" color controls to extend to +# 16 colors. (Note that ncurses 4.2 uses setf/setb from this description; +# however 5.0 selects either according to their availability). - T.Dickey +# +# SVr4 curses does not use more than 8 colors anyway, so using 16 colors is +# either for terminfo-level applications or via ncurses. +xterm-16color|xterm with 16 colors, + colors#16, + pairs#0x100, + setab=\E[ + %? + %p1%{8}%< + %t%p1%{40}%+ + %e + %p1%{92}%+ + %; + %dm, + setaf=\E[ + %? + %p1%{8}%< + %t%p1%{30}%+ + %e + %p1%{82}%+ + %; + %dm, + setb= + %p1%{8}%/%{6}%*%{4}%+\E[%d%p1%{8}%m%Pa + %?%ga%{1}%= + %t4 + %e%ga%{3}%= + %t6 + %e%ga%{4}%= + %t1 + %e%ga%{6}%= + %t3 + %e%ga%d + %; + m, + setf= + %p1%{8}%/%{6}%*%{3}%+\E[%d%p1%{8}%m%Pa + %?%ga%{1}%= + %t4 + %e%ga%{3}%= + %t6 + %e%ga%{4}%= + %t1 + %e%ga%{6}%= + %t3 + %e%ga%d + %; + m, + use=xterm+256color2, + use=xterm+osc104, + use=xterm-new, + +# xterm OSC 104 resets the color palette. Using it as part of xterm+256color +# has the drawback that some of the xterm-alikes which use that building block +# require a different approach to rs1 -TD +xterm+osc104|reset color palette, + oc=\E]104\007, + rs1=\Ec\E]104\007, + +# "indexed color" is mentioned without definition in ISO 8613-6 (ITU T.416). +# +# This implementation uses a 256-element color map where the first 16 entries +# are shared with the aixterm-compatible colors (and in turn the first 8 are +# shared with the ANSI colors). The three levels (256, 16, 8) account for the +# use of a conditional expression in setaf/setab which reduces the number of +# characters sent to the screen for typical applications. +# +# 256 colors should give 65536 pairs, but SVr4 (legacy) terminfo stores numbers +# in a signed short. Most people will not notice problems with only 32767 +# pairs. With ncurses 6.1, numbers are stored in a signed integer (at least +# 32-bits), and the inconsistency regarding pairs is eliminated. +xterm+256color|original xterm 256-color feature, + ccc, + colors#0x100, + pairs#0x10000, + initc=\E]4; + %p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\, + oc=\E]104\007, + setab=\E[ + %? + %p1%{8}%< + %t4%p1%d + %e + %p1%{16}%< + %t10%p1%{8}%-%d + %e48;5; + %p1%d + %; + m, + setaf=\E[ + %? + %p1%{8}%< + %t3%p1%d + %e + %p1%{16}%< + %t9%p1%{8}%-%d + %e38;5; + %p1%d + %; + m, + setb@, + setf@, +xterm+256color2|xterm 256-color feature, + setab=\E[ + %? + %p1%{8}%< + %t4%p1%d + %e + %p1%{16}%< + %t10%p1%{8}%-%d + %e48\:5\: + %p1%d + %; + m, + setaf=\E[ + %? + %p1%{8}%< + %t3%p1%d + %e + %p1%{16}%< + %t9%p1%{8}%-%d + %e38\:5\: + %p1%d + %; + m, + use=xterm+256color, +xterm-256color|xterm with 256 colors, + use=xterm+256color2, + use=xterm+osc104, + use=xterm-new, +xterm-88color|xterm with 88 colors, + colors#88, + pairs#7744, + use=xterm-256color, + +# "direct color" is mentioned without definition in ISO 8613-6 (ITU T.416). +# +# This is a particular implementation which assume 8-bit values for red, green, +# and blue. Other encodings are possible; none are addressed by that standard. +# +# The "RGB" flag is an ncurses 6.1 extension which tells the library how to +# quickly compute the color-content for a given color value. +# +# Like xterm+256color, this uses a conditional expression. But it does that +# for a different reason: to make it readily usable for applications which +# print text but also use RGB colors, it uses a color map for the usual ANSI +# colors (0-7) and RGB colors for the remaining range of the color value. +xterm+direct|xterm with direct-color indexing, + RGB, + colors#0x1000000, + pairs#0x10000, + CO#8, + initc@, + op=\E[39;49m, + setab=\E[ + %? + %p1%{8}%< + %t4%p1%d + %e48\:2\:\: + %p1%{65536}%/%d\:%p1%{256}%/%{255}%&%d\:%p1%{255}%&%d + %; + m, + setaf=\E[ + %? + %p1%{8}%< + %t3%p1%d + %e38\:2\:\: + %p1%{65536}%/%d\:%p1%{256}%/%{255}%&%d\:%p1%{255}%&%d + %; + m, + setb@, + setf@, +xterm-direct|xterm with direct-color indexing, + use=xterm+direct, + use=xterm, +# +# This is an 8-bit version of xterm, which emulates DEC vt220 with ANSI color. +# To use it, your decTerminalID resource must be set to 200 or above, and the +# sunKeyboard resource set to true. +# +# HTS \E H \210 +# RI \E M \215 +# SS3 \E O \217 +# CSI \E [ \233 +# +xterm-8bit|xterm terminal emulator with 8-bit controls (X Window System), + OTbs, + am, + bce, + km, + mc5i, + mir, + msgr, + npc, + xenl, + AX, + colors#8, + cols#80, + it#8, + lines#24, + pairs#64, + acsc=``aaffggiijjkkllmmnnooppqqr + rssttuuvvwwxxyyzz{{||}}~~, + bel=^G, + blink=\2335m, + bold=\2331m, + cbt=\233Z, + civis=\233?25l, + clear=\233H\2332J, + cnorm=\233?25l\233?25h, + cr=\r, + csr=\233%i%p1%d;%p2%dr, + cub=\233%p1%dD, + cub1=^H, + cud=\233%p1%dB, + cud1=\n, + cuf=\233%p1%dC, + cuf1=\233C, + cup=\233%i%p1%d;%p2%dH, + cuu=\233%p1%dA, + cuu1=\233A, + cvvis=\233?12;25h, + dch=\233%p1%dP, + dch1=\233P, + dl=\233%p1%dM, + dl1=\233M, + ech=\233%p1%dX, + ed=\233J, + el=\233K, + el1=\2331K, + flash=\233?5h$<100/>\233?5l, + home=\233H, + hpa=\233%i%p1%dG, + ht=^I, + hts=\210, + ich=\233%p1%d@, + il=\233%p1%dL, + il1=\233L, + ind=\n, + invis=\2338m, + is2=\E[62"p\E\sG\233m\233?7h\E> + \E7\233?1;3;4;6l\2334l\233r + \E8, + ka1=\217w, + ka3=\217u, + kb2=\217y, + kbeg=\217E, + kc1=\217q, + kc3=\217s, + kcbt=\233Z, + kcub1=\217D, + kcud1=\217B, + kcuf1=\217C, + kcuu1=\217A, + kdch1=\2333~, + kend=\2334~, + kent=\217M, + kf1=\23311~, + kf10=\23321~, + kf11=\23323~, + kf12=\23324~, + kf13=\23325~, + kf14=\23326~, + kf15=\23328~, + kf16=\23329~, + kf17=\23331~, + kf18=\23332~, + kf19=\23333~, + kf2=\23312~, + kf20=\23334~, + kf3=\23313~, + kf4=\23314~, + kf5=\23315~, + kf6=\23317~, + kf7=\23318~, + kf8=\23319~, + kf9=\23320~, + khome=\2331~, + kich1=\2332~, + kmous=\233M, + knp=\2336~, + kpp=\2335~, + mc0=\233i, + mc4=\2334i, + mc5=\2335i, + meml=\El, + memu=\Em, + op=\23339;49m, + rc=\E8, + rev=\2337m, + ri=\215, + rmacs=\E(B, + rmam=\233?7l, + rmcup=\233?1049l, + rmir=\2334l, + rmkx=\233?1l\E>, + rmso=\23327m, + rmul=\23324m, + rs1=\Ec, + rs2=\E[62"p\E\sG\233m\233?7h\E> + \E7\233?1;3;4;6l\2334l\233r + \E8, + sc=\E7, + setab=\2334%p1%dm, + setaf=\2333%p1%dm, + setb=\2334 + %? + %p1%{1}%= + %t4 + %e + %p1%{3}%= + %t6 + %e + %p1%{4}%= + %t1 + %e + %p1%{6}%= + %t3 + %e + %p1%d + %; + m, + setf=\2333 + %? + %p1%{1}%= + %t4 + %e + %p1%{3}%= + %t6 + %e + %p1%{4}%= + %t1 + %e + %p1%{6}%= + %t3 + %e + %p1%d + %; + m, + sgr=\2330 + %? + %p6 + %t;1 + %; + %? + %p2 + %t;4 + %; + %? + %p1%p3%| + %t;7 + %; + %? + %p4 + %t;5 + %; + %? + %p7 + %t;8 + %; + m + %? + %p9 + %t\E(0 + %e + \E(B + %;, + sgr0=\2330m\E(B, + smacs=\E(0, + smam=\233?7h, + smcup=\233?1049h, + smir=\2334h, + smkx=\233?1h\E=, + smso=\2337m, + smul=\2334m, + tbc=\2333g, + u6=\233[%i%d;%dR, + u7=\E[6n, + u8=\233[?%[;0123456789]c, + u9=\E[c, + vpa=\233%i%p1%dd, + use=xterm+kbs, +# +xterm-xf86-v44|xterm terminal emulator (XFree86 4.4 Window System), + OTbs, + am, + bce, + km, + mc5i, + mir, + msgr, + npc, + xenl, + AX, + XT, + colors#8, + cols#80, + it#8, + lines#24, + pairs#64, + acsc=``aaffggiijjkkllmmnnooppqqr + rssttuuvvwwxxyyzz{{||}}~~, + bel=^G, + blink=\E[5m, + bold=\E[1m, + cbt=\E[Z, + civis=\E[?25l, + clear=\E[H\E[2J, + cnorm=\E[?12l\E[?25h, + cr=\r, + csr=\E[%i%p1%d;%p2%dr, + cub=\E[%p1%dD, + cub1=^H, + cud=\E[%p1%dB, + cud1=\n, + cuf=\E[%p1%dC, + cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, + cuu=\E[%p1%dA, + cuu1=\E[A, + cvvis=\E[?12;25h, + dch=\E[%p1%dP, + dch1=\E[P, + dl=\E[%p1%dM, + dl1=\E[M, + ech=\E[%p1%dX, + ed=\E[J, + el=\E[K, + el1=\E[1K, + enacs=\E(B\E)0, + flash=\E[?5h$<100/>\E[?5l, + home=\E[H, + hpa=\E[%i%p1%dG, + ht=^I, + hts=\EH, + ich=\E[%p1%d@, + il=\E[%p1%dL, + il1=\E[L, + ind=\n, + indn=\E[%p1%dS, + invis=\E[8m, + is2=\E[!p\E[?3;4l\E[4l\E>, + kDC=\E[3;2~, + kEND=\E[1;2F, + kHOM=\E[1;2H, + kIC=\E[2;2~, + kLFT=\E[1;2D, + kNXT=\E[6;2~, + kPRV=\E[5;2~, + kRIT=\E[1;2C, + kb2=\EOE, + kcbt=\E[Z, + kcub1=\EOD, + kcud1=\EOB, + kcuf1=\EOC, + kcuu1=\EOA, + kdch1=\E[3~, + kend=\EOF, + kent=\EOM, + kf1=\EOP, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\EO2P, + kf14=\EO2Q, + kf15=\EO2R, + kf16=\EO2S, + kf17=\E[15;2~, + kf18=\E[17;2~, + kf19=\E[18;2~, + kf2=\EOQ, + kf20=\E[19;2~, + kf21=\E[20;2~, + kf22=\E[21;2~, + kf23=\E[23;2~, + kf24=\E[24;2~, + kf25=\EO5P, + kf26=\EO5Q, + kf27=\EO5R, + kf28=\EO5S, + kf29=\E[15;5~, + kf3=\EOR, + kf30=\E[17;5~, + kf31=\E[18;5~, + kf32=\E[19;5~, + kf33=\E[20;5~, + kf34=\E[21;5~, + kf35=\E[23;5~, + kf36=\E[24;5~, + kf37=\EO6P, + kf38=\EO6Q, + kf39=\EO6R, + kf4=\EOS, + kf40=\EO6S, + kf41=\E[15;6~, + kf42=\E[17;6~, + kf43=\E[18;6~, + kf44=\E[19;6~, + kf45=\E[20;6~, + kf46=\E[21;6~, + kf47=\E[23;6~, + kf48=\E[24;6~, + kf5=\E[15~, + kf6=\E[17~, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + khome=\EOH, + kich1=\E[2~, + kmous=\E[M, + knp=\E[6~, + kpp=\E[5~, + mc0=\E[i, + mc4=\E[4i, + mc5=\E[5i, + meml=\El, + memu=\Em, + op=\E[39;49m, + rc=\E8, + rev=\E[7m, + ri=\EM, + rin=\E[%p1%dT, + rmacs=^O, + rmam=\E[?7l, + rmir=\E[4l, + rmkx=\E[?1l\E>, + rmso=\E[27m, + rmul=\E[24m, + rs1=\Ec, + rs2=\E[!p\E[?3;4l\E[4l\E>, + sc=\E7, + setab=\E[4%p1%dm, + setaf=\E[3%p1%dm, + setb=\E[4 + %? + %p1%{1}%= + %t4 + %e + %p1%{3}%= + %t6 + %e + %p1%{4}%= + %t1 + %e + %p1%{6}%= + %t3 + %e + %p1%d + %; + m, + setf=\E[3 + %? + %p1%{1}%= + %t4 + %e + %p1%{3}%= + %t6 + %e + %p1%{4}%= + %t1 + %e + %p1%{6}%= + %t3 + %e + %p1%d + %; + m, + sgr=\E[0 + %? + %p6 + %t;1 + %; + %? + %p2 + %t;4 + %; + %? + %p1%p3%| + %t;7 + %; + %? + %p4 + %t;5 + %; + %? + %p7 + %t;8 + %; + m + %? + %p9 + %t\016 + %e + \017 + %;, + sgr0=\E[m\017, + smacs=^N, + smam=\E[?7h, + smir=\E[4h, + smkx=\E[?1h\E=, + smso=\E[7m, + smul=\E[4m, + tbc=\E[3g, + u6=\E[%i%d;%dR, + u7=\E[6n, + u8=\E[?1;2c, + u9=\E[c, + vpa=\E[%i%p1%dd, + ka2=\EOx, + kb1=\EOt, + kb3=\EOv, + kc2=\EOr, + use=xterm+alt1049, + use=xterm+kbs, +xterm-xfree86|xterm terminal emulator (XFree86 4.4 Window System), + use=xterm-xf86-v44, +# +# Compatible with the R6 xterm, with the following changes: +# + added acsc (perhaps some versions of tic assume the standard vt100 +# alternate character set) +# + added u6, u7, u8, u9 strings for Daniel Weaver's tack program. +# + added kmous string for ncurses. +# + added khome/kend strings (which conflict with kfnd/kslt, see note). +xterm-r6|xterm X11R6 version, + OTbs, + am, + km, + mir, + msgr, + xenl, + cols#80, + it#8, + lines#24, + acsc=``aaffggiijjkkllmmnnooppqqr + rssttuuvvwwxxyyzz{{||}}~~, + bel=^G, + bold=\E[1m, + clear=\E[H\E[2J, + cr=\r, + csr=\E[%i%p1%d;%p2%dr, + cub=\E[%p1%dD, + cub1=^H, + cud=\E[%p1%dB, + cud1=\n, + cuf=\E[%p1%dC, + cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, + cuu=\E[%p1%dA, + cuu1=\E[A, + dch=\E[%p1%dP, + dch1=\E[P, + dl=\E[%p1%dM, + dl1=\E[M, + ed=\E[J, + el=\E[K, + enacs=\E)0, + home=\E[H, + ht=^I, + hts=\EH, + il=\E[%p1%dL, + il1=\E[L, + ind=\n, + is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[ + ?1;3;4;6l\E8, + kcub1=\EOD, + kcud1=\EOB, + kcuf1=\EOC, + kcuu1=\EOA, + kdch1=\E[3~, + kf1=\E[11~, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf13=\E[25~, + kf14=\E[26~, + kf15=\E[28~, + kf16=\E[29~, + kf17=\E[31~, + kf18=\E[32~, + kf19=\E[33~, + kf2=\E[12~, + kf20=\E[34~, + kf3=\E[13~, + kf4=\E[14~, + kf5=\E[15~, + kf6=\E[17~, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + kmous=\E[M, + meml=\El, + memu=\Em, + rc=\E8, + rev=\E[7m, + ri=\EM, + rmacs=^O, + rmcup=\E[2J\E[?47l\E8, + rmir=\E[4l, + rmkx=\E[?1l\E>, + rmso=\E[m, + rmul=\E[m, + rs2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[ + ?1;3;4;6l\E8, + sc=\E7, + sgr0=\E[m, + smacs=^N, + smcup=\E7\E[?47h, + smir=\E[4h, + smkx=\E[?1h\E=, + smso=\E[7m, + smul=\E[4m, + tbc=\E[3g, + u6=\E[%i%d;%dR, + u7=\E[6n, + u8=\E[?1;2c, + u9=\E[c, + use=xterm+kbs, + use=xterm+decedit, +xterm-old|antique xterm version, + use=xterm-r6, +# +# Compatible with the R5 xterm, with the following changes: +# + changed 'blink=@', to 'blink@' (the former meant that "@" would start +# a blink, the latter that it is not supported). +# + changed kf1 through kf4 to correspond with actual usage. Though X +# supports keypad symbols for PF1 to PF4, and xterm interprets these +# correctly, the F1 to F4 codes are commonly (but incorrectly) used. +# + moved reset string from rs1 to rs2, to correlate better with termcap. +# + make khome consistent with other entries. +# + use rmul/smul, rmir/smir from termcap, but not rmcup/smcup because +# not everyone wants the alternate screen. +# + added u6, u7, u8, u9 strings for Daniel Weaver's tack program. +# + added kmous string for ncurses. +xterm-r5|xterm R5 version, + OTbs, + am, + km, + msgr, + xenl, + cols#80, + it#8, + lines#24, + bel=^G, + bold=\E[1m, + clear=\E[H\E[2J, + cr=\r, + csr=\E[%i%p1%d;%p2%dr, + cub=\E[%p1%dD, + cub1=^H, + cud=\E[%p1%dB, + cud1=\n, + cuf=\E[%p1%dC, + cuf1=\E[C, + cup=\E[%i%p1%d;%p2%dH, + cuu=\E[%p1%dA, + cuu1=\E[A, + dch=\E[%p1%dP, + dch1=\E[P, + dl=\E[%p1%dM, + dl1=\E[M, + ed=\E[J, + el=\E[K, + home=\E[H, + ht=^I, + hts=\EH, + ich=\E[%p1%d@, + ich1=\E[@, + il=\E[%p1%dL, + il1=\E[L, + ind=\n, + kcub1=\EOD, + kcud1=\EOB, + kcuf1=\EOC, + kcuu1=\EOA, + kdch1=\E[3~, + kdl1=\E[31~, + kel=\E[8~, + kend=\E[4~, + kf0=\EOq, + kf1=\E[11~, + kf10=\E[21~, + kf11=\E[23~, + kf12=\E[24~, + kf2=\E[12~, + kf3=\E[13~, + kf4=\E[14~, + kf5=\E[15~, + kf6=\E[17~, + kf7=\E[18~, + kf8=\E[19~, + kf9=\E[20~, + khome=\E[1~, + kich1=\E[2~, + kil1=\E[30~, + kmous=\E[M, + knp=\E[6~, + kpp=\E[5~, + rc=\E8, + rev=\E[7m, + ri=\EM, + rmir=\E[4l, + rmkx=\E[?1l\E>, + rmso=\E[m, + rmul=\E[m, + rs2=\E>\E[?1;3;4;5;6l\E[4l\E[?7h + \E[m\E[r\E[2J\E[H, + sc=\E7, + sgr=\E[ + %? + %p1 + %t;7 + %; + %? + %p2 + %t;4 + %; + %? + %p3 + %t;7 + %; + %? + %p4 + %t;5 + %; + %? + %p6 + %t;1 + %; + m, + sgr0=\E[m, + smir=\E[4h, + smkx=\E[?1h\E=, + smso=\E[7m, + smul=\E[4m, + tbc=\E[3g, + u6=\E[%i%d;%dR, + u7=\E[6n, + u8=\E[?1;2c, + u9=\E[c, + use=xterm+kbs, +# +# +# Customization begins here. +# +# This is the only entry which you should have to customize, since "xterm" +# is widely used for a variety of incompatible terminal emulations including +# color_xterm and rxvt. +xterm|X11 terminal emulator, + use=xterm-new, +# use=xterm-r6, + +# This fragment is for people who cannot agree on what the backspace key +# should send. +xterm+kbs|fragment for backspace key, + kbs=^H, +# kbs=^?, diff --git a/ports/xterm/xterm-359/testxmc.c b/ports/xterm/xterm-359/testxmc.c new file mode 100644 index 0000000..1af2c08 --- /dev/null +++ b/ports/xterm/xterm-359/testxmc.c @@ -0,0 +1,232 @@ +/* $XTermId: testxmc.c,v 1.53 2019/06/30 18:56:50 tom Exp $ */ + +/* + * Copyright 1997-2014,2019 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +/* + * This module provides test support for curses applications that must work + * with terminals that have the xmc (magic cookie) glitch. The xmc_glitch + * resource denotes the number of spaces that are emitted when switching to or + * from standout (reverse) mode. Some terminals implement this by storing the + * attribute controls in the character cell that is skipped. So if the cell is + * overwritten by text, then the attribute change in the cell is cancelled, + * causing attributes to the left of the change to propagate. + * + * We implement the glitch by writing a character that won't be mistaken for + * other normal characters (and mapping normal writes to that character to a + * different one). + * + * Since xmc isn't normally part of xterm, we document it here rather than in + * the man-page. This module is driven by resources rather than by the + * termcap/terminfo description to make it a little more flexible for testing + * purposes. + * + * Resources: + * + * xmcGlitch (class XmcGlitch) + * When true, enables this extension. The default is `0', which disables + * the module. (termcap sg, terminfo xmc). + * + * xmcAttributes (class XmcAttributes) + * The attributes for which we'll generate a glitch, as a bitmask. + * + * INVERSE 1 + * UNDERLINE 2 + * BOLD 4 + * BLINK 8 + * + * The default is `1' (INVERSE). Some terminals emit glitches for + * underline. Just for completeness, we recognize all of the video + * attributes. + * + * xmcInline (class XmcInline) + * When true, limits the extent of an SGR change to the current line. + * The default is `false'. (No termcap or terminfo equivalent, though + * there are comments in some entries relating to this issue). + * + * xmcMoveSGR (class XmcMoveSGR) + * When false, a cursor movement will leave a glitch when SGR's are + * active. The default is `true'. (termcap ms, terminfo msgr). + * + * TODO: + * When xmc is active, the terminfo max_attributes (ma) capability is + * assumed to be 1. + * + * The xmcAttributes resource should also apply to alternate character + * sets and to color. + */ + +#include +#include + +#define MARK_ON(a) (Bool) ((my_attrs & a) != 0 && (xw->flags & (whichone = CharOf(a))) == 0) +#define MARK_OFF(a) (Bool) ((my_attrs & a) != 0 && (xw->flags & (whichone = CharOf(a))) != 0) + +void +Mark_XMC(XtermWidget xw, int param) +{ + static IChar *glitch; + + TScreen *screen = TScreenOf(xw); + Bool found = False; + unsigned my_attrs = CharOf(screen->xmc_attributes & XMC_FLAGS); + unsigned whichone = 0; + + if (glitch == 0) { + unsigned len = screen->xmc_glitch; + glitch = TypeMallocN(IChar, len); + if (glitch == NULL) { + xtermWarning("Not enough core for xmc glitch mode\n"); + return; + } else { + while (len--) + glitch[len] = XMC_GLITCH; + } + } + switch (param) { + case -1: /* DEFAULT */ + case 0: /* FALLTHRU */ + found = MARK_OFF((xw->flags & XMC_FLAGS)); + break; + case 1: + found = MARK_ON(BOLD); + break; + case 4: + found = MARK_ON(UNDERLINE); + break; + case 5: + found = MARK_ON(BLINK); + break; + case 7: + found = MARK_ON(INVERSE); + break; + case 22: + found = MARK_OFF(BOLD); + break; + case 24: + found = MARK_OFF(UNDERLINE); + break; + case 25: + found = MARK_OFF(BLINK); + break; + case 27: + found = MARK_OFF(INVERSE); + break; + } + + /* + * Write a glitch with the attributes temporarily set to the new(er) + * ones. + */ + if (found) { + unsigned save = xw->flags; + xw->flags ^= whichone; + TRACE(("XMC Writing glitch (%d/%d) after SGR %d\n", my_attrs, + whichone, param)); + dotext(xw, '?', glitch, screen->xmc_glitch); + xw->flags = save; + } +} + +/* + * Force a glitch on cursor movement when we're in standout mode and not at the + * end of a line. + */ +void +Jump_XMC(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + if (!screen->move_sgr_ok + && screen->cur_col <= LineMaxCol(screen, + getLineData(screen, screen->cur_row))) { + Mark_XMC(xw, -1); + } +} + +/* + * After writing text to the screen, resolve mismatch between the current + * location and any attributes that would have been set by preceding locations. + */ +void +Resolve_XMC(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + LineData *ld; + Bool changed = False; + IAttr start; + IAttr my_attrs = CharOf(screen->xmc_attributes & XMC_FLAGS); + int row = screen->cur_row; + int col = screen->cur_col; + + /* Find the preceding cell. + */ + ld = getLineData(screen, row); + if (ld->charData[col] != XMC_GLITCH) { + if (col != 0) { + col--; + } else if (!screen->xmc_inline && row != 0) { + ld = getLineData(screen, --row); + col = LineMaxCol(screen, ld); + } + } + start = (ld->attribs[col] & my_attrs); + + /* Now propagate the starting state until we reach a cell which holds + * a glitch. + */ + for (;;) { + if (col < LineMaxCol(screen, ld)) { + col++; + } else if (!screen->xmc_inline && row < screen->max_row) { + col = 0; + ld = getLineData(screen, ++row); + } else + break; + if (ld->charData[col] == XMC_GLITCH) + break; + if ((ld->attribs[col] & my_attrs) != start) { + ld->attribs[col] = + (IAttr) (start | (ld->attribs[col] & ~my_attrs)); + changed = True; + } + } + + TRACE(("XMC %s (%s:%d/%d) from %d,%d to %d,%d\n", + changed ? "Ripple" : "Nochange", + BtoS(xw->flags & my_attrs), + my_attrs, start, + screen->cur_row, screen->cur_col, + row, col)); + + if (changed) { + ScrnUpdate(xw, screen->cur_row, 0, row + 1 - screen->cur_row, + MaxCols(screen), True); + } +} diff --git a/ports/xterm/xterm-359/trace.c b/ports/xterm/xterm-359/trace.c new file mode 100644 index 0000000..ce3ff6d --- /dev/null +++ b/ports/xterm/xterm-359/trace.c @@ -0,0 +1,1464 @@ +/* $XTermId: trace.c,v 1.219 2020/06/02 00:55:23 tom Exp $ */ + +/* + * Copyright 1997-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +/* + * debugging support via TRACE macro. + */ + +#include /* for definition of GCC_UNUSED */ +#include +#include +#include + +#if OPT_TRACE + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef HAVE_X11_TRANSLATEI_H +#include +#include +#else +#ifdef __cplusplus +extern "C" { +#endif + + extern String _XtPrintXlations(Widget w, + XtTranslations xlations, + Widget accelWidget, + _XtBoolean includeRHS); +#ifdef __cplusplus +} +#endif +#endif +const char *trace_who = "parent"; + +static FILE *trace_fp; + +static FILE * +TraceOpen(void) +{ + static const char *trace_out; + + if (trace_fp != 0 + && trace_who != trace_out) { + fclose(trace_fp); + trace_fp = 0; + } + trace_out = trace_who; + + if (!trace_fp) { + mode_t oldmask = umask(077); + char name[BUFSIZ]; +#if 0 /* usually I do not want unique names */ + int unique; + for (unique = 0;; ++unique) { + if (unique) + sprintf(name, "Trace-%s.out-%d", trace_who, unique); + else + sprintf(name, "Trace-%s.out", trace_who); + if ((trace_fp = fopen(name, "r")) == 0) { + break; + } + fclose(trace_fp); + } +#else + sprintf(name, "Trace-%s.out", trace_who); +#endif + trace_fp = fopen(name, "w"); + /* + * Try to put the trace-file in user's home-directory if the current + * directory is not writable. + */ + if (trace_fp == 0) { + char *home = getenv("HOME"); + if (home != 0) { + sprintf(name, "%.*s/Trace-%.8s.out", + (BUFSIZ - 21), home, + trace_who); + trace_fp = fopen(name, "w"); + } + } + if (trace_fp != 0) { + fprintf(trace_fp, "%s\n", xtermVersion()); + TraceIds(NULL, 0); + } + if (!trace_fp) { + xtermWarning("Cannot open \"%s\"\n", name); + exit(EXIT_FAILURE); + } + (void) umask(oldmask); + } + return trace_fp; +} + +void +Trace(const char *fmt, ...) +{ + va_list ap; + FILE *fp = TraceOpen(); + + va_start(ap, fmt); + vfprintf(fp, fmt, ap); + (void) fflush(fp); + va_end(ap); +} + +void +TraceVA(const char *fmt, va_list ap) +{ + FILE *fp = TraceOpen(); + + vfprintf(fp, fmt, ap); + (void) fflush(fp); +} + +void +TraceClose(void) +{ + if (trace_fp != 0) { + (void) fclose(trace_fp); + (void) fflush(stdout); + (void) fflush(stderr); + (void) visibleChars(NULL, 0); + (void) visibleIChars(NULL, 0); + trace_fp = 0; + } +} + +void +TraceXError(Display *d, XErrorEvent *ev) +{ + FILE *fp = TraceOpen(); + (void) XmuPrintDefaultErrorMessage(d, ev, fp); + (void) fflush(fp); +} + +void +TraceIds(const char *fname, int lnum) +{ + Trace("process %d ", (int) getpid()); +#ifdef HAVE_UNISTD_H + Trace("real (%u/%u) effective (%u/%u)", + (unsigned) getuid(), (unsigned) getgid(), + (unsigned) geteuid(), (unsigned) getegid()); +#endif + if (fname != 0) { + Trace(" (%s@%d)\n", fname, lnum); + } else { + time_t now = time((time_t *) 0); + Trace("-- %s", ctime(&now)); + } +} + +void +TraceTime(const char *fname, int lnum) +{ + time_t now; + if (fname != 0) { + Trace("datetime (%s@%d) ", fname, lnum); + } + now = time((time_t *) 0); + Trace("-- %s", ctime(&now)); +} + +static void +formatAscii(char *dst, unsigned value) +{ + switch (value) { + case '\\': + sprintf(dst, "\\\\"); + break; + case '\b': + sprintf(dst, "\\b"); + break; + case '\n': + sprintf(dst, "\\n"); + break; + case '\r': + sprintf(dst, "\\r"); + break; + case '\t': + sprintf(dst, "\\t"); + break; + default: + if (E2A(value) < 32 || (E2A(value) >= 127 && E2A(value) < 160)) + sprintf(dst, "\\%03o", value & 0xff); + else + sprintf(dst, "%c", CharOf(value)); + break; + } +} + +#if OPT_DEC_CHRSET + +const char * +visibleDblChrset(unsigned chrset) +{ + const char *result = "?"; + switch (chrset) { + case CSET_SWL: + result = "CSET_SWL"; + break; + case CSET_DHL_TOP: + result = "CSET_DHL_TOP"; + break; + case CSET_DHL_BOT: + result = "CSET_DHL_BOT"; + break; + case CSET_DWL: + result = "CSET_DWL"; + break; + } + return result; +} +#endif + +const char * +visibleScsCode(DECNRCM_codes chrset) +{ +#define MAP(to,from) case from: result = to ":" #from; break + const char *result = ""; + switch ((DECNRCM_codes) chrset) { + MAP("B", nrc_ASCII); + MAP("A", nrc_British); + MAP("A", nrc_British_Latin_1); + MAP("&4", nrc_Cyrillic); + MAP("0", nrc_DEC_Spec_Graphic); + MAP("1", nrc_DEC_Alt_Chars); + MAP("2", nrc_DEC_Alt_Graphics); + MAP("<", nrc_DEC_Supp); + MAP("%5", nrc_DEC_Supp_Graphic); + MAP(">", nrc_DEC_Technical); + MAP("4", nrc_Dutch); + MAP("5", nrc_Finnish); + MAP("C", nrc_Finnish2); + MAP("R", nrc_French); + MAP("f", nrc_French2); + MAP("Q", nrc_French_Canadian); + MAP("9", nrc_French_Canadian2); + MAP("K", nrc_German); + MAP("\"?", nrc_DEC_Greek_Supp); + MAP("\">", nrc_Greek); + MAP("F", nrc_ISO_Greek_Supp); + MAP("\"4", nrc_DEC_Hebrew_Supp); + MAP("%=", nrc_Hebrew); + MAP("H", nrc_ISO_Hebrew_Supp); + MAP("Y", nrc_Italian); + MAP("M", nrc_ISO_Latin_5_Supp); + MAP("L", nrc_ISO_Latin_Cyrillic); + MAP("`", nrc_Norwegian_Danish); + MAP("E", nrc_Norwegian_Danish2); + MAP("6", nrc_Norwegian_Danish3); + MAP("%6", nrc_Portugese); + MAP("&5", nrc_Russian); + MAP("%3", nrc_SCS_NRCS); + MAP("Z", nrc_Spanish); + MAP("7", nrc_Swedish); + MAP("H", nrc_Swedish2); + MAP("=", nrc_Swiss); + MAP("%2", nrc_Turkish); + MAP("%0", nrc_DEC_Turkish_Supp); + MAP("", nrc_Unknown); + } +#undef MAP + return result; +} + +const char * +visibleChars(const Char *buf, unsigned len) +{ + static char *result; + static unsigned used; + + if (buf != 0) { + unsigned limit = ((len + 1) * 8) + 1; + + if (limit > used) { + used = limit; + result = XtRealloc(result, used); + } + if (result != 0) { + char *dst = result; + *dst = '\0'; + while (len--) { + unsigned value = *buf++; + formatAscii(dst, value); + dst += strlen(dst); + } + } + } else if (result != 0) { + free(result); + result = 0; + used = 0; + } + return NonNull(result); +} + +const char * +visibleEventMode(EventMode value) +{ + const char *result; + switch (value) { + case NORMAL: + result = "NORMAL"; + break; + case LEFTEXTENSION: + result = "LEFTEXTENSION"; + break; + case RIGHTEXTENSION: + result = "RIGHTEXTENSION"; + break; + default: + result = "?"; + break; + } + return result; +} + +const char * +visibleIChars(const IChar *buf, unsigned len) +{ + static char *result; + static unsigned used; + + if (buf != 0) { + unsigned limit = ((len + 1) * 8) + 1; + + if (limit > used) { + used = limit; + result = XtRealloc(result, used); + } + if (result != 0) { + char *dst = result; + *dst = '\0'; + while (len--) { + unsigned value = *buf++; +#if OPT_WIDE_CHARS + if (value > 255) + sprintf(dst, "\\U+%04X", value); + else +#endif + formatAscii(dst, value); + dst += strlen(dst); + } + } + } else if (result != 0) { + free(result); + result = 0; + used = 0; + } + return NonNull(result); +} + +const char * +visibleUChar(unsigned chr) +{ + IChar buf[1]; + buf[0] = (IChar) chr; + return visibleIChars(buf, 1); +} + +const char * +visibleEventType(int type) +{ + const char *result = "?"; + switch (type) { + CASETYPE(KeyPress); + CASETYPE(KeyRelease); + CASETYPE(ButtonPress); + CASETYPE(ButtonRelease); + CASETYPE(MotionNotify); + CASETYPE(EnterNotify); + CASETYPE(LeaveNotify); + CASETYPE(FocusIn); + CASETYPE(FocusOut); + CASETYPE(KeymapNotify); + CASETYPE(Expose); + CASETYPE(GraphicsExpose); + CASETYPE(NoExpose); + CASETYPE(VisibilityNotify); + CASETYPE(CreateNotify); + CASETYPE(DestroyNotify); + CASETYPE(UnmapNotify); + CASETYPE(MapNotify); + CASETYPE(MapRequest); + CASETYPE(ReparentNotify); + CASETYPE(ConfigureNotify); + CASETYPE(ConfigureRequest); + CASETYPE(GravityNotify); + CASETYPE(ResizeRequest); + CASETYPE(CirculateNotify); + CASETYPE(CirculateRequest); + CASETYPE(PropertyNotify); + CASETYPE(SelectionClear); + CASETYPE(SelectionRequest); + CASETYPE(SelectionNotify); + CASETYPE(ColormapNotify); + CASETYPE(ClientMessage); + CASETYPE(MappingNotify); + } + return result; +} + +const char * +visibleMappingMode(int code) +{ + const char *result = "?"; + switch (code) { + CASETYPE(MappingModifier); + CASETYPE(MappingKeyboard); + CASETYPE(MappingPointer); + } + return result; +} + +const char * +visibleNotifyMode(int code) +{ + const char *result = "?"; + switch (code) { + CASETYPE(NotifyNormal); + CASETYPE(NotifyGrab); + CASETYPE(NotifyUngrab); + CASETYPE(NotifyWhileGrabbed); + } + return result; +} + +const char * +visibleNotifyDetail(int code) +{ + const char *result = "?"; + switch (code) { + CASETYPE(NotifyAncestor); + CASETYPE(NotifyVirtual); + CASETYPE(NotifyInferior); + CASETYPE(NotifyNonlinear); + CASETYPE(NotifyNonlinearVirtual); + CASETYPE(NotifyPointer); + CASETYPE(NotifyPointerRoot); + CASETYPE(NotifyDetailNone); + } + return result; +} + +const char * +visibleSelectionTarget(Display *d, Atom a) +{ + const char *result = "?"; + + if (a == XA_STRING) { + result = "XA_STRING"; + } else if (a == XA_TEXT(d)) { + result = "XA_TEXT()"; + } else if (a == XA_COMPOUND_TEXT(d)) { + result = "XA_COMPOUND_TEXT()"; + } else if (a == XA_UTF8_STRING(d)) { + result = "XA_UTF8_STRING()"; + } else if (a == XA_TARGETS(d)) { + result = "XA_TARGETS()"; + } + + return result; +} + +const char * +visibleTekparse(int code) +{ + static const struct { + int code; + const char *name; + } table[] = { +#include "Tekparse.cin" + }; + const char *result = "?"; + Cardinal n; + for (n = 0; n < XtNumber(table); ++n) { + if (table[n].code == code) { + result = table[n].name; + break; + } + } + return result; +} + +const char * +visibleVTparse(int code) +{ + static const struct { + int code; + const char *name; + } table[] = { +#include "VTparse.cin" + }; + const char *result = "?"; + Cardinal n; + for (n = 0; n < XtNumber(table); ++n) { + if (table[n].code == code) { + result = table[n].name; + break; + } + } + return result; +} + +const char * +visibleXError(int code) +{ + static char temp[80]; + const char *result = "?"; + switch (code) { + CASETYPE(Success); + CASETYPE(BadRequest); + CASETYPE(BadValue); + CASETYPE(BadWindow); + CASETYPE(BadPixmap); + CASETYPE(BadAtom); + CASETYPE(BadCursor); + CASETYPE(BadFont); + CASETYPE(BadMatch); + CASETYPE(BadDrawable); + CASETYPE(BadAccess); + CASETYPE(BadAlloc); + CASETYPE(BadColor); + CASETYPE(BadGC); + CASETYPE(BadIDChoice); + CASETYPE(BadName); + CASETYPE(BadLength); + CASETYPE(BadImplementation); + default: + sprintf(temp, "%d", code); + result = temp; + break; + } + return result; +} + +#if OPT_TRACE_FLAGS +#define isScrnFlag(flag) ((flag) == LINEWRAPPED) + +static char * +ScrnText(LineData *ld) +{ + return visibleIChars(ld->charData, ld->lineSize); +} + +#define SHOW_BAD_LINE(name, ld) \ + Trace("OOPS " #name " bad row\n") + +#define SHOW_SCRN_FLAG(name,code) \ + Trace(#name " %s:%s\n", \ + code ? "*" : "", \ + ScrnText(ld)) + +void +LineClrFlag(LineData *ld, int flag) +{ + if (ld == 0) { + SHOW_BAD_LINE(LineClrFlag, ld); + assert(0); + } else if (isScrnFlag(flag)) { + SHOW_SCRN_FLAG(LineClrFlag, 0); + } + + LineFlags(ld) &= ~flag; +} + +void +LineSetFlag(LineData *ld, int flag) +{ + if (ld == 0) { + SHOW_BAD_LINE(LineSetFlag, ld); + assert(0); + } else if (isScrnFlag(flag)) { + SHOW_SCRN_FLAG(LineSetFlag, 1); + } + + LineFlags(ld) |= flag; +} + +int +LineTstFlag(LineData ld, int flag) +{ + int code = 0; + if (ld == 0) { + SHOW_BAD_LINE(LineTstFlag, ld); + } else { + code = LineFlags(ld); + + if (isScrnFlag(flag)) { + SHOW_SCRN_FLAG(LineTstFlag, code); + } + } + return code; +} +#endif /* OPT_TRACE_FLAGS */ + +const char * +TraceAtomName(Display *dpy, Atom atom) +{ + static char *result; + free(result); + if (atom != 0) { + result = XGetAtomName(dpy, atom); + } else { + result = x_strdup("NONE"); + } + return result; +} + +/* + * Trace the normal or alternate screen, showing color values up to 16, e.g., + * for debugging with vttest. + */ +void +TraceScreen(XtermWidget xw, int whichBuf) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->editBuf_index[whichBuf]) { + int row; + + TRACE(("TraceScreen %d:\n", whichBuf)); + for (row = 0; row <= screen->max_row; ++row) { + LineData *ld = getLineData(screen, row); + + TRACE((" %3d:", row)); + if (ld != 0) { + int col; + + for (col = 0; col < ld->lineSize; ++col) { + int ch = (int) ld->charData[col]; + if (ch < ' ') + ch = ' '; + if (ch >= 127) + ch = '#'; + TRACE(("%c", ch)); + } + TRACE((":\n")); + +#if 0 + TRACE((" xx:")); + for (col = 0; col < ld->lineSize; ++col) { + unsigned attrs = ld->attribs[col]; + char ch; + if (attrs & PROTECTED) { + ch = '*'; + } else if (attrs & BLINK) { + ch = 'B'; + } else if (attrs & CHARDRAWN) { + ch = '+'; + } else { + ch = ' '; + } + TRACE(("%c", ch)); + } + TRACE((":\n")); +#endif + +#if 0 + TRACE((" fg:")); + for (col = 0; col < ld->lineSize; ++col) { + unsigned fg = extract_fg(xw, ld->color[col], ld->attribs[col]); + if (fg > 15) + fg = 15; + TRACE(("%1x", fg)); + } + TRACE((":\n")); + + TRACE((" bg:")); + for (col = 0; col < ld->lineSize; ++col) { + unsigned bg = extract_bg(xw, ld->color[col], ld->attribs[col]); + if (bg > 15) + bg = 15; + TRACE(("%1x", bg)); + } + TRACE((":\n")); +#endif + } else { + TRACE(("null lineData\n")); + } + } + } else { + TRACE(("TraceScreen %d is nil\n", whichBuf)); + } +} + +static char * +formatEventMask(char *target, unsigned source, Boolean buttons) +{ +#define DATA(name) { name ## Mask, #name } + static struct { + unsigned mask; + const char *name; + } table[] = { + DATA(Shift), + DATA(Lock), + DATA(Control), + DATA(Mod1), + DATA(Mod2), + DATA(Mod3), + DATA(Mod4), + DATA(Mod5), + DATA(Button1), + DATA(Button2), + DATA(Button3), + DATA(Button4), + DATA(Button5), + }; +#undef DATA + Cardinal n; + char marker = L_CURL; + char *base = target; + + for (n = 0; n < XtNumber(table); ++n) { + if (!buttons && (table[n].mask >= Button1Mask)) + continue; + if ((table[n].mask & source)) { + UIntClr(source, table[n].mask); + sprintf(target, "%c%s", marker, table[n].name); + target += strlen(target); + marker = '|'; + } + } + + if (source != 0) { + sprintf(target, "%c?%#x", marker, source); + target += strlen(target); + marker = '|'; + } + + if (marker == L_CURL) + *target++ = L_CURL; + *target++ = R_CURL; + + *target = '\0'; + return base; +} + +void +TraceEvent(const char *tag, XEvent *ev, String *params, Cardinal *num_params) +{ + char mask_buffer[160]; + + TRACE(("Event #%lu %s: %#lx %s", + ev->xany.serial, + tag, + ev->xany.window, + visibleEventType(ev->type))); + + switch (ev->type) { + case KeyPress: + /* FALLTHRU */ + case KeyRelease: + TRACE((" keycode 0x%04X %s", + ev->xkey.keycode, + formatEventMask(mask_buffer, ev->xkey.state, False))); + break; + case ButtonPress: + /* FALLTHRU */ + case ButtonRelease: + TRACE((" button %u %s", + ev->xbutton.button, + formatEventMask(mask_buffer, ev->xbutton.state, True))); + break; + case MotionNotify: + TRACE((" (%d,%d)", + ev->xmotion.y_root, + ev->xmotion.x_root)); + break; + case EnterNotify: + case LeaveNotify: + TRACE((" at %d,%d root %d,%d %s %s", + ev->xcrossing.y, + ev->xcrossing.x, + ev->xcrossing.y_root, + ev->xcrossing.x_root, + visibleNotifyMode(ev->xcrossing.mode), + visibleNotifyDetail(ev->xcrossing.detail))); + break; + case FocusIn: + case FocusOut: + TRACE((" %s %s", + visibleNotifyMode(ev->xfocus.mode), + visibleNotifyDetail(ev->xfocus.detail))); + break; + case MapNotify: + TRACE((" event %#lx %s", + ev->xmap.event, + ev->xmap.override_redirect ? "override" : "")); + break; + case UnmapNotify: + TRACE((" event %#lx %s", + ev->xunmap.event, + ev->xunmap.from_configure ? "configure" : "")); + break; + case ReparentNotify: + TRACE((" at %d,%d event %#lx parent %#lx %s", + ev->xreparent.y, + ev->xreparent.x, + ev->xreparent.event, + ev->xreparent.parent, + ev->xreparent.override_redirect ? "override" : "")); + break; + case ConfigureNotify: + TRACE((" at %d,%d size %dx%d bd %d above %#lx", + ev->xconfigure.y, + ev->xconfigure.x, + ev->xconfigure.height, + ev->xconfigure.width, + ev->xconfigure.border_width, + ev->xconfigure.above)); + break; + case CreateNotify: + TRACE((" at %d,%d size %dx%d bd %d", + ev->xcreatewindow.y, + ev->xcreatewindow.x, + ev->xcreatewindow.height, + ev->xcreatewindow.width, + ev->xcreatewindow.border_width)); + break; + case ResizeRequest: + TRACE((" size %dx%d", + ev->xresizerequest.height, + ev->xresizerequest.width)); + break; + case PropertyNotify: + TRACE((" %s %s", + TraceAtomName(XtDisplay(toplevel), ev->xproperty.atom), + ((ev->xproperty.state == PropertyNewValue) + ? "NewValue" + : ((ev->xproperty.state == PropertyDelete) + ? "Delete" + : "?")))); + + break; + case Expose: + TRACE((" at %d,%d size %dx%d count %d", + ev->xexpose.y, + ev->xexpose.x, + ev->xexpose.height, + ev->xexpose.width, + ev->xexpose.count)); + break; + case MappingNotify: + TRACE((" %s first_keycode %d count %d", + visibleMappingMode(ev->xmapping.request), + ev->xmapping.first_keycode, + ev->xmapping.count)); + break; + case VisibilityNotify: + TRACE((" state %d", + ev->xvisibility.state)); + break; + case KeymapNotify: + { + Cardinal j; + for (j = 0; j < XtNumber(ev->xkeymap.key_vector); ++j) { + if (ev->xkeymap.key_vector[j] != 0) { + Cardinal k; + for (k = 0; k < 8; ++k) { + if (ev->xkeymap.key_vector[j] & (1 << k)) { + TRACE((" key%u", (j * 8) + k)); + } + } + } + } + } + break; + case NoExpose: + TRACE((" send_event:%d display %p major:%d minor:%d\n", + ev->xnoexpose.send_event, + (void *) ev->xnoexpose.display, + ev->xnoexpose.major_code, + ev->xnoexpose.minor_code)); + break; + default: + TRACE((":FIXME")); + break; + } + TRACE(("\n")); + if (params != 0 && *num_params != 0) { + Cardinal n; + for (n = 0; n < *num_params; ++n) { + TRACE((" param[%d] = %s\n", n, params[n])); + } + } +} + +#if OPT_RENDERFONT && OPT_WIDE_CHARS +void +TraceFallback(XtermWidget xw, const char *tag, unsigned wc, int n, XftFont *font) +{ + TScreen *screen = TScreenOf(xw); + XGlyphInfo gi; + int expect = my_wcwidth((wchar_t) wc); + int hijack = mk_wcwidth_cjk((wchar_t) wc); + int actual; + + XftTextExtents32(screen->display, font, &wc, 1, &gi); + actual = ((gi.xOff + FontWidth(screen) - 1) + / FontWidth(screen)); + + TRACE(("FALLBACK #%d %s U+%04X %d,%d pos," + " %d,%d off," " %dx%d size," + " %d/%d next," " %d vs %d/%d cells%s\n", + n + 1, tag, wc, + gi.y, gi.x, + gi.yOff, gi.xOff, + gi.height, gi.width, + font->max_advance_width, + FontWidth(screen), + actual, expect, hijack, + ((actual != expect) + ? ((actual == hijack) + ? " OOPS" + : " oops") + : ""))); +} +#endif /* OPT_RENDERFONT */ + +void +TraceFocus(Widget w, XEvent *ev) +{ + TRACE(("trace_focus event type %d:%s\n", + ev->type, visibleEventType(ev->type))); + switch (ev->type) { + case FocusIn: + case FocusOut: + { + XFocusChangeEvent *event = (XFocusChangeEvent *) ev; + TRACE(("\tdetail: %s\n", visibleNotifyDetail(event->detail))); + TRACE(("\tmode: %s\n", visibleNotifyMode(event->mode))); + TRACE(("\twindow: %#lx\n", event->window)); + } + break; + case EnterNotify: + case LeaveNotify: + { + XCrossingEvent *event = (XCrossingEvent *) ev; + TRACE(("\tdetail: %s\n", visibleNotifyDetail(event->detail))); + TRACE(("\tmode: %s\n", visibleNotifyMode(event->mode))); + TRACE(("\twindow: %#lx\n", event->window)); + TRACE(("\tfocus: %d\n", event->focus)); + TRACE(("\troot: %#lx\n", event->root)); + TRACE(("\tsubwindow: %#lx\n", event->subwindow)); + } + break; + } + while (w != 0) { + TRACE(("w %p -> %#lx\n", (void *) w, XtWindow(w))); + w = XtParent(w); + } +} + +void +TraceSizeHints(XSizeHints * hints) +{ + TRACE(("size hints:\n")); + if (hints->flags & (USPosition | PPosition)) { + TRACE((" position %d,%d%s%s\n", hints->y, hints->x, + (hints->flags & USPosition) ? " user" : "", + (hints->flags & PPosition) ? " prog" : "")); + } + if (hints->flags & (USSize | PSize)) { + TRACE((" size %d,%d%s%s\n", hints->height, hints->width, + (hints->flags & USSize) ? " user" : "", + (hints->flags & PSize) ? " prog" : "")); + } + if (hints->flags & PMinSize) { + TRACE((" min %d,%d\n", hints->min_height, hints->min_width)); + } + if (hints->flags & PMaxSize) { + TRACE((" max %d,%d\n", hints->max_height, hints->max_width)); + } + if (hints->flags & PResizeInc) { + TRACE((" inc %d,%d\n", hints->height_inc, hints->width_inc)); + } else { + TRACE((" inc NONE!\n")); + } + if (hints->flags & PAspect) { + TRACE((" min aspect %d/%d\n", hints->min_aspect.y, hints->min_aspect.y)); + TRACE((" max aspect %d/%d\n", hints->max_aspect.y, hints->max_aspect.y)); + } + if (hints->flags & PBaseSize) { + TRACE((" base %d,%d\n", hints->base_height, hints->base_width)); + } + if (hints->flags & PWinGravity) { + TRACE((" gravity %d\n", hints->win_gravity)); + } +} + +static void +TraceEventMask(const char *tag, long mask) +{ +#define DATA(name) { name##Mask, #name } + /* *INDENT-OFF* */ + static struct { + long mask; + const char *name; + } table[] = { + DATA(KeyPress), + DATA(KeyRelease), + DATA(ButtonPress), + DATA(ButtonRelease), + DATA(EnterWindow), + DATA(LeaveWindow), + DATA(PointerMotion), + DATA(PointerMotionHint), + DATA(Button1Motion), + DATA(Button2Motion), + DATA(Button3Motion), + DATA(Button4Motion), + DATA(Button5Motion), + DATA(ButtonMotion), + DATA(KeymapState), + DATA(Exposure), + DATA(VisibilityChange), + DATA(StructureNotify), + DATA(ResizeRedirect), + DATA(SubstructureNotify), + DATA(SubstructureRedirect), + DATA(FocusChange), + DATA(PropertyChange), + DATA(ColormapChange), + DATA(OwnerGrabButton), + }; +#undef DATA + Cardinal n; + /* *INDENT-ON* */ + + for (n = 0; n < XtNumber(table); ++n) { + if (table[n].mask & mask) { + TRACE(("%s %s\n", tag, table[n].name)); + } + } +} + +void +TraceWindowAttributes(XWindowAttributes * attrs) +{ + TRACE(("window attributes:\n")); + TRACE((" position %d,%d\n", attrs->y, attrs->x)); + TRACE((" size %dx%d\n", attrs->height, attrs->width)); + TRACE((" border %d\n", attrs->border_width)); + TRACE((" depth %d\n", attrs->depth)); + TRACE((" bit_gravity %d\n", attrs->bit_gravity)); + TRACE((" win_gravity %d\n", attrs->win_gravity)); + TRACE((" root %#lx\n", (long) attrs->root)); + TRACE((" class %s\n", ((attrs->class == InputOutput) + ? "InputOutput" + : ((attrs->class == InputOnly) + ? "InputOnly" + : "unknown")))); + TRACE((" map_state %s\n", ((attrs->map_state == IsUnmapped) + ? "IsUnmapped" + : ((attrs->map_state == IsUnviewable) + ? "IsUnviewable" + : ((attrs->map_state == IsViewable) + ? "IsViewable" + : "unknown"))))); + TRACE((" all_events\n")); + TraceEventMask(" ", attrs->all_event_masks); + TRACE((" your_events\n")); + TraceEventMask(" ", attrs->your_event_mask); + TRACE((" no_propagate\n")); + TraceEventMask(" ", attrs->do_not_propagate_mask); +} + +void +TraceWMSizeHints(XtermWidget xw) +{ + XSizeHints sizehints = xw->hints; + + getXtermSizeHints(xw); + TraceSizeHints(&xw->hints); + xw->hints = sizehints; +} + +/* + * Some calls to XGetAtom() will fail, and we don't want to stop. So we use + * our own error-handler. + */ +/* ARGSUSED */ +static int +no_error(Display *dpy GCC_UNUSED, XErrorEvent *event GCC_UNUSED) +{ + return 1; +} + +const char * +ModifierName(unsigned modifier) +{ + const char *s = ""; + if (modifier & ShiftMask) + s = " Shift"; + else if (modifier & LockMask) + s = " Lock"; + else if (modifier & ControlMask) + s = " Control"; + else if (modifier & Mod1Mask) + s = " Mod1"; + else if (modifier & Mod2Mask) + s = " Mod2"; + else if (modifier & Mod3Mask) + s = " Mod3"; + else if (modifier & Mod4Mask) + s = " Mod4"; + else if (modifier & Mod5Mask) + s = " Mod5"; + return s; +} + +void +TraceTranslations(const char *name, Widget w) +{ + String result; + XErrorHandler save = XSetErrorHandler(no_error); + XtTranslations xlations; + Widget xcelerat; + + TRACE(("TraceTranslations for %s (widget %#lx) {{\n", name, (long) w)); + if (w) { + XtVaGetValues(w, + XtNtranslations, &xlations, + XtNaccelerators, &xcelerat, + (XtPointer) 0); + TRACE(("... xlations %#08lx\n", (long) xlations)); + TRACE(("... xcelerat %#08lx\n", (long) xcelerat)); + result = _XtPrintXlations(w, xlations, xcelerat, True); + TRACE(("%s\n", NonNull(result))); + if (result) + XFree((char *) result); + } else { + TRACE(("none (widget is null)\n")); + } + TRACE(("}}\n")); + XSetErrorHandler(save); +} + +XtGeometryResult +TraceResizeRequest(const char *fn, int ln, Widget w, + unsigned reqwide, + unsigned reqhigh, + Dimension *gotwide, + Dimension *gothigh) +{ + XtGeometryResult rc; + + TRACE(("%s@%d ResizeRequest %ux%u\n", fn, ln, reqhigh, reqwide)); + rc = XtMakeResizeRequest((Widget) w, + (Dimension) reqwide, + (Dimension) reqhigh, + gotwide, gothigh); + TRACE(("... ResizeRequest -> ")); + if (gothigh && gotwide) + TRACE(("%dx%d ", *gothigh, *gotwide)); + TRACE(("(%d)\n", rc)); + return rc; +} + +#define XRES_S(name) Trace(#name " = %s\n", NonNull(resp->name)) +#define XRES_B(name) Trace(#name " = %s\n", MtoS(resp->name)) +#define XRES_I(name) Trace(#name " = %d\n", resp->name) + +void +TraceXtermResources(void) +{ + XTERM_RESOURCE *resp = &resource; + + Trace("XTERM_RESOURCE settings:\n"); + XRES_S(icon_geometry); + XRES_S(title); + XRES_S(icon_hint); + XRES_S(icon_name); + XRES_S(term_name); + XRES_S(tty_modes); + XRES_I(minBufSize); + XRES_I(maxBufSize); + XRES_B(hold_screen); + XRES_B(utmpInhibit); + XRES_B(utmpDisplayId); + XRES_B(messages); + XRES_S(menuLocale); + XRES_S(omitTranslation); + XRES_S(keyboardType); +#if OPT_PRINT_ON_EXIT + XRES_I(printModeNow); + XRES_I(printModeOnXError); + XRES_I(printOptsNow); + XRES_I(printOptsOnXError); + XRES_S(printFileNow); + XRES_S(printFileOnXError); +#endif +#if OPT_SUNPC_KBD + XRES_B(sunKeyboard); +#endif +#if OPT_HP_FUNC_KEYS + XRES_B(hpFunctionKeys); +#endif +#if OPT_SCO_FUNC_KEYS + XRES_B(scoFunctionKeys); +#endif +#if OPT_SUN_FUNC_KEYS + XRES_B(sunFunctionKeys); +#endif +#if OPT_INITIAL_ERASE + XRES_B(ptyInitialErase); + XRES_B(backarrow_is_erase); +#endif + XRES_B(useInsertMode); +#if OPT_ZICONBEEP + XRES_I(zIconBeep); + XRES_S(zIconFormat); +#endif +#if OPT_PTY_HANDSHAKE + XRES_B(wait_for_map); + XRES_B(ptyHandshake); + XRES_B(ptySttySize); +#endif +#if OPT_REPORT_CCLASS + XRES_B(reportCClass); +#endif +#if OPT_REPORT_COLORS + XRES_B(reportColors); +#endif +#if OPT_REPORT_FONTS + XRES_B(reportFonts); +#endif +#if OPT_REPORT_ICONS + XRES_B(reportIcons); +#endif +#if OPT_SAME_NAME + XRES_B(sameName); +#endif +#if OPT_SESSION_MGT + XRES_B(sessionMgt); +#endif +#if OPT_TOOLBAR + XRES_B(toolBar); +#endif +#if OPT_MAXIMIZE + XRES_B(maximized); + XRES_S(fullscreen_s); +#endif +#if USE_DOUBLE_BUFFER + XRES_B(buffered); + XRES_I(buffered_fps); +#endif +} + +void +TraceArgv(const char *tag, char **argv) +{ + TRACE(("%s:\n", tag)); + if (argv != 0) { + int n = 0; + + while (*argv != 0) { + TRACE((" %d:%s\n", n++, *argv++)); + } + } +} + +static char * +parse_option(char *dst, String src, int first) +{ + char *s; + + if (!strncmp(src, "-/+", (size_t) 3)) { + dst[0] = (char) first; + strcpy(dst + 1, src + 3); + } else { + strcpy(dst, src); + } + for (s = dst; *s != '\0'; s++) { + if (*s == '#' || *s == '%' || *s == 'S') { + s[1] = '\0'; + } else if (*s == ' ') { + *s = '\0'; + break; + } + } + return dst; +} + +static Bool +same_option(OptionHelp * opt, XrmOptionDescRec * res) +{ + char temp[BUFSIZ]; + return !strcmp(parse_option(temp, opt->opt, res->option[0]), res->option); +} + +static Bool +standard_option(String opt) +{ + static const char *table[] = + { + "+rv", + "+synchronous", + "-background", + "-bd", + "-bg", + "-bordercolor", + "-borderwidth", + "-bw", + "-display", + "-fg", + "-fn", + "-font", + "-foreground", + "-geometry", + "-iconic", + "-name", + "-reverse", + "-rv", + "-selectionTimeout", + "-synchronous", + "-title", + "-xnllanguage", + "-xrm", + "-xtsessionID", + }; + Cardinal n; + char temp[BUFSIZ]; + + opt = parse_option(temp, opt, '-'); + for (n = 0; n < XtNumber(table); n++) { + if (!strcmp(opt, table[n])) + return True; + } + return False; +} + +/* + * Analyse the options/help messages for inconsistencies. + */ +void +TraceOptions(OptionHelp * options, XrmOptionDescRec * resources, Cardinal res_count) +{ + OptionHelp *opt_array = sortedOpts(options, resources, res_count); + size_t j, k; + XrmOptionDescRec *res_array = sortedOptDescs(resources, res_count); + Bool first, found; + + TRACE(("Checking options-tables for inconsistencies:\n")); + +#if 0 + TRACE(("Options listed in help-message:\n")); + for (j = 0; options[j].opt != 0; j++) + TRACE(("%5d %-28s %s\n", j, opt_array[j].opt, opt_array[j].desc)); + TRACE(("Options listed in resource-table:\n")); + for (j = 0; j < res_count; j++) + TRACE(("%5d %-28s %s\n", j, res_array[j].option, res_array[j].specifier)); +#endif + + /* list all options[] not found in resources[] */ + for (j = 0, first = True; options[j].opt != 0; j++) { + found = False; + for (k = 0; k < res_count; k++) { + if (same_option(&opt_array[j], &res_array[k])) { + found = True; + break; + } + } + if (!found) { + if (first) { + TRACE(("Options listed in help, not found in resource list:\n")); + first = False; + } + TRACE((" %-28s%s\n", opt_array[j].opt, + standard_option(opt_array[j].opt) ? " (standard)" : "")); + } + } + + /* list all resources[] not found in options[] */ + for (j = 0, first = True; j < res_count; j++) { + found = False; + for (k = 0; options[k].opt != 0; k++) { + if (same_option(&opt_array[k], &res_array[j])) { + found = True; + break; + } + } + if (!found) { + if (first) { + TRACE(("Resource list items not found in options-help:\n")); + first = False; + } + TRACE((" %s\n", res_array[j].option)); + } + } + + TRACE(("Resource list items that will be ignored by XtOpenApplication:\n")); + for (j = 0; j < res_count; j++) { + switch (res_array[j].argKind) { + case XrmoptionSkipArg: + TRACE((" %-28s {param}\n", res_array[j].option)); + break; + case XrmoptionSkipNArgs: + TRACE((" %-28s {%ld params}\n", res_array[j].option, (long) + res_array[j].value)); + break; + case XrmoptionSkipLine: + TRACE((" %-28s {remainder of line}\n", res_array[j].option)); + break; + case XrmoptionIsArg: + case XrmoptionNoArg: + case XrmoptionResArg: + case XrmoptionSepArg: + case XrmoptionStickyArg: + default: + break; + } + } +} +#else +extern void empty_trace(void); +void +empty_trace(void) +{ +} +#endif diff --git a/ports/xterm/xterm-359/trace.h b/ports/xterm/xterm-359/trace.h new file mode 100644 index 0000000..4554f0b --- /dev/null +++ b/ports/xterm/xterm-359/trace.h @@ -0,0 +1,235 @@ +/* $XTermId: trace.h,v 1.91 2020/01/29 18:48:24 tom Exp $ */ + +/* + * Copyright 1997-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +/* + * Common/useful definitions for XTERM application + */ +#ifndef included_trace_h +#define included_trace_h +/* *INDENT-OFF* */ + +#include + +#if OPT_TRACE + +#include + +extern void Trace ( const char *, ... ) GCC_PRINTFLIKE(1,2); +extern void TraceVA ( const char *fmt, va_list ap ); +extern void TraceXError (Display *d, XErrorEvent *ev); + +#undef TRACE +#define TRACE(p) Trace p + +#undef TRACE_VA +#define TRACE_VA(p) TraceVA p +#define TRACE_X_ERR(d,e) TraceXError(d,e) + +extern void TraceClose (void); + +#undef TRACE_CLOSE +#define TRACE_CLOSE TraceClose + +#if OPT_TRACE > 1 +#define TRACE2(p) Trace p +#endif + +extern const char * visibleChars(const Char * /* buf */, unsigned /* len */); +extern const char * visibleEventMode(EventMode); +extern const char * visibleIChars(const IChar * /* buf */, unsigned /* len */); +extern const char * visibleUChar(unsigned); +extern const char * visibleDblChrset(unsigned /* chrset */); +extern const char * visibleEventType (int); +extern const char * visibleMappingMode (int); +extern const char * visibleNotifyDetail(int /* code */); +extern const char * visibleNotifyMode (int /* code */); +extern const char * visibleScsCode(DECNRCM_codes /* chrset */); +extern const char * visibleSelectionTarget(Display * /* d */, Atom /* a */); +extern const char * visibleTekparse (int); +extern const char * visibleVTparse (int); +extern const char * visibleXError (int /* code */); + +extern const char * TraceAtomName(Display * /* d */, Atom /* a */); + +extern void TraceArgv(const char * /* tag */, char ** /* argv */); +#undef TRACE_ARGV +#define TRACE_ARGV(tag,argv) TraceArgv(tag,argv) + +extern const char *trace_who; +#undef TRACE_CHILD +#define TRACE_CHILD int tracing_child = (trace_who = "child") != 0; (void) tracing_child; + +extern void TraceEvent(const char *, XEvent *, String *, Cardinal *); +#undef TRACE_EVENT +#define TRACE_EVENT(t,e,s,n) TraceEvent(t, (XEvent *)e, s, n) + +#undef TRACE_FALLBACK +#if OPT_RENDERFONT && OPT_WIDE_CHARS +extern void TraceFallback(XtermWidget, const char *, unsigned, int, XftFont *); +#define TRACE_FALLBACK(w,t,c,n,f) TraceFallback(w, t, c, n, f) +#else +#define TRACE_FALLBACK(w,t,c,n,f) /*nothing*/ +#endif + +extern void TraceFocus(Widget, XEvent *); +#undef TRACE_FOCUS +#define TRACE_FOCUS(w,e) TraceFocus((Widget)w, (XEvent *)e) + +extern void TraceSizeHints(XSizeHints *); +#undef TRACE_HINTS +#define TRACE_HINTS(hints) TraceSizeHints(hints) + +extern void TraceIds(const char * /* fname */, int /* lnum */); +#undef TRACE_IDS +#define TRACE_IDS TraceIds(__FILE__, __LINE__) + +extern void TraceTime(const char * /* fname */, int /* lnum */); +#undef TRACE_TIME +#define TRACE_TIME TraceTime(__FILE__, __LINE__) + +extern void TraceOptions(OptionHelp * /* options */, XrmOptionDescRec * /* resources */, Cardinal /* count */); +#undef TRACE_OPTS +#define TRACE_OPTS(opts,ress,lens) TraceOptions(opts,ress,lens) + +extern void TraceTranslations(const char *, Widget); +#undef TRACE_TRANS +#define TRACE_TRANS(name,w) TraceTranslations(name,w) + +extern void TraceWindowAttributes(XWindowAttributes *); +#undef TRACE_WIN_ATTRS +#define TRACE_WIN_ATTRS(a) TraceWindowAttributes(a) + +extern void TraceWMSizeHints(XtermWidget); +#undef TRACE_WM_HINTS +#define TRACE_WM_HINTS(w) TraceWMSizeHints(w) + +extern void TraceXtermResources(void); +#undef TRACE_XRES +#define TRACE_XRES() TraceXtermResources() + +extern XtGeometryResult TraceResizeRequest(const char * /* fn */, int /* ln */, Widget /* w */, unsigned /* reqwide */, unsigned /* reqhigh */, Dimension * /* gotwide */, Dimension * /* gothigh */); +#undef REQ_RESIZE +#define REQ_RESIZE(w, reqwide, reqhigh, gotwide, gothigh) \ + TraceResizeRequest(__FILE__, __LINE__, w, \ + (reqwide), (reqhigh), \ + (gotwide), (gothigh)) + +extern const char * ModifierName(unsigned /* modifier */); +#define FMT_MODIFIER_NAMES "%s%s%s%s%s%s%s%s" +#define ARG_MODIFIER_NAMES(state) \ + ModifierName(state & ShiftMask), \ + ModifierName(state & LockMask), \ + ModifierName(state & ControlMask), \ + ModifierName(state & Mod1Mask), \ + ModifierName(state & Mod2Mask), \ + ModifierName(state & Mod3Mask), \ + ModifierName(state & Mod4Mask), \ + ModifierName(state & Mod5Mask) + +#else + +#define REQ_RESIZE(w, reqwide, reqhigh, gotwide, gothigh) \ + XtMakeResizeRequest((Widget) (w), \ + (Dimension) (reqwide), (Dimension) (reqhigh), \ + (gotwide), (gothigh)) + +#define TRACE(p) /*nothing*/ +#define TRACE_CLOSE() /*nothing*/ +#define TRACE_ARGV(tag,argv) /*nothing*/ +#define TRACE_CHILD /*nothing*/ +#define TRACE_EVENT(t,e,s,n) /*nothing*/ +#define TRACE_FALLBACK(w,t,c,n,f) /*nothing*/ +#define TRACE_FOCUS(w,e) /*nothing*/ +#define TRACE_HINTS(hints) /*nothing*/ +#define TRACE_IDS /*nothing*/ +#define TRACE_OPTS(opts,ress,lens) /*nothing*/ +#define TRACE_TRANS(name,w) /*nothing*/ +#define TRACE_WIN_ATTRS(w) /*nothing*/ +#define TRACE_WM_HINTS(w) /*nothing*/ +#define TRACE_X_ERR(d,e) /*nothing*/ +#define TRACE_XRES() /*nothing*/ + +#endif + +#ifndef TRACE2 +#define TRACE2(p) /*nothing*/ +#endif + +extern void TraceScreen(XtermWidget /* xw */, int /* whichBuf */); + +/* + * The whole wnew->screen struct is zeroed in VTInitialize. Use these macros + * where applicable for copying the pieces from the request widget into the + * new widget. We do not have to use them for wnew->misc, but the associated + * traces are very useful for debugging. + */ +#if OPT_TRACE +#define init_Bres(name) \ + TRACE(("init " #name " = %s\n", \ + BtoS(wnew->name = request->name))) +#define init_Dres(name) \ + TRACE(("init " #name " = %f\n", \ + wnew->name = request->name)) +#define init_Dres2(name,i) \ + TRACE(("init " #name "[%d] = %f\n", i, \ + wnew->name[i] = request->name[i])) +#define init_Ires(name) \ + TRACE(("init " #name " = %d\n", \ + wnew->name = request->name)) +#define init_Mres(name) \ + TRACE(("init " #name " = %s\n", \ + MtoS(wnew->name = request->name))) +#define init_Sres(name) \ + TRACE(("init " #name " = \"%s\"\n", \ + (wnew->name = x_strtrim(request->name)) != NULL \ + ? wnew->name : "")) +#define init_Sres2(name,i) \ + TRACE(("init " #name "[%d] = \"%s\"\n", i, \ + (wnew->name(i) = x_strtrim(request->name(i))) != NULL \ + ? wnew->name(i) : "")) +#define init_Tres(offset) \ + TRACE(("init screen.Tcolors[" #offset "] = %#lx\n", \ + fill_Tres(wnew, request, offset))) +#else +#define init_Bres(name) wnew->name = request->name +#define init_Dres(name) wnew->name = request->name +#define init_Dres2(name,i) wnew->name[i] = request->name[i] +#define init_Ires(name) wnew->name = request->name +#define init_Mres(name) wnew->name = request->name +#define init_Sres(name) wnew->name = x_strtrim(request->name) +#define init_Sres2(name,i) wnew->name(i) = x_strtrim(request->name(i)) +#define init_Tres(offset) fill_Tres(wnew, request, offset) +#endif + +/* *INDENT-ON* */ + +#endif /* included_trace_h */ diff --git a/ports/xterm/xterm-359/unicode/README b/ports/xterm/xterm-359/unicode/README new file mode 100644 index 0000000..6ef1e3e --- /dev/null +++ b/ports/xterm/xterm-359/unicode/README @@ -0,0 +1,23 @@ +-- $XTermId: README,v 1.11 2016/05/22 20:01:53 tom Exp $ +-- $XFree86: xc/programs/xterm/unicode/README,v 1.5 2004/12/01 01:27:49 dickey Exp $ +-- Thomas E. Dickey + +These scripts and datafiles are used for generating tables used in the +UTF-8 implementation in xterm. + +To run the convmap.pl script, you will need a copy of UnicodeData.txt +which is currently available as + + ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt + +It is a large file (>1Mb), so it is not included in this distribution. + +convmap.pl is used to generate ../keysym2ucs.c, e.g., + + ./convmap.pl >../keysym2ucs.c + +keysym.map is input data for convmap.pl + +The make-precompose.sh script makes the precompose.c file, which is used to +handle canonical composition. This also needs UnicodeData.txt. It uses +precompose.c.head and precompose.c.tail as templates. diff --git a/ports/xterm/xterm-359/unicode/convmap.pl b/ports/xterm/xterm-359/unicode/convmap.pl new file mode 100755 index 0000000..f481d17 --- /dev/null +++ b/ports/xterm/xterm-359/unicode/convmap.pl @@ -0,0 +1,205 @@ +#!/usr/bin/perl -w +# $XTermId: convmap.pl,v 1.15 2018/09/09 17:22:24 tom Exp $ +# +# Generate keysym2ucs.c file +# +# See also: +# http://mail.nl.linux.org/linux-utf8/2001-04/msg00248.html +# +# $XFree86: xc/programs/xterm/unicode/convmap.pl,v 1.5 2000/01/24 22:22:05 dawes Exp $ + +use strict; + +our $keysym; +our %name; +our %keysym_to_ucs; +our %keysym_to_keysymname; + +sub utf8 ($); + +sub utf8 ($) { + my $c = shift(@_); + + if ($c < 0x80) { + return sprintf("%c", $c); + } elsif ($c < 0x800) { + return sprintf("%c%c", 0xc0 | ($c >> 6), 0x80 | ($c & 0x3f)); + } elsif ($c < 0x10000) { + return sprintf("%c%c%c", + 0xe0 | ($c >> 12), + 0x80 | (($c >> 6) & 0x3f), + 0x80 | ( $c & 0x3f)); + } elsif ($c < 0x200000) { + return sprintf("%c%c%c%c", + 0xf0 | ($c >> 18), + 0x80 | (($c >> 12) & 0x3f), + 0x80 | (($c >> 6) & 0x3f), + 0x80 | ( $c & 0x3f)); + } elsif ($c < 0x4000000) { + return sprintf("%c%c%c%c%c", + 0xf8 | ($c >> 24), + 0x80 | (($c >> 18) & 0x3f), + 0x80 | (($c >> 12) & 0x3f), + 0x80 | (($c >> 6) & 0x3f), + 0x80 | ( $c & 0x3f)); + + } elsif ($c < 0x80000000) { + return sprintf("%c%c%c%c%c%c", + 0xfe | ($c >> 30), + 0x80 | (($c >> 24) & 0x3f), + 0x80 | (($c >> 18) & 0x3f), + 0x80 | (($c >> 12) & 0x3f), + 0x80 | (($c >> 6) & 0x3f), + 0x80 | ( $c & 0x3f)); + } else { + return utf8(0xfffd); + } +} + +my $unicodedata = "UnicodeData.txt"; + +# read list of all Unicode names +if (!open(UDATA, $unicodedata) && !open(UDATA, "$unicodedata")) { + die ("Can't open Unicode database '$unicodedata':\n$!\n\n" . + "Please make sure that you have downloaded the file\n" . + "ftp://ftp.unicode.org/Public/UNIDATA/UnicodeData.txt\n"); +} +while () { + if (/^([0-9,A-F]{4,6});([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*);([^;]*)$/) { + $name{hex($1)} = $2; + } else { + die("Syntax error in line '$_' in file '$unicodedata'"); + } +} +close(UDATA); + +# read mapping (from http://wsinwp07.win.tue.nl:1234/unicode/keysym.map) +open(LIST, ") { + if (/^0x([0-9a-f]{4})\s+U([0-9a-f]{4})\s*(\#.*)?$/){ + my $keysym = hex($1); + my $ucs = hex($2); + my $comment = $3; + $comment =~ s/^#\s*//; + $keysym_to_ucs{$keysym} = $ucs; + $keysym_to_keysymname{$keysym} = $comment; + } elsif (/^\s*\#/ || /^\s*$/) { + } else { + die("Syntax error in 'list' in line\n$_\n"); + } +} +close(LIST); + +# read entries in keysymdef.h +open(LIST, ") { + if (/^\#define\s+XK_([A-Za-z_0-9]+)\s+0x([0-9a-fA-F]+)\s*(\/.*)?$/) { + next if /\/\* deprecated \*\//; + my $keysymname = $1; + my $keysym = hex($2); + $keysym_to_keysymname{$keysym} = $keysymname; + } +} +close(LIST); + +print < UTF-8 conversion will hopefully one day be provided + * by Xlib via XmbLookupString() and should ideally not have to be + * done in X applications. But we are not there yet. + * + * We allow to represent any UCS character in the range U-00000000 to + * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff. + * This admittedly does not cover the entire 31-bit space of UCS, but + * it does cover all of the characters up to U-10FFFF, which can be + * represented by UTF-16, and more, and it is very unlikely that higher + * UCS codes will ever be assigned by ISO. So to get Unicode character + * U+ABCD you can directly use keysym 0x0100abcd. + * + * NOTE: The comments in the table below contain the actual character + * encoded in UTF-8, so for viewing and editing best use an editor in + * UTF-8 mode. + * + * Author: Markus G. Kuhn , University of Cambridge, April 2001 + * + * Special thanks to Richard Verhoeven for preparing + * an initial draft of the mapping table. + * + * This software is in the public domain. Share and enjoy! + * + * AUTOMATICALLY GENERATED FILE, DO NOT EDIT !!! (unicode/convmap.pl) + */ + +#ifndef KEYSYM2UCS_INCLUDED + +#include "keysym2ucs.h" +#define VISIBLE /* */ + +#else + +#define VISIBLE static + +#endif + +static struct codepair { + unsigned short keysym; + unsigned short ucs; +} keysymtab[] = { +EOT + +for $keysym (sort {$a <=> $b} keys(%keysym_to_keysymname)) { + my $ucs = $keysym_to_ucs{$keysym}; + next if $keysym >= 0xf000 || $keysym < 0x100; + if ($ucs) { + printf(" { 0x%04x, 0x%04x }, /*%28s %s %s */\n", + $keysym, $ucs, $keysym_to_keysymname{$keysym}, utf8($ucs), + defined($name{$ucs}) ? $name{$ucs} : "???" ); + } else { + printf("/* 0x%04x %39s ? ??? */\n", + $keysym, $keysym_to_keysymname{$keysym}); + } +} + +print <= 0x0020 && keysym <= 0x007e) || + (keysym >= 0x00a0 && keysym <= 0x00ff)) + return (long) keysym; + + /* also check for directly encoded 24-bit UCS characters */ + if ((keysym & 0xff000000) == 0x01000000) + return (long) (keysym & 0x00ffffff); + + /* binary search in table */ + while (max >= min) { + int mid = (min + max) / 2; + if (keysymtab[mid].keysym < keysym) + min = mid + 1; + else if (keysymtab[mid].keysym > keysym) + max = mid - 1; + else { + /* found it */ + return keysymtab[mid].ucs; + } + } + + /* no matching Unicode value found */ + return -1; +} +EOT diff --git a/ports/xterm/xterm-359/unicode/keysym.map b/ports/xterm/xterm-359/unicode/keysym.map new file mode 100644 index 0000000..fdea760 --- /dev/null +++ b/ports/xterm/xterm-359/unicode/keysym.map @@ -0,0 +1,1053 @@ +# $XTermId: keysym.map,v 1.10 2018/06/29 00:51:40 Brad.Town Exp $ +# +# This list can be used to convert X11 Keysyms to Unicode 2.1 character. +# The list is not checked for correctness by Unicode officials. Use it +# at your own risk and the creator is not responsible for any damage that +# occurred due to using this list. +# +# The list is created by looking at the Keysym names and the Unicode data +# file. Other mapping tables were used as a reference where needed. +# Due to a lack of knowledge of the Hebrew, Thai and Hangul symbols, +# expect errors in these sections. The mapping of the keypad keys +# might also require some adjustments. +# +# The following fields are used: +# 1 The X11 keysym numbers from the include file keysymdef.h +# 2 The Unicode (2.1) position (U0000 means unknown Unicode position) +# # +# 3 the name of the X11 keysym (without XK_) +# +# Authors: Richard Verhoeven, TUE, +# Markus Kuhn, University of Cambridge, +# +# You are free to use and modify this table. If you introduce errors +# in the table, please remove the copyright line. If you remove errors, +# please let me know, so I can update my version. +# +# $XFree86: xc/programs/xterm/unicode/keysym.map,v 1.1 1999/06/12 15:37:24 dawes Exp $ +# +0x0020 U0020 # space +0x0021 U0021 # exclam +0x0022 U0022 # quotedbl +0x0023 U0023 # numbersign +0x0024 U0024 # dollar +0x0025 U0025 # percent +0x0026 U0026 # ampersand +0x0027 U0027 # apostrophe +0x0028 U0028 # parenleft +0x0029 U0029 # parenright +0x002a U002a # asterisk +0x002b U002b # plus +0x002c U002c # comma +0x002d U002d # minus +0x002e U002e # period +0x002f U002f # slash +0x0030 U0030 # 0 +0x0031 U0031 # 1 +0x0032 U0032 # 2 +0x0033 U0033 # 3 +0x0034 U0034 # 4 +0x0035 U0035 # 5 +0x0036 U0036 # 6 +0x0037 U0037 # 7 +0x0038 U0038 # 8 +0x0039 U0039 # 9 +0x003a U003a # colon +0x003b U003b # semicolon +0x003c U003c # less +0x003d U003d # equal +0x003e U003e # greater +0x003f U003f # question +0x0040 U0040 # at +0x0041 U0041 # A +0x0042 U0042 # B +0x0043 U0043 # C +0x0044 U0044 # D +0x0045 U0045 # E +0x0046 U0046 # F +0x0047 U0047 # G +0x0048 U0048 # H +0x0049 U0049 # I +0x004a U004a # J +0x004b U004b # K +0x004c U004c # L +0x004d U004d # M +0x004e U004e # N +0x004f U004f # O +0x0050 U0050 # P +0x0051 U0051 # Q +0x0052 U0052 # R +0x0053 U0053 # S +0x0054 U0054 # T +0x0055 U0055 # U +0x0056 U0056 # V +0x0057 U0057 # W +0x0058 U0058 # X +0x0059 U0059 # Y +0x005a U005a # Z +0x005b U005b # bracketleft +0x005c U005c # backslash +0x005d U005d # bracketright +0x005e U005e # asciicircum +0x005f U005f # underscore +0x0060 U0060 # grave +0x0061 U0061 # a +0x0062 U0062 # b +0x0063 U0063 # c +0x0064 U0064 # d +0x0065 U0065 # e +0x0066 U0066 # f +0x0067 U0067 # g +0x0068 U0068 # h +0x0069 U0069 # i +0x006a U006a # j +0x006b U006b # k +0x006c U006c # l +0x006d U006d # m +0x006e U006e # n +0x006f U006f # o +0x0070 U0070 # p +0x0071 U0071 # q +0x0072 U0072 # r +0x0073 U0073 # s +0x0074 U0074 # t +0x0075 U0075 # u +0x0076 U0076 # v +0x0077 U0077 # w +0x0078 U0078 # x +0x0079 U0079 # y +0x007a U007a # z +0x007b U007b # braceleft +0x007c U007c # bar +0x007d U007d # braceright +0x007e U007e # asciitilde +0x00a0 U00a0 # nobreakspace +0x00a1 U00a1 # exclamdown +0x00a2 U00a2 # cent +0x00a3 U00a3 # sterling +0x00a4 U00a4 # currency +0x00a5 U00a5 # yen +0x00a6 U00a6 # brokenbar +0x00a7 U00a7 # section +0x00a8 U00a8 # diaeresis +0x00a9 U00a9 # copyright +0x00aa U00aa # ordfeminine +0x00ab U00ab # guillemotleft /* left angle quotation mark */ +0x00ac U00ac # notsign +0x00ad U00ad # hyphen +0x00ae U00ae # registered +0x00af U00af # macron +0x00b0 U00b0 # degree +0x00b1 U00b1 # plusminus +0x00b2 U00b2 # twosuperior +0x00b3 U00b3 # threesuperior +0x00b4 U00b4 # acute +0x00b5 U00b5 # mu +0x00b6 U00b6 # paragraph +0x00b7 U00b7 # periodcentered +0x00b8 U00b8 # cedilla +0x00b9 U00b9 # onesuperior +0x00ba U00ba # masculine +0x00bb U00bb # guillemotright /* right angle quotation mark */ +0x00bc U00bc # onequarter +0x00bd U00bd # onehalf +0x00be U00be # threequarters +0x00bf U00bf # questiondown +0x00c0 U00c0 # Agrave +0x00c1 U00c1 # Aacute +0x00c2 U00c2 # Acircumflex +0x00c3 U00c3 # Atilde +0x00c4 U00c4 # Adiaeresis +0x00c5 U00c5 # Aring +0x00c6 U00c6 # AE +0x00c7 U00c7 # Ccedilla +0x00c8 U00c8 # Egrave +0x00c9 U00c9 # Eacute +0x00ca U00ca # Ecircumflex +0x00cb U00cb # Ediaeresis +0x00cc U00cc # Igrave +0x00cd U00cd # Iacute +0x00ce U00ce # Icircumflex +0x00cf U00cf # Idiaeresis +0x00d0 U00d0 # ETH +0x00d1 U00d1 # Ntilde +0x00d2 U00d2 # Ograve +0x00d3 U00d3 # Oacute +0x00d4 U00d4 # Ocircumflex +0x00d5 U00d5 # Otilde +0x00d6 U00d6 # Odiaeresis +0x00d7 U00d7 # multiply +0x00d8 U00d8 # Oslash +0x00d9 U00d9 # Ugrave +0x00da U00da # Uacute +0x00db U00db # Ucircumflex +0x00dc U00dc # Udiaeresis +0x00dd U00dd # Yacute +0x00de U00de # THORN +0x00df U00df # ssharp +0x00e0 U00e0 # agrave +0x00e1 U00e1 # aacute +0x00e2 U00e2 # acircumflex +0x00e3 U00e3 # atilde +0x00e4 U00e4 # adiaeresis +0x00e5 U00e5 # aring +0x00e6 U00e6 # ae +0x00e7 U00e7 # ccedilla +0x00e8 U00e8 # egrave +0x00e9 U00e9 # eacute +0x00ea U00ea # ecircumflex +0x00eb U00eb # ediaeresis +0x00ec U00ec # igrave +0x00ed U00ed # iacute +0x00ee U00ee # icircumflex +0x00ef U00ef # idiaeresis +0x00f0 U00f0 # eth +0x00f1 U00f1 # ntilde +0x00f2 U00f2 # ograve +0x00f3 U00f3 # oacute +0x00f4 U00f4 # ocircumflex +0x00f5 U00f5 # otilde +0x00f6 U00f6 # odiaeresis +0x00f7 U00f7 # division +0x00f8 U00f8 # oslash +0x00f9 U00f9 # ugrave +0x00fa U00fa # uacute +0x00fb U00fb # ucircumflex +0x00fc U00fc # udiaeresis +0x00fd U00fd # yacute +0x00fe U00fe # thorn +0x00ff U00ff # ydiaeresis +0x01a1 U0104 # Aogonek +0x01a2 U02d8 # breve +0x01a3 U0141 # Lstroke +0x01a5 U013d # Lcaron +0x01a6 U015a # Sacute +0x01a9 U0160 # Scaron +0x01aa U015e # Scedilla +0x01ab U0164 # Tcaron +0x01ac U0179 # Zacute +0x01ae U017d # Zcaron +0x01af U017b # Zabovedot +0x01b1 U0105 # aogonek +0x01b2 U02db # ogonek +0x01b3 U0142 # lstroke +0x01b5 U013e # lcaron +0x01b6 U015b # sacute +0x01b7 U02c7 # caron +0x01b9 U0161 # scaron +0x01ba U015f # scedilla +0x01bb U0165 # tcaron +0x01bc U017a # zacute +0x01bd U02dd # doubleacute +0x01be U017e # zcaron +0x01bf U017c # zabovedot +0x01c0 U0154 # Racute +0x01c3 U0102 # Abreve +0x01c5 U0139 # Lacute +0x01c6 U0106 # Cacute +0x01c8 U010c # Ccaron +0x01ca U0118 # Eogonek +0x01cc U011a # Ecaron +0x01cf U010e # Dcaron +0x01d0 U0110 # Dstroke +0x01d1 U0143 # Nacute +0x01d2 U0147 # Ncaron +0x01d5 U0150 # Odoubleacute +0x01d8 U0158 # Rcaron +0x01d9 U016e # Uring +0x01db U0170 # Udoubleacute +0x01de U0162 # Tcedilla +0x01e0 U0155 # racute +0x01e3 U0103 # abreve +0x01e5 U013a # lacute +0x01e6 U0107 # cacute +0x01e8 U010d # ccaron +0x01ea U0119 # eogonek +0x01ec U011b # ecaron +0x01ef U010f # dcaron +0x01f0 U0111 # dstroke +0x01f1 U0144 # nacute +0x01f2 U0148 # ncaron +0x01f5 U0151 # odoubleacute +0x01f8 U0159 # rcaron +0x01f9 U016f # uring +0x01fb U0171 # udoubleacute +0x01fe U0163 # tcedilla +0x01ff U02d9 # abovedot +0x02a1 U0126 # Hstroke +0x02a6 U0124 # Hcircumflex +0x02a9 U0130 # Iabovedot +0x02ab U011e # Gbreve +0x02ac U0134 # Jcircumflex +0x02b1 U0127 # hstroke +0x02b6 U0125 # hcircumflex +0x02b9 U0131 # idotless +0x02bb U011f # gbreve +0x02bc U0135 # jcircumflex +0x02c5 U010a # Cabovedot +0x02c6 U0108 # Ccircumflex +0x02d5 U0120 # Gabovedot +0x02d8 U011c # Gcircumflex +0x02dd U016c # Ubreve +0x02de U015c # Scircumflex +0x02e5 U010b # cabovedot +0x02e6 U0109 # ccircumflex +0x02f5 U0121 # gabovedot +0x02f8 U011d # gcircumflex +0x02fd U016d # ubreve +0x02fe U015d # scircumflex +0x03a2 U0138 # kra +0x03a3 U0156 # Rcedilla +0x03a5 U0128 # Itilde +0x03a6 U013b # Lcedilla +0x03aa U0112 # Emacron +0x03ab U0122 # Gcedilla +0x03ac U0166 # Tslash +0x03b3 U0157 # rcedilla +0x03b5 U0129 # itilde +0x03b6 U013c # lcedilla +0x03ba U0113 # emacron +0x03bb U0123 # gcedilla +0x03bc U0167 # tslash +0x03bd U014a # ENG +0x03bf U014b # eng +0x03c0 U0100 # Amacron +0x03c7 U012e # Iogonek +0x03cc U0116 # Eabovedot +0x03cf U012a # Imacron +0x03d1 U0145 # Ncedilla +0x03d2 U014c # Omacron +0x03d3 U0136 # Kcedilla +0x03d9 U0172 # Uogonek +0x03dd U0168 # Utilde +0x03de U016a # Umacron +0x03e0 U0101 # amacron +0x03e7 U012f # iogonek +0x03ec U0117 # eabovedot +0x03ef U012b # imacron +0x03f1 U0146 # ncedilla +0x03f2 U014d # omacron +0x03f3 U0137 # kcedilla +0x03f9 U0173 # uogonek +0x03fd U0169 # utilde +0x03fe U016b # umacron +0x047e U203e # overline +0x04a1 U3002 # kana_fullstop +0x04a2 U300c # kana_openingbracket +0x04a3 U300d # kana_closingbracket +0x04a4 U3001 # kana_comma +0x04a5 U30fb # kana_conjunctive +0x04a6 U30f2 # kana_WO +0x04a7 U30a1 # kana_a +0x04a8 U30a3 # kana_i +0x04a9 U30a5 # kana_u +0x04aa U30a7 # kana_e +0x04ab U30a9 # kana_o +0x04ac U30e3 # kana_ya +0x04ad U30e5 # kana_yu +0x04ae U30e7 # kana_yo +0x04af U30c3 # kana_tsu +0x04b0 U30fc # prolongedsound +0x04b1 U30a2 # kana_A +0x04b2 U30a4 # kana_I +0x04b3 U30a6 # kana_U +0x04b4 U30a8 # kana_E +0x04b5 U30aa # kana_O +0x04b6 U30ab # kana_KA +0x04b7 U30ad # kana_KI +0x04b8 U30af # kana_KU +0x04b9 U30b1 # kana_KE +0x04ba U30b3 # kana_KO +0x04bb U30b5 # kana_SA +0x04bc U30b7 # kana_SHI +0x04bd U30b9 # kana_SU +0x04be U30bb # kana_SE +0x04bf U30bd # kana_SO +0x04c0 U30bf # kana_TA +0x04c1 U30c1 # kana_CHI +0x04c2 U30c4 # kana_TSU +0x04c3 U30c6 # kana_TE +0x04c4 U30c8 # kana_TO +0x04c5 U30ca # kana_NA +0x04c6 U30cb # kana_NI +0x04c7 U30cc # kana_NU +0x04c8 U30cd # kana_NE +0x04c9 U30ce # kana_NO +0x04ca U30cf # kana_HA +0x04cb U30d2 # kana_HI +0x04cc U30d5 # kana_FU +0x04cd U30d8 # kana_HE +0x04ce U30db # kana_HO +0x04cf U30de # kana_MA +0x04d0 U30df # kana_MI +0x04d1 U30e0 # kana_MU +0x04d2 U30e1 # kana_ME +0x04d3 U30e2 # kana_MO +0x04d4 U30e4 # kana_YA +0x04d5 U30e6 # kana_YU +0x04d6 U30e8 # kana_YO +0x04d7 U30e9 # kana_RA +0x04d8 U30ea # kana_RI +0x04d9 U30eb # kana_RU +0x04da U30ec # kana_RE +0x04db U30ed # kana_RO +0x04dc U30ef # kana_WA +0x04dd U30f3 # kana_N +0x04de U309b # voicedsound +0x04df U309c # semivoicedsound +0x05ac U060c # Arabic_comma +0x05bb U061b # Arabic_semicolon +0x05bf U061f # Arabic_question_mark +0x05c1 U0621 # Arabic_hamza +0x05c2 U0622 # Arabic_maddaonalef +0x05c3 U0623 # Arabic_hamzaonalef +0x05c4 U0624 # Arabic_hamzaonwaw +0x05c5 U0625 # Arabic_hamzaunderalef +0x05c6 U0626 # Arabic_hamzaonyeh +0x05c7 U0627 # Arabic_alef +0x05c8 U0628 # Arabic_beh +0x05c9 U0629 # Arabic_tehmarbuta +0x05ca U062a # Arabic_teh +0x05cb U062b # Arabic_theh +0x05cc U062c # Arabic_jeem +0x05cd U062d # Arabic_hah +0x05ce U062e # Arabic_khah +0x05cf U062f # Arabic_dal +0x05d0 U0630 # Arabic_thal +0x05d1 U0631 # Arabic_ra +0x05d2 U0632 # Arabic_zain +0x05d3 U0633 # Arabic_seen +0x05d4 U0634 # Arabic_sheen +0x05d5 U0635 # Arabic_sad +0x05d6 U0636 # Arabic_dad +0x05d7 U0637 # Arabic_tah +0x05d8 U0638 # Arabic_zah +0x05d9 U0639 # Arabic_ain +0x05da U063a # Arabic_ghain +0x05e0 U0640 # Arabic_tatweel +0x05e1 U0641 # Arabic_feh +0x05e2 U0642 # Arabic_qaf +0x05e3 U0643 # Arabic_kaf +0x05e4 U0644 # Arabic_lam +0x05e5 U0645 # Arabic_meem +0x05e6 U0646 # Arabic_noon +0x05e7 U0647 # Arabic_ha +0x05e8 U0648 # Arabic_waw +0x05e9 U0649 # Arabic_alefmaksura +0x05ea U064a # Arabic_yeh +0x05eb U064b # Arabic_fathatan +0x05ec U064c # Arabic_dammatan +0x05ed U064d # Arabic_kasratan +0x05ee U064e # Arabic_fatha +0x05ef U064f # Arabic_damma +0x05f0 U0650 # Arabic_kasra +0x05f1 U0651 # Arabic_shadda +0x05f2 U0652 # Arabic_sukun +0x06a1 U0452 # Serbian_dje +0x06a2 U0453 # Macedonia_gje +0x06a3 U0451 # Cyrillic_io +0x06a4 U0454 # Ukrainian_ie +0x06a5 U0455 # Macedonia_dse +0x06a6 U0456 # Ukrainian_i +0x06a7 U0457 # Ukrainian_yi +0x06a8 U0458 # Cyrillic_je +0x06a9 U0459 # Cyrillic_lje +0x06aa U045a # Cyrillic_nje +0x06ab U045b # Serbian_tshe +0x06ac U045c # Macedonia_kje +0x06ad U0491 # Ukrainian_ghe_with_upturn +0x06ae U045e # Byelorussian_shortu +0x06af U045f # Cyrillic_dzhe +0x06b0 U2116 # numerosign +0x06b1 U0402 # Serbian_DJE +0x06b2 U0403 # Macedonia_GJE +0x06b3 U0401 # Cyrillic_IO +0x06b4 U0404 # Ukrainian_IE +0x06b5 U0405 # Macedonia_DSE +0x06b6 U0406 # Ukrainian_I +0x06b7 U0407 # Ukrainian_YI +0x06b8 U0408 # Cyrillic_JE +0x06b9 U0409 # Cyrillic_LJE +0x06ba U040a # Cyrillic_NJE +0x06bb U040b # Serbian_TSHE +0x06bc U040c # Macedonia_KJE +0x06bd U0490 # Ukrainian_GHE_WITH_UPTURN +0x06be U040e # Byelorussian_SHORTU +0x06bf U040f # Cyrillic_DZHE +0x06c0 U044e # Cyrillic_yu +0x06c1 U0430 # Cyrillic_a +0x06c2 U0431 # Cyrillic_be +0x06c3 U0446 # Cyrillic_tse +0x06c4 U0434 # Cyrillic_de +0x06c5 U0435 # Cyrillic_ie +0x06c6 U0444 # Cyrillic_ef +0x06c7 U0433 # Cyrillic_ghe +0x06c8 U0445 # Cyrillic_ha +0x06c9 U0438 # Cyrillic_i +0x06ca U0439 # Cyrillic_shorti +0x06cb U043a # Cyrillic_ka +0x06cc U043b # Cyrillic_el +0x06cd U043c # Cyrillic_em +0x06ce U043d # Cyrillic_en +0x06cf U043e # Cyrillic_o +0x06d0 U043f # Cyrillic_pe +0x06d1 U044f # Cyrillic_ya +0x06d2 U0440 # Cyrillic_er +0x06d3 U0441 # Cyrillic_es +0x06d4 U0442 # Cyrillic_te +0x06d5 U0443 # Cyrillic_u +0x06d6 U0436 # Cyrillic_zhe +0x06d7 U0432 # Cyrillic_ve +0x06d8 U044c # Cyrillic_softsign +0x06d9 U044b # Cyrillic_yeru +0x06da U0437 # Cyrillic_ze +0x06db U0448 # Cyrillic_sha +0x06dc U044d # Cyrillic_e +0x06dd U0449 # Cyrillic_shcha +0x06de U0447 # Cyrillic_che +0x06df U044a # Cyrillic_hardsign +0x06e0 U042e # Cyrillic_YU +0x06e1 U0410 # Cyrillic_A +0x06e2 U0411 # Cyrillic_BE +0x06e3 U0426 # Cyrillic_TSE +0x06e4 U0414 # Cyrillic_DE +0x06e5 U0415 # Cyrillic_IE +0x06e6 U0424 # Cyrillic_EF +0x06e7 U0413 # Cyrillic_GHE +0x06e8 U0425 # Cyrillic_HA +0x06e9 U0418 # Cyrillic_I +0x06ea U0419 # Cyrillic_SHORTI +0x06eb U041a # Cyrillic_KA +0x06ec U041b # Cyrillic_EL +0x06ed U041c # Cyrillic_EM +0x06ee U041d # Cyrillic_EN +0x06ef U041e # Cyrillic_O +0x06f0 U041f # Cyrillic_PE +0x06f1 U042f # Cyrillic_YA +0x06f2 U0420 # Cyrillic_ER +0x06f3 U0421 # Cyrillic_ES +0x06f4 U0422 # Cyrillic_TE +0x06f5 U0423 # Cyrillic_U +0x06f6 U0416 # Cyrillic_ZHE +0x06f7 U0412 # Cyrillic_VE +0x06f8 U042c # Cyrillic_SOFTSIGN +0x06f9 U042b # Cyrillic_YERU +0x06fa U0417 # Cyrillic_ZE +0x06fb U0428 # Cyrillic_SHA +0x06fc U042d # Cyrillic_E +0x06fd U0429 # Cyrillic_SHCHA +0x06fe U0427 # Cyrillic_CHE +0x06ff U042a # Cyrillic_HARDSIGN +0x07a1 U0386 # Greek_ALPHAaccent +0x07a2 U0388 # Greek_EPSILONaccent +0x07a3 U0389 # Greek_ETAaccent +0x07a4 U038a # Greek_IOTAaccent +0x07a5 U03aa # Greek_IOTAdieresis +0x07a7 U038c # Greek_OMICRONaccent +0x07a8 U038e # Greek_UPSILONaccent +0x07a9 U03ab # Greek_UPSILONdieresis +0x07ab U038f # Greek_OMEGAaccent +0x07ae U0385 # Greek_accentdieresis +0x07af U2015 # Greek_horizbar +0x07b1 U03ac # Greek_alphaaccent +0x07b2 U03ad # Greek_epsilonaccent +0x07b3 U03ae # Greek_etaaccent +0x07b4 U03af # Greek_iotaaccent +0x07b5 U03ca # Greek_IOTAdieresis +0x07b6 U0390 # Greek_iotaaccentdieresis +0x07b7 U03cc # Greek_omicronaccent +0x07b8 U03cd # Greek_upsilonaccent +0x07b9 U03cb # Greek_upsilondieresis +0x07ba U03b0 # Greek_upsilonaccentdieresis +0x07bb U03ce # Greek_omegaaccent +0x07c1 U0391 # Greek_ALPHA +0x07c2 U0392 # Greek_BETA +0x07c3 U0393 # Greek_GAMMA +0x07c4 U0394 # Greek_DELTA +0x07c5 U0395 # Greek_EPSILON +0x07c6 U0396 # Greek_ZETA +0x07c7 U0397 # Greek_ETA +0x07c8 U0398 # Greek_THETA +0x07c9 U0399 # Greek_IOTA +0x07ca U039a # Greek_KAPPA +0x07cb U039b # Greek_LAMBDA +0x07cb U039b # Greek_LAMDA +0x07cc U039c # Greek_MU +0x07cd U039d # Greek_NU +0x07ce U039e # Greek_XI +0x07cf U039f # Greek_OMICRON +0x07d0 U03a0 # Greek_PI +0x07d1 U03a1 # Greek_RHO +0x07d2 U03a3 # Greek_SIGMA +0x07d4 U03a4 # Greek_TAU +0x07d5 U03a5 # Greek_UPSILON +0x07d6 U03a6 # Greek_PHI +0x07d7 U03a7 # Greek_CHI +0x07d8 U03a8 # Greek_PSI +0x07d9 U03a9 # Greek_OMEGA +0x07e1 U03b1 # Greek_alpha +0x07e2 U03b2 # Greek_beta +0x07e3 U03b3 # Greek_gamma +0x07e4 U03b4 # Greek_delta +0x07e5 U03b5 # Greek_epsilon +0x07e6 U03b6 # Greek_zeta +0x07e7 U03b7 # Greek_eta +0x07e8 U03b8 # Greek_theta +0x07e9 U03b9 # Greek_iota +0x07ea U03ba # Greek_kappa +0x07eb U03bb # Greek_lambda +0x07ec U03bc # Greek_mu +0x07ed U03bd # Greek_nu +0x07ee U03be # Greek_xi +0x07ef U03bf # Greek_omicron +0x07f0 U03c0 # Greek_pi +0x07f1 U03c1 # Greek_rho +0x07f2 U03c3 # Greek_sigma +0x07f3 U03c2 # Greek_finalsmallsigma +0x07f4 U03c4 # Greek_tau +0x07f5 U03c5 # Greek_upsilon +0x07f6 U03c6 # Greek_phi +0x07f7 U03c7 # Greek_chi +0x07f8 U03c8 # Greek_psi +0x07f9 U03c9 # Greek_omega +0x08a1 U23b7 # leftradical +0x08a2 U250c # topleftradical +0x08a3 U2500 # horizconnector +0x08a4 U2320 # topintegral +0x08a5 U2321 # botintegral +0x08a6 U2502 # vertconnector +0x08a7 U23a1 # topleftsqbracket +0x08a8 U23a3 # botleftsqbracket +0x08a9 U23a4 # toprightsqbracket +0x08aa U23a6 # botrightsqbracket +0x08ab U239b # topleftparens +0x08ac U239d # botleftparens +0x08ad U239e # toprightparens +0x08ae U23a0 # botrightparens +0x08af U23a8 # leftmiddlecurlybrace +0x08b0 U23ac # rightmiddlecurlybrace +0x08b1 U0000 # topleftsummation +0x08b2 U0000 # botleftsummation +0x08b3 U0000 # topvertsummationconnector +0x08b4 U0000 # botvertsummationconnector +0x08b5 U0000 # toprightsummation +0x08b6 U0000 # botrightsummation +0x08b7 U0000 # rightmiddlesummation +0x08bc U2264 # lessthanequal +0x08bd U2260 # notequal +0x08be U2265 # greaterthanequal +0x08bf U222b # integral +0x08c0 U2234 # therefore +0x08c1 U221d # variation +0x08c2 U221e # infinity +0x08c5 U2207 # nabla +0x08c8 U223c # approximate +0x08c9 U2243 # similarequal +0x08cd U21d4 # ifonlyif +0x08ce U21d2 # implies +0x08cf U2261 # identical +0x08d6 U221a # radical +0x08da U2282 # includedin +0x08db U2283 # includes +0x08dc U2229 # intersection +0x08dd U222a # union +0x08de U2227 # logicaland +0x08df U2228 # logicalor +0x08ef U2202 # partialderivative +0x08f6 U0192 # function +0x08fb U2190 # leftarrow +0x08fc U2191 # uparrow +0x08fd U2192 # rightarrow +0x08fe U2193 # downarrow +0x09df U2422 # blank +0x09e0 U25c6 # soliddiamond +0x09e1 U2592 # checkerboard +0x09e2 U2409 # ht +0x09e3 U240c # ff +0x09e4 U240d # cr +0x09e5 U240a # lf +0x09e8 U2424 # nl +0x09e9 U240b # vt +0x09ea U2518 # lowrightcorner +0x09eb U2510 # uprightcorner +0x09ec U250c # upleftcorner +0x09ed U2514 # lowleftcorner +0x09ee U253c # crossinglines +0x09ef U23ba # horizlinescan1 +0x09f0 U23bb # horizlinescan3 +0x09f1 U2500 # horizlinescan5 +0x09f2 U23bc # horizlinescan7 +0x09f3 U23bd # horizlinescan9 +0x09f4 U251c # leftt +0x09f5 U2524 # rightt +0x09f6 U2534 # bott +0x09f7 U252c # topt +0x09f8 U2502 # vertbar +0x0aa1 U2003 # emspace +0x0aa2 U2002 # enspace +0x0aa3 U2004 # em3space +0x0aa4 U2005 # em4space +0x0aa5 U2007 # digitspace +0x0aa6 U2008 # punctspace +0x0aa7 U2009 # thinspace +0x0aa8 U200a # hairspace +0x0aa9 U2014 # emdash +0x0aaa U2013 # endash +0x0aac U2423 # signifblank +0x0aae U2026 # ellipsis +0x0aaf U2025 # doubbaselinedot +0x0ab0 U2153 # onethird +0x0ab1 U2154 # twothirds +0x0ab2 U2155 # onefifth +0x0ab3 U2156 # twofifths +0x0ab4 U2157 # threefifths +0x0ab5 U2158 # fourfifths +0x0ab6 U2159 # onesixth +0x0ab7 U215a # fivesixths +0x0ab8 U2105 # careof +0x0abb U2012 # figdash +0x0abc U2329 # leftanglebracket (not U+27E8) +0x0abd U002e # decimalpoint +0x0abe U232a # rightanglebracket (not U+27E9) +0x0abf U0000 # marker +0x0ac3 U215b # oneeighth +0x0ac4 U215c # threeeighths +0x0ac5 U215d # fiveeighths +0x0ac6 U215e # seveneighths +0x0ac9 U2122 # trademark +0x0aca U2613 # signaturemark +0x0acb U0000 # trademarkincircle +0x0acc U25c1 # leftopentriangle +0x0acd U25b7 # rightopentriangle +0x0ace U25cb # emopencircle +0x0acf U25af # emopenrectangle +0x0ad0 U2018 # leftsinglequotemark +0x0ad1 U2019 # rightsinglequotemark +0x0ad2 U201c # leftdoublequotemark +0x0ad3 U201d # rightdoublequotemark +0x0ad4 U211e # prescription +0x0ad5 U2030 # per mille +0x0ad6 U2032 # minutes +0x0ad7 U2033 # seconds +0x0ad9 U271d # latincross +0x0ada U0000 # hexagram +0x0adb U25ac # filledrectbullet +0x0adc U25c0 # filledlefttribullet +0x0add U25b6 # filledrighttribullet +0x0ade U25cf # emfilledcircle +0x0adf U25ae # emfilledrect +0x0ae0 U25e6 # enopencircbullet +0x0ae1 U25ab # enopensquarebullet +0x0ae2 U25ad # openrectbullet +0x0ae3 U25b3 # opentribulletup +0x0ae4 U25bd # opentribulletdown +0x0ae5 U2606 # openstar +0x0ae6 U2022 # enfilledcircbullet +0x0ae7 U25aa # enfilledsqbullet +0x0ae8 U25b2 # filledtribulletup +0x0ae9 U25bc # filledtribulletdown +0x0aea U261c # leftpointer +0x0aeb U261e # rightpointer +0x0aec U2663 # club +0x0aed U2666 # diamond +0x0aee U2665 # heart +0x0af0 U2720 # maltesecross +0x0af1 U2020 # dagger +0x0af2 U2021 # doubledagger +0x0af3 U2713 # checkmark +0x0af4 U2717 # ballotcross +0x0af5 U266f # musicalsharp +0x0af6 U266d # musicalflat +0x0af7 U2642 # malesymbol +0x0af8 U2640 # femalesymbol +0x0af9 U260e # telephone +0x0afa U2315 # telephonerecorder +0x0afb U2117 # phonographcopyright +0x0afc U2038 # caret +0x0afd U201a # singlelowquotemark +0x0afe U201e # doublelowquotemark +0x0aff U0000 # cursor +0x0ba3 U003c # leftcaret +0x0ba6 U003e # rightcaret +0x0ba8 U2228 # downcaret +0x0ba9 U2227 # upcaret +0x0bc0 U00af # overbar +0x0bc2 U22a4 # downtack +0x0bc3 U2229 # upshoe +0x0bc4 U230a # downstile +0x0bc6 U005f # underbar +0x0bca U2218 # jot +0x0bcc U2395 # quad +0x0bce U22a5 # uptack +0x0bcf U25cb # circle +0x0bd3 U2308 # upstile +0x0bd6 U222a # downshoe +0x0bd8 U2283 # rightshoe +0x0bda U2282 # leftshoe +0x0bdc U22a3 # lefttack +0x0bfc U22a2 # righttack +0x0cdf U2017 # hebrew_doublelowline +0x0ce0 U05d0 # hebrew_aleph +0x0ce1 U05d1 # hebrew_bet +0x0ce2 U05d2 # hebrew_gimel +0x0ce3 U05d3 # hebrew_dalet +0x0ce4 U05d4 # hebrew_he +0x0ce5 U05d5 # hebrew_waw +0x0ce6 U05d6 # hebrew_zain +0x0ce7 U05d7 # hebrew_chet +0x0ce8 U05d8 # hebrew_tet +0x0ce9 U05d9 # hebrew_yod +0x0cea U05da # hebrew_finalkaph +0x0ceb U05db # hebrew_kaph +0x0cec U05dc # hebrew_lamed +0x0ced U05dd # hebrew_finalmem +0x0cee U05de # hebrew_mem +0x0cef U05df # hebrew_finalnun +0x0cf0 U05e0 # hebrew_nun +0x0cf1 U05e1 # hebrew_samech +0x0cf2 U05e2 # hebrew_ayin +0x0cf3 U05e3 # hebrew_finalpe +0x0cf4 U05e4 # hebrew_pe +0x0cf5 U05e5 # hebrew_finalzade +0x0cf6 U05e6 # hebrew_zade +0x0cf7 U05e7 # hebrew_qoph +0x0cf8 U05e8 # hebrew_resh +0x0cf9 U05e9 # hebrew_shin +0x0cfa U05ea # hebrew_taw +0x0da1 U0e01 # Thai_kokai +0x0da2 U0e02 # Thai_khokhai +0x0da3 U0e03 # Thai_khokhuat +0x0da4 U0e04 # Thai_khokhwai +0x0da5 U0e05 # Thai_khokhon +0x0da6 U0e06 # Thai_khorakhang +0x0da7 U0e07 # Thai_ngongu +0x0da8 U0e08 # Thai_chochan +0x0da9 U0e09 # Thai_choching +0x0daa U0e0a # Thai_chochang +0x0dab U0e0b # Thai_soso +0x0dac U0e0c # Thai_chochoe +0x0dad U0e0d # Thai_yoying +0x0dae U0e0e # Thai_dochada +0x0daf U0e0f # Thai_topatak +0x0db0 U0e10 # Thai_thothan +0x0db1 U0e11 # Thai_thonangmontho +0x0db2 U0e12 # Thai_thophuthao +0x0db3 U0e13 # Thai_nonen +0x0db4 U0e14 # Thai_dodek +0x0db5 U0e15 # Thai_totao +0x0db6 U0e16 # Thai_thothung +0x0db7 U0e17 # Thai_thothahan +0x0db8 U0e18 # Thai_thothong +0x0db9 U0e19 # Thai_nonu +0x0dba U0e1a # Thai_bobaimai +0x0dbb U0e1b # Thai_popla +0x0dbc U0e1c # Thai_phophung +0x0dbd U0e1d # Thai_fofa +0x0dbe U0e1e # Thai_phophan +0x0dbf U0e1f # Thai_fofan +0x0dc0 U0e20 # Thai_phosamphao +0x0dc1 U0e21 # Thai_moma +0x0dc2 U0e22 # Thai_yoyak +0x0dc3 U0e23 # Thai_rorua +0x0dc4 U0e24 # Thai_ru +0x0dc5 U0e25 # Thai_loling +0x0dc6 U0e26 # Thai_lu +0x0dc7 U0e27 # Thai_wowaen +0x0dc8 U0e28 # Thai_sosala +0x0dc9 U0e29 # Thai_sorusi +0x0dca U0e2a # Thai_sosua +0x0dcb U0e2b # Thai_hohip +0x0dcc U0e2c # Thai_lochula +0x0dcd U0e2d # Thai_oang +0x0dce U0e2e # Thai_honokhuk +0x0dcf U0e2f # Thai_paiyannoi +0x0dd0 U0e30 # Thai_saraa +0x0dd1 U0e31 # Thai_maihanakat +0x0dd2 U0e32 # Thai_saraaa +0x0dd3 U0e33 # Thai_saraam +0x0dd4 U0e34 # Thai_sarai +0x0dd5 U0e35 # Thai_saraii +0x0dd6 U0e36 # Thai_saraue +0x0dd7 U0e37 # Thai_sarauee +0x0dd8 U0e38 # Thai_sarau +0x0dd9 U0e39 # Thai_sarauu +0x0dda U0e3a # Thai_phinthu +0x0dde U0000 # Thai_maihanakat_maitho +0x0ddf U0e3f # Thai_baht +0x0de0 U0e40 # Thai_sarae +0x0de1 U0e41 # Thai_saraae +0x0de2 U0e42 # Thai_sarao +0x0de3 U0e43 # Thai_saraaimaimuan +0x0de4 U0e44 # Thai_saraaimaimalai +0x0de5 U0e45 # Thai_lakkhangyao +0x0de6 U0e46 # Thai_maiyamok +0x0de7 U0e47 # Thai_maitaikhu +0x0de8 U0e48 # Thai_maiek +0x0de9 U0e49 # Thai_maitho +0x0dea U0e4a # Thai_maitri +0x0deb U0e4b # Thai_maichattawa +0x0dec U0e4c # Thai_thanthakhat +0x0ded U0e4d # Thai_nikhahit +0x0df0 U0e50 # Thai_leksun +0x0df1 U0e51 # Thai_leknung +0x0df2 U0e52 # Thai_leksong +0x0df3 U0e53 # Thai_leksam +0x0df4 U0e54 # Thai_leksi +0x0df5 U0e55 # Thai_lekha +0x0df6 U0e56 # Thai_lekhok +0x0df7 U0e57 # Thai_lekchet +0x0df8 U0e58 # Thai_lekpaet +0x0df9 U0e59 # Thai_lekkao +0x0ea1 U3131 # Hangul_Kiyeog +0x0ea2 U3132 # Hangul_SsangKiyeog +0x0ea3 U3133 # Hangul_KiyeogSios +0x0ea4 U3134 # Hangul_Nieun +0x0ea5 U3135 # Hangul_NieunJieuj +0x0ea6 U3136 # Hangul_NieunHieuh +0x0ea7 U3137 # Hangul_Dikeud +0x0ea8 U3138 # Hangul_SsangDikeud +0x0ea9 U3139 # Hangul_Rieul +0x0eaa U313a # Hangul_RieulKiyeog +0x0eab U313b # Hangul_RieulMieum +0x0eac U313c # Hangul_RieulPieub +0x0ead U313d # Hangul_RieulSios +0x0eae U313e # Hangul_RieulTieut +0x0eaf U313f # Hangul_RieulPhieuf +0x0eb0 U3140 # Hangul_RieulHieuh +0x0eb1 U3141 # Hangul_Mieum +0x0eb2 U3142 # Hangul_Pieub +0x0eb3 U3143 # Hangul_SsangPieub +0x0eb4 U3144 # Hangul_PieubSios +0x0eb5 U3145 # Hangul_Sios +0x0eb6 U3146 # Hangul_SsangSios +0x0eb7 U3147 # Hangul_Ieung +0x0eb8 U3148 # Hangul_Jieuj +0x0eb9 U3149 # Hangul_SsangJieuj +0x0eba U314a # Hangul_Cieuc +0x0ebb U314b # Hangul_Khieuq +0x0ebc U314c # Hangul_Tieut +0x0ebd U314d # Hangul_Phieuf +0x0ebe U314e # Hangul_Hieuh +0x0ebf U314f # Hangul_A +0x0ec0 U3150 # Hangul_AE +0x0ec1 U3151 # Hangul_YA +0x0ec2 U3152 # Hangul_YAE +0x0ec3 U3153 # Hangul_EO +0x0ec4 U3154 # Hangul_E +0x0ec5 U3155 # Hangul_YEO +0x0ec6 U3156 # Hangul_YE +0x0ec7 U3157 # Hangul_O +0x0ec8 U3158 # Hangul_WA +0x0ec9 U3159 # Hangul_WAE +0x0eca U315a # Hangul_OE +0x0ecb U315b # Hangul_YO +0x0ecc U315c # Hangul_U +0x0ecd U315d # Hangul_WEO +0x0ece U315e # Hangul_WE +0x0ecf U315f # Hangul_WI +0x0ed0 U3160 # Hangul_YU +0x0ed1 U3161 # Hangul_EU +0x0ed2 U3162 # Hangul_YI +0x0ed3 U3163 # Hangul_I +0x0ed4 U11a8 # Hangul_J_Kiyeog +0x0ed5 U11a9 # Hangul_J_SsangKiyeog +0x0ed6 U11aa # Hangul_J_KiyeogSios +0x0ed7 U11ab # Hangul_J_Nieun +0x0ed8 U11ac # Hangul_J_NieunJieuj +0x0ed9 U11ad # Hangul_J_NieunHieuh +0x0eda U11ae # Hangul_J_Dikeud +0x0edb U11af # Hangul_J_Rieul +0x0edc U11b0 # Hangul_J_RieulKiyeog +0x0edd U11b1 # Hangul_J_RieulMieum +0x0ede U11b2 # Hangul_J_RieulPieub +0x0edf U11b3 # Hangul_J_RieulSios +0x0ee0 U11b4 # Hangul_J_RieulTieut +0x0ee1 U11b5 # Hangul_J_RieulPhieuf +0x0ee2 U11b6 # Hangul_J_RieulHieuh +0x0ee3 U11b7 # Hangul_J_Mieum +0x0ee4 U11b8 # Hangul_J_Pieub +0x0ee5 U11b9 # Hangul_J_PieubSios +0x0ee6 U11ba # Hangul_J_Sios +0x0ee7 U11bb # Hangul_J_SsangSios +0x0ee8 U11bc # Hangul_J_Ieung +0x0ee9 U11bd # Hangul_J_Jieuj +0x0eea U11be # Hangul_J_Cieuc +0x0eeb U11bf # Hangul_J_Khieuq +0x0eec U11c0 # Hangul_J_Tieut +0x0eed U11c1 # Hangul_J_Phieuf +0x0eee U11c2 # Hangul_J_Hieuh +0x0eef U316d # Hangul_RieulYeorinHieuh +0x0ef0 U3171 # Hangul_SunkyeongeumMieum +0x0ef1 U3178 # Hangul_SunkyeongeumPieub +0x0ef2 U317f # Hangul_PanSios +0x0ef3 U3181 # Hangul_KkogjiDalrinIeung +0x0ef4 U3184 # Hangul_SunkyeongeumPhieuf +0x0ef5 U3186 # Hangul_YeorinHieuh +0x0ef6 U318d # Hangul_AraeA +0x0ef7 U318e # Hangul_AraeAE +0x0ef8 U11eb # Hangul_J_PanSios +0x0ef9 U11f0 # Hangul_J_KkogjiDalrinIeung +0x0efa U11f9 # Hangul_J_YeorinHieuh +0x0eff U20a9 # Korean_Won +0x13a4 U20ac # Euro +0x13bc U0152 # OE +0x13bd U0153 # oe +0x13be U0178 # Ydiaeresis +0x20a0 U20a0 # EcuSign +0x20a1 U20a1 # ColonSign +0x20a2 U20a2 # CruzeiroSign +0x20a3 U20a3 # FFrancSign +0x20a4 U20a4 # LiraSign +0x20a5 U20a5 # MillSign +0x20a6 U20a6 # NairaSign +0x20a7 U20a7 # PesetaSign +0x20a8 U20a8 # RupeeSign +0x20a9 U20a9 # WonSign +0x20aa U20aa # NewSheqelSign +0x20ab U20ab # DongSign +0x20ac U20ac # EuroSign +0xfe50 U0300 # dead_grave +0xfe51 U0301 # dead_acute +0xfe52 U0302 # dead_circumflex +0xfe53 U0303 # dead_tilde +0xfe54 U0304 # dead_macron +0xfe55 U0306 # dead_breve +0xfe56 U0307 # dead_abovedot +0xfe57 U0308 # dead_diaeresis +0xfe58 U030a # dead_abovering +0xfe59 U030b # dead_doubleacute +0xfe5a U030c # dead_caron +0xfe5b U0327 # dead_cedilla +0xfe5c U0328 # dead_ogonek +0xfe5d U0345 # dead_iota +0xfe5e U3099 # dead_voiced_sound +0xfe5f U309a # dead_semivoiced_sound +0xff08 U0008 # BackSpace /* back space, back char */ +0xff09 U0009 # Tab +0xff0a U000a # Linefeed /* Linefeed, LF */ +0xff0b U000b # Clear +0xff0d U000d # Return /* Return, enter */ +0xff13 U0013 # Pause /* Pause, hold */ +0xff14 U0014 # Scroll_Lock +0xff15 U0015 # Sys_Req +0xff1b U001b # Escape +0xff80 U0032 # KP_Space /* space */ +0xff89 U0009 # KP_Tab +0xff8d U000d # KP_Enter /* enter */ +0xffaa U002a # KP_Multiply +0xffab U002b # KP_Add +0xffac U002c # KP_Separator /* separator, often comma */ +0xffad U002d # KP_Subtract +0xffae U002e # KP_Decimal +0xffaf U002f # KP_Divide +0xffb0 U0030 # KP_0 +0xffb1 U0031 # KP_1 +0xffb2 U0032 # KP_2 +0xffb3 U0033 # KP_3 +0xffb4 U0034 # KP_4 +0xffb5 U0035 # KP_5 +0xffb6 U0036 # KP_6 +0xffb7 U0037 # KP_7 +0xffb8 U0038 # KP_8 +0xffb9 U0039 # KP_9 +0xffbd U003d # KP_Equal /* equals */ diff --git a/ports/xterm/xterm-359/unicode/make-precompose.sh b/ports/xterm/xterm-359/unicode/make-precompose.sh new file mode 100755 index 0000000..7c513c4 --- /dev/null +++ b/ports/xterm/xterm-359/unicode/make-precompose.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# $XTermId: make-precompose.sh,v 1.6 2007/02/05 01:06:36 Thomas.Wolff Exp $ +# $XFree86: xc/programs/xterm/unicode/make-precompose.sh,v 1.4 2005/03/29 04:00:32 tsi Exp $ + +cat precompose.c.head | sed -e's/@/$/g' + +# extract canonical decomposition data from UnicodeData.txt, +# pad hex values to 5 digits, +# sort numerically on base character, then combining character, +# then reduce to 4 digits again where possible +cut UnicodeData.txt -d ";" -f 1,6 | + grep ";[0-9,A-F]" | grep " " | + sed -e "s/ /, 0x/;s/^/{ 0x/;s/;/, 0x/;s/$/},/" | + sed -e "s,0x\(....\)\([^0-9A-Fa-f]\),0x0\1\2,g" | + (sort -k 3 || sort +2) | + sed -e "s,0x0\(...[0-9A-Fa-f]\),0x\1,g" + +cat precompose.c.tail diff --git a/ports/xterm/xterm-359/unicode/precompose.c.head b/ports/xterm/xterm-359/unicode/precompose.c.head new file mode 100644 index 0000000..2977a05 --- /dev/null +++ b/ports/xterm/xterm-359/unicode/precompose.c.head @@ -0,0 +1,15 @@ +/* + * Canonical Compositions + * + * DO NOT EDIT BY HAND! This is generated by the script + * unicode/make-precompose.sh + */ +/* @XTermId@ */ + +#include + +static struct { + int replacement; + int base; + int comb; +} precompositions[] = { diff --git a/ports/xterm/xterm-359/unicode/precompose.c.tail b/ports/xterm/xterm-359/unicode/precompose.c.tail new file mode 100644 index 0000000..458f721 --- /dev/null +++ b/ports/xterm/xterm-359/unicode/precompose.c.tail @@ -0,0 +1,24 @@ +}; + +#define UNICODE_SHIFT 21 + +int do_precomposition(int base, int comb) { + int min = 0; + int max = sizeof(precompositions) / sizeof(precompositions[0]) - 1; + unsigned long sought = ((unsigned) base << UNICODE_SHIFT) | (unsigned) comb; + + /* binary search */ + while (max >= min) { + int mid = (min + max) / 2; + unsigned long that = ((unsigned long) precompositions[mid].base << UNICODE_SHIFT) | ((unsigned) precompositions[mid].comb); + if (that < sought) { + min = mid + 1; + } else if (that > sought) { + max = mid - 1; + } else { + return precompositions[mid].replacement; + } + } + /* no match */ + return -1; +} diff --git a/ports/xterm/xterm-359/util.c b/ports/xterm/xterm-359/util.c new file mode 100644 index 0000000..3c6de55 --- /dev/null +++ b/ports/xterm/xterm-359/util.c @@ -0,0 +1,5513 @@ +/* $XTermId: util.c,v 1.856 2020/08/17 22:25:21 tom Exp $ */ + +/* + * Copyright 1999-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + * + * + * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + * + * All Rights Reserved + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Digital Equipment + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior permission. + * + * + * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL + * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR + * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +/* util.c */ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#if OPT_WIDE_CHARS +#if defined(HAVE_WCHAR_H) && defined(HAVE_WCWIDTH) +#include +#endif +#include +#endif + +#ifdef HAVE_X11_EXTENSIONS_XINERAMA_H +#include +#endif /* HAVE_X11_EXTENSIONS_XINERAMA_H */ + +#include + +static int handle_translated_exposure(XtermWidget xw, + int rect_x, + int rect_y, + int rect_width, + int rect_height); +static void ClearLeft(XtermWidget xw); +static void CopyWait(XtermWidget xw); +static void horizontal_copy_area(XtermWidget xw, + int firstchar, + int nchars, + int amount); +static void vertical_copy_area(XtermWidget xw, + int firstline, + int nlines, + int amount, + int left, + int right); + +#if OPT_WIDE_CHARS +unsigned first_widechar; +int (*my_wcwidth) (wchar_t); +#endif + +#if OPT_WIDE_CHARS +/* + * We will modify the 'n' cells beginning at the current position. + * Some of those cells may be part of multi-column characters, including + * carryover from the left. Find the limits of the multi-column characters + * that we should fill with blanks, return true if filling is needed. + */ +int +DamagedCells(TScreen *screen, unsigned n, int *klp, int *krp, int row, int col) +{ + CLineData *ld = getLineData(screen, row); + int result = False; + + assert(ld); + if (col < (int) ld->lineSize) { + int nn = (int) n; + int kl = col; + int kr = col + nn; + + if (kr >= (int) ld->lineSize) { + nn = (ld->lineSize - col - 1); + kr = col + nn; + } + + if (nn > 0) { + assert(kl < (int) ld->lineSize); + if (ld->charData[kl] == HIDDEN_CHAR) { + while (kl > 0) { + if (ld->charData[--kl] != HIDDEN_CHAR) { + break; + } + } + } else { + kl = col + 1; + } + + assert(kr < (int) ld->lineSize); + if (ld->charData[kr] == HIDDEN_CHAR) { + while (kr < screen->max_col) { + assert((kr + 1) < (int) ld->lineSize); + if (ld->charData[++kr] != HIDDEN_CHAR) { + --kr; + break; + } + } + } else { + kr = col - 1; + } + + if (klp) + *klp = kl; + if (krp) + *krp = kr; + result = (kr >= kl); + } + } + + return result; +} + +int +DamagedCurCells(TScreen *screen, unsigned n, int *klp, int *krp) +{ + return DamagedCells(screen, n, klp, krp, screen->cur_row, screen->cur_col); +} +#endif /* OPT_WIDE_CHARS */ + +/* + * These routines are used for the jump scroll feature + */ +void +FlushScroll(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int i; + int shift = INX2ROW(screen, 0); + int bot = screen->max_row - shift; + int refreshtop; + int refreshheight; + int scrolltop; + int scrollheight; + int left = ScrnLeftMargin(xw); + int right = ScrnRightMargin(xw); + Boolean full_lines = (Boolean) ((left == 0) && (right == screen->max_col)); + + if (screen->cursor_state) + HideCursor(); + + TRACE(("FlushScroll %s-lines scroll:%d refresh %d\n", + full_lines ? "full" : "partial", + screen->scroll_amt, + screen->refresh_amt)); + + if (screen->scroll_amt > 0) { + /* + * Lines will be scrolled "up". + */ + refreshheight = screen->refresh_amt; + scrollheight = screen->bot_marg - screen->top_marg - refreshheight + 1; + refreshtop = screen->bot_marg - refreshheight + 1 + shift; + i = screen->max_row - screen->scroll_amt + 1; + if (refreshtop > i) { + refreshtop = i; + } + + /* + * If this is the normal (not alternate) screen, and the top margin is + * at the top of the screen, then we will shift full lines scrolled out + * of the scrolling region into the saved-lines. + */ + if (screen->scrollWidget + && !screen->whichBuf + && full_lines + && screen->top_marg == 0) { + scrolltop = 0; + scrollheight += shift; + if (scrollheight > i) + scrollheight = i; + i = screen->bot_marg - bot; + if (i > 0) { + refreshheight -= i; + if (refreshheight < screen->scroll_amt) { + refreshheight = screen->scroll_amt; + } + } + i = screen->savedlines; + if (i < screen->savelines) { + i += screen->scroll_amt; + if (i > screen->savelines) { + i = screen->savelines; + } + screen->savedlines = i; + ScrollBarDrawThumb(xw, 1); + } + } else { + scrolltop = screen->top_marg + shift; + i = bot - (screen->bot_marg - screen->refresh_amt + screen->scroll_amt); + if (i > 0) { + if (bot < screen->bot_marg) { + refreshheight = screen->scroll_amt + i; + } + } else { + scrollheight += i; + refreshheight = screen->scroll_amt; + i = screen->top_marg + screen->scroll_amt - 1 - bot; + if (i > 0) { + refreshtop += i; + refreshheight -= i; + } + } + } + } else { + /* + * Lines will be scrolled "down". + */ + refreshheight = -screen->refresh_amt; + scrollheight = screen->bot_marg - screen->top_marg - refreshheight + 1; + refreshtop = screen->top_marg + shift; + scrolltop = refreshtop + refreshheight; + i = screen->bot_marg - bot; + if (i > 0) { + scrollheight -= i; + } + i = screen->top_marg + refreshheight - 1 - bot; + if (i > 0) { + refreshheight -= i; + } + } + + vertical_copy_area(xw, + scrolltop + screen->scroll_amt, + scrollheight, + screen->scroll_amt, + left, + right); + ScrollSelection(screen, -(screen->scroll_amt), False); + screen->scroll_amt = 0; + screen->refresh_amt = 0; + + if (refreshheight > 0) { + ClearCurBackground(xw, + refreshtop, + left, + (unsigned) refreshheight, + (unsigned) (right + 1 - left), + (unsigned) FontWidth(screen)); + ScrnRefresh(xw, + refreshtop, + 0, + refreshheight, + MaxCols(screen), + False); + } + xtermTimedDbe(xw); + return; +} + +/* + * Returns true if there are lines off-screen due to scrolling which should + * include the current line. If false, the line is visible and we should + * paint it now rather than waiting for the line to become visible. + */ +static Bool +AddToRefresh(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int amount = screen->refresh_amt; + int row = screen->cur_row; + Bool result; + + if (amount == 0) { + result = False; + } else if (amount > 0) { + int bottom; + + if (row == (bottom = screen->bot_marg) - amount) { + screen->refresh_amt++; + result = True; + } else { + result = (row >= bottom - amount + 1 && row <= bottom); + } + } else { + int top; + + amount = -amount; + if (row == (top = screen->top_marg) + amount) { + screen->refresh_amt--; + result = True; + } else { + result = (row <= top + amount - 1 && row >= top); + } + } + + /* + * If this line is visible, and there are scrolled-off lines, flush out + * those which are now visible. + */ + if (!result && screen->scroll_amt) + FlushScroll(xw); + + return result; +} + +/* + * Returns true if the current row is in the visible area (it should be for + * screen operations) and incidentally flush the scrolled-in lines which + * have newly become visible. + */ +static Bool +AddToVisible(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Bool result = False; + + if (INX2ROW(screen, screen->cur_row) <= screen->max_row) { + if (!AddToRefresh(xw)) { + result = True; + } + } + return result; +} + +/* + * If we're scrolling, leave the selection intact if possible. + * If it will bump into one of the extremes of the saved-lines, truncate that. + * If the selection is not entirely contained within the margins and not + * entirely outside the margins, clear it. + */ +static void +adjustHiliteOnFwdScroll(XtermWidget xw, int amount, Bool all_lines) +{ + TScreen *screen = TScreenOf(xw); + int lo_row = (all_lines + ? (screen->bot_marg - screen->savelines) + : screen->top_marg); + int hi_row = screen->bot_marg; + int left = ScrnLeftMargin(xw); + int right = ScrnRightMargin(xw); + + TRACE2(("adjustSelection FWD %s by %d (%s)\n", + screen->whichBuf ? "alternate" : "normal", + amount, + all_lines ? "all" : "visible")); + TRACE2((" before highlite %d.%d .. %d.%d\n", + screen->startH.row, + screen->startH.col, + screen->endH.row, + screen->endH.col)); + TRACE2((" margins %d..%d\n", screen->top_marg, screen->bot_marg)); + TRACE2((" limits %d..%d\n", lo_row, hi_row)); + + if ((left > 0 || right < screen->max_col) && + ((screen->startH.row >= lo_row && + screen->startH.row - amount <= hi_row) || + (screen->endH.row >= lo_row && + screen->endH.row - amount <= hi_row))) { + /* + * This could be improved slightly by excluding the special case where + * the selection is on a single line outside left/right margins. + */ + TRACE2(("deselect because selection overlaps with scrolled partial-line\n")); + ScrnDisownSelection(xw); + } else if (screen->startH.row >= lo_row + && screen->startH.row - amount < lo_row) { + /* truncate the selection because its start would move out of region */ + if (lo_row + amount <= screen->endH.row) { + TRACE2(("truncate selection by changing start %d.%d to %d.%d\n", + screen->startH.row, + screen->startH.col, + lo_row + amount, + 0)); + screen->startH.row = lo_row + amount; + screen->startH.col = 0; + } else { + TRACE2(("deselect because %d.%d .. %d.%d shifted %d is outside margins %d..%d\n", + screen->startH.row, + screen->startH.col, + screen->endH.row, + screen->endH.col, + -amount, + lo_row, + hi_row)); + ScrnDisownSelection(xw); + } + } else if (screen->startH.row <= hi_row && screen->endH.row > hi_row) { + TRACE2(("deselect because selection straddles top-margin\n")); + ScrnDisownSelection(xw); + } else if (screen->startH.row < lo_row && screen->endH.row > lo_row) { + TRACE2(("deselect because selection straddles bottom-margin\n")); + ScrnDisownSelection(xw); + } + + TRACE2((" after highlite %d.%d .. %d.%d\n", + screen->startH.row, + screen->startH.col, + screen->endH.row, + screen->endH.col)); +} + +/* + * This is the same as adjustHiliteOnFwdScroll(), but reversed. In this case, + * only the visible lines are affected. + */ +static void +adjustHiliteOnBakScroll(XtermWidget xw, int amount) +{ + TScreen *screen = TScreenOf(xw); + int lo_row = screen->top_marg; + int hi_row = screen->bot_marg; + + TRACE2(("adjustSelection BAK %s by %d (%s)\n", + screen->whichBuf ? "alternate" : "normal", + amount, + "visible")); + TRACE2((" before highlite %d.%d .. %d.%d\n", + screen->startH.row, + screen->startH.col, + screen->endH.row, + screen->endH.col)); + TRACE2((" margins %d..%d\n", screen->top_marg, screen->bot_marg)); + + if (screen->endH.row >= hi_row + && screen->endH.row + amount > hi_row) { + /* truncate the selection because its start would move out of region */ + if (hi_row - amount >= screen->startH.row) { + TRACE2(("truncate selection by changing start %d.%d to %d.%d\n", + screen->startH.row, + screen->startH.col, + hi_row - amount, + 0)); + screen->endH.row = hi_row - amount; + screen->endH.col = 0; + } else { + TRACE2(("deselect because %d.%d .. %d.%d shifted %d is outside margins %d..%d\n", + screen->startH.row, + screen->startH.col, + screen->endH.row, + screen->endH.col, + amount, + lo_row, + hi_row)); + ScrnDisownSelection(xw); + } + } else if (screen->endH.row >= lo_row && screen->startH.row < lo_row) { + ScrnDisownSelection(xw); + } else if (screen->endH.row > hi_row && screen->startH.row > hi_row) { + ScrnDisownSelection(xw); + } + + TRACE2((" after highlite %d.%d .. %d.%d\n", + screen->startH.row, + screen->startH.col, + screen->endH.row, + screen->endH.col)); +} + +/* + * Move cells in LineData's on the current screen to simulate scrolling by the + * given amount of lines. + */ +static void +scrollInMargins(XtermWidget xw, int amount, int top) +{ + TScreen *screen = TScreenOf(xw); + LineData *src; + LineData *dst; + int row; + int left = ScrnLeftMargin(xw); + int right = ScrnRightMargin(xw); + int length = right + 1 - left; + + if_OPT_WIDE_CHARS(screen, { + if (amount != 0) { + for (row = top; row <= screen->bot_marg; ++row) { + LineData *ld; + if ((ld = getLineData(screen, row + amount)) != 0) { + if (left > 0) { + if (ld->charData[left] == HIDDEN_CHAR) { + Clear1Cell(ld, left - 1); + Clear1Cell(ld, left); + } + } + if (right + 1 < (int) ld->lineSize) { + if (ld->charData[right + 1] == HIDDEN_CHAR) { + Clear1Cell(ld, right); + Clear1Cell(ld, right + 1); + } + } + } + } + } + }); + + if (amount > 0) { + for (row = top; row <= screen->bot_marg - amount; ++row) { + if ((src = getLineData(screen, row + amount)) != 0 + && (dst = getLineData(screen, row)) != 0) { + CopyCells(screen, src, dst, left, length, False); + } + } + while (row <= screen->bot_marg) { + ClearCells(xw, 0, (unsigned) length, row, left); + ++row; + } + } else if (amount < 0) { + for (row = screen->bot_marg; row >= top - amount; --row) { + if ((src = getLineData(screen, row + amount)) != 0 + && (dst = getLineData(screen, row)) != 0) { + CopyCells(screen, src, dst, left, length, True); + } + } + while (row >= top) { + ClearCells(xw, 0, (unsigned) length, row, left); + --row; + } + } +} + +#if OPT_WIDE_CHARS +/* + * If we're repainting a section of wide-characters that, e.g., ClearCells has + * repaired when finding double-cell characters, then we should account for + * that in the repaint. + */ +static void +ScrnUpdate2(XtermWidget xw, + int toprow, + int leftcol, + int nrows, + int ncols, + Bool force) +{ + if_OPT_WIDE_CHARS(TScreenOf(xw), { + if (leftcol + ncols <= TScreenOf(xw)->max_col) + ncols++; + if (leftcol > 0) { + leftcol--; + ncols++; + } + }); + ScrnUpdate(xw, toprow, leftcol, nrows, ncols, force); +} +#else +#define ScrnUpdate2(xw, toprow, leftcol, nrows, ncols, force) \ + ScrnUpdate(xw, toprow, leftcol, nrows, ncols, force) +#endif + +/* + * scrolls the screen by amount lines, erases bottom, doesn't alter + * cursor position (i.e. cursor moves down amount relative to text). + * All done within the scrolling region, of course. + * requires: amount > 0 + */ +void +xtermScroll(XtermWidget xw, int amount) +{ + TScreen *screen = TScreenOf(xw); + int i; + int refreshtop = 0; + int refreshheight; + Boolean save_wrap = screen->do_wrap; + int left = ScrnLeftMargin(xw); + int right = ScrnRightMargin(xw); + Boolean scroll_all_lines = (Boolean) (screen->scrollWidget + && !screen->whichBuf + && screen->top_marg == 0); + Boolean scroll_full_line = ((left == 0) && (right == screen->max_col)); + + TRACE(("xtermScroll count=%d\n", amount)); + + screen->cursor_busy += 1; + screen->cursor_moved = True; + + if (screen->cursor_state) + HideCursor(); + + i = screen->bot_marg - screen->top_marg + 1; + if (amount > i) + amount = i; + + if (!scroll_full_line) { + refreshheight = 0; + } else +#if OPT_SCROLL_LOCK + if (screen->allowScrollLock && screen->scroll_lock) { + refreshheight = 0; + screen->scroll_amt = 0; + screen->refresh_amt = 0; + if (--(screen->topline) < -screen->savelines) { + screen->topline = -screen->savelines; + screen->scroll_dirty = True; + } + if (++(screen->savedlines) > screen->savelines) { + screen->savedlines = screen->savelines; + } + } else +#endif + { + if (ScrnHaveSelection(screen)) + adjustHiliteOnFwdScroll(xw, amount, scroll_all_lines); + + if (screen->jumpscroll) { + if (screen->scroll_amt > 0) { + if (!screen->fastscroll) { + if (screen->refresh_amt + amount > i) + FlushScroll(xw); + } + screen->scroll_amt += amount; + screen->refresh_amt += amount; + } else { + if (!screen->fastscroll) { + if (screen->scroll_amt < 0) + FlushScroll(xw); + } + screen->scroll_amt = amount; + screen->refresh_amt = amount; + } + refreshheight = 0; + } else { + int scrolltop; + int scrollheight; + int shift; + int bot; + + ScrollSelection(screen, -(amount), False); + if (amount == i) { + ClearScreen(xw); + goto done; + } + + shift = INX2ROW(screen, 0); + bot = screen->max_row - shift; + scrollheight = i - amount; + refreshheight = amount; + + if ((refreshtop = screen->bot_marg - refreshheight + 1 + shift) > + (i = screen->max_row - refreshheight + 1)) + refreshtop = i; + + if (scroll_all_lines) { + scrolltop = 0; + if ((scrollheight += shift) > i) + scrollheight = i; + if ((i = screen->savedlines) < screen->savelines) { + if ((i += amount) > screen->savelines) + i = screen->savelines; + screen->savedlines = i; + ScrollBarDrawThumb(xw, 1); + } + } else { + scrolltop = screen->top_marg + shift; + if ((i = screen->bot_marg - bot) > 0) { + scrollheight -= i; + if ((i = screen->top_marg + amount - 1 - bot) >= 0) { + refreshtop += i; + refreshheight -= i; + } + } + } + + if (screen->multiscroll && amount == 1 && + screen->topline == 0 && screen->top_marg == 0 && + screen->bot_marg == screen->max_row) { + if (screen->incopy < 0 && screen->scrolls == 0) + CopyWait(xw); + screen->scrolls++; + } + + vertical_copy_area(xw, + scrolltop + amount, + scrollheight, + amount, + left, + right); + + if (refreshheight > 0) { + ClearCurBackground(xw, + refreshtop, + left, + (unsigned) refreshheight, + (unsigned) (right + 1 - left), + (unsigned) FontWidth(screen)); + if (refreshheight > shift) + refreshheight = shift; + } + } + } + + if (amount > 0) { + if (left > 0 || right < screen->max_col) { + scrollInMargins(xw, amount, screen->top_marg); + ScrnUpdate2(xw, + screen->top_marg, + left, + screen->bot_marg + 1 - screen->top_marg, + right + 1 - left, + True); + } else if (scroll_all_lines) { + ScrnDeleteLine(xw, + screen->saveBuf_index, + screen->bot_marg + screen->savelines, + 0, + (unsigned) amount); + } else { + ScrnDeleteLine(xw, + screen->visbuf, + screen->bot_marg, + screen->top_marg, + (unsigned) amount); + } + } + + scroll_displayed_graphics(xw, amount); + + if (refreshheight > 0) { + ScrnRefresh(xw, + refreshtop, + left, + refreshheight, + right + 1 - left, + False); + } + + done: + screen->do_wrap = save_wrap; + screen->cursor_busy -= 1; + return; +} + +/* + * This is from ISO 6429, not found in any of DEC's terminals. + */ +void +xtermScrollLR(XtermWidget xw, int amount, Bool toLeft) +{ + if (amount > 0) { + xtermColScroll(xw, amount, toLeft, ScrnLeftMargin(xw)); + } +} + +/* + * Implement DECBI/DECFI (back/forward column index) + */ +void +xtermColIndex(XtermWidget xw, Bool toLeft) +{ + TScreen *screen = TScreenOf(xw); + + if (toLeft) { + if (ScrnIsColInMargins(screen, screen->cur_col)) { + if (screen->cur_col == ScrnLeftMargin(xw)) { + xtermColScroll(xw, 1, False, screen->cur_col); + } else { + CursorBack(xw, 1); + } + } else { + CursorBack(xw, 1); + } + } else { + if (ScrnIsColInMargins(screen, screen->cur_col)) { + if (screen->cur_col == ScrnRightMargin(xw)) { + xtermColScroll(xw, 1, True, ScrnLeftMargin(xw)); + } else { + CursorForward(xw, 1); + } + } else { + CursorForward(xw, 1); + } + } +} + +/* + * Implement DECDC/DECIC (delete/insert column) + */ +void +xtermColScroll(XtermWidget xw, int amount, Bool toLeft, int at_col) +{ + TScreen *screen = TScreenOf(xw); + + if (amount > 0) { + int min_row; + int max_row; + + if (ScrnHaveRowMargins(screen)) { + min_row = screen->top_marg; + max_row = screen->bot_marg; + } else { + min_row = 0; + max_row = screen->max_row; + } + + if (screen->cur_row >= min_row + && screen->cur_row <= max_row + && screen->cur_col >= screen->lft_marg + && screen->cur_col <= screen->rgt_marg) { + int save_row = screen->cur_row; + int save_col = screen->cur_col; + int row; + + screen->cur_col = at_col; + if (toLeft) { + for (row = min_row; row <= max_row; row++) { + screen->cur_row = row; + ScrnDeleteChar(xw, (unsigned) amount); + } + } else { + for (row = min_row; row <= max_row; row++) { + screen->cur_row = row; + ScrnInsertChar(xw, (unsigned) amount); + } + } + screen->cur_row = save_row; + screen->cur_col = save_col; + xtermRepaint(xw); + } + } +} + +/* + * Reverse scrolls the screen by amount lines, erases top, doesn't alter + * cursor position (i.e. cursor moves up amount relative to text). + * All done within the scrolling region, of course. + * Requires: amount > 0 + */ +void +RevScroll(XtermWidget xw, int amount) +{ + TScreen *screen = TScreenOf(xw); + int i = screen->bot_marg - screen->top_marg + 1; + int left = ScrnLeftMargin(xw); + int right = ScrnRightMargin(xw); + Boolean scroll_full_line = ((left == 0) && (right == screen->max_col)); + + TRACE(("RevScroll count=%d\n", amount)); + + screen->cursor_busy += 1; + screen->cursor_moved = True; + + if (screen->cursor_state) + HideCursor(); + + if (amount > i) + amount = i; + + if (ScrnHaveSelection(screen)) + adjustHiliteOnBakScroll(xw, amount); + + if (!scroll_full_line) { + ; + } else if (screen->jumpscroll) { + if (screen->scroll_amt < 0) { + if (-screen->refresh_amt + amount > i) + FlushScroll(xw); + screen->scroll_amt -= amount; + screen->refresh_amt -= amount; + } else { + if (screen->scroll_amt > 0) + FlushScroll(xw); + screen->scroll_amt = -amount; + screen->refresh_amt = -amount; + } + } else { + int shift = INX2ROW(screen, 0); + int bot = screen->max_row - shift; + int refreshheight = amount; + int refreshtop = screen->top_marg + shift; + int scrollheight = (screen->bot_marg + - screen->top_marg - refreshheight + 1); + int scrolltop = refreshtop + refreshheight; + + if ((i = screen->bot_marg - bot) > 0) + scrollheight -= i; + if ((i = screen->top_marg + refreshheight - 1 - bot) > 0) + refreshheight -= i; + + if (screen->multiscroll && amount == 1 && + screen->topline == 0 && screen->top_marg == 0 && + screen->bot_marg == screen->max_row) { + if (screen->incopy < 0 && screen->scrolls == 0) + CopyWait(xw); + screen->scrolls++; + } + + vertical_copy_area(xw, + scrolltop - amount, + scrollheight, + -amount, + left, + right); + + if (refreshheight > 0) { + ClearCurBackground(xw, + refreshtop, + left, + (unsigned) refreshheight, + (unsigned) (right + 1 - left), + (unsigned) FontWidth(screen)); + } + } + if (amount > 0) { + if (left > 0 || right < screen->max_col) { + scrollInMargins(xw, -amount, screen->top_marg); + ScrnUpdate2(xw, + screen->top_marg, + left, + screen->bot_marg + 1 - screen->top_marg, + right + 1 - left, + True); + } else { + ScrnInsertLine(xw, + screen->visbuf, + screen->bot_marg, + screen->top_marg, + (unsigned) amount); + } + } + screen->cursor_busy -= 1; + return; +} + +#if OPT_ZICONBEEP +void +initZIconBeep(void) +{ + if (resource.zIconBeep > 100 || resource.zIconBeep < -100) { + resource.zIconBeep = 0; /* was 100, but I prefer to defaulting off. */ + xtermWarning("a number between -100 and 100 is required for zIconBeep. 0 used by default\n"); + } +} + +static char * +getIconName(void) +{ + static char *icon_name; + static Arg args[] = + { + {XtNiconName, (XtArgVal) & icon_name} + }; + + icon_name = NULL; + XtGetValues(toplevel, args, XtNumber(args)); + return icon_name; +} + +static void +setZIconBeep(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + /* Flag icon name with "***" on window output when iconified. + */ + if (resource.zIconBeep && mapstate == IsUnmapped && !screen->zIconBeep_flagged) { + char *icon_name = getIconName(); + if (icon_name != NULL) { + screen->zIconBeep_flagged = True; + ChangeIconName(xw, icon_name); + } + xtermBell(xw, XkbBI_Info, 0); + } + mapstate = -1; +} + +/* + * If warning should be given then give it + */ +Boolean +showZIconBeep(XtermWidget xw, char *name) +{ + Boolean code = False; + + if (resource.zIconBeep && TScreenOf(xw)->zIconBeep_flagged) { + char *format = resource.zIconFormat; + char *newname = malloc(strlen(name) + strlen(format) + 2); + if (!newname) { + xtermWarning("malloc failed in showZIconBeep\n"); + } else { + char *marker = strstr(format, "%s"); + char *result = newname; + if (marker != 0) { + size_t skip = (size_t) (marker - format); + if (skip) { + strncpy(result, format, skip); + result += skip; + } + strcpy(result, name); + strcat(result, marker + 2); + } else { + strcpy(result, format); + strcat(result, name); + } + ChangeGroup(xw, XtNiconName, newname); + free(newname); + } + code = True; + } + return code; +} + +/* + * Restore the icon name, resetting the state for zIconBeep. + */ +void +resetZIconBeep(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->zIconBeep_flagged) { + char *icon_name = getIconName(); + screen->zIconBeep_flagged = False; + if (icon_name != NULL) { + char *buf = malloc(strlen(icon_name) + 1); + if (buf == NULL) { + screen->zIconBeep_flagged = True; + } else { + char *format = resource.zIconFormat; + char *marker = strstr(format, "%s"); + Boolean found = False; + + if (marker != 0) { + if (marker == format + || !strncmp(icon_name, format, (size_t) (marker - format))) { + found = True; + strcpy(buf, icon_name + (marker - format)); + marker += 2; + if (*marker != '\0') { + size_t len_m = strlen(marker); + size_t len_b = strlen(buf); + if (len_m < len_b + && !strcmp(buf + len_b - len_m, marker)) { + buf[len_b - len_m] = '\0'; + } + } + } + } else if (!strncmp(icon_name, format, strlen(format))) { + strcpy(buf, icon_name + strlen(format)); + found = True; + } + if (found) + ChangeIconName(xw, buf); + free(buf); + } + } + } +} +#else +#define setZIconBeep(xw) /* nothing */ +#endif /* OPT_ZICONBEEP */ + +/* + * write a string str of length len onto the screen at + * the current cursor position. update cursor position. + */ +void +WriteText(XtermWidget xw, IChar *str, Cardinal len) +{ + TScreen *screen = TScreenOf(xw); + XTermDraw params; + CLineData *ld = 0; + unsigned attr_flags = xw->flags; + CellColor fg_bg = xtermColorPair(xw); + unsigned cells = visual_width(str, len); + GC currentGC; + + TRACE(("WriteText %d (%2d,%2d) %3d:%s\n", + screen->topline, + screen->cur_row, + screen->cur_col, + len, visibleIChars(str, len))); + + if (cells + (unsigned) screen->cur_col > (unsigned) MaxCols(screen)) { + cells = (unsigned) (MaxCols(screen) - screen->cur_col); + } + + if (ScrnHaveSelection(screen) + && ScrnIsRowInSelection(screen, INX2ROW(screen, screen->cur_row))) { + ScrnDisownSelection(xw); + } +#if OPT_ISO_COLORS + /* if colorBDMode is set, and enabled */ + if (screen->colorBDMode && + screen->boldColors && + !hasDirectFG(attr_flags) && + /* and bold foreground color on bold background color */ + GetCellColorFG(fg_bg) > COLOR_7 && + GetCellColorFG(fg_bg) < MIN_ANSI_COLORS && + /* and both colors are the same */ + GetCellColorFG(fg_bg) == GetCellColorBG(fg_bg)) + /* clear BOLD flag, else it will be colorBD on bold background color */ + UIntClr(attr_flags, BOLD); +#endif + + /* if we are in insert-mode, reserve space for the new cells */ + if (attr_flags & INSERT) { + InsertChar(xw, cells); + } + + if (AddToVisible(xw) + && ((ld = getLineData(screen, screen->cur_row))) != 0) { + unsigned test; + + if (screen->cursor_state) + HideCursor(); + + /* + * If we overwrite part of a multi-column character, fill the rest + * of it with blanks. + */ + if_OPT_WIDE_CHARS(screen, { + int kl; + int kr; + if (DamagedCurCells(screen, cells, &kl, &kr)) + ClearInLine(xw, screen->cur_row, kl, (unsigned) (kr - kl + 1)); + }); + + if (attr_flags & INVISIBLE) { + Cardinal n; + for (n = 0; n < cells; ++n) + str[n] = ' '; + } + + TRACE(("WriteText calling drawXtermText (%d) (%d,%d)\n", + LineCharSet(screen, ld), + screen->cur_row, + screen->cur_col)); + + test = attr_flags; +#if OPT_ISO_COLORS + { + int fg; + if (screen->colorAttrMode) { + fg = MapToColorMode(xw->cur_foreground, screen, attr_flags); + } else { + fg = xw->cur_foreground; + } + checkVeryBoldColors(test, fg); + } +#endif + + /* make sure that the correct GC is current */ + currentGC = updatedXtermGC(xw, attr_flags, fg_bg, False); + + /* *INDENT-EQLS* */ + params.xw = xw; + params.attr_flags = (test & DRAWX_MASK); + params.draw_flags = 0; + params.this_chrset = LineCharSet(screen, ld); + params.real_chrset = CSET_SWL; + params.on_wide = 0; + + drawXtermText(¶ms, + currentGC, + LineCursorX(screen, ld, screen->cur_col), + CursorY(screen, screen->cur_row), + str, len); + + resetXtermGC(xw, attr_flags, False); + } + + ScrnWriteText(xw, str, attr_flags, fg_bg, len); + CursorForward(xw, (int) cells); + setZIconBeep(xw); + return; +} + +/* + * If cursor not in scrolling region, returns. Else, + * inserts n blank lines at the cursor's position. Lines above the + * bottom margin are lost. + */ +void +InsertLine(XtermWidget xw, int n) +{ + TScreen *screen = TScreenOf(xw); + int i; + int left = ScrnLeftMargin(xw); + int right = ScrnRightMargin(xw); + Boolean scroll_full_line = ((left == 0) && (right == screen->max_col)); + + if (!ScrnIsRowInMargins(screen, screen->cur_row) + || screen->cur_col < left + || screen->cur_col > right) + return; + + TRACE(("InsertLine count=%d\n", n)); + + set_cur_col(screen, ScrnLeftMargin(xw)); + if (screen->cursor_state) + HideCursor(); + + if (ScrnHaveSelection(screen) + && ScrnAreRowsInSelection(screen, + INX2ROW(screen, screen->top_marg), + INX2ROW(screen, screen->cur_row - 1)) + && ScrnAreRowsInSelection(screen, + INX2ROW(screen, screen->cur_row), + INX2ROW(screen, screen->bot_marg))) { + ScrnDisownSelection(xw); + } + + ResetWrap(screen); + if (n > (i = screen->bot_marg - screen->cur_row + 1)) + n = i; + if (screen->jumpscroll && scroll_full_line) { + if (screen->scroll_amt <= 0 && + screen->cur_row <= -screen->refresh_amt) { + if (-screen->refresh_amt + n > MaxRows(screen)) + FlushScroll(xw); + screen->scroll_amt -= n; + screen->refresh_amt -= n; + } else { + if (screen->scroll_amt) + FlushScroll(xw); + } + } + if (!screen->scroll_amt && scroll_full_line) { + int shift = INX2ROW(screen, 0); + int bot = screen->max_row - shift; + int refreshheight = n; + int refreshtop = screen->cur_row + shift; + int scrolltop = refreshtop + refreshheight; + int scrollheight = (screen->bot_marg + - screen->cur_row - refreshheight + 1); + + if ((i = screen->bot_marg - bot) > 0) + scrollheight -= i; + if ((i = screen->cur_row + refreshheight - 1 - bot) > 0) + refreshheight -= i; + vertical_copy_area(xw, scrolltop - n, scrollheight, -n, left, right); + if (refreshheight > 0) { + ClearCurBackground(xw, + refreshtop, + left, + (unsigned) refreshheight, + (unsigned) (right + 1 - left), + (unsigned) FontWidth(screen)); + } + } + if (n > 0) { + if (scroll_full_line) { + ScrnInsertLine(xw, + screen->visbuf, + screen->bot_marg, + screen->cur_row, + (unsigned) n); + } else { + scrollInMargins(xw, -n, screen->cur_row); + ScrnUpdate2(xw, + screen->cur_row, + left, + screen->bot_marg + 1 - screen->cur_row, + right + 1 - left, + True); + } + } +} + +/* + * If cursor not in scrolling region, returns. Else, deletes n lines + * at the cursor's position, lines added at bottom margin are blank. + */ +void +DeleteLine(XtermWidget xw, int n) +{ + TScreen *screen = TScreenOf(xw); + int i; + int left = ScrnLeftMargin(xw); + int right = ScrnRightMargin(xw); + Boolean scroll_all_lines = (Boolean) (screen->scrollWidget + && !screen->whichBuf + && screen->cur_row == 0); + Boolean scroll_full_line = ((left == 0) && (right == screen->max_col)); + + if (!ScrnIsRowInMargins(screen, screen->cur_row) || + !ScrnIsColInMargins(screen, screen->cur_col)) + return; + + TRACE(("DeleteLine count=%d\n", n)); + + set_cur_col(screen, ScrnLeftMargin(xw)); + if (screen->cursor_state) + HideCursor(); + + if (n > (i = screen->bot_marg - screen->cur_row + 1)) { + n = i; + } + if (ScrnHaveSelection(screen) + && ScrnAreRowsInSelection(screen, + INX2ROW(screen, screen->cur_row), + INX2ROW(screen, screen->cur_row + n - 1))) { + ScrnDisownSelection(xw); + } + + ResetWrap(screen); + if (screen->jumpscroll && scroll_full_line) { + if (screen->scroll_amt >= 0 && screen->cur_row == screen->top_marg) { + if (screen->refresh_amt + n > MaxRows(screen)) + FlushScroll(xw); + screen->scroll_amt += n; + screen->refresh_amt += n; + } else { + if (screen->scroll_amt) + FlushScroll(xw); + } + } + + /* adjust screen->buf */ + if (n > 0) { + if (left > 0 || right < screen->max_col) { + scrollInMargins(xw, n, screen->cur_row); + } else if (scroll_all_lines) { + ScrnDeleteLine(xw, + screen->saveBuf_index, + screen->bot_marg + screen->savelines, + 0, + (unsigned) n); + } else { + ScrnDeleteLine(xw, + screen->visbuf, + screen->bot_marg, + screen->cur_row, + (unsigned) n); + } + } + + /* repaint the screen, as needed */ + if (!scroll_full_line) { + ScrnUpdate2(xw, + screen->cur_row, + left, + screen->bot_marg + 1 - screen->cur_row, + right + 1 - left, + True); + } else if (!screen->scroll_amt) { + int shift = INX2ROW(screen, 0); + int bot = screen->max_row - shift; + int refreshtop; + int refreshheight = n; + int scrolltop; + int scrollheight = i - n; + + if ((refreshtop = screen->bot_marg - refreshheight + 1 + shift) > + (i = screen->max_row - refreshheight + 1)) + refreshtop = i; + if (scroll_all_lines) { + scrolltop = 0; + if ((scrollheight += shift) > i) + scrollheight = i; + if ((i = screen->savedlines) < screen->savelines) { + if ((i += n) > screen->savelines) + i = screen->savelines; + screen->savedlines = i; + ScrollBarDrawThumb(xw, 1); + } + } else { + scrolltop = screen->cur_row + shift; + if ((i = screen->bot_marg - bot) > 0) { + scrollheight -= i; + if ((i = screen->cur_row + n - 1 - bot) >= 0) { + refreshheight -= i; + } + } + } + vertical_copy_area(xw, scrolltop + n, scrollheight, n, left, right); + if (shift > 0 && refreshheight > 0) { + int rows = refreshheight; + if (rows > shift) + rows = shift; + ScrnUpdate(xw, refreshtop, 0, rows, MaxCols(screen), True); + refreshtop += shift; + refreshheight -= shift; + } + if (refreshheight > 0) { + ClearCurBackground(xw, + refreshtop, + left, + (unsigned) refreshheight, + (unsigned) (right + 1 - left), + (unsigned) FontWidth(screen)); + } + } +} + +/* + * Insert n blanks at the cursor's position, no wraparound + */ +void +InsertChar(XtermWidget xw, unsigned n) +{ + TScreen *screen = TScreenOf(xw); + CLineData *ld; + unsigned limit; + int row = INX2ROW(screen, screen->cur_row); + int left = ScrnLeftMargin(xw); + int right = ScrnRightMargin(xw); + + if (screen->cursor_state) + HideCursor(); + + TRACE(("InsertChar count=%d\n", n)); + + if (ScrnHaveSelection(screen) + && ScrnIsRowInSelection(screen, row)) { + ScrnDisownSelection(xw); + } + ResetWrap(screen); + + limit = (unsigned) (right + 1 - screen->cur_col); + + if (n > limit) + n = limit; + + if (screen->cur_col < left || screen->cur_col > right) { + n = 0; + } else if (AddToVisible(xw) + && (ld = getLineData(screen, screen->cur_row)) != 0) { + int col = right + 1 - (int) n; + + /* + * If we shift part of a multi-column character, fill the rest + * of it with blanks. Do similar repair for the text which will + * be shifted into the right-margin. + */ + if_OPT_WIDE_CHARS(screen, { + int kl; + int kr = screen->cur_col; + if (DamagedCurCells(screen, n, &kl, (int *) 0) && kr > kl) { + ClearInLine(xw, screen->cur_row, kl, (unsigned) (kr - kl + 1)); + } + kr = screen->max_col - (int) n + 1; + if (DamagedCells(screen, n, &kl, (int *) 0, + screen->cur_row, + kr) && kr > kl) { + ClearInLine(xw, screen->cur_row, kl, (unsigned) (kr - kl + 1)); + } + }); + +#if OPT_DEC_CHRSET + if (CSET_DOUBLE(GetLineDblCS(ld))) { + col = MaxCols(screen) / 2 - (int) n; + } +#endif + /* + * prevent InsertChar from shifting the end of a line over + * if it is being appended to + */ + if (non_blank_line(screen, screen->cur_row, + screen->cur_col, MaxCols(screen))) { + horizontal_copy_area(xw, screen->cur_col, + col - screen->cur_col, + (int) n); + } + + ClearCurBackground(xw, + INX2ROW(screen, screen->cur_row), + screen->cur_col, + 1U, + n, + (unsigned) LineFontWidth(screen, ld)); + } + if (n != 0) { + /* adjust screen->buf */ + ScrnInsertChar(xw, n); + } +} + +/* + * Deletes n chars at the cursor's position, no wraparound. + */ +void +DeleteChar(XtermWidget xw, unsigned n) +{ + TScreen *screen = TScreenOf(xw); + CLineData *ld; + unsigned limit; + int row = INX2ROW(screen, screen->cur_row); + int right = ScrnRightMargin(xw); + + if (screen->cursor_state) + HideCursor(); + + if (!ScrnIsColInMargins(screen, screen->cur_col)) + return; + + TRACE(("DeleteChar count=%d\n", n)); + + if (ScrnHaveSelection(screen) + && ScrnIsRowInSelection(screen, row)) { + ScrnDisownSelection(xw); + } + ResetWrap(screen); + + limit = (unsigned) (right + 1 - screen->cur_col); + + if (n > limit) + n = limit; + + if (AddToVisible(xw) + && (ld = getLineData(screen, screen->cur_row)) != 0) { + int col = right + 1 - (int) n; + + /* + * If we delete part of a multi-column character, fill the rest + * of it with blanks. + */ + if_OPT_WIDE_CHARS(screen, { + int kl; + int kr; + if (DamagedCurCells(screen, n, &kl, &kr)) + ClearInLine(xw, screen->cur_row, kl, (unsigned) (kr - kl + 1)); + }); + +#if OPT_DEC_CHRSET + if (CSET_DOUBLE(GetLineDblCS(ld))) { + col = MaxCols(screen) / 2 - (int) n; + } +#endif + horizontal_copy_area(xw, + (screen->cur_col + (int) n), + col - screen->cur_col, + -((int) n)); + + ClearCurBackground(xw, + INX2ROW(screen, screen->cur_row), + col, + 1U, + n, + (unsigned) LineFontWidth(screen, ld)); + } + if (n != 0) { + /* adjust screen->buf */ + ScrnDeleteChar(xw, n); + } +} + +/* + * Clear from cursor position to beginning of display, inclusive. + */ +static void +ClearAbove(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->protected_mode != OFF_PROTECT) { + int row; + unsigned len = (unsigned) MaxCols(screen); + + assert(screen->max_col >= 0); + for (row = 0; row < screen->cur_row; row++) + ClearInLine(xw, row, 0, len); + ClearInLine(xw, screen->cur_row, 0, (unsigned) screen->cur_col); + } else { + int top; + + if (screen->cursor_state) + HideCursor(); + if ((top = INX2ROW(screen, 0)) <= screen->max_row) { + int height; + + if (screen->scroll_amt) + FlushScroll(xw); + if ((height = screen->cur_row + top) > screen->max_row) + height = screen->max_row + 1; + if ((height -= top) > 0) { + chararea_clear_displayed_graphics(screen, + 0, + top, + MaxCols(screen), + height); + + ClearCurBackground(xw, + top, + 0, + (unsigned) height, + (unsigned) MaxCols(screen), + (unsigned) FontWidth(screen)); + } + } + ClearBufRows(xw, 0, screen->cur_row - 1); + } + + ClearLeft(xw); +} + +/* + * Clear from cursor position to end of display, inclusive. + */ +static void +ClearBelow(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + ClearRight(xw, -1); + + if (screen->protected_mode != OFF_PROTECT) { + int row; + unsigned len = (unsigned) MaxCols(screen); + + assert(screen->max_col >= 0); + for (row = screen->cur_row + 1; row <= screen->max_row; row++) + ClearInLine(xw, row, 0, len); + } else { + int top; + + if ((top = INX2ROW(screen, screen->cur_row)) <= screen->max_row) { + if (screen->scroll_amt) + FlushScroll(xw); + if (++top <= screen->max_row) { + chararea_clear_displayed_graphics(screen, + 0, + top, + MaxCols(screen), + (screen->max_row - top + 1)); + ClearCurBackground(xw, + top, + 0, + (unsigned) (screen->max_row - top + 1), + (unsigned) MaxCols(screen), + (unsigned) FontWidth(screen)); + } + } + ClearBufRows(xw, screen->cur_row + 1, screen->max_row); + } +} + +/* + * Clear the given row, for the given range of columns, returning 1 if no + * protected characters were found, 0 otherwise. + */ +static int +ClearInLine2(XtermWidget xw, int flags, int row, int col, unsigned len) +{ + TScreen *screen = TScreenOf(xw); + CLineData *ld; + int rc = 1; + + TRACE(("ClearInLine(row=%d, col=%d, len=%d) vs %d..%d\n", + row, col, len, + screen->startH.row, + screen->startH.col)); + + if (ScrnHaveSelection(screen) + && ScrnIsRowInSelection(screen, row)) { + ScrnDisownSelection(xw); + } + + if (col + (int) len >= MaxCols(screen)) { + len = (unsigned) (MaxCols(screen) - col); + } + + /* If we've marked protected text on the screen, we'll have to + * check each time we do an erase. + */ + if (screen->protected_mode != OFF_PROTECT) { + unsigned n; + IAttr *attrs = getLineData(screen, row)->attribs + col; + int saved_mode = screen->protected_mode; + Bool done; + + /* disable this branch during recursion */ + screen->protected_mode = OFF_PROTECT; + + do { + done = True; + for (n = 0; n < len; n++) { + if (attrs[n] & PROTECTED) { + rc = 0; /* found a protected segment */ + if (n != 0) { + ClearInLine(xw, row, col, n); + } + while ((n < len) + && (attrs[n] & PROTECTED)) { + n++; + } + done = False; + break; + } + } + /* setup for another segment, past the protected text */ + if (!done) { + attrs += n; + col += (int) n; + len -= n; + } + } while (!done); + + screen->protected_mode = saved_mode; + if ((int) len <= 0) { + return 0; + } + } + /* fall through to the final non-protected segment */ + + if (screen->cursor_state) + HideCursor(); + ResetWrap(screen); + + if (AddToVisible(xw) + && (ld = getLineData(screen, row)) != 0) { + + ClearCurBackground(xw, + INX2ROW(screen, row), + col, + 1U, + len, + (unsigned) LineFontWidth(screen, ld)); + } + + if (len != 0) { + ClearCells(xw, flags, len, row, col); + } + + return rc; +} + +int +ClearInLine(XtermWidget xw, int row, int col, unsigned len) +{ + TScreen *screen = TScreenOf(xw); + int flags = 0; + + /* + * If we're clearing to the end of the line, we won't count this as + * "drawn" characters. We'll only do cut/paste on "drawn" characters, + * so this has the effect of suppressing trailing blanks from a + * selection. + */ + if (col + (int) len < MaxCols(screen)) { + flags |= CHARDRAWN; + } + return ClearInLine2(xw, flags, row, col, len); +} + +/* + * Clear the next n characters on the cursor's line, including the cursor's + * position. + */ +void +ClearRight(XtermWidget xw, int n) +{ + TScreen *screen = TScreenOf(xw); + LineData *ld; + unsigned len = (unsigned) (MaxCols(screen) - screen->cur_col); + + assert(screen->max_col >= 0); + assert(screen->max_col >= screen->cur_col); + + if (n < 0) /* the remainder of the line */ + n = MaxCols(screen); + if (n == 0) /* default for 'ECH' */ + n = 1; + + if (len > (unsigned) n) + len = (unsigned) n; + + ld = getLineData(screen, screen->cur_row); + if (AddToVisible(xw)) { + if_OPT_WIDE_CHARS(screen, { + int col = screen->cur_col; + int row = screen->cur_row; + int kl; + int kr; + if (DamagedCurCells(screen, len, &kl, &kr) && kr >= kl) { + int xx = col; + if (kl < xx) { + ClearInLine2(xw, 0, row, kl, (unsigned) (xx - kl)); + } + xx = col + (int) len - 1; + if (kr > xx) { + ClearInLine2(xw, 0, row, xx + 1, (unsigned) (kr - xx)); + } + } + }); + (void) ClearInLine(xw, screen->cur_row, screen->cur_col, len); + } else { + ScrnClearCells(xw, screen->cur_row, screen->cur_col, len); + } + + /* with the right part cleared, we can't be wrapping */ + LineClrWrapped(ld); + if (screen->show_wrap_marks) { + ShowWrapMarks(xw, screen->cur_row, ld); + } + ResetWrap(screen); +} + +/* + * Clear first part of cursor's line, inclusive. + */ +static void +ClearLeft(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + unsigned len = (unsigned) screen->cur_col + 1; + + assert(screen->cur_col >= 0); + if (AddToVisible(xw)) { + if_OPT_WIDE_CHARS(screen, { + int row = screen->cur_row; + int kl; + int kr; + if (DamagedCurCells(screen, 1, &kl, &kr) && kr >= kl) { + ClearInLine2(xw, 0, row, kl, (unsigned) (kr - kl + 1)); + } + }); + (void) ClearInLine(xw, screen->cur_row, 0, len); + } else { + ScrnClearCells(xw, screen->cur_row, 0, len); + } +} + +/* + * Erase the cursor's line. + */ +static void +ClearLine(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + unsigned len = (unsigned) MaxCols(screen); + + assert(screen->max_col >= 0); + (void) ClearInLine(xw, screen->cur_row, 0, len); +} + +void +ClearScreen(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + int top; + + TRACE(("ClearScreen\n")); + + if (screen->cursor_state) + HideCursor(); + + ScrnDisownSelection(xw); + ResetWrap(screen); + if ((top = INX2ROW(screen, 0)) <= screen->max_row) { + if (screen->scroll_amt) + FlushScroll(xw); + chararea_clear_displayed_graphics(screen, + 0, + top, + MaxCols(screen), + (screen->max_row - top + 1)); + ClearCurBackground(xw, + top, + 0, + (unsigned) (screen->max_row - top + 1), + (unsigned) MaxCols(screen), + (unsigned) FontWidth(screen)); + } + ClearBufRows(xw, 0, screen->max_row); +} + +/* + * If we've written protected text DEC-style, and are issuing a non-DEC + * erase, temporarily reset the protected_mode flag so that the erase will + * ignore the protected flags. + */ +void +do_erase_char(XtermWidget xw, int param, int mode) +{ + TScreen *screen = TScreenOf(xw); + int saved_mode = screen->protected_mode; + + if (saved_mode == DEC_PROTECT + && saved_mode != mode) { + screen->protected_mode = OFF_PROTECT; + } + + ClearRight(xw, param); + screen->protected_mode = saved_mode; +} + +void +do_erase_line(XtermWidget xw, int param, int mode) +{ + TScreen *screen = TScreenOf(xw); + int saved_mode = screen->protected_mode; + + if (saved_mode == DEC_PROTECT + && saved_mode != mode) { + screen->protected_mode = OFF_PROTECT; + } + + switch (param) { + case -1: /* DEFAULT */ + case 0: + ClearRight(xw, -1); + break; + case 1: + ClearLeft(xw); + break; + case 2: + ClearLine(xw); + break; + } + screen->protected_mode = saved_mode; +} + +/* + * Just like 'do_erase_line()', except that this intercepts ED controls. If we + * clear the whole screen, we'll get the return-value from ClearInLine, and + * find if there were any protected characters left. If not, reset the + * protected mode flag in the screen data (it's slower). + */ +void +do_erase_display(XtermWidget xw, int param, int mode) +{ + TScreen *screen = TScreenOf(xw); + int saved_mode = screen->protected_mode; + + if (saved_mode == DEC_PROTECT + && saved_mode != mode) + screen->protected_mode = OFF_PROTECT; + + switch (param) { + case -1: /* DEFAULT */ + case 0: + if (screen->cur_row == 0 + && screen->cur_col == 0) { + screen->protected_mode = saved_mode; + do_erase_display(xw, 2, mode); + saved_mode = screen->protected_mode; + } else + ClearBelow(xw); + break; + + case 1: + if (screen->cur_row == screen->max_row + && screen->cur_col == screen->max_col) { + screen->protected_mode = saved_mode; + do_erase_display(xw, 2, mode); + saved_mode = screen->protected_mode; + } else + ClearAbove(xw); + break; + + case 2: + /* + * We use 'ClearScreen()' throughout the remainder of the + * program for places where we don't care if the characters are + * protected or not. So we modify the logic around this call + * on 'ClearScreen()' to handle protected characters. + */ + if (screen->protected_mode != OFF_PROTECT) { + int row; + int rc = 1; + unsigned len = (unsigned) MaxCols(screen); + + assert(screen->max_col >= 0); + for (row = 0; row <= screen->max_row; row++) + rc &= ClearInLine(xw, row, 0, len); + if (rc != 0) + saved_mode = OFF_PROTECT; + } else { + ClearScreen(xw); + } + break; + + case 3: + /* xterm addition - erase saved lines. */ + if (screen->eraseSavedLines) { + screen->savedlines = 0; + ScrollBarDrawThumb(xw, 1); + } + break; + } + screen->protected_mode = saved_mode; +} + +static Boolean +screen_has_data(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + Boolean result = False; + int row; + + for (row = 0; row < screen->max_row; ++row) { + CLineData *ld; + + if ((ld = getLineData(screen, row)) != 0) { + int col; + + for (col = 0; col < screen->max_col; ++col) { + if (ld->attribs[col] & CHARDRAWN) { + result = True; + break; + } + } + } + if (result) + break; + } + return result; +} + +/* + * Like tiXtraScroll, perform a scroll up of the page contents. In this case, + * it happens for the special case when erasing the whole display starting from + * the upper-left corner of the screen. + */ +void +do_cd_xtra_scroll(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (xw->misc.cdXtraScroll + && screen->cur_col == 0 + && screen->cur_row == 0 + && screen_has_data(xw)) { + xtermScroll(xw, screen->max_row); + } +} + +/* + * Scroll the page up (saving it). This is called when doing terminal + * initialization (ti) or exiting from that (te). + */ +void +do_ti_xtra_scroll(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + if (xw->misc.tiXtraScroll) { + xtermScroll(xw, screen->max_row); + } +} + +static void +CopyWait(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + XEvent reply; + XEvent *rep = &reply; + +#if USE_DOUBLE_BUFFER + if (resource.buffered) + return; +#endif + + for (;;) { + XWindowEvent(screen->display, VWindow(screen), ExposureMask, &reply); + switch (reply.type) { + case Expose: + HandleExposure(xw, &reply); + break; + case NoExpose: + case GraphicsExpose: + if (screen->incopy <= 0) { + screen->incopy = 1; + if (screen->scrolls > 0) + screen->scrolls--; + } + if (reply.type == GraphicsExpose) + HandleExposure(xw, &reply); + + if ((reply.type == NoExpose) || + ((XExposeEvent *) rep)->count == 0) { + if (screen->incopy <= 0 && screen->scrolls > 0) + screen->scrolls--; + if (screen->scrolls == 0) { + screen->incopy = 0; + return; + } + screen->incopy = -1; + } + break; + } + } +} + +/* + * used by vertical_copy_area and and horizontal_copy_area + */ +static void +copy_area(XtermWidget xw, + int src_x, + int src_y, + unsigned width, + unsigned height, + int dest_x, + int dest_y) +{ + TScreen *screen = TScreenOf(xw); + + if (width != 0 && height != 0) { + /* wait for previous CopyArea to complete unless + multiscroll is enabled and active */ + if (screen->incopy && screen->scrolls == 0) + CopyWait(xw); + screen->incopy = -1; + + /* save for translating Expose events */ + screen->copy_src_x = src_x; + screen->copy_src_y = src_y; + screen->copy_width = width; + screen->copy_height = height; + screen->copy_dest_x = dest_x; + screen->copy_dest_y = dest_y; + + XCopyArea(screen->display, + VDrawable(screen), VDrawable(screen), + NormalGC(xw, screen), + src_x, src_y, width, height, dest_x, dest_y); + } +} + +/* + * use when inserting or deleting characters on the current line + */ +static void +horizontal_copy_area(XtermWidget xw, + int firstchar, /* char pos on screen to start copying at */ + int nchars, + int amount) /* number of characters to move right */ +{ + TScreen *screen = TScreenOf(xw); + CLineData *ld; + + if ((ld = getLineData(screen, screen->cur_row)) != 0) { + int src_x = LineCursorX(screen, ld, firstchar); + int src_y = CursorY(screen, screen->cur_row); + + copy_area(xw, src_x, src_y, + (unsigned) (nchars * LineFontWidth(screen, ld)), + (unsigned) FontHeight(screen), + src_x + amount * LineFontWidth(screen, ld), src_y); + } +} + +/* + * use when inserting or deleting lines from the screen + */ +static void +vertical_copy_area(XtermWidget xw, + int firstline, /* line on screen to start copying at */ + int nlines, + int amount, /* number of lines to move up (neg=down) */ + int left, + int right) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("vertical_copy_area - firstline=%d nlines=%d left=%d right=%d amount=%d\n", + firstline, nlines, left, right, amount)); + + if (nlines > 0) { + int src_x = CursorX(screen, left); + int src_y = firstline * FontHeight(screen) + screen->border; + unsigned int w = (unsigned) ((right + 1 - left) * FontWidth(screen)); + unsigned int h = (unsigned) (nlines * FontHeight(screen)); + int dst_x = src_x; + int dst_y = src_y - amount * FontHeight(screen); + + copy_area(xw, src_x, src_y, w, h, dst_x, dst_y); + + if (screen->show_wrap_marks) { + int row; + + for (row = firstline; row < firstline + nlines; ++row) { + CLineData *ld; + + if ((ld = getLineData(screen, row)) != 0) { + ShowWrapMarks(xw, row, ld); + } + } + } + } +} + +/* + * use when scrolling the entire screen + */ +void +scrolling_copy_area(XtermWidget xw, + int firstline, /* line on screen to start copying at */ + int nlines, + int amount) /* number of lines to move up (neg=down) */ +{ + + if (nlines > 0) { + vertical_copy_area(xw, firstline, nlines, amount, 0, TScreenOf(xw)->max_col); + } +} + +/* + * Handler for Expose events on the VT widget. + * Returns 1 iff the area where the cursor was got refreshed. + */ +int +HandleExposure(XtermWidget xw, XEvent *event) +{ + TScreen *screen = TScreenOf(xw); + XExposeEvent *reply = (XExposeEvent *) event; + +#ifndef NO_ACTIVE_ICON + if (reply->window == screen->iconVwin.window) { + WhichVWin(screen) = &screen->iconVwin; + TRACE(("HandleExposure - icon\n")); + } else { + WhichVWin(screen) = &screen->fullVwin; + TRACE(("HandleExposure - normal\n")); + } + TRACE((" event %d,%d %dx%d\n", + reply->y, + reply->x, + reply->height, + reply->width)); +#endif /* NO_ACTIVE_ICON */ + + /* if not doing CopyArea or if this is a GraphicsExpose, don't translate */ + if (!screen->incopy || event->type != Expose) { + return handle_translated_exposure(xw, reply->x, reply->y, + reply->width, + reply->height); + } else { + /* compute intersection of area being copied with + area being exposed. */ + int both_x1 = Max(screen->copy_src_x, reply->x); + int both_y1 = Max(screen->copy_src_y, reply->y); + int both_x2 = Min(screen->copy_src_x + (int) screen->copy_width, + (reply->x + (int) reply->width)); + int both_y2 = Min(screen->copy_src_y + (int) screen->copy_height, + (reply->y + (int) reply->height)); + int value = 0; + + /* was anything copied affected? */ + if (both_x2 > both_x1 && both_y2 > both_y1) { + /* do the copied area */ + value = handle_translated_exposure + (xw, reply->x + screen->copy_dest_x - screen->copy_src_x, + reply->y + screen->copy_dest_y - screen->copy_src_y, + reply->width, reply->height); + } + /* was anything not copied affected? */ + if (reply->x < both_x1 || reply->y < both_y1 + || reply->x + reply->width > both_x2 + || reply->y + reply->height > both_y2) + value = handle_translated_exposure(xw, reply->x, reply->y, + reply->width, reply->height); + + return value; + } +} + +static void +set_background(XtermWidget xw, int color) +{ + TScreen *screen = TScreenOf(xw); + Pixel c = getXtermBG(xw, xw->flags, color); + +#if OPT_WIDE_ATTRS + TRACE(("set_background(%d) %#lx %s\n", color, c, + ((xw->flags & ATR_DIRECT_BG) + ? "direct" + : "indexed"))); +#else + TRACE(("set_background(%d) %#lx\n", color, c)); +#endif + XSetWindowBackground(screen->display, VShellWindow(xw), c); + XSetWindowBackground(screen->display, VWindow(screen), c); + initBorderGC(xw, WhichVWin(screen)); +} + +void +xtermClear2(XtermWidget xw, int x, int y, unsigned width, unsigned height) +{ + TScreen *screen = TScreenOf(xw); + VTwin *vwin = WhichVWin(screen); + Drawable draw = VDrawable(screen); + GC gc; + + if ((gc = vwin->border_gc) != 0) { + int vmark1 = screen->border; + int vmark2 = vwin->height + vmark1; + int hmark1 = OriginX(screen); + int hmark2 = vwin->width + hmark1; + if (y < vmark1) { + int yy = y + (int) height; + int h1 = (yy <= vmark1) ? (yy - y) : (vmark1 - y); + XFillRectangle(screen->display, draw, gc, + x, y, width, (unsigned) h1); + if (yy > vmark1) { + xtermClear2(xw, x, vmark1, width, (unsigned) (yy - vmark1)); + } + } else if (y < vmark2) { + int yy = y + (int) height; + int h2 = (yy <= vmark2) ? (yy - y) : (vmark2 - y); + int xb = x; + int xx = x + (int) width; + int ww = (int) width; + if (x < hmark1) { + int w1 = (xx <= hmark1) ? (xx - x) : (hmark1 - x); + XFillRectangle(screen->display, draw, gc, + x, y, (unsigned) w1, (unsigned) h2); + x += w1; + ww -= w1; + } + if ((ww > 0) && (x < hmark2)) { + int w2 = (xx <= hmark2) ? (xx - x) : (hmark2 - x); +#if USE_DOUBLE_BUFFER + if (resource.buffered) { + XFillRectangle(screen->display, draw, + FillerGC(xw, screen), + x, y, (unsigned) w2, (unsigned) h2); + } else +#endif + XClearArea(screen->display, VWindow(screen), + x, y, (unsigned) w2, (unsigned) h2, False); + x += w2; + ww -= w2; + } + if (ww > 0) { + XFillRectangle(screen->display, draw, gc, + x, y, (unsigned) ww, (unsigned) h2); + } + if (yy > vmark2) { + xtermClear2(xw, xb, vmark2, width, (unsigned) (yy - vmark2)); + } + } else { + XFillRectangle(screen->display, draw, gc, x, y, width, height); + } + } else { +#if USE_DOUBLE_BUFFER + if (resource.buffered) { + gc = FillerGC(xw, screen); + XFillRectangle(screen->display, draw, gc, + x, y, width, height); + } else +#endif + XClearArea(screen->display, + VWindow(screen), + x, y, width, height, False); + } +} + +/* + * Called by the ExposeHandler to do the actual repaint after the coordinates + * have been translated to allow for any CopyArea in progress. + * The rectangle passed in is pixel coordinates. + */ +static int +handle_translated_exposure(XtermWidget xw, + int rect_x, + int rect_y, + int rect_width, + int rect_height) +{ + TScreen *screen = TScreenOf(xw); + int toprow, leftcol, nrows, ncols; + int x0, x1; + int y0, y1; + int result = 0; + + TRACE(("handle_translated_exposure at %d,%d size %dx%d\n", + rect_y, rect_x, rect_height, rect_width)); + + x0 = (rect_x - OriginX(screen)); + x1 = (x0 + rect_width); + + y0 = (rect_y - OriginY(screen)); + y1 = (y0 + rect_height); + + if ((x0 < 0 || + y0 < 0 || + x1 > Width(screen) || + y1 > Height(screen))) { + set_background(xw, -1); + xtermClear2(xw, + rect_x, + rect_y, + (unsigned) rect_width, + (unsigned) rect_height); + } + toprow = y0 / FontHeight(screen); + if (toprow < 0) + toprow = 0; + + leftcol = x0 / FontWidth(screen); + if (leftcol < 0) + leftcol = 0; + + nrows = (y1 - 1) / FontHeight(screen) - toprow + 1; + ncols = (x1 - 1) / FontWidth(screen) - leftcol + 1; + toprow -= screen->scrolls; + if (toprow < 0) { + nrows += toprow; + toprow = 0; + } + if (toprow + nrows > MaxRows(screen)) + nrows = MaxRows(screen) - toprow; + if (leftcol + ncols > MaxCols(screen)) + ncols = MaxCols(screen) - leftcol; + + if (nrows > 0 && ncols > 0) { + ScrnRefresh(xw, toprow, leftcol, nrows, ncols, True); + first_map_occurred(); + if (screen->cur_row >= toprow && + screen->cur_row < toprow + nrows && + screen->cur_col >= leftcol && + screen->cur_col < leftcol + ncols) { + result = 1; + } + + } + TRACE(("...handle_translated_exposure %d\n", result)); + return (result); +} + +/***====================================================================***/ + +void +GetColors(XtermWidget xw, ScrnColors * pColors) +{ + TScreen *screen = TScreenOf(xw); + int n; + + pColors->which = 0; + for (n = 0; n < NCOLORS; ++n) { + SET_COLOR_VALUE(pColors, n, T_COLOR(screen, n)); + } +} + +void +ChangeColors(XtermWidget xw, ScrnColors * pNew) +{ + Bool repaint = False; + TScreen *screen = TScreenOf(xw); + VTwin *win = WhichVWin(screen); + + TRACE(("ChangeColors\n")); + + if (COLOR_DEFINED(pNew, TEXT_CURSOR)) { + T_COLOR(screen, TEXT_CURSOR) = COLOR_VALUE(pNew, TEXT_CURSOR); + TRACE(("... TEXT_CURSOR: %#lx\n", T_COLOR(screen, TEXT_CURSOR))); + /* no repaint needed */ + } else if ((T_COLOR(screen, TEXT_CURSOR) == T_COLOR(screen, TEXT_FG)) && + (COLOR_DEFINED(pNew, TEXT_FG))) { + if (T_COLOR(screen, TEXT_CURSOR) != COLOR_VALUE(pNew, TEXT_FG)) { + T_COLOR(screen, TEXT_CURSOR) = COLOR_VALUE(pNew, TEXT_FG); + TRACE(("... TEXT_CURSOR: %#lx\n", T_COLOR(screen, TEXT_CURSOR))); + if (screen->Vshow) + repaint = True; + } + } + + if (COLOR_DEFINED(pNew, TEXT_FG)) { + Pixel fg = COLOR_VALUE(pNew, TEXT_FG); + T_COLOR(screen, TEXT_FG) = fg; + TRACE(("... TEXT_FG: %#lx\n", T_COLOR(screen, TEXT_FG))); + if (screen->Vshow) { + setCgsFore(xw, win, gcNorm, fg); + setCgsBack(xw, win, gcNormReverse, fg); + setCgsFore(xw, win, gcBold, fg); + setCgsBack(xw, win, gcBoldReverse, fg); + repaint = True; + } + } + + if (COLOR_DEFINED(pNew, TEXT_BG)) { + Pixel bg = COLOR_VALUE(pNew, TEXT_BG); + T_COLOR(screen, TEXT_BG) = bg; + TRACE(("... TEXT_BG: %#lx\n", T_COLOR(screen, TEXT_BG))); + if (screen->Vshow) { + setCgsBack(xw, win, gcNorm, bg); + setCgsFore(xw, win, gcNormReverse, bg); + setCgsBack(xw, win, gcBold, bg); + setCgsFore(xw, win, gcBoldReverse, bg); + set_background(xw, -1); + repaint = True; + } + } +#if OPT_HIGHLIGHT_COLOR + if (COLOR_DEFINED(pNew, HIGHLIGHT_BG)) { + if (T_COLOR(screen, HIGHLIGHT_BG) != COLOR_VALUE(pNew, HIGHLIGHT_BG)) { + T_COLOR(screen, HIGHLIGHT_BG) = COLOR_VALUE(pNew, HIGHLIGHT_BG); + TRACE(("... HIGHLIGHT_BG: %#lx\n", T_COLOR(screen, HIGHLIGHT_BG))); + if (screen->Vshow) + repaint = True; + } + } + if (COLOR_DEFINED(pNew, HIGHLIGHT_FG)) { + if (T_COLOR(screen, HIGHLIGHT_FG) != COLOR_VALUE(pNew, HIGHLIGHT_FG)) { + T_COLOR(screen, HIGHLIGHT_FG) = COLOR_VALUE(pNew, HIGHLIGHT_FG); + TRACE(("... HIGHLIGHT_FG: %#lx\n", T_COLOR(screen, HIGHLIGHT_FG))); + if (screen->Vshow) + repaint = True; + } + } +#endif + + if (COLOR_DEFINED(pNew, MOUSE_FG) || (COLOR_DEFINED(pNew, MOUSE_BG))) { + if (COLOR_DEFINED(pNew, MOUSE_FG)) { + T_COLOR(screen, MOUSE_FG) = COLOR_VALUE(pNew, MOUSE_FG); + TRACE(("... MOUSE_FG: %#lx\n", T_COLOR(screen, MOUSE_FG))); + } + if (COLOR_DEFINED(pNew, MOUSE_BG)) { + T_COLOR(screen, MOUSE_BG) = COLOR_VALUE(pNew, MOUSE_BG); + TRACE(("... MOUSE_BG: %#lx\n", T_COLOR(screen, MOUSE_BG))); + } + + if (screen->Vshow) { + recolor_cursor(screen, + screen->pointer_cursor, + T_COLOR(screen, MOUSE_FG), + T_COLOR(screen, MOUSE_BG)); + XDefineCursor(screen->display, VWindow(screen), + screen->pointer_cursor); + } +#if OPT_TEK4014 + if (TEK4014_SHOWN(xw)) { + TekScreen *tekscr = TekScreenOf(tekWidget); + Window tekwin = TWindow(tekscr); + if (tekwin) { + recolor_cursor(screen, + tekscr->arrow, + T_COLOR(screen, MOUSE_FG), + T_COLOR(screen, MOUSE_BG)); + XDefineCursor(screen->display, tekwin, tekscr->arrow); + } + } +#endif + /* no repaint needed */ + } + + if (COLOR_DEFINED(pNew, TEXT_FG) || + COLOR_DEFINED(pNew, TEXT_BG) || + COLOR_DEFINED(pNew, TEXT_CURSOR)) { + if (set_cursor_gcs(xw) && screen->Vshow) { + repaint = True; + } + } +#if OPT_TEK4014 + if (COLOR_DEFINED(pNew, TEK_FG) || + COLOR_DEFINED(pNew, TEK_BG)) { + ChangeTekColors(tekWidget, screen, pNew); + if (TEK4014_SHOWN(xw)) { + TekRepaint(tekWidget); + } + } else if (COLOR_DEFINED(pNew, TEK_CURSOR)) { + ChangeTekColors(tekWidget, screen, pNew); + } +#endif + if (repaint) + xtermRepaint(xw); +} + +void +xtermClear(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("xtermClear\n")); + xtermClear2(xw, 0, 0, FullWidth(screen), FullHeight(screen)); +} + +void +xtermRepaint(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("xtermRepaint\n")); + xtermClear(xw); + ScrnRefresh(xw, 0, 0, MaxRows(screen), MaxCols(screen), True); +} + +/***====================================================================***/ + +Boolean +isDefaultForeground(const char *name) +{ + return (Boolean) !x_strcasecmp(name, XtDefaultForeground); +} + +Boolean +isDefaultBackground(const char *name) +{ + return (Boolean) !x_strcasecmp(name, XtDefaultBackground); +} + +#if OPT_WIDE_CHARS +/* + * Check for Unicode BIDI control characters, which may be miscategorized via + * wcwidth() and iswprint() as zero-width printable characters. + */ +Boolean +isWideControl(unsigned ch) +{ + Boolean result; + + switch (ch) { + case 0x200E: + case 0x200F: + case 0x202A: + case 0x202B: + case 0x202C: + case 0x202D: + case 0x202E: + result = True; + break; + default: + result = False; + break; + } + return result; +} +#endif + +/***====================================================================***/ + +typedef struct { + Pixel fg; + Pixel bg; +} ToSwap; + +#if OPT_HIGHLIGHT_COLOR +#define hc_param ,Bool hilite_color +#define hc_value ,screen->hilite_color +#else +#define hc_param /* nothing */ +#define hc_value /* nothing */ +#endif + +/* + * Use this to swap the foreground/background color values in the resource + * data, and to build up a list of the pairs which must be swapped in the + * GC cache. + */ +static void +swapLocally(ToSwap * list, int *count, ColorRes * fg, ColorRes * bg hc_param) +{ + ColorRes tmp; + Boolean found = False; + +#if OPT_COLOR_RES + Pixel fg_color = fg->value; + Pixel bg_color = bg->value; +#else + Pixel fg_color = *fg; + Pixel bg_color = *bg; +#endif + +#if OPT_HIGHLIGHT_COLOR + if ((fg_color != bg_color) || !hilite_color) +#endif + { + int n; + + EXCHANGE(*fg, *bg, tmp); + for (n = 0; n < *count; ++n) { + if ((list[n].fg == fg_color && list[n].bg == bg_color) + || (list[n].fg == bg_color && list[n].bg == fg_color)) { + found = True; + break; + } + } + if (!found) { + list[*count].fg = fg_color; + list[*count].bg = bg_color; + *count = *count + 1; + TRACE(("swapLocally fg %#lx, bg %#lx ->%d\n", + fg_color, bg_color, *count)); + } + } +} + +static void +reallySwapColors(XtermWidget xw, ToSwap * list, int count) +{ + int j, k; + + TRACE(("reallySwapColors\n")); + for (j = 0; j < count; ++j) { + for_each_text_gc(k) { + redoCgs(xw, list[j].fg, list[j].bg, (CgsEnum) k); + } + } +} + +static void +swapVTwinGCs(XtermWidget xw, VTwin *win) +{ + swapCgs(xw, win, gcNorm, gcNormReverse); + swapCgs(xw, win, gcBold, gcBoldReverse); +} + +void +ReverseVideo(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + ToSwap listToSwap[5]; + int numToSwap = 0; + + TRACE(("ReverseVideo now %s\n", BtoS(xw->misc.re_verse))); + + /* + * Swap SGR foreground and background colors. By convention, these are + * the colors assigned to "black" (SGR #0) and "white" (SGR #7). Also, + * SGR #8 and SGR #15 are the bold (or bright) versions of SGR #0 and + * #7, respectively. + * + * We don't swap colors that happen to match the screen's foreground + * and background because that tends to produce bizarre effects. + */ +#define swapAnyColor(name,a,b) swapLocally(listToSwap, &numToSwap, &(screen->name[a]), &(screen->name[b]) hc_value) +#define swapAColor(a,b) swapAnyColor(Acolors, a, b) + if_OPT_ISO_COLORS(screen, { + swapAColor(0, 7); + swapAColor(8, 15); + }); + + if (T_COLOR(screen, TEXT_CURSOR) == T_COLOR(screen, TEXT_FG)) + T_COLOR(screen, TEXT_CURSOR) = T_COLOR(screen, TEXT_BG); + +#define swapTColor(a,b) swapAnyColor(Tcolors, a, b) + swapTColor(TEXT_FG, TEXT_BG); + swapTColor(MOUSE_FG, MOUSE_BG); + + reallySwapColors(xw, listToSwap, numToSwap); + + swapVTwinGCs(xw, &(screen->fullVwin)); +#ifndef NO_ACTIVE_ICON + swapVTwinGCs(xw, &(screen->iconVwin)); +#endif /* NO_ACTIVE_ICON */ + + xw->misc.re_verse = (Boolean) !xw->misc.re_verse; + TRACE(("...swapping done, set ReverseVideo %s\n", BtoS(xw->misc.re_verse))); + + if (XtIsRealized((Widget) xw)) { + xtermDisplayCursor(xw); + } +#if OPT_TEK4014 + if (TEK4014_SHOWN(xw)) { + TekScreen *tekscr = TekScreenOf(tekWidget); + Window tekwin = TWindow(tekscr); + recolor_cursor(screen, + tekscr->arrow, + T_COLOR(screen, MOUSE_FG), + T_COLOR(screen, MOUSE_BG)); + XDefineCursor(screen->display, tekwin, tekscr->arrow); + } +#endif + + if (screen->scrollWidget) + ScrollBarReverseVideo(screen->scrollWidget); + + if (XtIsRealized((Widget) xw)) { + set_background(xw, -1); + } +#if OPT_TEK4014 + TekReverseVideo(xw, tekWidget); +#endif + if (XtIsRealized((Widget) xw)) { + xtermRepaint(xw); + } +#if OPT_TEK4014 + if (TEK4014_SHOWN(xw)) { + TekRepaint(tekWidget); + } +#endif + ReverseOldColors(xw); + set_cursor_gcs(xw); + update_reversevideo(); + TRACE(("...ReverseVideo now %s\n", BtoS(xw->misc.re_verse))); +} + +void +recolor_cursor(TScreen *screen, + Cursor cursor, /* X cursor ID to set */ + unsigned long fg, /* pixel indexes to look up */ + unsigned long bg) /* pixel indexes to look up */ +{ + Display *dpy = screen->display; + XColor colordefs[2]; /* 0 is foreground, 1 is background */ + + colordefs[0].pixel = fg; + colordefs[1].pixel = bg; + XQueryColors(dpy, DefaultColormap(dpy, DefaultScreen(dpy)), + colordefs, 2); + XRecolorCursor(dpy, cursor, colordefs, colordefs + 1); + cleanup_colored_cursor(); + return; +} + +#if OPT_RENDERFONT +#define XFT_CACHE_LIMIT ((unsigned)(~0) >> 1) +#define XFT_CACHE_SIZE 16 +typedef struct { + XftColor color; + unsigned use; +} XftColorCache; + +static int +compare_xft_color_cache(const void *a, const void *b) +{ + return (int) (((const XftColorCache *) a)->use - + ((const XftColorCache *) b)->use); +} + +static XftColor * +getXftColor(XtermWidget xw, Pixel pixel) +{ + static XftColorCache cache[XFT_CACHE_SIZE + 1]; + static unsigned latest_use; + int i; + int oldest; + unsigned oldest_use; + XColor color; + Boolean found = False; + + oldest_use = XFT_CACHE_LIMIT; + oldest = 0; + if (latest_use == XFT_CACHE_LIMIT) { + latest_use = 0; + qsort(cache, (size_t) XFT_CACHE_SIZE, sizeof(XftColorCache), compare_xft_color_cache); + for (i = 0; i < XFT_CACHE_SIZE; i++) { + if (cache[i].use) { + cache[i].use = ++latest_use; + } + } + } + for (i = 0; i < XFT_CACHE_SIZE; i++) { + if (cache[i].use) { + if (cache[i].color.pixel == pixel) { + found = True; + break; + } + } + if (cache[i].use < oldest_use) { + oldest_use = cache[i].use; + oldest = i; + } + } + if (!found) { + i = oldest; + color.pixel = pixel; + XQueryColor(TScreenOf(xw)->display, xw->core.colormap, &color); + cache[i].color.color.red = color.red; + cache[i].color.color.green = color.green; + cache[i].color.color.blue = color.blue; + cache[i].color.color.alpha = 0xffff; + cache[i].color.pixel = pixel; + } + cache[i].use = ++latest_use; + return &cache[i].color; +} + +/* + * The cell-width is related to, but not the same as the wide-character width. + * We will only get useful values from wcwidth() for codes above 255. + * Otherwise, interpret according to internal data. + */ +#if OPT_RENDERWIDE + +#if OPT_C1_PRINT +#define XtermCellWidth(xw, ch) \ + (((ch) == 0 || (ch) == 127) \ + ? 0 \ + : (((ch) < 256) \ + ? (((ch) >= 128 && (ch) < 160) \ + ? (TScreenOf(xw)->c1_printable ? 1 : 0) \ + : 1) \ + : CharWidth(ch))) +#else +#define XtermCellWidth(xw, ch) \ + (((ch) == 0 || (ch) == 127) \ + ? 0 \ + : (((ch) < 256) \ + ? 1 \ + : CharWidth(ch))) +#endif + +#endif /* OPT_RENDERWIDE */ + +#define XFT_FONT(which) getXftFont(params->xw, which, fontnum) + +#if OPT_ISO_COLORS +#define UseBoldFont(screen) (!(screen)->colorBDMode || ((screen)->veryBoldColors & BOLD)) +#else +#define UseBoldFont(screen) 1 +#endif + +#if OPT_RENDERWIDE +/* + * Find Xft (truetype) double-width font for the given normal/bold attributes. + */ +static XftFont * +getWideXftFont(XTermDraw * params, + unsigned attr_flags) +{ + TScreen *screen = TScreenOf(params->xw); + int fontnum = screen->menu_font_number; + XftFont *wfont = 0; + +#if OPT_WIDE_ATTRS + if ((attr_flags & ATR_ITALIC) +#if OPT_ISO_COLORS + && !screen->colorITMode +#endif + ) { + if ((attr_flags & BOLDATTR(screen)) + && UseBoldFont(screen) + && XFT_FONT(fWBtal)) { + wfont = XFT_FONT(fWBtal); + } else if (XFT_FONT(fWItal)) { + wfont = XFT_FONT(fWItal); + } + } + if (wfont != 0) { + ; /* skip the other tests */ + } else +#endif +#if OPT_ISO_COLORS + if ((attr_flags & UNDERLINE) + && !screen->colorULMode + && screen->italicULMode + && XFT_FONT(fWItal)) { + wfont = XFT_FONT(fWItal); + } else +#endif + if ((attr_flags & BOLDATTR(screen)) + && UseBoldFont(screen) + && XFT_FONT(fWBold)) { + wfont = XFT_FONT(fWBold); + } else { + wfont = XFT_FONT(fWide); + } + return wfont; +} +#endif /* OPT_RENDERWIDE */ + +/* + * Find Xft (truetype) single-width font for the given normal/bold attributes. + */ +static XftFont * +getNormXftFont(XTermDraw * params, + unsigned attr_flags, + Bool *did_ul) +{ + TScreen *screen = TScreenOf(params->xw); + int fontnum = screen->menu_font_number; + XftFont *font = 0; + + (void) did_ul; +#if OPT_DEC_CHRSET + if (CSET_DOUBLE(params->real_chrset)) { + font = xterm_DoubleFT(params, params->real_chrset, attr_flags); + } + if (font != 0) { + ; /* found a usable double-sized font */ + } else +#endif +#if OPT_WIDE_ATTRS + if ((attr_flags & ATR_ITALIC) +#if OPT_ISO_COLORS + && !screen->colorITMode +#endif + ) { + if ((attr_flags & BOLDATTR(screen)) + && UseBoldFont(screen) + && XFT_FONT(fBtal)) { + font = XFT_FONT(fBtal); + } else if (XFT_FONT(fItal)) { + font = XFT_FONT(fItal); + } + } + if (font != 0) { + ; /* skip the other tests */ + } else +#endif +#if OPT_ISO_COLORS + if ((attr_flags & UNDERLINE) + && !screen->colorULMode + && screen->italicULMode + && XFT_FONT(fItal)) { + font = XFT_FONT(fItal); + *did_ul = True; + } else +#endif + if ((attr_flags & BOLDATTR(screen)) + && UseBoldFont(screen) + && XFT_FONT(fBold)) { + font = XFT_FONT(fBold); + } else { + font = XFT_FONT(fNorm); + } + return font; +} + +#if OPT_RENDERWIDE +#define pickXftFont(width, nf, wf) ((width == 2 && wf != 0) ? wf : nf) +#else +#define pickXftFont(width, nf, wf) (nf) +#endif + +/* + * fontconfig/Xft combination prior to 2.2 has a problem with + * CJK truetype 'double-width' (bi-width/monospace) fonts leading + * to the 's p a c e d o u t' rendering. Consequently, we can't + * rely on XftDrawString8/16 when one of those fonts is used. + * Instead, we need to roll out our own using XftDrawCharSpec. + * A patch in the same spirit (but in a rather different form) + * was applied to gnome vte and gtk2 port of vim. + * See http://bugzilla.mozilla.org/show_bug.cgi?id=196312 + */ +static int +xtermXftDrawString(XTermDraw * params, + unsigned attr_flags, + XftColor *color, + XftFont *font, + int x, + int y, + const IChar *text, + Cardinal len, + Bool really) +{ + TScreen *screen = TScreenOf(params->xw); + int ncells = 0; + + (void) attr_flags; + if (len != 0) { +#if OPT_RENDERWIDE + XftCharSpec *sbuf; + XftFont *wfont = getWideXftFont(params, attr_flags); + Cardinal src, dst; + XftFont *lastFont = 0; + XftFont *currFont = 0; + Cardinal start = 0; + int charWidth; + int fwidth = FontWidth(screen); +#if OPT_DEC_CHRSET + Boolean forceDbl = CSET_DOUBLE(params->real_chrset); +#else + Boolean forceDbl = False; +#endif + + BumpTypedBuffer(XftCharSpec, 2 * len); + sbuf = BfBuf(XftCharSpec); + + for (src = dst = 0; src < len; src++) { + FcChar32 wc = *text++; + + charWidth = XtermCellWidth(params->xw, (wchar_t) wc); + if (charWidth < 0) + continue; + + sbuf[dst].ucs4 = wc; + sbuf[dst].x = (short) (x + fwidth * ncells); + sbuf[dst].y = (short) (y); + + currFont = pickXftFont(charWidth, font, wfont); + ncells += charWidth; + + if (lastFont != currFont) { + if ((lastFont != 0) && really) { + XftDrawCharSpec(screen->renderDraw, + color, + lastFont, + sbuf + start, + (int) (dst - start)); + } + start = dst; + lastFont = currFont; + } + ++dst; + + if (forceDbl && charWidth < 2) { + sbuf[dst].ucs4 = ' '; + sbuf[dst].x = (short) (x + fwidth * ncells); + sbuf[dst].y = (short) (y); + ++dst; + ncells += charWidth; + } + } + if ((dst != start) && really) { + XftDrawCharSpec(screen->renderDraw, + color, + lastFont, + sbuf + start, + (int) (dst - start)); + } +#else /* !OPT_RENDERWIDE */ + if (really) { + XftChar8 *buffer; + int dst; + + BumpTypedBuffer(XftChar8, len); + buffer = BfBuf(XftChar8); + + for (dst = 0; dst < (int) len; ++dst) + buffer[dst] = CharOf(text[dst]); + + XftDrawString8(screen->renderDraw, + color, + font, + x, y, buffer, (int) len); + } + ncells = (int) len; +#endif + xtermNeedSwap(params->xw, 1); + } + return ncells; +} +#define xtermXftWidth(params, attr_flags, color, font, x, y, chars, len) \ + xtermXftDrawString(params, attr_flags, color, font, x, y, chars, len, False) +#endif /* OPT_RENDERFONT */ + +#if OPT_WIDE_CHARS +/* + * Map characters commonly "fixed" by groff back to their ASCII equivalents. + * Also map other useful equivalents. + */ +unsigned +AsciiEquivs(unsigned ch) +{ + switch (ch) { + case 0x2010: /* groff "-" */ + case 0x2011: + case 0x2012: + case 0x2013: + case 0x2014: + case 0x2015: + case 0x2212: /* groff "\-" */ + ch = '-'; + break; + case 0x2018: /* groff "`" */ + ch = '`'; + break; + case 0x2019: /* groff ' */ + ch = '\''; + break; + case 0x201C: /* groff lq */ + case 0x201D: /* groff rq */ + ch = '"'; + break; + case 0x2329: /* groff ".URL" */ + ch = '<'; + break; + case 0x232a: /* groff ".URL" */ + ch = '>'; + break; + default: + if (ch >= 0xff01 && ch <= 0xff5e) { + /* "Fullwidth" codes (actually double-width) */ + ch -= 0xff00; + ch += ANSI_SPA; + break; + } + } + return ch; +} + +/* + * Actually this should be called "groff_workaround()" - for the places where + * groff stomps on compatibility. Still, if enough people get used to it, + * this might someday become a quasi-standard. + */ +#if OPT_BOX_CHARS +static int +ucs_workaround(XTermDraw * params, + unsigned ch, + GC gc, + int x, + int y) +{ + TScreen *screen = TScreenOf(params->xw); + int fixed = False; + + if (screen->wide_chars && screen->utf8_mode && ch > 256) { + IChar eqv = (IChar) AsciiEquivs(ch); + + if (eqv != (IChar) ch) { + int width = CharWidth(ch); + + do { + drawXtermText(params, + gc, + x, + y, + &eqv, + 1); + x += FontWidth(screen); + eqv = BAD_ASCII; + } while (width-- > 1); + + fixed = True; + } else if (ch == HIDDEN_CHAR) { + fixed = True; + } + } + return fixed; +} +#endif /* OPT_BOX_CHARS */ +#endif /* OPT_WIDE_CHARS */ + +/* + * Use this when the characters will not fill the cell area properly. Fill the + * area where we'll write the characters, otherwise we'll get gaps between + * them, e.g., in the original background color. + * + * The cursor is a special case, because the XFillRectangle call only uses the + * foreground, while we've set the cursor color in the background. So we need + * a special GC for that. + */ +static void +xtermFillCells(XTermDraw * params, + GC gc, + int x, + int y, + Cardinal len) +{ + TScreen *screen = TScreenOf(params->xw); + VTwin *currentWin = WhichVWin(screen); + + if (!(params->draw_flags & NOBACKGROUND)) { + CgsEnum srcId = getCgsId(params->xw, currentWin, gc); + CgsEnum dstId = gcMAX; + Pixel fg = getCgsFore(params->xw, currentWin, gc); + Pixel bg = getCgsBack(params->xw, currentWin, gc); + + switch (srcId) { + case gcVTcursNormal: + case gcVTcursReverse: + dstId = gcVTcursOutline; + break; + case gcVTcursFilled: + case gcVTcursOutline: + /* FIXME */ + break; + case gcNorm: + dstId = gcNormReverse; + break; + case gcNormReverse: + dstId = gcNorm; + break; + case gcBold: + dstId = gcBoldReverse; + break; + case gcBoldReverse: + dstId = gcBold; + break; + case gcBorder: + case gcFiller: + dstId = srcId; + break; +#if OPT_BOX_CHARS + case gcLine: + case gcDots: + /* FIXME */ + break; +#endif +#if OPT_DEC_CHRSET + case gcCNorm: + case gcCBold: + /* FIXME */ + break; +#endif +#if OPT_WIDE_CHARS + case gcWide: + dstId = gcWideReverse; + break; + case gcWBold: + dstId = gcBoldReverse; + break; + case gcWideReverse: + case gcWBoldReverse: + /* FIXME */ + break; +#endif +#if OPT_TEK4014 + case gcTKcurs: + /* FIXME */ + break; +#endif + case gcMAX: + break; + } + + if (dstId != gcMAX) { + setCgsFore(params->xw, currentWin, dstId, bg); + setCgsBack(params->xw, currentWin, dstId, fg); + + XFillRectangle(screen->display, VDrawable(screen), + getCgsGC(params->xw, currentWin, dstId), + x, y, + len * (Cardinal) FontWidth(screen), + (unsigned) FontHeight(screen)); + } + } +} + +#if OPT_TRACE +static void +xtermSetClipRectangles(Display *dpy, + GC gc, + int x, + int y, + XRectangle * rp, + Cardinal nr, + int order) +{ +#if 0 + TScreen *screen = TScreenOf(term); + Drawable draw = VDrawable(screen); + + XSetClipMask(dpy, gc, None); + XDrawRectangle(screen->display, draw, gc, + x + rp->x - 1, + y + rp->y - 1, + rp->width, + rp->height); +#endif + + XSetClipRectangles(dpy, gc, + x, y, rp, (int) nr, order); + TRACE(("clipping @(%3d,%3d) (%3d,%3d)..(%3d,%3d)\n", + y, x, + rp->y, rp->x, rp->height, rp->width)); +} + +#else +#define xtermSetClipRectangles(dpy, gc, x, y, rp, nr, order) \ + XSetClipRectangles(dpy, gc, x, y, rp, (int) nr, order) +#endif + +#if OPT_CLIP_BOLD +/* + * This special case is a couple of percent slower, but avoids a lot of pixel + * trash in rxcurses' hanoi.cmd demo (e.g., 10x20 font). + */ +#define beginClipping(screen,gc,pwidth,plength) \ + if (pwidth > 2) { \ + if (screen->use_clipping) { \ + XRectangle clip; \ + int clip_x = x; \ + int clip_y = y - FontHeight(screen) + FontDescent(screen); \ + clip.x = 0; \ + clip.y = 0; \ + clip.height = (unsigned short) FontHeight(screen); \ + clip.width = (unsigned short) ((pwidth) * (plength)); \ + xtermSetClipRectangles(screen->display, gc, \ + clip_x, clip_y, \ + &clip, 1, Unsorted); \ + } else if (screen->use_border_clipping) { \ + XRectangle clip; \ + clip.x = 0; \ + clip.y = 0; \ + clip.height = (unsigned short) Height(screen); \ + clip.width = (unsigned short) Width(screen); \ + xtermSetClipRectangles(screen->display, gc, \ + 0, 0, \ + &clip, 1, Unsorted); \ + } \ + } +#define endClipping(screen,gc) \ + XSetClipMask(screen->display, gc, None) +#else +#define beginClipping(screen,gc,pwidth,plength) /* nothing */ +#define endClipping(screen,gc) /* nothing */ +#endif /* OPT_CLIP_BOLD */ + +#if OPT_RENDERFONT +static int +drawClippedXftString(XTermDraw * params, + unsigned attr_flags, + XftFont *font, + XftColor *fg_color, + int x, + int y, + const IChar *text, + Cardinal len) +{ + int ncells = xtermXftWidth(params, attr_flags, + fg_color, + font, x, y, + text, + len); + TScreen *screen = TScreenOf(params->xw); + int fontHigh = FontHeight(screen); + int fontWide = FontWidth(screen); + + if (fontWide > 2) { + int plength = (ncells ? ncells : 1); + Boolean halfHigh = False; +#if OPT_DEC_CHRSET + Boolean halfWide = False; + + switch (params->real_chrset) { + case CSET_SWL: + break; + case CSET_DWL: + halfWide = True; + break; + case CSET_DHL_TOP: + halfHigh = True; + halfWide = True; + break; + case CSET_DHL_BOT: + halfHigh = True; + halfWide = True; + break; + } + if (CSET_DOUBLE(params->real_chrset)) { + fontHigh = font->height; + fontWide = font->max_advance_width; + /* check if this is really a double-height font */ + if (halfHigh) { + int wantHigh = (int) (FontHeight(screen) * 1.8); + halfHigh = (fontHigh >= wantHigh); + TRACE(("comparing fontHigh %d/%d vs %d:" + " double-height %s for %s\n", + fontHigh, FontHeight(screen), + wantHigh, BtoS(halfHigh), + visibleDblChrset(params->real_chrset))); + } + fontHigh = (halfHigh + ? (2 * FontHeight(screen)) + : FontHeight(screen)); + /* check if this is really a double-width font */ + if (halfWide) { + int wantWide = (int) (FontWidth(screen) * 1.8); + halfWide = (fontWide >= wantWide); + TRACE(("comparing fontWide %d/%d vs %d:" + " double-width %s for %s\n", + fontWide, FontWidth(screen), + wantWide, BtoS(halfWide), + visibleDblChrset(params->real_chrset))); + } + fontWide = (halfWide + ? (2 * FontWidth(screen)) + : FontWidth(screen)); + } +#endif + if (screen->use_clipping || halfHigh) { + XRectangle clip; + double adds = ((double) screen->scale_height - 1.0) * fontHigh; + int height = dimRound(adds + fontHigh); + int descnt = dimRound(adds / 2.0) + FontDescent(screen); + int clip_x = (x); + int clip_y = (y) - height + descnt; + + clip.x = 0; + clip.y = 0; + clip.height = (Dimension) height; + clip.width = (Dimension) (fontWide * (Dimension) (plength)); + +#if OPT_DEC_CHRSET + if (halfHigh) { + int adjust; + + clip.height = (unsigned short) FontHeight(screen); + clip_y += descnt; + if (params->real_chrset == CSET_DHL_BOT) { + y -= clip.height; + } + adjust = ((clip_y - OriginY(screen)) % FontHeight(screen)); + if (adjust) { + if (adjust > FontHeight(screen) / 2) + adjust -= FontHeight(screen); + clip_y -= adjust; + } + } +#endif + XftDrawSetClipRectangles(screen->renderDraw, + clip_x, clip_y, + &clip, 1); + } else if (screen->use_border_clipping) { + XRectangle clip; + + clip.x = (Position) OriginX(screen); + clip.y = (Position) OriginY(screen); + clip.height = (Dimension) Height(screen); + clip.width = (Dimension) Width(screen); + + XftDrawSetClipRectangles(screen->renderDraw, + 0, 0, + &clip, 1); + } + } + + xtermXftDrawString(params, attr_flags, + fg_color, + font, x, y, + text, + len, + True); + XftDrawSetClip(screen->renderDraw, 0); + return ncells; +} +#endif + +#ifndef NO_ACTIVE_ICON +#define WhichVFontData(screen,name) \ + (IsIcon(screen) ? getIconicFont(screen) \ + : GetNormalFont(screen, name)) +#else +#define WhichVFontData(screen,name) \ + GetNormalFont(screen, name) +#endif + +static int +drawUnderline(XtermWidget xw, + GC gc, + unsigned attr_flags, + unsigned underline_len, + int font_width, + int x, + int y, + Bool did_ul) +{ + TScreen *screen = TScreenOf(xw); + + if (screen->underline && !did_ul) { + int repeat = 0; + int descent = FontDescent(screen); + int length = x + (int) underline_len * font_width - 1; + +#if OPT_WIDE_ATTRS + if ((attr_flags & ATR_STRIKEOUT)) { + int where = y - ((3 * FontAscent(screen)) / 8); + XDrawLine(screen->display, VDrawable(screen), gc, + x, where, + length, + where); + } + if ((attr_flags & ATR_DBL_UNDER)) { + repeat = 2; + } else +#endif + if ((attr_flags & UNDERLINE)) { + repeat = 1; + } + while (repeat-- > 0) { + if (descent-- > 1) + y++; + XDrawLine(screen->display, VDrawable(screen), gc, + x, y, + length, + y); + } + } + return y; +} + +#if OPT_WIDE_ATTRS +/* + * As a special case, we are currently allowing italic fonts to be inexact + * matches for the normal font's size. That introduces a problem: either the + * ascent or descent may be shorter, leaving a gap that has to be filled in. + * Or they may be larger, requiring clipping. Check for both cases. + */ +static int +fixupItalics(XTermDraw * params, + GC gc, + XTermFonts * curFont, + int y, int x, + int font_width, + Cardinal len) +{ + TScreen *screen = TScreenOf(params->xw); + VTwin *cgsWin = WhichVWin(screen); + XFontStruct *realFp = curFont->fs; + XFontStruct *thisFp = getCgsFont(params->xw, cgsWin, gc)->fs; + int need_clipping = 0; + int need_filling = 0; + + if (thisFp->ascent > realFp->ascent) + need_clipping = 1; + else if (thisFp->ascent < realFp->ascent) + need_filling = 1; + + if (thisFp->descent > realFp->descent) + need_clipping = 1; + else if (thisFp->descent < realFp->descent) + need_filling = 1; + + if (need_clipping) { + beginClipping(screen, gc, font_width, (int) len); + } + if (need_filling) { + xtermFillCells(params, + gc, + x, + y - realFp->ascent, + len); + } + return need_clipping; +} +#endif + +#if OPT_DEC_CHRSET +static int +fakeDoubleChars(XTermDraw * params, + GC gc, + int y, + int x, + const IChar *text, + Cardinal len) +{ + unsigned need = 2 * len; + IChar *temp = TypeMallocN(IChar, need); + + if (temp != 0) { + unsigned n = 0; + XTermDraw recur = *params; + + recur.this_chrset = CSET_SWL; + + while (len--) { + temp[n++] = *text++; + temp[n++] = ' '; + } + x = drawXtermText(&recur, + gc, + x, y, + temp, + n); + free(temp); + } + return x; +} +#endif /* OPT_DEC_CHRSET */ + +#define SetMissing(tag) \ + TRACE(("%s %s: missing %d %04X\n", __FILE__, tag, missing, ch)); \ + missing = 1 + +#define MaxImageString 255 + +/* + * Draws text with the specified combination of bold/underline. The return + * value is the updated x position. + */ +int +drawXtermText(XTermDraw * params, + GC gc, + int start_x, + int start_y, + const IChar *text, + Cardinal len) +{ + XTermDraw recur = *params; + int x = start_x; + int y = start_y; + TScreen *screen = TScreenOf(recur.xw); + Cardinal real_length = len; + Cardinal underline_len = 0; + /* Intended width of the font to draw (as opposed to the actual width of + the X font, and the width of the default font) */ + int font_width = (((recur.draw_flags & DOUBLEWFONT) ? 2 : 1) + * screen->fnt_wide); + Bool did_ul = False; + XTermFonts *curFont; +#if OPT_WIDE_ATTRS + int need_clipping = 0; +#endif + +#if OPT_WIDE_CHARS + if (text == 0) + return 0; +#endif +#if OPT_DEC_CHRSET + if (CSET_DOUBLE(recur.this_chrset)) { + /* We could try drawing double-size characters in the icon, but + * given that the icon font is usually nil or nil2, there + * doesn't seem to be much point. + */ + int inx = 0; + GC gc2; + + TRACE(("DRAWTEXT%c[%4d,%4d] (%d)%3d:%s\n", + screen->cursor_state == OFF ? ' ' : '*', + y, x, recur.this_chrset, len, + visibleIChars(text, len))); + +#if OPT_RENDERFONT + if (UsingRenderFont(recur.xw)) { + if (!IsIcon(screen) && screen->font_doublesize) { + TRACE(("drawing %s\n", visibleDblChrset((unsigned) recur.this_chrset))); + recur.real_chrset = recur.this_chrset; + recur.this_chrset = CSET_SWL; + x = drawXtermText(&recur, + gc, + x, y, + text, + len); + x += ((int) len) * FontWidth(screen); + } else { + x = fakeDoubleChars(&recur, + gc, y, x, + text, len); + } + } else +#endif + if ((!IsIcon(screen) && screen->font_doublesize) + && (gc2 = xterm_DoubleGC(&recur, gc, &inx)) != 0) { + /* draw actual double-sized characters */ + XFontStruct *fs = getDoubleFont(screen, inx)->fs; + XRectangle rect, *rp = ▭ + Cardinal nr = 1; + + font_width *= 2; + recur.draw_flags |= DOUBLEWFONT; + + rect.x = 0; + rect.y = 0; + rect.width = (unsigned short) ((int) len * font_width); + rect.height = (unsigned short) (FontHeight(screen)); + + TRACE(("drawing %s\n", visibleDblChrset((unsigned) recur.this_chrset))); + switch (recur.this_chrset) { + case CSET_DHL_TOP: + rect.y = (short) -(fs->ascent / 2); + y -= rect.y; + recur.draw_flags |= DOUBLEHFONT; + break; + case CSET_DHL_BOT: + rect.y = (short) (rect.height - (fs->ascent / 2)); + y -= rect.y; + recur.draw_flags |= DOUBLEHFONT; + break; + case CSET_DWL: + break; + default: + nr = 0; + break; + } + + if (nr) { + xtermSetClipRectangles(screen->display, gc2, + x, y, rp, nr, YXBanded); + xtermFillCells(&recur, gc, x, y + rect.y, len * 2); + } else { + XSetClipMask(screen->display, gc2, None); + } + + /* Call ourselves recursively with the new gc */ + + /* + * If we're trying to use proportional font, or if the + * font server didn't give us what we asked for wrt + * width, position each character independently. + */ + if (screen->fnt_prop + || (fs->min_bounds.width != fs->max_bounds.width) + || (fs->min_bounds.width != 2 * FontWidth(screen))) { + /* It is hard to fall-through to the main + branch: in a lot of places the check + for the cached font info is for + normal/bold fonts only. */ + XTermDraw param2 = recur; + param2.this_chrset = CSET_SWL; + while (len--) { + x = drawXtermText(¶m2, + gc2, + x, y, + text++, + 1); + x += FontWidth(screen); + } + } else { + XTermDraw param2 = recur; + param2.this_chrset = CSET_SWL; + x = drawXtermText(¶m2, + gc2, + x, y, + text, + len); + x += (int) len *FontWidth(screen); + } + + } else { /* simulate double-sized characters */ + x = fakeDoubleChars(&recur, + gc, y, x, + text, len); + } + TRACE(("DrewText [%4d,%4d]\n", y, x)); + return x; + } +#endif +#if OPT_RENDERFONT + if (UsingRenderFont(recur.xw)) { + VTwin *currentWin = WhichVWin(screen); + Display *dpy = screen->display; + XftFont *font; + XftFont *font0; + XGCValues values; +#if OPT_RENDERWIDE + XftFont *wfont; + XftFont *wfont0; +#endif + +#if OPT_DEC_CHRSET + /* + * If this is a VT100-style double-width font, ensure that everything + * is printed using two-columns per character. + */ + Boolean forceDbl = CSET_DOUBLE(recur.real_chrset); +#else + Boolean forceDbl = False; +#endif + + (void) forceDbl; + /* + * Defer creating the drawable until we need it. + */ + if (!screen->renderDraw) { + int scr; + Drawable draw = VDrawable(screen); + Visual *visual; + + scr = DefaultScreen(dpy); + visual = DefaultVisual(dpy, scr); + screen->renderDraw = XftDrawCreate(dpy, draw, visual, + DefaultColormap(dpy, scr)); + } + + /* + * font0/wfont0 provide fallback to non-bolded Xft font if a glyph is + * not found in the bold version. + */ +#define IS_BOLD (recur.attr_flags & BOLDATTR(screen)) +#define NOT_BOLD (recur.attr_flags & ~BOLDATTR(screen)) + font = getNormXftFont(&recur, recur.attr_flags, &did_ul); + font0 = IS_BOLD ? getNormXftFont(&recur, NOT_BOLD, &did_ul) : font; + (void) font0; +#if OPT_RENDERWIDE + wfont = getWideXftFont(&recur, recur.attr_flags); + wfont0 = IS_BOLD ? getWideXftFont(&recur, NOT_BOLD) : wfont; +#endif + +#define GET_XFT_FG() getXftColor(recur.xw, values.foreground) +#define GET_XFT_BG() getXftColor(recur.xw, values.background) + + values.foreground = getCgsFore(recur.xw, currentWin, gc); + values.background = getCgsBack(recur.xw, currentWin, gc); + + if (!(recur.draw_flags & NOBACKGROUND)) { + XftColor *bg_color = GET_XFT_BG(); + int ncells = xtermXftWidth(&recur, recur.attr_flags, + bg_color, + font, x, y, + text, + len); + XftDrawRect(screen->renderDraw, + bg_color, + x, y, + (unsigned) (ncells * FontWidth(screen)), + (unsigned) FontHeight(screen)); + } + + y += font->ascent; +#if OPT_BOX_CHARS + { + /* adding code to substitute simulated line-drawing characters */ + int last, first = 0; + int curX = x; + + for (last = 0; last < (int) len; last++) { + Boolean replace = False; + Boolean missing = False; + unsigned ch = (unsigned) text[last]; + int filler = 0; +#if OPT_WIDE_CHARS + int needed = forceDbl ? 2 : CharWidth(ch); + XftFont *currFont = pickXftFont(needed, font, wfont); + XftFont *tempFont = 0; +#define CURR_TEMP (tempFont ? tempFont : currFont) + + if (xtermIsDecGraphic(ch)) { + /* + * Xft generally does not have the line-drawing characters + * in cells 1-31. Assume this (we cannot inspect the + * picture easily...), and attempt to fill in from real + * line-drawing character in the font at the Unicode + * position. Failing that, use our own box-characters. + */ + if (screen->force_box_chars + || screen->broken_box_chars + || xtermXftMissing(recur.xw, + currFont, + dec2ucs(screen, ch))) { + SetMissing("case 1"); + } else { + ch = dec2ucs(screen, ch); + replace = True; + } + } else if (ch >= 256) { + /* + * If we're reading UTF-8 from the client, we may have a + * line-drawing character. Translate it back to our + * box-code if Xft tells us that the glyph is missing. + */ + if_OPT_WIDE_CHARS(screen, { + unsigned part = ucs2dec(screen, ch); + if (xtermIsDecGraphic(part)) { + if (screen->force_box_chars + || screen->broken_box_chars) { + SetMissing("case 2"); + ch = part; + } + } + if (!missing && xtermXftMissing(recur.xw, currFont, ch)) { + XftFont *test = findXftGlyph(recur.xw, currFont, ch); + if (test == 0) + test = pickXftFont(needed, font0, wfont0); + if (!xtermXftMissing(recur.xw, test, ch)) { + tempFont = test; + replace = True; + filler = 0; + } else if ((part = AsciiEquivs(ch)) != ch) { + filler = needed - 1; + ch = part; + replace = True; + } else if (ch != HIDDEN_CHAR) { + SetMissing("case 3"); + } + } + }); + } +#else + XftFont *currFont = font; +#define CURR_TEMP (currFont) + if (xtermIsDecGraphic(ch)) { + /* + * Xft generally does not have the line-drawing characters + * in cells 1-31. Check for this, and attempt to fill in + * from real line-drawing character in the font at the + * Unicode position. Failing that, use our own + * box-characters. + */ + if (xtermXftMissing(recur.xw, currFont, ch)) { + SetMissing("case 4"); + } + } +#endif + + /* + * If we now have one of our box-codes, draw it directly. + */ + if (missing || replace) { + /* line drawing character time */ + if (last > first) { + int nc = drawClippedXftString(&recur, + recur.attr_flags, + currFont, + GET_XFT_FG(), + curX, + y, + text + first, + (Cardinal) (last - first)); + curX += nc * FontWidth(screen); + underline_len += (Cardinal) nc; + } + if (missing) { + Dimension old_wide = screen->fnt_wide; + Dimension old_high = screen->fnt_high; + screen->fnt_wide = (Dimension) FontWidth(screen); + screen->fnt_high = (Dimension) FontHeight(screen); + xtermDrawBoxChar(&recur, ch, + gc, + curX, y - FontAscent(screen), 1); + curX += FontWidth(screen); + underline_len += 1; + screen->fnt_wide = old_wide; + screen->fnt_high = old_high; + } else { + IChar ch2 = (IChar) ch; + int nc = drawClippedXftString(&recur, + recur.attr_flags, + CURR_TEMP, + GET_XFT_FG(), + curX, + y, + &ch2, + 1); + curX += nc * FontWidth(screen); + underline_len += (Cardinal) nc; + if (filler) { + ch2 = ' '; + nc = drawClippedXftString(&recur, + recur.attr_flags, + CURR_TEMP, + GET_XFT_FG(), + curX, + y, + &ch2, + 1); + curX += nc * FontWidth(screen); + underline_len += (Cardinal) nc; + } + } + first = last + 1; + } + } + if (last > first) { + underline_len += (Cardinal) + drawClippedXftString(&recur, + recur.attr_flags, + font, + GET_XFT_FG(), + curX, + y, + text + first, + (Cardinal) (last - first)); + } + } +#else + { + underline_len += (Cardinal) + drawClippedXftString(&recur, + recur.attr_flags, + font, + GET_XFT_FG(), + x, + y, + text, + len); + } +#endif /* OPT_BOX_CHARS */ + + (void) drawUnderline(recur.xw, + gc, + recur.attr_flags, + underline_len, + FontWidth(screen), + x, + y, + did_ul); + + x += (int) len *FontWidth(screen); + + return x; + } +#endif /* OPT_RENDERFONT */ + curFont = ((recur.attr_flags & BOLDATTR(screen)) + ? WhichVFontData(screen, fBold) + : WhichVFontData(screen, fNorm)); + /* + * If we're asked to display a proportional font, do this with a fixed + * pitch. Yes, it's ugly. But we cannot distinguish the use of xterm + * as a dumb terminal vs its use as in fullscreen programs such as vi. + * Hint: do not try to use a proportional font in the icon. + */ + if (!IsIcon(screen) && !(recur.draw_flags & CHARBYCHAR) && screen->fnt_prop) { + int adj, width; + + while (len--) { + int cells = WideCells(*text); +#if OPT_BOX_CHARS +#if OPT_WIDE_CHARS + if (*text == HIDDEN_CHAR) { + ++text; + continue; + } else +#endif + if (IsXtermMissingChar(screen, *text, curFont)) { + adj = 0; + } else +#endif + { + if_WIDE_OR_NARROW(screen, { + XChar2b temp[1]; + temp[0].byte2 = LO_BYTE(*text); + temp[0].byte1 = HI_BYTE(*text); + width = XTextWidth16(curFont->fs, temp, 1); + } + , { + char temp[1]; + temp[0] = (char) LO_BYTE(*text); + width = XTextWidth(curFont->fs, temp, 1); + }); + adj = (FontWidth(screen) - width) / 2; + if (adj < 0) + adj = 0; + } + xtermFillCells(&recur, gc, x, y, (Cardinal) cells); + recur.draw_flags |= (NOBACKGROUND | CHARBYCHAR); + x = drawXtermText(&recur, + gc, x + adj, y, + text++, 1) - adj; + } + + return x; + } +#if OPT_BOX_CHARS + /* + * Draw some substitutions, if needed. The font may not include the + * line-drawing set, or it may be incomplete (in which case we'll draw an + * empty space via xtermDrawBoxChar), or we may be told to force our + * line-drawing. + * + * The empty space is a special case which can be overridden with the + * showMissingGlyphs resource to produce an outline. Not all fonts in + * "modern" (sic) X provide an empty space; some use a thick outline or + * something like the replacement character. If you would rather not see + * that, you can set assumeAllChars. + */ + if (!IsIcon(screen) + && !(recur.draw_flags & NOTRANSLATION) + && (!screen->fnt_boxes + || (FontIsIncomplete(curFont) && !screen->assume_all_chars) + || screen->force_box_chars)) { + /* + * Fill in missing box-characters. Find regions without missing + * characters, and draw them calling ourselves recursively. Draw + * missing characters via xtermDrawBoxChar(). + */ + int last, first = 0; + Bool drewBoxes = False; + + for (last = 0; last < (int) len; last++) { + unsigned ch = (unsigned) text[last]; + Bool isMissing; + int ch_width; +#if OPT_WIDE_CHARS + + if (ch == HIDDEN_CHAR) { + if (last > first) { + XTermDraw param2 = recur; + param2.draw_flags |= NOTRANSLATION; + x = drawXtermText(¶m2, + gc, + x, y, + text + first, + (unsigned) (last - first)); + } + first = last + 1; + drewBoxes = True; + continue; + } + ch_width = CharWidth(ch); + isMissing = + IsXtermMissingChar(screen, ch, + ((recur.on_wide || ch_width > 1) + && okFont(NormalWFont(screen))) + ? WhichVFontData(screen, fWide) + : curFont); +#else + isMissing = IsXtermMissingChar(screen, ch, curFont); + ch_width = 1; +#endif + /* + * If the character is not missing, but we're in wide-character + * mode and the character happens to be a wide-character that + * corresponds to the line-drawing set, allow the forceBoxChars + * resource (or menu entry) to force it to display using our + * tables. + */ + if_OPT_WIDE_CHARS(screen, { + if (!isMissing + && TScreenOf(recur.xw)->force_box_chars) { + if (ch > 255 + && ucs2dec(screen, ch) < 32) { + ch = ucs2dec(screen, ch); + isMissing = True; + } else if (ch < 32) { + isMissing = True; + } + } + }); + + if (isMissing) { + if (last > first) { + XTermDraw param2 = recur; + param2.draw_flags |= NOTRANSLATION; + x = drawXtermText(&recur, + gc, + x, y, + text + first, + (unsigned) (last - first)); + } +#if OPT_WIDE_CHARS + if (ch_width <= 0 && ch < 32) + ch_width = 1; /* special case for line-drawing */ + else if (ch_width < 0) + ch_width = 1; /* special case for combining char */ + if (!ucs_workaround(&recur, ch, gc, x, y)) { + xtermDrawBoxChar(&recur, ch, gc, x, y, ch_width); + } +#else + xtermDrawBoxChar(&recur, ch, gc, x, y, ch_width); +#endif + x += (ch_width * FontWidth(screen)); + first = last + 1; + drewBoxes = True; + } + } + if (last <= first) { + return x; + } + text += first; + len = (Cardinal) (last - first); + recur.draw_flags |= NOTRANSLATION; + if (drewBoxes) { + return drawXtermText(&recur, + gc, + x, + y, + text, + len); + } + } +#endif /* OPT_BOX_CHARS */ + /* + * Behave as if the font has (maybe Unicode-replacements for) drawing + * characters in the range 1-31 (either we were not asked to ignore them, + * or the caller made sure that there is none). + */ +#if OPT_WIDE_ATTRS +#define AttrFlags() recur.attr_flags +#define DrawFlags() recur.draw_flags +#else +#define AttrFlags() (recur.attr_flags & DRAWX_MASK) +#define DrawFlags() (recur.draw_flags & ~DRAWX_MASK) +#endif + TRACE(("drawtext%c[%4d,%4d] {%#x,%#x} (%d) %d:%s\n", + screen->cursor_state == OFF ? ' ' : '*', + y, x, + AttrFlags(), + DrawFlags(), + recur.this_chrset, len, + visibleIChars(text, len))); + if (screen->scale_height != (float) 1.0) { + xtermFillCells(&recur, gc, x, y, (Cardinal) len); + } + y += FontAscent(screen); + +#if OPT_WIDE_CHARS + + if (screen->wide_chars || screen->unicode_font) { + XChar2b *buffer; + Bool needWide = False; + int src, dst; + Bool useBoldFont; + int ascent_adjust = 0; + + BumpTypedBuffer(XChar2b, len); + buffer = BfBuf(XChar2b); + + for (src = dst = 0; src < (int) len; src++) { + IChar ch = text[src]; + + if (ch == HIDDEN_CHAR) + continue; + +#if OPT_BOX_CHARS + if ((screen->fnt_boxes == 1) && (ch >= 256)) { + unsigned part = ucs2dec(screen, ch); + if (part < 32) + ch = (IChar) part; + } +#endif + + if (!needWide + && !IsIcon(screen) + && ((recur.on_wide || CharWidth(ch) > 1) + && okFont(NormalWFont(screen)))) { + needWide = True; + } +#if OPT_WIDER_ICHAR + /* + * bitmap-fonts are limited to 16-bits. + */ + if (ch > NARROW_ICHAR) { + ch = 0; + } +#endif + buffer[dst].byte2 = LO_BYTE(ch); + buffer[dst].byte1 = HI_BYTE(ch); +#if OPT_MINI_LUIT +#define UCS2SBUF(value) buffer[dst].byte2 = LO_BYTE(value);\ + buffer[dst].byte1 = HI_BYTE(value) + +#define Map2Sbuf(from,to) (text[src] == from) { UCS2SBUF(to); } + + if (screen->latin9_mode && !screen->utf8_mode && text[src] < 256) { + + /* see http://www.cs.tut.fi/~jkorpela/latin9.html */ + /* *INDENT-OFF* */ + if Map2Sbuf(0xa4, 0x20ac) + else if Map2Sbuf(0xa6, 0x0160) + else if Map2Sbuf(0xa8, 0x0161) + else if Map2Sbuf(0xb4, 0x017d) + else if Map2Sbuf(0xb8, 0x017e) + else if Map2Sbuf(0xbc, 0x0152) + else if Map2Sbuf(0xbd, 0x0153) + else if Map2Sbuf(0xbe, 0x0178) + /* *INDENT-ON* */ + + } + if (screen->unicode_font + && (text[src] == ANSI_DEL || + text[src] < ANSI_SPA)) { + unsigned ni = dec2ucs(screen, + (unsigned) ((text[src] == ANSI_DEL) + ? 0 + : text[src])); + UCS2SBUF(ni); + } +#endif /* OPT_MINI_LUIT */ + ++dst; + } + + /* + * Check for special case where the bold font lacks glyphs found in the + * normal font, and drop down to normal fonts with overstriking to help + * show the actual characters. + */ + useBoldFont = ((recur.attr_flags & BOLDATTR(screen)) != 0); + if (useBoldFont) { + XTermFonts *norm = 0; + XTermFonts *bold = 0; + Bool noBold, noNorm; + + if (needWide && okFont(BoldWFont(screen))) { + norm = WhichVFontData(screen, fWide); + bold = WhichVFontData(screen, fWBold); + } else if (okFont(BoldFont(screen))) { + norm = WhichVFontData(screen, fNorm); + bold = WhichVFontData(screen, fBold); + } else { + useBoldFont = False; + } + + if (useBoldFont && FontIsIncomplete(bold)) { + for (src = 0; src < (int) len; src++) { + IChar ch = text[src]; + + if (ch == HIDDEN_CHAR) + continue; + + noBold = IsXtermMissingChar(screen, ch, bold); + if (noBold) { + noNorm = IsXtermMissingChar(screen, ch, norm); + if (!noNorm) { + useBoldFont = False; + break; + } + } + } + } + } + + /* FIXME This is probably wrong. But it works. */ + underline_len = len; + + /* Set the drawing font */ + if (!(recur.draw_flags & (DOUBLEHFONT | DOUBLEWFONT))) { + VTwin *currentWin = WhichVWin(screen); + VTFontEnum fntId; + CgsEnum cgsId; + Pixel fg = getCgsFore(recur.xw, currentWin, gc); + Pixel bg = getCgsBack(recur.xw, currentWin, gc); + + if (needWide + && useBoldFont + && okFont(BoldWFont(screen))) { + fntId = fWBold; + cgsId = gcWBold; + } else if (needWide) { + fntId = fWide; + cgsId = gcWide; + } else if (useBoldFont) { + fntId = fBold; + cgsId = gcBold; + } else { + fntId = fNorm; + cgsId = gcNorm; + } + + setCgsFore(recur.xw, currentWin, cgsId, fg); + setCgsBack(recur.xw, currentWin, cgsId, bg); + gc = getCgsGC(recur.xw, currentWin, cgsId); + +#if OPT_WIDE_ATTRS +#if OPT_DEC_CHRSET + if (!(CSET_DOUBLE(recur.this_chrset) || (recur.draw_flags & DOUBLEWFONT))) +#endif + need_clipping = fixupItalics(&recur, + gc, + getCgsFont(recur.xw, + currentWin, gc), + y, x, font_width, len); +#endif + if (fntId != fNorm) { + XFontStruct *thisFp = WhichVFont(screen, fntId); + ascent_adjust = (thisFp->ascent + - NormalFont(screen)->ascent); + if (thisFp->max_bounds.width == + NormalFont(screen)->max_bounds.width * 2) { + underline_len = real_length = (Cardinal) (dst * 2); + } else if (cgsId == gcWide || cgsId == gcWBold) { + underline_len = real_length = (Cardinal) (dst * 2); + xtermFillCells(&recur, + gc, + x, + y - thisFp->ascent, + real_length); + } + } + } + + if (recur.draw_flags & NOBACKGROUND) { + XDrawString16(screen->display, + VDrawable(screen), gc, + x, y + ascent_adjust, + buffer, dst); + } else if (dst <= MaxImageString) { + XDrawImageString16(screen->display, + VDrawable(screen), gc, + x, y + ascent_adjust, + buffer, dst); + } else { + int b_pos; + int b_max = MaxImageString; + for (b_pos = 0; b_pos < dst; b_pos += b_max) { + if (b_pos + b_max > dst) + b_max = (dst - b_pos); + XDrawImageString16(screen->display, + VDrawable(screen), gc, + x + (b_pos * FontWidth(screen)), + y + ascent_adjust, + buffer + b_pos, + b_max); + } + } +#if OPT_WIDE_ATTRS + if (need_clipping) { + endClipping(screen, gc); + } +#endif + + if ((recur.attr_flags & BOLDATTR(screen)) && (screen->enbolden || !useBoldFont)) { + if (!(recur.draw_flags & (DOUBLEWFONT | DOUBLEHFONT))) { + beginClipping(screen, gc, (Cardinal) font_width, len); + } + XDrawString16(screen->display, VDrawable(screen), gc, + x + 1, + y + ascent_adjust, + buffer, dst); + if (!(recur.draw_flags & (DOUBLEWFONT | DOUBLEHFONT))) { + endClipping(screen, gc); + } + } + + } else +#endif /* OPT_WIDE_CHARS */ + { + int length = (int) len; /* X should have used unsigned */ +#if OPT_WIDE_CHARS + char *buffer; + int dst; + + BumpTypedBuffer(char, len); + buffer = BfBuf(char); + + for (dst = 0; dst < length; ++dst) + buffer[dst] = (char) LO_BYTE(text[dst]); +#else + char *buffer = (char *) text; +#endif + +#if OPT_WIDE_ATTRS +#if OPT_DEC_CHRSET + if (!(CSET_DOUBLE(recur.this_chrset) || (recur.draw_flags & DOUBLEWFONT))) +#endif + need_clipping = fixupItalics(&recur, gc, curFont, + y, x, font_width, len); +#endif + + if (recur.draw_flags & NOBACKGROUND) { + XDrawString(screen->display, VDrawable(screen), gc, + x, y, buffer, length); + } else if (length <= MaxImageString) { + XDrawImageString(screen->display, VDrawable(screen), gc, + x, y, buffer, length); + } else { + int b_pos; + int b_max = MaxImageString; + for (b_pos = 0; b_pos < length; b_pos += b_max) { + if (b_pos + b_max > length) + b_max = (length - b_pos); + XDrawImageString(screen->display, + VDrawable(screen), gc, + x + (b_pos * FontWidth(screen)), + y, + buffer + b_pos, + b_max); + } + } + +#if OPT_WIDE_ATTRS + if (need_clipping) { + endClipping(screen, gc); + } +#endif + underline_len = (Cardinal) length; + if ((recur.attr_flags & BOLDATTR(screen)) && screen->enbolden) { + if (!(recur.draw_flags & (DOUBLEWFONT | DOUBLEHFONT))) { + beginClipping(screen, gc, font_width, length); + } + XDrawString(screen->display, VDrawable(screen), gc, + x + 1, y, buffer, length); + if (!(recur.draw_flags & (DOUBLEWFONT | DOUBLEHFONT))) { + endClipping(screen, gc); + } + } + } + + (void) drawUnderline(recur.xw, + gc, + recur.attr_flags, + underline_len, + font_width, + x, + y, + did_ul); + + x += ((int) real_length) * FontWidth(screen); + return x; +} + +#if OPT_WIDE_CHARS +/* + * Allocate buffer - workaround for wide-character interfaces. + */ +void +allocXtermChars(ScrnPtr *buffer, Cardinal length) +{ + if (*buffer == 0) { + *buffer = (ScrnPtr) XtMalloc(length); + } else { + *buffer = (ScrnPtr) XtRealloc((char *) *buffer, length); + } +} +#endif + +/* set up size hints for window manager; min 1 char by 1 char */ +void +xtermSizeHints(XtermWidget xw, int scrollbarWidth) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("xtermSizeHints\n")); + TRACE((" border %d\n", xw->core.border_width)); + TRACE((" scrollbar %d\n", scrollbarWidth)); + + xw->hints.base_width = 2 * screen->border + scrollbarWidth; + xw->hints.base_height = 2 * screen->border; + +#if OPT_TOOLBAR + TRACE((" toolbar %d\n", ToolbarHeight(xw))); + + xw->hints.base_height += ToolbarHeight(xw); + xw->hints.base_height += BorderWidth(xw) * 2; + xw->hints.base_width += BorderWidth(xw) * 2; +#endif + + xw->hints.width_inc = FontWidth(screen); + xw->hints.height_inc = FontHeight(screen); + xw->hints.min_width = xw->hints.base_width + xw->hints.width_inc; + xw->hints.min_height = xw->hints.base_height + xw->hints.height_inc; + + xw->hints.width = MaxCols(screen) * FontWidth(screen) + xw->hints.min_width; + xw->hints.height = MaxRows(screen) * FontHeight(screen) + xw->hints.min_height; + + xw->hints.flags |= (PSize | PBaseSize | PMinSize | PResizeInc); + + TRACE_HINTS(&(xw->hints)); +} + +void +getXtermSizeHints(XtermWidget xw) +{ + TScreen *screen = TScreenOf(xw); + long supp; + + if (!XGetWMNormalHints(screen->display, VShellWindow(xw), + &xw->hints, &supp)) + memset(&xw->hints, 0, sizeof(xw->hints)); + TRACE_HINTS(&(xw->hints)); +} + +CgsEnum +whichXtermCgs(XtermWidget xw, unsigned attr_flags, Bool hilite) +{ + TScreen *screen = TScreenOf(xw); + CgsEnum cgsId = gcMAX; + + if (ReverseOrHilite(screen, attr_flags, hilite)) { + if (attr_flags & BOLDATTR(screen)) { + cgsId = gcBoldReverse; + } else { + cgsId = gcNormReverse; + } + } else { + if (attr_flags & BOLDATTR(screen)) { + cgsId = gcBold; + } else { + cgsId = gcNorm; + } + } + return cgsId; +} + +/* + * Returns a GC, selected according to the font (reverse/bold/normal) that is + * required for the current position (implied). The GC is updated with the + * current screen foreground and background colors. + */ +GC +updatedXtermGC(XtermWidget xw, unsigned attr_flags, CellColor fg_bg, + Bool hilite) +{ + TScreen *screen = TScreenOf(xw); + VTwin *win = WhichVWin(screen); + CgsEnum cgsId = whichXtermCgs(xw, attr_flags, hilite); + Pixel my_fg = extract_fg(xw, fg_bg, attr_flags); + Pixel my_bg = extract_bg(xw, fg_bg, attr_flags); + Pixel fg_pix = getXtermFG(xw, attr_flags, (int) my_fg); + Pixel bg_pix = getXtermBG(xw, attr_flags, (int) my_bg); + Pixel xx_pix; +#if OPT_HIGHLIGHT_COLOR + Boolean reverse2 = ((attr_flags & INVERSE) && hilite); + Pixel selbg_pix = T_COLOR(screen, HIGHLIGHT_BG); + Pixel selfg_pix = T_COLOR(screen, HIGHLIGHT_FG); + Boolean always = screen->hilite_color; + Boolean use_selbg = (Boolean) (always && + isNotForeground(xw, fg_pix, bg_pix, selbg_pix)); + Boolean use_selfg = (Boolean) (always && + isNotBackground(xw, fg_pix, bg_pix, selfg_pix)); +#endif + + (void) fg_bg; + (void) my_bg; + (void) my_fg; + + /* + * Discard video attributes overridden by colorXXXMode's. + */ + checkVeryBoldColors(attr_flags, my_fg); + + if (ReverseOrHilite(screen, attr_flags, hilite)) { +#if OPT_HIGHLIGHT_COLOR + if (!screen->hilite_color) { + if (selbg_pix != T_COLOR(screen, TEXT_FG) + && selbg_pix != fg_pix + && selbg_pix != bg_pix + && selbg_pix != xw->dft_foreground) { + bg_pix = fg_pix; + fg_pix = selbg_pix; + } + } +#endif + EXCHANGE(fg_pix, bg_pix, xx_pix); +#if OPT_HIGHLIGHT_COLOR + if (screen->hilite_color) { + if (screen->hilite_reverse) { + if (use_selbg) { + if (use_selfg) { + bg_pix = fg_pix; + } else { + fg_pix = bg_pix; + bg_pix = selbg_pix; + } + } + if (use_selfg) + fg_pix = selfg_pix; + } + } +#endif + } else if ((attr_flags & INVERSE) && hilite) { +#if OPT_HIGHLIGHT_COLOR + if (!screen->hilite_color) { + if (selbg_pix != T_COLOR(screen, TEXT_FG) + && selbg_pix != fg_pix + && selbg_pix != bg_pix + && selbg_pix != xw->dft_foreground) { + bg_pix = fg_pix; + fg_pix = selbg_pix; + } + } +#endif + /* double-reverse... EXCHANGE(fg_pix, bg_pix, xx_pix); */ +#if OPT_HIGHLIGHT_COLOR + if (screen->hilite_color) { + if (screen->hilite_reverse) { + if (use_selbg) { + if (use_selfg ^ reverse2) { + bg_pix = fg_pix; + } else { + fg_pix = bg_pix; + } + if (reverse2) { + fg_pix = selbg_pix; + } else { + bg_pix = selbg_pix; + } + } + if (use_selfg) { + if (reverse2) { + bg_pix = selfg_pix; + } else { + fg_pix = selfg_pix; + } + } + } + } +#endif + } +#if OPT_HIGHLIGHT_COLOR + if (!screen->hilite_color || !screen->hilite_reverse) { + if (hilite && !screen->hilite_reverse) { + if (use_selbg) { + if (reverse2) + fg_pix = selbg_pix; + else + bg_pix = selbg_pix; + } + if (use_selfg) { + if (reverse2) + bg_pix = selfg_pix; + else + fg_pix = selfg_pix; + } + } + } +#endif + +#if OPT_BLINK_TEXT + if ((screen->blink_state == ON) && + (!screen->blink_as_bold) && + (attr_flags & BLINK)) { + fg_pix = bg_pix; + } +#endif + + setCgsFore(xw, win, cgsId, fg_pix); + setCgsBack(xw, win, cgsId, bg_pix); + return getCgsGC(xw, win, cgsId); +} + +/* + * Resets the foreground/background of the GC returned by 'updatedXtermGC()' + * to the values that would be set in SGR_Foreground and SGR_Background. This + * duplicates some logic, but only modifies 1/4 as many GC's. + */ +void +resetXtermGC(XtermWidget xw, unsigned attr_flags, Bool hilite) +{ + TScreen *screen = TScreenOf(xw); + VTwin *win = WhichVWin(screen); + CgsEnum cgsId = whichXtermCgs(xw, attr_flags, hilite); + Pixel fg_pix = getXtermFG(xw, attr_flags, xw->cur_foreground); + Pixel bg_pix = getXtermBG(xw, attr_flags, xw->cur_background); + + checkVeryBoldColors(attr_flags, xw->cur_foreground); + + if (ReverseOrHilite(screen, attr_flags, hilite)) { + setCgsFore(xw, win, cgsId, bg_pix); + setCgsBack(xw, win, cgsId, fg_pix); + } else { + setCgsFore(xw, win, cgsId, fg_pix); + setCgsBack(xw, win, cgsId, bg_pix); + } +} + +#if OPT_ISO_COLORS +/* + * Extract the foreground-color index from a color pair. + * If we've got BOLD or UNDERLINE color-mode active, those will be used. + */ +Pixel +extract_fg(XtermWidget xw, CellColor color, unsigned attr_flags) +{ + unsigned fg = ExtractForeground(color); + + if (TScreenOf(xw)->colorAttrMode + || (fg == ExtractBackground(color))) { + fg = MapToColorMode(fg, TScreenOf(xw), attr_flags); + } + return fg; +} + +/* + * Extract the background-color index from a color pair. + * If we've got INVERSE color-mode active, that will be used. + */ +Pixel +extract_bg(XtermWidget xw, CellColor color, unsigned attr_flags) +{ + unsigned bg = ExtractBackground(color); + + if (TScreenOf(xw)->colorAttrMode + || (bg == ExtractForeground(color))) { + if (TScreenOf(xw)->colorRVMode && (attr_flags & INVERSE)) + bg = COLOR_RV; + } + return bg; +} + +/* + * Combine the current foreground and background into a single 8-bit number. + * Note that we're storing the SGR foreground, since cur_foreground may be set + * to COLOR_UL, COLOR_BD or COLOR_BL, which would make the code larger than 8 + * bits. + * + * This assumes that fg/bg are equal when we override with one of the special + * attribute colors. + */ +CellColor +makeColorPair(XtermWidget xw) +{ + CellColor result; + +#if OPT_DIRECT_COLOR + result.fg = xw->cur_foreground; + result.bg = xw->cur_background; +#else + int fg = xw->cur_foreground; + int bg = xw->cur_background; + unsigned my_bg = okIndexedColor(bg) ? (unsigned) bg : 0; + unsigned my_fg = okIndexedColor(fg) ? (unsigned) fg : my_bg; + + result = (CellColor) (my_fg | (my_bg << COLOR_BITS)); +#endif + + return result; +} + +/* + * Using the "current" SGR background, clear a rectangle. + */ +void +ClearCurBackground(XtermWidget xw, + int top, + int left, + unsigned height, + unsigned width, + unsigned fw) +{ + TScreen *screen = TScreenOf(xw); + + TRACE(("ClearCurBackground %d,%d %dx%d with %d\n", + top, left, height, width, xw->cur_background)); + + assert((int) width > 0); + assert((left + (int) width) <= screen->max_col + 1); + assert((int) height <= screen->max_row + 1); + + if (VWindow(screen)) { + set_background(xw, xw->cur_background); + + xtermClear2(xw, + CursorX2(screen, left, fw), + CursorY2(screen, top), + (width * fw), + (height * (unsigned) FontHeight(screen))); + + set_background(xw, -1); + } +} +#endif /* OPT_ISO_COLORS */ + +Pixel +getXtermBackground(XtermWidget xw, unsigned attr_flags, int color) +{ + Pixel result = T_COLOR(TScreenOf(xw), TEXT_BG); + +#if OPT_ISO_COLORS + if (color >= 0) { + if_OPT_DIRECT_COLOR2_else(TScreenOf(xw), (attr_flags & ATR_DIRECT_BG), { + result = (Pixel) color; + }) if ((attr_flags & BG_COLOR) && (color < MAXCOLORS)) { + result = GET_COLOR_RES(xw, TScreenOf(xw)->Acolors[color]); + } + } +#else + (void) attr_flags; + (void) color; +#endif + return result; +} + +Pixel +getXtermForeground(XtermWidget xw, unsigned attr_flags, int color) +{ + Pixel result = T_COLOR(TScreenOf(xw), TEXT_FG); + +#if OPT_ISO_COLORS + if_OPT_DIRECT_COLOR2_else(TScreenOf(xw), (attr_flags & ATR_DIRECT_FG), { + result = (Pixel) color; + }) + if ((attr_flags & FG_COLOR) && + (color >= 0 && color < MAXCOLORS)) { + result = GET_COLOR_RES(xw, TScreenOf(xw)->Acolors[color]); + } +#else + (void) attr_flags; + (void) color; +#endif + +#if OPT_WIDE_ATTRS +#define DIM_IT(n) work.n = (unsigned short) ((2 * (unsigned)work.n) / 3) + if ((attr_flags & ATR_FAINT)) { + static Pixel last_in; + static Pixel last_out; + if ((result != last_in) + && ((color >= 0) + || (result != (Pixel) color))) { + XColor work; + work.pixel = result; + last_in = result; + if (XQueryColor(TScreenOf(xw)->display, xw->core.colormap, &work)) { + DIM_IT(red); + DIM_IT(green); + DIM_IT(blue); + if (allocateBestRGB(xw, &work)) { + result = work.pixel; + } + } + last_out = result; + } else { + result = last_out; + } + } +#endif + return result; +} + +/* + * Returns a single base character for the given cell. + */ +unsigned +getXtermCell(TScreen *screen, int row, int col) +{ + CLineData *ld = getLineData(screen, row); + + return ((ld && (col < (int) ld->lineSize)) + ? ld->charData[col] + : (unsigned) ' '); +} + +/* + * Sets a single base character for the given cell. + */ +void +putXtermCell(TScreen *screen, int row, int col, int ch) +{ + LineData *ld = getLineData(screen, row); + + if (ld && (col < (int) ld->lineSize)) { + ld->charData[col] = (CharData) ch; + if_OPT_WIDE_CHARS(screen, { + size_t off; + for_each_combData(off, ld) { + ld->combData[off][col] = 0; + } + }); + } +} + +#if OPT_WIDE_CHARS +/* + * Add a combining character for the given cell + */ +void +addXtermCombining(TScreen *screen, int row, int col, unsigned ch) +{ + if (ch != 0) { + LineData *ld = getLineData(screen, row); + size_t off; + + TRACE(("addXtermCombining %d,%d U+%04X (%d)\n", + row, col, ch, CharWidth(ch))); + + for_each_combData(off, ld) { + if (!ld->combData[off][col]) { + ld->combData[off][col] = (CharData) ch; + break; + } + } + } +} + +unsigned +getXtermCombining(TScreen *screen, int row, int col, int off) +{ + CLineData *ld = getLineData(screen, row); + return (ld->combSize ? ld->combData[off][col] : 0U); +} +#endif + +void +update_keyboard_type(void) +{ + update_delete_del(); + update_tcap_fkeys(); + update_old_fkeys(); + update_hp_fkeys(); + update_sco_fkeys(); + update_sun_fkeys(); + update_sun_kbd(); +} + +void +set_keyboard_type(XtermWidget xw, xtermKeyboardType type, Bool set) +{ + xtermKeyboardType save = xw->keyboard.type; + + TRACE(("set_keyboard_type(%s, %s) currently %s\n", + visibleKeyboardType(type), + BtoS(set), + visibleKeyboardType(xw->keyboard.type))); + if (set) { + xw->keyboard.type = type; + } else { + xw->keyboard.type = keyboardIsDefault; + } + + if (save != xw->keyboard.type) { + update_keyboard_type(); + } +} + +void +toggle_keyboard_type(XtermWidget xw, xtermKeyboardType type) +{ + xtermKeyboardType save = xw->keyboard.type; + + TRACE(("toggle_keyboard_type(%s) currently %s\n", + visibleKeyboardType(type), + visibleKeyboardType(xw->keyboard.type))); + if (xw->keyboard.type == type) { + xw->keyboard.type = keyboardIsDefault; + } else { + xw->keyboard.type = type; + } + + if (save != xw->keyboard.type) { + update_keyboard_type(); + } +} + +const char * +visibleKeyboardType(xtermKeyboardType type) +{ + const char *result = "?"; + switch (type) { + CASETYPE(keyboardIsLegacy); /* bogus vt220 codes for F1-F4, etc. */ + CASETYPE(keyboardIsDefault); + CASETYPE(keyboardIsHP); + CASETYPE(keyboardIsSCO); + CASETYPE(keyboardIsSun); + CASETYPE(keyboardIsTermcap); + CASETYPE(keyboardIsVT220); + } + return result; +} + +static void +init_keyboard_type(XtermWidget xw, xtermKeyboardType type, Bool set) +{ + TRACE(("init_keyboard_type(%s, %s) currently %s\n", + visibleKeyboardType(type), + BtoS(set), + visibleKeyboardType(xw->keyboard.type))); + if (set) { + /* + * Check for conflicts, e.g., if someone asked for both Sun and HP + * function keys. + */ + if (guard_keyboard_type) { + xtermWarning("Conflicting keyboard type option (%s/%s)\n", + visibleKeyboardType(xw->keyboard.type), + visibleKeyboardType(type)); + } + xw->keyboard.type = type; + guard_keyboard_type = True; + update_keyboard_type(); + } +} + +/* + * If the keyboardType resource is set, use that, overriding the individual + * boolean resources for different keyboard types. + */ +void +decode_keyboard_type(XtermWidget xw, XTERM_RESOURCE * rp) +{ +#define DATA(n, t, f) { n, t, XtOffsetOf(XTERM_RESOURCE, f) } +#define FLAG(n) *(Boolean *)(((char *)rp) + table[n].offset) + static struct { + const char *name; + xtermKeyboardType type; + unsigned offset; + } table[] = { + DATA(NAME_OLD_KT, keyboardIsLegacy, oldKeyboard), +#if OPT_HP_FUNC_KEYS + DATA(NAME_HP_KT, keyboardIsHP, hpFunctionKeys), +#endif +#if OPT_SCO_FUNC_KEYS + DATA(NAME_SCO_KT, keyboardIsSCO, scoFunctionKeys), +#endif +#if OPT_SUN_FUNC_KEYS + DATA(NAME_SUN_KT, keyboardIsSun, sunFunctionKeys), +#endif +#if OPT_SUNPC_KBD + DATA(NAME_VT220_KT, keyboardIsVT220, sunKeyboard), +#endif +#if OPT_TCAP_FKEYS + DATA(NAME_TCAP_KT, keyboardIsTermcap, termcapKeys), +#endif + }; + Cardinal n; + TScreen *screen = TScreenOf(xw); + + TRACE(("decode_keyboard_type(%s)\n", rp->keyboardType)); + if (!x_strcasecmp(rp->keyboardType, "unknown")) { + /* + * Let the individual resources comprise the keyboard-type. + */ + for (n = 0; n < XtNumber(table); ++n) + init_keyboard_type(xw, table[n].type, FLAG(n)); + } else if (!x_strcasecmp(rp->keyboardType, "default")) { + /* + * Set the keyboard-type to the Sun/PC type, allowing modified + * function keys, etc. + */ + for (n = 0; n < XtNumber(table); ++n) + init_keyboard_type(xw, table[n].type, False); + } else { + Bool found = False; + + /* + * Special case: oldXtermFKeys should have been like the others. + */ + if (!x_strcasecmp(rp->keyboardType, NAME_OLD_KT)) { + TRACE(("special case, setting oldXtermFKeys\n")); + screen->old_fkeys = True; + screen->old_fkeys0 = True; + } + + /* + * Choose an individual keyboard type. + */ + for (n = 0; n < XtNumber(table); ++n) { + if (!x_strcasecmp(rp->keyboardType, table[n].name + 1)) { + FLAG(n) = True; + found = True; + } else { + FLAG(n) = False; + } + init_keyboard_type(xw, table[n].type, FLAG(n)); + } + if (!found) { + xtermWarning("KeyboardType resource \"%s\" not found\n", + rp->keyboardType); + } + } +#undef DATA +#undef FLAG +} + +#if OPT_WIDE_CHARS +#if defined(HAVE_WCHAR_H) && defined(HAVE_WCWIDTH) +/* + * If xterm is running in a UTF-8 locale, it is still possible to encounter + * old runtime configurations which yield incomplete or inaccurate data. + */ +static Bool +systemWcwidthOk(int samplesize, int samplepass) +{ + wchar_t n; + int oops = 0; + + for (n = 21; n <= 25; ++n) { + wchar_t code = (wchar_t) dec2ucs(NULL, (unsigned) n); + int system_code = wcwidth(code); + int intern_code = mk_wcwidth(code); + + /* + * Solaris 10 wcwidth() returns "2" for all of the line-drawing (page + * 0x2500) and most of the geometric shapes (a few are excluded, just + * to make it more difficult to use). Do a sanity check to avoid using + * it. + */ + if ((system_code < 0 && intern_code >= 1) + || (system_code >= 0 && intern_code != system_code)) { + TRACE(("systemWcwidthOk: broken system line-drawing wcwidth\n")); + oops += (samplepass + 1); + break; + } + } + + for (n = 0; n < (wchar_t) samplesize; ++n) { + int system_code = wcwidth(n); + int intern_code = mk_wcwidth(n); + + /* + * When this check was originally implemented, there were few if any + * libraries with full Unicode coverage. Time passes, and it is + * possible to make a full comparison of the BMP. There are some + * differences: mk_wcwidth() marks some codes as combining and some + * as single-width, differing from GNU libc. + */ + if ((system_code < 0 && intern_code >= 1) + || (system_code >= 0 && intern_code != system_code)) { + TRACE((".. width(U+%04X) = %d, expected %d\n", + (unsigned) n, system_code, intern_code)); + if (++oops > samplepass) + break; + } + } + TRACE(("systemWcwidthOk: %d/%d mismatches, allowed %d\n", + oops, (int) n, samplepass)); + return (oops <= samplepass); +} +#endif /* HAVE_WCWIDTH */ + +void +decode_wcwidth(XtermWidget xw) +{ + int mode = ((xw->misc.cjk_width ? 2 : 0) + + (xw->misc.mk_width ? 1 : 0) + + 1); + + switch (mode) { + default: +#if defined(HAVE_WCHAR_H) && defined(HAVE_WCWIDTH) + if (xtermEnvUTF8() && + systemWcwidthOk(xw->misc.mk_samplesize, xw->misc.mk_samplepass)) { + my_wcwidth = wcwidth; + TRACE(("using system wcwidth() function\n")); + break; + } +#endif + /* FALLTHRU */ + case 2: + my_wcwidth = &mk_wcwidth; + TRACE(("using MK wcwidth() function\n")); + break; + case 3: + /* FALLTHRU */ + case 4: + my_wcwidth = &mk_wcwidth_cjk; + TRACE(("using MK-CJK wcwidth() function\n")); + break; + } + + for (first_widechar = 128; first_widechar < 4500; ++first_widechar) { + if (my_wcwidth((wchar_t) first_widechar) > 1) { + TRACE(("first_widechar %#x\n", first_widechar)); + break; + } + } +} +#endif + +/* + * Extend a (normally) boolean resource value by checking for additional values + * which will be mapped into true/false. + */ +int +extendedBoolean(const char *value, const FlagList * table, Cardinal limit) +{ + int result = -1; + long check; + char *next; + Cardinal n; + + if ((x_strcasecmp(value, "true") == 0) + || (x_strcasecmp(value, "yes") == 0) + || (x_strcasecmp(value, "on") == 0)) { + result = True; + } else if ((x_strcasecmp(value, "false") == 0) + || (x_strcasecmp(value, "no") == 0) + || (x_strcasecmp(value, "off") == 0)) { + result = False; + } else if ((check = strtol(value, &next, 0)) >= 0 && FullS2L(value, next)) { + if (check >= (long) limit) /* i.e., past False=0, True=1 */ + check = True; + result = (int) check; + } else { + for (n = 0; n < limit - 2; ++n) { + if (table[n].name == NULL) { + break; + } else if (x_strcasecmp(value, table[n].name) == 0) { + result = table[n].code; + break; + } + } + } + + if (result < 0) { + xtermWarning("Unrecognized keyword: %s\n", value); + result = False; + } + + TRACE(("extendedBoolean(%s) = %d\n", value, result)); + return result; +} + +/* + * Something like round() from math library, but round() is less widely-used + * than xterm. Also, there are no negative numbers to complicate this. + */ +int +dimRound(double value) +{ + int result = (int) value; + if (result < value) + ++result; + return result; +} + +/* + * Find the geometry of the specified Xinerama screen + */ +static void +find_xinerama_screen(Display *display, int screen, struct Xinerama_geometry *ret) +{ +#ifdef HAVE_X11_EXTENSIONS_XINERAMA_H + XineramaScreenInfo *screens; + int nb_screens; + + if (screen == -1) /* already inited */ + return; + screens = XineramaQueryScreens(display, &nb_screens); + if (screen >= nb_screens) { + xtermWarning("Xinerama screen %d does not exist\n", screen); + return; + } + if (screen == -2) { + int ptr_x, ptr_y; + int dummy_int, i; + unsigned dummy_uint; + Window dummy_win; + if (nb_screens == 0) + return; + XQueryPointer(display, DefaultRootWindow(display), + &dummy_win, &dummy_win, + &ptr_x, &ptr_y, + &dummy_int, &dummy_int, &dummy_uint); + for (i = 0; i < nb_screens; i++) { + if ((ptr_x - screens[i].x_org) < screens[i].width && + (ptr_y - screens[i].y_org) < screens[i].height) { + screen = i; + break; + } + } + if (screen < 0) { + xtermWarning("Mouse not in any Xinerama screen, using 0\n"); + screen = 0; + } + } + ret->scr_x = screens[screen].x_org; + ret->scr_y = screens[screen].y_org; + ret->scr_w = screens[screen].width; + ret->scr_h = screens[screen].height; +#else /* HAVE_X11_EXTENSIONS_XINERAMA_H */ + (void) display; + (void) ret; + if (screen > 0) + xtermWarning("Xinerama support not enabled\n"); +#endif /* HAVE_X11_EXTENSIONS_XINERAMA_H */ +} + +/* + * Parse the screen code after the @ in a geometry string. + */ +static void +parse_xinerama_screen(Display *display, const char *str, struct Xinerama_geometry *ret) +{ + int screen = -1; + char *end; + + if (*str == 'g') { + screen = -1; + str++; + } else if (*str == 'c') { + screen = -2; + str++; + } else { + long s = strtol(str, &end, 0); + if (FullS2L(str, end) && ((int) s >= 0)) { + screen = (int) s; + str = end; + } + } + if (*str) { + xtermWarning("invalid Xinerama specification '%s'\n", str); + return; + } + if (screen == -1) /* already done */ + return; + find_xinerama_screen(display, screen, ret); +} + +/* + * Parse a geometry string with extra Xinerama specification: + * x++@. + */ +int +XParseXineramaGeometry(Display *display, char *parsestring, struct Xinerama_geometry *ret) +{ + char *at, buf[128]; + + ret->scr_x = 0; + ret->scr_y = 0; + ret->scr_w = DisplayWidth(display, DefaultScreen(display)); + ret->scr_h = DisplayHeight(display, DefaultScreen(display)); + at = strchr(parsestring, '@'); + if (at != NULL && (size_t) (at - parsestring) < sizeof(buf) - 1) { + memcpy(buf, parsestring, (size_t) (at - parsestring)); + buf[at - parsestring] = 0; + parsestring = buf; + parse_xinerama_screen(display, at + 1, ret); + } + return XParseGeometry(parsestring, &ret->x, &ret->y, &ret->w, &ret->h); +} + +#if USE_DOUBLE_BUFFER +Window +VDrawable(TScreen *screen) +{ + screen->needSwap = 1; + return WhichVWin(screen)->drawable; +} +#endif + +#if OPT_RENDERFONT +#ifndef discardRenderDraw +void +discardRenderDraw(TScreen *screen) +{ + if ( +#if USE_DOUBLE_BUFFER + resource.buffered && +#endif + screen->renderDraw) { + XftDrawDestroy(screen->renderDraw); + screen->renderDraw = NULL; + } +} +#endif +#endif /* OPT_RENDERFONT */ + +char * +xtermSetLocale(int category, String after) +{ + char *before = x_strdup(setlocale(category, 0)); + + (void) setlocale(category, after); + TRACE(("before setlocale :%s\n", NonNull(before))); + TRACE(("updated locale :%s\n", NonNull(setlocale(category, 0)))); + return before; +} + +void +xtermResetLocale(int category, char *before) +{ + (void) setlocale(category, before); + free(before); + TRACE(("restored locale :%s\n", NonNull(setlocale(category, 0)))); +} diff --git a/ports/xterm/xterm-359/util.o b/ports/xterm/xterm-359/util.o new file mode 100644 index 0000000000000000000000000000000000000000..3b496b5b480d7219443cb819873c45ac3803e062 GIT binary patch literal 326400 zcmcG%3wTuJwKtxDL8C@@q-l+cHR{x61eF|V%M`5Hut)ajps|3WqSAwNfC`%YQ$%}*^WOC1OnUh3tkzU=I>ua(8D zPh!?V)4rqJw0~M|Mh+*Bk7jd;@{QW*DHfabq4wi|p{*WQW!k6MXpwP~}2Gb+;foxVPH-;FNpEPG6E3`BNni%&zsIA_!aaqHbY zJ2OG6*Q43@=dWh{OA1w!e`Z_N?ZHS5O8LXdUOcF*toN% zcj%G!xj*5sf+ojiZ3ek2t$!5gp*y2a_mS(3Z@6I{_LIB;RVi|N! z9(fnTR--d)VNMyO=A4Aax)y4y<_tEoeThwRV56pPi)l~ps4>$mfpP6YFatO!@=5YN z)vyWNRn~1$^UN>T9{d--SeH8+Ju5nS?P{67B8hERvm)r>*ZYF@>$YJ2m*jujZ}>g; zDgR{ktF8nsV75kpM^G)Kjq{02p$s`@G*;q11IOwoxSN?MK+)KDib?dRLgvbzj}8j zv=gsEE&DcJ!G7zBo5Bn`#k9u^Ow_WR?HJD(fxEtY^Pt3;Z1;5m;Uqr3Azfs5qM%PN zCM(Eh@o^wzlb9%wC5|gVmAH_dli3Oo)p`&yvFj}D^fK$cLSEdTBA6hc2O+QP_S0Nc z05CGf!KE#p?X_4)bjd&*pZi;Im=8bSUoCkbh?c}xy>xIy#+6#DuzPK4 z?Lgd`skI8T$8@KK+KF!(*6#H~O0iHAv*(pT%s`8&9ECRzYhWYhGcQPJP;Owp-~Uxd z_HP`~|G%)Mqt&>4@@bi0A;Is4nUd2rLd`p1fR&E&(C*3Y4d^t2M33p^>J2 zPw0M0iHB+osK4s$`^jnmH_Na(eYS)&SL2J@--=nEMXhJ!P^(k(uR*#{WtPY6h2bBJF0JQ1Oz#=0w$#jAb*1gXzDz(*sZ6=;3ca1LSgQ&K0Z_EiENN*k#4SY1y z7<@};a(h_~+JWUWD~LZ0N10W_n`~8d=Mn2#(a#pD)ldNAs!ibExz( zZRsg|aiXbo@9EmYzsgG@6wqaU&uoU+A7m5dQi6j zhBfCXZIuzaG7jxh6N@~T_*WBJJo7j7keVBs1iAJHJYs-XSPff$DC0I^l*m( zqL`+2fYN?s90t#5(_XV52#P}$)+;uIRZt&?QWeJrLjeSdBSb z0e*=*oj6W)nmvq8*&W1FS$ff&^C5QKp(tOz?1$+}A)3Em8 zr=ILHy6?+qlWHY28UWR2bA-#(tu}2@1}*o)mvva-N!M0>G;?qQ)Fh&2TC;j29-u(F^qr(U=z|@*< z8i~5LyluQQ>TFj>v1Y47@CtNKbShdD>cbsz3yN2e?BTaRiuQ^2OQEr{IH)q!36d|$ zUrDB4AC7FrfV|cP5y^-Ge00j_~Ab-1!zPvbeqF9WAN!KZ?3Tn3GjdAes>p#` zgD{yl(_T-vR;PO_lbtd9vHMX!X0N09ZCblcYgkAPdd6lDu^bbw9=yHDYADxMPYzX> z7Uo<-#S`eM4-Y3;d0SvH?`BEos(=(0Xsm`x@qQHyXy$vFX-;%txydu1d8TX-U3Y zpXt^z?|{UXRB>Oyql{~2k-4FNC=X+pbJlivA=bzGF~ItjFl=M?zl$&&SC#G^q%EOT zi)Q=89JS|F!8NPawdk{uz{Ai)rE_^-`jbK0!UHH~STEQ0S%>vw{~l?8Fv?y``ICBL zG+xRQKQ!&*@mp4xOFjPP&3H%#;rP|+_Ah(E=rQ{VN{PB|!Zl1^Lk^8&hE@hTW+LTG z(}8@a_^h$VRq*$0dt7(p^F7jELup+*XQP)4cOf1s*A_>SH{Pi@bpr>jNA}M>F_0@_G4lj? z0adrKI{xpd>;6#JuKC5Hk!5KAoGk~nX~Kl6(WxEy_1;Gy@0{&3wez>KdcAg6TeL10 zI6#1q@eDFrbnUL35onv}{2~Q$8jrMUnH2!S{%*}oZ6!E3aL}-xX$RJkSQdVUq&Pe9 zqF}u~)0Y?*c+s#rbZzx>kcHDiXNR{z{tX*sXhw&%UmyMpQua4`&!^cPiIWU#r?tH$ zf4UKV*$C|1-W%DbP23uO#zQ)y1f;Mcy!EG>nyPi)M+-3To1Ful0&hAuCzF&mg%z2G*Z5t@o%nV4nfc!I-^@ql#NS{bU$4 ziHy&lG}W~0DKtCJ|)TLwJhT?b1{0DTtttX}|kM9y@SW zk>Blx>hN|G{E}IQe7nA8CJ=c`XgVcFpvAO4m0^QZu>rbE*j5X-|Xm*#DJrA$c)l@CMJgH+E)Qe$lD?z!g-LuiYbXrtf zwJTyyn_r_^;+Wsh(S_wI$(wd64nWC2gvzjF%g96+@G=1 z5_(tqTEbUsTU+`ZQoEj**^E9!SgSlOb0O+@Xd_PG;FCEghpIeODAd>u6?Q#DZ7Eua zI3=F@A!q6}1g1i8w^sEn^SgeU`#t0deoHiBv+o~>b5Nby zFm-|;{+3Wf;#hVxH44cy^b7b}TiFq{p3$x6IpggnHOD`0++7CGE9%6L=`)?B=x&WqfL7)`9q6sC$bFdK+B=QdUzXnTW=77 z=J5vwS%u!SsjQqz@@~>1{q`U&GZ`bU%SGX!I1Bppa61gf^k)IDRkTvZ01=FrEG2#o`;KWe@Mi%4`--XVDfksSh#Gcp z#;dYd;YuUq$$sPZpUW}Vv)yw}O>KDRER4Z!T7&3ka@vZ@M0w-kAP_Nsx@kvYREZ>l zz~rPg?T1&OuwcTIN2LWudKr%iMbeufgZCjM=f@SgH`OHWi_h58^(O_7IfH>bvt`c^ z(|Pn8qaj44e$3j`m7!c^m`BO<@{}m%vg8Qs!3MzACOT4u$D~g253mHsTe?giK1yo> zxV{9p_Lqol@NL|YW(xLedM(@b>ey+%c(T8LJ=6IHTWyX*C@YJ>6K(GG#C5@+_R4j= z6YH_Q=6s9&Cc`8cO)cx3zhtB}HY^F^3l)#i+i&ZPm^=?fc2 zGhm(gi8-S+-4$pYyHH-gJu&-s0uC#bWA^>TVCy=F{9NQ^9e&EShL!Uoxe~{P$>H48 z$4}x(a;XRpsFgcDUbc^8Z*HBdrVG@A^;ZKkMbLlUUwN=YwfCpy1H5L~nM> z0@wW^9!lkrVK1$a`P5X2ANO+#xFR)S{|mdMb2nbt0rKBoSO+OELD8QO{_`A&93;;u zU)E7;G8R&;t!la-JebKPYX(ki-=DUs1=VJT_C#Xv;p4%iY1yT`)^lb4CY@uGvyt!Sn_9@yvga0sf%Yr#uV z5}eSAWGT^nYCgv;%;%!ngQu7?_N1==@W*3Pr=k#gH?3DZnBIsvQv!q|pqlT>*5y2e zN(m*zUIs0iQyYk}vgFa8Kc`^t5~Fo8ioBeqO>h5O@Rls%nNw; z9Y52Vqoj(8?`xU=Vy1_GHSPPOQ_K7bC4lvb;htEeEip810dW|jiuq@A$!V85qsGQ9 zh1S&12cd9VVr<-*F~~0@1lb=C=gmm#t!J9yZES0Ms4%!iWG4E=y-t)2k%><$mN zo-{^KNOW#{ldnKw_EpC1sng^3tXXhgt0%&6%Ctj%8gMi#tQRI)`zBhinQB5Hd`r*5 zHY-w3h$|Vj_9TPG;MujXL-fdA$Ps50qC}#Oqmhra#T(JmM5}9}^|^tVPK7S!CRFq% zh!D|^Z=i;(iCWuaG&kr|G4lS4K`9WaObbu27Qws1D0$bTnAmdZzJrBdvf|28>5+Bi663^2yAj~ z@rN9Fc)xCK^z;_3E{sSty>Dk^mZOy7)P|{1>t%$6(84fS265{!EDo$w$#AIury(5% zQ7u=nLecOmFpTEcvThWy1g?o4U{$Z>xb+@ekjnbi`ZdU^(IcBQXAdTkZo&3=CmQbb zpeb4!9h03UPz!(mbC>q|%tYM@CFaom*q%amu z3!Tqy(7d1q0RkciU3%a*6gs>5dP7@<;(}ZETNtzSrx3dnKAPp;j4tCLIB?(;pCbCT z`t=?;Kp6K2em!;rnv;E^;Sb$1Kb=&oW;2!WYNB;J+^M2qh4@jc1%|$1ZD&Uy6gu*# zegpzJ1-v1EG?)Z38QcR15Gp*$e1+L5%Vb6Kcq!Zycxlh>}V)dy!e5n;0G z){D{MkMTthZyN6mI|`)Ioe>qrG5hCKB5X%{F7l&t&3PF#SP$qCDci?6!TC`R<__lX z`|~@wH&Y$JNRvKfCPh+h2pPCOXe#JnEa9@Qou2y8YY zFX+HcH1O2LPSv1jn zB?ebBQS_PsFnoD0{%R{`)IJ zK+!yWqQps2Fco4Mj4ZgY-oBf^9&=WrcHTPi#%A=F__<+EVEdh_<-zw-D696da<$ER zeeiOoU^1QE^#_kHol&P^*%F?_U_hwy0c7CC0l=vowhb5qIW#fTy-p!B17JaKhfSjm zmLVL0tpkQg5CU7f8WsN0iRuDaQGlXiM*$f=tmw^kG1zAAB_dbrQxJ6)W|SRRA7Y6G zc!3<0uz|AMQyWBG*;iCyR6nV;@2J+DSilIkXe+ns)~8r{eHCj>7a>BI_%`e_ZDlXp z7%VyrP&{X-(Gp+;>7v-)(+jLOFyg&Kw+`exp*5#olUg_41VD+19(dJ=yfv>b?);TZ zq{hd+OG@C=RtEi!wO;oPZ)`t8h2*OcWCi+dESY_j_t_l_f}FpQ!)hN=&i#af+Lw3K z*O;HW)vZs7TAPa~frrh}*sF6lfrq0XKwc^xtoV=|q_Cu|{D*xd7Iap=iZLI;?~758 zw$(#ka`51bYn@SpeV7R=p4WrseZK0@Z*bpv-?Mu-_u|fKB0w}0sRKA*x-2Ds8#dxr zFc$*}+Yq~xC`9!#`#!RZkGZ-&*)gyYoI?{7_7zMkfk9Rx zXjhiIf8_jfj6k0e*lmP&LgFpqdOt)XLX5EKx-JAC>elA*&g4qWqSvF=CLqsxN$+_z z3R}D<3e;oqZjW~POGY>c)Ie3Cop2lMEA8?<{SfjEOr3v<5W#5`n9O~X>|Th6q0_F% z00-hcGD7Xn98AcdI}}C5KC+&28&SibA22ph19!7=k>@_@X_9c z-LG3)quOPikv44!BVBQz@EOkdfMJ_eARBD* zXt-CAEqA1IGh{CARl7iT0OSU~nB_u2Pye%s4A;o7oKK?&d|1z5o{uYyI4$nLrIwlF+6 zE4!Fg#LhMx<4Xaq`tCLzi4$X|thDIO3Du;DnUOs6TJ%=eT?_};EA8ywP8taR+m9)} zH>;fZmk<-$hsonyj2XWtza1;xsgq@JCUj=hoq?tr8uwtM#l!2+l zHL8`c8T_GK3~0uhyBTR(gU3Wg=gRzb@3_AFERFYZ)~ zLr+nwXQK5CES2jD`YCRGh|N%4U-svtp5BC*(#AnXA$_L8xG0rBJAK$wTd zOb*jd##1ubheSryLriy~^@+}?i)o_QmrZag#!_Eco!m(qaY#1tQ{ko8YxlNMa#q)C ztH7^7M$4X~^RGa*17g7;1u0Y=%4$txfKJ%XG3#}g-ik*@xbcWR?1!@shWAYa_q!Af zG7jkrE$83D&NFF~mS-6GK4pr7kRa^|9LTErK{0zdO`lvI%Yc_uC5~QEksKTiY%$Z{ z2KNb*Xqnvv6>hrKDPAdp6X7E#4ZgjTKVj>tA>VnDY#2>cF= z-F+QWt)DCW?&t=W%_syx_iQS+47X zgDW9PWg1H~-zB$^PWg?P%|y+ENbvTbC&vwJV<9pjS|WcW88K`$#33k)la1GHxenvt zj&FA;$I=XqNuaqE0Xw*Ni|99Ohd_Jc2`g+u0!V9=hVHQ|LOOzYix+^(vj6Qp*<7we zwC2}=isEfZ73eMdF*fgN!V!2|Ey%vwUM6H9YLzppr@lYvaB8iXvRc*# z-rCYih^Ix+48$y58mgM24FdInzSv$ZHr0?c1R=FnPC6v7vTgQQ*DX|d!(K+f#yP<= zB54kcRN-WDK-GSrWRk#?8U~|p9<=TaKK=~*5upuZD|;|rx=WT5z^KCl)3BYcI00} zZr6I!RWR*7fZ6DgI)l-x9dRURxxJFYGW~fVc|zoc#Ify7zU=hJWIf0f;1s?)r%C<+lG62P!mlivoialz_;2)I!a8pmX4?b9ewiKOS4Ed7DGH;&0N zZ^1OvcBr?^h$G6iG8+B}vsx)w?kA)%@2SS9wbxgUVHkb{MvuU^nedjkQhAjN*^HKw@JpDmskLsJ-qQpn#H zvU#?YL;&5ddr3PH7G;;0;a$m(xbql=g})eM%Bq}}ITr<@;dcthaaIB#ZPoZePzs6i z6$mKMzOWzjroO@Xw6Evo;maiv3iCL5{(Z&|BU=ovy|9&jGZoI8**ASu67yEx5B;fGqOcg>@;JD#PXPM+&$Pge z;eV#-OoOGswcKCi9qR&vi<9cPRu8~WwI89ykxt);zk#;&0vNvmo+B~2RutKbNEJz~ zYnSacBWdB?>| zleCu+P7X5YHC&whl` z!2m|^V;!u?yM`Wyw!B4;^ww*4wx99IG5g^XW?B-*K-6j(llY|?!1@-97HEh!@{c1{!PvqQ z+J%1j5Zp~JhdqJBsCW#YV1l3u(8OBHFgM&K$n^XSh0A56sBLppk!=gkaS~rfkbK^m z;rtjO@Z69kG;dFDLOK3(#a=tTEV6yUurW57U_QK3Isd|(AJ_|!`iAkB-FMovED6nCZ{C;4W~_^_Hj%{Q8_p4^)P!gdUXF2bwq!# zUw5nkA@%{^6^q*nKuS>PBy@;X1n7f?9l!)Rg0n(}9 zz>ncpB@ZL7XcxcY`F_@`N~O&oL(eaB8;LOhk~c672uXh}gt#4hkoMW#?0wWTiO2tm zj!E1zP`@aF4ng88jw*N_*hK!clI~9{>28aT@ft2}NVuAn%>UkVF-q(CUd&f8z;Ij9 ziP=HeKY9-w_nB~Wii7gC9A+@xhw#DtP;gP#Qk-F=wqsmv57bNCp_{948mHTb?EwDn z6K**!2R@F0Q-^i?Pv+i?$|PIe78FJOLOq1O-qjgPv_27c25sxUvPJmy~ zW?Y{!Y>B*j{LcV&rD6YeI!bfnY9LOGWsAu#`~{_ti-AHCb`Y)S_E3p&LL+0Sqs%@(Pp6d(iP;g^IC zkbKuzGBErhN1@}@}TJAr4Jy(UPkPYF>XdR zh}V&*2U*JvwQmew#(sr@E*CeTFAX&&aqze=A$uFRf^^8v!Gqs)_J??Jcj1rkuUp>k zb43lTTYdpSmi!nMJb(eZ=)%j1Xt5&{rK(zpc*3kZQAnOcwwMjr`hl~(2y2#@4P(Tc zz@9rSQj6Kp2eScd;6<~+S8zopprl$tbr(hJ_Nb5wbW6DOkYC!}fqX3dDQUb`r1527 z&~j_*a6wpiTAjAf3OyfT0jwG?q5ZCE0gsVqw54kxha=D891GUNlpY(ql7Uf>@)azPo*xdE);8AgxL5aKQlTeuH;YPwfw5e~ST%@T+WAK|vwioB#X7z;kkxDd4Xc!_{k8GP;sfV%EphH_S z4(U?nkhY`^lO*uo7_q*zrM1ji#&+7%PvS5C$te-qono7L=8Up!)I8%+bFoX=5!M8j zlH0J%=y&%VUfuPD@mVtSixb`b5=K*K-w0r_XK%PixBd|gKNoez4yS$j3&7>X!+qgH z;RD*D1l|G&6@{O2Z^EO;AEeT4=tVIs#=rC$ypfHkv+rg==3I#Dr826Qo>Qtt#}Frz*iOSO+`3M#}f>>Es_Hm z?X~o-B5RcdeG$p-DT;qCsiM3Pp@fyOehj=15R-AGH+M2B746R~VjKRpjX4#b1uOe= z(`#vYmLoJ>UWThGiRQMt#n*SmEjn_Don>t(Uqu!cP5US`eP z!lh=lW0Y!qk6LoTR+Lw<>mJ7Lap}JO7FSzNGZ$`;)?8eRa9Y& zBT=Qh#yApHT53Dfk#AUk6&k>#;2FPgs~2o?t_ff<_p%RRO8If8GqJq^HJr&u^@X>N zSx%8N_k?f<>~B12OYWn%T_=uwe;*-n355JX$NHYknsP!&|)0Q8*2MP z@^u1-ci1L(j1>#wJAesJw(jV1AoK&V^oF@gym8hj!Yi{LD=wI`$Z^j^FSguv!=Q+AMi9@1 z?}CP5(5Op!R2)Q+=Eyh*0aAf8HMSB^*m1MKpt|SCGOr>L8!u?>!DFGdw{P(Bg0-jM zIu&sF_8axNtTachw?G}G&mC5Xv}j9aqofh&6cLM-NRjeL2k8O=b5}!!RkBP?aw&<0 zC4YAm>N1{-T0WXo_m=?AP~sWFU*NGhm)VX)H5{@^VmkB)$o#gpR7YtyrK%vumVAtm z;R3b7;!&6wXJKU@9NDk5_90}toG`Z?nhM^2jli4OLV*a$i5ROT8J4hq*FX9-lR-!TY%e69J(DN(5W&H$gmu4)oQ9={RONQJ^gzCPhV<7?B;? z(h8YF6dK%}x%hM74VNb^{aEm)M9LpUq`-qY6?1+-Na0#fij2b?rU(glM0)35toF0O zr=%>wH42g3f`7rbBV@KO2=iBua?w`KCk%*t`Pv0cv=nN9|Gw{l$I;gr7S=?{auOEW6&7}b*@|lth_iYVW z2&(t?pXkD=G>I8j<2*&kLv7rEsBY_e2lItHTcE{Y8sGn@KR?yn#93`@;#M(AZ*HDi zmm71h*aY6xe48Q4y%M5SQxnR2-xp3z#fKcz3N>ska}k{$k?01DOfHP>^W-V^4a@GG zPMlfR!_T12z%$q~rH2nfoI>USjXNPKzuXtzk3GF2D-G)vY$5r)=jHs=muWcl!C#P$ z;3CjN^CY~YSy#lpMZOIuoIIyh8YvKy`OwvEhoux9%3U@c1-n_4>od!FH;e2PNY zWy;2U*$f*>)mVud+R`o30NU%6hrYSn5b>atL&PJA=!Yzg(&x^c1pjP3P*PY=gZILQ zMI-+m9eE3Bwy0A~Fz2Sgm+cunAh6JqbVK;(nb}oAl9nQbP2U3^b)6?K{tk=z@Cv8=HH}>gBc5SxnCOcxlyjO@$+yfi;U#X zlOh>`LQQ^I=5aRxKEJGDNOzl1xj?@#w@xUu7}z3Zy*B_k3T`e%;yw+`3|p3~uwKLk zO6v{h5@3kiy>LszThAj~hUtC_C4Kr9`d3-JC#b|=nAwcw@SM7WLd`D|?Ax+?h-u$> zQXaI$*~DjHXSP1Kn|ItDv&~F@a%^&!breL58n1UUrVe*>XsgXi+-zAt)a~gY04XA5 zidO*375&O6Jjv!Wh)e{EB`&NK*>&Ey>H|u)7o}%0-Yc8Y%I*7Tu)t>$fn;x>d0<37 zTreaWIgE8C*;`O@y`hv{$$1KJj4^Uu<=mI?AnwsNYbmqf{=ny&;OnbY-c)xS4)un?il`tRy<7X^CDcF(Vng>T>gEujwi7x}~Lw)lSLQT9^W zZ*Di(NYQKHenqw4NEL&nGcwY$U|K{j%G5gMGMh*Cwd|G5OeI1wxCixSWO)bP6JIecdGHF$z_jQq-J1rff(&=alzsE8pHgYA*oS!moViu(`cb{sGHe=c zPsV{bYq^O=Wh0iySKj7#xy0qLa4{k;e;U{_@xqqD)y2l$(IxT?Ck|>^Xv|U~Udzq` zCz38&W&xh!_H7`|T|%130WC94ax>TizM8eP6X%fQ?Y=|bTnZXMtjbQ;}~iT5V}30Q+kaxF+99Ru>x3rWCq zX_Al$rr5*Kpzgop56%bwZ??Z4Sb)mdm(Q+)`X*1Lw9F6L**N?W`_j7z%oa9#oI{yt zXBPogq`HQH1^VFHpcMjyz!i6JBv^p+po-hs8q9S8E;b`e z;II)>;KSWigf2EX%O(jOj& zg2ugfV@%rm`)a^QC4x@fN``yEHoSHg3dEgTLKQg4P=RM`<+~*`Qp-{t#c;@t(<~Or zggAeaI9HkpmE$R9sg#(rIK=Bc<(e;Ybj-Ok)QKwjTmQ)LJ}&=Ksf$DOCYW1~-~1Hh zLaJ2YgxzRtfd>JC03ul5T(`@!1MDdvLlXBvAjs+~zVxRjB=?x<&6Tmp`^gt#&O;#{ zysXA_i;6I-W93Jl03sHnO<>TU*Lsr@hioVB*mo|5_xy)4oXh=&KY@9 ztNBL@>@*K8(2ma1o{`D zT!}FLIsn1RL(;h@GB@Hfo$4TIc^9u}DbOMR+8+i`rFw{>%4n3%Z$Pel^gwa;Q^*7# z8uuE!h?HQ;4G5XatwE-J8u}MLsuW_xY+M^k&av+diBz!DO69DTS#0ft@*ywH0yBsl zkj>GL}3ekiHvpP+E zI53;;z3%oeIZZWzzCKUBtU;NwjaF}|Y!Q5U=ik(6=tkVyRaS-z#{kk1mc(GjK3O0EX36#&=Gt?H;!gq#pNNLZ6 z?#B=R;YL^lLvUIVZH<`71=*L5hxeC}axv@Uxbs`NK+1lQW?kGG7IMtb8b86Z*#ayy zcmAjhyPoetki8xkeAZ`rv}_(cpZWxWi63ARco+TJi$iPJSC;peVGPZl)~GSZjDVT& zZKQU$RpLULL9CKQE?lD@;04kQv5Xr-wFGPrTIS84xJ)Iukb|n!?eC1akfTt}&QB}U zJ*Y^=5`WD3QLqsci*0352G4A_>7}m%1~h|N(T*!ykE+d}?N%g?1<;4^8%0E^ZkHT% z$3_~t#SVynQc%iZHO#@Wq5PbOA#CL`i?N}JxFyhAePoTs#e(-TTskLQD%XS=;hoqX zXhv?~Ex4y*C^72;cMRZz-P9jViE{^Di;T;=+9*Jr^qM+FPldUxms&HP{89;oV}R$S z7y0NV`p~KNOZ!V$RDlVhWgGDXC!N=2+4WP6K(DuP61k(bOoa5Y(>uZ2L~son7#T@- z;#FJtgOeCD!j6Y4&txIc0kOkSU)}q-$bnJ&deWu_E66eIymKZm490P#oCy{(trxnc z$-FS_U?>)mv;117=NLM9cZNCuv}_LPMndDKib#LKGXhNAN^iwxY~l`99;K;YG$&BM zXk;wCIS74)`-6`K_3i6e5j7Lo!L(rxh95{)_)R^F5@Wiw5;`L3uMs>e8{a`#)lce4}E>66Km!67_z_#P@>xW#_ zH8BwEvr>BkS~i8w^e2c-eS`dM{7g{0Tcwpd)I0&c9Ox1X!+I37~;9pjFG{jwiqTcCtZoVprG0c<;%m znFbq6%LX8(ac}1c?8WPMzs%A*z_8#=xhG~KZ!xuLX0rFqtG|-1v&ZvlK4+V-YwY76?YyLNkP%Zi`n;}I)H2WGNGpyLt8*F?ne3m zueIF${%>Cck*rNcdz1GdP?Q%mo0dH>1WGqWj5UCu?+l#A!lAI9{FP{-P*v4p^7;Q+XqYX+EzN}PW{Y)Ri(VZq>-Y_y zRA{&-zyE$ZQ>uyy>*QgAZed5af2V0_5<8eBM8(Go)}bUs{K{dRGZ>07cr<=0c{5Wz zCexDVYmk8oBTXk0+J?fSd9X~6d5A1I*=_Qd-7mr~1>AH_r3QBwUW@c=RJWKnO*;;x zh{6!~s@C)uR^VjoNza9Vf_(tJG#-2eCQ9L*|J03^l&2AV*g{);C-@pSD&d}TG~{u$ zVLwRSkFy9ft!3&7cSA4BAk7>@r+XjNj$Myyl5mj(-M{JBJPLooo*QaVN{R=9*qhg2 z8gYn#F?c!-N=nQ8R7*_^+qL2VVx*S&aV3j_X>on|2r%E1p%f}do!bNB>=A3Uj0T!B zAE6(N4!btuS~TyCdLc6vHg0=}_oI&xD{qk+vil>5X7aC{rp(5EkMFRd8o6MR;%)I@ zbe*2l08BOF(XeNSxPp{T;3c&-g*srrAK=B41x&EMFJ^ zi8q>;n{jBo{nWhJ9=k&KEr#C!i+n*1t?8*CUYrS?p0-N&Uavb%(=oJq?bn;ry*I#J zJZ3Y_Q@+oT$qkU%rX397cmz!*Epw%)TzqI|J(}_C*7Tf8e8BFL`)a#Qt zLF>y~fDhixeugw!(#x5rp{kP}`3=MlX1qHtHMgb~#fGCx0(JAr1A2NKC>qccS|(5z z4J`T>$clkQc?G5dq;g>KpP^+P-w_x#6`&~n=Ghop<^s&tpn;B3=*aZ!w^GK}R?eyl+!CrK!;g$wAAv*aAzsU1TVN@+4V!;&gsrx8 z7os819wUXl4M-feXGHdB&J>|EE>kdPw4uv-oci!hKiICO6KtYgG?Fq!wiS+p<{e;R z{4ALGD$fg1zrdJOSBMpWt@;zEmRR0mDQACy9Zc?pI0&ThS`gWh*R;&Lzn6 zP{-T0e04*!6jEywKxaRG50E`MB=H}1$au(+oszglO1iKZr`LUM9ZKJx0XAECDIpAF96RbNn4r%cKCWk6WMmdQ55XxH1oLQN4(f{$D_Wp>Z_2 zl9kh6mP2HVOuZIQs`nv46`g>3K^AwW)O+)0ij*mtkuyZma58^UrQ!@4Hn8Gfq+)v3 zH_1fHIHTjv+NpSRvna|qD-prl#qSKI0FMWXdP(?=^9k)s$ggz9HZu%qfGq_H8 zKUm1H`V_$oOrj37U~Q&lzq|#S*iq@%7)?;{GXDWV%M)J4?7l2W`B=PaHQiae(^T)o&^BHy}kBMg9)-wMtR&W9H ziRoVmD5DTXq5S?A$iD)hk$y#2Nzr8jXszeRC^+RZ94&KcB?u+p9^-+FZ!n~PMzuxP zw#3Qt0PZ+}>{J5Ha7pMV_dTvUe_+w^{{(O?Q#P>p(jxGNJr3$Kr)B>LibIZ(@YqkQ za2Oj{aqO3UmM>5;j_Fh*a3yfwv;_S0KY=N6X1}6C&}`iK1DU!g4-nP?O9~qkzR!Jm z1D%W82R;(}X%@gJ$e&#z>%7m;#c|wvphC$$juNQqo{!9CD1j$2*zQdgTIM?d0MlnA zr9INHmuCkB0~9&cI=9Jwim5@vHT(Uei5mH&ljo#hP5`PSoT$VCJ5B!y z()cJH%W=scmwGx`8$w%ACBhSSE zfgTsw!Z1PZVJ{J-|^?&|C9pH<;XF+K2^`!+rcQ&@Kt zqX&}NSaeUQ30+9ngm@12XgB#NU=VtC{&#nCDt4kj+^#Yll^WRpobP&lf}0c~IPUzL z0JUVi`ZfBs7%)*c2PeQ(XKL8)?gAfpgcKtBebeA+l@!=LDS*hC(u^vlg+V@q`mD{a z&9(~nGZnbxfN;qGTlG~W`mVvk2|gd;9E$WN`uFjHskqO@JsXLNPr&n)7EC^Ouvjd> z-ZIg9);8=6$EiCg4d@S;`PqBnAbR$SvP6D@1Q~&>$A7UUaxd$b%IEJ_{j*BG+S4*O z4y;%s71JGzIy%c3wuL1kF-TxDGZF3^)B*L}I6T_*JkXQ<79J%|cpe@k=p%7Lcv$s_ z1WHhFqI2UyTuic);A185(}~tQxHy`dpfVs7o?v!ri6c2$cef;{MK-9b5vTx^@SL9;y5+p%u@IrYX9bE zU%mYVzeO#39Xv$YyA1I}GgNF+!tGJiQ%m3tz46^LiDCUK)K-y$5lO+(PkdTTg8v?S zGjdlN_kbvs9QI^NbjgHVsmEPIV*lL_hJoEztb*HraLowp)&Y%T(Hl8_xg$G6rX;EW z7CJ*0n=ynOh*69;Eu0Rj`?{4((jZ(Qf}Gn)v$H`e$f=Ru;Fa#hnA`=u1^GfmO(*L# zKqgc&7BcS&a|R>_IUl2^m~%!H#0+>RAGuS63<6A$Gn`*WxVK@7Cs=?OU%)jk#{nh? zQd~IcYnS?}618M1wFC@K^*nDVCYNLpyIVH9$=(B^PT?a0h7t9vD>EXdB~=1#haTlmCHRAMJx@ zA>g!MPk#{bG}T3D6%OQrRuCWEuz5V0yeq%KjREi?epGzG8IMG=g}BZ>&^Qz*T;i$7 znc9yZ68OnAqxEnL5*}4n2K;jXrG=G>*20g5IspPa_*d~$HpugGRalf_I#kjUmWIJyn2KfokVPH_e}h;}CixPoQzFK$n-w6>+53IhAg0;i4$vGgW&j>S{wgU3}_trH`AlFuX7?VgOLAZ-8N=F9ar zsM#_Ynv`-Bn4;d4euWCJfNGG<)SN>hcf=cW-^Yaxo?IuhkP$F3U7xW%Mp2B9g+-4~ zgt|ifJ8;#8s-IfxeTV5)3b6)$;COU+y9&GZ(ng+Lqv89QBZZzLC;$QnX2MB-9r#n& z0YY~QIza}Io1BL4*&$pNcND5=`?7$313nH_x{TreTzvQxGre)E%UBUrBLk>WSBrro zlCq)FJr-}o6UCq(3Gx>n{Nd;Kfh9p50Ed`*&K-ST0NcG=2E|%fe8xwO zAH~68HJF0L`#`yA4V9QFqoEk$p|SK=_>E07-?I!e{?5=-s82SbrRvT`8=l&brX*tP z-U8XcmIkgpsZWrYl^|$>~OTpkj_=S@re5l z3bdff10Rz{%JGIh6>dKk5ndPqMLmJ55x0K@RlxwZyC44qfUHg&_vge=8=dU*-W@=!O3=>%f=tf1&fG>S{ONljsj+W)YQ6V5Ucfzo(%PXj+{aKl^IkzbKDjK9s_TPbmIR9CQ6XSk3TUG}?+!^TD-rKX2+V?L=x*Nyd2xh7A;u%vn4+hhUVqSxSGE8Dx60Hxk z4U0ohARTxxoFL92f0FV5i>SzO}(e^nf3u@KJj zLvUfG-JOD)_xOEsf7Yu&Nx7#O+-qrN!$ZM6`?$iF>|E5<0w)cb^{)d)?%VP`crE)J zRp`}Jp-x(`{xUecpe=Fm1{xA89-mUiHo+uGtsUI}LTH(zKppj6$Rd-J*l=}QeDjVU ziS+F`-!7H5BcShlTsGn6c>Qq z6g&4;-?QHYdE6;Nqk$6OC$Exn5)g%<5!e9*l064jDu?0QxRi2mY?L}6a0G_VE_`_{ ztR5vl$MGPc6TcF>t>E>E;Oq zd@0s#M<;4(7J`RvJGj*=;^t*lMB<9>k0A;$AkFil1eQM zKG(w7NsUQYL!u()m6$`%q2dx}>{@&%l6Ja%fzyBwHQ@^JAZ{|T5)LeyN`YfJ9iFT^&GDt3U?Yj5aZgdhw0} ziPpme8Q<{eu$uSc$y)On{ss=%5A!&ywWt$s*tVywd^WJvYJMAU1NT$&9%?o&o zZ6~HV>aHgh?(x0G-De>;`7JomfkYiH%Bf3jko7v=>Q$DArZ)83g>c4xSi&b`WAFj=N;>NXQ#ru|V|Bdu_l8G<9w)EEEbBq<%{?hz6CI9@?hE92i zq&B=R594vQ4<8cStZwXzT@%DGOwDLhaI6`G*Y4Kx3o2*Lj;Rk*Xae(tr^7iNVw3XFh>~G@(t!TTx z%$%`9&doZHp2QO$E@5GM;iE8eTQp{3iKM{!2Cok-L+Il(-s^6!Ow3Ka8%RuwM=*)d zM&|GMi-X@4@fo`(;!BK~-?OB1BhP9*c0Zm?|7*k8E-u?CrJk@8&ABv-TardLEgpfu zMpM>KZ-N@mt6ieN2hMTjG0yIdHCiSCdrJ*lYnp{;j1@;J;H*Kob@KbeLpW6F37WG4 zF@9G^F_Bx|QAgh9nL;<1`PiZS#DjnN%U{&Nj6lxRR<@cg`7>rh*H<(9l>TX_Fl|`> zH1)m14EGIUwDKtuHE#;*ar#v;YrBQd9pNKE_%;KCcFW-!@9rrf0lv5{$4;dlPnO|Z zok~M7y@lfi)Y@||a4;858;FGe%3Co~fXFDFH`%wCMQyLC{qs(a%gFM~2j z%iJm%L1qNK43W>7pGihJGs?XT$~G-ihYTJE$aVsn?sf#+dF`q6MdDho;Mm&6)Sl0| zEjRj#k3hLbyy(AE>0c_?+W}`e$2SLoc)Ud{(J?AdOm=O<5t)p5hOD;;kRUXr#Tim%K36L%jCMT2vj`@RJ zp0qd~JB6#t;+oN6YSE4;r_{HRC8()wBia%tx9T#;`)~oic%frJSp97)q~GdsAC^wkcrfoV(?3tY1+RRU zmgQF>-R2|mKlSq$GkK-LDDJeEb2$yjFH~{x zm!b#J9-QIhr`fW(IcNFvIQtARM~Qgig-RU$8uLck0hr8*@phIIc?E>cIuu+nD0vKK zE$){`sTD!KAe{FlzLfI?NAbCOg7f=$!*tAYQh3uYIRWA{F%GwqB(PD6tJmr%W9h;+ zCI=0-LSFIYgo}nexY)w_IQOS`Ey$SBWS6pgWWI#KbMYBD?;?&AYm3MvYd5YVdPEpy z&%rwhbf)mAlvCM)jch%VQ}2H6j+SgiKb0>6C_5DC)+_1VJ>U-OIW0Q~@9uF@xJ;E3 z36^~goWXMBB9?m^@9tapgL$jUi3rT{J{6WDH?rK_EVovb6OGTKpCw8kaTRwmvP;Y- z^?d=)S;CKE5?Ix6Y&NXH!10|n{OxB3&EnTy$Qn51ZTYuMs_P9cT>s5GISgkeZjY|2 z#7DKXrZ<7ksP#M)B5w|ZeB_;CiE4HGo&U`XrfE(ail)|ef{C!Yky`gEAGGXfu#Dc* zURG9vmmlJ#e^t5;+LBwD9>o2YyTl}*gn;ZkB+K+XQf;=pSrb3zWg)-1#!zuT_6*Wq zOB`z>I8Am>+@e0G4!XeY#37S{qo8FkK^gGeoFc1%i&CtI@6RC~=bj|g1VG-Ei%ZXA zE4%>9kFu-ybD>;n-Tf$CmbASa5hQ->9e_6neAnGO4Q=9{5UnlCdbsvR9hv1_E&j7R zR)EM5tTOD&awhe*`o6@{b6UDLXpprKj)TmjA^?z=< zA;GG#=)&T1>V)qX+~fY7{+9-A?|9-W7NJkE>)s{?7M0slUBoqjg#JbV`tw* z2;l>@&`<~u@=LI}_k#Gi7KTJy6>?u)ia1EA)*GusM&Iz?7SY@CUF}R8R@VOVM=HXGEKlg||Eac9F zCRF21trI^rp*=xt0BgY0Pr(4*?1wFjJK4DE0&;E~!sovk|1Y z=iv{|TYz7k$)T}O?lR}R@3nYW;j7sX#uEPI?a2@mvhZ8~Klx6}QmiAX`I|;nkN+j0 zD@Wd-~&809#T?XeeA3y{U&ad>#V_7%W!U1T1^q%(2832 zT~_SL$sjZQj+^rC3@e9en|k|mnYK9z+xh(NQCM4*-3#Gapk67(No#OMgQ9$(#iMkQ zxISsMY>0>*M#L7{_xXW0`k)80Mc29_zdymjft(ojA3$uEq@f@61gD8io2<=rQcI{& zqKsH>k~!lQN#{EEncC_~eN7F}5qV`kS0(Z7o8a9TK4Vu(zNzeMk*4%{;Zw=|8oC$_ zp^1yI=z-f(M%_yc8&>E)pkjvOF>$uGYR+KB%uYjuR?*dtZ>uqJlYV;;J0yY0$f0Bx z#eV;Q6fRXu%J*-lSWi!~p5sb_K(DPb(cYHCaC63U=x{lksM|q*08N^at@uo`Jr^AW z@ByKtX~?~6oe#w#pVlfO6Z(FNIm6{p3N6ENO3fKumf(4WJcMNMZq_4C$+2O0cG6zVSNI7V&BaleH)B|^hR9E@>=36_V^0>R-C{@i6m}qlhh;v zoBlVK)rY}-emCuT1Nut9vKp9{JV7FLGj%LnT{(fs6F~G03Mv5=H=Pn9sf;6W0y&n6 zVH4oOKeFVAHhfUxRsu|@)KSZPJPA`d(#06+1&00eimnabd_fUdZ^%l%BL_Lhi20P9 z%7K{9g@On0sDHbg@FMtIzY+_iaydq7!-|_x3gHii+5V4u&N;ybFht_Ubbb(iZ^yEw z(A%`+N5-S9B#x}>^k$Xq%n4Z1Wnq-)THysHYE~l6(d@ zuG<9{WWi}&S13H;0-q7gk48S4yA=2I=wN|wdK+zUtGjA7`~IAlBAb&hb-mt<$CvT= zRM&H=eq>|f{-~1(1-kx(CbY$-pjnV1pRyt@@pVOYX&an9#g^dGBfi+^5BpsCh6nfU zGbCOm>mpkAtC)%)o%j93VtmBXSaZj!b&awDxen zqp}=$k{4d+WC2)PH3e2oS+~&;C{O679mKh>e1d0_6BncqBR&r?*9AwZOE?WH4>Qy{ z11PG4k@Vz&6%_lC&iZ<=5oq(m zB(rgE2cAnDtBf4k2cYfaDv^T-byFvQip%zxiCkr_A7)LdwxTMw%7JV2)~$^b!+T=s z!}D)5OlL~abSA=b7>uRU_pluRZ?u zUVIBFFs{uQHL`5%4-yl`&PZOH`uQMOU%cnm1WQ)I9~7kMYoOfW^=yP;T9xkY)0{o% zzyOfG9FSsN#{p2QOdM1qN}miAN}mr5N}mcGN}mftlp<$)nAWjQFDJ^=D&{9K&~lJ|MqGaK`esS zm8z&H#DPpv1rYw96@wsw{?1F0f(}TK2f0!G%P`3L0iE0{6DJOOyO?UA{3)m)mO*X* zD2QPwx@o?p02~ne5Ry@AAnrjY)xC&<4(f>I2C)O`03m^fCp~BXFViS}@*sgfg9KIw z3G9w=iU7*{PrC}zKg2)1*?)BQza|N2zQu$YG-Mtz3+greZLUF9nazLAFaFOABF%p$ zBKu?vKv_VB73x3bfQ~czOZXf9nsA^V?Ef{VL_qT|pjlgxGhYqOsQ3Te0@?xaH$P~| z6XY%J-%mgxYUe+`pb|lq>EYje*M|QzDt|No{~ti+urQdtrLUQ@shfqYyMm>)sk!fe z5hN_FOg$Yu{)-}`@?QycapnI`c{=@9O2g94(cIMKzbIN7?Ch*yRPJCp9{-jr9#Uv50yJT1X|E#1MKoxrS29o#L!oSea& zt*pQ_o!l(Vovod0{VXj=L1KA3yIJs)Qn@35k-CGJBlYt5%K@p!U%vhc;?7Q14z}hV zwocZ6^Z%m;QV(AjOHyYS4_jv^Qd%l^7Aki-gnwV9DXEjEqnV`}shOpRx22^MDH9tj zE2*iI1?k_|)}7SN($&+}4fJ#?XE#zmS#xJ6F-uDqW>QjCQcrgf+02*pUn%}6($Unx z!P%VD%GA~YbkWv{)ZNC}8?+VkKer)($^Xlf#$T4)EZvkI&=%>eY)DuV?ji zm3rrKwNy2_iiTm+2e7{+-7Tyyy^F+1{5^PXpGKcHEI;*Y8H#GRdjI8dB563(PFh$* zgK8HRI(m;2)7gH9GsXsD^aRnPA(z49V6j&GXWORpFUmwNDDzW~n?38_oMG(^lb3m~ zno~0Pt_H>z+t&Xmm4{v;V;;w~7$v49!=1g1R~O@gg_z#U`d~y-8aEns8RAJMZbNG= zn30yQLQ7t|t#`+p{cbTjLOyp53_rAYf?iHbXNY#lEyWh=g%h*Xdjmw?2R)p?ZO!N+ z_uZ>Z;?y1ApdHCC)fo59cQN>Bw`0DXhP)~aY^uAUMEBOOT@8eM&fFm;>ySpcQay3X zx)HeJ^c!hk!_qd}$k*A~?_$4#YjdNY?%?{#7MT4bCpobkxy+j}PH)O=Q1?9_VXyx7q?FlxH$E$dRBlqMVqtT@!| z^i;wX#%thZyug9}3>I9_-#3IRuRVGG&K+LRD!}Az*H%&5@GP_)%#s+6=r`Mzq zru5xevPCY96jOyQRE$6pe325fv=NQJG>Y*flk++K zGtD$=#??3Wv}&M(2Dz&}qxG|5G#y%+ehm+3by0=wMuQ-6yHe?oEhpZHvt4WsnNT@6nAy@gn{m4r#} zG6?C}zYIH+KF@LdK>s1F(eRFhYUEi~vCkCx^b}3Y^>=f*$}G5;t=OM*{N0(b4m4to zhq`*?w_-DzVYNS+pUg5OPEg6xUz{bv%RaiRuaN}QwEZoT;j6-4zMhf}^B1CZ1u4Rk zEky>g+)A$4CW{uVz=?y3IRn&2A`mQsbLPZBkL3Os9gL{vNQi?jf_7l^U(si_G#9nO zB0vELwl(38s1I9EFNtZ%P~=ad_24B2J-nhMh9}ky zkM%P6jVb&odkVU#Ghqt4C=|aKKUGN;eu?tLS|+8{Nz)OS<;D1sON=k&hSA8O|dq$OE1PjqJIPVPrJ zpCHqs)*HD#urxZ;SRlrAeDz-&y-htG#UmG6naH%3y?SRK3+rc@*VUa23k};Ii%idz zn&Qh6iMa;>CkkRj{?gD8 z!n=-poE~k3>Il^gV+8_6v*2@H{OKB?)r`DleVJ14^oD(de^qzJl76#GHc}^!RFRP< z*e&c}Dx$(%8X!)8YI$(2jj;rXE3Xl5Qrxy1>^X-IZ+}Do^7u?nMsnY-w&PqjyiFg~ zrwJmx4i7xqiRHlw^}pDmB>C(8fwG&$FK{gzdL2T)wx`-6N%HxkvG>k)lsCJd3?oEl zKbrzz5{}|)xX0V(<7>!p3)Gu<#-ls_q&7Vxhu@Oqe$PyGWPwf~aPc zQ`TdYdgmuQac)W1puM6N)YI0eA!4L2W5k%EO_kLncW0K>bA&Nw+n_$Znf1uyzeZMF z(e5uLnm={9j()9AwY3f6LVNFBDC*I1QsDTZSNZcqb)E+7K4byg%(#7b>T-md5s9qt zyZVHEMC$TbvLtA5y7eGe_`$Z!H}l>aK#|*a|6(xVn~{3&M0d z?7y}rSi3C*Ft1LzH=;XsF3aspar-cu@GVHaM{#@qIGJa+T^M>#XS{bjgDvg(U^;wg zPF)tIYcMYD2~3mojr`0wJF%_vD8lfCqRwLKHLr4gX$Pf%8}{kknl`&>eph)>;=@1t zdqH{B+cQ^EUl8>j&ccQl`p>_=VXtC)Gl4m-raav26{SImgx6)b+qoEdGdn$7z?r%N z2M}weXRIulvNV~pEV;Ba`9PLR7LjTkM=p7W%9I#^^K#vPp;m0_X?V9tX0J$RuLw9S zt{4@ehmO+9HP^OO?)TNvo=CB~1#Ik#C)fUXY@W6d-LV?o@r&B@r_x*kIX)7K)LsSJ zfGo-}sboR|SvLp9@un!svGQzQb~`D-HHzM&?6wN9vNbghJ?u3qTdK60R*iaYwazuU zLpz$Zns3x?1?HU=x$dxv>$wBD0(PTzG{^g8xdO6$1*C`m#i{PrbjQqU(=_9J-is|5 z2(G{84LS61R(G+nxLa`-{C)gPA}BxY{&iSuRVW zTd&H*GdbOHOj#F+gulxtB+rVJ-g`PMUAK$TXbzK zeCCbxvN4nbt0{I`B6rOyXi0fq`T4-FPq?~P1{Kd*I{v@#iwzo1Pw2IsW@E<&xRg3o z=Z#woT7sbhJF4?5Fh6}YVp&^Jaj9|0iF-FWsh^E)wqKL%QlsA?tP0YWh3?U#-{DdN zZ%C^SsHaBmaQ+FAvFt)HHkA!?p@Su)%mHwDs!V?B(A?YSj!Iak0$e3Nb*QsHAi~{p z?l7hpoMomW#jR}RFq3bDC z5+C=7&3ma&KiZBCDNQq!f5}Za73-C@5!TUgiipb2lPrnFZ?6{)o$N+896Qqiax9Gn$e2{YHA&sylHm zIUO@Auh*5pu$s~O)()lHTWo9DYTCN_vTo5+H4>3760Y;bS=BlEs+|kNj$l)t>)s@6 z^V-H$XG`p{TaOSsc=kO%J**7f!+HK^qfOA&V=J#h-P}706Xd*($CpB?hL+9s)}CvJ z#|S-uLh0;#k`@>ShQ}ZEn5pJX0Zt6y-N}c}j~u&h;kjhiC&|YOJ-dp_ttu*$O5oK@ zONg?=42HB}+uhs<=bv zR>n&|M#*kliq2w>Gv?f%N7qjYT(l7mnI#kJp|~X=+e&)MQ%Rg93Dbc@vG4FkJL{+-LtX zpmx){{QIgl;`Q06S>+soYJ1^Mn`Ot7rj16bD z?vYUxzzQiKb`fn3W=O*kiJ+KE7uDA0k&R152b%5%Wm|o|Y09~q(`hSI%Xh@vAyv+h z!)H_`Y3DMvyBIDGGkq3&&?riQ&p;=~`a~igslmA+qv++5%D$0_T4mY+Po~!6qAn*L zjpHO$iQ&F(u*jWpx8z^yOuPgT{BG_v@cpIj)oR%>KfXfdyHMv5{f}+`N&pGNDn3!# zidw-4AyFO@mu7B(a*-6l)_zOmO{-dtIf2&BO6*Pi2?&M1a6$~x5M!r*|L zv5i#Txp;d3NuIWG(*R;s0e(#;>jC*%C8D+|ugdRoB|*XQO^G=gyV1 zm-hN7!W!8mhGjP^TVQ6vtK7$Yi=AxqO9&iAH+k}t32|wkF7cl!g^W-`ev!SdLi!Wk@xB3ABW><`0s8%WjV6AfZ9GD~^= z9?{XeeLvCQ;zqG_pO#ILqPIfP{9H@MLxhO?8vJGXSb+;oaMVw_R{AyB{KC$s1Y9`P zsT4k7VHj_0MK`zP=+DpD@y3SiM=8jPZPpph`xkIY(j``?J$4q2eQhF0Hc)%)VK*J2 z9EX9d+KQO4i=>}zz8KapIc=7!F(?nG8pAz?QH<@Vq+(9$V>fgpA+|7;nW3g&H+MwI z^&tgm%{0xZjp525+>GGE^3~w-Jj2zImikvR^>_Rc)blGl$6D(>%U52VTJK_%L|zg# zl;8!DCGWkw9GQ&Os}J7{(H`BUl6_5Vl=fA==Yg`!Z2?Rcx!R!2N63*lrP>C<_fnl9 z^ajz|cCsZNrP^H8u_L0O%Dy$-WjjjAnXGcbh9s;X4qK7)xoamfY!x)q!I|$MRmid* zN?E?`R5oLzp?V@q7|zPr1)`+$H#sTR2I)MC*TyL^dN?|TO~78l#4oD6L36c>zM&*( z$|nnR^Q(Qxqkj=msB4nsYiJ@uY(cI%V-Tn--c2;djrGaK zp?zuP{+U;Qug*(GDeGIID7M45&y@XUDc}Gm)l1yPlhfxy76~3dslir=IgWdVv-M5a z7Ha@paM%8c?(-~Tl|X!cUIM=3YN1VoKdT@U69ML>CfxKAW|=oYC%X;F4#Gyc5Cy2x zM<@h)eH9eB31U3C5;-g6Zd_048?mh*Frw!#v^3^n8?zzY2kB=netBjF{ z2q4$7n8J51_<1&IirPgK(6ZPG#XJeCI!WQ8iXN}UNb2GWVB}z=VxpS{A2pVWm4$>62eAeL z9Pxa~-{vP{?fTuoY-6L-3@pdsU>60+1tj9R5+fm^eV~2yrDUds(rY?nyZ?eSEFY$dCjJ5GiSb&E+6_1bJuw#a8lpfTm{a1)%&U=;FSu#cJ;hCze|0%H`U@HG5nAfO~7 zg0AEt3Ie%dL6o^C(SL!Fi!`GCV3hh#MEw;p#a|-zvU*YTC#e*{^Azp$Z71kL>Z}^% zb5zsOkL^a<=)C%U>&4s=BG*qtOb$iVFVY#bZ7LX$9Or*;Hc)Bl3};#x4*!k}&*ho~ zF3y5(x3}ja(i)zP8`hJgf+6lwbuEc5%dX+kk3NHoWQ$HQ&o@(S8^Xi<4zA7X-6nY4 z)~L)bbk)Hv=736tt}xZGi-dlk-3d9`W5^X~Lxv1~kGy!-YJq}(bZ}S`#mwZJo1`sb zO@e0$H+LY=prR-yVaTT3W^~l2e-lLCAhRgOWcoE7FxD~T)&j&xIPLWrPHJHYV1^(G zzDJ$4-TL(m?J}>H1u&{%6V~N12-D2 z2zhfyn$XwD)T*Y-I=47RS^TW>>fag+*ox(O(H!s)my1uPq`$*4{A;u2+S>dB9iXix zIKFA@hb_67c@AEu~F>TwM{46r`j4-9bPGZ~f zYXosFizwU6O~2y%YwOCI*B>Fa9gesee}C*9j?ft~f9&06+ybr}U5tX(8(o3|&l}y4 znXaeWh#58ir7>$rf9~O9HUpg2w>1hU!;Q0qOMsl=${hBKdD-Qkd-{FG>j(Qp_<6m< z1jDC_7T!brzNN3a{8%aBD_KR``aKqF{s%C(ZXtX-HvRI2+8!ec z#tg#^y@}!g+RTOS$l2^e2LHAFlpgV`I4kr91}`A;Tp4P*Fwx79e+6(KI$j!0G+tcj zstK#ZN>XJ}9Xbb?l`oIbF<}GOS4@X$jmbN>hBkMaY2mJ-OtwiRXQ_lhw!e|%Nj1#F zz`iNA<~zn$cetS9@a`&ox-$c3ix@wokCT;Oq(yW|IE`Rh@cqO=EZ4X}g*aIufwrCh zw~CpHP!01>ic$S{Kib%m*I!hjG0ycH3(B%Y+T;}xGex@@dTscsK#U7#}s?0dQ-1@vyARU0(PJbKz2|{m4~;` z2(0ZNP5x3biyfM@ED{5YWu{rGO>#TlzZ~We!w0LcI~Qxx7I^>Dz%XQu2O!vOW&`Bx zG}8fccANPC`a8{30R7!&F2MRubKOr?FoeWayy*8I)ssy-eDbww^)H)bpXdcNlb@+A za=k;C%D#jTULn|9DSr=I#2{+0xBLyf>B451-9lATQ{x^y*RyS7BwG{R?de6d6&5!- zo%~3=?MPV;PIQ4Iy}wT6ZF%RTM0P|0hUIu>8H?>rbxk&qIiA4VV0}TvJERE-Z*BSg znAlVnF8-FFf(v7&aK%a%npjLx{Mi~$lV`*7AU0vJBh4l(8txe$3j+bQT9mdD5vP@% z%&>zgYYu*Oh);YuANIGlC3)BFa1{4gIkR3pEi~I7woRW?3EmGasGr~!0bnqbORvo3 zgnM1w>v!^=69=cGchlTcEyM!@bW;v@o@;>8EJbj#X_k_RqKu<6mIY7N00VK!u;j4l z2PlhvJC#tkLZS@?reaxr>#Vgf8(1E7X`Fa?OF6i?qyYuP;-8{)A;DMXd3pAS8eM9J zuWu6EBH>vuetS3-VV@rS!D8d*KAAolO3@Z&=J2l{RVLMgH^$m=Y-X;FD6QnKm@Xu* zm1IbIgHC!(-R^)1k+oA0kT#1ftk!gRM2iEzJf^v8H_XA0!n00Fd!=GJb}5d9 zXlv}`D2@5r9G>ku1J%rLAKrD-ST553GdfxQrJLABAvMOHxouWe7dQ4(W?t27+@4e8 z*wdtmReAlp#Xz(73w!e~#O~FN>7^7Ew%GbvML7Ba{irO4 z2Ts&>3j-+X)*ga(1EPZ8{&w;8MDw4t73&w{#)9x_@Q=TqRWL{yn|(t1H5==vGJ;hS zL7#R0FzfhWaQ`LLaBIAZoSl4x1 z7oJ@%4dExv15hWN`&J{3t^e#ppb+u0q3qdX@nICi<#9(NH3ERH(FUWe zqK$MzrMm<+TwCePVd3@2Na{coZ%G5VA|c!(bt!9hM#_~G(@!DRY_*clzs+=VOpJk^ zNJPl#zsz;aOyu!~8;K=}M;igE#3PMl19M0}V&Pc%;!P>!1d>eMiv_bx5ks($^wDz% z8b1xJBCVtKM4NsNamV{z80%!=gFoPlq)g)@FvJ1JY~n+WRg`V291?? zwUV==1`L2>Hebou5ki`w>d4*oh0zCjoNGmfx1?g9~hWzIX7O@q|P2stE+SB#wkD2TV1?Y|O7PPAtvW~}0@kBOs2!qTeY}OI7gA9Dc zm&(%A7QoxGHaULa8cLI>j*S4Xf#Wvo$R=;Mcmi8KkcC>tRn;l4HhE$_9sOAkwVaHp z#pa*76KeR1lBH54XeFViqfmF)PebcMG(-dMWb%Y**&VgZPXSKRgo6iglrSmsM;x+- z>m6``^bFO<1IVYgb8N_@db9fH?~EZCmwp$(>y>cf8OneUoVvlH0DPD0PS~}VI3pe6 zp}liP+CKPbBN%8$BI5RaL)tzWZIv8A_(lmO=?TeW-@uIG4*KQp$A6joP+8a`Fg(! ze8j6>5)Yfk(DzYnpkC$$hWM9Ee4ZgNkkVn`KSE6-cVLk|fpnfN;R`#&JCKKj0p-o1 z0K9!gGUiY~+xWqnKz?nWN!?LkDvEnKEDFR6>0@UkuMafWQMmC2a>0EJG*S-?A=#@+ z$$5vg!oT1x!AqNht6J-b&06SW$WY-fm9(5*z5j@ye;8`|NS8t2s}AYLP$4LGuqY)i%3x1#ZICo39APZf?K;X)rd18+kORv4H^{tE_?%V(lCk^7I`kyPZ(N z)++@aYf~;@11z}6luuMch;V@;E~oqfwY^DaK8#6A9vVTa2 zT%o?0`oIqu-4)I43>O(WojWR zfX*14curKfmK{v7_P3xKr|yf0_d!9p1*c8}Bnf|TWG&$f-4TvD)l)DLWI#71qybQq1qoQItq3+z(E^V0{V0shoF(6PQ6W^ zY@UV6HRf|a;XdW?x!zYCxb{GO~?qb@@3DZm?G%4e2C%N+=k=oyOG z?&$S4S&BC%FK%sln+9v-%*4@k4{k2Q8!)7jdJel#oP>+h@x|Z>$&v1HF;<9NtwMu` zl-;VTCK^bC1w|O}0I%R?bxqI%gfn>P;Wsmh`7M*VDC5I+p=bgc*wy81=!#x2-5ve* zZf=*rvS#;tZ1D!_{fM0P)K;jsT1vInP%} z>nTJ&s${Togk4b&uQSQRH!Y;2$+;UnO0+bSH3Vj1p_RN!azDJ1;o#oy~; zq0N|Vk)U~>Yhjq>`LL4voATVdP$Goy)?KuQopf_$Nz+;xADuNt{+ZRt)ndM21pBnC~^m3+b$rxNw@RvS4 zX>QB9rtrDRh#T#dfr>|+wRYtAQ||FgcYTsYB1Q4LGv+Aufw$N>JRS8JDFNo9#KXq; zw|d#QP;WS{l(qat>w%vZ%>zmWqS3^xty?%nWl>qd16np+{$DMh_R5vk_xJlds1*3W zmy}K_MB#PJ+ah@?-u_Y+;y@DJkduekHDq;yL-JA}&K8u<(2e)Zpj% zi8P6Cr~OJhZ?iIhHfSTpIN4P0lWLz!M|{{dJglw`PxT;W)nU7Fj7n&V;O)eYF^LNG zoJPL0J6@yf3Ie0a=5z2h~db5cP>LSBBR#puQvMLC#1>D$JF*iZ)tZI+Jh6@k-yw&m!}D4=N7 z3Ied&n0DY3o)r>FwSn4D>hJ@1n#~-xcD5X;fqW%+cM-EwV8|Zsw~0?3UPSy?oS{xD zOc?hXTqA2U<4z~efpfY`7$6Vo#_)|4#^oF~kOvLaAX$No5s(E*Gel1gvi0=guPl8C zs%`;5Z&dA9ye(T`iq<=^1@AUesAV;-xJxkJZ~dbCQFH^FQ4vGrc$$vy3cuTin=C`j z2EEBu>L4j{wM5zV9m>_y3w)C(cmt|@pW*a1e(1QIR;ARDMP`Nl(w|R>NYG^eF-04z z)vj*EFv%M`?a;I-AHIQ3?n5HK0f24(sW268z(H{{th!&>WDP|alx3wGX@kVR`<5f+ zS{1sk&LOsupN+8xu81h+?^0u_!JoQHU%hF87Jl317Ay>pcKdnfCY0raz_c<_6z9d< zQ)=)LP3kVQue6e~k_A7?J0!giV5Q( z`3W8^LUIhX7+gmcuPEE&bMw;^?}cAtw=%-8=#~6W@G&72;i_OlNBaB%UPmNjCI%xB znl`u%ELUewY?j!LcK#R~$qoIykwvseE$iF8$j>#+KC;8#7Ik}4yKo_XoG@fVrI%pO zW6kVg!6}iuu!Ph@U5U@e_0zv`f^R}G^^*LBfna~3QRwrm;_O}o+N|OBUMt**p3N-< z+zF0qG>IgHhjhym8uZSmZwWj?+sb1q^5M_n!F>X|1%sm`U=nlEf@t=1LFy9zzl+fLPyMmCZrqw zLQJGxBc@NHF}A-Q?ux7tWxx$Wm`q31L|6-J(}4*PbXb&AHv-GHwht9Jkm%{5-1L?UtlPri!f~p-kx&r-1l3z5}8)MR9Nh zHhnwS5RF(A;`P$>Maakm=A%EEa6Dyj;{aQ3suAcr110>7wRwWrM^Se4W{h}0Mir-G zhMA>eSj+r7ipy=mCZ*pO-Xggj8Dp(#`}8i&3KeGbR}wJvf7J!xyx31PJhBr=9(KcKMw6sBBVvuJCTo~AUX};=g1rYKd zKDDAIf>|z5hX79}Tqjkrg~+2z&p4w7#I}WY5RqS^YJ$}J`HjuM3p{CyY*>P&tdgm*i6zk=P7^_lZ6`_pO$L)&ylArB7Z}c6>YFjU%#C~Caax$@_ALFVbpWeK}4|UHM-;0 z!`H!q99!4z-?bF39Yy823q@=*lJ5^##oNCO8JHlaE{21a)f^!jzpX9(^^SqSP}n%7 zl$itlVhT8l>YCd1SL<*lMBdfM)0k>iaWr985;;oLS{2css23jzBiC{)EVqz|o~9tEM~+msm#;meq$^4X`!#kojUWkDx4j=3iIdzE&Dxj*uYs;MQ(;_*t-%`1_yZ{R@=@~S(^+g!_VNK6E$@ylz$WUpjVC_Tbzn%Dm9R3fGf@1>!S*ktuX(DMi~E6xN)@%TqCV zX1PDaP&SH+|G4W;QBH@7&M$*&rSYX8rGRd)OjK@{P2SkWa9`=^=#9wK*&fQ((Xsa2 zfWx32G<1W?a7J>eSq_so(m;z-`Lv{bS1qb){srp0Kj%0$4*EzSoTKxcnegEUtS$^M zj6^3-6H};3c-#nPO(({WCX!UTrNB7`y%z0G4PBGnn*p}`<>HiFT$RpW{kRJ>J+*3+ z;U6c8UJ6QrdNEt)l)W1d+h~#XkY9SpM2r$%OBw{K#=V5k6G9LFY(&Wp0r#6s`ZCs; zpkd)8EK;!*71EpWOC@twjWmuMtp+_mxC5M9UoGg&_kD?)aRIt$0;H8z)Gr~}-@LxI zuenr8uo*2CKa$YFShAN+* z2zQbZYzNHmqMiN3V!L znMoY0e$mJ~JB)x}fShBeL1p$+3Fv>fW~;CcH5J(;qX)QnnEbxz_n1@B}Bxw@Bkdb{#aPqaSJ4P!#o(GP1iB)(d%0tZi zQYsv+=Z>pp@8B1@z?#K#=Fsh`;rmA(C0$={ z5j+^{Vr#MJgyMP`=n48JFZin=Vi;4blhG$z^1qR3Xui(Ykf3TWeu%7T;x~S1`FoSe zs(dpaqnj9l_|~fe#)F&O%f%t!tE0eFp^>UI<|Z58s!|%N!WeO;uk}?bEwv>%8RGGq zWNQRhW(g+vLZ2ErLJU8af(H!n+;C&|zHU}ijh3@$tG6n!=FVTeE=x&xTVp;>xFxB& zNA^|}i);W%L4~fR&^6AasQN<&umO1%txwd9`L^Xg@2~PT`+zZ6N)58jCFiI;G_W0p zGrIgaph)#VH23JaV^o*l|BbZ_x;0j+>`*Sk|BcKt+=f`ex!IOjVHrI8!U@4P>1g1W zF7lN4DY*`h_@lFJ={B4wD+v$6Dv{>~*&Pd!V`p-FLwP=Fb=nQMbJk1-81>k1x1bj6imr*Xy5OY&b+WCl> zao)}b_eVIFsvD~19eVE6_^Hv|C{fh2wXG1Xv{d}*es1-l)A^1VM=pFcNZ>zdlTUp# z%gp{tk4dVX_&#?>33>B@#fQJWP@CK58EMsy@+Ul+9W7-u$%}I1$6QdBdo6OYS+<*W z7j-=E6UY~kF}8zyrxXl0hHs;U6;6aPFz1686~8v7EGUd4v)&UKI0}~wPScJHBjm1; zVNDd<7&?Gvkb;5{1ZT6Hzt1n6f*b>T*aeBg7p)z7DJrjKAhu@BJ@_x6;$^#!%o#gZ z8z)i4tlZ!}siE8E)a1wCpcpF-Dwm!|4Js>S+xQY87X3D+FDjouYN@%Xi+%H$6mqS= zE}i$uk5{3d+O`|kGR{PPZfFYIsccw$BKQ$Ul2#|nPaU6vu*>#ghkTKW9F?t;*gFc% z$$6TG%-v!JyM{;>JW5_k0VeJAxUAKwK4GUqV_av!wdc>avI~&DW_FeK+@uDr`M*AJ z%82N0#ASrlZH{5nB3WHTCw3XFh-(xUNL-$}t1_+X5AH!%3C=!PCmz-<**Kd zO4yvj@g@D$wCvKuau*-$Q|VxQIESXN(CU4EQTusiQN{3H?1rIC;Kz3d2KGhFXf}{J|97fe8=DuBcwwY?wZ$aQQh&_cP8t>(8R^&r(Wo zV_CgCZR)#%AZMz&X?v~ z9f{^l@%iGRXXb@6AVK=aLpJKcfAv(Mj6xIr4?n$KvRq2VvkQ!Nspw+Np5Vi#?0%l|{)m zJBrGr4?{5Sa-kE?dzvD&GD zJhYs*&E>I5zS0Kd3qslU%SJ;=H+KYKH$By`)|*$$@@MB%pVk)(suvgxaVGIwi?Hm% zJzK9~*k|jYAUC7!!ZvAmg#rocgSWuce62TSWYtq!Mi1aI(t3ItIqqZ-uikn(#J>h@ za7ihsvmZ#DN%}5`Q@BT{H981}yYr@2gY%iRY^%G%?GaNzBMFVp^~zxJTRxF5q82xG z3mvHOTa?~uA}C8Hw)GUCL;DH!EuKv(ro-s`+M@A0>lC8pR?~PLg>S`arRFv(y#t?b z`_mZb+_>EQRERzM=gsQp=%*^P1a2o8qWw7#icIXdk(oTo(PUdP#xPT+uwj9^?W3L)6VYgpyho&mb zrUIF|$_&kZ>YExF@=EGN&PbaIbJ*bMEIpkEwpvhC010ked#m~2$Ip8n0q$YTPcl9! z&0Q_B?_{xl(}=VBbuiPSxsGaFLVFG=b_ZzIIU2_`{1(rxiX(#LP6gt_V@Ig25rpIb z=7>mvqZ7awKC2w5HW z!+F0^1w<^lm@g*jL59@>%xGy}^wmxj^jGtEXXOH?@W$+vKdLpg#ttLl+PE&3B%*(qZD{O_rN%_iIlcTwTU;^^Jn#M%~AT)IX2r{T5dx;jQe_w_&C|c=)irmt;Jw@w5=$(}Tb|}qAKkoCS$$MmJ`+u#UAGeke)#BI0P}43UElIMzyjBu zPAI9cQ9k1v3lgI|e|$K{e#sHD1VoB-M^7YHn5r^Yjq7R#BCR}Tz!GAw^`kLtw9bceK9Rq-bOEBu;x`izT%wPu^JlO zP@l>w$Sg5Zilq?@%scdvIWWqRS@s#`m_4I@9jUeb^4LKa&t*%9h2ne1&lO>u&~b|P zVf&TjuEmNB7C9zjc#^fz01i`~zZHpwT-l%!?vwI{O%P-}j%sC}oug&qP#%84TdIJw z3;ICS_&Ro1InbMBkX)5cK>PF2ZTAs*W3G6bz z-PMCig{%9g?K%gJ>&OO1f>1uw_~F-rbsl4SbZg0bZ6@f22zFNocN%%kH6)@%JzWfx zA!(9+Zt)~yfLszc3wrcHm`KuZmgMNehBZ1)2tLl*%}W{Wwa-~P zmuU5+Z0 z+TFt1;g4}3=&uTFXLy&_jNv1;E6?1=lys{d znvl;<=>4r(RiNEdZb+bs2uehdF9JgVG*#~`_(aYSK+p3TH178lRqUz5gy0AG-PK|x zGF%97jdqr|UQq9xYC)wW^W6^{EE;i7A2$V&qup?`p<zqqX%z3dhq8* z4_22SHMr!+!C-1mTrOyZ)G5GF<{~+$tEkCa*Tc7X_F`t&xA_HHpAQQPMf#0gK{~Q}+kBjE7 zU?Q(1q%rOh>ju_xoQMysa86H1l6q}Lwxq&hupC4TNAF`sg2|L;<{!%8rzgF&qbKt` zHF5jBR1*css8|z{>P)|v%0Wlm#PcE4hq;H}vI_dxy>e;V$-(a)J@|*L;8sVjCVM=( zZ50=_X)@|ruWpu1*2-S5Zk~*Z%Z0F=(jsY!%f_)GBbAo27iLv=C6nl#Oo+=RQW2iG z&(n0I@NIIqxF`X^KY4<)7a(%BJIf+&nJJALVH|hTN*-@)u{#7e97b}3j}i{cwpV0@ zXD`{V^n~;FhkN{Sy48@5LIt?|>QA@~tvYfzR9VASN7bp5j~onl120^qDA`mG6|2hp zRi4_m`k#Y#ZBw;dgY~`Ax($@)DKEd-<7Y9T4B;Vr5`W*Ny{4aHz}zd zcYpS>hQk3|zjP;%V7ySb@4TN!d{-tlTK1baD`ewr9g*j$wirdJ;|9?=_>40iIwbA;5u68j~q-D>C)LUER=&Y+z}=+aW+^{a*1 zz1V7j+Io?i(jjj!IkAFICOM)?aa}`fhX(SLT5~qaGGH6}cqQ zgx9d(<|Vyzj9Zhscz7N=+S`)e4)kAk5B^XNtz7e`TKQ;Fd;5VSYULG@R!+6^Z2BPU z)aER$+?+!zH|NsI0XZoARjpi^3|{%*U(m{zlEKw~CEn^}@Lf+lN78ti`k~xfX&avY zl5qty)#IVRZl=l)KWt?ot0Po=#Y4IDD|eotzRMpH7N+A_$}1P>z5jqT=d_iIe}M`-t$Wj%SPGSh?%g@?n~ItQe}YhE;`$SQx4hy_2ytjD2fNS5h$?@z$uYTq)-O zP#*h2b){nos4m>}FQ6SdbZ26CxB=aTu@sEv=wy)KE~eczbk`vFS@*AHkFuB#%!%Vx zWH%pT=2%?39e6zgmj2)f(T*tYN<-;Bjz*l)eG*MN$Co}8+&k&&pHl;mq%k$`WZZswCoLI_#UQ}Ahu@ND?!~~a{J!Zij<_<5&4O*Sl&rr+(Y!5I z^uR994Y%*5xKdJ5uj*)?_V`~&>X@4a;}xEr;=Q%CmWApE(?aK%@-kBrLepPJXpQ#(ph2`0|~eNX+mMk*kWhTlc{IVyPuc6attKZXfR=wxdV=(+-}CIyS7hy>pFX~+2={+2%#`Fn|Q=f zm=518g;r)wh9A!g#XVg(aw|=S-_54sDB~x1AkZ2lt((Pzqz$uZkc8@wt??SPim-B9 zlOT$`#?Vp9wI=?gJ@h7XN$OTlaUIFl>M5=_-QM9w)9nXuqR*!`Djk05RArv2!-5d? z2)CKGRlwt~{ctf1G#Ya2XBMET$IjwgY1!#6r?Y^4sW?R_@pKm7MdF^$;`@lSrH+34 zB5|<;u~hhnNH|M{f0TVN-A|D`aqNUW#{Nj0dkpMP4n&Y~UsZw*IYhh)elQ|+45;9A zG&mB6kF#T>KO)j;23);79Epf62q#sCBMDEdQcUkj2sMYF&y0A|YNoei^5^gin%<7- z`t@+ibEpzG;~%zg!yHwGuTD*0&ubMhCY)@C(D|LLjl_G_+lzuSi47tNN7FB-ZLru> zrL{9{Xan62s?&W^>A!Xi9pn?I2sJ(Gv@(+NsMD%Qygd8n{OTM+ejwr<5j+@)CfGoft?YQAj*P6x!q>-|T3Cr#~Yz z78V1=0FuH~Neb&7DZrLC-L=Reg=w-BuqLPHsPW5k)cEB`sqx?jVzC`t<+fsAEj#ci z)z))^y(|wgkIgpj5M>OL$r*Sp2e!`@xFRdiQ?qse)oh)JXyk@CHT&hWbdIx5q{wrQ zvreS6BKweH-AFMc$+`zpFOm-;5H2Z>R!VbJcl{iG4I(km#IRw+v@effoMR%=X=$e- z;6lm$&!Pt7g%T$KK5n=DSz*sW?E<5%9#&VE>q;UHc8cIjlmC8}XWj{_w?gmk2G(24 zjh1;IYy~%fk1(p|o;<{Iw?%hfx@5Cl1v?Cn7X>%6wkHdVip8g7;g5Mn{)A9^_pcMb-wX$C-2{j1g;;^tMX*T#kzFGARsc@k zy~#b^~+xL;Ug_{+C()H{|e#PtPsS z!NjEOvVESbZ0mwpwgq~w+DLECl|rW!VNT&>_`8_=A1^7&ahtu|zPMFU&fhG`&p7Oc z!Wa7{Z1$Fg%rbm37|actKEGnZchm7s?#eKXN!G3g+#p&RZh+H6jIuC%kfSUN z*LLpCEetmSZ+7Ed($XI_ei(H5$OKIrrY5^ri*=OQ+KW3p}F8?>O-66=tG;!eP{v1wg2eccdKxq z-0}=87ec82S|j*4*$^d5oy&?PNRBN6xSZ=pq^*N?zGP&jeR zU*H~?8kr-ahkKw{<&EfaFOhsY2gx?s#RLQFMzV}AmF@Fa?d1d`=^4@;Hllwrq*KG% zn-+x*Fr@pR4&{VBAQ;Ns^eXRGAH>7ev=`(V%x#onSyTSGv*;-H>{-~uRV|(Mmqv6s z%67mAu6XT#r)(o%vsW~ZT(UcaIDNBfAy=`S#PFHg7hY4`(XBLh1$+6=*Bp}~k0*Y5 z&Dlzm$R%ITA}4kJ4uA^HaeZ)+V}0y%UzUk|oi0f(GBUy?$wfvP*d4Vm?HXiRm+{IH zLz+I)4DDRWuiBZ}f?)*%cdk+9F>vP@5zpG)`8oXh9J4<-fD9R*tL%yWTLkgje> z>lTR$%SWoa#B|H2%p*nJXzN+J(~a()K~6Y_WFv<6j=E{Y#JgazkwcZJp?j`Ap1;+; zCuVq;Op~%7_TwqT-8;=AH=T=l3#2<;$(Ot3*r--Yf$WvF)Ni+9J{wUzi;rsHCKAzZ zwv}kt%BI~~sh#CjF+{18?Ny0wNgqA+~NBxj0&f8g23gp z)=Fa|lv9_1%7<^el-#oeSYG&si14MT$+Qegn`98BA4S2qE3j^k#-DpG!5fVt%n~!F z%Fc24$29V1Z9U>)9iVvM)@-UaJx^iy1PWz_)0hLg9p^zi+v*?Rp_X(&_uk|_pnGp} z|E$Yqd8l$wKk}zFr~w?*;}5>`w|{mZxm@j=^%)qUvf#tyFTSJLU6$m(!}WI&#Tt7~_u7z6dLEFGii`mt>R!X}Q4YU<=J5MC zhu^2NpEHYu9ylxlJaE$ks>wVv!It+SM_)3EUHZ%4qtZX5*Y%WsjqdF)AI{;oR`zpb z0JNRSPCu9kq1s;Uu<@D0#-r~O8&~VzFCJZ^d$;DU&EYpUhu?KM{I1u%bDtY!p}GRR zHHQ#xll@}Tl-qS_Co(olxkLBfqPjB&t@*n5lw`)Lj2L`(s#@mMIh0V-&S%^(e-HV->(7gz?h8LxXkqc=hKe!O8~4!=uv@BO&)EUReM z^JHE6xEBhl#s?gKS`Nup$bJ`z)$9J*qP$H1U##grt7PbVW=di9C(EX;(s=FdbiMim zT9`Op&p2yuXXv_fdhATW-BXV`r_Rn2+-D1MdXXCkLw&fyF{_&T2b@(+y}(%msja(5 z4(jM;d5JaLm^6H%QldxEMx%*KIZ9H4- zlu!SVD62UrYcl2L5ZC*69=~-x(AJ6&=r6>I3=_db5zG+4#d8Hi4=OO$By$?xZpNDEW65AbeCH6%KmlsRHtbG~c10z=LTj|o1J=LFyg@r`fX?dsmXskkW7l8*etU%?N1-9%(h9}5NRe{ALUn-D^|g}!xt zPR$d5J#X^uuwoSo0g?Iw$Wi!9g2Dev;nB(|omw$>x>eptYk}2*eVz}=T^7`y+5umy z6+hP1SOm32kP<;q1cy9>;**46hxbT5)#2U!>Wt8{_qB$$Z||@R==#G?@BBpmTKOu? zUSF1uS0^(zal!MfFNKp0xSFUGbP+0r)Z^Ju@Q+WeVw@p_P%+LE)nkYN>;`)OCswSH zqI#5zbuOw0e=RK-tZ$|H@2QBSvh;U+(D#4EPahPx(rGr=($`kKN3Ia6tkX>lo`sN` zkFLOH2eryi|7!|d>8_q*%}VOJ>Qk?}(%gII5tLSH1s{DX9?21oyTb3fxarGwJB>vk zFz$1!wsv}(5&U3Go1G$I;RY#mb8bLu?x?PCIx73~?`ri2pHWA3MW}|Sqq-tg>glMi z2sQU~RC984R9DFzRr6nVxxiiCw}+LthkPq6MgsobZmdXL1T_R8X+2fQ=^^v~O6&X5 z8G)8=<_g)S7e33fPdO!vl9=R3;#hvG)gWk)#H1XOn3O{jlX6I6at=vMktLDCoHA2q zIZW+wm;$i@Q)h*WJVVD`a%M63Qf+TJvmDKQNXU2buKz+ax4-i1>8DmzSQDdN-aQCt z_=|Qq^9!fpiyIrzy4UZL_e$mFEk)g(9o1tyU?z!^i|!#%8W^f}4`rO8>M2y^r7(0m zHAF|)aMszxkzEsK)(HXz*)<^o_8$^zMucz-*gPbig~KUh_b+%H**fGC1=?opINQrt z)vL|eNiOPJ@KBN4vS}o21=hDH1$GD_fp5)s^|?v#iQFXsN1!j&1J45QII&~MsQ2an%0R%G z(QpY#cgXxWx>arIR+le@@ZO$F71+Xmc9eU&qa{!n(2}2nh0>nJc+026V_<#>dR82M z4N4zDN0mAhlvK)@rrgHwvaewc*P2R&W%WXp3wu?Lz2LYd=$r!|pXHD~o!_gzqV0ez zDo)9v9_N0QWzOwy3C@5|%38`5o~q1HYE~*WOVy)v0=@CNLJLvt>GQ=_-hWZ$0~-a9 zt@@(PqU$<+pva*7xCBpgBuU4~WrU2YzW&d2+{yc;dhRGjY3?0g!k=B~#UUf_oBubp z{|`Iee)7+0z|_CVH(r|!4dFC#geonA72j`3HyMpd=!tNk-hqz~agS60g(D`sVOmU$F-VpR2in$?J zPuf=mCT<8ell*|08-nd6KVa&Hpm%5SCU5(_IVi0d!b-s{LGLBOsy(8 z3XjY3yEo`vYP>Hf{~(NaLiI?{f9akqh3Wtb_4f_oW=gxq_BUCjsJyU*A7i!}AVtpE z(B29f-|qPzHZ+`WSr#XHXkeVar`+WerQ|ul01-vIbehB1V6|BW-*JmGhx4PUa zoro9l`;PCazl{ZXP}c>zTL*P-F7|cqF@w4`|3P2=_kVe~cl5rm((U{3_tvaoU-z5~ z9h1byxI{g);*d=Nlrw(bWY-*-pEeY6>%u{lP=!Jx5b-~Z5nVa?>8 z^uW&^Z`+sS;1?K`z5Bc!IG6_i4+?8Qt}*Nar_sfnb2+09P@`MmX><#6G`fY}Mz=_A zbabaYAdO+M@h#5L_?G1GyZZ>=t+%rIlrypZ;%FM)BN?ZP+-3#S*7=}7I z{7Q28)eU%m1*X32hokcCKXc$v*^tDBOqi?;3wX!i!*lqJ$l*6Khu^4x_YjC?GjL@f z_W?lo#d`4whrP^R6Gwe@W-0X6OX|;3tVh!_RVm2hs|Gn5$n}BX?LYtT_qI+wb3>tx zWZ~OT?^#XcXSpfRq7=`|o$~v{UwFep-H;N_x8vUh0pGxb7EkX8A%T}fuwDcYiC~!s z?i7Gi1eO4;4E2{j1^tN?fBHdDKr@ci=-#!c+%H7sZKxSp?eh79-cB8oetJ+el42@Y z`uy2Vm2*iH+vq0eCl2m(dj6u{sEuy&XSdN!es3Fn!JpkmH~YP9@5LN`FXixi+3#(S z<{^7z@AtOH@BH32^?eS%eL4Jo$l>>+?3bgp9P$T0`SriH*e;&8#(8$A9G2Ber5=(` z-w8?jXfu^M?$1NOLR5}6V+Mk^9Qtpx8PM{ThrC)2`ubcBe`sT$91;o%#XG`yd9l@l z`G0eJup>8yGn~e71?Qwz_f%DE3}^VI1^)#6g8CW$dg4dYaDnIye@oAoHhTKK*R{{` z$L%ks!C?7pzjv_Q%kTXzTW^0{{6#kO>ysniIezKLx-$m;mOX18wvVd$BRN-MWgD@Eeh_!ydw(J@bOIMB{|d-u}$lR?5JI*}qTMWEA@37^Y73 z8xI`*JBFzRYA~Djlm5UpmNQ@mvuS4ppNmTcaK4>keZjMNYY%Dov%iY=rIzlg2zwN# z;dcr9ioZKA|M}kiJEd!>^$~lJh5`?BAxF;bVd= z{BiM@h0(92?B~?cB&+HN`q(%j`tD%S!)}L)Y#3 z#qWVnv83>&Pf(x03}u#5PgYF7CToy;abW$_ta3EcY^G#BdTL%i#1rNIX^O-{xy6G_ zd5%ND)gkz@r_#dP6l?j@s1<+O{uI95v0oF#dbXp6U_d|(_iNt6AN#ciqJH2#{C^W2 zS0#VZbdM7Ks(ID)jsPppADZb&a9H!I?vH*>p!&l(wQ8s(*=POO>AAm^2IZIae85+NY9keId-CFVm^ zkzhXAw54rA`4gZZTKG^veA~&x;PyoBWNrN%)3qOs+{xOPBX`2}6%X!+2Y1wi`)c$~leMWR|46mC zS^;^)RBIx%>Oe{{*SW8D?5#JoL|HC;i|c0 z$B*i=3o-OdqG%q9!cWPMCHERo-q1)oYZS~xHFUP6l%!G*SYgJmUZ-LQjPloOW z(yx1P$2d-Dze$esXscJlXx03yrLAmqi5~Nf?|l|kmDn#Yg;h_?zY?nIuls}G)O_6| z^|k=5rPz5Xq@K>rM}4Mq0w^cAUI!e@sK3Pv9CEch=Tg(c!iSI=HvmvDc_OpNd3rX? zzr5i8qV@DTPPOBE`9he#f1#A19ZGUb5V+Ry%B(`K%tsK|fWVyyZ1*{DP#>lb^t8kt zUdVSfW!68S)U1DuR9Y_~_4=EN+^DX9RV<~{C7p|W{oQmR)#0ngfG6z56i~RV4%|WMt}9ALYBm6{>Tjt7 z*N>jObAoM1z`Oz^-xI9V$oDvt4+hxVa9JB=8yCsu1ohRN5j6JES93J}P8lx+{Ul;D;dbS=svzY%Kh)~q&!@_vQ5S?H;PAqhd)tB!&)H)8Jp&8LwZ}XbzwMTOI>P6-F?i4B3<}_ zMyKA?@S|bF&V)`#>RTGqkPW|XCZR?e-&v@~8o5xFgF47R9Eg+ZI}o%4_*sp3FZI5` zy+M%{E(dq*-WOa?8CnN-4ebk7t6Z&WB~=UweEZ2>M=?p~o*mE>i?Jj3?G1*O<6>wZ z@g7=<>0kS(lA&&fqHk|#E!NdXVTePwvM+%0h_E$Y)g2#nmD``Cc>R0#2K$+BtAE$- z;6Mg56gtK5ApD=^V4%-=Qe?76S1!0Cfm715heXtAmx| z5+LKX2z&y8yAarcz%W+vHb`;<0lnj<_!=p7`=M#QdnrB&Hx(zR;W;EH^o`ihs;oEt zC=+`96x?{P`M-x)e|tJ})DL51Hmj!0OcJuRqtnTtV@=S}nY~EIU`;ilW(4`(GZ9Eu ze5I}MJP7)LUEr8nBH!K5@QJ;O!0QN{L*N1eVkQMj@r-(rr8@Or9k)PXCrY7(_|rVG zg-B&b0Yb)-S9Y$VfJ}63lwNQqK?YVBzHtXs5O*W64uIZG2Dn{5sQ8mm;z`){=Dhq$ zdY=9RCfn3ePa92KnzCF>ZbToiOY`y%Uk)$hTTM91-`3j0hT-HdnA@F8mRBP84=DAAg3Ghiy+ zI`hBWI@@AS0RvC2O5=wbJ~TG7E?06A6!>yGE1eeXG=3<1}2^Q zgMB(=ZmZ?(^Mtca zWv8ghJ?r>`eu$2qR}lCe0&f7&d)@&1qy+H=C<%IL{z1P-s3=+tMfNo>)Yt+>b0w#v zi^lCLuge_%4~E zd;ew2bi7q?k3IM0GcP~-|BK|yLqXVQM7zSc}| z5lch;nbvf2kme~L&4fS)nWitaP0zQzyQW{}nnpT&V~+4ISuuV~V)RtZ56&`&;Ud`qlN7fSqjTIA z&|XW|5C6IRN*HWg*IE;Df$SzFGPUIMXZBSA&rxl#0<0l=I!IM)<)^0>P#M=-dJ66- zkv5hCK$6xlu#|T=7r}o4qV4#}0000000961000000DuPo0000000961000000C=2j zRe4_%F%W&BL<+HmvbNh5kgfv7tB6*)Dj*)P-l7%ozHjlq@cj8@{0RE-%p~bHS^8I- z$>hzVv8LR;}i5opUGm7Nwdd`d*#qySQmfdlOvkq2;&aj(t)yWj&`me_ap(__-y zQ6=|~X@7H{9+k#^3D#-AL<7A`zXU|J3AeQyB1}_|Ou-5cWF>ey3Es_HMC{=$JaYvr zI?(GeAv8E;?m3wQ+cE@UF_B+_&b2VW#=T|sZ-LkS)sU_66$Ri6R+mwV^h4)>u}E>U zJ(P@%NrXNpE1;jdAqOgKE@%{74kE7>(EA;(SsMq9QN0dXImofzj``w-x-2Q4!_Ee9 z=ypZ+d1s6%>`=R^ZiYjG5iVT~Q>%WnfEXBQXR|_t?UC2yuUwI=*h!3fGH5LTb_)jV zQ4N-n_tGC=Uo!v5dAz^E?8{Qf$Xbb+Ctr*EvCS<34h%tvS&_;@MwD=>+d^l1&~!Ie z;vrXCGSO;WFg-XtqGW$0FSDWZ1UL0ea#hb%gJNMRZaS|DBmbES;wFX}>LO4RGHWfC zqa-fF?yOt8OU#^6t*K*Pjg}nCW1IOjq%9=jjQx1biRs{psx=>TD#MdJ$;v4g%}#Am z7zNN_i6Q$@toaPTWFH}VrBsW|$+)3w)s>#hU zxRm6`FtJRXrazYp*31J}nqw1YB9As$y-`H?hiRv))Yw|Eo+a1enGnFrgwo1t!O|G8 zrnB*ztMr;$4D!!)9VpOOn)(}6EP93+qVJ|2Mc`J8Aqd-m+YS1GJETcU_ijZo)acN? z92?GhA~o1ISod?RM^bm+3`rVzAos3(^Ke9#@F^#elw%(3lJ-0zS?0+Pg!z%s zmE%vA4+8U50BVHdd~5ox1QL=KAdR$d%xRdwEpeMvzDu4r) zVm>`NpPpvDK@67%ntX~_Ex`X&Y=jPgRQ(vF9ONd;ba)TYO3VMoa1!TVlzP zot*`IaAlyqo$oWYnI0P;|M#JWL&aEO&Sce~9@U)CTF&>Gjo*K)yo3rNy;jP;Z@23L>y2aD*=XKHQp8oR3nm znNsgCcia&_V57bfqZCAsQg$+P>{NCu=HojU$b)M@m({4N)Xb4xvjz8?@XNLcrdXs% zaH<9BP&~FQ03|}*0QNwM=sXNI(-6@Oy~Kf=uO2jay)#KR^dYu4lwep{_Q-Fapg=V^dn?NLxeEOEzqY6>d2a za~>(Ogy>~anM&2sH$Jy#CkP=ulf!X9)9u-F9o^%=O-{Cd;+5( zuurO|4|O5MAjNW(Ah=R9EmcEcf~?$3*Y$?bNNDWHzQA^U|BD;?zxFBs?Nv@F#>vSL z>pkH2_x=gF{`0?>zyAxED_QR5Sj65aE?H=5fK3-aPu^5_OIj?%NQH~$H=>Yxik37% z##Hu;T)DalUG-QK)dE|g4z=wH0l!MUy@E<|Y znq|=Yk4*~WHYs}*Hh#Hy8~Nw?~4Po?^@(3Y)T<@WFfJ}0)@SWUsP<2 z2N#_!88;BT!d^edUcX$93@P;Q#j8={-->5aZY9+Yr2tN&EqFIGlb3X$S>@4j1~K!XXHT;cwLTLb0%+QIK?0X|>;w99g=YR&d{SN<-5U(;B5= zfD+pwS$laXaruVc5*r#eLB3Zr(5w^-xyF8l>grcwrKSO_6sJ)$I4$lfW>aS@lqR+w zWVllNB(%xXgvcRdS8A(^g?wO)4QlTh|)Ex-zP){IqLcN2~ z9rYK4eo?cfu0;(J#vv;_#kP3LrEqAa=xI?*bLUwR$}b0^2dls+tc7Qa#3YEoKZT1z z^p+RJRcIf1O*~UYZ?k+zkJ^u`nEm2w?BtW;zG^0XgMct-3#x9r#bp(ySCh5aK#?K` z4pK8W50TTMs{uMGvQ&{`mT_rF@3MG;y}w@Frh>CgJ*vuqyUz$sjW-Y{GI1ghpTRYd z2}v@OBr^#tNQFtJDNK|CL`R`y@@u5kk1d}Vp8(%{vI&xdHQfOffCK7I8$dg4M{NKd zwH>oDOC7VF57D!f5atQihVH1{02;bMh7GE7%r-IzoC!g5gTa{_ydc#ol_oB z5841a$hC25wdt*6P2Xl=UWArm_Qb|v6t)lJu!$Ilt>j@@OgaF|&alDwm|>e|gEpFP zTM_b(RqZIdNRW+*;{*1HWD*@5BD@!Ff%jHIN z4$FJ!+>_I}l~-FYTLHdoeTbENXnl+fIo388YqiL>2kUsyb_=1&K_{^?XM^rx)$RrD z!{YC=AH&)3nEeda;*9-@9V&Xo{uaa1gVTe_SpchWOMt-@2GKhFC;Yt>6BTeKDp?9d zdaArY=!G&&4K$CEc)JeM+xj7Ls`8^G&sghr8+jhsUfa?0?ykQ;bDS~@`EHinCe?w5 zt#X8Q3U>Px>k2EuE36xA0N=JPz{)MKue1|-rTtgCpoTy71Up@KmidpOa3De zr0c{Pl&34?8Y?)zStr^-?h9Cqc$BMZB2l*%N%RS{bPE$$YvV#i9F5| zi5e?uMw`sE$xNHfw8>Bz)xU5hfPaa)D^qLYp{ra1;sH2Dw^jO|ByBC;pYJ|hHz-%P z?s6dR8+Y%)^Hz_Eg0~d?Y{`E_Lo zcwKp`wvgXia}O+kz7&-;g?#AYBRy2+M{D3WOVG7SVnA#JsC?hCu0}Y zqeK_gJ5wJ>&eVSv$0X0<);9pe`UdkG62bh2Uo`^wt43EF5q!1L_Qu#2jW0JQ_;TYH zO(@A1O-?lBBu+HF-IT&^H=WpwQ4^c(YeuMj&3XpNfdv0(zzr?olAPjsFz8jlNmKSd1Er6HYOiRh9nOq zpJDh+^1Wo8viN^&Aaw!lq|0WQ7w!#~o0Zopuj5{;k0qhBvE|^gMJR1_Ie2stYINB4 zFh*?;dsTo?uL{tRa^R5KT9i=Q7;^9!BGi-OYs+a=G-@y{7&VN-VMD0bl{0EFDg#Cc zp%&Gqk>PNU3_#(?VAP^|&*BL6EbeL}Mj`VP3fZ4g%>RIT(S+F3f$W*xj!@a{F12UW zrS@k#5bA7)M;#gU2-uKND?1TWIhd&krLmO**$VjyP`e$gd51}^b|U{E3iyXn%tC;= znMg9(@&ATQHk{8mWj&Cyz1_Uv)Z}b$HzznXIosRK2TtUJ7vX?-5&kMaBS_@-)2D4_SQr$#Jv$cx-y5bhy@gh*xtY?Cu2E;3Cphzb6cFRO3GaVqZStdH&G7(5GwSU_lLf*C~ndo%OLl_em9mqOHu($)7nNE^mPPYUDlqSKPZV3h`O@cYy z5)4o%!5GCt3{WV<+&hy0*BN)S0$Te6^)>EvpgaQzIatj+JeV0c1sE7s00?gg{Vo*X z??|8lyglsKFo1szLxllg;@%YC-rErb-;Q__fd{R?#00O6ycr4MHzOAmC74(^g;^9u%;TM0N=i@N-zsJ@Qfz@J&g1G)_Ry!y?t>6AB?*cr+y+qGR6HE zhu0^Fogsjk_%KfN4;o?B8zFlF%-jf`S;T{wILSHitZesrd-k+P&H~S)j`KP}?Z_iNm^T9G0tbSXYh1ay1U?s&QB@a@g8Ph(^M( zD+xzJ6JvD+#=03rxveOU90nfZu&$bn%yn~EE^^qzQ@mKC(QY``ALTr|+ zu^A*>Z($t43*+|1c`MCKmg{D+Tx7C4je!16Bb-EY2a^&B>9Ls1WepNwmXWz`CIk-) z!dy2K<_;!p5J;H?b2S$13M`1zY%a3kiO!fbvEUOo3t|~Sse=IK#9TKg=DImC7j?JQ zPM~0h%ylzl?qJf`Ab>?2z-y9rBvCuEgv)g^Xs(+fKk?}$7Z3Gm6tv&aQ!Bd?bw^!2j0%L076?5Vm0pQ?MlE|8tC zd#*mg=j#8A*GPV@KQRvUx=C>};&9_8ZV5U|;=XP`L|->J(*WQz4K_3)ctfMDjR4-- z=;x*c|J-yzb4X-C^UO8`XSUhY2H;I?p0FnLq{Fn108i_f(@}JjIUVn_2J6jeOJgR8xJP+9u=1+T@_S zAw+OD1Ujxablg(Zcb0~)3un4@;kk&&4PTL;2WtKmsQ;`eu!{AcRS~x%nDTbS=12%R z8~Hst-$za@P6-RT;}!T<%SbjDVose zhelY%M&np18rOJf6H07plQ&Ix{oEv*m80yYyLbV)tLe{-A!h0g%ycxK0*=N{X4PnN z%imfP=C{_FtQirX^#(pWrs+(_+8jVt=|I~X?RcTtZY(QCW81Gr#b{KAH5~|E(*arY zIkM)Bju3F8cb~MPKI{ z&C9^iNy}K9T9&klF`JUUW6XC+&l&SPX(a1XBa>&)%J9Eo-00XJH}#e6FjHNGiU*wz z3C`R-*cNiJD#-lPAqzqYe<^fPGbq!mny~Opia-Ze?e}uk8F=7ajh$E^iVD|0ZFPLx*4F*yJGmCdUaq z{)FS2lknG^51l&vL+5M8zjmHW)Zs5Dj!H(n-%;~_?@!mu=kT24oS2EL`>wF!P{*SR zGhR-$(F`}$b{r2dj@wR$5PUjhB*>nbNB z7DfWRFmiV!!Mh_bAbcTmcyWS<7oUK-$%NvIST{LYb`0w#V=B+A3;{DMBO{@9Q+sb+ z^6ag9p)RISH=DH)W*zVxZ1{o|krxezqy90x(M{GjZZ@6NoNG6!`Rmq%dfj?K8%8Z? zgB$~>V{NZ?VAY|+xQ-k)uH(**xFOwfD{C8DJMHYmAv-%A=!A1Yr=zS2AMJ$vf_Zly z!Ft9BN4kS)(;ed-pf-ACdB5}YuX|LMGB>HtnKU$h?w00Ipzs+%(0G$IM#7zCqkI92NIw(A;fQ8 z(i0Gop0Ff=Vk}8GM~HI?*Al2)*Amhl6ync5n;b}ql7KCk-*mF72fAJ_LHAJ-q&h|AUJG<%*l{=5KRK%l=3dB(Rr)s8%; z+8uB2jd8sF-42|3hZ!AzzXFRpp6^2Bx4Vo;AkT<|)d}9@HYY4`5PFGYf>Vcf9&!@; zqH}d3c{U{8OhV7UCkl)m@)A}fH(}Ypr~8+bsVc$0%C*7dd69Qj5%SE9*c3sYAEK_7 zBF~75FDsJgc&+($$g`$?P8@j_H@MV*JX;!GXvhgRdfb#eQ(IhZL7qdcrnM%|vNprp zl4nxe^Xxg*?sYrzY;XU4d-5#pc(NmTzUw%#6L~Imy3(0EqY_pmkms6XgOfZ*oNw84 zI`LT|7uAKD7kKu&a>?_5bcv#C-VH%GhBgGP2q8USMaY{FM63@T8jbGI=x<_JkuH0& z1|lxjKo$nXu$r@Lk@TtchBf&&wI0_;#N+zQ;|Q@lZYBx6nGNPOB*eUi+nXR_dy@lA zP%JgMLg1Aqqgja>-Sh&9ybJLQTTz6Ctwyz`R|2iGT0?}a*5gS6j&HlTErl;`dxQ{2 z+P-GB>UG<(?GQ1x-D1|K7Pp&2GICCbO&xee(qVKbM2zmVs1qR;b;=-_n9=!cXF{Cq zjH3YJp6{}mWZ~w7p$=Y|I6fzl_qk&UYgtPin@QyH2mp#h&WnWLk#G@5!b%cSE0cEd z;(b@rF+vr>eQi9h{F)w-1IkEi0 z@{Fneb9LNKs-9Vc;8iug=0)e@2KRa0xGsJ-FZCw0oWci$4_Zy(rQX8U8(P0(4Wrjf zaC0q99*LY?f;@9$wwEPOZn?YV$g{2bnd;p=TqO6xV^v z${dQ(fmg~tEvo}xRhv~q2W|(g#+df0xQz{T1VdX)XrTiyx45MTH?_RgQU^Y5IlPq@ z{9{$F2;E!pEldQ{)8vN8j1uG-AG4$^dA653U5-3oR^N(@u(kTG>I7e_{;CFfW;dAD zkUZbCc+`SC+v4}dlV^IXeXYoIy47v+{9al1LoqI<$(Ipd7bnlDGC#zSXIQyu<;XL? z`kor(xfOS{0eKd;Sl5C)L*vuq$#bn`dMolwYqf+tf3)}UDxPh;m8RXjMW>b|&y2Dg z%8}P%^;B#&2}~;_)+|C@#Hz&GPfmp7PZc8 zO`aRApO6PHP`iszQXOy;9~0;h1Mi{hL4>J&cfMZr z`7&x`aq^5Q^HUk}V4=u^#UhWsV1&S;kp~M$YQpc_L2F6-o-JSEqbX{F9+V&Mm0}b0 z;3nunIT0zfK@V<&9^3|a$}M{O&H?zUpPi{U(x zU2P>Ts8&{AR~_LWo4=&Gos54;lYU0anb?Muq+(u~dPvtHS#~_&vQGlKm^>dV( zc_*3(mtLk0QW%6|oIpu3-g$H-C!BC<_p# z2oBalyJ=;{oW6|%$ht94+|oe76a!^ z)!EhY-b(Xt@z%|j_;2IE`6+&6OYM5Sf5Yfft%J3w(@b=uL=l)6ahKZUMA1=EfF2cf z9hzoyn!Fyhl$r*!Ll^Ty7c-0hW|i#Pca@3bumnU)WnosskDI$HFwGT>Y89X}Y_YWkI1}R6B7^OWe}vB4_;D@&t;bC3rc#Ip_ZzqV~_+9a@6!6rdbeNb++5`r58Jlq)I8551y1;E3N z0UmA)@Ni>*hZ_St+!)~D#sCjD26(tJz{8CJ9&QXgHg0&oA?PRf8;)&6Ft-YLxK+Tz ztpXly6)YdM3V66xhQ3>!GHr>`_)_C;@VUHrB`D$w9(-NFD-;Rxi!!rf@F1=H#q!|f zR6Jb~oVAs5D}l2QVq?{;o*kh>}qnV z2{smmLV3UbPnSD zO%w3Z=B$!GzDJ(34e!!TE3;K{1Sv$bN=|u?JX7Ag_Z|oyj&X0WY0`LlM@fT+37-!( zzvdkQ-8`%0sgmHFDtW#nO!4O-A|A3rG|y8JeFT~L1eWKRJo}K4d}hhl<~Q6~C7+dK z-?Nf;-s2nP#~WU6NI3sI^3qOw$p`PDi*%lO)t3u#|E5VQ$jj6;@THB%Cu-xxETQ%t z;&;cqflR%4#Uih^yx)?1_*gm+$0gGqIKEHpCNGJH=(v(nsT*X7kiiz1QEkO*l?63QOb}rn7+>H|5K~3ChKbd1Q$?;J zR%W63h4t|K!mA4V#u*v0Jwi{jq{58~q`g2Z@Q!2dtTH^(6HIA+MMNNbk)*4C2D~D^}tc~zDb-t^E?(?`w4bYv`;7e+t zCk2HYG`=Z?H(lKf-PO(RH3P2C zX}+U{jt}Ket(UYxcV63Jv=w=v-8FKrcX&fffz@4hbwT%+E{AD%@rQ&L{FBH622%Muuek=mck41)~di!;k%U$S+qDSd0?elKSG}TGe z0Fz++!bJOhz8M7&oKfJ{0s#J6;52SP-Yj>&95@+OR#T&_uClob1n#bVu{N4IirY%( zUCSEm!=5l%lp1y_Y5OqWT*_r`fuHfx$tAoBJ$ilb6_X|!c1kT37i;CbbMX^oAbWes& zA_YUM2WMfi?-zt9u&OV1q!>8UOKd6u&e2kzmj-8d*;BZZQU2!x}Z;67yJFTR?OSlCx^12yOsS>0QY-es_KH9gQ#eJ4Q&uy6Sw#g zp1dV~6z0#Yn?sv4zk#FU22(pU>VW*-97bRBZ72}7iCy>>c9*z<&=rUe5Jfh5rrlhm z$mSPuA|VQT*6wRVuDR$coBtiU>hJ$jhYZ1j{2fqMz&NIMY1I1d1A}VrkP$9uR#ygIfX(1Y4lRc!8uo@6{n_hqs+O20_iCIuRBp|VgB-NE@$Q3l!NkIH@(hOB8zybmRu zr>w<-u2ml6D~jKg;W&>?x30FD?}TOH1+y$MhmEOZC=2m^*-+~WXd}bDCjBd5cih@KaTFjV9r08SO zJ%TR`p{f@w2xZlU=GB?YG3-w#$%YH?{rUoB1sk-3;rv_)WFM#nl&?i=C`{{bP{e;D zR%rGcDUzvVstMFJ*9bCcv4-g#OphqD7_FgATQ7$g+lR>I9K-33u{}VH6xsS3>Rs2E zK1C~0Z@soqAZUPvBmyW5UZf3?>3^~qf4uN)j_G914&&L2wfKUgwh=C=G`Oso_H>3Wr=P)y6KA2 z2v*X{A_ZX6qGds|tTvhV(5P#nw$PTl#W=+v$NWg^0~^!_H7k9HY~Kg`eHI7;7Kkm_ z&0E9~8^K3xqftp69W)~dVe_P1kQ6gTdt&DqK>?rM*9YFfd?!=B4x~lEoYYCALy6SM zq~;1wec%QpeV&G-DNOo2&78C=m$oaFwky)IKB#Tw=xLQqi)_DCptBTO1O^SZ2ZGoj z##L`vFtm@&<~Chu*m2UOSso>B+(BB9{v>kokn|Dot!QV`)jdC;Ez1eL0 z#YPKv+jE=$0)b4Ktbu;ImuB&i>p521__02=YWq}yws}|!>IS{mZ9kqv?#DZCE_q4W zA_3YWcS?02s9`&04%)B41kvD<#rV^u_YtP|(KH3Rb_7~na>yI%8+6{NL#=A&^dT@I z9Y1&abL7o7xMtO_QTV;!i*e&XQHP1jz$*3LkDd-pb)zcJoT77}~>l67>BKT5{ zuo@`?Zi=8A{@iwKrgWHz-??CATU^5jx6=Ixx}eh`7#)IW(IGWIEaXY;+TdwCNdP#F_&WXmn!QJS_iEF&>iKj)=77POH2+t zb(xVJ&iQzcVLoT(!p!y}VlQXr!py$Gp8JN=b!q9EuA3$aJ}{UeR%yO1;%kL{XO%Bi zuN4}T$fI!P8YRZzj^cPR8=={_0Ca#(u^$EPA!VkjyPas(1=fmeV!rsU2Mt*7TU--=%aPDZhq$G% zsUAhU)8MOD5&54ZODYD`2ij`eR|zYx4!S4x3xevnKJY5%ZE>Be1353nXgak#)TO+M`D&W? z^MPh;xC_!qX5LIQ6s{38f(*nwwL=G5GA+f+%oS+GxpuugUJ#j~ULy@LnGqb>xaXD+ zxHexQm?sMrR#TyC3zso7RY>1rs0RIAt-5v4lWWHHRdpz$qF+TN8^HiOA4xJ~4z8`| zh^5*Dawt9DwLrh^l<2({#+b@z~O)X^j)z(9rW(lg9aD$4-b)pGsL@6%@AY7 zJJZ#(%vWd!Rv6$U-G>1T&Cg#;s2bAO@~NeGeX>_xwPu(HLPoDym*KV=T(`BJy3a>C z$TxL7K`&X>I$-H;BU78$L(2=Kd84G6&0yakpJ231R=f_3p*k(V*CL(?O>RUMXUSE( z4jbjH(}Lj^@g9Tf(j?^)Fyd_gPGY~y`u!mJe%Ep0zm60Ckc)$G;{Q%lExuE>;a=)C z^$^-xJ)|Diwp0(RQ&5CYkQwc%N>@PDrxL&~tf$ZrV2164 zoj#XhTE6wT(YapP;IVHHiDlw_pGy$ zqyvL8bWPMlR-f%CT8*`#$4DVn1MLHU1POh#7Mp%8D2L3oo0P9n&HGyUBESb;N&ugg z*oZ8!kt4Y<(if`X;8jOI6t&i&VlLY$ohvqJ%M;4TK^gg)#WKcrYOyzaVmr0iPIqi) z;Mgfz?CqY|DO&6lckGlLb9>ewF)u?40jq!q8_C1em;{GYDuew6iJq%$X_f(&VmUGx zk8BGxg_1XIRfKRg=pV0jRHC~cIkHt32=0=J+jPs&2)L=)YMX74f~I1r zDX5pl??7NEt__BYsUj%N0<9jM!<2~{jgE4Owo;i%vT3IJh1qgZN1p&3o3IO$-zAP{ zYSa<27bV(Wd0bPekINBgwt7U+gdj#t2wECsrsmOCwb15Prvx?giy{7*Ib_1pAX9}a z0lE&tv>g_opcE}yN=_ijn!p?dRpE6a*2cqeN5ojE-9eMrZ0y4-=ogZPA6_Zf*IIZK>EiGE7W#LLQ4<(GKo{H5(QO6Ci;#|S;P{fviz zZn2K8={g0U7DV-gcs+puxPQJKOj%-H z-=Xsz=GEQrEsHLf#=x$PJId7OS1j`H0{|FsTrl)VU5HcULitiM;*RyLm3^yh$8F>@ zq^wJ|fvvw~5N>8RXdcqvf|S`3puhBYg`hf4%iP9ak+;+sK3!~OCs9e3|Np+OO zna0;Jyajk=jk;fjK|at@JO}#mVn8d*;gFk1f{<+wSHx*whCsBbq3Cmd8x%^(8Bmq51E|5gF0I~;|%3%71x)#7) zE#9XC%GJPD0G(CusR;Y(K}C3+?N`sgdmE+(l&8i(kahzHfp5@YmK%eoqS4){_{}QQ zou3-`)tkXQGY+1Kc5G(?t@IcWHjBaqsxgq2)PaK-9yHi9`XN)sVZLmOUbk{+3sPG3 z=OZdf4fB%dj*(y@+k8ftCjbqApR_X8*_Z4+7+?RGA!rhsB?50J(@sY(ZpB{5F~#HJ zhEOuw${S+3rhrVxbL^x*DO80zRCR(FclP3H^_q;@>||xSrixJXfU0XJZo^K!Jnag_ zU>uetD6=h}x?^!XB$yp?so^(Ky`58OQl{)yTSscLyXGa#zf31Rx&TxJo`~OyP)pxe8YU~OF=(L!a;?L{D5qV4a za72k1Jx9dEnsbCMBYZ~Uv&;RY!GmzC#Bawq}%Wjs)L6sv%%oWD1N3#?;`k`5`ymhig%HS&OI4Nph=l3ZYYY=A9%jDe1VRPM4FlCG})EBG~lWfs_2VHqav_w0L$)dlaAmVVrL6G^s+@-VpVQ=Q z4KZ8pL&QFrZe>Kebvf>dF1O}tACJhj-N28<+^~%ZHcFH~Tyh7O9Hh*LD{us@;F3GA zh*my_Rz8Qjd=4z%8bqw&@;R`4>+$}>dM=*>%Xb&;QQWm{;LQcOA?O%>ukl#W zMGbK==vzd58$>m5m^~FSmY5kbsVDCi^!(7n#n8))!;WSu>}$qhcQX!qoN?Icp4iy$ z{tGAi`5w_ZU}!j!DdzEsLMAUp0lHXO1{ol{3_qRRLmp6$YKWuCE8OUQr4EyxNW zxj(;b=tX*P7=*8jqbowYSFA*RS*ek+d_Cx7MR&+x1eF>lg+*%~#iAk2=rYuohWLqk z6|oMNPg<@1{TFT8f4Y0Y1|6fQPcujQY9xkcF3S0;Qu^l`ng5gDASwH`Q`Dlj)zsY~;2UF{P+9XQ zUt{WAWXOP3d(4ATn2m?$FegT1W=x9tF%GlzkYcU@z8s35JoxhzTsq9eWtrbGn+-&Z zjBd>W#uySj(8D#+t-XMM9yXZBQZ3O$*wE{5*g7oLGH^FWi+0EJRidIhnQRr}P44JU zCS}F>rjxFD^$b$`bN4E+%d^kReVkbd|70lxq70r%zy{{Y}0Yq6)- ziXGU~JH$?{r+12Fis6ohF16ZFf!cAf_-`-)TYds=v8F&b4pV3m<{2su5ZF31ZDrI< zSB?)N!HB>$8r5EZRF5A~Z@{-*phUhGxeX=D$IX(jCO1<}w-jvP;iU%dt1Iam&!t1@ z8I=Vb>7m2gFwa^2%0s3Q$naBqy#GlKer_hNDTpE6?9qIXt2h0EBu!UIeL;+lE` zKG6l3HGMJ^HhB+DlY4a6iZ81ETlTmE)1)ok+ImM<_JBr!`np5)YWQ$gI%)d-&^#QA3RljHoA0Fbkn{>K5l~n>+zrT z*%GDl@syM5#g&Qy;+SzbAU+p4s&ORz)3^rur|wy!F1s*Lox;jN$;wr+)B6wns7#eM z5ZCIBn@?u0AClvPSv|z>+Dcw%<-GZz7=HL9#M7+<<0wm%AN2ER&jDHlO)b>!#;x4# z15cNHFdTbixHzlz*I6+hdt|(FUF)Lj_)H^NK2)A6nqG_P`HiX%`r&`Se#R}B7?PDb zMcJr5@{}G}^{e|1jkZi=s++;-#My+$4fSsgt=IYpZk8SqUu#_cwfGig=eOdy)%>;( zey_gu*L=E6#4aM%J=*e%;J^s1@=**2#CXiNe;z|r-^)HGDL7^8VW^8!bSFe#hmQ}| z;TweBa+I2`+J^8Ed%8LfZz=4QN2LDC;pS)g^v-TOGC8H2!s+&abhB~9WvjF3w#fn& zZ}iJ8>Q&r_xT+q(+j~bOG?2eB82!2nZ!%Bdlkf>J=Om2Wd}eYR1reFFVSB?tSci zEgGWF2Y}du5-(9NQ1XcGSS#O`%qduxl%80Ko>S-@A(q9&HZp#9t!R|CXKKJZ0MB1L z_6YYYD)lVZnBB&4yt7GbQ)jyLG+|x_dOH#`Q@rJmV z5k@9MH<*Y)ghU(HyjA_RuOhb3EPZixS|r-I318K?M^n}8nwrmUU6OQMLxFe=#t6%Z zZ&5i)lEakMCP47N)aQ;m85rS?Uv?S;~`Xl#$0v8E4H>C&0*xK=Gy*S(pX7+cB$mUTAbe zi#r$NI9!a+$7rCf5{GfFKFn5jH!6E^9PU;2Y2$F8GEuYO5%^;;P8es-;mFm)VLkia zV3ZnVL;)7#sg@#z*jH7%iMk5kj3>(5;^FVpJ`~SH2_gze@=UxEr3YIEvf>$#?3I|H zMEjC05H4T3eagu{Lia9FQkpxl^Z@SG0lICaX<7$Q6QeXSGD^wR#7L&{xmS#Qu3QT& zM$qVO;r-Z%`^6&^Bag&vHPE-~L+n~3=g2?*&FlZ$0NY>|?*qo6Aw8|aIk1X2p@)5C zQ!L1%As8)frqH~;IflXn{g=T3%)~SS`O|+6N})MommtaY3kX3oS%qIkuRTT8EEoG+ z$muPU2jVCAKq;bE0LEQVJdVvOZEZ%KvQ{O4Yu9T&fD+cM8d}Ne7@b(L&w39F4hljhlGJQ{!<(Y!SRe!1u$3Y%AwiTMTl5r z{Tw&6KDW)W;Tud_j*WwJZ1aOnAMcpv?4rzEklC-=wY6WxJk)gNDH-@dS<1`>neDdH z{np)hnAZa`8IEQuhU4Y*?s93+PK0&_9miYg$Ah2%Jxum6{j=wG?a_zZxzFD{?F)tC zFl+=4#dgs4k)SEO`$$kgMq`68DYgmYuvt8$*fK^TNIxQdNr(xLwVQb_AbRNjjXtrRqbsCx=m}XrHMNJzfEx2V1`|V-m>i|Twfl>F97$JXRHhG-usWX^L8@} zcy`fMIws;3z}@nccRi|~e&uJD_j2TBb*yCHSUE=qLEmS~_j1g3RjPqvPp0mw;mo~R zeW1D#4s#z{_>Kvd`e%V(D2gLo#1qA!1FPqd#RZ*Ig#YYFm@`i1n_KG7xe zCt$!oJw^jHkI{OJ6AE$**T%P?48WpT37y7nIF1js^~L;iWN0{0hDW%;h?o%ELBv~U z0F70jc;BM?88Lk)ZYc!z?;!S4p?Ipi4U3o@N=$EekdK1pQF6XfHN82K@cV?;E!q z6sue%?WU=IaRZzjUCDoTz(+hKDtYd_>Ox9_q$*hn#!;op`ddwU3Ld&8EAhasRN1rL zs#}$}^qCFfjf;eM|Dra8qBe{--WZEFD6&sgVHepHVNafRTzg2tqj9&7L`YSrO z;41jQ$~%*d@HZ-ij8BaUnT}R1r-vL2Bdc7}Jh8F3B|lC%hx*Yu>-Q+^ zzPAoVHEF1ArVXH(wqs%LBO}E$3295rk_lN-g4D2sH#0Xa3;kDxHIZy8ycJs%Z@?C1 zs;UJ{Rgc-c0T1z6qC>8>Zw>Px%?pj6sj;;HY1HBYZbv@F@A7n$bCoq=X76Xo2G(?% z3gie7^6r*3`L32O7Je?Pcr9pvTKLKHHk0tcVUoxaFlK_EMQL`7QshB_#=l;r$q{J$ z3p6ZLP*dPC$DSDIA&O3^kL zcWH=S3MyfNp47#1M?)%H1Wd?NFieZln4AZVDF(O|Lzb_uiyzSW83$&7`Mo5J%93kv zcWMpVc}$X9@t`R|=HiobzwKePfVmq#h(YtW+1rZJ5Vv$3CZ0M?1r}v2||iOmm%7d`>3~X}DwszP}~wbp@d7H@LC61K)KaRiC3+z0gezew z9S(5neo{*bw@2Nt=KsWl``A*P(EHV+YT;B;Vts>-s;AVV#-LQvb2)f|ypH=_qivII zzIko6eT#cu-`a);`2_jbupk;DP!^KbvdVhYdtpIGvj~}Xk$53!cW0XNG=L59{|`85 z2Ab;bE$^ydpz@Ms+hNnOtB$t6{1`R-{-4@YH4Pt{ZL`YQ@p7poU!Zqu%gb zoh!{YrRXW_H1!zn*ZiW+mgZ*2y1|&3q|U(2l^@h`xS=vmPLX7=*t85q-4`&5M%zAP zU-VRA8_3>C>OR%&|3RH1HNQnC`AV2=kA--5PC|;f_fv|L@nH1{lrgR?${6ogm+`%I zW4KgP#(f*#@D@RL>`>B=psvs2qmEHcs$*1>>KaQ^$GCT1*I1fC#)Z!yI%M{OULl}s zDg0_dn-2^ho-`~z5@dK~nR+-w$jS`>XwaMih!XH=ejN~eb?UOftNSScpMJ)`XA@Ai zPrwsTzs(!{hCax;nss?XsXG9G0iQAOSq7@k85}>b1%x^*4eQkPh`_p^GV0UMJSZp& z!Y6L3Nm&?kWaS-k@@eo3q8`$=s>NLqExRi=7aIX3#w!xR`DwDwTattnyC!sB!-twkxI`FJ~ z9+ZWj+F2L;6FNTyzX}HAtKhf6_K)2Uk=_Q63<=|jLc@#<`2y`nei1S!gg%J_(sEA7 zD*Twns*o|E_*tmX=b@N*=;vWF6;DrAh24S0xSWz_0e;bEa(GTSt|r}0q6FTb^l2&H zLf9qV(q#NrIiS)7!2{}c+Dpi_9-(JQM}qDJg$}?9e8wfd7xW50Ec7bqM>|FM(LRAp zluZa(5kiO+AwLk}hmdrvKziuBP{Mx|I*dNlI4ta|JdDV5BM%~OVSPbn$hY9(T(TS#(~=gTg-ph2J>Wr!=`tQPrNXo<(~3~oieJY8LjYmw~mS>b_9 z3eorA2CSglg)_B#X+O$U!3duW-WJZ6^86l%MU%B*HCqL4q{EqPyh_332=1eUMlKG>-=5Wt1%P1H#?%kNM=F0!7$2eT)vH~GNytnE5(_&l&p#z(P}gXRVW z(&{_#aob|`mdd^_>8mQ}J88XT4dO$f9P{b4mix@DR)>(!yvo~RXh(O*T1Z$QhRN$- z|1?9Ceue086WwXnFRekTY)##dP#p~8X0&yq6+M2Ts8-{bcKxmd(kQ|p6HeiwMrpdQ z@fy-hRS7%7<}C3B=?j+7iIQX)r6)~7f=E(HA)M4xam ziPQw9gLNv*$xe>szqjfd?3Xq4nd#|6z}aJE;|_bQ+Nygp z-r1OJ+xCY}_`XC1=1a(0&CDLcnY$=+g0<{jTJ|o;eyL*r)3$eJNIa21h@d(wE`q+1=v2s zJj>%as~uMsA*a z!wpAm4mSD?YkP+*cuc#PfHi-r{DSs9e^Gu_=;ZEKKFOP_F2%>vThxP4a$M4Uqn?p? zHA7xNX1*XVO1yam&MidWk{LJ@7h2cg5`T^Ls?GoIND$O#t9ru67`|WK`#`PwJQa4} zx@?J$Tb_!sc#=6*nW=b@2i0FyFO+UwW%WXd@2fieZ*o4*k@In*q?bHu{lyk&a;yo3YC8h^b0!D{{7Qq& z_Lz$_Zg)oEtP)ioTDp97wLf%A^+q5x6z$!cfs{1EpXINl5dJEMp^zD7&9G9m47_;d zG|Pc4x)%lFqNRznbnQSnkV4k=Px$|*e?o+R4xk7FhP?Z8K_7s4_}~%Bnn!qioFrc= zziAtNzo9jsB)LkxgF@zxe1+?)S7?IY^pNj9p4i=29&5KkA1hD1`*%;2sWzXDQy*C< zd`=r`L0+}u!}vx|f7X}dyTEAel4ARpWdQc-L}dmJ-x>TdjT89gI+r}He4~U6q*cbh zkmwubK87w**Q@S$$J7g`@?F5spd`r`cxj@W%#aggeowrC`?X7@6VPr+0{qR9bmPjb z;;rPTs5)I$Cadh549g(*JtlcjUXz42i`o$M!PClUR0~I|Q&kdN+hO?9*)#rpbdLP? zLAZg5jgkK_?)Fc?4}A0l5w;D@hn`lSNw<;cz_vltM2bwigF9jCmF;Nwce|2{(j^yL zu!sC!q3y9_>SYzep5oOKr+lrhlK`!QDaPbE0{5pbi#)czywRGc0JLp^N^Y=HjSy~H zf^LdC!X0u)yb=1a9AyQbLatD@DYn6uPZ0GC8p=&RTm4GalYga7lWvg}-~)UggHWBR zY{vQIlrjpZk2UIUbS|KwZHK(AKEiucl-whAC#n!TX z|A$BC^Ne*KHAj=x^=*CvwqHSs1)kwDld^);e)HsMRAKuTlAB>>GI;?VVo${j&Bzv; zp)wxGj}E^)g|+opkfA;l;#ZFl;42F8o7r%6Mt|WABn*U--v;2K9uRK(B)Xt3&@kP%37=b5`lC81Kshw6-Tm+2`+GKC zWXwj>U5Rp**yc6*=v}26=17OE*#Su3C!OtMDBs6J=-$$hbgt4^fd^P}GJd?n)Yc?@ z%t({pbF~R)uCiYSI^d-5jI@H>T1~^rY8pp!X_5T;s1;PF)qY9leN9qp1zp%G2e+(p zIH43RA^i!RX}qqo)tAV1Uy8ZfCsXGt7f}RXREDaI7>ZYSd&&iJwPeI<6c9b(Z$Bga zR}Aj$$*V%9q34DeA<3uTpOxBW3thZ(*k4HO&ouaH>@)baK;80A(Vqw+^8^>hO^h?* zHtq7f0djQLDO(iJ`+fWgp^r&VCeMiL6z4iVis?>K!J(MAF{GuSTcwVWwwG^LSuB2A zvv_>DPTi~ew7r2>lVrI%%p-N^$a6gk*Y(Oyjd6A=4;0~Rc+HT2ixU8TsWSwCAsdj1 zHgEziOyCMC4_7dq0VPp3dcYz<_nS0nlw5Drnod&RwCV1d|r`b`+Gt$wE!>lN8xyxBp#siSjzXzLCO3ibZ%$FIu#HDnE>A>lA`I7HR-hY`~T+ zWV2ULKb>)^KVk~eG+mc0M7D{Vaceir!F`DwynT`^H;O|D9l|C^mPf=U?1)XM$R>j# zdkCRJ%5j8_D;E&Dpj<`hs`4E|-?_~fJVWT2@(Q6>=(r54V3!QSjq0#S&ANrBTCWt_ z%etdMj(IDpAuNjTHgkD8>I2?(d5FUxJ-mib^Q!L`W_|B?l@Iakm*vRv<$={RM265K zGsFx7Ji`zE$^d`m2X8mP+x_6<2KcxieANJ7^@AVkVQ(|&ke;QAuIBaC)Lcb&=|j!| zF-1X-H#S1tj6(aEo?kN>lhc=}K7QA>OBX$=OCLRSKpYT8_?!Vg=Lg?0z<2!MUkvas ze()$o506rO;VA}qiV-$%RG${0@9q>dwP;lUnuCJ;PgD!QEJs29=dcA}7Na0@tLF4s zgAq7QkAT{+d>Dm`)kHJuW39#&KB$x|ZGyirnk~3V;Jl??U>sC>YLSG*g*e z7AjNr5DLyi!fTS_vIwMdHiH^A(_08}YMD4Wlb(U1rO0N-a6UW6(NeT%DI6`p`lcC7 z(alca9hMUut*aKTD@W_?tK#Q@Hk&1Iztne1$-@&h1{%e;j)nk+KzYBO$fRk;^Krj< zoZ&))ukth!>obyxTqZ=7plvG+#kL*FL=ICTr>v9!HB1;M0!+^I8NT7z=EFIi6jP$E zvQkH2mX71Nq5MfYLY+D$Gb1I>6Lir58c?Fp@FjC-WEt2H<3WJpDYBqQezuxAa?^H9 z_9#A(y6)bD_e@W^|8=oTflgj3Mh?gxD`Y|f015w;eR0R=pC8*1NgGBV4~BrjBLtI; z5F>=z7v}uYVuD~|w9@4z&qAwLeJ!Q%mB}oQMnpyG z>}eUpqDt$-`umw8(&ZBgtr1z&^u|ggmou`ciCs7y*)5$Kd1RuXlV{J8_9WLeC91G2kZxSE850f z>_>tufa(vxql==WQTB}k{ls&JRY%zz#82}!%)D*?!|ZcfO+jWfZ9}%bkU|sAZq>rL zS6&3lRwRm3iz-GZD#hvou4OX(C3oY1Zrv%MdmpopV$nzEg1Mc8^PAm?B3@?8+DKt? zC&~_OYiG;VNZ~M}a59CHD4hPawlkO5gFW&nIKNjM=?EJ`fg7j$Tv{_oLYM5Q3Gfjb zONAN|8-5d&~49#yHFm(8!9GM@# z4p*|2S>uv1>-yYu^_%-Y!>9otIU|?bZ0S*RaaA`RTmqCF6I{*MqsR7^s00001 z000000002m5C8xG00001000000001ZoQ+p|P?Xmd=YHRBcM%2FW!YVD*#|7kdtH!c zAi_QnK`Szu=Fw)VZ70*tqz{{Bnx@k~P(g`kH244|M)6gNRspS1qM~9}2rBphK~PcG zfawIWC{a<U8FytfuS(}1aF+> zu!R2t=#$+cQYIoW3bFrSsNxP2!X)VQFhyg|9IWJ5^3)Qa$>Q}l43*ptP7KKr5rMcg zWM;$Z783y9iSRdxAs&9i42!tWi3C6RtHtYIVIO~jsPQ#J8P`BIX`%fNG#}U55TnAa zR=U<2sD*xdgxgWfb~7Kv|M17$w|{kFZZ$%U;lM&h-1X$UnMOj*dGlq=&>G|I$fN+MgrIC=EoAQm1O_3_275A6T{N=68T1ejf0HO_ zfi-o!U}hF!{#$taKTTpi5w3#TfZx3%flROy$#U3|keVlk6wtGTYP4X^)P3?(3O8j^*Qchb;>zl!;9(sG#+L1j${!CQZ!UR0W> zyXATsGk+tFvsOlxRcfG1quouFAYSL8;3d4=!O+Y<;8BBCPyxO|P!p-HYCT?=N4d0N zFiw{=(OAiPD(!G;5{@}I#@7KILQhABtXPggMX@hEBVdrBpWi&*_BYGXA@5Vr6(!z~Yi-Xex(qH4UU)Uwr*5ug${W5m#3v4uO$qYov-`XFcw z^bA#;c>QC%{xL%%cZ0}J#fyK$F0NTJxh6&ZfV#pY7y5J}|a6M{SVoFJiSMlV4W2na%`6M27@phj3{;ztW;tBjpWrA5af^-p3* z2Lq`%6{dva2!E2t6IqEI8~yJ4VY_yP4xQ#6GrZ=n%;>cD*wJslZ^w$%+i4g|`!XG$ zW!}%ksQZx{Ww~o}aWwx>0lEq=7ve_Y#<^Hq^r(oA>tlu|Ml3QtHQ{{XnIx2?*QcX4 ze!=&c%*`&H^#LLFlE^8?&)9w>uY03l0#X3`${w zXNsW_hJET@EiQ!J48xtUe}!QztkZ-MYjZr>;%~-dAbuzw)wX?8@gR9u3aV4Lrr}oB z>TF!dE^(mDvCe^Aj%Fvy-CNxlbC>60WJW_CYG!WE$7lIh@=;RIUVy8!ytA-x_SkIf zn{#3g>I$0*alf!-F20)ka4u?#8jIj5>Lo5Kz$;Y@-9Zo3XwejF(OTG9NE5(vLbxwX zUKEUys0~qQh`$jJ@3hC$(4KKM1MM#i5Kl%UrJv!1>9UEs)1&k#(V@Jo#EOVD5m+3z zOqd_Ghc-!bRf*RD*sdAVpw8B0laz*zYG@FS9Aw2DHmP=~uvb;5#;|%M7>|RCH7M28 zXav*hv{5J7>+&Q;XG7{z9!=UxJt`v}N8nWCrAQ3emfF$e zJmtiP?o)1bxd%wc^M&cDkfGdN4z=2adelcAkHk6K-KnT`);qDpUGK&*_c`ev2M+0K zLTP8dquHdz$Jz!hx)b_rxMq7`L!ING11nqyT{z|Hc2WM(|AXt-sJ85qqyYlN>#Z{E z^s7>$MYl5qW#Ro63`g}xV=$&F7EfZU;!v7Uod8clu?^jcRY@pIsY*dhN_Pqd(>_SY z@{EHSxRtpq3tO^Uvv4f?d^Sp)jZQ(G1{aRHhFti@RZh&W0Paoj24aowo(>nyyDc~z zwL2R7W4tkFjrGRjT>L;hDiTg7U|XU$5f_ua$=IKEB@Nx_B^emXT$_dE*&k)2!?DDP z9_Ldhmbn^TXmed6wrlaB;js}HGru6+u$iGc?C)gWy^9*QgXHQv?u~K2+715?jnav+z5vYvVY1@t!PtFw#n(jrB!&%wD4Y@23MnpFGV({WdCiqpjsqANm7`09r47;6n?h>|A@{kG6q4nuE55M>={xB+i3uR!v5IyW* zw*~XLbA;?hQPDH?&$mB&sG5BK4KSR0GXMYq000000000kbpQYW00001000000001Z zoSl6Md|XG7{`6~At7kMC9dAY>`IN8N@iB5@ha~pMP69bRvJ+T{GqOVh#2&@DZH;^= z*h)rr!kv+wa4bPiSpL9*oCB64atN@%A_u~?ps?Jq3b5SB;aXt%*H_&$lAXXF@h@-Q z>-S#2?&|8Qud1s{OZy@bir7d(MIuV6KPKw&!xs@(Ft|=@#;ZU-%!UVrye4tBGI7I1O04L5rtuj zl&Pn>n>G-ct~RnpQDE$XBp2&j_*^%)m$POfH%N_&nsIk6H6F|7a%IvRX+|Wd3Cw0{ z#IKTz92wIsPeyYzpNmwUluqQ^xn8|DOD3c`zS**lVwX`%k)Q6Q7A`QRi@%wsmYG>n zX_|vKb#Ia1tsI;Y*5NnnF0<|`=O0=pHH;dYDNWjDzDOCH!;h*QTFQJ_WJ@@z>cJG`nC0VQ z+**v%#b#70&GS(Xb`l5NvZHb~##~uY%9N-CKo z`oRl)|7aCA-p_H0QgWrTjQ9^DfY#99_U+>FOx|18zNl}wNmrn+h6?)kve93Hnkk22cqoP{*%sr}~o=)%BC7R(q0SXxZ1mGw&OitPmspj1a+^ z7K*+K(=+9$u#!1z()VD9U;kaD17+8NiE8`HLzNHV1L_KjT}Lqba7;QBck>yO6cB6is?iN z9sWV2+F^b>nG^{$O4i=Um3$?VqcqdR7P*3Ng%lbVgj`jK|M;s4<+~{*#dZ~?FbY@j z=N5C5wc)$?4RJ_{oYjiba!WVxkl;*j2P5j`(o3!PX50gMQC6g$);mW;3g}l8zm>E( zn#Iz$b_3~66zil}=Tq}`zSG0SihsLhhVd^ql@`ie)vr)a#`Az3liO`9!I}8Yj?^}T z>c^;FN5`mH@5%GcyJ#+dCANW*D=D^y=62;MwOz#gT%)p8?O=E&G@C{;A|1Elm~>)T z8gUdPqJ-T`waX}Rh-xpT#BZqfN;7Kk5goO8$Fk;*3@zm0=Y~REEf@iN<-iebBgUdt zmuANx73%X+eZ8GWkTmtbmQUAXuF5Z(wBz))Q)BA?p07!NyxcjK08kCy^Uzf zI18aV+nkl^jlO}&A}8Eb{Nj1ts`!l*nPpUeh|HxUXs3ufr7yI@BH{CLwC-n=N!u_% z?YbdLVG&ICyZtP#Y=L`uQdlWWGCNseU>%*LkfpWJeMO3Q>sW@XKjyeQD+<<4+Lwbw z1vya*Dj;*iXv0A{x5ub)C}|3H{#v*b88-w)`0!M4vkr-Bh0Q-!GzLt zY{}?1)z}Qa(no47H6P{UXdaWUOI}XfePk~O1M=KA7lzUzmOAnUV%cVWi|64>ck|5N zlf`Uf;XIGgPvaFd@8TRqKTM4}iW@qU5g`?2y)(hu2Sa?6XCY78j0hBm7KC;8;ZT%W zQe$UQ1AaT)t*c$>OFfTw#2`E4IN%vD*`y=+3n?aD-B<8b>Tpy{ds5ZA;gQQb+#sIqUU`{+VdWI< z-K$NfjP%xN(ycqm8YQIYN^08aC>!NV&2xhF0mT?wb8{g8Yx#FERB$IPULnV|RM*YL zqO=%uwG<~)QNLi7fjPvuJl?=V zvj@{DTcr9e)chvC?hGN|y6=%`U+*;7Ix{SytkD)i7Px0Bz_ZQVOTDZxZt~qMDw@r` zWNypns6~ID^}W$YZym-Uezy?-G86$~^zf}k%X+j;b|HB$lwzD&p_#FmxsDpI zn#5qH{2c6pP|H#*3%J&zPx35Vso$`Z2e_M7_M(uFxXWis|61l#D5Lj=ooWIQCM`7u z=JQVPHtc{QaFltDK~4`>IguD*-16MzNR0znuHUY^;>rqLAGXNmk9uijphZJ zHtKEQxMP*p4x+VV)S&A{Cj7Av_={1Oe$1IoT=uCOc~;cvk0l`<_PCMg;x|5dBO0qe zo@C9rQuF|sf97M-=#SmV7cGQOQ_k2SJ4i4bX#=UwcA^zbzz-%%Jj+0aLqI{tI zejC}9BzX5yS}w3RMYHe=i83Qsnk1`xO4QZ|lC2G;%}ert%1amw=5gK(J|6UJd<0T{ z0{smu1Q0Sq?4QkVA0xfNbQZYe=}Smmz}%uQ$s4_0 zL7-q%=Bk2-=G`UC*Am0%yy#NMo7x@9R-e=DLY{pl{7tVD3)-DAQq=&@L1jc8c}HMGfm5 zBC5c)t||a@*PY%8rNmN-xp~5rJhRu~h#?#b0tV%|tb1B7QN_|&7OpmyDMr7DS)Zpx zUDm_bAy<{&oue~#U5;Yw=*-I~+yd(vlPksz=7Q+u{LIcA&($21WXOa$a}7nWro>yQ zEklVcwdE*;w8~cJ?itP&92f9cW3Kmjhv|Xe#~qUNt?%Vg=z&J%H$Mry*2F?5Ym$}9 zOt7$-E8pa=PtZB|&C)qpC~keZa`NVRN2lKC5gwh>hK8rWC?=m?opo%yn`jq*q9-(y zW29b?&r8er0Tw1_%2|^u>2#Oxa917Dya#cLyp1IOp9ile;tfPcf>P)hNBk6uIF@&fkIgaDlE~kg9c+&{VXVkzFBEbga zgfsB;UcrPxv4Fy=h#kn!=!NBh{L)5&cgMrX0n>)%)2{}it6plFBKfDk|SD9!96+gp8e zW{xZr-viFWrZ)pOo}0(ru-jEy6o-oHCQx5(p!h~w+)M3SXx>^j zX5Q?z4G8y-2MSaE^_JCKZGVyMQ;ca^Y_^lxK;JSA|tLPITbHc1wTE&luT07c1mog zx}VTIp3R+|{J@*!zI?X~F9&N+cT{h7K#VbN8J+srfk~cDB#sV-I-xxwVl99I`hs)E zm~Z;I`*La1LWb?k#w_EFlwR(gKl&z{VLhj#%!1AnumF!eKJ6tQ8;I-{d2gs{4z_n+IUW)2fc-%;R? z+f_ozOg8V8bBO7cpv2RpdZ}S=foxt}6s*{74#vL9mnmsiQ{r4oUPuYupA$?8Z;qJ| zkF8r9Snm|a8)Yd2;2J+hU*T3W3|tV#O*Nlf+5() z&Hf~Mhm)5Si^J1ZZm09hOjEgM`0J(4>2Y>M7KKi~>#qBz2{R=wgGUGa^3se`L>#s1 z^<|oUL6+N2tv#4e308wwWV8A9`cfW~6bb=TubqL^a{ThM`j$MnIvh(nb{>PZ&ldg* zM6)DB@;H?Oq0KcE3d~ZIRVr-adM{%RITi1ICkaEaNv6TAa%v|EthQz`hN@+tvW;qa zWO`}V1yp-J1skY#BL$aHZ8rsvnGcY7ZZ0Er&^erzpKeOry;W7$2uTE za7SgP}zW4)QM_1EqcrGna!z-!r2Aa<@{gvG9 zyF#WUPs~m_XB)NiaV?H~*|1z7SiA5JTejTHnl2RS=&+NG4;q%s<&e&UmcZH@3&->H zwFR7IST0}dY~ZLDMk$!LYas~dmQBHYz|IR9onjr}VVLvHMzHlS7cjnTqg5%9F)}`) zP)b*Gzw9T4s>D=X=N4k%SQ{D`7R5y7Y3Z^&BEQ4_+OKiIpDK)U-XyKyhZ-*f`VOTx zeB#CBptQ7kEuVJ6>VSpv3YOVyif^UH^C-NDHBY}_R)KpgOw4ASgp@p+!t+GVzyU=U z(PGR*ObdQHY4D}HZ0q!nTbMA7`k{ddI*Vb2#~PDi$Y9aJ5KQ)CGUIP_cCzEGp31MA1aa0kqL@ra zQe0|h@<2l5UoK{TOwY^FGJS1^X|0=C{?+SH@#)QZIGoc;_sME?9~=E#=SGn&NwK)M zOe8V7s#@I=sV<$PC3;6@6y0Mb)8-aBdZbDGra1LjXPJMUi?BMy%C5*3BUrF)7b-ZGE}YJVSU%97 zy&lql$8j#HZs+KLp65O{>&6i}^BrZ@^ewDTPkqRU`>KII!F9hMfPfMmP-4JTA^;b4nnc;VME<-T^GmoECT0qEC4>Qz*26jm-)g=@u^p)iCHGDcB&Z7m8_E zD-Hr3%kzxbjp2R~X~;jZdU;aSvS|fSm+>Fs_BZ6HE=@twH=&Q^e>g^MYe4dS!|t9; z@SJHyM<@J3tlq^|CyVds+8lFoM}gv-$i9){d$?ixA|Tq8LaZ4;ISmy59N8-=z8)5_ zzL-scBE@-Xqc*)<3Zd+?k4@4T}}bA9UJ%hFd;V%*0UItBK@ab@^Z=7 z_}Y3|)yN4sC8mOZN-SmI3t@6zA`^CqCv3^BA&OR9iOwDjlj64}?~r4e!|c5kx3X>p zTz{{aXHoTl5EFjfZ%iX4_p>0h{HHpox0XsJpX1LyZA;kmV}`9R|u*bu;}Q* z4~)LFFr8D+qWX_O9mhWhL9EYG-QKr;La3pyXA8hl;b?D#q~DL1pO>W5>H3b|)9H%i zWVHq%VQGqv2rbc5;2Bld;&!c(74RB)fI)SU0l(5Sxn*C7j8$Dr(Zk&M>wU`)%j^c= zKzt13pz6uDn|J;5Gpg^gMC_Glm?*H|BaSH%h@jt6Wze}se?7uFQNMSf zP{Db@UvhyvE{rwNej?-{iEGkk>$ftXpL|0o<36xVtGCh z^-}(7TbAzzdc%mcCvfcve0u_+;2?zm>hY<`eLVo|WnMwN3}ijQpx`dV4d|ckcFg%U z{zly(i;Y5o>hug|tq}%&&fvRJ5_;bFow2+oq)0)6yAncOq_UzHQzfv7(5N=ZOSN)|)|o}||4M5*9&kxEb* z*zx!Qo(NC$JNYfVJ;$!3=y+u@_EbAydY~SzSNQAY0{kC$hCs!TO^LU{T<6V$KC$Rb z)m+$JH5b5;mSHWKk*YXy2yu%?h$oz92g{4E@h*((Wp%I(2(L%{MnEHDeoA&p_zAGc zo`S5b!{5ra#NhF`n46N~*3Bzmu`RWO%=wUNckgF(-&USrd|CSvg2SuX=-&s*&+a}z zEKFvem{t7G6fsRQx7$a=Ol#Xt$y=BwWtqW6P1wB@Jqz00EEV+9$qf%tWCXb<1;{TS zq;P{YJPP1BQ}2RLuOXWiJ9?(rgQT0XwE8H`EN5snZhX;Xvjy|os^`CjncM1T=Mr|Le4F? zB`GIKXLL~8it4bg&^s*FmRMTbqJCwtKzRmuK#YdK?6EHa11)-`xsE}a(L=LE zc(jg)(@E*S*lAuQE5!M2zb%RYJ$t$UZLA2;BMv8C_gA=oN}w(=o2JC)9!%dD#ODzf zSu8%cnXe~PP~ezutMgVM%P6yug`aO5H3F5duP`pG8C1JZ98Gi0k7+>;0BKLYkOyf$ zhm|n>$R00q`7Mb8{ex9iZ8S}aQgDYT^w;fy%xuvA!jCm~IholEnHe1seCnj;3t7>} z#~?T3Kp6LU(aB6XOBSGqiNTL+i&++pvShKjwU>Y_-WtsVF;{WxHpeDFq*_g2Ms~-s* zlCw_wTK&|1Cw=+e{|lTK&!XuTt+o(!)=6LMrLT3;*FySA+!$Pm0!X+nzYH_=of`L@ zn(B9IroK}naV_H95?_}4PL2Ogjr&dwzT;M(hM8Y}yPw(p*}cWe(gFP4_4Yz$jX^pK zj)`4=Th4ng$5r?_=}SAR(m%sYC;ZP6|2mP1P9E>}()IkLVa+6=C|agg2m(je0L+(B_{89FJtD%L~udPQBW_v-2! z2lA(?t8t@8lzN~VM_144D7eJv*ALhcuOdz|D@^Wp@gYfb+{wCT-6+x9v4RjT4kuf) zoUUL?LGLKh<(O$9aIOB8QdM<>mlHh{?PUo&C_$O#PVxQ&Tw>W7L`-*3iwj^S{Uz5s zRt`pAFu_vj@c~&vSwD;r$v!XFKTdO4sx-ff!X8S%uI`h-Tt4YY(wThH+DT`w!0~+6 z5?xvIZ{FiKh^LmUD`fe+lcb@L*KEF`Q?rtO7hf6uVF^GRGc;caA1rURrKYms>*CWNgdlMy^-c^pvHr= ztd~+-Xzp4{-@|Xh-C_<-snd@`owj-IYjeah`tyN=jJ|U}8~)3-Q|chi-Hu=-{R;(V z+~=7wrN0%KVB7Cz(S>0aEzWYonlc4_YffB^OW`%#z^5JPO@?jB9z-@ZQFCW@6g~d+ zeiy}`Ey0Zy_tR(oaj zXhG@m*mPw+CT@`vMJC9W>f|q1COnWH6$MN&{ z;?e#}gO2bEyUfUGPaNu(y+7VZZ`yULASm6}rpq5x0k@vcLj? zya15uENa}D^;n;ahbV9WK$Xn5BN*w=`X&|@$t)JK z`PMm@QTwtIpM!33V%229Q~zspkI<>wSTp&IAmbD>iY-E%z#^HnHU?(dG5EeR;cfx zg={rkN3H8A5UudteWz*#l)*_z`lI{c=^8VmejS4gG6gs$?=*;a-|F<$ke(kbR}iH2 z>k2Tp^5Tq-7AQ7IdVQW+?qou2OL`IbG*4p|VEQ6u5PWA>RqV7m5x+kEE${Syv0qQn zF$=2doxu|9rlNnSl=qE8PGeblPJtGR#}_gCVi0t~uBsRWdO5#0gK5EKGZ15~@5Ba< z>Rf5GslNqgdaAI6ywMu-W~i8>1;_iNj`xdH$9&r38Q!M;#~d##ev$&PtB}I-2zhAF z1Uq7iJb+izGC0#e%kzV)T1)Z0w15%K3Kt@ft74j272wkCSB_rCWI4d+H#_3#HU=R2 zmN9V(H+s*DZpu4r_0fSbKjC|vwYuUs=>3_2n45!sZzfr6J%cpU}&9cLwX@W7?83F$lv zWmfh%mSdT^l9Fq=q=SFNHp(~(l*P7}t{;{adA$+D+PVWXqqz!zDpQXe-cXc~DQkcT!@04M5f@ORuk&FTp364~pDq$JHcN{# zr*rPwD(6n^r}$IFNaasHPScz((StJTh&o`X3v}u*@dG@`GFG-_nJ+jOU|+kS&n_ml z_2K%*&F{El4++9cKIsW@GL+}*cF?Tr5G3mMcAmjfZl=+9s0oSLzH>~c;N%1^XHsC!S`f$bvWVxkI_7NeB>^0!wVG-_R@CyQZ(hyIR24~`yiJzx>ek9U~0sD!n5Wigwl zlK4$})HEXU^0rl5~`I@h%=w@n0j8CB&7ML)4$2e)7E}GX= z5b+aj&z%CHezZ_v_M62f1%qk_N=sUKqyJVO>x z?`wO`0xGxqTZLg-xIIHli}?`>(xQ0y!d~W0h_l&X=h{@8Dq{W~gx=7r#Ne z6&0}kkoe^obTd`AQSCbZ*-SH`IAVEk>GmNcW38KPCglUlmSOR+zw}q$R{B-bP_y%6>E0XZv$Xsc(#KKJL|Ju(z)^`U*KL5l1JewDXf?^+~yQy^-3{;fL&Xhl6 zV@Vo&L+wgC*exQN@5$;u)9^NhI^PsPCOWST+r3@;6%bVZP*QiO<)dW}|<; zAL2v5HmKBm*miY0eEswNqWl&I^Z5v2>34y5QGAqCH;dZSOLSB=C>T4&lS(2?jQ-ci zs8|!t7GdnS0KQrVaI)Vys&|gkIvy?px70p7m4|>SK39nL8+*bsh}4^8qu_iIg`q+K z>``%+1q_A_qFt|I)q53gZRZdR_;GLBn{wSg41olog9 zy%-SCuS%kldn-=Ix(Q)hTXIuziw`ltBR`yW?jL_-aF8yv$mx!y`*h0hw zk_38Hut5Du_mAmatOF{0im=~~NAYdcdWflW6@QS+^isssTq!YH4v@5$WVFb65W1PE zTi410zii$u8oSPRbUQZRjHqyl_{P?mF=Jl{v2`3fZXvJWkOD98L`$QZUa7B?oiJOt z3b*AqlZ8JCE8k3tN!^#%iDBEOZ_Mk~Nqv0*DhxI2tqAd$tz5u2X7!fPtMVQL4)0Zk zjF=n37(da7S!m$NjZj&h=T}kUYHI3tVMWX(lKlf)=;pi*vC;@WN->gD8CG0-vlP>@ z5_P^0mL>z>FzH;j(R;lcR42e+Ok23K60$y3%#m!d*1wCCD?|HVEUO?3TZ*)>C>!wA z_4xR;0#rJks)(A;8Kr;v>YTn$Lwwrq>Q?z?CxCXih1>J}E{XMi*F@-chi(ujWz4)S}Y;V7km7*+U7u8f-QB}s-oIj+xJJC>X zmRmU=Rjw<6{+9z2e)arXmpVj$Ksh@$aBX7_`O)nzw#2{uwwkOrX&-dqPCi8O0(W(r z=jh9)3CJGVv5u{1l9<3uK2MqhxlyL3VXD=8Gn0UjwoLUlBwf0PX6Sk>(+suYn=>U`_1P9U{sjq;gJ^b0E~3?h~EG(&z*%tp_1cZn0pU?^PyuuGI5opD!(gdBYB z0NNfRlH!k%as`G&nI01e7N~K$CHRf>JIFfnI4T6Ud8%GsjY(MK47^$Hhg_qyeMZryAjW9JLn{iTa@mOVCNjMpm63oo^=L^JBy>pFlN}3|HVge?E?_&R-(KrDn+v4e=zrhqGUCMaJ8GTF zGG>m-(UCr;f3R2HHHcvFH{y0R+Vr7)w&0zC$7n&i8XIDCGXz43X1WF%7Zrpz7aRKx zEPG)6?8oGQrqcKK2P;v_QJ2Hc@QQ z&GvO;aOZ*K&3R$Y=FhpSox)s6gXh>Zj>(0~Cz2d=m%aXxZhyDQ-*q*=fVK1T0;OEl z?n!%w5YOdbNm}fjPkyahi@)Wsw+MCJ4q2TTCwR4Hyq0S8K1|K4Syjz|&rtsYq|)Vq z63y5`jpwsz_V9rc)$4x_N^C63E*$;V0mn(&9Iwuplv@k-GW|ftcj^u7ibXm#L(Pg;+gp^D!n)eP>BB?=Vw-c)(}J61D$SM7DIo z*(yAHL?U?U5Vc)KVJFqT4}hrlDw5PbVwFKn%u-XvD#D@dL*Ojy6J_Xc++Gq24!NZ# zek^BBKwj0F`yRAL)l_L?Yaj>?(%+g2;_N~Vj{ z(oc(Yf6<9JiF`26c*QSU_Cp`N*HYm}J?uOk%)BUb;Sd%ZLcx)kf3g#j#hybf;aqY=Vb=B$-1j;zqDQn9;{>S6(fBo#B&Iao82y;rD#{O`XEYGXS_} zpoOc@*%yE%&zH_;g&gaJVK0*NbHJZ#N73s`PFvO>%y#Op9G|z8kOX!S(I31M2{n>Y6*19p;~dO0Mo! z{Iafjox6Gy|5%s<{mktbalw!zjKhjN3%?uKR+H7Ak0^%ZD&$EpPx_U9MUDmT zJ#6qs_0a8EdGIMx;z*gT?*OLIf7t`zaGy(Q@kwfW8pvVjbmSn4BG}>S{8i7jr{RZR zF@BI6`tWn`!!P~@ez=F{yW6sBmsRnD6r745#@)0)(z*(M__#PD03ST-diZc5SUgvO z59dXm4?cYBIq>0~Rrv6ozXBf~tiXqbQ}9852Af&1M-!o$680LM6z9eq$mxrnXJk7=49h#n}m7>t9WYbw`zreTw5@@2Z5A-t`%=OmaZ_b^sZ$$84vJz_hxQtyrg*Q@DL0o6>ktTU2tS7b~ zHkpI)jWQy$!;BzPq|@;BOTG!_JO+ma^9f;x*kP)_j0fr70Y<3$XAx{yJn2{Wk5NoX zGwsvd&MY=CF{Xi>ixvgd_Ge6K9Ahv<7?a;u$K);#|SOdg9mH+z2Ef zHXkyjQcNkHP`MEgT=g48LTC{Xs&X)HGlvzW;S#jE4K(~ysuszaXp|_fqmZjnQQF(} zSLEY2+RO;nT|V_{^iSpUwmeGf^lKQJFB{I&3+|=m!}&aqjD9pwBa&f@`GpdYT%eN5>7(P?!5>|P`y)cSq=3XC$BK<$G9 zJB31$bE4h>&BUN6zQkI<1c~GoqD|YJV;v@znB!Ou>K9ULR3yqfs_ruj?u{gPY0`;k^L9$v&Nz{tYTCi^Rvh)F;&g}qCay$O-hUPN1f?0 zwT;Tnpa7CGm;^UHctFW&R(O(TK1M$E6L6RP9b2UDBy-z{#mMXN8rh-fWp3Qrr4i>E zhl|BRIy_e8($5H&9-qdgpWX|*t4Y80fD(tI2$j16sTCcWtKTBicG2X>xY6I_NsH`Y z$t^VReu{IKGZKO-u}AH0i?z6+bQml}%qYv0l5GZ~@7IS}j_8^}H93hbhmRs86n8~S!0=w70>{3sLU?KNup%*l8EZH0aB1#2Y_bV>5^ z#Pu6(j?U31*+5&6%W;$9swkuK$N~6pRL*Ae*}Sy<^~$x~(LB^2IiN-*;VHwghlEk0 zV^x_d2e})aIvA&B^(Q0$Q`zlGWFh7GWjAY$gnr*XH3p~u5?DQ0FJY#eJ5C*r2|Dhl zd8aZ#)-%Bj1SZt#zh|@PoDEdlZEUYlWkFsNHsqNcQRU{F%fEfQZLE>``X7;?PQ z0{xnPW;muw-p!oGlArZSx54UH?((p^`hgb>cF^bZ_Lh)27I7Y?TA`FK3ALl5L86ld z=f@#ET!UhokjFx!e<1#R>_+ldg#K>L^A3g7Q<@qI(Ng3qQ#u8X`@jK!6vW8zz)n!3 z{&(>IjoW1>(9Kl~lPTWK1l1c$qtvE99l^f)eWRoN=4TJE3Sjl5zo!(gA3#mTQKs>o zz;`-P%=7d>5b-D@^}lfKO}z*}mVn1^?1Y^KSX9mT_?M*x7DO5Zlx{=`DUojJ5~RDk zLr}V;q(hMqkd#JJQlvy$2}S7;5E1luce(g|UtjkBpXXWb+|QgjcjC;MxibrxCYP); zkKQT5t1?25fSNDv8uZjT3HeAonB`L&bx3;sk(pa|P9e=akPDZ3NF`m>l$7^H@@F(- zA6HCtZ6VBZ|C{7!LHEMnQL@~9V-at+{hr56<&u*W$ADtp`zhrS<+^0^605063pG-s z^3T3=<`*9?QwYyx=YJCyWZR?sMSlIQxAA>JBMOgUn?6UL!i0m{etn|5_*x$`!*Oum z2rR_S@RC3NnBQrT_4$QIW65O`vI)0_68T`peAi+*?@K%!d_uQau$6czGZXNisY|L2 zR@pH6e|L*w6E$qMJWlXi=b@@qDxYOi)LqM%S*2ipJi|7m>H1AU)=caDyThJ2k*|%b zt}jxDk4ZH2Wmowk4U|`#GwiEkIMVs<_njRGsYk%2 z((j$`R!tBN)oQ<*HMF6LkgQ%ZASw`-yf5qWTvYCLucj7Vx;`Pg#bTrQ%FS!i?z;;j z>Z&whc~>f>X)Yi5W*yNtq&h#RX6)9IOH88_;vm9!#2pU&#|q;bjHutw%YiXj+N&d@TuGOJcym@>kFo+iGuBxmZDDqfzVJ;Unu1=h6!^<{+gW+ZcTOG=4@4;@J`DTMu)^vA<0OE}E** z2&#O_K8`ilR%=}rdo-*3^P_AQOT>zI8x!}-a%uFy>GFgcLKR05!rZc1bm&jjwWUz5 z5OOOaI^y3Y_P>3)LYQN=hr_+(;`{BVm+SYc)z#7NsF9D{s2)(S6qSJC+_L_1#ZBY) zl@7+ez0G$k9~C^aXV7URadI0JTUW&7(#4jcRGq6=IM}aNi}AgEop(jz{sv3t+k~;3 z0tWPjmc7Bjl|vW0MLX+0=#l1n%Rj}ZxlHUi&s33qcc)19hU|59$v4||Nsk8VB@%MF z_~Tde4)rBTcEongbMc=WcgEo=knTFDYTvpo*W7@_A-E@4gz} zN0yb$-$ZHYKF&?g1XmK~4ilmD-r?K*W@ym|1@}!};`Tkh`r3N7+hnb;ztkK3(9NmM z`~!j41zEB%d$Qm#HGvFpY+;c{Tyn2eq@PuxawbR?ja~O_N4U< zzr@M59X48=`R%HqSMt~%H)*CA^(sy-f4Vo!x}(L+r6TdxeCS9zKiY46YSjY0OV!Vh zHPn!gbt3M^WctvzFM+QdeV&J@k_LS9wpd&0Io!M@|DYOYHVu7dbIz%_@7EGj@&oLt zD!S&8Eehs{o_-%`jjjB7frI#AoW1t@*byJKkEDN4T}`7{zaYr)&Azz`zw&P8&M<%b zZ3{Q~m0LXbvZmyUU*4z=OWDkwzo_R!jZUf&(nyx!c|;`myJ6_rus6p{xHEm?WOOOF zf(#2;fmcMZaFu4mIF_%__#`D;6>ncD#p<^#j@Fqw5#QUcaWy3#N+r6uQdgCu zjQt9Ie*6xyK~YNFsp}_sDCH*?)3Mqir{zbvmAM?pNC10^fvObXKU4Ze2JqzQ~uC{pDAYMql5MpHu)R z&)B=va81vCK@{?>v2DY`BjzKEOnDN|G!7QK(F90Ya?%B@ccxoRln;yKeeLTF8q?~Q?9~?pL*vEe z?D3gDcloVyI}1FVTT(ys)@HZd40-cyI8iY?ho6W$tA?_^7N8{oT#LzE^Zq|Q&($nzvan$wvcz1Nd5t6}?QG(8`VB5V-Rm*1b zldG+sB!oRDO2njiy&a_qxa`~3XbCdbjHBP(ji4UdL-e#Nf;X{-jIM><8o9(fLy(=( zPqAKZI>Tei=iQdt8LQZmSVoaOI9HVC=wqOn;7-i6KN!jR2xU+8WKQ3p>G(cfp4$c0 zmkGhQFhh=+5`GJOS&$y>DczmFVnDK+!i^uRP8(RwmKuK?({ZhemoE9zpjI4i@8Ob* zfk5{OpMb@4-ixg@gWo9kEcql=X-6$GS$!#&=ES+`EQxfB{P@t;hzh@TteU90*|$Ak z`tkd@aSC29$6E=#glCPZmMZmy*Oy5u-dG1Z7dWHGu2zhEG}G_;bjZguwk*TYAre8% zNjyx&t1Tv6a!W>g|wT&OOp+Sgw@?0!S{zAFFCrymX`vBLt72JC7jz26)E+#yfk zCF}V7Ox@bxFh(iB(^Wg%&4ifc)9)K%tY%BZ-=7{)9XG_h5P!)#nP3}AHnLpl$cl!^ z@_3Rq&$7r_FT7R%e$cGo($jC|I6^U3-sB}Sd4{~w(C@PC&Xk}VPw;zd$!1_bcAdQQ zEt|W$ae3b}O&8&zaiH_eE@EP2~nbC%q`XoD5Uw=l-Ns6NY{{X{V0mTumV#_}!hz3R%D zVr?pvB6asPd@bHtk$8FQW8I*#Ig{R^uxXrL%e4n@>{52v$jscgzgjF*C^|4&nMQ9l zC=!~<6LM*BCSJ4De(9_*~;KYw>fQtR)(17NQ|=d&oAFetM^ntEdQUD0vq^}R{5ro(0upaT%m6OZ5x?(+$Kl*HrT(o2wI+8}d-2Z$>r}AK!Cv5fp9=+-F z9o84qX>@-D$CVi9QAMsUnCsaE-{l--eK5;gKiN3f$j6oV92U@0rk~}99(T**v#mfw zRfFPgXG^;sCP@i>=Yx=TZIT z#*ueCl`YNNV(Q0hy%i|dU0|lspYD+S%*Q=+piV$NI4EOPn|N=WFp+0tcKw9JSNGwx zE7M6)QODQ#cl&qM779og2u2y%Tv~Se{KwjwdkU}G+n$Vk4H8MSZ1N9zCK^YzMI9LD z+vC3Gub#BIUh*V2uq~UWFAr~DJ)@BOdO$!2&Ef?euPkR?A?+>Jbw6Sc&5>nFZS57b z-(l(6S(_A|if<1@*RPlT*!GWfR9nCK!9y{9`f~MbV5ma>XZxAXJS|VT(Hlv4oUs`_ z#P;T|`eKjW4)Z1qUidSt<)u|kf00@O{vrvLGS~Mg27jw-x-o{wCO2|gn%R&2c8~2> zQue7m-En2oe|zn$Wz9UakjgPM`qJ92U{jaQXda=t`oWo{C%<$>B<9xIW1ItL9v9p7 zO98rLA&lyzZ;p~vv&UY#a`k&w%pSE&@T;* zoCpWzW}cg9hMn;`eKW`7aoPhrYlJTb3~3}j_&oSHQeKV0|D~$gj*?6JOPr0~p?KWo zYgcVOdsn-k1qSd)&Zo_UG2RsLQdzpAiDCJMfnrDXJJ-O@@qWO~+8Ec2{0~1(nv%VW z)qZCOF282s|5A|QBN4F|-&d!o487>bj| z_9ZFu4$@yW#}^|iDX zo_?D9z**ek7-OF&ruZix-Iwj;34Zg5IAOQ^*yh=MQ{T0bcs|8OtEJl>P$r;!fqeJ@J1~R<@_Q^9%6;i- z^bZgXpf2y~xz~mF`uzib9s38k*LtBDrJVSEudmzeEXal66v#E=+YsB$vN>Rsv>z<3 zUL=e|7yT%*nvr$%Debn^t*X1Wk-TDIwx20QoLZIDmNPB;ZcbL0s**h|-a}PC#{WXr zEzaB{OP%0KAUyd5#pOre6STKim=wtf7x~|q*B6lD%(;zRNE~h&^H(cYmpvxpnBTt; zm!`1r`HS@N)-|UH>JPy0ro7M5E#}m^NAJ~GbRV@`f_EnJnN71P-zZTn%QSCv+p|ML zXRVF*jk+Z0uK6pS-DRB%+{GVDE@uUBiSbQ$t_0t1Tm9(ooRyz*XytlShvVddt{FaK z!pP?*)qcuEo-^ySDYMUT8$4UgS$Ah~mra8NLQDNqFleu7!+CIyR>M|w68G9u=4P|0&3+LW#%Y92BXM4e-GO5 zF6uBz3ipG%EsuPr`i%+y(3zH(`vGaZ z+@XwYt#@pe?i|KZR^dfYvD{{LS1kI)R&rN>ME}MWbe08)7@1$?RqiuJ`(5vPYURF5 zdkA8clpluNqN9F0i6hN-ES>m+Pl$H)nA5$ar{ZBdyOUXob;k6Sk#*f&Fy_o-s3(z&0sJ1fm%*XuMFlwROZs8M=EeSz?y zf31B|rd)SvWE5r!)mIlW!C#BrWnw(U`3euzw#||>UABMRZ@Vf>!-us;o)D7IbN#&z zLr)jw-6FKm?2=DxwpJ6nPP!yZrU^Vj-Cvd;bz2|MVu`5>?pzYs#7Q)sTmCp$J?mXo z#H#9^)%y67h1L~jn(d3&-d$JvfdLwBOK1hHg-ch4bweaS zN???NuGD;O%}et7Y&-OFVF|He)~JyVx(6hjg*|+)VLQj_ko50C8+}b5>pSVtdnhq; zMH|fz(Nte&T}KL;_B>*1}xBcA(dwgeOq(_3M06(#`M2 zxVGCl+cL;B_VWi#zztujwIO9rT2y`oqMNcC+c9Cp7(a~95*WP=zmtC+nYylnVb-})B7#h>3Sum)7Mwi*87Hi{#|#Q z-}={tNekQhYK<&2UN(H+EbSr9LaQ?Ks6(RWs@d=F%>y0-;_~7&<$0?KJ{(__t8j32 zeC!ll?w6=ELM?GDH~EBV0&%`gr0XQ7P&^z~VvSF%C`Y@Wr=H>_-}e)1IYNIZkQaMr zJUGZE=))(e3tASv-wBuT=6?2FC!Lwob}o^MoDzwH|gVcDZfV4%U8IZ4x6i{ zCMa~7p3CWq@M0F^(a__svZPE2M6NqHaWoxfg{ddH# zDK|@!PMWjDA`^spvW~SPo8lOl-+q&AVJucyL)lm0;98&Y5}urjcY|fK$YrrwdsFiXD=A~4 ztT8BoP~kHV!b_7LYc2~W;W&p$|FXd*niYQ0&aBJDqC~8y0{o-mMl<$gl`i(88w?eY&^9~9!M87- zKuQjzeT^^CZ`rJr>|$P9t81-ZbSxucyHrd$Bo`3T6`3i|nO1^Bah;NgQ12dvsGyi8 z4(sf*#NJ$DFG-r+C&v3F2|glJTlmLBWLy}=8J8N#La!RD8_JjFs>O}PY)JIoz_l#7 z)t+^*%5@m)`1*Ym=2c~u)&q2F_Q0BSYZXBP0jf0oD(hN?)WCK;epEp#mTU1y@ujvPhj z(8GJ}=U7!MIaycnqNA_sJ^zmr_CQ%t`wUIZu~j zwi6YzT|#~BG(w#IM1wfEzlHzam-p0poYGi|vv`5E`-SfBRFsQ1P3nXych%~Myc%9T z)RTl5zT9T}5K8;dOH8)-P!@ytrG+fb4drJjc>iEttL->_~yeTZ>1SEajiM-Mg zj#q^8N0$X09)`=k^Dt|=NE~1Z6)VO4Rfjh&_4Ce4=k>7s#!-FBRq=VJ?C)8hBepq` zXK1?H*7`bHhjLgN?r=2%e^B+7B$Ej_bu7(5QwAj-Ufs!+26w5XOI9-$mhj%(=CZ}fq_|5}nG?1`fX?R+hU&nQ8=VI^TY zqh=4af6|-k+)sA8%+wSycP%ft{JM4_o7KT2|V+7;XZ!van zmxeXSrE81$1_iLK(CtRpmohg}f71RIC**F(P^j1Jaidf*?S+GV<(E0h&x!S~AH&>Mlp8 zZZ#+OVNqj_ib}(5fyfgFD{QLgn^$h;aCEY~pAZt%YS=1iA>F-pt5E~XmLOxJ52^^s zs#F#pV!uqkD>P)5_u{@#M(5lONruL{TlDH4E6NV+CX2Z>`6hUG*vME!G$w4N1MGA{ z$Mj2-eUg&Cn7tkqIM&ua>GJD$`bb=%(N8E&7|NsEVl8J|@cj;wS-cZ2Ew-}q8r68rtI;H;_k1<<5;|~}TB5qPM(=VHk_6qGGA=K_ zKru4sYP{Q=MjP63QbY2?F2Pspn~+ml!5vQ`)LLxj+zPCQ(M1)kI-4ps^mRMUSD{vz zzoA?H41quI5=Ci>Nxu<|=o+-cXL^kzr#2d2v79toD>Ta7iaD>xL#n%#^eNb6cOdaN z?kJWvGk|v!H_@T`vby}FXvRQ=AqPh#MF1<0{wH6xzVv8CtssSKjK-Mt+-+`B%gS}! z#v+75QJ84z8o~q?T*foFgyj6Y%;cSf7)>{n(_KX7^rJ1bh@0td;)h-jSF7TxTr0|A z{g8F{$UsuD6*p%zPtfptQ`~Y(NCDv!RQjxwh-c{+q#h-Wtj-!(F=JKLZrVQW3ErsY z;&A4_hOQqqHW@#g9{cjy%1^<;svSf7gV*FqLofDmvQdq$zEon}7Qa_y`?et|mTPJ$ zayAwH75>YVvV7ili##E<;RMSoi}@M!ypM>N^3C? z_v|RJC&+x<{IXf<&gNH0VnpWl!*5Pg_png#R{Mm!s1BAQ^KZ96lB*X~v&~i>+)d;n zHM+rW_H#pyj%zS`;AM7JX%^m)>_!?5e_q~mYGtl}TXd-V^b?{OMh&#}Zg%Po(7e^f|$f>@6|N48e_T@kiT!ZGP(WGq)Btoe7!e z#$`KJaTa~m9GxtavWi?V3>^htN{PI%Je-(fq3gTv_-@XQj7|opoY(OQ{zVoVUy%*v zRpGIhPpu6Z%T2!vX585_oaLWwaTmbT?Db93hIO`1L{-cz``y(rVcHn#dcP+tF7m-# zTNmfjaBV`Z<;VGy4H!$<OG(QRS~X5`miYkfRd>b9~fe#ryoVTPeHC^&=5vFXP2R!|_`&@1Q=rOL77Gl`2S*YgBlaG79 zU9p6vc1@OTz@?BBZ!HL|H;vB0NycNxd0Gb zvY*gdwXjQ$c8?!TJQi@fvDVXZL96Yma^zBLA|?8(=f$5JvjFSq%h@ua*GG?DyB7p$PI9`(xA ze6YVgeA1Vt?aFb;bs;%U^Pm3i^pp9LDTWKANhY><=*d(^R^f_AQtsLtXe<-EyorA8 z0Z;KJi?KzSJ>D+do*q5eDvw)gp!Fhp=4ty(Nw%@sfuHu>1l>f;(U_{If&8XX%cPz( zQyI#O-A69BKrY6{=eIVSuLQJq>qjrfYq;gk_ z_T<{lD#JV_bFo5tUH;VIlJO_e8!x`SXD)7AFFn6S(b`;}laWX-oq?Hjbfs_n$5d`YIjMTK zKGpk``~h2r!q-tXjtby@8W3cM5 z;sWajw1bvOhsv!$)yXxs^m~j9xby0*@mFew6{8lf4A zWns9^P@m%C1D9xftNQJz>*L#ED`HfS#R!=QShoDJ%4gc{>P2$RPxCxwtD>6a>UYT+ zfU4dz3}R0E+O|kuDVwt5B+o?{>_;jUm$O&ZnR_KO3hi#q;2nwfIlm*?*~Mnq{Y7lD zgv}G?zC=8fkWpSSHHiF4R4i@Z%Z#lX4_$J`?>vi^BkzB&>h3?>OZwe}f$5p+FbX20X=?PpR;x%MXQMki6w^2aBWDK9@ysl|52<*IEzV)0{$VErKPO>+<+ zW{J_FW`Us!braKcnc@3DNEuzxW`q9bcknHz&+mIlcXYi4B@7KeUz;m$wU{ZJQD1Ew z=knALlqmINz~gFM;X|2o{l2>RRx9{DRjO5hqUPW`@q1+5Gk&}6KQ>0z(XoVSZrvdn z*zsG4zneOPVVYV|%C3fE`0nB4-A-$^i}_(x3TVdT24CHMa^9(|&s8nld=T8n+!HaMCwd&Vo{6lVsR0>bXQ#U-PctBPQB5WkOx zZxSPCsFJ2R+LR43nke+fD^v~`H=@MVtgl`st6UsdCr|FaUQ)L&X!oj|U!v#v?GY7> zTs}?n{tmJJD`NwnS-5}jIN%GZ^ z#aWcc%^hc`sXV&4dM{axb>t;Oei>Nx1!~t}4?SkjtDkYVPTZNhH|~Gg zv>Oypv%1OPZbv5F5Q!~R$mQaDltEVE-H?y67E50Iatfk0f6qaMSk^Z!YGmM@NPO@m zrj4ZN!)3Mbj#bgRh|nU~eH)DvC*Ef-^u}JKOdF&P@2}~Q-~0YV|9(XY*>lZd#{Awm zRL8tp7CQg#mpV6`sneDgiqy-~4FtWG?a?BxhZX&{N{_9G_(eBez4bC2=4@}Hc!P=s zA`rZv-1W(^)5wQJD)PG2#mgbLW7!4*utF&PkEvEaRrQpsKmD~6OW@Ui6}1`@;vUb@tzb2 zh$XVH&R2?IE5dc``++j`sHE9tQpcrR%J}8;dwqQbgt3hxtPmVStAzdVCBra1t+HL# zfln}XF?Mxz@5T->8z}bS_{N~yHIED&X0a6MaFNU3r_*jcf;p)MH`@-qkFFC>NQH8f zRDb_rCCrR+ALhwVOUiBjc>fMzP|Q6yan@4pS0_s1>dH87PbnWNPhC;UO(i+>eem6i z-Ra3?ckH^+2Z3ni@{Z260(!>eqyBG2Qc3%mdT|2Zk-$eMU*qRvo@^s=LX%-d>XDyMY{N=Yz4^ZI zJXeZnC?;G`+Je%v^FT^fHke)qKxHYps@4NmlSL6tFJk7w})4ns9qsCM&U`XZ2df z^M?UzS92e1&U#-cRhMz?#oOea=Af?Cy@0nLr0)#+9WmMIf15lK;|lM*wrC)1&Ds3W zmp$qxb_TbQ?u!JzckV+8j;pJ+uJ=-{mZn4=#j44xCf*e4?+lqjGiBHQS_~!hlrg6y ze#`qb`jMzUQCN8_d9()o^njnP=Qa*`5oHq_1vaUhJrG) zoS||;$$Ch(oYgDgnOXN+O+`bmypo*aC1%1EE^RLzK6A%d=WcijExlLxacT!+(WZRD zg7>jyu$Q*UD)~%_#PaCV@k_Ly;wJi|-rv}Rh{VrUuGSuzB`RQC!u^HI^(x=(UANG; z3}eH~ruyQX&wH;9Lt{(FpIA~iJ|;DL>Undv@WdFK3^mCsvrKzW;sT#L{u_-pvICub zJX-&NwC1&$*0m=K5mMwAFHTJ+OxYCSynoIq^L!*kPsS-s7X9CrJ+%%_@}k6~f{*z^~l62)15tGv7^z?`#ezOKE+yxW!4 zhBu=@qvq`YrUxJRuZ|&9-wq3H3PUb^@O+`$**Md&Z|*MKuzkbVfRpiePt))i`4Iup z#3N_w_rseQzNKr6RCW})a?_-jI{FK4xHsv%4Tcd@ZYC%Hic@F8F;P08fhoQD@Yr!n zf&9TdQ(-@WDj#Zo2BpmN%1tbBi$1SCzI%P;v6U|tGr!o#3hx!QLTnwA#=rFz1XMir zAPh{r`~}+AF}RL`%QL&Bx-iotBBE;AP5gPgUo3LsMFIco@Du@7o9T8Z)0kVAdui#Y zYrJ@s!W~6KqAKw!Ff>JESN5@1Zrvyoq8|FOu!rXHWp!PCSLb7 z`)o9YKAasKQB+J(;5Y1G(XVOeets+SZ*jd#lhaElnU*N`4l2~H_0U?rwtwcT6<%2J zUQ(p+bXaEE{^&mTCUaZ_BM0XGB1=xrI1Zyb$E22xxq-N0=+%>-P!A3@WPnS1MSa`u8CvHzW13gXOFvDz6^a*vx`}2J3fBgEIg3K$Z)>v z@nb3!da27-ga9?RSA$Zh#`K_^qs9HvSn_2G_bvC--I^{|*5=M)k{@mg8+vZ9!zv~_ zX)ru7#UAzOZEqGXeLl&}Z|R^Dx?j$5&-reQm<{`rGWRcPFJnCOHWLs~2K{e;-&b60i8|fs2 z>0U{NJfq9MC}Sr^^x+AUyh`U3W_SE}1F>%@SqBeY)BD@zt%JIp9=^Fsp~<2a#%5v9 zmcH=d_sY#P$4==Kh*~|ED&V~NWjKQENHMfv@mi5iiEyN2wtf25*p`~)QBmWkW(@tZ zeVBptJ_qilrlEheOB{9kVnyDMr$zaI?2bhPI!$ z+h5_+@3-mAQP<>;t?8EaIIUX;W|~B~DBd-!aW15`ceg;tqR!k+!2LK7>3OiJ7Av}_ zm4pA-CGLX!r`&9*3+$fw7n2feJobd2r|d{E-S@a)1^lA;ktI{$FKWYMb&f+pJ;gAk zt!K1d$sdv$M8;ZTB>EO)`+m!|O$2&z%vziDUY*NpVc&4+24J`G$y>s8rEF4CM zlrUSz6;w*)FOelE(A(}_lqbqr4XEL`E_LNO#`|Nhra8GpmkCs#loUB$!UKWWprX zS0sFZpZ+i`g*~-W%ir5}k8A{I@YN)4DX=Nn`P@ij?&!XD{#;0DRinWEv%0mMsw=T7 zHX~0d9=;#-6L_;eICSr`6?5*h?VZ~u)B5iMM#@MNt`K={>pY>HlH~X;HLY^I(NmYC z_v=Q8bsuHMcB`yS&Xef@RR=El$?YpxBjf>ZRFe0t6D%D=&9g}|g;y<5TQXl82DY@_ zBeWjvR#;MJ`bCq{pVk2XM%&r{(K~|v{r$EqwE>3^Zh}u?MhY~lY?>{SWkkhcvMrxT z$g6`iP3e4Blnx&?&$dv+ z-^)ji2P@x=@zSB8542rKMS4}`DpBOI+D?z|@be%&d9rNnpW~*}eHv_+LTmU?c7+G3 zo7CUB%jKGe4Rj3T8e|({SJ-x{l~S3Mx&>O$mKAH9FukE@eAbiR`;@Z0bcg>))2-nx zx%85*tMnc7h;hlJyrjqEcQ|FI6KyIl^uYQZUQaBlJ_No?E z*ZOjUIi33QZ>~V=Z>s$H*=?uz9|=l&Uy*i$nd@j{hn zbmA)WWv*?GA1HgcSp5(g2?;@3W*KEo7TRmqIInSXLm+5C^V0$!bl?LdK%fwmHaI)$ z9~AH&8({E2bb5iH_^3fpya-SzaWS#t0bzQ8Q-Nu9@T)P5AOs4vy8y$Iz|jJJ%Hv4G zupkilzfqI~xvC2Nj2r#iEMCXk*aCVa(C!vM}yY3`v+k2&Od5 z3AG310!-jGjQci>84v+Pfh^)MEGZmCAbUQj>npqxKte2BR}88Yj5Zn#$PkJy0pkwA zKotOVFyH=1Zb=-uzlbc3KA>U`)Yky&i-AhP$f8k!tf6QUFy;_+Nf~-{qrH7r z6nPw#Q)T}k(73;l0uH?H8en6mA*(x}KNRCOyzY{)TohZN>Hztx>M}SG0YFzSsLSNv zWtD}O703~SE(246zWJ*dKwc{#?<|=2=D*7UpfOvemn zbO)w$8>S+8Zr4lVK#TxYxu9N2_!VJC|I>@8141vtj^trR&?uOdBg{zwW_2581la01 z?Rpyrngg@)Iur5&)S|)L2M9J`8~?{v0mJ;$Un=@YiVHP^=_tdD6cBZSD#CQMVMfY` z8-;UoNZ>F7&kO>eT?#J%P`_v>U|*rAGB8@G)dd)tBw`rI;y~cCrJ$@IyqvdT1ffs~ z7+DBh)&UR&z-{=5fk4RMx`6QSF%6>)K@Ek%$15#75eR2;!ay7g?j(Tl3H}2y#(;K? zK?Q6j8ch;D#(;JX!GM|omL~a+AqIaO!UxEL`7goq0|EXVeUJfe2@%|YpH3jV1FwVf zIey`Pb|MK=xpSUVknik%Gx&B$7N!z{8Hy2&9)lK(8V7|Y0Ie*2-Y`Opg|FaqZQ;*F z*r)Qp?Gw?*2s@I5i9uK4w$lk{>joUs8=%62fFF1ZbjA?8iO=s)ad=yN0zMjW=L>}A z@cu&Bto%98LX3YIV4#Jo&~kF3jsLa0855 zAPW?@Q#@4wB%QB73I~wA0|=>|W|4$>=>d202yMDBFL~fb<1|V3PjQfH1I8xY&k19| zYYBm5!rK&4PnkdUM2yXUjT=;w^L@NL!heK=y68b&u~0d<{Q;8!=;HxhAs8|+G2aV_ zKK`elm%)LS|Ch=k#@9Tk_c~lJV$1;JD+E;@wv7Tk_%muG5oN#yC$MRFr4aQ&_!?lI z0sSSyHYMPG8z=}g0VXR2QxS*hh{KHJ&NEaAm>6PiGz0aPgLMPv8(+d!1XPYz6@~?$7wbX32IoLoLB9zIgrGsa zfR2?$cuqMSk3VsF`1pjEZx76S_-9U0gxl?3{S3~}M$nvdizk7D@Nr_`Lh35K96%5Q zJ{lln`_tb*{lWDGFy%s}FTiL4>jp{wtNzu5(m059+$T^MKcM#?V*r>pY|o|*2z(B}y#N=0K$77<{x?|E(txHU*AN71V3z`x?(;k5RyZ4gv{)a|MhF zXn3FlPKTT_@O=1M>W%+om&AeF@4wzOWN=jfBEXCdjLClq z-G(@DWkS zU-Q-ZV|5q>_3Qa%Mf5K>ph^SO7Y8HF>FNa{@&IrHu5bZw@ZRQ3Kof{a0|FMH0IDFo zfVTm17Zg#y07T$Q@8UQEF;yU@0$kzRQ1MVfatF8~3SR+4%mEQC5TJ&k05Lg$z{>{D zWC&c0HyQAvz^d-gcmdX3@b;|-^J>B0wGizq|7Q&cta_u-|2KC5T2L>d0__XT z)qvW6&IG4(H5&NRN(8Q3{<+rr-+K(W9zg822+03uQd7V|_!1RR*M0bV2clevc^|R1 z1g4>XmP-;=fr5JZd|v{1;M4uLTu`47aDUqOz%C51Xp{l^9^TJwV7duB9e7?eVAR0= z!Rb0!<7{zox}UcW%BsO-<^Jp+NW*CT|E%Nafg~ch0|f#H{0G8z0G)_^hP#Lz31FK6 z;bVnCxhrrv!1wBaTm$3?J2Cqow*xu6{~#Kt9BwZUKpqa~K!CGUkYORn>6}*zG9}Pn z{@G86Jw?Qt3Y=5KpgKU816J^#l_W{J=>Qt0$47{x{=u?@CpX*qsqX7 zpwP&3D-Ae!6%<%F;CJHzkDLm)(_E-FAb$E>G!o!JKmad@eIYXN<{CT!c-IU8d@Po9 zC&K1#fN5OtG{EL!pul@S_@Fz zIeZ-e58&e=aDNVet_ryRL+tGW>?!a;fuKWDfh#<~m(=j^0{9@x4>vF%c!B!haa2J5 z@6ZAOxI6*qUlIGR02=|h5jX}Bd!+zd2Kg{(r=`ICSwMxHweA@?y`nW3PHRz{2KyysDDnr{+)yhx%_Vc+(`rV1+4KuTmj@~ z?R6%g0`jx=JmZ=OjtTFce+4}R_*)AEVg$+?{Yx4Gu>d*GU)&btVt;WbkSqVi-9i3$ zOZ$NQ?EUF1TOfjCLAcKVczp=UJN?C@K>47*_#;r>^)LPymM9p>ke7;vwO*NH{AJehUd#M8XY_aAzbOz8832`IC|G0wlZ+3GYV2 z#{fL<`X=Rv*=PGM*McpKyd;D#YLDE|xK=anB5Sn9#`i-GcY!0}BC@bl!U zkZ?LAoD~VbhJ*_s;W9|LIufpfgc|`IUf+0dibtIL0&V1oMBWPte}IHXBjJficsdeZ z3~)rh!#8?>fH*S-t}l_uw;|zgknoS7ew8Z-^$^7QDiGa7BL5Q!M@QnHF9953SKvDK z>^zYPWjsS<3XPE7@zH6r!h%XZPI3&Ch34aCZZv)rc zS3&*#NaUwLd0NDaG_WrRj=N7Fhg?5ZfH<22qPrj$19>v29}V-gUh^PFoUy^v0Dj*1 z#Ruhc`A!ue&dq=*ITCq#B%B}AVfG8&tc>yF`775oz!cCBHM1EeW`O#KsQ5&ivRi68)P<_yH1*3FtqsA1@=} z97wn*60U}Xn*$tPFK&a=iiU&rbpv@D$RB|`2;@fhP66Uf3W&x69KNmws)q=`@&ggF z0DfM*ULfI(NcaE}K81uYAmO`6I6ClMfb+_E2??h}!r72;0VG@o3D-ozO^|R$B-{rH z4@JV001mf@;mFhe1GkwV`AFnnAmMeOp3^T8K_GdcJ#>S-BI*>J`LRhPdR9SsvFKBI zOHj|@nI4cwf*cj+wESW*r{FfoVIYqO`I((kfjk%F;Pxei3*>DeR|NIIzuX6J9|Ex8 zh%+l7O%vef*^fCW9~5`00C7$QMBP9>pLEI*XHGyg0pyU!ryOy91Vry6(I1P1XCmRx zknnPV!|N5Fb^2VyITH|V2Kg|^O-_>`eIOUhJ_X>k2blqRF334R`HeF@AU~Veptz^c zh2)$Hp7j?I$W=ft3+iD3c`nG${FMmExpPki5obd{R1M@opaCMza{z7(@bmi12?_T{ z!gZ1GaDXGm(Ua5iAkKk+Xetu<93;F9)FYOEs^@G6vliq=AV-`F0V0D)^t?mDmyqy7 zBpd_pv|ikWr{w{+;~@kfR{=S=%!OP9_<8Mo4U~@u<-uh%L=1_%JQA)B>S+V@5S|tb z0&#baNEpG!%@rn|LD3CI2)_~58&5M_FV~M8`&BA zK6b`FWM_;qm@LE0*s`xJvW2on$u25es3=sTk|k7@C>142qE!EL?)UR`zkU9{d0y^Z z&-;Gw_c_lw=Q+>0&%JXeIidg12m26=ZauuM+y96_aHVbhz!a%FSNENRt*8kG#tw;Z zmN?2iz3JfCq-56|t}zmZSBjATC5}p|R5dVKHqZt&*2Py?us%{^{dTJaDz$AI{882a zFT($*?tfGbu2&5{RLetc|D%roQN#bJ>3>wM7W^56s`51P;4`WQpAsR7gP9|O=^}#9 ziU`I>1fLrbd{#v8SrPKA;FhWdKUTJX8m0x>Pyc4*SLZA^z2Ejl;v64Rw| zleW!cd?)o)*DN+AHrRsF)uihN`+2Yv#z>{L=n`-p)pv1UeVs?d#|4Isiy0F)CSgFz z;DBrDp+ghn0^K`}iccCR{eEO}Vp2*VCMG$>HD*lQ;2|*sV-to3{K2BBI>)E@gCIIS zE+uyOprP@}^nfp7(?Q9t2jD*~5?yB#^F1Wsdb@i#sPf;SN5^yGReEbO4K*@=tlH%OZHaKxih?7&2hQ<#M43pM#YwllQSp2ZK5#s{x zzy7X!O6S3D4C)*l*pdUT^@k6NZ|R1Y5rKh8@h)LX(r_Q=wh(VNn36bRX#D8-q3-#v zqPoTo9p$Pi7&~l)yC0!jaBGs%7qz_`X>j=ZfgmE#J$O_%cHJxBj^^Rf@otmJgWYiG z3K}!aRbygY+^D3a_yK`d!O^L?j!5050h^DG_pR;6CrRS=zFSi42sf|~am5J^5UwW8 z2-ITesN}&ia`;WU(?Dm}fN?1aiNmF2T@r@H4`|juKG4dY0^CsLdN~4{#3uPZ)MfCf zVf|$|atY#H^}4&^%@UFm#|#hUigQPiA0cDn{GP@PNJt(rGN_bA9X~p> zm%|?q_SIla>*2|6Tn-)xzTC1Je9CZlF6circKDE(V8Y-*fE>xen)+XR;d3+#ZZ??G zl`w8V%vg64iIL~{Ql=!Z$X=jQ0(zt+o4z6cjgB7?o8VeFSe6GvzN|{o+D1Qku(dl` zjtxkY1qTZGuNywbxT6={FnCBOyHRS0JH@+^1l%Ql2p)00JjV4o*X%KaTr0T;v=C!Dizz$5welF6~om^dKbw}ZVL^mV`XF2}9yPK)_k*veO4*j2S-Pkv=>(j2Qx(*PZ zlpNpHJvmYK!mQ)L4nqfEuQ8Y<$&*G0pA@Wg*ROrY#U3QdPV4S9PL4}RXg+dO!sz7S zbfvo={JX@DO~DcDP9E{WuG-xnIIaC?CgY5&7zg;jY{#uPNgNyOh^|@ubS!pg@GLbd zE;+)bk!Eg}keuue=wKKptyW^&)-@O9XDcdpu68Q*BB{-{gxiA=sC@wi1hzW-I1RX9|#V+!AkK3_N^7IC(@L5 zGA0LizH`Ep@vU4x56(n`@geE%j*f2aq&_5Oj2k`%OIFtdT$z$$<5FS<4tnt4{)60z zKg9JJ*FQVPCM3yF!DqV43Z4^m#m%io zxyhbub2nk|!$P;Dgp~MTZ*U{In=(I}0|Cj&SRQ%Oc{OwfyL@ItS z70>Oi*ZIZoufMde^|=P_o4Kd)k?wktUpRid@m}t6&2tUz^Y|vk+o*vo?mC8F)L%z` zeS}=&2g3b!d%K(FUrg~kkY__Gev(}C`|B-!;qu&p`|bKm?z-JH?)rvbG+wt`Jr!>V z_j&v!dd-t7htDE;V%)v@Ah?h3XMC6OSmQsKJpL_6&2!thzutq(nt{RiNSrT!brV0< zcn#ytaIuKXGt;=;uan06n>^ndk28M9_yFS%;SD%nP9LKC)dcR#6K}kW@qxyZj1Mxt z!T4a~(YRpc^CuX;Y5WP}+4H#-xA=JL9gW-i(a*8__#y75`!zYgTX75fBe ze6>_O+4yi1KL_sXGtu4t!g*muD*lSeGs5IqZ+xWjEyk0KzhOMt_%XP)Z=`$7FISA$ zbnCjm84Cs<4jy;DKlri0FNKZU_;BO3T%6{q2>10l%6L-~@83h#_|C@b7>_gV--6fp zWaIvtz4~_!YO5H{Q^#Ydusm?&GJpn_rrcYo6KU&q;XT1-LKIcz4tMFQ?+K8=qj} z51Raqj2|`e6OI39e3J3I#wQ!kfH%H<{Y)|b5Zsr4s_{I=rx~wfe7f-%HxXC}u#Gj$~w{af-#l+k8y=&aIW7fhh zsayPhjdM5cCwYw9_I(8I>)*C-BjZoG$FyH{Fz(;uQXgP^yzyDapE175__M}O8Mk@9 zGj7ZCyK&p!IzQ@?y2aN+jJs($x5NGZ+VfrWA`aZ5^|nn`1JmFfzdsevR#cwId1}Eq z&xlm~d@7!=nB@0)eB0`NjZMXmz_}iphlTRYHhJI3E%(3k95=qi#3%Sc%`NHOZIQcazxvMjGUK%> zxD~hf_~q`V@v+8jdA1n0`CqQ+vq&DB|2^Zjp66By#oPSFD~G(R`>&R#vvHf}iz=b` z(I!4i)sWkM_@r^0=T+k`nLN=Ep**%fOgC<~d)v6(Za6+q>Farw$^T?3exZ73yS9F+ z)(E++=UC%*zuNgpq+9%UZ8_%|x8*!tD;OS(U+ey>_5WC%klXEcGH%QHzVUS?Px`u{ zJd2FyOT}xzdE6*nFOSp%CpgwXSZ=%Z?{tMCmMwE*!s-TFyxy} z{tAskzQuToal2nxB17@EUGf^Y`D+=sxf77_lQ@UL!-tJfW_93_N9~-yhQuU6Zc-t=FokDKU z7lVwia3R`%rW?2QcFeeq|H1ehCQq8^(01*9IRWw@`O zeI|aRi9cri4dXV?C&oW9@u!X3vXNPf{ ze`Sn&vRiz8o^&@Y=Vs%+3#-@b=T_X}_v?hasc-1#R@~zA_$iF~&#_+rzgLeF_jyja zo5o)=e%knYKNz{i$NLbC-*0??@e_VfbBmAv!re5!-C(ccXWYH|*i`&-DxN(dm?oIt z<~eHIZnwh|63_MX1KgL>)@P|9p?F*WL*PE%Zuj|AJpWM1!|_q6_-f;4-BY!GPQ!iq zZF%wx```KNq~iNh@yn_Bh~fV`|MFBkUE=?aubhexGJeiIRrhz&h)|v{jh7o4@~@1q zfOGv^G4ZxOHzbGhd~NdVHGbasY2!Bjv6N6Ao4;WyzRI}mKc`ahKSqV}+xmHGbja=T z__FZL%a~C9K_<^5V?%zyco*ZgU1k{frxb19&y9a>{ChaJW2t|E(OjG}N ze4|u+uW>)*Ykl^Z7RqzQ_;uso8qY926mQ$TsBznGyBoLX$C<`$o(wZW`E9#zHExgV ze~f=;%2{S+C{LX6#>NL2UuWF*!#&3BcGt`b<+tU0>Zy?1{aX5T$orb@=6E*bzRPR7 zOf_!H^PF+tL>m9Dahw0V@$XIiZ^nNxo@=&SaZ6fv^Fzf;e#I?6!_&L}Uw1d%Zr$hn zqcT6S+ig2n+~-N>Zuw+2Fe4Rz2JZ9sb~nwxgyORy&u=DvxQWj?PXcti8s87@^Z#bz zlZ@N)Z!-RqiQjGfXXE#b|7yI&0=ME8zg_D~o)2=+WSq=a)AZhT`r1{ifJKOn!gpYo2WsukZ67H1YmW z)A-Mf|7pC!Qn%t3U;g#(rtxEqcQO8^-$}Rl_}lKL@sBR|D#ve(yI1cH_wgr;#~c6M z_%Fu<=TlS>aaP;`8_>RnNH6>;K>GM7WQ)$Jb)xcE2v9;+-)N`8+oMwN(7HaX&TI za(-#tPj%HV8c#C*t#Lo4)%en@+=^R#d2If2#%=z}#%=!U#%=z1<2L^j#%=yY<2HYa zahrb&+#h$j+-b9_oVUq#;+J}VEi}Zb&RK5?N;34w_DfUG=JXJZpAI$ z>$#hH$<=PfE#7Opn|hnoZpAI$o4K2M$JK7dExuh2xtn^w)o#TtKE9m0sqbFxR@~yf zxx1;qz1pp~h4UO;9pqqq3-@1*KMv>kA5Fa7?j7Sc&qFV}q;BCngWZTte`HvU7nFOQAC3{UI4l_}3(CeI<`)z-KbxA^$h?)ISkaBjyI zCO*oP;d-lQysvv)>-lZtIm~vyH=fgYnYF?6!Tgg026I1cEW}f4_Kt7+;E#qF6d!NT1U!R)(Y};L;LHyT<_j5eIXnaGsmRDVW5228RKZyST@sE;!3=bp!6kdw_ z1pF~_EkC;RgYD|?KcG85@C(ROo$_3U`?;cDbieMx{oK_r>et|rK@GY4QkCG+jQkRg za~u{A@+>MSfjBH4_y)Ki!~LS$?G5iD{J=-RyOYm=_aB2`!_yg$cK_G$ zCub^-;XK%mHa@e7_ig_u>LDNbPv}=*_YFxhmMjP4!oB)ctcQ{NYjb|7B6kn+{EBtG z^LeJ|io4fxdiVQ&!2icB>JPd9R}6~$$d3Peuj+0&(UEc31iVMMTTOTKi|(GfXyCy& zqI<9GZU?cW;Rx`q`{GH<;N5R`De4oaui$pQ`_~?RX(D$IT)#)o&(-~+d6t)vb)0q{ zc$Ti>dfaLJrx+OG=temIB&tTF;lV ziRVFks*gl}D@xuU9Zvr)fyT!*l{~d6UO!*nio8%OiH{-Iem{pi7AKr#<1UOX#VAmWL>}SO??gOEsWw%;JB+m-WT(1 z{XJ{V^EX`n9zkfkM>5HF=>W4p0{NbFHEj~FR3i~OK9I(fhhea`wXcYc9oKEiPMFL9X-8P2@j6BJppLk3@TYK(6(FihL&e|7G&WGE4rO`X{wu|D6V!Kz#yWqT;AN8ksbUZ0ZuH#7rc>`>>8ToqDdoObB=LzH$ zFrLgHuK|CayjZx@&ua1}5#n3Pqf3jwP2LdsKPGPp_upsk7psI8y6q7t%$@`=H1IVM1Cy9Ir z;{ErT`$hMw2wrFT?=!bP5%bj*ghk9ZC8h5kjnTbh!;hVySH@?AJ!}(TIPG{A=vjN90|q$ab%jAI3a6OICT@KkQT7#`sp6d^gUU z)yV%w9{1;;gNx=liFsxRa-CoGA%6kK#Sn6xca0<8Tv@jF6#3mq@z=&Ue}caUp+zE2*3dOl9B^?8xJace2Z9dfPD^x5TcEvMFJ z9&)YEFmkQWO5|Ff^~tq9{r7wOMYpT<*_~YLa}v4M=X2y*pUcR#J~xmLtt;i&MXvRE znEdH-68|;1*5@^HtvI!%qXM%3Z;@+zeMo*6`7e-b{r^O+_5UZi)_-Q4=ehn1kZb*y zBG-C|AlG_mOy0hT>~D8+E&o7rEq@BRmVX+#_MiFWTK<>F|G<3jHS(X(zK6)QoF~Y& zoR`S8oHxj|ocGDKoF#Jo_qfn`eid?^=Qkv;gX@0n$Oq#19YC)8l|-)lHHBRFYc9F& z*9!9b6=i?kC)fQtPOkfPfn4|NC-U}DlK)Tg^!dcI;JTOg^Xl!y!^pKBDv@hF)F;<^ zh$7c|=uWQnFpyl!pF*zXpH99D^QdLyT7LchJ>6d||1OHx@*g7C^6UHLnn(NRC5qSa z>KF3GsQ-+ZUuzyMXFhT*X9;pGXBBcSXG8MRm>;$!*YYQkYd@SquKjQ>`9X}^E6DZw z!)Ef07-!xm*LpZkuJv$%TzdAv*++T*s?jZ& zNv`G0{P2I2@0Hw%v9;@G@tNr9=ZOI!&@w#8#$#uU5lIwn@kn4U;BiH?! zPre-I-;8UB zuKRnI{4VzQd-5A;q#phu*Zs|g_nEa_bbs~xd)0M+AES8P-_4U^|(tU z--+wv7s<8!Ka*?u|037&XTkf}x?fuUg5+BM(&RmH{kagiM za^0^{(Tja=Wq+edz@oRsqjxn74kOWp{d-}r@G_v>$REoW9- z7u0t77030%V{~ z#TD`@825f5KUZDK{}=g%TH={-e$)24Q%XE9`NA;qV&rSlj^)X>MM``v@`eq?o01P| zE8c-TH;&U@nQOxVPS|qu^2GO;OGv;Cm)FGQMJi0V*F`N-VyWLX!7K8(jGD7 zjd9&}DEXcG5?1@{5sD&aLF*QJ#I|?dnMU5%N-xh<{1`FZ#oE@)CF- z?JoJeqLL>g&STnMEh>l?B>yW+ycGE`^n-!et$bZB9VJ7*IW|C(C`4gBwtR!E8^^N48;<(sJz8dr7_sGA(dG-@>y!;Pb zAkW%d%J~cVf+pg($t&Y}R#}{{w0+YxmH4LQ`nipPfG)UroLW^|F=xbIilvCa;9~ z!^h-T(f`kq*T#J8D*0FFhquYc){t_hdra=NUEW0hu1x*`>a!ksUz`_Ol7EKRS#jh) z)ROHblDBFkzLb1nWAXju88eDsBd>@4Uliri{nF2Wv?4EycGUBm#=n*y<)QdpX~d6^ zU(X=^8~Fs(d%kk=xaNPUfvguNpWjZr68TfD#p{u;#`x2U{BzW2SMoiPlBXYeIL?DZ z$^Sur9!Gwvh2)t%lYR zucF?*C4V2|)h+TL(O&e#=S=5M^JBV z$?N0wNDuNSab6op{x;4>$>hc1Q^=d4oO8%WqrH}qe~I|@mm!l<5I+RP>t0u~yi@YD&u?YD{^pkSrGjP7IMLrehJFP$6?gq41 zCyKv_*LQu%_3w8MA)kly_*ioNyR$RN_4|vSC*Od1*DCTmsOK%@ALDr6L;eu1dwf9t zGwSms`CS|rm&hk$UiUM3!@Satf08dQC!VRY+-p5&3YYbKY~mBiXS5N2hP+*v_yY1Bc)h=qd?@+emEC)eMbewut+5h>>jK~Hpb>>s#dY$ zk*Du0<(xxa0ORvQ@`5;CmXbeIr3V*W4Pra`5Wjb-;rm-yy7}}G4ykN9i#oN82Z&86#p>h6@Qa&#(5zfUdL#j zPs&L-vykWSAfAi-ee{!#{V5;$rA`w62zhmk8)4+n;5ZE@?}hVA z1@fZU-w5&&n3vWj{}AI_L-MoOuV&$#Tz0wK4B1LY@KV-%{jX6_@Qc zB5#4?t~vP%%mdqy55eolPUK@y|J}%c#dVmzkN zX{CLylds3?ms{lee!w5(^DrL%O@6I_pzkqS6DETyuOQp!qU_2>D z{w?ai3VF^fr_QcN&VXAfHoO{1x&ZI4(AjKZS8@D|tp-$J;@EKZoSs zOa4BN>jUH$F^+veUKjJ~W8^zA4xAt#iE->Kc{uume%@K@vntNx-%@-goUgBuf7w>{ z>n6E=&)OaG**PWtKKT&gKw8Y#v^)b*{>AI-QHJ~q z`dfAKfAG4sG5JM|^PS1tV|<%Q{tT|0JWsv{dj0A?dA+WZ{~^3S({}8H*PFG;|Hbp8$QNQB9!tIp=c7b&{T${*a{avJ zbL6k1->xSwi1vMrJT1oC?c~RBTxdDNfDb7I^miT2d`jK}e- zpW{~l7spEa5?_24G*VyOT3 z$TiPrmeVviyYcYPdC)e*e?@g}z zHG(`Z`pInauIPsg$ZMyU^1n#F1?Rh!>z~J@P4t|B$>e`qd}o2XOqJBp-w0ux zALJ7XNuIySN8r4W4*RG5Z7SxaS;!A#9+H!MMls2spZpcP-qHHg{2ei#7pM47(n+2& z*N_x&a@b}wEyhFc`z5bevY>SxxU|8mt5a(ZAGr%@7IldRbi>n;pA`Pd_94@ zM?Q&vmi!aMFCkx^MdH_y_b4sCll&Uazvsx?L`wYkC!Bw}pQ} zUK!)z&*b`f=z=(JXnpFuu{3!RoM)?%mxMPaf3KL7zXN$9#`8Ypzhsv9A>?1+{5X!h zKVDBgMV_^?IHJ$-=E0!a~gk=Cu7{sjQ!Jk8&@R|TndoK0 z-sC@`-Jc+znpMg;G4B zt$+Q4YT7P;<2cHR@ku@KnAAf@@~sbx$B@T7B0ict8uP{(knhRU7L`1Oahz%Wq+ov|$X7fn@sZ?rFz&S{*Ux>WkcXk3 zcaXP1|NM+RJI0OEz2jje6x6tiouPE^^Q@nn!=5ohH>~4 z@{1TBz9!#_dcRJ767!8e$!FvIk_F?sw#x;q7a~vN1Kd)E`~t2E)Fh9>{I5BATAVMs zkiUode;oPuve`fqc|*+er;_X6=a^5v4CCG^@~Q1*16#>|Lw|dRyl)4IKSus@Uh%KU zAH(aNYvc`ZKDtMq59^s*NcWZI{`2UnW00@|PlCjCQO>uJ3m?A%#Kaso*#`#I) z7cgI%Lta;3H<90JAo(|w=fnJMFL_Rs=Lq>;jOS;`KhG-pzb7AFNBjK;pAm-zMM!Ni}})X zyjMmx4z_O&|bsHR~M8#6UeJ% z5T8xnx~BLt@`g>sHPgv82R*NM04=@E7FmF%Ex6{siU&x5;&WqraD_?UI1} zdD_bM)hpup#mN_;9jlP9#5mK4{7vL3?zQ}baowpH z`72=(SBZRUC-Da4`o4Hu@((fJ>qY()Ue7*3J`eRaj{Gh7)8xe>r93Z^f0#vl9r-BC zd-Zb`S`Ww3?uRJ87V76D`CZiWW%6^mWV^S>2SkVmFi+R*X2>Rq;BPm%wFdCm*uDL8)Dl0Sj*Z3lT1 zjN1pvpUExdJVE{>j*D-|_u%-tNgk11^88CaAM@}W=r7t{TaibZjKSzD)`|w&1dBY_CdlcUh z^>duOHTv5{@`e~cZ;+QnfBu`iUuKcab4Ym>kYB{>uhr!GKHWBQeZTKra(%z=6Y};L=f5Vefcf@y z^0>-U&OgZqR~63^E%#dg^HKkW$iG4VEJJ<`^RAlYe@95(=H%O=#JiAhK)b||Z^H4C zME(`d3scE|#Bn#D{0ip1tH`UM{9DO8qkq0b{t@c!7`gub?N{Wj^T_^QBYza-xkvs3 z&TE-*Ueb2yg#K2L{A#4+4=2waE?$Ft177Fq`?Q*0-(T-c@n2)y(D|drKaK5<zFem_O+6gKGX_n4iB!@mnyzeVcqOj?<&$SJD5!B;SSe;E&|XN=d!lC7*@) zUMBQYEoWZzw*ut-kiRtf42(0?$$!rz+igm|7~@Ga`2^H+EO{Z!H%5?uj_a9|$#-JA zbIJ8O=}Pj07;m?bkE|}`-$(vC=3^g|=f?Tv9C;s<=Lhl^s!9Go$n&GUGNS#pT`uAJ zNq+Ju%%e(?AI11sjeITUy-mn>;e6ML{0hq1k6eFWF_HYPFR)uCk*`Ppn?t?`zJmM+ zj-$=w`h8M+$5}A& zFz!W=>+jDrCXd5$(UE*n6)8sy`LPn>!^un65}!z(2glKKih8zsx3o3;Vl_JR|zUM)LdUpKp<$L_hhE z{3jfDUywJ)^@{JvZ{hXGZSrrhU+KC_J!!kF#C3r@;;^g1umgiR?pW0Hq5qV$K zLwj=ly_Y`ZlTbfH$%kN`FrIt^`r)(WIr0A2Qu1Z!ha1Q*;QGLBb{t0^kY^|$`+J(a z9_DY~l7EHx-^g?3lRRmA$i2494V;H^lh?p`Ka6|_>bWv`7>?hD@;OrMz?0#c7U)#w?VVpTY-lLA>|CGEf_Umi%J>e36ja)xRewTa? z+Baiwd7k#GQxD5}KJq^?&n!V6jdrg>zQ3d7X-Iw;-jlo^%0HO=PmHTG$a|EL{Lho` ztRcRdT>If6@|7shSLFJ=oj;OyM|<5RFPv4jTd0rRYkhu#aib`C-+~fXihNCd@p9y! z6c?{T9$8MjCV5Sqcj}Wjtu66Q$yeh%*ps}DwhMWh29jqqdAfSyGsxe@^^oVur+1L} z)#RNp9&RHalwaaMAlJY9bBbI)=X{y`&sLJ>CV6eN<3HqMaemC!SDvTs`z+4CkC3m# zyyY?S^cX*Dl1F2H+noGd6WLxg`FYHDW61S$gTu&U5I>$g8^)7o$P40p`XYG@`pH`I zu2RgvcJlgoee@oApt(HZGxB9E#LttzkNUq(UbUgb-y?sfns}xdx!3mk7U#kIZX>UR^UgcukD&gKk{3dKo+H16*Qei;zmECO@8qo!pRS+mhql)t9FMulv!OnV zk@thwBmV~TrPk!ja|D7*H}Z@)FT|7oh52DJc^ZtXQ_0(4oS#SjA+EcvB+t<(5L`Bs zPse`kA@9*d;y)z+5bqP6CJ)Da{tEeOwC^qQVPS#b@-Mmmy^S2P^0+UaZ`v~zWxW#l zDU@?4x&D6BljJpV-h7&TT{FqQp8Tc9#CMPvs4M zeK2nCBwvQ(^bomz&(ulsW_TTRnY=yv&nyd+ z_zCj0MZ~`$PlMwk<3M>_`}t!S4-1ih-&o>GlWYHMPp<9Thg|!~P;%|h6UfVClkKi0 zFI`%EJ2{4jz6=r`K>DAE67*ib@4`W{hqa5e7 z-=Q7PlYfcx%Qf^Jq?f zD2+TJnmh&V6+?am=aHf0k)0&ZIP(3O#b=SX!MM7RygkN~)#S}HNS@co`{O*dm;5IB z&xhp0u)n9sca@U--;g)K{PqU<7|i$nBCm^j%lw4o)Aqf9@i0GmyXF#Cg8U8SuS~uX z{h>bji#Tsak?XkBmHZysu|K(fAH@XnlVMWM>Ev6{zR!|Jg-iSb^4+b)mylP*`EC_? z>5dY=j{H09?`!0Vc>TD8yb8{nd&#RmCixGLm(L{r0eNy6@h`}$MTuV_Uzc9|CV4kp z2l$&@f6w}%A@aP3+?{`2tiNYnh`dLX#8rU%?tM}y__KlWp2mkzo;UNzgVV_M`_@*G zuPP_;Tgacp`Qm-@Lui-t$m>VSb~6n7Z#iGCDeHyF-)bu!L0${{)rh=KBZ+TG-V^oHf&2=} z*^T^J%r|1lJK?&)Ao7JM&vf#CFyDBUJS?4*^ANfIorc@wucF;^4VUL>`%XeTmLY!< z*B^S54?_J+B>$nQH~s#IdgQm!A9|7R#`$G5`4F5pUm(9In+v=_{&sPB;5_-y6~zA`--`ZU zEa|`HKZyR;jJzcJRXllqlz$cZwbGJzFL?s$?JM%EsQ)YE@z`#b)x4o@3;9FkW3DKb%AM>mTyHoy2pe z{I?#~b&&N+*rMdD@&@Std&yf>k^G;KC+8EtMm`Yp_6%eGyI&F2WIc?0HRgwr z(Y^!7 zr{D$iO!8-O+^r|Slwb1hC4U|BuB+sma!P!;8Uc+?TT}%JU;R4%5I5<9@r9bITL%8TWb6 z{Q`fJ<8&NIJ6@ir{ZQ*IyK$dqnS=#$lP`i7fNQ{0At1zgK0$ zXDD93C+f0sU;b}V&a32K!>=3nwdVUnThwu=tLawU5xwk>_ndK_(t;b*zTv~;TTtM!To;u@#>WSk6Z4O>v$M8SsvGT9dDbH-zy|>9mzFMZ*t9( zLjGC_$uoug70fH(j=v)7Md4cin!l`Z-*2~~e^w-42ahoB+x>m)R|Dfd&jrLcCO-~u zVch4@zemu?xX+`15A<>J!s*?EZs|ECco#grd>*Zzc;h}#d&DP@H-ry2?(@7|-~DjQ zxGBNA2gmPn#7`t&2%l!$=h5%uU1r>u=P=@5BHssJ1J`!^7w!12asQG-=RY4APwTwV z8u!C3SEdB-0zQwAe@j*aKTnbWX#Qx#XPz2zAOE(j2J#s9`Qs5^(YTM_kN8@~ef(s^ zM;rI?hY{b~xQ~Ax@nekpcpcxS8u#&Q5dSLq>+m%|*hLQBL%+Ynu)h_I`~B^M?N%Yz>$G*qpG15E^3m`na4pYsC{IuF#qbg2ncEz_?n!RhM*cfqPaPoF--|g$zOb<5IZHkZ*M+W=fJ`p~^ zxPSe!8hMh9`#b~iz(lx?Z;zlp=NR|(FckZ>fP64~8TlsoOXTa|>&b%?LbsjGK#Bfh|Hd67IHe1&m;oN9U2 z8~1tYBYrb^P5A4^eV&pH-4D0yGw$>BM*M#A?(mP`x?laUUnfkwKi>8C*1x3q1jK(& zJ{*3VJQ<$mDPP(^a6a$*!&rC@@~QA5a9?b{ziFDeA8sj0@d3m)Gx5G2Qn0_R$Vb52 z8Mp1y-MG&)5AnUpXTyh*Z-S2?Uk4v$+_vKs<9@sPJ*YFt-$R}`aBash)WeG=-nZk0 zobHEPR#ALe#BU+51m8nm4gLXnZTLy@#_-Eb4vKq1Oh*i=k$Z9TkcSv)h~%> ze_HM}kDgBp8Ta+3*K-~vKaP5iE73i)+-BzZQB56#Fk!n=@Hf_Eo>3_ggwEqn-h z6nq3++x-pH&m0r)>p6c#sjr0;ABp%)6tDHU)3~qCKG^Oa@*eOb@)ovRmV5`i4*5xV19JWQ-R;P4BEA#(HF!VrT-jxR29RfiC%|=o zmtucsnRvgy={rfD`4pdPuJ{`!-q%AV8~1rWLi{cAx8Qe-`|;;`4)?{$$WC%-xcIqKRd{4sY@`@tXf8 zx#s`NxbNq=wcnCwhv%3Rs%IZx4xWcR9A3z{?}v}Hmgg6RYxyrN5^rSUeg4+S)0Dgs zyp?gEU-zrCai8aD#CIbf4exE-=NaH`ei>xk=lKHhL&!gck1+1@X#W{++~>)N<8(6l zedL)(-U{&x$(z8J828()7VdtyWsPya-QkE|Pd*U7#kkMYvz*W3UcVamd0s^PKJo?d z1IB%x=q5f(AaK;U&$AElpOJ5epM`5bDZV(ECUDurS9a79@xL1P`M-zXA-@R!mpmT^ z)^u}aJAORzd2+zBk=KIj`B3Al!t| zMZ|}bAAy%Q?(>YyCgrJV+~=vETf8oLO?V^YK97zMQO13qIK;On?*{K|+~?8pp|5eD zXD#CUlfMX0BL54n=V7g9{hs;pCf;vX$A?+Q{dSAzaX;MhEcwImdB%O7F4*oe<33Lm z;$I?f247>`=P85h*jtVJJi`(HCixTa-Nt<$9k1Ru?(^(N{0HRo;75)7JUU)|Vch3g ziqH3cNj?&O(YViZsiFJfmTSg+p8EbGs9SE3SAqX#+~>&|>7xUIe~kM)qYQ3 z@B0shXEN^dbjRzRJjQ(<{XB31@(svS*tpMgw6tt5+_=w^2jf6F^33qc#(kdGF(0UF z+~?_n_=e<>@TSInp82KR54Ut6&yM+FPvbuScI4?xz8O9UuH)@t)cZ&iU)kl!m(y=G z5SVJ*=hyF1nMr;I`R9_~g+EVz8@`-ezc+god11WY_o{JQ&ex3layCT#8|1a&Z^N}7 zw10eH;(h+IsE03%`}|4B^CkH}_!aV<@bAfAgWn|o27a6T9Q>YfTh6o#T;bfJ<7Cc) zvYwGV13W8S>tWYIiLXem<5ws0ee)zfk^FD?9P%ivZzf;yyyW?ed>i~P@}uzFxYzS_ z1MF8}xb9aZ=KYN*UeCYn$n`wfi(JoZ1C9IsP#@cUg1jy~(RfuCuji==cw7 z>v(;*#>D&Wc18a61IB%xc{SY+w|oZIa_Z~YpUE4d z{{NypVYq&t2K`R+1hBs);M$)LqCDZ``{Ct{`*M!;3EfiDxZmHe5nq@5EWD9%TW?Xu zeV)6BZ%=+3-o?1jGpDZm;g+6o-QVNSijSoD9PPy?828&Pf(t8C$n(Ny8u#0s-$nAw zH}3PaNBko47VxETE$25V=bPkzz&|p1{C2Bje@{_-zrIqQ>lD8l*iYO5t-a&5ip!ql-(P*5oj{`^bIBtHS#m_uD;+`WbKBZ#NrWcTXli zf%(!L@)ek$EFk|Ad0sH?x2xmQ%f|h7mzQ%t+_ILu2Yi!ppXX57V0d7sai3>u1@S%P zCE@QH_jv|l-gU%yusr^UTRtIw7=FUI&(js-+j-+YG>d=GE#HuTRz>`(aUc4uKgql0 z4*4e$;%OGkz4rfQ@C@Yr;SU-2`O~A_^Bec&yjM-~K1{w6UevfR;@->>-^94jGp~kt z3-X!pHpYFPVp$}%k zUuoQzzZ=TG&bTkn@@(#hTXw;9Ty2QoBf4zjeV*pXbKSVj^B3j$>4{+aK$aKeUh~&} zQr1h7Z-+;cXPF`K$>jREw^zvHFk!kxuD|z~;l=-!=bH(#-Wcxtt>51zsGlg~et*Yf zoO#^1Z^uqG-4D0)Aa4gxARh@IMm`LlWZZ9ec9&rKz(nJIyK50Ym3%gQmT{kFL_x{3 zz_`y-t(N#=@*?nM#(kdfrV_u_xX-f>@f*ok!M7UsdB(PrJbR4$JX>pvzeBzV{=RXa z=Vjk;Zu!Kx&r`QfkOQBShr_=x?(=+w@_b|5=h=h!@5ooeufesS>*xO-S|Z!m@vuJT zAvwtF!t)yU<(Y){r-~Z)S5gHPeh(R7h@=5Sz#(kbb zc_sf^<37(4#BU^j0lpQk^)nyk+(&*0{xkV6@El8J`#S!d$M{pwxG$%E-)RZszMT6} zo^bND@bboeo;6uzdo_*wJdNv#*Cj6vZ)Du(`Ci9K<37(>#J49u1n+Fz_n&;|KfR6n z{0;qsZW(0U=WkFy$bli`W#J=?`#kq^N&I-@KF?ajPbOaspG$rp{yh0L_>0EicH=&Oi|P_r$hgm+xsmvz!iy}I?dZ6)9rYP*+}G!A2@6y;?(4G)wp)Wd z8eZ49&r`&2$Suu{`#b{?-{Zrt}b z{angE<37(`#P28H1wUlm_p7Jz`sj#ppT9G%Gn_K+^PfeYv*gF&=Z*XPYmxt|ai9Mi z|Dap$z_nkMoGhOECAn9R#C#(h?(5U$sY&sD5Z{TsP(R5#fxHoX7x|lb9rr0*+wnAx z$1}!#d32t0*|@K_$0FSiw_GLv2laN{xX+{WoIA#Sp5G(g54ZeDelRk~fq#wrJWq8J ze`po%-JQ>qxrwajAlL7g%WK>>Rm&U_A8y>|$%A=pIr5*7zp`;(o_%>GPhI0a&nDz) zNWL20)VR-+jQK!&<33M;W|BXe{3qn;2G@SIe4NA&HSs>bUT2s<@%It`Dfvg^CC`;q z^4u`)%lQ_{`78Mj_#c%29`d(aE!)xZFG`U0ZgB0N+j58xGVZtgBk~U+zXDGo&)3{N z$t`172k#!dFP05HmAn~zCV4~nT=J3d=g9}bmy^E&Uq!wG{;F}`Z?zs?Gw$o*IO5+R z{|LU9JYx&@B)7b~I(YY>9s=+Wjr;9>fcifN*Y^5utUUi$6YtAY1$pj}hr|DZYo6=K zlk;WwWVfidMgMF{ej4#T$vX{}=Z_h7N#pL)y4$&- zvR;4} z^TvIirxE`R`B?ZZ@+IY(YVj^H}dHBC1^R%z-yX#f4oQg0JpR@?(=MD9ppee@)huCxb~Cz zI4%a6cwbI^U72Lu=l=?MMw6d|kEi^vBL5Qd$A(Bbw~!~okCMLt{~oUWGYR!@)3`5x zod4mLzl{6x|ATV=Oa22q{o3Hug5#}Ep}!xU)40zwBue7)lJ|fYGVb$?Ks%N+?(^(L zd>Qh$;1!JfJY_1%c54~;c}^m}9{K0+NaMc$=yl-E#(kb&5#Npc8oW1L`_Esaq&!cO zzcW*OG5N#j4?D=)!%vd0!FZ+LBc?{Dcg z5+6=p5MJK6&vOIwz?#N=o)pB_B_9fJWZdV`&yz$M_jxuVzCHO;cpvin@L2L6;3LSN zXzMoOmK5?X@Nvd{eLk5r7#^5r+?PKI?|aTM?#ur%@+=^K7ybfV+wtoul7AO@)~VvB z$(zD&lXrYd;!CWTd(A(4w5&HFUkmR~ehEH}{4RV0d3Ia}_=tSPWZCWy_*G}T^ zk^hZ$|Hrt`vou`dvuu=mpWo*RL!Rv9kHQPUwS5y&&M*`2`|Ww3&@EMr`}{SLr#g9c zcwNdr4f!88@jn00$luqv->)~bxgTyBPTs7v_&DRfJRPvziR5kI(~SH4ZIEYq~3!*JcNc)ZRnY2tnUcaguEabNyj z$X|b%;f1%A%54vAjrptN+{2{mM_v;e&tDbS+ z?)rJN7RLSlp2vPgkspP3Fz)l{>w=!feV$tF-4D0)C9eS=PTmflMBWlU#<<_FN;vMO z829DT@oKj5O3o9JXC8S1e35aVN5`vG#(kdW5Wj}}Y4{enwo7=Ndy-prnRs9RMkxOW z#(n-*kmqCa)$rq#zc%t;H}O7y2jstP-0zo;SLwI76}R|);$6q9oW^~5_F=nu$#=sG z8TWZ~yeetj=Q)S?GUTV>6^;Ay&&uY0xTU6XTmBYst!MpylNj>aI4%-Q9-lv7wqW|e zIOD#Yw^5#nW5?n!o8JiQi-5eg4te z#E%&F`Tviuy8w^s_}T!z1b26LD-zt@HMqMLhvF>|916vuIKkbDQwqVMSa5eO1quZU zw8(c)=AHKJ`~BxWPdDA)o_*)sxwCgAA<2N8Q{?I3=ixU01^SP?-sD+Nj&ZA!cY+Th z&wzPeM&2BLfqXpt75Rj*rjM8#{QI$g@2VX6fZnFADfxnN#)rV|I$wf$8%y|W|ue3Pkb3J)s_#X16@KEx)@YCeu;OEGL;djV)!yk}ufd8gk9!K`)SKlbl z?fEOzzbF449&MwUCz(&FPaI^f$0CmnkFQ+DjheyKr&2CCB~hP_yeK@ga>=pZ-^r_7 za+;#P0C|0QQRR8Odi#6Jt1FkBVW_W7-Va`1x%6XyF1J10K8{9z@7?HaGs*4mHCRKQ z0QD!y55TX%W&UN{hS4P5``n$}u3O(GbGxm#KaZM@-2NPF5pw%;zZJ;GB{I1|puR!cdAw{0GWFBRSHNd05A;gyd@fZkIX6(hlKcXEopQ;sKmWNyx#YyE<6U^$ z&*TB{Q00MMUBv3)<-QZjC8sp%&yW{}-z4u2zf0Z${s;MT_-pd%@b}6Cy?*R@JIPO` zU%RgC&*`OCF8%xJn!3#7?~$KFx#Zh*SWvm-$|Ywo>T8ns zg4b0pIcsv7oEFL@XCvy{kS~XKRG!DH$G2U4J(Wv-@+c;MuyV=2hn%70*We?SOHQ^@ zCTEgz$w^$#_%!n9@E?^+&be%+eu;9)8HM^47J8Oa9NM+;>j7I;*f zf|pP(Ire$2vU16}h5G8`H{e0aCC5GwHd8J+Z&2Tg{29DG+&(YdjqBaX+Xkt6$)6cN zoPDE|OMaRL#>bJ{zcV$B^7|rxzN(k?@WI6R)+v|#0?6M)o)5lFxz5?ETyn~z{s4Jd z_$j!ZhneW}vZ|N-1XAE_kCjV)UF7^u9t3}>T<3gHE;(&b|B1X6JknMf{lD+m+ux&` zncV(fokDQ?II@qgN>tx9j>+vtz8tR;mXj|<{YCQK@Mq-Xy!FTYWFhYXFG#)uUX*-3yfXP!cy;o#@FwIj8=C!TK^_s_oxCKx zH+eyLf93Lcw9n(imCHPIK>cX)cJS|&OOE|M+Dzq=GZ^)A$Opm~Dwp+~8IOyl$|b*d zfOp|-8Yv* zYrx;a?Yf;5-{gN$^)f%jF+cIQo7-*uWvugpTQkwgBB)310+K+r2K2MlJ{wBT2nG3h`SqATy zH&easbB}UaKSLUsoKW)a@WaXjy;A$WCQP~H97FvD@=*9y<&tx_jv4oXa>;p%`X}Vi z;m?&zj(vahUb*C?Yi#mAk|%@5*lBK;<0$pj;c>{z!&8y>ho>X&0ne;l`n2zB@+y~c zm!Q4?`D}O<<&x7SzIWkmjmYhKYpY!H&myNI`5Aau<&tmTXZ2SuIe(#kF!>|+Fy-=i z@8$g`+bHFd-y~@``=*fFe-AiMxr|%3iK$;iUJ|~Myg7Ued1LrN^3m|4 zL^AzcRxW*BME!O0!|*%GCCC1IoZpp8PPV2d{}1vM@HfgO=SWFY|3$gv3_^XxUFLSX z&cB97Q!Y7^ikiBF$|WZh^-0P1!c!@ioKZzgPFCfTa~1VD$xp%aDwmw=HBC-&<&u-V zneo!(>ERWW%Q_rx%6*NLOHO;#HzN;%w}#vEYGRo{ZyQX$5Qcapafa%gH~% z_rdMDx|rGYeVpp;&w)Hu^)f$Un1>hSN8qoO%RHaM=UShYOHSlgX54^Z%vb40{1bAb zDwmvc1x;NdxXiP>g-B=EmzwIgmNz%#p!%J1M{g^k>Sf&G=%);MPIyJ-($CY9lH&cl zWaW|*iu(HGJK;@~OU}gvlHxsoDwmw+sP9bv5Z+z690$wZQ559){Z}=JVP!r?3N?s11|Gb0Sb(jOsBN6tRJKAw=P9WUY+n--8 zL2jSds*tzG^Lu~t%_Yrv)5(|OJU<6+`|&k3^}AKQ%x9_A#`lsJfFD#Y$IJG4TDj!( zL;X4OuJFssB_}o>UysTAmhx`&ws&ybfB)vjW9>6v?R?sQH;5-*PIKoFk~uLw*Qe1aAA>fz6~Ld2_K4EmJc7^6|4q!#kL0i6i&c&s_pw;do0ZFPe~kQX*3AGx54|8pM_5( zzY1SQeha>tJR=_0_sPq`6Cd>7U;92W19>ad7bEWtZ%m#P=Z#+E>EYAi_Iam3BGboq z@(A)|;%z6%6X1FL3VG4|rv5YeZ$*tqI%K}u^<%DiuY=&WADf>=xjY_=wl(+2K^_Rt zqg-0I{S;F!Iqgtiio6xPCi!>pI^+Z4t;uJ@+mp|Lf2~~lJb>4qeU(d}TTwrdd=q>e z`2+Yw@{{nX%4J;px^w}#{kfV|%ERZsy>};XTSs0PzFE2C+uvukN4exwMSUoFW%yy` za(>3kTiilqdp0FWq4Y+ z-7niuc2zIy-+rD@RJr5_Bc~+!ckpt`bxw8Vk~1ImwaI6|>%(oIxiD{i$?L)As2rJ} z-HE*mZ`(+2=WP#pG`t==K>6_+n4J5nUi!a{J|B}Ghd)y;{j4!DzIVzcr&dRE!$0ID z;J%~gcKbXvJ-WFbQ@P}+#7a!jr&lpT5SXzBG9qUGX+MZ%5!U;dXvjV!slrdYS)b(ZcWU%b{HI?;$5Q z`5ky+^4IX<!f!yv%gV(HDB%VDu6y?kmrLZB(DfhN?sP8j=Tjt6L~XucI7h9 zw$FUZWuAMWz7TmAcm=qf=USMD&gAXjv&cKcmy@q)Xy)r6`4#vL^1L|Dydm!bPjJHI z**-_Y(~{fovwuZC8GROm$ME9haccklQ5mY=RM(8xp6Zw6G~S2YK5q_DF7rPM^E{k< z1bj02Z1{BY8SpvErT@HTO+QQFc78UcHGW9dOFui1bBugF{FHLZZ=2raTv0AL&rpAZ z`~m!~a>;pv@3TKsE;*^bHu*2f6Tsgpmz?(HOug@<`6|aza+;z(5_u3jx^l@`kk{Nl zk#fnIjrwHdli;b9OO8G6*_2DpCDeaKei9z2Typkg^)9@vgmTGA*Cm{NWyll2D=L?q zW!X%9kaEfCgZld9UEocWOU`6`{?J~z%g7(Ytz0dD}Mf$nZntS>VUW)4@+EmwB-7L$4^8c?d%N4f1O6 zyKwus4ov6W$=kk=S4|hrz9Og0S6iPPkKgX(Y2e?&V|aIyK5O88!Embgr82ooRK4^c zj6PS8_kwRFKMmhWehhwu{5kwr^55WRluQ5i=Nqpnmp-F+GyUHpj|{)BTypHcUwENh zax$U*Px5r|cgiKlo*x2EoAG6yC8rANqmY+?$5bvkV=I~aCs8grGf=p3 z?>&cd$vKGn+~k|#CCO8FH~o|)j|#7(Twb5NkT>_tX5x&X})u9rl68Ctn9oOuh!5iTo%$ z8~M-h!sMUf#mWDMS0m5W)AU`7JUP6c@;qK?Wz0h-xShAVn764^Ul8@nl;`$x#`HAf zt|A`_Uk|tWV^W*?YvjrBJQy|1+-~a+qCPkI4xDeBlc$4sgv)Wv3dVg&eiHsxx#ZiQ-|(H4 zQT}_s9H*DL9*H~(Ji2npvFG7L%B7#Os82>-5T1p6Bs>TCaCm;WJ-&7xN~-!i-njPX zZE7l)er6-54*3*#Q}X@rmgM{3oyf1kyON)U_foF=9Hd40I#iFa&p)4F1)R&a>@CE`j+Ic;q8>m z@g0ZrMrY-cKf8)|;cee2m;6F~!r3=~JRkf!<&x9Bs;M8VTypB5egb(-_!Q-m6M}x` zDVLmXs9!|h8NN)p0=61Wz_x3T@(~<9nXI3ux!|;5RSGnxhRn!+C zzX&g?TykbqG~-rKE;(;dUxoZ7yry!=nIF^SG*&J-albL%oIEDH4cyLiBh1fts$TLp z;CXEX)dyuU`Ab#3jGOx#<15Ltz}G3)^SML0&|sJ~CX3I0U6b zB#!`(r#yUqa+&&+%B7#Ys836t4W3E4oDZ+!e3)Iik*)26-^NDfta}OY&>*Zsfnidy)SJ@26b)EKtYnZ?JOd^KaCTB7YAbuUvA9 zA!mki$w}AG$yts1ZR9KAyW#dc;KO;~BGvCi{Z;bq@LQA< z134ebQ`z(IMbobxcM;AfS>SShmi_t@>n)#h*{?Ggw-EVZcxm#+{mppg$s59JkoSiN zk@tl+As-EIK|T`Rk$f(^3;8toH{`be0pzy-VDcBp8AbjKK3=(==V{7ip1+`e7WqH$ zd2o9i@8CFYQT4LU&lfWDzl-WaG8w<7>Sf%l1B~AyPYb`VT=G9AF!e8#OHMu1|4CjG z{!Y2%^etg>0xp@a_I1KQ)JGxj1&^s*a_sYR66Mm*PpD5pz7U>Px#ZZ_!#R{oPU3;y zg}3D7!+`KHRHpH9eWN!|?JPI>r#;XL0%x#TQD zeIN3f@NeOEy;aHV-O1ZVJA6Ln{ED0q@?-GT99` zjNJBrf!y|glRU~GGe399Bf+1NCx*WuPY8cUo(cXBc?P)evKikVueLZ|smPDwJdh7A zk2_f>1@XCV6>_@{>yyvGx@t{sKlkoNZa>E!NZt_Ze-wEO_!M&cI9)(KFv#rx7IIs^ zkKDd*y+S@boyoZcxAVCP?<2mbdU+fb!Td+OV(w?pV+G*RlC(eM0gd;mP5)pMJy=`Sy#HM!ph$QMvS4p}fhtqg-;n`quaZ@)+>nluJ$=oKM~; zmz+nae@}h@{zwC_{t?`bzW1SO1bota)|MC95x>-{>WT=pv`>Q9nqg4|p!+I;W6w$@vlW#mJ|^ z%foG-x6o&Esy~eS*5tpyzb1bS?@s;@-XCtqjZ)jpL$Ios{Yr%OIZ?Un*I&q)LjDFm zhdlBylfQsGB76mTa`+nZgzzooh2T5L3&8g%*ZXx?x$IYE)E_4=4?joV0e*?R4g5OX z&T}TrbJQDVKI}Toig`|?T>6=WoMhzR!_&iUe*L;8H>awX{Vj$3;>sm|IdV#qFNIej z-v+Niz6IWZJPh81{8xBe@;C5~mcEa1fArA-+XWw_^3E{!y@!_MD>v@}` zT;?qU>Zg&XgZ~J($7KkP%TDsJI$oH!g^^cA{TuSx@aQ+q{cQf}TIPCo@?}_W`QdiG z)xmlwuUz)4NU+JNOr8&3L%Gb4&1s-qa+;yO33&r}Te$82C-nI()lWeEF!JH>apYUz z6UjHjXTt5c$1v_9RWJM18S}GIx$M^g0r)ZHlCuyw7nMuS zUDRJCzX`twkKolxpMf|ZK2!CQzXkapl}r9d*SG9{~LKatlKZ-Mc_&A$kF`o_X*p-_g&ylIRAT| zd4_Ro!DXEUdjBO#W9sU|?f#a@Z@eGeuB)M#pF!lk;6s&5zJ32bUb)QwVbuRXz5_l@ zx#ZaQ?+cVmPOOpMg|{uf6aMAj_3wkPP%b(4^Nr2QC8rkZw~?2D?^Z53_Wk=|<&v`s z^~cHQ!_UF(JkP{D-*EVQ%6W{OkK_;Gk?;D#H+#I^!=sbGfhQnOKFZub33+08T6hGn zEWrEE_MctV%j2#}WRp`+xy(;dn2f#Zh z*Zb8&x$M{XsP98Q2L3JiYWOhnmGDvU2wt|#^Jc7*<>W)*2g#4YufXl&{aQjV%-e2J zy$|(YRK4uiFX$)Yz3{vJ`}o=ckEUEd-V-X9oSUdmN`4idO1XZ#XH_ma?@^zV{0%&> za{YKOu3T~wk2d>LnmjJNf^z+MudQ5iN};|Uc`d$!|idIjN{Up{5Pz(f#k(eKcBogd^dRq z_)+qu@Q37^;D5vI`KlOR_r`nh-|^DxIXijg%BC(4-0ts7nLKX`QuQ)#%`rdq$*aMe zDA(imQZ6}bP~Vq41U^W)v=R{6yYRLjluOP9)K4Wp2j332`?Vu)c#JPp)k}V2ACC?83Ox_$G@F;xve_yxMhew6m`QLzf&PZM#UY0yI)@N;%FBCt(jMsqb)1kh< zs+axRhkgc=?|_dZ{|!Eo{2_d*av9RT-E=`)1<6LL0^cSrpe@=oxBH{X2+-l^1 zBd0dy97fJ~^84`hOI{uR zl)MxC1$jI8Yq*`~vDn{SPt5-P>v&ughRbo3dB}`;sH|M(VHonOlYa{jQm%8FD3_e& zsBb|&9o~`r3%m>Y2Y64o-LLo9ukqw@F%Q!nzLD}%P4t@ewk_l-;Csk(!b8ck!;g~} zgP$TV0>4CF1AdLX8vH(aGx%fjCh(W!J>hT2yTU)f?L6nld?xzM%#-z@nE$WHSHY{1 zH$+Zn^7ruma9N)cQ7W1lZ!5Vy--eRcuWss3k*BL<{4(73ANrN?_o_a8-C`a-lFx%j zcxvuv`?TZ6QZ6~yP#=%{96TL)%pXi{Ch`dI0^~K}MaWCStB@~;*C3w?ucKV%-_CP$ z<+5K9Cz(E5lfOnzPx27ytRxUaJer~B;a`H?z`Nzp~!A~ofoT;*N-gZ^F2{*0b=t z{kyJOAwM2@3wUz!9`MxU-Qa=b!{7zUzlE0~p9?QXJ{w+Hx!$iJ#1j9tVC$xy*y@|99mw zZgDfIlK%2!BdGAN~j2&SxFWLyAAld|3Ymo(V4NL>{8Sc>k4Gd2Y`)A-@3m z26##Geekm6zrd@JpN7{WKM8L{ejDD5{5rg~@;qw4zE&>#^$zvj$zQ|!lP8|;-O1Yq zlgEb-gWGu?k9nR;eiiF{naauI<#xyXZ&faRmPh_h^0M&#7{b>9p`A6iurJN}xOnt^b%~yNgNQs=R_mM-UWV%d<^^=`6&2(@|p0*|`1gQp`u3eQA-7@mv#3Otbf0=yXcYj`R0 zSMc)6^*q#2F2^xoj+vJrav!__+#Z*1nCJfFDdCgIC&AZ~cfj+-4!9f_>2p7h*HPut zXA<;tf;<5{Ou5dvs$6pNq5dX$4)`PTj_{}Ct>J&b?fh)Qeno!k4d!juv%?dRmxbpb zUkWczejMJ6yaygHU&HO|w0`(pr6<*gRW$ugQS~xEbFg1C$cMw1kSCmLa#oOkK>b?f zfnKS7owi-Mj5`fEyU7Q`kCEq?XU08Ao&TQ<4&{=6D4p?w$|XN5@{5wEhgT(U46jKZ1h1=H#?6kO-)Ny+#+`%uHsn9R zJ1Uo)3bDNlZ|kjGa&Do%ANe`>VC9n2UGC&IKUl7i|@#JyglaxzNT~t%kdhE4awWWo07MLwc^6&!SPx{z5srJ{5|{*dE#njf8UcghsXZ# z-|>?3Nyh@_dP2C}uVB;{Q1!AN>f3oEF9xqfei>ekd_TOla_PsuerT#(#;p}#oO%prwi&MlXry2P%b(4c|Wmo>1Q13 zlamL-((@Nda8!$*-9f{!CF0G~=;5k8Z=JbbQlJ#R~u z%e>V`{Yvt>@O5x|T-M{b+$MjI_h0e<37@8a-w#%Xr-aM;lzyJ#IObF?{dB~*dC1$t zi;(w+mmu#8uSh-`UX^?#ye|1Hcti4O@K)sO;O)rQz`K#}gZCoe1@8y9^Zz~Oa|(HL z{CvVH^6l_Y^1R5oO`aXc_Zj&Bc;t`%$2VFnb3FxIj<1{tqDD8Kj_U2_+FEjZ~$fLu*CNB-|PF@(^N4fNGpMQramp;3remHpt_!#AqGbgs`Geo)M ztVjJa@=Qe z#nj(WE;$=fe}{ZI{GoEmnP1!Fyi_hZH&OqF{4)Fl+&(TQ&oMc1KAEp}9ah5Yy5!0w zKj8{fmzw+o@-x6~e%L%y-^AhV96pTlzr(mA$p^zHl23w9A)g4JL%syQfP5i*1^I6H z8uFd+jc_{;uQ3nj$WzWY^K(Px$a#KmT;ora%lw~2{xkAl;cv;W!#|K;g$H~#pTOgi{{v4*{tli@x!$kz%EQ;yO4CPX^0@Ha@YkT=Krc}D&7D`&AR`XA`+^w#nJ8a-`46*xz53 zOP_U+f111|{Je6Vb3?i0^g#U`@{aJ|;I{wq=<_qxhoC+n{1xec?~fM3W5PKnvBPtb zufw>dl;fk%@QJIXJirtC{j!ea=aDm(yfW6?a`LzEGvxMoJtyyt{KyexPyhRVOf{I{x$rV za>+T1oU_WM&#rmB3vaujT=Ewq=MMP-_(SEA6RohMc>fMUx#S!~{TuQf@DIu*=Xyj* z@xH$kVAhp={{4XZXymWpvElY{*E*%i$)M^bKWb&;xs*$v8P^yOBu@)3q+D{IRWkKu zl}k=h)K?@g46g>aeRf8lZOOlf4{YJM zw`Wz39QRdmybEu;uIgpTGRec)_fgf$dT4^JyPq zg(p`oIgQJjoXpB)ekx*qawwO2dmbpLT*keC{G#Mx@KVYpXHRzT!rQ7Umz;N~uSxzp zysmQTvjzHWrd;yvd8VUs$81Yw|Owj}!U7$F)9hBvUTC z6bCtl$dkZpk+*~QA@2vDMLrk(Y#?6_KSI70{*Zh$^8Zqv*y}&o`%kujDE~d~ zgWzq+$nEQa%;ffYJU{v4swSr#xvj4am(k@ZE!4E(YfSa2tDBq-sy?To@XKLTzpuQx zakQ$J;}s9{GoRd^m)0wn`N7k^ZzttHE@krfs(Q%}DP;V%s+Xz!73=ms`2qM7F z@8i5yE;%1j|Bn16{G)QovBxWF)c=mJ- zmvK9+mr=dXD#=^H3n`Zz`~9r4$|Yw!>MN3ugjZ88IrjTm4U|jHX4E$!Ukz`mT+U-t zB6}C!)=9bKA4(_c^Yu|K`8Sc%pZp?x40*~8;W57N$>YK&E0=NY_p|0ImvOtHej#~V z_)_JPW51uZLAm72Mg33YGvGUvOOE|M)B)v^6N>sH2nIX4?c%HK70XrT=)v|bnrFg zY2aJP^T2nI=YsEn+j+i<`Mg7Z1;^#7!=uD7$IH%hDdfi>F9Az`NTi_@F>PvrLJ&7#Nr@Ayi-ef^V!d{BLplYxAMJZX4a9`bYY zV$j=)lP@;xYe=3K`_&w7=RX+Z4pH^;ct42aHJp40e2jA0FFOxYl}k><&8DH5Z1^K` zTmO{Y*1slSgPeEdtKc7%>-~xx>%a9T`?U-8(aCqfx*;j66;QGoQ6o zexOJ9@IJae)dwM`pQ@KW&!C?{Ov1NrapY04$XuGE<+xh8&`N^f~W&R6i2%lzOeyZ=pp z$8RZ@oUc)TkGuo?v2w|=@5ldCE;*x6{}*{M{2%3#WB+|hlsNwDc?s%ckk5t3RW3R9 zeSHe$($5*xry)NK&!}8-?C-hC3Ac}<1o)h%fU1}Ce~~EOg}0SdE;;snYZc|vPm~=} z?fo1v`DgS~N4ezK_tDLjOHM`Pv?dRPcTg@l_H&6|$|WZR^?k`_!$*W}$G5A~Mdfq-Omw9`H`hd9pkE46=sBn8+dRGXaW?ymgb?}M~ zZ$tT!cA13xqMuphiLtJJCf@{qN^U;~P8Ls+|NH)XROA;V z9|x~Reyz0G-^Orx|02gFD%Nvn<#JpyW52qQXN317F9;t*o*zDfyaId-c{%uG@_O*; z@waYd0QBHP?>P{T~j$S&q*=QPnF9&e~RX!6yK~9`}x2>@Mz?(;IWnKK9eYyKJ)H2`;~$`3p^uvUwBsXF7UkM ztKkL67r{%CUxSw=zW}dB?)%yFUyJ;2)YpUC<2$d6ssEbXKA(;y&x^;`8uEeg9pro9 z7s-=i+}GsA;dvAIp9f}_Gkw+~Z-(z5btKP;^TSZ`yYPu{`}xNDEGB;m`JSxCH;^yO zW_&mK1CXFvGqm3H{f9DIE70)YY*yYk?(}hQ!Y97b^8kCl5-#RYsk;TH!7E$ zDR^JGTe;*k+Us3-+g|dD@Po?bJeecB+WR?8<&yIY>aUS+gWrbRbz3Bo3Hn6!Pf#Br zk^g$W1COd)`l*P1k}H>f67DlMq$ZCJ&j`2u+`-Rfm8JS>sIN#~4qjck^wS*uv`{Yn z^h13c@~-esaNEy5v-`f$7( zd@TF`+@4pfCo>ath1{Nh9+2Df!%OmHWlYXT^6J>H=t<0e*>M}lLGZS;HOHk5c_w&A?;iOOYM`+3(a=oupPW%H zIkS*+o_q}aigL-ZkFR^mCFefsACcdL|E^qe?BnsRa>>SK|of+vQ{y#nMu`1!-Ms$QOVQsVhEk8;UxfSml~b>Jn)d&A3+ zcZXLcp98N+J`>)Md<(oO`9^p<@>B3mJ@S-zp*Da#7kmc!1^5QI ztWR0DO@hpR?IX9(7f;CB<}&rKDc^_Z{TM0Ce%XARlUTXTe`d^oa`M#hEaVN~ImoNS zi;_=(mn0tvuR*>89z?zo-irJ-ydC*Q;0`E2+l^1JYBXjPoD3n+279OU%`8mH-YyfZv-Do-UU8_yd!)9`DplL^5O8=+hB zli!A~CO;4Vi9G2sGe6tO6T=TFm&ZkQv&?+gl*_uxjrv>UIp9y=cHO?g`b?P0f88F! z_Y(ujn}uA%B> zU9~W~<7=s0)>YhJ&HlC}j}Grjo*&+mJQsW*d2{%8tCGnEBa6{txQ6DVKTfg?T>c@RQ1A{&OKej66I1DtQq6CV3_JBl4l} zr{sg-ua!&xW6-}ZjrpG#o=KnUP#=kW4Lmkn?j=v{krR6t-j-C=Oa5%+XH_owKO-k6 z`7U@Mu5b}C24U4?PKQ7+@2LjC~q6YwFFKN9&HRK4VfA^#WUlK&Vv`^j&@ zemN;I_}eq~XK*4l2h| z4!_}?a%ue~UiUty{26CV&MWdM@W077!atL*g-1^LP=zrxIB_|m5v&g@LFNfPcXJ#_}>?Cgk zKcI4C-0kT90@YVW{VVce@OT-_`my7-&T7WZ3Ac~OW#}^x`Fwa0^3(7VL}Mo5Baf?YvFEyiFqygRdd~9sVnMx}0Xe z9>VSXkHomYkq?1?cH~6MXpXOa-pm!rvIiql97kNQ!AJCW^=MAmz?XU&q00> zo}WDVdDBl}@(A!UsN;J!@%t#g^@-SEh8JD>M3Zw1I-)(xLdUv0|CanX1^ z@+|P?R#>zVxVBYayTUJ%cYxo3+xaYtd5D?CtOx6P zTbTXI0=M%s135X!r@-@*Z-o~oUk5KkehXfK{2II_`A2vi^1t9s$1-u*F z&ckrb!xZuv@Sn-&z>ksdgkK{Mg?}W^+tTzIC963u_VvjcJWdlRm&a)_^q+)0A3QzW z?pK)~Onx=0Z;Sd`(4ox5sN6<~cceD7*mWOhir*@^SF82eZtV!m0%^(k3XnZaCRrpTwTkyl=_u=QrpTKXE+rO9b3U1E>k>Z(tqGtC$j)|`s zk4gRk`SB`Ez(h%E`OZno7MqU~DD;$2u z;j!@fjm>X?oI>PtR+v5}l5ar$M)I&FrvA3WGvIxy9oN>|_rccxM$UYyU$NBWA0ht& zPZQbPZgYYco9pe!m%>MpXTi8L9KO!sHym#NotEvV81l15@$a)dyaIU@cuR8o_ddRL z_#E=QA!fWY4v!nvzn}J~Poq4CDG9#}ba*9loCbW&$Zb>)hmRz;IdjQv&PH-ue~8@H zUnRHouapOP#l=I+JqqA;qCJj>;LXU>E;jXDlFU`<9T~ezud_`fKF2{sp5hLb@*=OdfrZx+kS45n{=P= zPjXuyA%>~2^I-c)NglMw)RlC23-X4j??>)~PjUEKhaV!3jhu_*A$Xnh(&4dV`tPr; z&*Si#cz9ji*5P9vew;iHauVQmqMgr86HOmE9bS$6&J0sO z-r<)W9yPB2{@R?X$;qb}i!IMp& zcN|_4FO==Lw!Xc?S2+A5`D%=tA%XuqZ--YWKMe0l{u&-io@9#2os0Jew*UO_l8OAs zjXm95A3)v&^*@uhh9^wypJTm&!?%(jL(UCyyT4D!3r{uUeIU2>F_QTAW9!qA+xoA_ zZGCBSTVI{r&VN&KoAV91JucfFe$V0YlKStL%_&J<2Iq%H5?_xJX3ZR@8L^si4d*jztAUJL$* z!?P9g&$0D&$=9?ub$uMZf;?siQ(vI4e|}Z?9`e0#`+HmM{t^b{kpGGNZq@vA ztp7|tq@Ss~Kt2)vn!GbSOLhPJ;r-3^e&mhM|) z??wI)^*=a#DS4K5X1qP*RmT{=M&1hkmOOBzsgG6LzyE{C&q!W=sHrPK9yZ>1Gl!3N z_|Fdi)8R>i{QI=ymLiY*J^CR}01qZl1K&s<6x-z7ba?DK{{7hcG7j(I@D&b^P}e_y z8~VxZ@NdcYpneniKKOm|%kU)i{KvIkM0q@~WVR{ujaDAunXOM*-#;f#Tywnwd2aYh z@?P+r+KxAfqVsWZjx_?$7$i8Z@n>ja1>K_*x`v= z`sYkTeO>ZJ@Tm?zOMWM&$&G^d4fb(ry##sESf;+K@`xVgHS8PX@TKHcP`_WfoS&m2 z|AoU-wKjLOecJlcin&A%U;liA@_9X^vh9r`&$UI?D1yZ^Y>N0GNg{WbD7@Pa-3bB4g{ zkk5k;A%72FPaZ9`$vx)qFAmS$)4v~^GnTwO@;8&)dAmv;me}OR?d6|uy_~~Gk^7RE z`_Cb_IR_km&EXMx`}cDfeP$;QN^k1AI(&`8eSQ4%ZBAkGYsjxleiz=I{3(14`FnVX z!}pPw$!hw$=J2-;kN1uLe%YKna#aQH5V-*b4Ghx@{} z2;OCY_n*y4;P5OCuSx#J?ytkUIs99PfA8>x4nInM2am6N{6Q z!;h2qK%ciA{>tHT#{2habMiX8g~LP1(*>H`rw)(zz5lpXP~U@mEPMue6ZmcN0r^bs z3x`LX;6Ls{)aM|#IVBt($X87`G{TBRt-FliT|B=Yq!nCb#vOrupY*M@|FszR2l8p1Y8_|1gJ7 zarh#KZzlf+`JoO!$Mv z4$nBle}8R#UGmn&Oxwa94{bNAi_5Om3Pb{`n{1 zl^x#I;o}{?-{F_Z$JR7`{O<7NOa1$__1PR=*x{8N-oW9V$SY%h1~`0-!+&)6dWVNP z`~kTS&rb=K`OlAa`+JNccsB<~3F>=LeIfV;hyUa7Qp^3vEr*;<5 z=MS9shmfDf`FFCzmpc4sho2%(iSz6YhyU*Ij}A|?(tp2fem;kHBtMFISVkUzdD};B zkK<+XZJ7VJ4$rg7zfW6Vm)!o~eou!lCf|bB4ZF#wq%h-sa(Io^{{37>eP8k~@FnDN zQ=0o9B2N$h+u@nk_>bEa^~K10!<&+qNp9}H(BT)!XQKW+`3`vCTK|5|!P_`|2Ki;w zpCAt@WO6?_ywE!Tac%u5^25mKxZc11D*Su$JMf>#pTTdDr!Hc0Q*H3i4}^Dj_&o9g zsNYXs0{+V31vdJRYyVwwWrz23_$Y@@clZ*AZ+7@W^8Ce2-{&0ufP86TQ~$={5jXkI zgRM{C@bnJP>+sU#=WtwVIlP6#dy_v!&SZxlA`h-__A}CE|NXUI!Qm6h?;>ZO!`C`| zx5LB8gOLBH!xR1F-@mQTN8SNB&EI{c%=L2H{e2>Gx{$Agk0##$UrK%$9!7o|9(9NRxUI{Y>y^lh!WWYlhTn2{ zzMcO0$5G$R;e#AL-QgP@e#+sG9Ugg?f1m3rnCpogo`w8cX;WXw;T0WT-{I{X-pAn+ z$b-t5evUf)qr(GtoBKuZzR2ryo70cHc^Ol;#^Kk=% z;J=aQi)8MfXrF)1d(>AazZ22a^(Wr~Ur+urtEqoS{tvujsQYLv?)R@x z4sS+27al_XEj;1@|C}@MAIWFJACTvQM>*)9QyiX|yaK!-x&6D+eH=d5;aeSk+Tl+e z9&pINf7?$Ma{G6L8#;WV!*@FTj>DrJ_V34zTZi2Ko!PG)K8iehGLyU9;rGaMp+55w z|9v2Eb+Q4U|~@aqoGf7E~6Itk46rVj7w@G;~qkh8+!cO0JV*#GV)5BU$suS0JC zp6N7)UvYTC$l<>_JkkmOeikJ%*K?EG zKI@R5M*T2{uP2Y3*yQhV_-XPEsDDBpoW$frKlxw(pl~RoT%H1L{Xylr{*H28|EF?Y zALG=2<4S!fZcM9OD3&SnRa36(8!5+BhTo%`!@ncXhy01;VBdW5GPq$Kxvk$rUJEyz zB)9c9$XnxvXXLj2BY8sH5bL!0A9)#|=OGn&X4Gd zJBQD9_%Vlnad@G#W~OXEcHB#cS84Tq;V@83_BoaXwE-= zz2vQN!)bC`e?@r`50l}B`^xov{;6D^uPZDwcZh=f#qhpZ;vU*{vP?i$?L>5kP!Q4=V2Tie?IQt{Jogq5>!7tzR9UUZr{JR zB%h6g+}q(}$=WAT#uVix%{vF+^G`zxa8iA-qw;l6yB5EeqWpaj?$78CT9uN zTi-_hJL=DoN5l8`{~(W?%H$`AXuit)NQrg+yGwaeo4P7gKQ4{&7UYAF-;><_zKikX zgVURw<>dDD_73v;nN0mr@-X-{^5$7g{cCdjdjMiZGPm1#u)j|r6}kN!H8;6^T^&T8 z4=1p8Vxq*`5O60_;Ygm@17z?_Me|k zdCm1C|5w`C$JSNWas13V)`d83<|>Uay{=@MiI-N#Qs&F93akUf%U;MGDYUoU?ThVh z>+S96)Qpm#b}+XZT^O=SZHlWhrAwBjh9zrAnS%sYj6=maHia;8a}Cj00urC+{=VPa zbHBU&%ah!Dp67FZFVAz%z0cb@=Xr$leXeD~w^y6|O~PAHajq54_Y*e>e_(~#$q0Y` zM&l0(PpvfmL*ZpL#-A2`0Q_0ucYWUEPYGZ31>@(1f9Q+Gr-iQqFGI!2>vep!$yW$Z z#Esu1JovKlO~QGfv|ac;YfQdhIG>w+TzGY@$sZEV=SU}nzkIvN|5-SnZ~TXFK7aVW zaK1-hKHu!|`~+XO_@{&q++}>VaK0zLPB`EDZWDe2_O}VY2);x3@r3z(LiiithlTS! z`4uyj@muiI$6M)-r^w+UZzx5?KD zZ%7)?3ZDk=7tVS7_6p~`h))S;f9e_G@7`yAqYG@$^YG?3EPm@OJSqI8Z<&0X@NMgg}>Nq@~;ZN`eEZ2gsF)xs z6aHQBl<-~PD257l_JFsG{C@B*;ZK6|Ixs!I21hkquzwW%0kQKUIEu4^{43zRZnXa@ zIEs~m{5kL+iT%HW?-l-U@cqK)e89kv@CD!pgntD5pzuoYL&B@Uj|i^;$761VeAR-F zi~L6L=Y-dTzaYFF{G{-2g8yE4FF1y83+d?tKO^$};C~ao8~nWRN5L-&=lICm!hZ$% z{|G+<{+{q-;B#=D`TKbu{0iYOgI_89kKhsEuY>b{O#2*{`8eeL4x;%KF2#6Wfuo@R z*dogSc?9E23o%YZ&ijU2g!B2mIoB22nYzK^@1UPeJEON4zvjkbdA_fD4h0nC> zlU~+;Cc#IrC+B?r)51C5e$pqzZItJ_48y`XAO2b4Tvz1|Zy;oc>s$;A=ksi3bBpEq zoYh0ZIUYMIybmXDI>f{0ljCO07aJmXU>u2@&kr;R=kGQrobMl95YG3llJko5#d(b5 zR}^#3pS)8z=aqe3IG;m^px@2(^Lc<);haBnR5<5TeNTA&la{^+`m?mp|7lV<|EI&k zIo^0wIOnaJ7S8!(ZbtuI$#pT3!mI8zxt+qt!3TwN{nI+sgUlD#y&6&eu-QK$Jb1+TY2jQSwhZ+t?Q=cZ zYlU+i>MG&!ADI1{h4VgsQaJC+cL-;F*C(9y-BICvyUlMIZg4aGT(^3IaK1M^ES&3u zPYCBa=2ODC-g?Di^H0BA&pj@D@~0-36ds^I+a;Xq-S-P;|94-A`}&Ce-_a2FX<~a| zad~k%`+jEe4ZL8-`8343#3!L)8J}*9uR7*9ac~-z5fz^m+s94vCXMmDu^|9cL%XN&2}2Gz1OXdRl8$(Y|$EsdIPbZOh;RL zx?>xdSN4XSLad{+Db*poV5zA)=k1tT7g<5UbYo9TeOsov)1@sRPBk`W(_4!UJIfty z-8rTia@ka-C0)$2nU>21JK8d78h80)(Bt}iys2}`mUPCQoJ?mf9b0qf#?N%;QcdlM zw`6)^UD?jAbT-Far(5frv#Bj& z!~%Uw{4XsC&aSX{rQ3NwsP+s0hh^YszL~K5UNlk&76s7kEU@cc$lFx?DD+Q=LbRZ1 zft7COMJ%;52dV$~49bVl+$+#(7b=zihIM9f015N?_f100zwefK|DScA@b(PS&-OZx zF+1FU%^fJEKlTgL_$mcqfc}Y7(AVq#?k`Ot3O(+q$GGo*l*<1UI`q8|^!fKqGWutE z*yEVDdD-=Q%0aiq^WQUH(V1XAGUcZnq z2oFHNQc4;6g;;RN1-z{|0ru0#e{zvs2cLi6w4pxp^{iv1{EuOPVyXNvs1G;6saf>T z;z6Y)_fXRIsz2#)sq`n>>M zB1b{kQ2kZZ5Bc!H558uKXqFa^(j51`d}g>Hpr?wL@Y;}eW4rLyua|~%cN5JWmA^^9#N2J@IRR@FsT3l literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/uxterm b/ports/xterm/xterm-359/uxterm new file mode 100755 index 0000000..25c6f5f --- /dev/null +++ b/ports/xterm/xterm-359/uxterm @@ -0,0 +1,149 @@ +#!/bin/sh +# $XTermId: uxterm,v 1.29 2020/03/07 15:52:31 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2001-2007,2020 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# wrapper script to setup xterm with UTF-8 locale + +whoami=uxterm + +: "${XTERM_PROGRAM=xterm}" + +# Check if there is a workable locale program. If there is not, we will read +# something via the standard error. Ignore whatever is written to the +# standard output. +locale=`sh -c "LC_ALL=C LC_CTYPE=C LANG=C locale >/dev/null" 2>&1` +found=no + +# Check for -version and -help options, to provide a simple return without +# requiring the program to create a window: +if test $# = 1 +then + case $1 in + -v|-ver*|-h|-he*) + $XTERM_PROGRAM "$@" + exit $? + ;; + esac +fi + +# Check environment variables that might be used for encoding: +for name in LC_ALL LC_CTYPE LANG +do + eval 'value=$'$name + if test -n "$value" ; then + case $value in + *.utf8|*.UTF8|*.utf-8|*.UTF-8) + found=yes + ;; + *.utf8@*|*.UTF8@*|*.utf-8@*|*.UTF-8@*) + found=yes + ;; + *) + value="" # ignore + continue # keep trying + ;; + esac + break + fi +done + +# If we didn't find one that used UTF-8, modify the safest one. Not everyone +# has a UTF-8 locale installed (and there appears to be no trivial/portable way +# to determine whether it is, from a shell script). We could check if the +# user's shell does not reset unknown locale specifiers, but not all shells do. +if test $found != yes ; then + if test -n "$value" ; then + value=`echo ${value} |sed -e 's/[.@].*//'`.UTF-8 + else + expect= + for name in LC_ALL LC_CTYPE LANG + do + eval 'check=$'$name + if test -n "$check" + then + expect=`echo "$check" | sed -e 's/[.@].*$//'` + test -n "$expect" && break + fi + done + if test -z "$expect" ; then + name="LC_CTYPE" + expect="en_US" + fi + value=`locale -a | awk -v "expect=$expect" 'BEGIN { + exact="" + maybe="" + } + /[.](utf|UTF)[-]?8(@.*)?$/ { + if (index($0, "C.") == 1) { + maybe=$0; + } + if (index($0, expect ".") == 1) { + exact=$0; + } + } + END { + if ( exact != "" ) { + print exact; + } else if ( maybe != "" ) { + print maybe; + } else { + print ""; + } + } + '` + test -z "$value" && value="en_US.UTF-8" + fi + eval save=\$${name} + eval ${name}=${value} + eval export ${name} + if test -z "$locale" ; then + # The 'locale' program tries to do a sanity check. + check=`sh -c "locale >/dev/null" 2>&1` + if test -n "$check" ; then + eval ${name}="${save}" + eval export ${name} + + echo "$whoami tried to use locale $value by setting \$$name" >&2 + xmessage -file - < +#include +#include + +/* + * Returns the version-string used in the "-v' message as well as a few other + * places. It is derived (when possible) from the __vendorversion__ symbol + * that some newer imake configurations define. + */ +const char * +xtermVersion(void) +{ + static const char vendor_version[] = __vendorversion__; + static char *buffer; + const char *result; + + if (buffer == 0) { + const char *vendor = vendor_version; + + buffer = malloc(sizeof(vendor_version) + 256); + if (buffer == 0) { + result = vendor; + } else { + char first[sizeof(vendor_version)]; + char second[sizeof(vendor_version)]; + + /* some vendors leave trash in this string */ + for (;;) { + if (!strncmp(vendor, "Version ", (size_t) 8)) + vendor += 8; + else if (isspace(CharOf(*vendor))) + ++vendor; + else + break; + } + if (strlen(vendor) < BUFSIZ && + sscanf(vendor, "%[0-9.] %[A-Za-z_0-9.]", first, second) == 2) { + sprintf(buffer, "%.80s %.80s(%d)", second, first, XTERM_PATCH); + } else { + sprintf(buffer, "%.80s(%d)", vendor, XTERM_PATCH); + } + result = buffer; + } + } else { + result = buffer; + } + return result; +} diff --git a/ports/xterm/xterm-359/version.h b/ports/xterm/xterm-359/version.h new file mode 100644 index 0000000..d59c49e --- /dev/null +++ b/ports/xterm/xterm-359/version.h @@ -0,0 +1,50 @@ +/* $XTermId: version.h,v 1.497 2020/08/17 22:52:38 tom Exp $ */ + +/* + * Copyright 1998-2019,2020 by Thomas E. Dickey + * + * All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name(s) of the above copyright + * holders shall not be used in advertising or otherwise to promote the + * sale, use or other dealings in this Software without prior written + * authorization. + */ + +#ifndef included_version_h +#define included_version_h +/* + * These definitions are used to build the string that's printed in response to + * "xterm -version", or embedded in "xterm -help". It usually indicates the + * version of X to which this version of xterm has been built. The resulting + * number in parentheses is my patch number (Thomas E. Dickey). + */ +#define XTERM_PATCH 359 +#define XTERM_DATE 2020-08-17 + +#ifndef __vendorversion__ +#define __vendorversion__ "XTerm" +#endif + +extern const char *xtermVersion(void); + +#endif /* included_version_h */ diff --git a/ports/xterm/xterm-359/version.o b/ports/xterm/xterm-359/version.o new file mode 100644 index 0000000000000000000000000000000000000000..c0073a783010c7001f527766d97186989f823a23 GIT binary patch literal 7608 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 literal 0 HcmV?d00001 diff --git a/ports/xterm/xterm-359/vms.c b/ports/xterm/xterm-359/vms.c new file mode 100644 index 0000000..e318c5c --- /dev/null +++ b/ports/xterm/xterm-359/vms.c @@ -0,0 +1,724 @@ +/* $XTermId: vms.c,v 1.14 2020/01/18 18:32:45 tom Exp $ */ + +/* vms.c + * + * This module contains the VMS version of the routine SPAWN (from the module + * MAIN.C) and the routines that do IO to the pseudo terminal. + * + * Modification History: + * Stephan Jansen 1-Mar-1990 Original version + * Hal R. Brand 5-Sep-1990 Added code to propagate DECW$DISPLAY + * Aaron Leonard 11-Sep-1990 Fix string descriptor lengths + * Stephan Jansen 2-Dec-1991 Modify to use new Pseudo terminal drivers + * (patterned after photo.c by Forrest A. Kenney) + * Patrick Mahan 7-Jan-1991 Removed reference to from VMS.C + * Forced device type to be VT102 since that is + * what we are emulating. + */ + +#include +#include + +#include +#include + +#include "xterm.h" +#include "data.h" +#include "vms.h" + +#define PTD$C_SEND_XON 0 /* Pseudo Terminal Driver event */ +#define PTD$C_SEND_BELL 1 +#define PTD$C_SEND_XOFF 2 +#define PTD$C_STOP_OUTPUT 3 +#define PTD$C_RESUME_OUTPUT 4 +#define PTD$C_CHAR_CHANGED 5 +#define PTD$C_ABORT_OUTPUT 6 +#define PTD$C_START_READ 7 +#define PTD$C_MIDDLE_READ 8 +#define PTD$C_END_READ 9 +#define PTD$C_ENABLE_READ 10 +#define PTD$C_DISABLE_READ 11 +#define PTD$C_MAX_EVENTS 12 + +#define BUFFERS 6 +#define PAGE 512 + +typedef struct tt_buffer +{ +unsigned int flink; +unsigned int blink; +short int status; +short int length; +char data[VMS_TERM_BUFFER_SIZE]; +} TT_BUF_STRUCT; + +TT_BUF_STRUCT *tt_w_buff; +struct q_head _align(QUADWORD) buffer_queue = (0,0); +struct q_head _align(QUADWORD) read_queue = (0,0); + +static char tt_name[64]; +static $DESCRIPTOR (tt_name_desc, &tt_name); + +static char ws_name[64]; +static $DESCRIPTOR (ws_name_desc, &ws_name); + +static struct tt_char { + char class; + char type; + short int page_width; + char characteristics[3]; + char length; + int extended; + } tt_mode, tt_chars, orig_tt_chars; + +struct mem_region +{ + TT_BUF_STRUCT *start; + TT_BUF_STRUCT *end; +} ret_addr; + +int read_stopped = False; +int write_stopped = False; + +int tt_width; +int tt_length; +int tt_changed; +int tt_pasting=False; /* drm */ +int tt_new_output=False; /* Cleared by flushlog(), set whenever something new + goes to the screen through tt_write */ + +int trnlnm(char *in,int id,char *out); +void spawn (void); + +static void tt_echo_ast(TT_BUF_STRUCT *buff_addr); +static void tt_read_ast(TT_BUF_STRUCT *buff_addr); + +/* +static void tt_start_read(void); +*/ +void tt_start_read(void); +int tt_read(char *buffer); +static void send_xon(void); +static void send_xoff(void); +static void send_bell(void); +static void char_change(void); +static void freeBuff (TT_BUF_STRUCT *buff_addr); +TT_BUF_STRUCT *getBuff(void); +static void CloseDown(int exit_status); +static void mbx_read_ast(void); +static void mbx_read(void); + + + +#define DESCRIPTOR(name,string) struct dsc$descriptor_s name = \ +{ strlen(string), DSC$K_DTYPE_T, DSC$K_CLASS_S, string } + +int trnlnm(char *in, int id, char *out) +{ + int status, num, len, attr = LNM$M_CASE_BLIND, foo = id; + short outlen; + struct itemlist + { + short buffer_length; + short item_code; + char *buffer_addr; + int *return_length; + } itmlst[] = + { + 4 , LNM$_INDEX , &foo, 0, + 255, LNM$_STRING , out , &outlen, + 4 , LNM$_MAX_INDEX, &num, &len, + 0 , 0 + }; + DESCRIPTOR(lognam,in); + DESCRIPTOR(tabnam,"LNM$DCL_LOGICAL"); + + status = sys$trnlnm(&attr,&tabnam,&lognam,0,itmlst); + if(status != SS$_NORMAL) return(-1); /* error status */ + out[outlen] = 0; /* terminate the output string */ + return(++num); /* return number of translations */ +} + +static int pty; +static int Xsocket; + +void spawn (void) +{ + int status; + static $DESCRIPTOR (dtime, "0 00:00:00.01"); + static int delta[2]; + register TScreen *screen = TScreenOf(term); + static struct IOSB iosb; + static unsigned int flags; + static unsigned int uic; + static char imagename[64]; + static int privs; + static $DESCRIPTOR(device, "FTA0:"); + static int type; + static int class; + static int devdepend; + static int mem_size; + int i; + + /* if pid and mbx_chan are nonzero then close them in CloseDown() */ + pid = 0; + mbx_chan = 0; + + status = SYS$EXPREG (BUFFERS, &ret_addr, 0, 0); + if(!(status & SS$_NORMAL)) lib$signal(status); + + tt_w_buff = (char *)ret_addr.end - PAGE + 1; + + /* use one buffer for writing, the reset go in the free buffer queue */ + for(i=0; i < BUFFERS-1; i++) + { + freeBuff((char *)ret_addr.start +i*PAGE); + } + + /* avoid double MapWindow requests, for wm's that care... */ + XtSetMappedWhenManaged( screen->TekEmu ? XtParent(tekWidget) : + XtParent(term), False ); + /* Realize the Tek or VT widget, depending on which mode we're in. + If VT mode, this calls VTRealize (the widget's Realize proc) */ + XtRealizeWidget (screen->TekEmu ? XtParent(tekWidget) : + XtParent(term)); + + /* get the default device characteristics of the pseudo terminal */ + + itemlist[0].buflen = 4; + itemlist[0].code = DVI$_DEVTYPE; + itemlist[0].buffer = &type; + itemlist[0].return_addr = &tt_name_desc.dsc$w_length; + + itemlist[1].buflen = 4; + itemlist[1].code = DVI$_DEVCLASS; + itemlist[1].buffer = &class; + itemlist[1].return_addr = &tt_name_desc.dsc$w_length; + + itemlist[2].buflen = 4; + itemlist[2].code = DVI$_DEVDEPEND; + itemlist[2].buffer = &devdepend; + itemlist[2].return_addr = &tt_name_desc.dsc$w_length; + + itemlist[3].buflen = 4; + itemlist[3].code = DVI$_DEVDEPEND2; + itemlist[3].buffer = &tt_chars.extended; + itemlist[3].return_addr = &tt_name_desc.dsc$w_length; + + itemlist[4].buflen = 0; + itemlist[4].code = 0; + + + status = sys$getdviw(0,0,&device,&itemlist,&iosb,0,0,0); + if(!(status & SS$_NORMAL)) lib$signal(status); + if(!(iosb.status & SS$_NORMAL)) lib$signal(iosb.status); + + tt_chars.type = DT$_VT102; /* XTerm supports VT102 mode */ + tt_chars.class = class; + tt_chars.page_width = screen->max_col+1; + tt_chars.length = screen->max_row+1; + + /* copy the default char's along with the created window size */ + + bcopy(&devdepend, &tt_chars.characteristics, 3); + + tt_chars.extended |= TT2$M_ANSICRT | TT2$M_AVO | TT2$M_DECCRT; + + + /* create the pseudo terminal with the proper char's */ + status = ptd$create(&tt_chan,0,&tt_chars,12,0,0,0,&ret_addr); + if(!(status & SS$_NORMAL)) lib$signal(status); + + + /* get the device name of the Pseudo Terminal */ + + itemlist[0].buflen = 64; + itemlist[0].code = DVI$_DEVNAM; + itemlist[0].buffer = &tt_name; + itemlist[0].return_addr = &tt_name_desc.dsc$w_length; + + /* terminate the list */ + itemlist[1].buflen = 0; + itemlist[1].code = 0; + + status = sys$getdviw(0,tt_chan,0,&itemlist,&iosb,0,0,0); + if(!(status & SS$_NORMAL)) CloseDown(status); + if(!(iosb.status & SS$_NORMAL)) CloseDown(iosb.status); + + /* + * set up AST's for XON, XOFF, BELL and characteristics change. + */ + + status = ptd$set_event_notification(tt_chan,&send_xon,0,0,PTD$C_SEND_XON); + if(!(status & SS$_NORMAL)) CloseDown(status); + + status = ptd$set_event_notification(tt_chan,&send_xoff,0,0,PTD$C_SEND_XOFF); + if(!(status & SS$_NORMAL)) CloseDown(status); + + status = ptd$set_event_notification(tt_chan,&send_bell,0,0,PTD$C_SEND_BELL); + if(!(status & SS$_NORMAL)) CloseDown(status); + + status = ptd$set_event_notification(tt_chan,&char_change,0,0,PTD$C_CHAR_CHANGED); + if(!(status & SS$_NORMAL)) CloseDown(status); + + /* create a mailbox for the detached process to detect hangup */ + + status = sys$crembx(0,&mbx_chan,ACC$K_TERMLEN,0,255,0,0); + if(!(status & SS$_NORMAL)) CloseDown(status); + + + /* + * get the device unit number for created process completion + * status to be sent to. + */ + + itemlist[0].buflen = 4; + itemlist[0].code = DVI$_UNIT; + itemlist[0].buffer = &mbxunit; + itemlist[0].return_addr = 0; + + /* terminate the list */ + itemlist[1].buflen = 0; + itemlist[1].code = 0; + + status = sys$getdviw(0,mbx_chan,0,&itemlist,&iosb,0,0,0); + if(!(status & SS$_NORMAL)) CloseDown(status); + if(!(iosb.status & SS$_NORMAL)) CloseDown(iosb.status); + + + tt_start_read(); + + /* + * find the current process's UIC so that it can be used in the + * call to sys$creprc + */ + itemlist[0].buflen = 4; + itemlist[0].code = JPI$_UIC; + itemlist[0].buffer = &uic; + itemlist[0].return_addr = 0; + + /* terminate the list */ + itemlist[1].buflen = 0; + itemlist[1].code = 0; + + status = sys$getjpiw(0,0,0,&itemlist,0,0,0); + if(!(status & SS$_NORMAL)) CloseDown(status); + + /* Complete a descriptor for the WS (DECW$DISPLAY) device */ + + trnlnm("DECW$DISPLAY",0,ws_name); + ws_name_desc.dsc$w_length = strlen(ws_name); + + /* create the process */ + /* Set sys$error to be the WS (DECW$DISPLAY) device. LOGINOUT */ + /* has special code for DECWINDOWS that will: */ + /* 1) do a DEFINE/JOB DECW$DISPLAY 'f$trnlnm(sys$error)' */ + /* 2) then redefine SYS$ERROR to match SYS$OUTPUT! */ + /* This will propagate DECW$DISPLAY to the XTERM process!!! */ + /* Thanks go to Joel M Snyder who posted this info to INFO-VAX */ + + flags = PRC$M_INTER | PRC$M_NOPASSWORD | PRC$M_DETACH; + status = sys$creprc(&pid,&image,&tt_name_desc,&tt_name_desc, + &ws_name_desc,0,0,0,4,uic,mbxunit,flags); + if(!(status & SS$_NORMAL)) CloseDown(status); + + + /* hang a read on the mailbox waiting for completion */ + mbx_read(); + + +/* set time value and schedule a periodic wakeup (every 1/100 of a second) + * this is used to prevent the controlling process from using up all the + * CPU. The controlling process will hibernate at strategic points in + * the program when it is just waiting for input. + */ + + status = sys$bintim(&dtime,&delta); + if (!(status & SS$_NORMAL)) CloseDown(status); + + status = sys$schdwk(0,0,&delta,&delta); + if (!(status & SS$_NORMAL)) CloseDown(status); + + + /* + * This is rather funky, but it saves me from having to totally + * rewrite some parts of the code (namely in_put in module CHARPROC.C) + */ + pty = 1; + screen->respond = pty; + pty_mask = 1 << pty; + Select_mask = pty_mask; + X_mask = 1 << Xsocket; + +} + + +/* + * This routine handles completion of write with echo. It takes the + * echo buffer and puts it on the read queue. It will then be processed + * by the routine tt_read. If the echo buffer is empty, it is put back + * on the free buffer queue. + */ + +static void tt_echo_ast(TT_BUF_STRUCT *buff_addr) +{ + int status; + + if (buff_addr->length != 0) + { + status = LIB$INSQTI(buff_addr, &read_queue); + if((status != SS$_NORMAL) && (status != LIB$_ONEENTQUE)) + { + CloseDown(status); + } + } + else + { + freeBuff(buff_addr); + } +} + + +/* + * This routine writes to the pseudo terminal. If there is a free + * buffer then write with an echo buffer completing asynchronously, else + * write synchronously using the buffer reserved for writing. All errors + * are fatal, except DATAOVERUN and DATALOST,these errors can be ignored. + + CAREFUL! Whatever calls this must NOT pass more than VMS_TERM_BUFFER_SIZE + bytes at a time. This definition has been moved to VMS.H + + */ + +int tt_write(const char *tt_write_buf, int size) +{ + int status; + TT_BUF_STRUCT *echoBuff; + + /* if writing stopped, return 0 until Xon */ + if(write_stopped) return (0); + + memmove(&tt_w_buff->data,tt_write_buf,size); + + echoBuff = getBuff(); + if (echoBuff != LIB$_QUEWASEMP) + { + status = PTD$WRITE (tt_chan, &tt_echo_ast, echoBuff, + &tt_w_buff->status, size, + &echoBuff->status, VMS_TERM_BUFFER_SIZE); + } + else + { + status = PTD$WRITE (tt_chan, 0, 0, &tt_w_buff->status, size, 0, 0); + } + if (status & SS$_NORMAL) + { + if ((tt_w_buff->status != SS$_NORMAL) && + (tt_w_buff->status != SS$_DATAOVERUN) && + (tt_w_buff->status != SS$_DATALOST)) + { + CloseDown(tt_w_buff->status); + } + } + else + { + CloseDown(status); + } + + return(size); +} + + +/* + * This routine is called when a read to the pseudo terminal completes. + * Put the newly read buffer onto the read queue. It will be processed + * and freed in the routine tt_read. + */ + +static void tt_read_ast(TT_BUF_STRUCT *buff_addr) +{ + int status; + + if (buff_addr->status & SS$_NORMAL) + { + status = LIB$INSQTI(buff_addr, &read_queue); + if ((status != SS$_NORMAL) && (status != LIB$_ONEENTQUE)) + { + CloseDown(status); + } + } + else + CloseDown(buff_addr->status); + + tt_start_read(); + sys$wake(0,0); + return; +} + + +/* + * If there is a free buffer on the buffer queue then Start a read from + * the pseudo terminal, otherwise set a flag, the reading will be restarted + * in the routine freeBuff when a buffer is freed. + */ + +void tt_start_read(void) +{ + int status; + static int size; + TT_BUF_STRUCT *buff_addr; + + buff_addr = getBuff(); + if (buff_addr != LIB$_QUEWASEMP) + { + if(!tt_pasting){ + status = PTD$READ (0, tt_chan, &tt_read_ast, buff_addr, + &buff_addr->status, VMS_TERM_BUFFER_SIZE); + if ((status & SS$_NORMAL) != SS$_NORMAL) + { + CloseDown(status); + } + } + } + else + { + read_stopped = True; + } + return; +} + + +/* + * Get data from the pseudo terminal. Return the data from the first item + * on the read queue, and put that buffer back onto the free buffer queue. + * Return the length or zero if the read queue is empty. + * + */ + +int tt_read(char *buffer) +{ + TT_BUF_STRUCT *read_buff; + int status; + int len; + + status = LIB$REMQHI(&read_queue, &read_buff); + if(status == LIB$_QUEWASEMP){ + return(0); + } + else if (status & SS$_NORMAL) + { + len = read_buff->length; + memmove(buffer,&read_buff->data,len); + freeBuff(read_buff); + tt_new_output=True; /* DRM something will be written */ + } + else + CloseDown(status); + + return(len); +} + + +/* + * if xon then it is safe to start writing again. + */ + +static void send_xon(void) +{ + write_stopped = False; +} + + +/* + * If Xoff then stop writing to the pseudo terminal until you get Xon. + */ +static void send_xoff(void) +{ + write_stopped = True; +} + + + +/* + * Beep the terminal to let the user know data will be lost because + * of too much data. + */ + +static void send_bell(void) +{ + Bell(term); +} + +/* + * if the pseudo terminal's characteristics change, check to see if the + * page size changed. If it did, resize the widget, otherwise, ignore + * it! This routine just gets the new term dimensions and sets a flag + * to indicate the term chars have changed. The widget gets resized in + * the routine in_put in the module CHARPROC.C. You can't resize the + * widget in this routine because this is an AST and X is not reenterent. + */ + +static void char_change(void) +{ + int status; + + /* + * Don't do anything if in Tek mode + */ + + if(!(TScreenOf(term)->TekEmu)) + { + status = sys$qiow(0,tt_chan,IO$_SENSEMODE,0,0,0,&tt_mode,8,0,0,0,0); + if(!(status & SS$_NORMAL)) CloseDown(status); + + if((TScreenOf(term)->max_row != tt_mode.length) || + (TScreenOf(term)->max_col != tt_mode.page_width)) + { + tt_length = tt_mode.length; + tt_width = tt_mode.page_width; + + tt_changed = True; + + } + } +} + + +/* + * Put a free buffer back onto the buffer queue. If reading was + * stopped for lack of free buffers, start reading again. + */ + +static void freeBuff (TT_BUF_STRUCT *buff_addr) +{ + int ast_stat; + int status; + + ast_stat = SYS$SETAST(0); + if (!read_stopped) + { + LIB$INSQHI(buff_addr, &buffer_queue); + } + else + { + status = PTD$READ (0, tt_chan, &tt_read_ast, buff_addr, + &buff_addr->status, VMS_TERM_BUFFER_SIZE); + if (status & SS$_NORMAL) + { + read_stopped = False; + } + else + { + CloseDown(status); + } + } + if (ast_stat == SS$_WASSET) ast_stat = SYS$SETAST(1); +} + + +/* + * return a free buffer from the buffer queue. + */ + +TT_BUF_STRUCT *getBuff(void) +{ + int status; + TT_BUF_STRUCT *buff_addr; + + status = LIB$REMQHI(&buffer_queue, &buff_addr); + if (status & SS$_NORMAL) + { + return(buff_addr); + } + else + { + return(status); + } +} + + +/* + * Close down and exit. Kill the detached process (if it still + * exists), deassign mailbox channell (if assigned), cancel any + * waiting IO to the pseudo terminal and delete it, exit with any + * status information. + */ + +static void CloseDown(int exit_status) +{ + int status; + + /* if process has not terminated, do so now! */ + if(pid != 0) + { + status = sys$forcex(&pid,0,0); + if(!(status & SS$_NORMAL)) lib$signal(status); + } + + /* if mbx_chan is assigned, deassign it */ + if(mbx_chan != 0) + { + sys$dassgn(mbx_chan); + } + + /* cancel pseudo terminal IO requests */ + status = ptd$cancel(tt_chan); + if(!(status & SS$_NORMAL)) lib$signal(status); + + /* delete pseudo terminal */ + status = ptd$delete(tt_chan); + if(!(status & SS$_NORMAL)) lib$signal(status); + + if(!(exit_status & SS$_NORMAL)) lib$signal(exit_status); + + exit(1); + +} + + +/* + * This routine gets called when the detached process terminates (for + * whatever reason). The mailbox buffer has final exit status. Close + * down and exit. + */ + +static void mbx_read_ast(void) +{ + int status; + + pid = 0; + + status = mbx_read_iosb.status; + if (!(status & SS$_NORMAL)) CloseDown(status); + + status = (unsigned long int) mbx_buf.acc$l_finalsts; + if (!(status & SS$_NORMAL)) CloseDown(status); + + CloseDown(1); + +} + + +/* + * This routine starts a read on the mailbox associated with the detached + * process. The AST routine gets called when the detached process terminates. + */ + +static void mbx_read(void) +{ +int status; +static int size; + + size = ACC$K_TERMLEN; + status = sys$qio(0,mbx_chan, + IO$_READVBLK, + &mbx_read_iosb, + &mbx_read_ast, + 0, + &mbx_buf, + size,0,0,0,0); + + if (!(status & SS$_NORMAL)) CloseDown(status); + + return; +} diff --git a/ports/xterm/xterm-359/vms.h b/ports/xterm/xterm-359/vms.h new file mode 100644 index 0000000..8eb2064 --- /dev/null +++ b/ports/xterm/xterm-359/vms.h @@ -0,0 +1,41 @@ +/* $XFree86: xc/programs/xterm/vms.h,v 1.1 2000/02/08 17:19:45 dawes Exp $ */ + +/* vms.h + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct IOSB +{ + short int status; + short int len; + int unused; +} mbx_read_iosb,iosb; + +#define MAXITEMLIST 5 + +short int tt_chan; /* channel to the Pseudo terminal */ +short int mbx_chan; /* channel to the mailbox */ +struct accdef mbx_buf; /* mailbox buffer */ +short int mbxunit; /* mailbox unit number */ +int pid; /* PID of created process */ +static $DESCRIPTOR (image, "SYS$SYSTEM:LOGINOUT.EXE"); + +static struct items { + short int buflen; + short int code; + int buffer; + int return_addr; +} itemlist[MAXITEMLIST]; + +int tt_write(const char *tt_write_buf,int size); diff --git a/ports/xterm/xterm-359/vttests/16colors.sh b/ports/xterm/xterm-359/vttests/16colors.sh new file mode 100755 index 0000000..7d3e246 --- /dev/null +++ b/ports/xterm/xterm-359/vttests/16colors.sh @@ -0,0 +1,119 @@ +#!/bin/sh +# $XTermId: 16colors.sh,v 1.14 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Show a simple 16-color test pattern. It is a little more confusing than +# 8colors.sh, since everything is abbreviated to fit on an 80-column line. +# The high (8-15) combinations for foreground or background are marked with +# a '+' sign. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD ""; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD ""; exit' 0 1 2 5 15 +fi + +echo "" +while true +do + for AT in 0 1 4 7 + do + case $AT in + 0) attr=" ";; + 1) attr="BO ";; + 4) attr="UN ";; + 7) attr="RV ";; + esac + for FG in 0 1 2 3 4 5 6 7 + do + case $FG in + 0) fcolor="BLK ";; + 1) fcolor="RED ";; + 2) fcolor="GRN ";; + 3) fcolor="YEL ";; + 4) fcolor="BLU ";; + 5) fcolor="MAG ";; + 6) fcolor="CYN ";; + 7) fcolor="WHT ";; + esac + for HI in 3 9 + do + if test $HI = 3 ; then + color=" $fcolor" + else + color="+$fcolor" + fi + $CMD $OPT "[0;${AT}m$attr$SUF" + $CMD $OPT "[${HI}${FG}m$color$SUF" + for BG in 1 2 3 4 5 6 7 + do + case $BG in + 0) bcolor="BLK ";; + 1) bcolor="RED ";; + 2) bcolor="GRN ";; + 3) bcolor="YEL ";; + 4) bcolor="BLU ";; + 5) bcolor="MAG ";; + 6) bcolor="CYN ";; + 7) bcolor="WHT ";; + esac + $CMD $OPT "[4${BG}m$bcolor$SUF" + $CMD $OPT "[10${BG}m+$bcolor$SUF" + done + echo "" + done + done + sleep 1 + done +done diff --git a/ports/xterm/xterm-359/vttests/256colors.pl b/ports/xterm/xterm-359/vttests/256colors.pl new file mode 100755 index 0000000..0a4977d --- /dev/null +++ b/ports/xterm/xterm-359/vttests/256colors.pl @@ -0,0 +1,52 @@ +#!/usr/bin/env perl +# $XTermId: 256colors.pl,v 1.6 2017/01/22 18:34:06 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2014,2017 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- + +use strict; +use warnings; + +# This uses 33 print-lines on an 80-column display. Printing the numbers in +# hexadecimal would make it compact enough for 24x80, but less readable. + +our ( $bg, $fg ); + +for ( $bg = 0 ; $bg < 256 ; $bg++ ) { + + # print "\x1b[9;1H\x1b[2J"; + for ( $fg = 0 ; $fg < 256 ; $fg++ ) { + print "\x1b[48;5;${bg}m\x1b[38;5;${fg}m"; + printf "%03.3d/%03.3d ", $fg, $bg; + } + print "\n"; + sleep 1; +} diff --git a/ports/xterm/xterm-359/vttests/256colors2.pl b/ports/xterm/xterm-359/vttests/256colors2.pl new file mode 100755 index 0000000..2d63277 --- /dev/null +++ b/ports/xterm/xterm-359/vttests/256colors2.pl @@ -0,0 +1,226 @@ +#!/usr/bin/env perl +# $XTermId: 256colors2.pl,v 1.25 2020/06/07 22:52:05 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2018,2020 by Thomas E. Dickey +# Copyright 2002 by Steve Wall +# Copyright 1999 by Todd Larason +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# If -s is not given, use the resources for colors 0-15 - usually more-or-less +# a reproduction of the standard ANSI colors, but possibly more pleasing +# shades. + +use strict; +use warnings; + +use Getopt::Std; +use Encode 'encode_utf8'; + +our ( $opt_8, $opt_c, $opt_C, $opt_d, $opt_h, $opt_q, $opt_r, $opt_s, $opt_u ); + +$Getopt::Std::STANDARD_HELP_VERSION = 1; +&getopts('8cCdhqrsu') || die("Usage: $0 [options]"); +die( + "Usage: $0 [options]\n +Options: + -8 use 8-bit controls + -c use colons for separating parameter values in SGR 38/48 + -C like -c, but allow semicolon plus colon + -d use rgb values rather than palette index + -h display this message + -q quieter output by merging all palette initialization + -r display the reverse of the usual palette + -s modify system colors, i.e., 0..15 + -u use UTF-8 when emitting 8-bit controls +" +) if ($opt_h); + +our $cube = 6; +our (@steps); +our ( $red, $green, $blue ); +our ( $gray, $level, $color ); +our ( $csi, $osc, $sep, $sep2, $st ); + +our @rgb; + +sub map_cube($) { + my $value = $_[0]; + $value = ( 5 - $value ) if defined($opt_r); + return $value; +} + +sub map_gray($) { + my $value = $_[0]; + $value = ( 23 - $value ) if defined($opt_r); + return $value; +} + +sub define_color($$$$) { + my $index = $_[0]; + my $r = $_[1]; + my $g = $_[2]; + my $b = $_[3]; + + printf( "%s4", $osc ) unless ($opt_q); + printf( ";%d;rgb:%2.2x/%2.2x/%2.2x", $index, $r, $g, $b ); + printf( "%s", $st ) unless ($opt_q); + + $rgb[$index] = sprintf "%d%s%d%s%d", $r, $sep, $g, $sep, $b; +} + +sub select_color($) { + my $index = $_[0]; + if ( $opt_d and defined( $rgb[$index] ) ) { + printf "%s48%s2%s%sm ", $csi, $sep, $sep2, $rgb[$index]; + } + else { + printf "%s48%s5%s%sm ", $csi, $sep, $sep2, $index; + } +} + +sub system_color($$$$) { + my $color = shift; + my $red = shift; + my $green = shift; + my $blue = shift; + &define_color( 15 - $color, $red, $green, $blue ) if ($opt_r); + &define_color( $color, $red, $green, $blue ) unless ($opt_r); +} + +if ($opt_8) { + $csi = "\x9b"; + $osc = "\x9d"; + $st = "\x9c"; +} +else { + $csi = "\x1b["; + $osc = "\x1b]"; + $st = "\x1b\\"; +} + +if ($opt_c) { + $sep = ":"; +} +else { + $sep = ";"; +} +$sep2 = $sep; + +if ($opt_C) { + $sep = ";"; + $sep2 = ":"; +} + +if ( $opt_8 and $opt_u ) { + my $lc_ctype = `locale 2>/dev/null | fgrep LC_CTYPE | sed -e 's/^.*=//'`; + if ( $lc_ctype =~ /utf.?8/i ) { + binmode( STDOUT, ":utf8" ); + } +} + +printf( "%s4", $osc ) if ($opt_q); + +if ($opt_s) { + &system_color( 0, 0, 0, 0 ); + &system_color( 1, 205, 0, 0 ); + &system_color( 2, 0, 205, 0 ); + &system_color( 3, 205, 205, 0 ); + &system_color( 4, 0, 0, 238 ); + &system_color( 5, 205, 0, 205 ); + &system_color( 6, 0, 205, 205 ); + &system_color( 7, 229, 229, 229 ); + &system_color( 8, 127, 127, 127 ); + &system_color( 9, 255, 0, 0 ); + &system_color( 10, 0, 255, 0 ); + &system_color( 11, 255, 255, 0 ); + &system_color( 12, 92, 92, 255 ); + &system_color( 13, 255, 0, 255 ); + &system_color( 14, 0, 255, 255 ); + &system_color( 15, 255, 255, 255 ); +} + +# colors 16-231 are a 6x6x6 color cube +@steps = ( 0, 95, 135, 175, 215, 255 ); +for ( $red = 0 ; $red < $cube ; $red++ ) { + for ( $green = 0 ; $green < $cube ; $green++ ) { + for ( $blue = 0 ; $blue < $cube ; $blue++ ) { + &define_color( + 16 + ( map_cube($red) * $cube * $cube ) + + ( map_cube($green) * $cube ) + + map_cube($blue), + int( $steps[$red] ), + int( $steps[$green] ), + int( $steps[$blue] ) + ); + } + } +} + +# colors 232-255 are a grayscale ramp, intentionally leaving out +# black and white +for ( $gray = 0 ; $gray < 24 ; $gray++ ) { + $level = ( map_gray($gray) * 10 ) + 8; + &define_color( 232 + $gray, $level, $level, $level ); +} +printf( "%s", $st ) if ($opt_q); + +# display the colors + +# first the system ones: +print "System colors:\n"; +for ( $color = 0 ; $color < 8 ; $color++ ) { + &select_color($color); +} +printf "%s0m\n", $csi; +for ( $color = 8 ; $color < 16 ; $color++ ) { + &select_color($color); +} +printf "%s0m\n\n", $csi; + +# now the color cube +print "Color cube, ${cube}x${cube}x${cube}:\n"; +for ( $green = 0 ; $green < $cube ; $green++ ) { + for ( $red = 0 ; $red < $cube ; $red++ ) { + for ( $blue = 0 ; $blue < $cube ; $blue++ ) { + $color = 16 + ( $red * $cube * $cube ) + ( $green * $cube ) + $blue; + &select_color($color); + } + printf "%s0m ", $csi; + } + print "\n"; +} + +# now the grayscale ramp +print "Grayscale ramp:\n"; +for ( $color = 232 ; $color < 256 ; $color++ ) { + &select_color($color); +} +printf "%s0m\n", $csi; diff --git a/ports/xterm/xterm-359/vttests/88colors.pl b/ports/xterm/xterm-359/vttests/88colors.pl new file mode 100755 index 0000000..9c5c3e2 --- /dev/null +++ b/ports/xterm/xterm-359/vttests/88colors.pl @@ -0,0 +1,49 @@ +#!/usr/bin/env perl +# $XTermId: 88colors.pl,v 1.5 2017/01/22 18:34:06 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2014,2017 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Made from 256colors.pl + +use strict; +use warnings; + +our ( $bg, $fg ); + +for ( $bg = 0 ; $bg < 88 ; $bg++ ) { + print "\x1b[9;1H\x1b[48;5;${bg}m\x1b[2J"; + for ( $fg = 0 ; $fg < 88 ; $fg++ ) { + print "\x1b[38;5;${fg}m"; + printf "%03.3d/%03.3d ", $fg, $bg; + } + sleep 1; + print "\n"; +} diff --git a/ports/xterm/xterm-359/vttests/88colors2.pl b/ports/xterm/xterm-359/vttests/88colors2.pl new file mode 100755 index 0000000..b0ca162 --- /dev/null +++ b/ports/xterm/xterm-359/vttests/88colors2.pl @@ -0,0 +1,228 @@ +#!/usr/bin/env perl +# $XTermId: 88colors2.pl,v 1.19 2020/06/07 22:48:11 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2018,2020 by Thomas E. Dickey +# Copyright 1999 by Steve Wall +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Adapted from 256colors2.pl + +# If -s is not given, use the resources for colors 0-15 - usually more-or-less +# a reproduction of the standard ANSI colors, but possibly more pleasing +# shades. + +use strict; +use warnings; + +use Getopt::Std; +use Encode 'encode_utf8'; + +our ( $opt_8, $opt_c, $opt_C, $opt_d, $opt_h, $opt_q, $opt_r, $opt_s, $opt_u ); + +$Getopt::Std::STANDARD_HELP_VERSION = 1; +&getopts('8cCdhqrsu') || die("Usage: $0 [options]"); +die( + "Usage: $0 [options]\n +Options: + -8 use 8-bit controls + -c use colons for separating parameter values in SGR 38/48 + -C like -c, but allow semicolon plus colon + -d use rgb values rather than palette index + -h display this message + -q quieter output by merging all palette initialization + -r display the reverse of the usual palette + -s modify system colors, i.e., 0..15 + -u use UTF-8 when emitting 8-bit controls +" +) if ($opt_h); + +our $cube = 4; +our (@steps); +our ( $red, $green, $blue ); +our ( $gray, $level, $color ); +our ( $csi, $osc, $sep, $sep2, $st ); + +our @rgb; + +sub map_cube($) { + my $value = $_[0]; + $value = ( 3 - $value ) if defined($opt_r); + return $value; +} + +sub map_gray($) { + my $value = $_[0]; + $value = ( 7 - $value ) if defined($opt_r); + return $value; +} + +sub define_color($$$$) { + my $index = $_[0]; + my $r = $_[1]; + my $g = $_[2]; + my $b = $_[3]; + + printf( "%s4", $osc ) unless ($opt_q); + printf( ";%d;rgb:%2.2x/%2.2x/%2.2x", $index, $r, $g, $b ); + printf( "%s", $st ) unless ($opt_q); + + $rgb[$index] = sprintf "%d%s%d%s%d", $r, $sep, $g, $sep, $b; +} + +sub select_color($) { + my $index = $_[0]; + if ( $opt_d and defined( $rgb[$index] ) ) { + printf "%s48%s2%s%sm ", $csi, $sep, $sep2, $rgb[$index]; + } + else { + printf "%s48%s5%s%sm ", $csi, $sep, $sep2, $index; + } +} + +sub system_color($$$$) { + my $color = shift; + my $red = shift; + my $green = shift; + my $blue = shift; + &define_color( 15 - $color, $red, $green, $blue ) if ($opt_r); + &define_color( $color, $red, $green, $blue ) unless ($opt_r); +} + +if ($opt_8) { + $csi = "\x9b"; + $osc = "\x9d"; + $st = "\x9c"; +} +else { + $csi = "\x1b["; + $osc = "\x1b]"; + $st = "\x1b\\"; +} + +if ($opt_c) { + $sep = ":"; +} +else { + $sep = ";"; +} +$sep2 = $sep; + +if ($opt_C) { + $sep = ";"; + $sep2 = ":"; +} + +if ( $opt_8 and $opt_u ) { + my $lc_ctype = `locale 2>/dev/null | fgrep LC_CTYPE | sed -e 's/^.*=//'`; + if ( $lc_ctype =~ /utf.?8/i ) { + binmode( STDOUT, ":utf8" ); + } +} + +printf( "%s4", $osc ) if ($opt_q); + +if ($opt_s) { + &system_color( 0, 0, 0, 0 ); + &system_color( 1, 205, 0, 0 ); + &system_color( 2, 0, 205, 0 ); + &system_color( 3, 205, 205, 0 ); + &system_color( 4, 0, 0, 238 ); + &system_color( 5, 205, 0, 205 ); + &system_color( 6, 0, 205, 205 ); + &system_color( 7, 229, 229, 229 ); + &system_color( 8, 127, 127, 127 ); + &system_color( 9, 255, 0, 0 ); + &system_color( 10, 0, 255, 0 ); + &system_color( 11, 255, 255, 0 ); + &system_color( 12, 92, 92, 255 ); + &system_color( 13, 255, 0, 255 ); + &system_color( 14, 0, 255, 255 ); + &system_color( 15, 255, 255, 255 ); +} + +# colors 16-79 are a 4x4x4 color cube +@steps = ( 0, 139, 205, 255 ); +for ( $red = 0 ; $red < $cube ; $red++ ) { + for ( $green = 0 ; $green < $cube ; $green++ ) { + for ( $blue = 0 ; $blue < $cube ; $blue++ ) { + &define_color( + 16 + ( map_cube($red) * $cube * $cube ) + + ( map_cube($green) * $cube ) + + map_cube($blue), + int( $steps[$red] ), + int( $steps[$green] ), + int( $steps[$blue] ) + ); + } + } +} + +# colors 80-87 are a grayscale ramp, intentionally leaving out +# black and white +for ( $gray = 0 ; $gray < 8 ; $gray++ ) { + $level = ( map_gray($gray) * 23.18181818 ) + 46.36363636; + if ( $gray > 0 ) { $level += 23.18181818; } + &define_color( 80 + $gray, int($level), int($level), int($level) ); +} +printf( "%s", $st ) if ($opt_q); + +# display the colors + +# first the system ones: +print "System colors:\n"; +for ( $color = 0 ; $color < 8 ; $color++ ) { + &select_color($color); +} +printf "%s0m\n", $csi; +for ( $color = 8 ; $color < 16 ; $color++ ) { + &select_color($color); +} +printf "%s0m\n\n", $csi; + +# now the color cube +print "Color cube, ${cube}x${cube}x${cube}:\n"; +for ( $green = 0 ; $green < $cube ; $green++ ) { + for ( $red = 0 ; $red < $cube ; $red++ ) { + for ( $blue = 0 ; $blue < $cube ; $blue++ ) { + $color = 16 + ( $red * $cube * $cube ) + ( $green * $cube ) + $blue; + &select_color($color); + } + printf "%s0m ", $csi; + } + print "\n"; +} + +# now the grayscale ramp +print "Grayscale ramp:\n"; +for ( $color = 80 ; $color < 88 ; $color++ ) { + &select_color($color); +} +printf "%s0m\n", $csi; diff --git a/ports/xterm/xterm-359/vttests/8colors.sh b/ports/xterm/xterm-359/vttests/8colors.sh new file mode 100755 index 0000000..0bb53c0 --- /dev/null +++ b/ports/xterm/xterm-359/vttests/8colors.sh @@ -0,0 +1,107 @@ +#!/bin/sh +# $XTermId: 8colors.sh,v 1.14 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Show a simple 8-color test pattern + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT ""; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT ""; exit' 0 1 2 5 15 +fi + +echo "" +while true +do + for AT in 0 1 4 7 + do + case $AT in + 0) attr="normal ";; + 1) attr="bold ";; + 4) attr="under ";; + 7) attr="reverse ";; + esac + for FG in 0 1 2 3 4 5 6 7 + do + case $FG in + 0) fcolor="black ";; + 1) fcolor="red ";; + 2) fcolor="green ";; + 3) fcolor="yellow ";; + 4) fcolor="blue ";; + 5) fcolor="magenta ";; + 6) fcolor="cyan ";; + 7) fcolor="white ";; + esac + $CMD $OPT "[0;${AT}m$attr" + $CMD $OPT "[3${FG}m$fcolor" + for BG in 1 2 3 4 5 6 7 + do + case $BG in + 0) bcolor="black ";; + 1) bcolor="red ";; + 2) bcolor="green ";; + 3) bcolor="yellow ";; + 4) bcolor="blue ";; + 5) bcolor="magenta ";; + 6) bcolor="cyan ";; + 7) bcolor="white ";; + esac + $CMD $OPT "[4${BG}m$bcolor" + done + echo "" + done + sleep 1 + done +done diff --git a/ports/xterm/xterm-359/vttests/acolors.sh b/ports/xterm/xterm-359/vttests/acolors.sh new file mode 100755 index 0000000..ff3900c --- /dev/null +++ b/ports/xterm/xterm-359/vttests/acolors.sh @@ -0,0 +1,93 @@ +#!/bin/sh +# $XTermId: acolors.sh,v 1.7 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2002-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Demonstrate the use of the control sequence for changing ANSI colors. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +LIST="00 30 80 d0 ff" + +exec /dev/tty +read original +stty $old +original=${original}${SUF} + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 +fi + +$CMD "${ESC}[0;1;34mThis message is BLUE" +$CMD "${ESC}[0;1;31mThis message is RED ${ESC}[0;31m(sometimes)" +$CMD "${ESC}[0;1;32mThis message is GREEN${ESC}[0m" +while true +do + for R in $LIST + do + for G in $LIST + do + for B in $LIST + do + # color "9" is bold-red + test $R != 00 && test $G = 00 && test $B = 00 && $CMD $OPT "" >/dev/tty + $CMD $OPT "${ESC}]4;9;rgb:$R/$G/$B${SUF}" >/dev/tty + sleep 1 + done + done + done +done diff --git a/ports/xterm/xterm-359/vttests/closest-rgb.pl b/ports/xterm/xterm-359/vttests/closest-rgb.pl new file mode 100755 index 0000000..21e177d --- /dev/null +++ b/ports/xterm/xterm-359/vttests/closest-rgb.pl @@ -0,0 +1,237 @@ +#!/usr/bin/env perl +# $XTermId: closest-rgb.pl,v 1.11 2018/08/10 18:02:55 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2017,2018 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# For a given RGB value, show its distance from xterm's 88/256-color +# models or alternatively against rgb.txt + +use strict; +use warnings; +use diagnostics; + +use Getopt::Std; + +our $namedRGB = "/etc/X11/rgb.txt"; +our @namedRGB; +our @xtermRGB; + +our ( $opt_f, $opt_i, $opt_n ); + +sub main::HELP_MESSAGE() { + printf STDERR <; + close $fp; + my @result; + my $o = 0; + for my $i ( 0 .. $#data ) { + next if ( $data[$i] =~ /^\s*[[:punct:]]/ ); + + $result[ $o++ ] = &lookup( $data[$i] ); + } + return @result; +} + +sub distance($$) { + my %a = %{ $_[0] }; + my %b = %{ $_[1] }; + my $R = $a{R} - $b{R}; + my $G = $a{G} - $b{G}; + my $B = $a{B} - $b{B}; + my $result = sqrt( $R * $R + $G * $G + $B * $B ); +} + +sub show_distances($$) { + my @ref = @{ $_[0] }; + my @cmp = @{ $_[1] }; + for my $c ( 0 .. $#cmp ) { + my %cmp = %{ $cmp[$c] }; + my $best = -1; + my %best; + for my $r ( 0 .. $#ref ) { + my %ref = %{ $ref[$r] }; + my $test = &distance( \%ref, \%cmp ); + if ( $best < 0 ) { + $best = $test; + %best = %ref; + } + elsif ( $best > $test ) { + $best = $test; + %best = %ref; + } + } + printf "%3d %-25s %5.1f %s\n", $c, $cmp{NAME}, $best, $best{NAME}; + } +} + +@namedRGB = &load_namedRGB($opt_f); +printf "%d names from $opt_f\n", $#namedRGB + 1; + +if ( $opt_n <= 16 ) { + @xtermRGB = &xterm16; +} +elsif ( $opt_n <= 88 ) { + @xtermRGB = &xterm88; +} +else { + @xtermRGB = &xterm256; +} +printf "%d names from xterm palette\n", $#xtermRGB + 1; + +&show_distances( \@xtermRGB, \@namedRGB ) if ($opt_i); +&show_distances( \@namedRGB, \@xtermRGB ) unless ($opt_i); + +1; diff --git a/ports/xterm/xterm-359/vttests/doublechars.sh b/ports/xterm/xterm-359/vttests/doublechars.sh new file mode 100755 index 0000000..249da16 --- /dev/null +++ b/ports/xterm/xterm-359/vttests/doublechars.sh @@ -0,0 +1,116 @@ +#!/bin/sh +# $XTermId: doublechars.sh,v 1.17 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Illustrate the use of double-size characters by drawing successive lines in +# the commonly used video attributes. +# +# Use the -w option to force the output to wrap. It will look ugly, because +# the double-high lines will be split. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +SAVE=yes +WRAP=no +if test $# != 0 ; then + while test $# != 0 + do + case $1 in + -n) SAVE=no ;; + -w) WRAP=yes ;; + esac + shift + done +fi + +if test $SAVE = yes ; then + exec /dev/tty + IFS=';' read junk high wide + + stty $old + + wide=`echo $wide|sed -e 's/t.*//'` + original=${ESC}[8\;${high}\;${wide}t${SUF} + + if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null + then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM + else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 + fi + +fi + +if test $WRAP = yes ; then + # turn on wrapping and force the screen to 80 columns + $CMD $OPT "${ESC}[?7h" >/dev/tty + $CMD $OPT "${ESC}[?40l" >/dev/tty +else + # force the screen to 132 columns + $CMD $OPT "${ESC}[?40h" >/dev/tty + $CMD $OPT "${ESC}[?3h" >/dev/tty +fi + +for SGR in 0 1 4 5 7 +do + $CMD $OPT "${ESC}[0;${SGR}m" >/dev/tty + for DBL in 5 3 4 6 5 + do + $CMD $OPT "${ESC}#${DBL}" >/dev/tty + echo "The quick brown fox jumps over the lazy dog" >/dev/tty + done + echo +done +$CMD $OPT "${ESC}[0m" >/dev/tty diff --git a/ports/xterm/xterm-359/vttests/dynamic.pl b/ports/xterm/xterm-359/vttests/dynamic.pl new file mode 100755 index 0000000..7353b0e --- /dev/null +++ b/ports/xterm/xterm-359/vttests/dynamic.pl @@ -0,0 +1,136 @@ +#!/usr/bin/env perl +# $XTermId: dynamic.pl,v 1.5 2018/08/10 15:01:35 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2011-2017,2018 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Test the dynamic-color query option of xterm. +# The programs xtermcontrol and xtermset provide more options. + +use strict; +use warnings; + +use Getopt::Std; +use IO::Handle; + +our @color_names = ( + "VT100 text foreground", + "VT100 text background", + "text cursor", + "mouse foreground", + "mouse background", + "Tektronix foreground", + "Tektronix background", + "highlight background", + "Tektronix cursor", + "highlight foreground" +); + +our ( $opt_c, $opt_r ); + +$Getopt::Std::STANDARD_HELP_VERSION = 1; +&getopts('c:r') || die( + "Usage: $0 [options]\n +Options:\n + -c XXX set cursor-color + -r reset colors +" +); + +sub no_reply($) { + open TTY, "+; + close TTY; + system "stty $old"; + if ( defined $reply ) { + die("^C received\n") if ( "$reply" eq "\003" ); + } + return $reply; +} + +sub query_color($) { + my $code = $_[0]; + my $param1 = $code + 10; + my $reply; + + $reply = get_reply("\x1b]$param1;?\007"); + + return unless defined $reply; + if ( $reply =~ /\x1b]$param1;.*\007/ ) { + my $value = $reply; + + $value =~ s/^\x1b]$param1;//; + $value =~ s/\007//; + + printf "%24s = %s\n", $color_names[$code], $value; + } +} + +sub query_colors() { + my $n; + + for ( $n = 0 ; $n <= 9 ; ++$n ) { + &query_color($n); + } +} + +sub reset_colors() { + my $n; + + for ( $n = 0 ; $n <= 9 ; ++$n ) { + my $code = 110 + $n; + &no_reply("\x1b]$code\007"); + } +} + +if ( defined($opt_c) ) { + &no_reply("\x1b]12;$opt_c\007"); +} +if ( defined($opt_r) ) { + &reset_colors(); +} + +&query_colors(); diff --git a/ports/xterm/xterm-359/vttests/dynamic.sh b/ports/xterm/xterm-359/vttests/dynamic.sh new file mode 100755 index 0000000..7f561c9 --- /dev/null +++ b/ports/xterm/xterm-359/vttests/dynamic.sh @@ -0,0 +1,89 @@ +#!/bin/sh +# $XTermId: dynamic.sh,v 1.17 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Demonstrate the use of dynamic colors by setting the background successively +# to different values. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +LIST="00 30 80 d0 ff" + +exec /dev/tty +read original +stty $old +original=${original}${SUF} + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 +fi + +while true +do + for R in $LIST + do + for G in $LIST + do + for B in $LIST + do + $CMD $OPT "${ESC}]11;rgb:$R/$G/$B${SUF}" >/dev/tty + sleep 1 + done + done + done +done diff --git a/ports/xterm/xterm-359/vttests/dynamic2.sh b/ports/xterm/xterm-359/vttests/dynamic2.sh new file mode 100755 index 0000000..36748a6 --- /dev/null +++ b/ports/xterm/xterm-359/vttests/dynamic2.sh @@ -0,0 +1,114 @@ +#!/bin/sh +# $XTermId: dynamic2.sh,v 1.3 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2006,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Demonstrate the use of dynamic colors by setting each dynamic color +# successively to different values. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +LIST="00 30 80 d0 ff" +FULL="10 11 12 13 14 15 16 17 18" + +echo "reading current color settings" + +exec /dev/tty + read reply + eval original$N='${reply}${SUF}' + original=${original}${reply}${SUF} +done +stty $old + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 +fi + +while true +do + for N in $FULL + do + case $N in + 10) echo "coloring text foreground";; + 11) echo "coloring text background";; + 12) echo "coloring text cursor";; + 13) echo "coloring mouse foreground";; + 14) echo "coloring mouse background";; + 15) echo "coloring tektronix foreground";; + 16) echo "coloring tektronix background";; + 17) echo "coloring highlight background";; + 18) echo "coloring tektronix cursor";; + esac + for R in $LIST + do + for G in $LIST + do + for B in $LIST + do + $CMD $OPT "${ESC}]$N;rgb:$R/$G/$B${SUF}" >/dev/tty + sleep 1 + done + done + done + eval 'restore=$'original$N + $CMD $OPT "$restore" >/dev/tty + sleep 1 + done +done diff --git a/ports/xterm/xterm-359/vttests/fonts.sh b/ports/xterm/xterm-359/vttests/fonts.sh new file mode 100755 index 0000000..05a95c2 --- /dev/null +++ b/ports/xterm/xterm-359/vttests/fonts.sh @@ -0,0 +1,87 @@ +#!/bin/sh +# $XTermId: fonts.sh,v 1.12 2015/08/10 20:43:05 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2011,2015 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Demonstrate control sequence which sets relative fonts. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +exec /dev/tty +read original + +stty $old +original="${original}${SUF}" + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 +fi + +F=1 +D=1 +T=6 +while true +do + $CMD $OPT "${ESC}]50;#$F${SUF}" >/dev/tty + #sleep 1 + if test .$D = .1 ; then + test $F = $T && D=-1 + else + test $F = 1 && D=1 + fi + F=`expr $F + $D` +done diff --git a/ports/xterm/xterm-359/vttests/modify-keys.pl b/ports/xterm/xterm-359/vttests/modify-keys.pl new file mode 100755 index 0000000..44384a2 --- /dev/null +++ b/ports/xterm/xterm-359/vttests/modify-keys.pl @@ -0,0 +1,1531 @@ +#!/usr/bin/env perl +# $XTermId: modify-keys.pl,v 1.90 2020/01/18 18:38:44 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2019,2020 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Print a table to illustrate the modifyOtherKeys resource choices. +# +# Some of the key combinations are unavailable unless certain translations +# resource settings are suppressed. This command helped to verify those: +# xterm -xrm '*omitTranslation:fullscreen,scroll-lock,shift-fonts' +# +# Additionally, a test-script was written to exercise xterm when the +# "Allow SendEvents" feature is enabled, in combination with keys sent by +# commands like this: +# xdotool key --window XXX shift 2>/dev/null +# +# A curses application running in the target xterm showed the received data +# in the terminfo-style format used in this script. + +# TODO factor in the backspace/delete meta/alt/escape resource-settings +# TODO show keycodes via "xmodmap -pk" as alternative to xkbcomp +# TODO show different sort-order (code, sym, xkb) +# TODO use U+xxxx codepoints in keysymdef.h for rendering plain text +# TODO optionally show 2**N, e.g., 4 (shift+control), 8 (shift+alt+control) or 16 (+meta) modifiers +# TODO optionally show -c (cursor) -e (edit) -f (function-keys) with modifiers + +use strict; +use warnings; + +use Getopt::Std; + +$| = 1; + +our ( $opt_d, $opt_h, $opt_k, $opt_K, $opt_l, $opt_m, $opt_o, $opt_u, $opt_v ); + +our $REPORT; +our @headers; +our @nolinks = (); +our ( $xkb_layout, $xkb_model ); +our $keyfile = "/usr/include/X11/keysymdef.h"; + +our @keyNames; # xkb's notion of key-names (undocumented) +our %keySyms; # all keysyms, hashed by name +our %keyCodes; # all keysyms, hashed by keycode +our %uniCodes; # keysym Unicode values, hashed by keycode +our %uniNames; # keysym Unicode descriptions, hashed by keycode +our @keyTypes; # XkbKeyTypeRec +our @symCache; # keysyms defined in keysymdef.h which might be used +our @symMap; # index into symCache from keyNames +our %keysUsed; # report derived from @symMap, etc. +our %linkUsed; # check for uniqueness of html anchor-names + +our $MAXMODS = 8; # maximum for modifier-param +our %Shifted; # map keycode to shifted-keycode seen by xterm + +# imitate /usr/include/X11/X.h +our $ShiftMask = 1; +our $LockMask = 2; +our $ControlMask = 4; +our $AltMask = 8; # assume mod1=alt +our $MetaMask = 16; # assume mod2=meta + +our %editKeys = qw( + XK_Delete 1 + XK_Prior 1 + XK_Next 1 + XK_Insert 1 + XK_Find 1 + XK_Select 1 + XK_KP_Delete 1 + XK_KP_Insert 1 + XK_ISO_Left_Tab 1 +); + +sub failed($) { + printf STDERR "%s\n", $_[0]; + exit 1; +} + +# prefer hex with 4 digit for hash keys +sub toCode($) { + my $value = shift; + $value = sprintf( "0x%04x", $value ) if ( $value =~ /^\d+$/ ); + return $value; +} + +sub codeOf($) { + my $value = shift; + my $result = 0; + &failed("missing keysym") unless ( defined $value ); + if ( $value =~ /^\d+$/ ) { + $result = $value; + } + elsif ( $value =~ /^0x[[:xdigit:]]+$/i ) { + $result = hex $value; + } + elsif ( $value =~ /^XK_/ ) { + $result = hex $keySyms{$value}; + } + else { + &failed("not a keysym: $value"); + } + return $result; +} + +# macros from + +sub IsKeypadKey($) { + my $code = &codeOf( $_[0] ); + my $result = ( ( $code >= &codeOf("XK_KP_Space") ) + and ( $code <= &codeOf("XK_KP_Equal") ) ) ? 1 : 0; + return $result; +} + +sub IsPrivateKeypadKey($) { + my $code = &codeOf( $_[0] ); + my $result = + ( ( $code >= 0x11000000 ) and ( $code <= 0x1100FFFF ) ) ? 1 : 0; + return $result; +} + +sub IsCursorKey($) { + my $code = &codeOf( $_[0] ); + my $result = + ( ( $code >= &codeOf("XK_Home") ) and ( $code < &codeOf("XK_Select") ) ) + ? 1 + : 0; + return $result; +} + +sub IsPFKey($) { + my $code = &codeOf( $_[0] ); + my $result = + ( ( $code >= &codeOf("XK_KP_F1") ) and ( $code <= &codeOf("XK_KP_F4") ) ) + ? 1 + : 0; + return $result; +} + +sub IsFunctionKey($) { + my $code = &codeOf( $_[0] ); + my $result = + ( ( $code >= &codeOf("XK_F1") ) and ( $code <= &codeOf("XK_F35") ) ) + ? 1 + : 0; + return $result; +} + +sub IsMiscFunctionKey($) { + my $code = &codeOf( $_[0] ); + my $result = + ( ( $code >= &codeOf("XK_Select") ) and ( $code <= &codeOf("XK_Break") ) ) + ? 1 + : 0; + return $result; +} + +sub IsModifierKey($) { + my $code = &codeOf( $_[0] ); + my $result = ( + ( + ( $code >= &codeOf("XK_Shift_L") ) + and ( $code <= &codeOf("XK_Hyper_R") ) + ) + or ( ( $code >= &codeOf("XK_ISO_Lock") ) + and ( $code <= &codeOf("XK_ISO_Level5_Lock") ) ) + or ( $code == &codeOf("XK_Mode_switch") ) + or ( $code == &codeOf("XK_Num_Lock") ) + ) ? 1 : 0; + return $result; +} + +# debugging/reporting + +# Xutil.h's macros do not cover the whole range of special keys, which are not +# actually printable. +sub IsSpecialKey($) { + my $code = &codeOf( $_[0] ); + my $result = + ( ( $code >= 0xff00 ) and ( $code <= 0xffff ) ) + ? 1 + : 0; + return $result; +} + +sub VisibleChar($) { + my $ch = shift; + my $ord = ord $ch; + my $result = $ch; + if ( $ord < 32 ) { + if ( $ord == 8 ) { + $result = '\b'; + } + elsif ( $ord == 9 ) { + $result = '\t'; + } + elsif ( $ord == 10 ) { + $result = '\n'; + } + elsif ( $ord == 12 ) { + $result = '\f'; + } + elsif ( $ord == 13 ) { + $result = '\r'; + } + elsif ( $ord == 27 ) { + $result = '\E'; + } + else { + $result = sprintf( "^%c", $ord + 64 ); + } + } + elsif ( $ord == 32 ) { + $result = '\s'; + } + elsif ( $ord == 94 ) { + $result = '\^'; + } + elsif ( $ord == 92 ) { + $result = '\\\\'; + } + elsif ( $ord == 127 ) { + $result = '^?'; + } + return $result; +} + +sub IsShift($$) { + my $code = shift; + my $state = shift; # 0/1=normal, 2=shift + my $result = 0; + if ( ( ( $state - 1 ) & 1 ) != 0 ) { + if ( $Shifted{$code} ) { + return 1 if ( $Shifted{$code} ne $code ); + } + } + return 0; +} + +sub TypeOf($) { + my $code = &toCode( $_[0] ); + my $result = "other"; + $result = "special" if ( &IsSpecialKey($code) ); + $result = "keypad" if ( &IsKeypadKey($code) ); + $result = "*keypad" if ( &IsPrivateKeypadKey($code) ); + $result = "cursor" if ( &IsCursorKey($code) ); + $result = "pf-key" if ( &IsPFKey($code) ); + $result = "func-key" if ( &IsFunctionKey($code) ); + $result = "misc-key" if ( &IsMiscFunctionKey($code) ); + $result = "edit-key" if ( &IsEditFunctionKey($code) ); + $result = "modifier" if ( &IsModifierKey($code) ); + return $result; +} + +sub KeyToS($$) { + my $code = &codeOf( $_[0] ); + my $state = $_[1]; + my $result = ""; + + $code = &codeOf( $Shifted{ $_[0] } ) if ( &IsShift( $_[0], $state ) ); + my $type = &TypeOf( &toCode($code) ); + + if ( $type ne "other" ) { + $result = ( $type eq "special" ) ? "-ignore-" : "?"; + } + elsif ($opt_u) { + $result = sprintf( "\\E[%d;%du", $code, $state ); + } + else { + $result = sprintf( "\\E[27;%d;%d~", $state, $code ); + } + return $result; +} + +sub ParamToQ($) { + my $param = shift; + my $result = shift; + $param--; + $result .= ( $param & 1 ) ? 's' : '-'; + $result .= ( $param & 2 ) ? 'a' : '-'; + $result .= ( $param & 4 ) ? 'c' : '-'; + $result .= ( $param & 8 ) ? 'm' : '-'; + return $result; +} + +sub ParamToS($) { + my $param = shift; + my $result = ""; + if ( $param-- > 1 ) { + $result .= "+Shift" if ( $param & 1 ); + $result .= "+Alt" if ( $param & 2 ); + $result .= "+Ctrl" if ( $param & 4 ); + $result .= "+Meta" if ( $param & 8 ); + $result =~ s/^\+//; + } + return $result; +} + +sub StateToS($) { + my $state = shift; + my $result = ""; + $result .= "+Shift" if ( $state & $ShiftMask ); + $result .= "+Lock" if ( $state & $LockMask ); + $result .= "+Ctrl" if ( $state & $ControlMask ); + $result .= "+Alt" if ( $state & $AltMask ); + $result .= "+Meta" if ( $state & $MetaMask ); + $result =~ s/^\+//; + return $result; +} + +# macros/functions in xterm's input.c + +sub Masked($$) { + my $value = shift; + my $mask = shift; + my $result = ( ($value) & ( ~($mask) ) ); + return $result; +} + +sub IsPredefinedKey($) { + my $code = &codeOf( $_[0] ); + my $result = 0; + if ( $keySyms{"XK_ISO_Lock"} ) { + $result = + ( $code >= &codeOf("XK_ISO_Lock") and $code <= &codeOf("XK_Delete") ) + ? 1 + : 0; + } + else { + $result = + ( $code >= &codeOf("XK_BackSpace") and $code <= &codeOf("XK_Delete") ) + ? 1 + : 0; + } + return $result; +} + +sub IsTabKey($) { + my $code = &codeOf( $_[0] ); + my $result = 0; + if ( $keySyms{"XK_ISO_Left_Tab"} ) { + $result = + ( $code == &codeOf("XK_Tab") || $code == &codeOf("XK_ISO_Left_Tab") ); + } + else { + $result = ( $code == &codeOf("XK_Tab") ) ? 1 : 0; + } + return $result; +} + +sub IsEditFunctionKey($) { + my $code = shift; + my $result = 0; + if ( $keyCodes{$code} ) { + my $name = $keyCodes{$code}; + $result = 1 if ( $editKeys{$name} ); + } + return $result; +} + +sub IS_CTRL($) { + my $code = &codeOf( $_[0] ); + my $result = ( $code < 32 || ( $code >= 0x7f && $code <= 0x9f ) ); + return $result; +} + +sub IsControlInput($) { + my $code = &codeOf( $_[0] ); + my $result = 0; + $result = 1 if ( $code >= 0x40 && $code <= 0x7f ); + return $result; +} + +sub IsControlOutput($) { + my $code = shift; + my $result = 0; + $result = 1 if &IS_CTRL($code); + return $result; +} + +sub IsControlAlias($$) { + my $code = shift; + my $state = shift; + my $result = 0; + + $code = &toCode($code); + $code = &toCode( &AliasedKey($code) ); + if ( hex $code < 256 ) { + $result = &IS_CTRL($code); + + # In xterm, this function does not directly test evt_state, but relies + # upon kd.strbuf converted by Xutf8LookupString or XmbLookupString + # (ultimately in _XTranslateKeysym). + # + # See https://www.mail-archive.com/xorg@lists.x.org/msg04434.html + # + # xterm does its own special cases for XK_BackSpace + if ( $state & $ControlMask ) { + my $ch = chr &codeOf($code); + $result = 1 if ( &IsTabKey($code) ); + $result = 1 if ( &IsControlInput($code) ); + $result = 1 if ( $ch =~ /^[\/ 2-8]$/ ); + } + } + return $result; +} + +sub computeMaskedModifier($$) { + my $state = shift; + my $mask = shift; + my $result = &xtermStateToParam( &Masked( $state, $mask ) ); + return $result; +} + +sub xtermStateToParam($) { + my $state = shift; + my $modify_parm = 1; + + $modify_parm += 1 if ( $state & $ShiftMask ); + $modify_parm += 2 if ( $state & $AltMask ); + $modify_parm += 4 if ( $state & $ControlMask ); + $modify_parm += 8 if ( $state & $MetaMask ); + $modify_parm = 0 if ( $modify_parm == 1 ); + return $modify_parm; +} + +sub ParamToState($) { + my $modify_parm = shift; + my $state = 0; + $modify_parm-- if ( $modify_parm > 0 ); + $state |= $ShiftMask if ( $modify_parm & 1 ); + $state |= $AltMask if ( $modify_parm & 2 ); + $state |= $ControlMask if ( $modify_parm & 4 ); + $state |= $MetaMask if ( $modify_parm & 8 ); + return $state; +} + +sub allowedCharModifiers($$) { + my $other_key = shift; + my $state = shift; + my $code = shift; + my $result = $state & ( $ShiftMask | $AltMask | $ControlMask | $MetaMask ); + + # If modifyOtherKeys is off or medium (0 or 1), moderate its effects by + # excluding the common cases for modifiers. + if ( $other_key <= 1 ) { + my $sym = $keyCodes{$code}; + if ( &IsControlInput($code) + and &Masked( $result, $ControlMask ) == 0 ) + { + # These keys are already associated with the control-key + if ( $other_key == 0 ) { + $result &= ~$ControlMask; + } + } + elsif ( $sym eq "XK_Tab" || $sym eq "XK_Return" ) { + # + } + elsif ( &IsControlAlias( $code, $state ) ) { + + # Things like "^_" work here... + if ( &Masked( $result, ( $ControlMask | $ShiftMask ) ) == 0 ) { + if ( $sym =~ /^XK_[34578]$/ or $sym eq "XK_slash" ) { + $result = 0 if ( $state == $ControlMask ); + } + else { + $result = 0; + } + } + } + elsif ( !&IsControlOutput($code) && !&IsPredefinedKey($code) ) { + + # Printable keys are already associated with the shift-key + if ( !( $result & $ControlMask ) ) { + $result &= ~$ShiftMask; + } + } + + # TODO: + # result = filterAltMeta(result, + # xw->work.meta_mods, + # TScreenOf(xw)->meta_sends_esc, kd); + # if (TScreenOf(xw)->alt_is_not_meta) { + # result = filterAltMeta(result, + # xw->work.alt_mods, + # TScreenOf(xw)->alt_sends_esc, kd); + # } + } + return $result; +} + +# Some details are omitted (e.g., the backspace/delete toggle), but this gives +# the general sense of the corresponding function in xterm's input.c +sub ModifyOtherKeys($$$$) { + my $code = shift; # the keycode to test + my $other_key = shift; # "modifyOtherKeys" resource + my $modify_parm = shift; # 0=unmodified, 2=shift, etc + my $state = shift; # mask of modifiers, e.g., ControlMask + my $result = 0; + + $modify_parm = 0 if ( $modify_parm == 1 ); + + if ( &IsModifierKey($code) ) { + + # xterm filters out bare modifiers (ignore) + } + elsif (&IsFunctionKey($code) + or &IsEditFunctionKey($code) + or &IsKeypadKey($code) + or &IsCursorKey($code) + or &IsPFKey($code) + or &IsMiscFunctionKey($code) + or &IsPrivateKeypadKey($code) ) + { + # Exclude the keys already covered by a modifier. + } + elsif ( $state > 0 ) { + my $sym = ""; + $sym = $keyCodes{$code} if ( $keyCodes{$code} ); + + # TODO: + #if (IsBackarrowToggle(keyboard, kd->keysym, state)) { + # kd->keysym = XK_Delete; + # UIntClr(state, ControlMask); + #} + if ( !&IsPredefinedKey($code) ) { + $state = &allowedCharModifiers( $other_key, $state, $code ); + } + if ( $state != 0 ) { + if ( $other_key == 1 ) { + if ( $sym eq "XK_BackSpace" + or $sym eq "XK_Delete" ) + { + } + elsif ( $sym eq "XK_ISO_Left_Tab" ) { + $result = 1 + if ( &computeMaskedModifier( $state, $ShiftMask ) ); + } + elsif ($sym eq "XK_Return" + or $sym eq "XK_Tab" ) + { + $result = ( $modify_parm != 0 ); + } + else { + if ( &IsControlInput($code) ) { + if ( $state == $ControlMask or $state == $ShiftMask ) { + $result = 0; + } + else { + $result = ( $modify_parm != 0 ); + } + } + elsif ( &IsControlAlias( $code, $state ) ) { + if ( $state == $ShiftMask ) { + $result = 0; + } + elsif ( &computeMaskedModifier( $state, $ControlMask ) ) + { + $result = 1; + } + } + else { + $result = 1; + } + } + if ($result) { # second case in xterm's Input() + $result = 0 + if ( &allowedCharModifiers( $other_key, $state, $code ) == + 0 ); + } + } + elsif ( $other_key == 2 ) { + if ( $sym eq "XK_BackSpace" ) { + + # strip ControlMask as per IsBackarrowToggle() + $result = 1 + if ( &computeMaskedModifier( $state, $ControlMask ) ); + } + elsif ( $sym eq "XK_Delete" ) { + + $result = ( &xtermStateToParam($state) != 0 ); + } + elsif ( $sym eq "XK_ISO_Left_Tab" ) { + $result = 1 + if ( &computeMaskedModifier( $state, $ShiftMask ) ); + } + elsif ( $sym eq "XK_Return" or $sym eq "XK_Tab" ) { + + $result = ( $modify_parm != 0 ); + } + else { + if ( &IsControlInput($code) ) { + $result = 1; + } + elsif ( $state == $ShiftMask ) { + $result = ( $sym eq "XK_space" or $sym eq "XK_Return" ); + } + elsif ( &computeMaskedModifier( $state, $ShiftMask ) ) { + $result = 1; + } + } + } + } + } + return $result; +} + +# See IsControlAlias. This handles some of the special cases where the keycode +# seen or used by xterm is not the same as the actual keycode. +sub AliasedKey($) { + my $code = &toCode( $_[0] ); + my $result = &codeOf($code); + my $sym = $keyCodes{$code}; + if ($sym) { + $result = 8 if ( $sym eq "XK_BackSpace" ); + $result = 9 if ( $sym eq "XK_Tab" ); + $result = 13 if ( $sym eq "XK_Return" ); + $result = 27 if ( $sym eq "XK_Escape" ); + } + return $result; +} + +# Returns a short display for shift/control/alt modifiers applied to the +# keycode to show which are affected by "modifyOtherKeys" at the given level in +# $other_key +sub CheckOtherKey($$) { + my $code = shift; + my $other_key = shift; + my $modified = 0; + my $result = ""; + for my $modify_parm ( 1 .. $MAXMODS ) { + my $state = &ParamToState($modify_parm); + if ( &ModifyOtherKeys( $code, $other_key, $modify_parm, $state ) ) { + $modified++; + $result .= "*"; + } + else { + $result .= "-"; + } + } + return $modified ? $result : "-(skip)-"; +} + +# Use the return-string from CheckOtherKeys as a template for deciding which +# keys to render as escape-sequences. +sub ShowOtherKeys($$$) { + my $code = &AliasedKey( $_[0] ); + my $mode = $_[1]; # modifyOtherKeys: 0, 1 or 2 + my $show = $_[2]; + my $type = &TypeOf( $_[0] ); + my @result; + + # index for $show[] can be tested with a bit-mask: + # 1 = shift + # 2 = alt + # 4 = ctrl + # 8 = meta + for my $c ( 0 .. length($show) - 1 ) { + my $rc = substr( $show, $c, 1 ); + if ( $rc eq "*" ) { + $result[$c] = &KeyToS( &toCode($code), $c + 1 ); + } + elsif ( $type eq "other" or ( $type eq "special" and $code < 256 ) ) { + my $map = $code; + my $tmp = &toCode($code); + my $chr = chr hex $tmp; + my $shift = ( $c & 1 ); + my $cntrl = ( $c & 4 ); + + # TODO - can this be simplified using xkb groups? + if ( $chr =~ /^[`345678]$/ and ( $c & 4 ) != 0 ) { + if ($shift) { + $map = 30 if ( $chr eq "`" ); + $map = ord "#" if ( $chr eq "3" ); + $map = ord '$' if ( $chr eq "4" ); + $map = ord "%" if ( $chr eq "5" ); + $map = 30 if ( $chr eq "6" ); + $map = ord "&" if ( $chr eq "7" ); + $map = ord "*" if ( $chr eq "8" ); + } + else { + $map = 0 if ( $chr eq "`" ); + $map = 27 if ( $chr eq "3" ); + $map = 28 if ( $chr eq "4" ); + $map = 29 if ( $chr eq "5" ); + $map = 30 if ( $chr eq "6" ); + $map = 31 if ( $chr eq "7" ); + $map = 127 if ( $chr eq "8" ); + } + } + else { + $map = &codeOf( $Shifted{$tmp} ) + if ( defined( $Shifted{$tmp} ) and $shift ); + if ($cntrl) { + if ( $chr =~ /^[190:<=>.,+*()'&%\$#"!]$/ ) { + + # ignore + } + elsif ( $chr =~ /^[2]$/ ) { + $map = 0; + } + elsif ( $chr =~ /^[:;]$/ ) { + $map = 27 if ( $mode > 0 ); + } + elsif ( $chr eq '-' ) { + $map = 31 if ($shift); + } + elsif ( $chr eq '/' ) { + $map = $shift ? 127 : 31 if ( $mode == 0 ); + $map = 31 if ( not $shift and $mode == 1 ); + } + elsif ( $chr eq '?' ) { + $map = 127; + } + else { + $map = ( $code & 0x1f ) if ( $code < 128 ); + } + } + } + $result[$c] = &VisibleChar( chr $map ); + } + elsif ( $type eq "special" ) { + $result[$c] = "-ignore-"; + } + else { + $result[$c] = sprintf( "%d:%s", $c + 1, $type ); + } + } + return @result; +} + +sub readfile($) { + my $data = shift; + my @data; + if ( open my $fp, $data ) { + @data = <$fp>; + close $fp; + chomp @data; + } + return @data; +} + +sub readpipe($) { + my $cmd = shift; + return &readfile("$cmd 2>/dev/null |"); +} + +sub trim($) { + my $text = shift; + $text =~ s/^\s+//; + $text =~ s/\s+$//; + $text =~ s/\s+/ /g; + return $text; +} + +sub html_ref($) { + my $header = shift; + my $anchor = lc &trim($header); + $anchor =~ s/\s/_/g; + return $anchor; +} + +sub rightarrow() { + return $opt_h ? "→" : "->"; +} + +sub safe_html($) { + my $text = shift; + if ($opt_h) { + $text =~ s/\&/\&/g; + $text =~ s/\= 128 ); + $s .= $ch if ( $ord < 128 ); + } + $text = $s; + } + } + return $text; +} + +sub begin_report() { + if ($opt_o) { + open( $REPORT, '>', $opt_o ) or &failed("cannot open $opt_o"); + select $REPORT; + } + if ($opt_h) { + printf < + + + + + + XTERM - Modified "Other" Keys ($xkb_layout-$xkb_model) + + + + + + +EOF + ; + } +} + +sub end_report() { + if ($opt_h) { + my $output = "output.html"; + $output = $opt_o if ($opt_o); + printf < +