diff options
author | Karl Berry <karl@freefriends.org> | 2021-02-25 19:22:25 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-02-25 19:22:25 +0000 |
commit | ad547a6b5986815fda458221149728d9d9ab1d87 (patch) | |
tree | 16296910eb3eca724371474ea9aea3994dc69614 /Build/source/texk/web2c/window | |
parent | 947b43de3dd21d58ccc2ffadefc4441ea1c2a813 (diff) |
restore Build,TODO from r57911
git-svn-id: svn://tug.org/texlive/trunk@57915 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/web2c/window')
19 files changed, 4342 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/window/ChangeLog b/Build/source/texk/web2c/window/ChangeLog new file mode 100644 index 00000000000..ed6d0165dd2 --- /dev/null +++ b/Build/source/texk/web2c/window/ChangeLog @@ -0,0 +1,387 @@ +2018-01-16 Paul Vojta <vojta@math.berkeley.edu> + + * x11-Xt.c: attempt to handle initial expose for mf. + http://tug.org/pipermail/tex-k/2017-May/002783.html + +2015-03-31 Peter Breitenlohner <peb@mppmu.mpg.de> + + * mftalk.h (new): Moved to here from ../mftalk.h. + * Makefile.am: Adapted. + +2014-01-02 Peter Breitenlohner <peb@mppmu.mpg.de> + + * x11-Xlib.c: Cast screenwidth, screendepth to 'unsigned int'. + +2013-07-01 Peter Breitenlohner <peb@mppmu.mpg.de> + + * tek.c: Replace bzero(t, l) => memset(t, 0, l) and bcmp() => + memcmp(). + +2012-11-20 Peter Breitenlohner <peb@mppmu.mpg.de> + + * Makefile.am: Avoid use of deprecated INCLUDES. + +2012-07-01 Peter Breitenlohner <peb@mppmu.mpg.de> + + * win32.c: Avoid TL W32TeX differences. + +2010-02-21 Peter Breitenlohner <peb@mppmu.mpg.de> + + * mfdisplay.h: New file with protos for display routines. + * Makefile.am: Add the new file. + + * amiga.c, epsf.c, mftalk.c + #include <mfdisplay.h>, mf_*_initscreen returns int. + + * hp2627.c, next.c, regis.c, suntools.c, tek.c, uniterm.c + #include <mfdisplay.h>. + + * trap.c: mf_trap_initscreen() returns int. + #include <mfdisplay.h> and drop externs. + + * win32.c: #include <mfdisplay.h>. + Do not skip Win32Error() for MinGW32, add static forward decl. + Drop unused variables szAppName, black, and white. + + * x11-Xlib.c, x11-Xt.c: #include <mfdisplay.h> and drop externs. + +2010-01-20 Peter Breitenlohner <peb@mppmu.mpg.de> + + * amiga.c, win32.c: Current METAFONT Version is 2.718281. + +2009-12-23 Karl Berry <karl@tug.org> + + * mftalk.c: doc fix. + +2009-06-23 Peter Breitenlohner <peb@mppmu.mpg.de> + + * epsf.c, hp2627.c, mftalk.c, next.c, regis.c, suntools.c, + tek.c, uniterm.c, win32.c: drop P?C, P?H, use ANSI C function + declarations. + +2009-06-12 Peter Breitenlohner <peb@mppmu.mpg.de> + + * Makefile.am (AM_CFLAGS): enable compiler warnings. + * trap.c, x11-Xlib.c, x11-Xt.c: use ANSI C prototypes. + +2008-02-29 Peter Breitenlohner <peb@mppmu.mpg.de> + + * x11-Xt.c: remove unused preprocessor stuff (FOIL...). + +2008-01-29 Peter Breitenlohner <peb@mppmu.mpg.de> + + * Makefile.in: Add @configure_input@ line. + +2005-06-26 Olaf Weber <olaf@infovore.xs4all.nl> + + * Makefile.in: Replace ac_include with kpse_include. From Peter + Breitenlohner. + +2003-01-24 Olaf Weber <olaf@infovore.xs4all.nl> + + * mftalk.c: Use SIGCHLD, not SIGCLD (but fall back if necessary). + Reported by hubertf@netbsd.org. + +2001-11-25 Olaf Weber <olaf@infovore.xs4all.nl> + + * x11-Xt.c (mf_checkextent): Add prototype. + (mf_optiondesclist): The pointers in the argument list are XPointers, + not XtPointers. + +2001-11-19 Olaf Weber <olaf@infovore.xs4all.nl> + + * x11-Xt.c (mf_newpixmap): Add prototype to declaration. + +1999-02-06 Olaf Weber <olaf@infovore.xs4all.nl> + + * trap.c (mf_trap_initscreen, mf_trap_updatescreen): Use P1H macro + in definition. + + * win32.c (InitGui): Oops, removed one __cdecl too many. From + Fabrice. + +1999-02-04 Olaf Weber <olaf@infovore.xs4all.nl> + + * win32.c (InitGui, LoopMsg): Remove __cdecl, from Fabrice. + +1999-01-13 Olaf Weber <olaf@infovore.xs4all.nl> + + * Makefile.in: Rename kpathsea.make to kpathsea.mk. + +1999-01-10 Olaf Weber <olaf@infovore.xs4all.nl> + + * x11-Xlib.c: Do not define input and output because of conflicts. + + * tek.c: Don't redefine TRUE and FALSE. + + * mftalk.c: Include kpathsea/variable.h. + + * Makefile.in: Change of ../make/*.make to ../make/*.mk. + +Tue Jun 30 19:47:37 1998 Olaf Weber <olaf@infovore.xs4all.nl> + + * uniterm.c (mf_uniterm_paintrow): transspect -> transspec. + +Mon Mar 23 19:04:03 1998 Olaf Weber <olaf@infovore.xs4all.nl> + + * mftalk.c (mf_mftalk_initscreen): Correction from Mathias + Herberts. + +Wed Feb 11 17:19:54 1998 Olaf Weber <infovore@xs4all.nl> + + * epsf.c: New version from Mathias Herberts. + +Tue Feb 10 21:10:20 1998 Olaf Weber <infovore@xs4all.nl> + + * mftalk.c: Patches to improve handling of pipes, after Mathias + Herberts. + + * epsf.c: Pseudo-window EPS server contributed by Mathias Herberts + <herberts@infini.fr> + + * Makefile.in: Add epsf.o to objects. + +Fri Jan 23 14:59:22 1998 Olaf Weber <infovore@xs4all.nl> + + * win32.c: Patches from Fabrice Popineau. + +Sat Jan 17 09:45:20 1998 Olaf Weber <infovore@xs4all.nl> + + * mftalk.c (app_type): Wrong prototype. + (mf_talk_initscreen): We use the calling sequence of execl, not + execve. Undefine input and output, as these are macros on some + machines. From Mathias Herberts <Mathias.Herberts@irisa.fr> + +Thu Nov 13 19:17:42 1997 Olaf Weber <infovore@xs4all.nl> + + * next.c (mf_next_paintrow): Forgot to add the P4C macro name. + +Fri Oct 24 13:42:15 1997 Olaf Weber <infovore@xs4all.nl> + + * trap.c: By way of boilerplating, cast to long, not int, for + printing. + + * win32.c, x11-Xlib.c, x11-Xt.c, uniterm.c trap.c, tek.c, + suntools.c, regis.c, next.c, mftalk.c, hp2627.c, amiga.c: + Prototypes for the mf_*_{blankrectangle,paintrow} functions. + +Mon Oct 20 08:48:51 1997 Olaf Weber <infovore@xs4all.nl> + + * Makefile.in [objects]: Add win32.o. + + * trap.c: Insert casts to ensure that the arguments to fprintf + match the format. + + * win32.c: Nef file, adds support for win32 graphical output. + From Fabrice Popineau. + +Thu Feb 13 16:13:13 1997 Karl Berry <karl@cs.umb.edu> + + * x11-Xt.c (wchar_t) [FOIL_X_WCHAR_T]: Had polarity of #if test wrong. + From: Olaf Weber <Olaf.Weber@cwi.nl>. + +Mon Jan 20 17:30:15 1997 Karl Berry <karl@cs.umb.edu> + + * Version 7.0. + +Tue Dec 3 15:10:13 1996 Ulrik Vieth <vieth@thphy.uni-duesseldorf.de> + + * Makefile.in (prog_cflags): Oops, the previous change didn't work. + Have to set this to -I.. -I$(srcdir)/.. $(x_cppflags). + +Tue Dec 3 00:19:27 1996 Ulrik Vieth <vieth@thphy.uni-duesseldorf.de> + + * Makefile.in (prog_cflags): Set this to $(x_cppflags) so that + the X include path will eventually end up in ALL_CPPFLAGS. + +Tue Dec 3 00:19:27 1996 Ulrik Vieth <vieth@thphy.uni-duesseldorf.de> + + * Makefile.in (prog_cflags): Set this to $(x_cppflags) so that + the X include path will eventually end up in ALL_CPPFLAGS. + +Mon Aug 5 16:30:17 1996 Karl Berry <karl@cs.umb.edu> + + * x11-Xlib.c (mf_x11_initscreen): tvect - 1 should be just tvect. + From DEK et al. + +Fri Jul 26 15:47:50 1996 Karl Berry <karl@cs.umb.edu> + + * Makefile.in: Remove co.make. + +Wed May 15 16:58:01 1996 Karl Berry <karl@cs.umb.edu> + + * mftalk.c: Doc fix. + +Tue Feb 13 16:10:54 1996 Karl Berry <karl@cs.umb.edu> + + * x11-Xt.c: Missing close-comment. + + * Makefile.in: Include rdepend.make. + +Fri Dec 29 17:15:38 1995 Karl Berry <karl@cs.umb.edu> + + * Makefile.in: misc.make is now clean.make. + +Sat Nov 18 17:11:26 1995 Karl Berry <karl@cs.umb.edu> + + * Makefile.in (distclean): New target to remove x11.c. From Peter + Dyballa. + +Thu Nov 16 16:28:22 1995 Karl Berry <karl@cs.umb.edu> + + * amiga.c: Replacement file. + * trap.c (EXTERN): Define as extern, just as with the rest of the + modules. From Andreas Scherer. + +Mon Oct 9 16:51:17 1995 Karl Berry <karl@cs.umb.edu> + + * Makefile.in (x11.c): Use $(srcdir). From Simon. + +Fri Jul 21 15:48:25 1995 Karl Berry <karl@cs.umb.edu> + + * mftalk.c: The FSF has a new address. + +Tue Jul 18 15:16:15 1995 Karl Berry <karl@cs.umb.edu> + + * mftalk.c (app_type): Don't just fail under Unix. + +Tue Jun 13 11:37:37 1995 Karl Berry <karl@cs.umb.edu> + + * x11-Xt.c (mf_x11_paintrow): Use tvect, not tvect - 1. + From: FUKUI Rei <fkr@tooyoo1.l.u-tokyo.ac.jp>. + +MFwindow: +Fri Jul 29 11:50:19 1994 Karl Berry (karl@cs.umb.edu) + + * x11-Xt.c: Make the default be to *not* foil X's wchar_t. + +Mon Feb 21 17:49:30 1994 Karl Berry (karl@cs.umb.edu) + + * x11-Xt.c: Include systypes.h for still more wchar_t kludgery. + +Wed Feb 2 11:01:09 1994 Karl Berry (karl@cs.umb.edu) + + * Version 6.1. + +Tue Feb 1 11:24:11 1994 Karl Berry (karl@cs.umb.edu) + + * Makefile.in: Change ../../$(srcdir) to $(srcdir)/../.. throughout. + +Mon Jan 24 07:28:00 1994 Karl Berry (karl@cs.umb.edu) + + * Version 6.0. + +Sun Jan 23 16:25:58 1994 Karl Berry (karl@cs.umb.edu) + + * x11-Xt.c (wchar_t): No, remove that condition. + +Fri Dec 24 13:15:07 1993 Karl Berry (karl@sorrel.hq.ileaf.com) + + * x11.c (wchar_t) [! __INT_WCHAR_T_H]: Conditionalize for aviion. + +|Tue Dec 21 19:33:59 1993 Karl Berry (karl@cs.umb.edu) + + * x11-Xt.c (X_WCHAR): Define. + +Sat Dec 18 14:55:59 1993 Karl Berry (karl@cs.umb.edu) + + * x11.c (wchar_t): Define this to a nonsense symbol, to avoid + redefinitions. + +Sat Dec 4 11:42:36 1993 Karl Berry (karl@cs.umb.edu) + + * Makefile.in (xincludedir): This is now x_include_flags. + +Sun Nov 14 16:19:13 1993 Karl Berry (karl@cs.umb.edu) + + * Makefile.in: Don't need kpathsea definitions? + +Thu Nov 11 15:51:55 1993 Karl Berry (karl@cs.umb.edu) + + * x11-Xt.c: Merge changes from Rainer for the Alpha and reformat. + +Sat Nov 6 13:18:07 1993 Karl Berry (karl@cs.umb.edu) + + * Makefile.in (objs): Add next.o and regis.o. + * next.c, regis.c: New file from joe@rilgp.tamri.com. + +Sun Oct 3 13:27:35 1993 Karl Berry (karl@cs.umb.edu) + + * Makefile.in (*clean): Include standard targets. + +Fri May 21 14:23:06 1993 Karl Berry (karl@cs.umb.edu) + + * x11-Xt.c (mf_x11_updatescreen): Remove unused variable `event'. + (mf_max_x, etc.) [MF_XT_DEBUG]: Conditionalize declaration. + +Sun May 9 10:44:35 1993 Karl Berry (karl@cs.umb.edu) + + * Makefile.in (CPPFLAGS): Add -I for kpathsea. + +Fri Apr 9 16:22:17 1993 Karl Berry (karl@cs.umb.edu) + + * x11-Xt.c (_GCC_WCHAR_T): Define. + +Sat Mar 13 11:26:57 1993 Karl Berry (karl@cs.umb.edu) + + * uniterm.c (tek_dummy): Rename to uniterm_dummy, to avoid warning. + +Fri Feb 12 07:29:19 1993 Karl Berry (karl@cs.umb.edu) + + * Makefile.in (xincludedir): Include $(xincludedir). + +Sun Jan 3 13:30:10 1993 Karl Berry (karl@cs.umb.edu) + + * Makefile.in (distclean): Remove Makefile. + +Sat Dec 19 18:57:02 1992 Karl Berry (karl@cs.umb.edu) + + * Makefile.in ({sun,x11}.c): New targets. + +Sun Dec 13 14:27:15 1992 Karl Berry (karl@cs.umb.edu) + + * Makefile.in (c-sources): New target. + +Sat Dec 12 15:10:49 1992 Karl Berry (karl@cs.umb.edu) + + * Makefile.in: Rewrite from Makefile. + +Sun Oct 18 13:48:49 1992 Karl Berry (karl@cs.umb.edu) + + * tek.c (bcopy, bzero) [SYSV]: Remove these; they're already + defined in c-memstr.h. + +Sun Jul 5 07:29:40 1992 Karl Berry (karl@hayley) + + * sun-sunview.c: give return types to all fns. + + * sun-sunview.c (mf_sun_initscreen): avoid line >= 80 chars. + * uniterm.c (mf_uniterm_paintrow): likewise. + * sun-xview.c (mf_xview_updatescreen): likewise. + +Fri Jul 3 11:22:47 1992 Karl Berry (karl@hayley) + + * Makefile (CFLAGS): define as -g. + (CPPFLAGS): new var. + (.c.o): use it. + (distclean): synonym for realclean. + + * sun-sunview.c: changes from Pierre (like the following). + * sun-gfx.c: rename from sun-suntools.c. + * sun-xview.c: new file. + * sun.c: remove and remake as a link to sun-sunview.c. + +Fri Mar 20 16:53:52 1992 Karl Berry (karl at hayley) + + * Makefile (mostlyclean): new name for `clean'. + (clean): what `realclean' used to be. + (realclean): nothing to do anymore. + (install): install the program. + +Fri Jan 24 09:21:15 1992 Karl Berry (karl at hayley) + + * Makefile (cflags): don't include -I../config. + +Sun Jan 12 12:53:24 1992 Karl Berry (karl at hayley) + + * Makefile (CFLAGS): include config, two levels up. diff --git a/Build/source/texk/web2c/window/Makefile.am b/Build/source/texk/web2c/window/Makefile.am new file mode 100644 index 00000000000..87f9665990c --- /dev/null +++ b/Build/source/texk/web2c/window/Makefile.am @@ -0,0 +1,37 @@ +## Makefile.am for the TeX Live subdirectory texk/web2c/window/ +## +## Copyright (C) 2009-2015 Peter Breitenlohner <tex-live@tug.org> +## You may freely use, modify and/or distribute this file. +## +AM_CPPFLAGS = -I$(top_srcdir) $(KPATHSEA_INCLUDES) $(X_CFLAGS) +AM_CFLAGS = $(WARNING_CFLAGS) + +## Rebuild libkpathsea +@KPATHSEA_RULE@ + +## Built on demand, after `../mfd.h' has been created +EXTRA_LIBRARIES = libwindow.a + +libwindow_a_SOURCES = \ + amiga.c \ + epsf.c \ + hp2627.c \ + mfdisplay.h \ + mftalk.c \ + mftalk.h \ + next.c \ + regis.c \ + suntools.c \ + tek.c \ + trap.c \ + uniterm.c \ + win32.c + +if MFXT +libwindow_a_SOURCES += x11-Xt.c +else !MFXT +libwindow_a_SOURCES += x11-Xlib.c +endif !MFXT + +DISTCLEANFILES = libwindow.a + diff --git a/Build/source/texk/web2c/window/Makefile.in b/Build/source/texk/web2c/window/Makefile.in new file mode 100644 index 00000000000..9efb7c02e2f --- /dev/null +++ b/Build/source/texk/web2c/window/Makefile.in @@ -0,0 +1,801 @@ +# Makefile.in generated by automake 1.16.3 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2020 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +@MFXT_TRUE@am__append_1 = x11-Xt.c +@MFXT_FALSE@am__append_2 = x11-Xlib.c +subdir = window +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/web2c-disable.m4 \ + $(top_srcdir)/../../m4/ax_cxx_compile_stdcxx.m4 \ + $(top_srcdir)/../../m4/kpse-asm.m4 \ + $(top_srcdir)/../../m4/kpse-cairo-flags.m4 \ + $(top_srcdir)/../../m4/kpse-common.m4 \ + $(top_srcdir)/../../m4/kpse-cross.m4 \ + $(top_srcdir)/../../m4/kpse-cxx-hack.m4 \ + $(top_srcdir)/../../m4/kpse-fontconfig-flags.m4 \ + $(top_srcdir)/../../m4/kpse-freetype2-flags.m4 \ + $(top_srcdir)/../../m4/kpse-gmp-flags.m4 \ + $(top_srcdir)/../../m4/kpse-graphite2-flags.m4 \ + $(top_srcdir)/../../m4/kpse-harfbuzz-flags.m4 \ + $(top_srcdir)/../../m4/kpse-icu-flags.m4 \ + $(top_srcdir)/../../m4/kpse-kpathsea-flags.m4 \ + $(top_srcdir)/../../m4/kpse-lex.m4 \ + $(top_srcdir)/../../m4/kpse-lib-version.m4 \ + $(top_srcdir)/../../m4/kpse-libpng-flags.m4 \ + $(top_srcdir)/../../m4/kpse-lt-hack.m4 \ + $(top_srcdir)/../../m4/kpse-lua52-flags.m4 \ + $(top_srcdir)/../../m4/kpse-lua53-flags.m4 \ + $(top_srcdir)/../../m4/kpse-luajit-flags.m4 \ + $(top_srcdir)/../../m4/kpse-macos-framework.m4 \ + $(top_srcdir)/../../m4/kpse-mpfr-flags.m4 \ + $(top_srcdir)/../../m4/kpse-pixman-flags.m4 \ + $(top_srcdir)/../../m4/kpse-pplib-flags.m4 \ + $(top_srcdir)/../../m4/kpse-ptexenc-flags.m4 \ + $(top_srcdir)/../../m4/kpse-socket-libs.m4 \ + $(top_srcdir)/../../m4/kpse-teckit-flags.m4 \ + $(top_srcdir)/../../m4/kpse-warnings.m4 \ + $(top_srcdir)/../../m4/kpse-web2c.m4 \ + $(top_srcdir)/../../m4/kpse-win32.m4 \ + $(top_srcdir)/../../m4/kpse-xpdf-flags.m4 \ + $(top_srcdir)/../../m4/kpse-zlib-flags.m4 \ + $(top_srcdir)/../../m4/kpse-zziplib-flags.m4 \ + $(top_srcdir)/../../m4/libtool.m4 \ + $(top_srcdir)/../../m4/ltoptions.m4 \ + $(top_srcdir)/../../m4/ltsugar.m4 \ + $(top_srcdir)/../../m4/ltversion.m4 \ + $(top_srcdir)/../../m4/lt~obsolete.m4 \ + $(top_srcdir)/../../version.ac $(top_srcdir)/ac/web2c.ac \ + $(top_srcdir)/synctexdir/ac/synctex.ac \ + $(top_srcdir)/synctexdir/synctex_parser_api_level.txt \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/w2c/c-auto.h \ + $(top_builddir)/ff-config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +ARFLAGS = cru +AM_V_AR = $(am__v_AR_@AM_V@) +am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) +am__v_AR_0 = @echo " AR " $@; +am__v_AR_1 = +libwindow_a_AR = $(AR) $(ARFLAGS) +libwindow_a_LIBADD = +am__libwindow_a_SOURCES_DIST = amiga.c epsf.c hp2627.c mfdisplay.h \ + mftalk.c mftalk.h next.c regis.c suntools.c tek.c trap.c \ + uniterm.c win32.c x11-Xt.c x11-Xlib.c +@MFXT_TRUE@am__objects_1 = x11-Xt.$(OBJEXT) +@MFXT_FALSE@am__objects_2 = x11-Xlib.$(OBJEXT) +am_libwindow_a_OBJECTS = amiga.$(OBJEXT) epsf.$(OBJEXT) \ + hp2627.$(OBJEXT) mftalk.$(OBJEXT) next.$(OBJEXT) \ + regis.$(OBJEXT) suntools.$(OBJEXT) tek.$(OBJEXT) \ + trap.$(OBJEXT) uniterm.$(OBJEXT) win32.$(OBJEXT) \ + $(am__objects_1) $(am__objects_2) +libwindow_a_OBJECTS = $(am_libwindow_a_OBJECTS) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/w2c -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/../../build-aux/depcomp +am__maybe_remake_depfiles = depfiles +am__depfiles_remade = ./$(DEPDIR)/amiga.Po ./$(DEPDIR)/epsf.Po \ + ./$(DEPDIR)/hp2627.Po ./$(DEPDIR)/mftalk.Po \ + ./$(DEPDIR)/next.Po ./$(DEPDIR)/regis.Po \ + ./$(DEPDIR)/suntools.Po ./$(DEPDIR)/tek.Po ./$(DEPDIR)/trap.Po \ + ./$(DEPDIR)/uniterm.Po ./$(DEPDIR)/win32.Po \ + ./$(DEPDIR)/x11-Xlib.Po ./$(DEPDIR)/x11-Xt.Po +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_lt = $(am__v_lt_@AM_V@) +am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) +am__v_lt_0 = --silent +am__v_lt_1 = +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(libwindow_a_SOURCES) +DIST_SOURCES = $(am__libwindow_a_SOURCES_DIST) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in \ + $(top_srcdir)/../../build-aux/depcomp ChangeLog README +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AS = @AS@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CAIRO_DEPEND = @CAIRO_DEPEND@ +CAIRO_INCLUDES = @CAIRO_INCLUDES@ +CAIRO_LIBS = @CAIRO_LIBS@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CTANGLE = @CTANGLE@ +CTANGLEBOOT = @CTANGLEBOOT@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CXXLD = @CXXLD@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +FONTCONFIG_INCLUDES = @FONTCONFIG_INCLUDES@ +FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ +FREETYPE2_DEPEND = @FREETYPE2_DEPEND@ +FREETYPE2_INCLUDES = @FREETYPE2_INCLUDES@ +FREETYPE2_LIBS = @FREETYPE2_LIBS@ +FT2_CONFIG = @FT2_CONFIG@ +GMP_DEPEND = @GMP_DEPEND@ +GMP_INCLUDES = @GMP_INCLUDES@ +GMP_LIBS = @GMP_LIBS@ +GRAPHITE2_DEPEND = @GRAPHITE2_DEPEND@ +GRAPHITE2_INCLUDES = @GRAPHITE2_INCLUDES@ +GRAPHITE2_LIBS = @GRAPHITE2_LIBS@ +GREP = @GREP@ +HARFBUZZ_DEPEND = @HARFBUZZ_DEPEND@ +HARFBUZZ_INCLUDES = @HARFBUZZ_INCLUDES@ +HARFBUZZ_LIBS = @HARFBUZZ_LIBS@ +HAVE_CXX11 = @HAVE_CXX11@ +ICU_CONFIG = @ICU_CONFIG@ +ICU_DEPEND = @ICU_DEPEND@ +ICU_INCLUDES = @ICU_INCLUDES@ +ICU_LIBS = @ICU_LIBS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KPATHSEA_DEPEND = @KPATHSEA_DEPEND@ +KPATHSEA_INCLUDES = @KPATHSEA_INCLUDES@ +KPATHSEA_LIBS = @KPATHSEA_LIBS@ +KPATHSEA_PATHS_H = @KPATHSEA_PATHS_H@ +KPSEWHICH = @KPSEWHICH@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBOBJS = @LIBOBJS@ +LIBPNG_DEPEND = @LIBPNG_DEPEND@ +LIBPNG_INCLUDES = @LIBPNG_INCLUDES@ +LIBPNG_LIBS = @LIBPNG_LIBS@ +LIBS = @LIBS@ +LIBSYNCTEX = @LIBSYNCTEX@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +LTLIBSYNCTEX = @LTLIBSYNCTEX@ +LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ +LUA52_DEFINES = @LUA52_DEFINES@ +LUA52_DEPEND = @LUA52_DEPEND@ +LUA52_INCLUDES = @LUA52_INCLUDES@ +LUA52_LIBS = @LUA52_LIBS@ +LUA53_DEFINES = @LUA53_DEFINES@ +LUA53_DEPEND = @LUA53_DEPEND@ +LUA53_INCLUDES = @LUA53_INCLUDES@ +LUA53_LIBS = @LUA53_LIBS@ +LUAJIT_DEFINES = @LUAJIT_DEFINES@ +LUAJIT_DEPEND = @LUAJIT_DEPEND@ +LUAJIT_INCLUDES = @LUAJIT_INCLUDES@ +LUAJIT_LDEXTRA = @LUAJIT_LDEXTRA@ +LUAJIT_LIBS = @LUAJIT_LIBS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MKDIR_P = @MKDIR_P@ +MPFR_DEPEND = @MPFR_DEPEND@ +MPFR_INCLUDES = @MPFR_INCLUDES@ +MPFR_LIBS = @MPFR_LIBS@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJCXX = @OBJCXX@ +OBJCXXDEPMODE = @OBJCXXDEPMODE@ +OBJCXXFLAGS = @OBJCXXFLAGS@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTANGLE = @OTANGLE@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PIXMAN_DEPEND = @PIXMAN_DEPEND@ +PIXMAN_INCLUDES = @PIXMAN_INCLUDES@ +PIXMAN_LIBS = @PIXMAN_LIBS@ +PKG_CONFIG = @PKG_CONFIG@ +PPLIB_DEPEND = @PPLIB_DEPEND@ +PPLIB_INCLUDES = @PPLIB_INCLUDES@ +PPLIB_LIBS = @PPLIB_LIBS@ +PTEXENC_DEPEND = @PTEXENC_DEPEND@ +PTEXENC_INCLUDES = @PTEXENC_INCLUDES@ +PTEXENC_LIBS = @PTEXENC_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SYNCTEXVERSION = @SYNCTEXVERSION@ +SYNCTEX_LT_VERSINFO = @SYNCTEX_LT_VERSINFO@ +TANGLE = @TANGLE@ +TANGLEBOOT = @TANGLEBOOT@ +TECKIT_DEPEND = @TECKIT_DEPEND@ +TECKIT_INCLUDES = @TECKIT_INCLUDES@ +TECKIT_LIBS = @TECKIT_LIBS@ +TIE = @TIE@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WARNING_OBJCXXFLAGS = @WARNING_OBJCXXFLAGS@ +WEB2CVERSION = @WEB2CVERSION@ +XMKMF = @XMKMF@ +XPDF_DEPEND = @XPDF_DEPEND@ +XPDF_INCLUDES = @XPDF_INCLUDES@ +XPDF_LIBS = @XPDF_LIBS@ +X_CFLAGS = @X_CFLAGS@ +X_EXTRA_LIBS = @X_EXTRA_LIBS@ +X_LIBS = @X_LIBS@ +X_PRE_LIBS = @X_PRE_LIBS@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +ZLIB_DEPEND = @ZLIB_DEPEND@ +ZLIB_INCLUDES = @ZLIB_INCLUDES@ +ZLIB_LIBS = @ZLIB_LIBS@ +ZZIPLIB_DEPEND = @ZZIPLIB_DEPEND@ +ZZIPLIB_INCLUDES = @ZZIPLIB_INCLUDES@ +ZZIPLIB_LIBS = @ZZIPLIB_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_OBJCXX = @ac_ct_OBJCXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +ipc_socketlibs = @ipc_socketlibs@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lua_socketlibs = @lua_socketlibs@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +wlibs = @wlibs@ +x_ext_lib = @x_ext_lib@ +x_tool_libs = @x_tool_libs@ +AM_CPPFLAGS = -I$(top_srcdir) $(KPATHSEA_INCLUDES) $(X_CFLAGS) +AM_CFLAGS = $(WARNING_CFLAGS) +EXTRA_LIBRARIES = libwindow.a +libwindow_a_SOURCES = amiga.c epsf.c hp2627.c mfdisplay.h mftalk.c \ + mftalk.h next.c regis.c suntools.c tek.c trap.c uniterm.c \ + win32.c $(am__append_1) $(am__append_2) +DISTCLEANFILES = libwindow.a +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign window/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign window/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +libwindow.a: $(libwindow_a_OBJECTS) $(libwindow_a_DEPENDENCIES) $(EXTRA_libwindow_a_DEPENDENCIES) + $(AM_V_at)-rm -f libwindow.a + $(AM_V_AR)$(libwindow_a_AR) libwindow.a $(libwindow_a_OBJECTS) $(libwindow_a_LIBADD) + $(AM_V_at)$(RANLIB) libwindow.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amiga.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/epsf.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hp2627.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mftalk.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/next.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regis.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/suntools.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tek.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trap.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uniterm.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/win32.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x11-Xlib.Po@am__quote@ # am--include-marker +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/x11-Xt.Po@am__quote@ # am--include-marker + +$(am__depfiles_remade): + @$(MKDIR_P) $(@D) + @echo '# dummy' >$@-t && $(am__mv) $@-t $@ + +am--depfiles: $(am__depfiles_remade) + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) distdir-am + +distdir-am: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f ./$(DEPDIR)/amiga.Po + -rm -f ./$(DEPDIR)/epsf.Po + -rm -f ./$(DEPDIR)/hp2627.Po + -rm -f ./$(DEPDIR)/mftalk.Po + -rm -f ./$(DEPDIR)/next.Po + -rm -f ./$(DEPDIR)/regis.Po + -rm -f ./$(DEPDIR)/suntools.Po + -rm -f ./$(DEPDIR)/tek.Po + -rm -f ./$(DEPDIR)/trap.Po + -rm -f ./$(DEPDIR)/uniterm.Po + -rm -f ./$(DEPDIR)/win32.Po + -rm -f ./$(DEPDIR)/x11-Xlib.Po + -rm -f ./$(DEPDIR)/x11-Xt.Po + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f ./$(DEPDIR)/amiga.Po + -rm -f ./$(DEPDIR)/epsf.Po + -rm -f ./$(DEPDIR)/hp2627.Po + -rm -f ./$(DEPDIR)/mftalk.Po + -rm -f ./$(DEPDIR)/next.Po + -rm -f ./$(DEPDIR)/regis.Po + -rm -f ./$(DEPDIR)/suntools.Po + -rm -f ./$(DEPDIR)/tek.Po + -rm -f ./$(DEPDIR)/trap.Po + -rm -f ./$(DEPDIR)/uniterm.Po + -rm -f ./$(DEPDIR)/win32.Po + -rm -f ./$(DEPDIR)/x11-Xlib.Po + -rm -f ./$(DEPDIR)/x11-Xt.Po + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ + clean-generic clean-libtool cscopelist-am ctags ctags-am \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-am uninstall uninstall-am + +.PRECIOUS: Makefile + + +@KPATHSEA_RULE@ + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Build/source/texk/web2c/window/README b/Build/source/texk/web2c/window/README new file mode 100644 index 00000000000..5384bc8b59e --- /dev/null +++ b/Build/source/texk/web2c/window/README @@ -0,0 +1,2 @@ +This directory contains the support for Metafont's online graphics. +The various pieces are used and invoked from lib/texmfmp.c. diff --git a/Build/source/texk/web2c/window/amiga.c b/Build/source/texk/web2c/window/amiga.c new file mode 100644 index 00000000000..e975cb39bd5 --- /dev/null +++ b/Build/source/texk/web2c/window/amiga.c @@ -0,0 +1,369 @@ +/* + * AMIGA.C: This is the Graphics Window interface to MetaFont for online + * displays on the Commodore Amiga. This file was written by Edmund Mergl + * for his Amiga port of TeX 3.1 and MetaFont 2.7 from the original Unix + * sources (see Fish Disks 611-616). + * + * Some modifications and improvements were made since 1993 by Andreas and + * Stefan Scherer, Abt-Wolf-Strasse 17, 96215 Lichtenfels, Germany. The + * most recent entries from top to bottom always superseed their ancestors, + * just read this as a bit of history: + * + * August 12, 1993: + * + * - We use the `memory hack', so the values for `screenwidth' + * and `screendepth' are to be found in `mfmemory.config'. The + * display height should be set to an InterLace value, this will + * be dealt with by `lacefactor' (see below). + * + * - The display window is no longer resizeable, because no + * `screenupdate' is called and the picture is destroyed. + * + * - Based on ideas by Stefan Becker used in his famous MetaFont port + * to the Amiga of 1991 (see Fish Disk 486) there is a variable + * `scalefactor', which can be set to a (small) positiv integer in + * `mfmemory.config'. This results in a reduced size of the displayed + * characters, so that large font pictures can be drawn on + * small-sized screens (although some distortions are possible). + * + * - By replacing `Move' and `Draw' with `WritePixelLine' and friends + * the speed of the display was heavily increased. + * + * - The display screen is totally controlled by `screenwidth' and + * `screendepth' from `mfmemory.config', when you set `screen_rows' + * and `screen_cols' both to the maximum value `4095' in your local + * device modes file. MetaFont takes the smaller of these pairs. + * + * - `blankrectangle' *always* set the complete display window to the + * background color, not only the area specified by `left', `right', + * `top', and `bottom'. These MetaFont coordinates are now obeyed. + * + * September 11, 1993: + * + * - The changes for `Computers and Typesetting -- Volume A-E' provided + * by Addison-Wesley Publishing Company resulted in MetaFont 2.71. + * This caused a change in the window title. + * + * October 22, 1993: + * + * - The official version 2.71 has the same window title. :-) + * + * January 28, 1994: + * + * - Although SAS/C has an AutoOpen feature for Amiga libraries, + * it is better to define the library bases explicitly. + * + * February 15, 1995: + * + * - Here's my new address: + * Andreas Scherer, Rolandstraße 16, 52070 Aachen, Germany. + * <scherer@genesis.informatik.rwth-aachen.de> (Internet). + * - Make `amiga.c' compliant with the syntax of the other modules + * in the Web2C 6.1 distribution. + * + * February 19, 1995: + * + * - `close_all()' must not have arguments, because we want to + * link it into the `atexit()' function list. + * - To distinguish this version from the old distribution, the + * window title is modified. + * + * March 23, 1995: + * + * - MetaFont has the new version number 2.718. + * + * April 9, 1995: + * + * - rename `screenheight' to `screendepth' for consistency. + * + * October 10, 1995: + * + * - Yet another change in my address, now it's a UNIX CIP pool: + * <scherer@physik.rwth-aachen.de> + * - Cleanup for the new web2c release. + * + * January 20, 2010: + * + * - MetaFont has the new version number 2.718281. + */ + +#define EXTERN extern + +#include "../mfd.h" + +#ifdef AMIGAWIN /* Whole file */ + +#include <proto/exec.h> +#include <proto/graphics.h> +#include <proto/intuition.h> + +struct GfxBase *GfxBase; +struct IntuitionBase *IntuitionBase; + +struct Screen *Scr; +struct Window *Win; + +struct BitMap tempbm; +struct RastPort temprp; + +UBYTE *linearray; + +int scaledwidth = 0; +int scaledheight = 0; + +#ifndef scalefactor +#define scalefactor 1 +#endif + +/* + * The configuration `mf.mcf' of AmiWeb2C holds values for `screenwidth' + * and `screendepth' that always refer to an InterLace screen. In case + * you open the display on a non-InterLaced screen, only half the lines + * are shown to you. This is automatically done by reading the screen + * information and setting `lacefactor'. + */ +int lacefactor; + +#define BACKGROUNDCOLOR 0 +#define PENCOLOR 1 + +#define PUBSCREEN 0 + +/* + * Allocating memory for the array used in `WritePixelLine' needs + * WORD-aligned arguments. + */ +#define ALIGN_SIXTEEN_BIT(A) ((((A)+15)/16)*16) +#ifndef min +#define min(a,b) ((a)<(b)?(a):(b)) +#endif + +/* + * CLOSE_ALL: Clean up on MetaFont termination. This routine has to be + * called just before leaving the program, which is done automatically + * when it gets entered into the `atexit' function list. (See below.) + */ +void close_all(void) +{ + if (linearray) free(linearray); + if (tempbm.Planes[0]) FreeRaster(tempbm.Planes[0], scaledwidth, 1); + if (Win) CloseWindow(Win); + if (GfxBase) CloseLibrary((struct Library *)GfxBase); + if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase); + +} /* close_all() */ + +#include <mfdisplay.h> + +/* + * INITSCREEN: Initialize the physical display window on the WorkBench + * screen of the Commodore Amiga. Open the necessary libraries and open + * the window according to `screenwidth' and `screendepth' as given in + * the configuration file `mf.mcf'. For this purpose, the + * `OpenWindowTagList' routine was replaced with `OpenWindowTags'. + * The `WFLG_SIZEGADGET' window flag has been removed; resizing the + * window kills the picture and never triggered an `updatescreen'. + */ +int mf_amiga_initscreen(void) +{ +#ifdef DEBUG + printf("\ninitscreen()\n"); +#endif + + /* + * Make sure the resources are correctly returned to the system + * when leaving the program. + */ + if(atexit(&close_all)) { /* Can't happen. */ + fprintf(stderr, "Exit trap failure! (close_all)\n"); + uexit(1); + } + + if (!(IntuitionBase = (struct IntuitionBase *) + OpenLibrary((unsigned char *)"intuition.library",(unsigned long)37L))) + { + fprintf(stderr,"\nCan't open intuition library. V37 required.\n"); + close_all(); + return(FALSE); + } + + if (!(GfxBase = (struct GfxBase *) + OpenLibrary((unsigned char *)"graphics.library",(unsigned long)37L))) + { + fprintf(stderr,"\nCan't open intuition library. V37 required.\n"); + close_all(); + return(FALSE); + } + + if (!(Scr = LockPubScreen(PUBSCREEN))) + { + fprintf(stderr, + "\nCan't get lock on public screen (%d).\n", PUBSCREEN); + close_all(); + return(FALSE); + } + + scaledwidth = screenwidth/scalefactor; + scaledheight = screendepth/scalefactor; + + lacefactor = ((Scr->ViewPort.Modes & LACE) ? 1 : 2); + + if (!(Win = (struct Window *)OpenWindowTags( NULL, + WA_InnerWidth, scaledwidth, + WA_InnerHeight, scaledheight/lacefactor, + WA_Flags, WFLG_DRAGBAR|WFLG_DEPTHGADGET, + WA_AutoAdjust, FALSE, + WA_Title, (ULONG)" MetaFont V2.718281 Online Display", + WA_PubScreen, (ULONG)Scr, + TAG_DONE))) + { + + fprintf(stderr, + "\nCan't open online display window at size %d times %d.\n" +#ifdef VARMEM + "Change your configuration file.\n", +#else + "If you really absolutely need more capacity,\n" + "you can ask a wizard to enlarge me.\n", +#endif + screenwidth,screendepth); + + close_all(); + return(FALSE); + } + + InitBitMap(&tempbm, 1, scaledwidth, 1); + + tempbm.Planes[0] = NULL; + + if(!(tempbm.Planes[0] = (PLANEPTR)AllocRaster(scaledwidth, 1))) + return(FALSE); + + InitRastPort(&temprp); + + temprp.BitMap = &tempbm; + + if(!(linearray = (UBYTE *) + calloc(ALIGN_SIXTEEN_BIT(scaledwidth),sizeof(UBYTE)))) + return(FALSE); + + UnlockPubScreen(NULL, Scr); + +#ifdef DEBUG + printf("initscreen() ok\n"); +#endif + + return(TRUE); + +} /* mf_amiga_initscreen() */ + +/* + * UPDATESCREEN: I really don't know what this function is supposed + * to do. + */ +void mf_amiga_updatescreen(void) +{ +#ifdef DEBUG + printf("updatescreen()\n"); +#endif +} /* mf_amiga_update_screen() */ + +/* + * BLANKRECTANGLE: Reset the drawing rectangle bounded by + * ([left,right],[top,bottom]) to the background color. + */ +void mf_amiga_blankrectangle(screencol left, screencol right, + screenrow top, screenrow bottom) +{ +#ifdef DEBUG + printf("blankrectangle() - left: %d right: %d top: %d bottom: %d\n", + left, right, top, bottom); +#endif + + SetAPen (Win->RPort, BACKGROUNDCOLOR); + RectFill(Win->RPort, + (SHORT)(Win->BorderLeft + left/scalefactor), + (SHORT)(Win->BorderTop + top/(scalefactor*lacefactor)), + (SHORT)(Win->BorderLeft + right/scalefactor - 1), + (SHORT)(Win->BorderTop + bottom/(scalefactor*lacefactor) - 1)); +} /* mf_amiga_blankrectangle() */ + +/* + * PAINTROW: Paint a `row' starting with color `init_color', up to the + * next transition specified by `transition_vector', switch colors, and + * continue for `vector_size' transitions. It now only + * draws into the display window when a new raster line will be affected. + * A lot of pre-drawing and inter-drawing calculations and conditionals + * are evaluated to prepare a fast and clean drawing under the most + * circumstances to be expected on the Amiga. InterLace/Lace is taken + * care of and the sizes are set appropriately not to clobber the borders. + * (Don't ask me why this works; at least on my machine with my config.) + */ +void mf_amiga_paintrow(screenrow row, pixelcolor init_color, + transspec transition_vector, screencol vector_size) +{ + int start, scaledstart, scaledrow, scaledlaced; + register int i=0, j=0, col, color; + +#ifdef DEBUG + printf("paintrow() - vector size: %d\n", vector_size); +#endif + + color = ((0 == init_color) ? BACKGROUNDCOLOR : PENCOLOR); + scaledlaced = scalefactor * lacefactor; + start = *transition_vector++; + scaledstart = start / scalefactor; + scaledrow = row / scaledlaced; + + ReadPixelLine8(Win->RPort, Win->BorderLeft + scaledstart, + Win->BorderTop + scaledrow, scaledwidth - scaledstart, + linearray, &temprp); + + if(scalefactor>1) { + + do { + for(col = *transition_vector++; i<col-start; i++) { + linearray[j] |= color; + if((i%scalefactor)==0) j++; + } + + color = PENCOLOR - color; + +#ifdef DEBUG + printf("move col: %d row: %d ", col, row); + printf("draw col: %d row: %d\n", (*transition_vector)-1, row); +#endif + + } while (--vector_size); + + if(i >= col-start) linearray[++j] |= color; + + } else { + + do { + for(col = *transition_vector++; j<col-start; j++) { + linearray[j] |= color; + } + + color = PENCOLOR - color; + +#ifdef DEBUG + printf("move col: %d row: %d ", col, row); + printf("draw col: %d row: %d\n", (*transition_vector)-1, row); +#endif + + } while (--vector_size); + } + + if( ( Win->BorderTop + scaledrow ) < + ( Win->Height - Win->BorderBottom ) ) + WritePixelLine8(Win->RPort, Win->BorderLeft + scaledstart, + Win->BorderTop + scaledrow, + min(Win->Width - Win->BorderLeft - Win->BorderRight - scaledstart,j), + linearray, &temprp); + +} /* mf_amiga_paintrow() */ + +#else +int amiga_dummy; +#endif /* AMIGAWIN */ diff --git a/Build/source/texk/web2c/window/epsf.c b/Build/source/texk/web2c/window/epsf.c new file mode 100644 index 00000000000..e5ed8e55c43 --- /dev/null +++ b/Build/source/texk/web2c/window/epsf.c @@ -0,0 +1,178 @@ +/* + * epsf.c -- Encapsulated PostScript window server. + * Copyright (C) 1998 Mathias Herberts <herberts@infini.fr> + * + * These functions generate an Encapsulated PostScript File + * representing the graphics normally shown online. They are + * selected by setting MFTERM to epsf. + * + * The name of the file defaults to metafont.eps but can be + * changed by setting the MFEPSF environment variable. + * + * The file is closed when the program exits. + */ + +/* + * This library 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 2 of + * the License, or (at your option) any later version. + * + * This library 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 library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + + + +#define EXTERN extern + +#include "../mfd.h" + +#ifdef EPSFWIN + +#include <stdio.h> + +static FILE * psout = NULL; + +/* + * Arrays epsf_{left,right,top,bottom} hold the coordinates of + * open windows. + * + * When a new window is opened, i.e. when blankrectangle is + * called, we check the arrays to see if the blank rectangle + * clears an open window. If it is the case a showpage and an %%EOF is + * appended To the PostScript file and a new header is output thus + * making it easy to separate the pages. + * + * The last page of the file is not terminated by a showpage and + * an %%EOF, the user should add them himself. + * + */ + +static screencol epsf_left[16]; +static screencol epsf_right[16]; +static screenrow epsf_top[16]; +static screenrow epsf_bottom[16]; + +static short epsf_window = 0; +static unsigned int epsf_page = 1; + +void +mf_epsf_header () +{ + fprintf (psout, "%%!PS-Adobe-3.0 EPSF-3.0\n"); + fprintf (psout, "%%%%BoundingBox: -1 -1 %d %d\n", screenwidth, screendepth); + fprintf (psout, "%%%%Creator: METAFONT\n"); + fprintf (psout, "%%%%Page: %d %d\n\n", epsf_page, epsf_page); + fprintf (psout, "1 dup scale\n"); + fprintf (psout, "1 setlinewidth\n\n"); + + epsf_page++; +} + +#include <mfdisplay.h> + +int +mf_epsf_initscreen (void) +{ + if (getenv ("MFEPSF") != (char *) NULL) + { + psout = fopen ((char *) getenv ("MFEPSF"), "w"); + } + else + { + psout = fopen ("metafont.eps", "w"); + } + + if (psout == (FILE *) NULL) + { + return 0; + } + else + { + mf_epsf_header (); + epsf_window = 0; + return 1; + } +} + +void +mf_epsf_updatescreen (void) +{ + fflush (psout); +} + +void +mf_epsf_blankrectangle (screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + int i; + + for (i = 0; i < epsf_window; i++) + { + if (! ((right - 1 < epsf_left[i]) || (epsf_right[i] < left)) ) /* new window is neither left nor right of window i */ + if ( ! ((top > epsf_bottom[i]) || (epsf_top[i] > bottom - 1))) /* new window is neither below nor above window i */ + { + fprintf (psout, "\nshowpage\n%%%%EOF\n"); + mf_epsf_header (); + epsf_window = 0; + break; + } + } + + epsf_left[epsf_window] = left; + epsf_right[epsf_window] = right - 1; + epsf_top[epsf_window] = top; + epsf_bottom[epsf_window] = bottom - 1; + + epsf_window++; + + fprintf (psout, "1 setgray %d %d %d %d rectfill 0 setgray\n", left, screendepth - 1 - bottom, right - left, bottom - top); + + fflush (psout); +} + + +void +mf_epsf_paintrow (screenrow row, + pixelcolor init_color, + transspec transition_vector, + screencol vector_size) +{ + int col; + int color; + + color = (init_color == 0) ? 1 : 0; + + do + { + col = *transition_vector++; + + if (!color) + { + fprintf (psout, "newpath %d %d moveto %d %d lineto stroke\n", + col, + screendepth - 1 - row, + *transition_vector, + screendepth - 1 - row); + } + + color = (color == 0) ? 1 : 0; + } + while (--vector_size > 0); +} + + +#else /* !EPSFWIN */ + +int epsf_dummy; + +#endif /* !EPSFWIN */ diff --git a/Build/source/texk/web2c/window/hp2627.c b/Build/source/texk/web2c/window/hp2627.c new file mode 100644 index 00000000000..a3526e65865 --- /dev/null +++ b/Build/source/texk/web2c/window/hp2627.c @@ -0,0 +1,254 @@ +/* + * HP2627 Terminal Window interface to Unix Metafont. + */ + +#define EXTERN extern +#include "../mfd.h" + +#ifdef HP2627WIN + +#include <stdio.h> + +/* + * HP2627a Color Graphics Terminal: Escape code definitions + * + * Drawing pen colors + */ +#define HP2627_BLACK '0' +#define HP2627_RED '1' +#define HP2627_GREEN '2' +#define HP2627_YELLOW '3' +#define HP2627_BLUE '4' +#define HP2627_MAGENTA '5' +#define HP2627_CYAN '6' +#define HP2627_WHITE '7' + +/* + * Initialization: just do a hard graphics reset + * (then we can depend on the defaults + * being as we want them) + */ +#define HP2627_INITSTRING "\033*wR" +#define HP2627_INITSTRINGLEN 4 + +/* + * We want the text to be visible over both background and forground + * graphics data; the best color combination I found for this + * was to set the background RED and then paint with BLUE, + * although the eye doesn't focus on BLUE very well (black + * might be better? Or green? [to get in the holiday mood]) + */ +#define HP2627_BACKGROUNDPEN HP2627_RED +#define HP2627_FOREGROUNDPEN HP2627_BLUE + +static char mf_hp2627_pencolors[2] = { + HP2627_BACKGROUNDPEN, /* white */ + HP2627_FOREGROUNDPEN /* black */ +}; + +/* + * Screen dimensions: Note the origin is at the lower-left corner, + * not the upper left as MF expects - hence we need to translate. + */ +#define HP2627_MAXX 511 +#define HP2627_MAXY 389 + +/* + * The actual Graphics routines. Note that these are highly tty + * dependent so I can minimize the number of characters that + * need to be sent to paint an image, since we only talk to + * the HP at 9.6Kb. + */ + +/* + * function init_screen: boolean; + * + * Return true if window operations legal. + * We always return true (I suppose we could try to + * sense status or something masochistic like that) + */ + +#include <mfdisplay.h> + +int mf_hp2627_initscreen(void) +{ + (void) fflush(stdout); /* make sure pascal-level output flushed */ + (void) write(fileno(stdout), HP2627_INITSTRING, HP2627_INITSTRINGLEN); + return(1); +} + +/* + * procedure updatescreen; + * + * Just make sure screen is ready to view + * (since we do Unix-level WRITE()s, + * we don't really need to flush stdio, + * but why not?) + */ + +void mf_hp2627_updatescreen(void) +{ + (void) fflush(stdout); +} + +/* + * procedure blankrectangle(left, right, top, bottom: integer); + * + * reset rectangle bounded by ([left,right],[top,bottom]) + * to background color + */ + +void mf_hp2627_blankrectangle (screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + char sprbuf[128]; + + (void) sprintf(sprbuf, "\033*m%cx%d,%d %d,%dE", HP2627_BACKGROUNDPEN, + left, HP2627_MAXY-bottom, + right, HP2627_MAXY-top); + (void) write(fileno(stdout), sprbuf, strlen(sprbuf)); +} + +/* + * procedure paintrow( + * row: screenrow; + * init_color: pixelcolor; + * var trans_vector: transspec; + * vector_size: screencol ); + * + * Paint "row" starting with color "init_color", up to next + * transition specified by "transition_vector", switch colors, + * and continue for "vector_size" transitions. + */ + +/* + * First some useful definitions: + */ +#define ASCIILABS 0 /* plot cmd format: ASCII long abs */ +#define BINLABS 1 /* plot cmd format: BINARY long abs */ +#define BINSINC 2 /* plot cmd format: BINARY short incr */ + +#define ABS(x) ((x>=0)?x:-x) /* absolute value */ + +/* + * An optimized "move to (x,y), with current pen lowered unless UP is + * true" function. Takes advantage of short commands for short + * movements to minimize character traffic to term. + * + * Note: the "x -= 1;" fudge is because we only want to DRAW + * to the next transition_vector entry - 1, but if we + * have the pen raised, we want to move to exactly the + * next point. + */ +#define MOVETO(x,y,up) \ + if (up) *op++ = 'a'; \ + else x -= 1; \ + if (ABS(x-oldx) < 16 && ABS(y-oldy) < 16) { \ + if (currentformat != BINSINC) { \ + *op++ = 'j'; \ + currentformat = BINSINC; \ + } \ + *op++ = (((x-oldx) & 0x1f) + ' '); \ + *op++ = (((y-oldy) & 0x1f) + ' '); \ + } else { \ + if (currentformat != BINLABS) { \ + *op++ = 'i'; \ + currentformat = BINLABS; \ + } \ + *op++ = (((x&0x3e0)>>5)+' '); \ + *op++ = ((x&0x01f) +' '); \ + *op++ = (((y&0x3e0)>>5)+' '); \ + *op++ = ((y&0x01f) +' '); \ + } \ + oldx = x; \ + oldy = y; + +void mf_hp2627_paintrow (screenrow row, + pixelcolor init_color, + transspec transition_vector, + screencol vector_size) +{ + register color; + char outbuf[512*6]; /* enough to hold an alternate color */ + /* in each column */ + register char *op; + register x, y, oldx, oldy; + int currentformat; + + color = (init_color == 0)? 0 : 1; + + /* + * We put all escape sequences in a buffer so the write + * has a chance of being atomic, and not interrupted by + * other independent output to our TTY. Also to avoid + * (literally millions) of stdio calls. + */ + op = outbuf; + /* + * Select current pen to be the color of the first segment: + * + * our strategy here is to paint a long line from the first + * transition_vector value (left edge of row) to the last + * transition_vector entry (right edge of row). Then we switch + * colors to the contrasting color, and paint alternate + * segments with that color. Would that the HP2627 would provide + * a mode to paint the "background" color while the PEN is lifted. + * However, this is faster than using rectangular area fills. + */ + + *op++ = '\033'; *op++ = '*'; *op++ = 'm'; + *op++ = mf_hp2627_pencolors[color]; + *op++ = 'X'; + + /* + * Reset our "remembered" state for (X,Y) positioning and plot + * command format + */ + oldx = oldy = -999; + currentformat = ASCIILABS; + + /* + * Now, paint across the entire width of this row, make it the + * initial segment color. + */ + x = *transition_vector; + y = HP2627_MAXY-row; + *op++ = '\033'; *op++ = '*'; *op++ = 'p'; + MOVETO(x,y,1); + x = transition_vector[vector_size]; + MOVETO(x,y,0); + *op++ = 'Z'; + + /* + * If there remain other segments (of contrasting color) to paint, + * switch pens colors and draw them + */ + if (--vector_size > 0) { + *op++ = '\033'; *op++ = '*'; *op++ = 'm'; + *op++ = mf_hp2627_pencolors[1-color]; *op++ = 'X'; + color = 1-color; + + oldx = oldy = -999; + currentformat = ASCIILABS; + *op++ = '\033'; *op++ = '*'; *op++ = 'p'; + x = *++transition_vector; + MOVETO(x,y,1); + while (vector_size-- > 0) { + x = *++transition_vector; + MOVETO(x,y,(color==init_color)); + color = 1 - color; + }; + *op++ = 'Z'; + }; + + /* + * Write the resulting plot commands, hopefully atomically + */ + (void) write(fileno(stdout), outbuf, op-outbuf); +} + +#else +int hp2627_dummy; +#endif /* HP2627WIN */ diff --git a/Build/source/texk/web2c/window/mfdisplay.h b/Build/source/texk/web2c/window/mfdisplay.h new file mode 100644 index 00000000000..a1a0cbc2ace --- /dev/null +++ b/Build/source/texk/web2c/window/mfdisplay.h @@ -0,0 +1,24 @@ +/* mfdisplay.h: include file for Metafont display routines. + + This file is public domain. */ + +#define MF_DISPLAY_PROTOS(x) \ +extern int mf_ ## x ## _initscreen (void); \ +extern void mf_ ## x ## _updatescreen (void); \ +extern void mf_ ## x ## _blankrectangle (screencol, screencol, screenrow, screenrow); \ +extern void mf_ ## x ## _paintrow (screenrow, pixelcolor, transspec, screencol); + +MF_DISPLAY_PROTOS(amiga) +MF_DISPLAY_PROTOS(epsf) +MF_DISPLAY_PROTOS(hp2627) +MF_DISPLAY_PROTOS(mftalk) +MF_DISPLAY_PROTOS(next) +MF_DISPLAY_PROTOS(regis) +MF_DISPLAY_PROTOS(sun) +MF_DISPLAY_PROTOS(tektronix) +MF_DISPLAY_PROTOS(uniterm) +MF_DISPLAY_PROTOS(win32) +MF_DISPLAY_PROTOS(x11) +MF_DISPLAY_PROTOS(trap) + +#undef MF_DISPLAY_PROTOS diff --git a/Build/source/texk/web2c/window/mftalk.c b/Build/source/texk/web2c/window/mftalk.c new file mode 100644 index 00000000000..880b0b8c34f --- /dev/null +++ b/Build/source/texk/web2c/window/mftalk.c @@ -0,0 +1,275 @@ +/* mftalk.c -- generic Metafont window server. + Copyright (C) 1994 Ralph Schleicher + Slightly modified for Web2c 7.0 by Karl Berry. + Further modifications for Web2C 7.2 by Mathias.Herberts@irisa.fr */ + +/* This library 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 2 of + the License, or (at your option) any later version. + + This library 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 library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Please remember the following for porting to UNIX: + + pid = fork (); + if (pid == 0) + execve (...); pid = spawnve (mode, ...); + else if (pid == -1) if (pid == -1) + error (); error (); + else else + success (); success (); + + Spawnve(2) has many different modes and a `session' is indicated by + running on an extra terminal. */ + + +#define EXTERN extern +#include "../mfd.h" + +#ifdef MFTALKWIN + +#undef input +#undef output +#undef read +#undef write +#ifdef OS2 +#include <sys/param.h> +#include <process.h> +extern int close (int); +extern int pipe (int *); +extern int read (int, void *, size_t); +extern int setmode (int, int); +extern int write (int, const void *, size_t); +#endif +#include <fcntl.h> +#include <signal.h> +#include <kpathsea/variable.h> +#include "mftalk.h" + +/* We use SIGCHLD, but fall back on SIGCLD if that's all we have. */ +#if !defined (SIGCHLD) && defined (SIGCLD) +#define SIGCHLD SIGCLD +#endif + +#define fatal(func, cond) do { if (cond) FATAL_PERROR ("perror"); } while (0) + +static RETSIGTYPE child_died (int sig); +static string app_type (char *prog, int *app); + +static int pid = -1; /* Process ID of our child. */ +static int win = -1; /* Write handle to the `window'. */ +static int buf[8]; /* Temporary buffer. */ +static RETSIGTYPE (*old) (); /* Old signal handler. */ + + +#include <mfdisplay.h> + +int +mf_mftalk_initscreen (void) +{ + int app; /* Client application type. */ + char *prog, *name; /* Client program name. */ + /* Size of METAFONT window. */ + char height[MAX_INT_LENGTH], width[MAX_INT_LENGTH]; + /* Inherited pipe handles. */ + char input[MAX_INT_LENGTH], output[MAX_INT_LENGTH]; + char parent[MAX_INT_LENGTH]; /* My own process ID. */ + int sc_pipe[2]; /* Server->Client pipe. */ + int cs_pipe[2]; /* Client->Server pipe. */ + int res, ack; /* Wait until child is ready. */ + + prog = kpse_var_value ("MFTALK"); + if (prog == NULL) + prog = "mftalk.exe"; + + name = app_type (prog, &app); + if (!name) + return 0; + + if (pipe (sc_pipe) == -1) + return 0; + if (pipe (cs_pipe) == -1) + { + close (sc_pipe[0]); + close (sc_pipe[1]); + return 0; + } +#ifdef OS2 + fatal (setmode, setmode (sc_pipe[0], O_BINARY) == -1); + fatal (setmode, setmode (sc_pipe[1], O_BINARY) == -1); + fatal (setmode, setmode (cs_pipe[0], O_BINARY) == -1); + fatal (setmode, setmode (cs_pipe[1], O_BINARY) == -1); +#endif + + old = signal (SIGCHLD, child_died); + fatal (old, old == SIG_ERR); + + sprintf (height, "-h%d", screendepth); + sprintf (width, "-w%d", screenwidth); + sprintf (input, "-i%d", sc_pipe[0]); + sprintf (output, "-o%d", cs_pipe[1]); + sprintf (parent, "-p%d", getpid ()); + +#ifdef OS2 + pid = spawnl (app, name, prog, height, width, input, output, parent, NULL); +#else + pid = fork (); + if (pid == 0) + { + fatal (close, close (0) == -1); + fatal (dup, dup (sc_pipe[0]) != 0); + fatal (close, close (sc_pipe[0]) == -1); + fatal (close, close (sc_pipe[1]) == -1); + fatal (close, close (1) == -1); + fatal (dup, dup (cs_pipe[1]) != 1); + fatal (close, close (cs_pipe[0]) == -1); + fatal (close, close (cs_pipe[1]) == -1); + + /* We still pass the file handles as parameters for + * backward compatibility. instead of sc_pipe[0] and + * cs_pipe[1] we just pass 0 (stdin) and 1 (stdout). + */ + + sprintf (input, "-i0"); + sprintf (output, "-o1"); + + execl (name, prog, height, width, input, output, parent, NULL); + } +#endif /* not OS2 */ + switch (pid) + { + case -1: + failure: + fatal (close, close (sc_pipe[0]) == -1); + fatal (close, close (sc_pipe[1]) == -1); + fatal (close, close (cs_pipe[0]) == -1); + fatal (close, close (cs_pipe[1]) == -1); + fatal (signal, signal (SIGCHLD, old) == SIG_ERR); + break; + default: + res = read (cs_pipe[0], &ack, sizeof (int)); + if (res != sizeof (int) || ack != MF_ACK) + goto failure; + fatal (close, close (cs_pipe[0]) == -1); + win = sc_pipe[1]; + break; + } + + return (win == -1) ? 0 : 1; +} + + +void +mf_mftalk_updatescreen (void) +{ + buf[0] = MF_FLUSH; + write (win, buf, sizeof (int)); +} + + +void +mf_mftalk_blankrectangle (screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + buf[0] = MF_RECT; + buf[1] = MF_WHITE; + buf[2] = left; + buf[3] = bottom; + buf[4] = right; + buf[5] = top; + + write (win, buf, 6 * sizeof (int)); +} + + +void +mf_mftalk_paintrow (screenrow row, + pixelcolor init_color, + transspec transition_vector, + screencol vector_size) +{ + buf[0] = MF_LINE; + buf[1] = init_color == 0 ? MF_WHITE : MF_BLACK; + buf[2] = *transition_vector++; + buf[3] = row; + buf[4] = --vector_size; + + write (win, buf, 5 * sizeof (int)); + write (win, transition_vector, vector_size * sizeof (int)); +} + + +static string +app_type (string prog, int *app) +{ +#ifdef OS2 + int res, app; + + res = DosSearchPath (0x02 | 0x01, "PATH", prog, buf, len); + if (res != 0) + return -1; + + res = DosQueryAppType (buf, &app); + if (res != 0) + return -1; + + switch (app & 0x07) /* Quick guess. */ + { + case 0x00: return (P_SESSION | P_DEFAULT); + case 0x01: return (P_SESSION | P_FULLSCREEN); + case 0x02: return (P_SESSION | P_WINDOWED); + case 0x03: return (P_PM); + } +#endif /* OS2 */ + + *app = 0; /* Irrelevant. */ + return prog; +} + + +static RETSIGTYPE +child_died (int sig) +{ +#ifdef OS2 + fatal (signal, signal (sig, SIG_ACK) == SIG_ERR); +#endif + fatal (signal, signal (sig, SIG_IGN) == SIG_ERR); + + if (pid == -1 || kill (-pid, 0) == 0) /* This was not our child. */ + { + if (old != SIG_IGN) + { + fatal (signal, signal (sig, old) == SIG_ERR); + fatal (raise, raise (sig) == -1); + } + fatal (signal, signal (sig, child_died) == SIG_ERR); + } + else + { + close (win); /* This may fail. */ + win = -1; + + pid = -1; + + screenstarted = false; /* METAFONT variables. */ + screenOK = false; + + fatal (signal, signal (sig, old) == SIG_ERR); + } +} + +#else /* !MFTALKWIN */ + +int mftalk_dummy; + +#endif /* !MFTALKWIN */ diff --git a/Build/source/texk/web2c/window/mftalk.h b/Build/source/texk/web2c/window/mftalk.h new file mode 100644 index 00000000000..0c0b8fe0603 --- /dev/null +++ b/Build/source/texk/web2c/window/mftalk.h @@ -0,0 +1,43 @@ +/* mftalk.h -- METAFONT server/client protocol (not as complex as + it sounds). + + Copyright (C) 1994 Ralph Schleicher */ + +/* This library 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 2 of + the License, or (at your option) any later version. + + This library 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 library; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#ifndef MFTALK_H +#define MFTALK_H + +/* This is the server to client protocol: + + 'r' [0|1] <left> <bottom> <right> <top> Fill rectangle. + 'l' [0|1] <col> <row> <num> <col> ... Draw a line. + 'f' Update screen. + ^D End of transmission. + + And there is one client to server command: + + ^F Acknowledgment. */ + +#define MF_RECT ((int) 'r') +#define MF_LINE ((int) 'l') +#define MF_FLUSH ((int) 'f') +#define MF_EXIT ((int) ('D' - 64)) +#define MF_ACK ((int) ('F' - 64)) + +#define MF_WHITE 0 +#define MF_BLACK 1 + +#endif /* !MFTALK_H */ diff --git a/Build/source/texk/web2c/window/next.c b/Build/source/texk/web2c/window/next.c new file mode 100644 index 00000000000..abc4ba62ccb --- /dev/null +++ b/Build/source/texk/web2c/window/next.c @@ -0,0 +1,179 @@ +/* next.c: display interface for the NeXT, joe@rilgp.tamri.com. + +This device code requires a second program ("DrawingServant") to +act as the interface between sm and the WindowServer. The second program +just serves to listen for commands on a pipe, but otherwise +send everything else with a DPSPrintf to the WindowServer. The servant can +also do things like implement it's own event loop and handle things +like printing, saving .eps and the like. This seems (to me) to be the +best way to put a multiplatform program into a NeXT application. + +You can get DrawingServant from sonata.cc.purdue.edu. +*/ + +/* with not too much work, the client side of things probably +could be on another machine */ +#define EXTERN extern +#include "../mfd.h" + +#ifdef NEXTWIN /* the whole file */ +#define DRAWSERVER "DrawingServant" +#define DEFWIDTH 400 /* default width and height */ +#define DEFHEIGHT 500 + +/*these default values are taken from plain.mf +and are used if we can't see anything better */ +static int nextheight=DEFHEIGHT; +static int nextwidth=DEFWIDTH; +static int outpipe[2],inpipe[2]; +static int pid; +static int nextscreenlooksOK = 0; +char outstring[1024]; /* the longest string pushed though a pipe */ +/* these are used a lot, so macro-ize these two lines */ +#define SENDPS write(outpipe[1],outstring,strlen(outstring)+1) +#define GETACK do{\ + read(inpipe[0],outstring,sizeof(outstring)-1);\ + } while(strncmp(outstring,"Ok",2)) +#ifdef read +#undef read +#endif + +#include <mfdisplay.h> + +int mf_next_initscreen(void) +{ + int i; + void mf_next_closescreen(); + /* strings for height, width, in and out pipes */ + char hstr[20],wstr[20],instr[20],outstr[20]; + + /* I should figure out how to use screen_rows and screen_cols + to size the window. what I think I need is one of leftcol,rightcol + toprow and botrow. Let's find the first which is non-zero, + at least until someone tells me what the real answer is.*/ + + for(i=0;i<16;i++) { + if((leftcol[i]-rightcol[i]) && (toprow[i]-botrow[i])) { + nextwidth = rightcol[i]-leftcol[i]; + nextheight = botrow[i]-toprow[i]; + break; + } + } + + /* fork a process and assign some pipes. return if unsuccessful */ + if( pipe(outpipe)== -1) + return 0; + if( pipe(inpipe)== -1) + return 0; + if( (pid=fork())== -1) + return 0; + + if(pid==0) { + /* things done by the child. we pass it height,width and + input and output pipes */ + sprintf(hstr,"h %d ",nextheight); + sprintf(wstr,"w %d ",nextwidth); + sprintf(outstr,"i %d",outpipe[0]); + sprintf(instr,"o %d",inpipe[1]); + execl(DRAWSERVER,DRAWSERVER,hstr,wstr,instr,outstr,0); + exit(0); + } + sprintf(outstring,"initgraphics\n"); + SENDPS; + GETACK; + nextscreenlooksOK = 1; + + /* The prior version used a hacked version of uexit to kill the + server...at the urging of karl berry, here is a more legit way to + kill the server */ + atexit(*mf_next_closescreen); + + return 1; +} +/* + * void updatescreen; + * does nothing + * + */ +void mf_next_updatescreen(void) +{ +} +/* + * void blankrectangle(int left,int right,int top,int bottom); + * + * blank out a port of the screen. + */ +void mf_next_blankrectangle (screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + + if(left==0 && top==nextheight && right==nextwidth && bottom==0 ) { + /* clear and forgets PS strings */ + sprintf(outstring,"DSclear"); + } else { + sprintf(outstring, + " 1 setgray %d %d %d %d rectfill 0 setgray \n", + left+1,top+1,right,bottom+1); + } + SENDPS; + GETACK; +} + +/* + * void paintrow(int row,int init_color,int transition_vector, + * int vector_size); + * + * Paint "row" starting with color "init_color", up to next + * transition specified by "transition_vector", switch colors, + * and continue for "vector_size" transitions. + */ +void mf_next_paintrow (screenrow row, + pixelcolor init_color, + transspec transition_vector, + screencol vector_size) +{ + int i,whereami; + if(init_color) { + init_color = 1; + } else { + init_color = 0; + } + whereami = 0; + + for(i=0;i<vector_size;i++) { + if(init_color) { + sprintf(outstring+whereami, + "newpath %d %d moveto %d %d lineto stroke ", + transition_vector[i],nextheight-row, + transition_vector[i+1],nextheight-row); + whereami = strlen(outstring); + /* buffering is good. perhaps. */ + if(whereami > 500) { + SENDPS; + GETACK; + *outstring = 0; + whereami = 0; + } + } + init_color = 1-init_color; + } + if(whereami) { + SENDPS; + GETACK; + } +} +/* this isn't part of the online display routines. We need it to +kill DrawingServant. This is called during exit */ +void mf_next_closescreen(void) +{ + if(nextscreenlooksOK) { + sprintf(outstring,"DSquit"); + SENDPS; + } +} + +#else +int next_dummy; +#endif /* NEXTWIN */ diff --git a/Build/source/texk/web2c/window/regis.c b/Build/source/texk/web2c/window/regis.c new file mode 100644 index 00000000000..196ba946ef5 --- /dev/null +++ b/Build/source/texk/web2c/window/regis.c @@ -0,0 +1,107 @@ +/* Regis terminal window interface for Metafont, joe@rilgp.tamri.com. + screen_rows is 480; screen_cols is 800. */ + +#define EXTERN extern +#include "../mfd.h" + +#ifdef REGISWIN /* Whole file */ + +#define ESCAPE 27 + +/* set this up in one of two ways. if defined, display is white characters +on a black background; undefined is the opposite */ +#undef WRITEWHITE + +#include <mfdisplay.h> + +/* + * int init_screen + * Put screen in graphics mode:<ESC>Pp + * Write no or both planes for the background black:S(I0) + * Write both or no planes for the forground white:W(I3) + * Erase screen:S(E) + * Return to alpha mode: <ESC>\ + * + * Assuming that the speed limitation is a serial line to the + * terminal, we want to define macros for the most common + * character combinations. + * Define macros for ,+0]P[ (call this "p") and + * ,+0]V[ (this one is called "v"). + * drawing a line is 4+(2 to 6) characters + * We always return true. + */ + +int mf_regis_initscreen(void) +{ +#ifdef WRITEWHITE + printf("%cPpS(I0)W(I3)S(E)%c",ESCAPE,ESCAPE); +#else + printf("%cPpS(I3)W(I0)S(E)%c",ESCAPE,ESCAPE); +#endif + printf("%cPp@:p,+0]P[@;@:v,+0]V[@;",ESCAPE); + return 1; +} +/* + * procedure updatescreen; + * + */ +void mf_regis_updatescreen(void) +{ +} + /* void blankrectangle(int left,int right,int top,int bottom); + * + * Go to graphics mode: <ESC>Pp + * Move to lower left: P[%d,%d] + * Write no or both planes: W(I0) + * Turn on shading: W(S1) + * Vector to lower right, upper right, upper left, lower left: V's + * Turn off shading: W(S0) + * Write both or no planes: W(I3) + * Return to alpha mode: <ESC>\ + */ +void mf_regis_blankrectangle (screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + printf( +#ifdef WRITEWHITE + "%cPpP[%d,%d]W(I0)W(S1)V[%d,%d]V[%d,%d]V[%d,%d]V[%d,%d]W(S0)W(I3)%c\\", +#else + "%cPpP[%d,%d]W(I3)W(S1)V[%d,%d]V[%d,%d]V[%d,%d]V[%d,%d]W(S0)W(I0)%c\\", +#endif + ESCAPE,left,bottom,right,bottom,right,top,left,top, + left,bottom,ESCAPE); +} + +/* + * void paintrow(int row, int init_color, int* transition_vector, + * int vector_size); + * Paint "row" starting with color "init_color", up to next + * transition specified by "transition_vector", switch colors, + * and continue for "vector_size" transitions. + */ +void mf_regis_paintrow (screenrow row, + pixelcolor init_color, + transspec transition_vector, + screencol vector_size) +{ + int i; + if(init_color) { + init_color = 1; + } else { + init_color = 0; + } + printf("%cPpP[0,%d]P[",ESCAPE,row); + for(i=0;i<vector_size;i++) { + if(init_color) + printf("%d@v%d@p",transition_vector[i], + transition_vector[i+1]); + init_color = 1-init_color; + } + printf("+0,+0]%c\\",ESCAPE); +} + +#else +int regis_dummy; +#endif /* REGISWIN */ diff --git a/Build/source/texk/web2c/window/suntools.c b/Build/source/texk/web2c/window/suntools.c new file mode 100644 index 00000000000..fea24dd4c16 --- /dev/null +++ b/Build/source/texk/web2c/window/suntools.c @@ -0,0 +1,216 @@ +/* Link this to sun.c if you are running on a SunView system */ + +/* + * author = "Pierre MacKay (from the original by Paul Richards)" + * version = "0.5", + * date = "5 May 1991 - June 1992" + * filename = "sun_sunview.c", + * contact = "Pierre MacKay", + * email = "mackay@cs.washington.edu" + * Graphics window interface to Metafont for Suns running + * SunView (Sun Unix release 3.n) + * This code is essentially a translation from the old + * sun.c which used <suntool/gfxsw.h>. The model for the + * translation is the example in Appendix C (C.2.) of the + * Sunview 1 Programmer's guide as applied to bouncedemo.c + * There are nice additional benefits, such as a moveable + * and scalable graphics window, and the chance to see + * the controlling window while METAFONT is at work + * + * Destroy checking is bogus, and SunView does not clean up the mess + * if you "quit" from the pulldown menu. You will be left with + * an hysterical orphaned process screaming for a window that isn't + * there. You will have to go elsewhere and KILL that process. + * Otherwise it seems clean. + * + * For the moment this and the XView interface seem to be + * mutually exclusive, since they use library routines with + * the same names, which mightily confuses the loader. + * It doesn't help much to change the name of MFTERM since + * XView wants to name its own terminal "sun" just like + * the SunView terminal + */ + +#define EXTERN extern +#include "../mfd.h" + +#undef _POSIX_SOURCE +#ifdef SUNTOOLSWIN + +/* <sundev/cg9reg.h> wants to have a field named `reset'. Since we + don't need the WEB(2C) reset, no problem. */ +#undef reset + +#include <stdio.h> +#include <sys/types.h> +#include <suntool/sunview.h> +#include <suntool/canvas.h> + +static void repaint_proc(); +static void resize_proc(); + +static Notify_value mf_notice_destroy(); +extern Notify_error notify_dispatch(); + +static int destroy_ready; /* could be used for tighter control */ + +/* + * global handle on the graphics subwindow + */ + +struct MFsubwindow { + int mf_flags; +#define MF_RESTART 0x01 + struct pixwin *mf_pixwin; + struct rect mf_rect; + } sun_mf_subwin; /* Make sure that names storage is allocated. */ + +static struct MFsubwindow *metafont_sw = &sun_mf_subwin; /* window handle */ + +/* + * Gray background for graphics area + */ + +static short mf_graybackground_image[] = {0x5555, 0xaaaa}; + mpr_static(mf_sunview_gray_bkgr, 2, 2, 1, mf_graybackground_image); + + +Rect *rect; +Frame frame; +Canvas canvas; +Pixwin *pw; + +#include <mfdisplay.h> + +/* + * init_screen: boolean; return true if window operations legal + */ + +int +mf_sun_initscreen(void) +{ + frame = window_create(NULL,FRAME, + FRAME_LABEL, "METAFONT", + FRAME_SHOW_LABEL, TRUE, + WIN_ERROR_MSG, "! Window access requires METAFONT to run under suntools\n", + 0); + canvas = window_create(frame, CANVAS, + CANVAS_RESIZE_PROC, resize_proc, + CANVAS_FAST_MONO, TRUE, + WIN_ERROR_MSG, "Can't creat canvas", + 0); + pw = canvas_pixwin(canvas); + + metafont_sw->mf_pixwin = canvas_pixwin(canvas); + + /* interpose a destroy procedure so we can shut down cleanly */ + (void) notify_interpose_destroy_func(frame, mf_notice_destroy); + + /* + * Instead of using window_main_loop, just show the frame. + * Metafont's procedures will be in control, not the notifier. + */ + window_set(frame,WIN_SHOW, TRUE, 0); + + rect = (Rect *)window_get(canvas, WIN_RECT); /* Get current dimensions */ + pw_replrop(pw, + 0, 0, + rect->r_width, + rect->r_height, + PIX_SRC, + &mf_sunview_gray_bkgr, 0, 0); /* clear subwindow */ + + return(1); /* Caller expects a TRUE value */ +} + +/* + * updatescreen; -- just make sure screen is ready to view + */ + +void +mf_sun_updatescreen(void) +{ + (void)notify_dispatch(); +/* if (destroy_ready != 0) return; */ + rect = (Rect *)window_get(canvas, WIN_RECT); /* Get current dimensions */ + if (metafont_sw->mf_flags & MF_RESTART) { + metafont_sw->mf_flags &= ~MF_RESTART; + pw_replrop(pw, + 0, 0, + rect->r_width, + rect->r_height, + PIX_SRC, + &mf_sunview_gray_bkgr, 0, 0); /* clear subwindow */ + } +} + +/* + * blankrectangle: reset rectangle bounded by ([left,right],[top,bottom]) + * to background color + */ + +void +mf_sun_blankrectangle (screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + pw_writebackground(pw, left, top, + right-left+1, bottom-top+1, PIX_CLR); +} + +/* + * paintrow -- paint "row" starting with color "init_color", up to next + * transition specified by "transition_vector", switch colors, + * and continue for "vector_size" transitions. + */ + +void +mf_sun_paintrow (screenrow row, + pixelcolor init_color, + transspec transition_vector, + screencol vector_size) +{ + register col; + register color; + + (void)notify_dispatch(); + color = (init_color == 0)? 0 : 1; + + do { + col = *transition_vector++; + pw_vector(pw, + col, row, (*transition_vector)-1, row, + PIX_SRC, color); + color = 1 - color; + } while (--vector_size); +} + +static void +repaint_proc( /* Ignore args */ ) +{ + /* if repainting is required, just restart */ + metafont_sw->mf_flags |= MF_RESTART; +} + +static void +resize_proc( /* Ignore args */ ) +{ + metafont_sw->mf_flags |= MF_RESTART; +} + +static Notify_value +mf_notice_destroy(frame, status) + Frame frame; + Destroy_status status; +{ + if (status != DESTROY_CHECKING) { + destroy_ready = TRUE; + (void)notify_stop(); + } + return(notify_next_destroy_func(frame,status)); +} + +#else +int sunview_dummy; +#endif /* SUNTOOLSWIN */ diff --git a/Build/source/texk/web2c/window/tek.c b/Build/source/texk/web2c/window/tek.c new file mode 100644 index 00000000000..86b5108784c --- /dev/null +++ b/Build/source/texk/web2c/window/tek.c @@ -0,0 +1,149 @@ +/* Tektronix terminal window interface for Metafont. */ + +#define EXTERN extern +#include "../mfd.h" + +#ifdef TEKTRONIXWIN /* Whole file */ + +#define FORMFEED 12 +#define ESCAPE 27 +#define GS 29 +#define US 31 +#ifndef TRUE +#define TRUE 1 +#endif +#ifndef FALSE +#define FALSE 0 +#endif +#define WIDTH 1024 /* Screen width */ +#define HEIGHT 780 /* Screen height */ +#define WIDTHINBYTES (WIDTH/8) /* Only works if WIDTH % 8 == 0 */ +#define SETBIT(row,col) screen_pixel[row*WIDTHINBYTES+col/8] |= 1 << 7-col%8 +#define CLEARBIT(row,col) screen_pixel[row*WIDTHINBYTES+col/8] &= \ + ~(1 << 7-col%8) +#define ISSET(row,col) (screen_pixel[row*WIDTHINBYTES+col/8] & 1 << 7-col%8) + +char screen_pixel[WIDTHINBYTES*HEIGHT]; +char zero_array[WIDTHINBYTES]; + +#include <mfdisplay.h> + +/* + * function init_screen: boolean; + * + * Return true if window operations legal. + * We always return true. + */ + +int +mf_tektronix_initscreen(void) +{ + memset(zero_array, 0, sizeof(zero_array)); + return 1; +} + +/* + * procedure updatescreen; + * + * Print out the screen bitmap. + */ +void +mf_tektronix_updatescreen(void) +{ + int r, c, startc, makingline; + + printf("%c%c", ESCAPE, FORMFEED); + for (r = 0; r < HEIGHT; r++) { + makingline = FALSE; + if (memcmp(&screen_pixel[r*WIDTHINBYTES],zero_array,WIDTHINBYTES) == 0) + continue; + for (c = 0; c < WIDTH; c++) { + if (ISSET(r, c)) { + if (!makingline) { + makingline = TRUE; + startc = c; + } + } else if (makingline) { + putchar(GS); + putchar(0x20|((HEIGHT-1)-r)>>5); + putchar(0x60|((HEIGHT-1)-r)&0x1F); + putchar(0x20|startc>>5); + putchar(0x40|startc&0x1F); + putchar(0x60|((HEIGHT-1)-r)&0x1F); /* Don't send high y */ + putchar(0x20|c>>5); + putchar(0x40|c&0x1F); + makingline = FALSE; + } + } + if (makingline) { + putchar(GS); + putchar(0x20|((HEIGHT-1)-r)>>5); + putchar(0x60|((HEIGHT-1)-r)&0x1F); + putchar(0x20|startc>>5); + putchar(0x40|startc&0x1F); + putchar(0x60|((HEIGHT-1)-r)&0x1F); /* Don't send high y */ + putchar(0x20|c>>5); + putchar(0x40|c&0x1F); + } + } + printf("%c%c%c%c%c", GS, 0x23, 0x66, 0x20, 0x40); + putchar(US); + fflush(stdout); +} + +/* + * procedure blankrectangle(left, right, top, bottom: integer); + * + * Blanks out a port of the screen. + */ +void +mf_tektronix_blankrectangle (screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + int r, c; + + if (left == 0 && right == WIDTH && top == 0 && bottom == HEIGHT) + memset(screen_pixel, 0, sizeof(screen_pixel)); + else + for (r = top; r < bottom; r++) + for (c = left; c < right; c++) + CLEARBIT(r, c); +} + +/* + * procedure paintrow( + * row: screenrow; + * init_color: pixelcolor; + * var trans_vector: transspec; + * vector_size: screencol); + * + * Paint "row" starting with color "init_color", up to next + * transition specified by "transition_vector", switch colors, + * and continue for "vector_size" transitions. + */ +void +mf_tektronix_paintrow (screenrow row, + pixelcolor init_color, + transspec transition_vector, + screencol vector_size) +{ + int k = 0; + int c = transition_vector[0]; + + do { + k++; + do { + if (init_color) + SETBIT(row, c); + else + CLEARBIT(row, c); + } while (++c != transition_vector[k]); + init_color = !init_color; + } while (k != vector_size); +} + +#else +int tek_dummy; +#endif /* TEKTRONIXWIN */ diff --git a/Build/source/texk/web2c/window/trap.c b/Build/source/texk/web2c/window/trap.c new file mode 100644 index 00000000000..fa30fae6fa9 --- /dev/null +++ b/Build/source/texk/web2c/window/trap.c @@ -0,0 +1,51 @@ +/* trap.c -- generate output for the trap test. See comments in + lib/texmf.c for what each routine does. */ + +#define EXTERN extern +#include "../mfd.h" + + +/* No #ifdef for the whole file, because we always want to support this. */ + +#include <mfdisplay.h> + +/* This returns true if we can do window operations, else false. */ + +int +mf_trap_initscreen(void) +{ + return 1; +} + +void +mf_trap_updatescreen(void) +{ + fputs ("Calling UPDATESCREEN\n", logfile); +} + +void +mf_trap_blankrectangle(screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + fprintf (logfile, "\nCalling BLANKRECTANGLE(%ld,%ld,%ld,%ld)\n", + (long)left, (long)right, (long)top, (long)bottom); +} + +void +mf_trap_paintrow(screenrow row, + pixelcolor init_color, + transspec transition_vector, + screencol vector_size) +{ + unsigned k; + + fprintf (logfile, "Calling PAINTROW(%ld,%ld;", (long)row, (long)init_color); + for (k = 0; k <= vector_size; k++) { + fprintf (logfile, "%ld", (long)transition_vector[k]); + if (k != vector_size) + putc (',', logfile); + } + fputs (")\n", logfile); +} diff --git a/Build/source/texk/web2c/window/uniterm.c b/Build/source/texk/web2c/window/uniterm.c new file mode 100644 index 00000000000..d24efc1a880 --- /dev/null +++ b/Build/source/texk/web2c/window/uniterm.c @@ -0,0 +1,191 @@ +/* + * title: uni.c + * abstract: Uniterm Terminal Window interface for Metafont. + * author: T.R.Hageman, Groningen, The Netherlands. + * created: May 1990 + * modified: + * description: + * Uniterm (Simon Poole's terminal emulator for the Atari ST) + * emulates a `smart' Tektronix 4014 graphics terminal, + * and allows selective erasing of the graphics screen. + * (I do not know whether this is a standard feature of smart Teks + * or an invention of Mr. Poole) + * + * This file is offered as an alternative to the "standard" + * tektronix driver (which I find rather slow...) + * + * {{a possible way to improve the standard TEK driver would be to + * remember the (merged) transition lists instead converting to + * a bit map and back again.}} + *---*/ + +#define EXTERN extern +#include "../mfd.h" + +#ifdef UNITERMWIN /* Whole file */ + +#define WIDTH 1024 +#define HEIGHT 780 +/* + * Send a vector to the graphics terminal + * (in a slightly optimized way). + */ +static void +sendvector(x, y) +register unsigned x, y; +{ + static int Hi_Y, Lo_Y, Hi_X; /* remembered values */ + register int Lo_Y_sent = 0; + register int t; +#ifdef DEBUG + if (x >= WIDTH) /* clip... */ + x = WIDTH - 1; + if (y >= HEIGHT) + y = HEIGHT - 1; +#endif + /* + * Send Hi_Y only if it has changed. + */ + if ((t = 0x20|(y >> 5)) != Hi_Y) { + Hi_Y = t, putchar(t); + } + /* + * Likewise, send Lo_Y only if it has changed. + * (and remember that it has been sent) + */ + if ((t = 0x60|(y & 0x1f)) != Lo_Y) { + Lo_Y_sent = 1; + Lo_Y = t, putchar(t); + } + /* + * A slight complication here. If Hi_X has changed, + * we must send Lo_Y too, but only if we didn't already send it. + */ + if ((t = 0x20|(x >> 5)) != Hi_X) { + if (!Lo_Y_sent) + putchar(Lo_Y); + Hi_X = t, putchar(t); + } + /* + * Lo_X is always sent, so don't bother to remember it. + */ + t = 0x40|(x & 0x1f), putchar(t); +} +/* + * Tektronix has origin in lower-left corner, whereas MetaFont + * has its origin in the upper-left corner. + * The next macro hides this. + */ +#define VECTOR(col,row) sendvector((unsigned)(col),(unsigned)(HEIGHT-1-(row))) +/* + * GS - `Dark' vectors are in fact invisible, i.e., a move. + * (Also switches from text- to graphics screen.) + */ +#define DARK() putchar('\35') +/* + * CAN - Switch from graphics- to text screen. + */ +#define TEXT_SCREEN() putchar('\30') +/* + * ESC STX(ETX) - Enable(disable) block-fill mode. + */ +#define BLOCK(on) (putchar('\33'),putchar(2+!(on))) +/* + * ESC / 0(1) d - Set black(white) ink. + */ +#define INK(on) (putchar('\33'), putchar('\57'), \ + putchar('\61'-(on)), putchar('\144')) +/* + * US - Switch to `alpha mode' + */ +#define ALPHA_MODE() putchar('\37') +/* + * ESC FF - clear graphics&alpha screen. + */ +#define ALPHA_CLS(); (putchar('\33'), putchar('\14')) + +#include <mfdisplay.h> + +int +mf_uniterm_initscreen(void) +{ + ALPHA_CLS(); + TEXT_SCREEN(); + return 1; +} +void +mf_uniterm_updatescreen(void) +{ + DARK(); + VECTOR(0,HEIGHT-1); + fflush(stdout); + TEXT_SCREEN(); /* switch to text mode */ +} +void +mf_uniterm_blankrectangle (screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + if (top==0 && left==0 && bottom>=HEIGHT-1 && right>=WIDTH-1) { + ALPHA_CLS(); + return; + } + DARK(); + VECTOR(left, top); + BLOCK(1); /* setup block erase mode */ + INK(0); /* use white ink */ + VECTOR(right-1, bottom-1); /* this draws the block */ + BLOCK(0); /* back to (black) linedraw mode */ + INK(1); /* black ink */ +} +void +mf_uniterm_paintrow (screenrow row, + pixelcolor init_color, + register transspec transition_vector, + register screencol vector_size) +{ + register int blank = !init_color; +#if 0 + /* This is the basic */ + DARK(); + VECTOR(*transition_vector++, row); /* move to first transition */ + do { + INK(blank ^= 1); + VECTOR(*transition_vector++ - 1, row); + } while (--vector_size > 0); +#endif + register screencol col; + /* However, we optimize the amount of output a bit by blanking + out the row first (since each INK command takes 4 bytes) */ + DARK(); + if (blank) { + VECTOR(transition_vector[((vector_size-1)&~1)+1] - 1, row); + INK(0); + VECTOR(*transition_vector++, row); + INK(1); + if (vector_size==1) + return; + } + else { + if (vector_size > 1) { + VECTOR(transition_vector[vector_size & ~1] - 1, row); + INK(0); + VECTOR(transition_vector[1], row); + INK(1); + DARK(); + } + VECTOR(*transition_vector++, row); + } + do { + col = *transition_vector++; + if ((blank ^= 1) == 0) + DARK(); /* white -> black; move to first black pixel */ + else + col--; /* black -> white; blacken to col-1 */ + VECTOR(col, row); + } while (--vector_size > 0); +} +#else +int uniterm_dummy; +#endif /* UNITERMWIN */ diff --git a/Build/source/texk/web2c/window/win32.c b/Build/source/texk/web2c/window/win32.c new file mode 100644 index 00000000000..a520202d3d4 --- /dev/null +++ b/Build/source/texk/web2c/window/win32.c @@ -0,0 +1,422 @@ +/* + + Win32 interface for Metafont. + Author: Fabrice Popineau <Fabrice.Popineau@supelec.fr> + + */ + +#define EXTERN extern +#include "../mfd.h" + +#ifdef WIN32WIN +#include <windows.h> + +#ifndef min +#define min(a,b) ((a) < (b) ? (a) : (b)) +#endif +#ifndef max +#define max(a,b) ((a) < (b) ? (b) : (a)) +#endif + +static void Win32Error(const char *caller); + +/* + The following constant enables some hack that should allow the + window to process its messages. Basically, the principle is to + create a thread which will do the message loop. Unfortunately, + it does not seem to work very well :-) + */ +#undef LOOPMSG +#define LOOPMSG 1 + +#undef DEBUG +/* #define DEBUG 1 */ + +static char szTitle[] = " MetaFont V2.718281 Online Display"; +static HWND my_window; +static HDC my_dc; +static HDC drawing_dc; +static HBITMAP hbm; +static MSG msg; +static HANDLE hAccelTable; +static HANDLE hMutex; +/* Scrollbars' variables */ +static SCROLLINFO si; +static int xMinScroll; +static int xMaxScroll; +static int xCurrentScroll; +static int yMinScroll; +static int yMaxScroll; +static int yCurrentScroll; +static BOOL fScroll; +static BOOL fSize; + +#ifdef LOOPMSG +void __cdecl InitGui(void*); +#endif +LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); + +#include <mfdisplay.h> + +int +mf_win32_initscreen(void) +{ + int ret; + if ((ret = _beginthread(InitGui, 0, NULL)) == -1) { + fprintf(stderr, "_beginthread returned with %d\n", ret); + return 0; + } + else + return 1; +} + + /* This window should be registered into a class. And maybe the + message loop could run into a separate thread. */ + +void __cdecl InitGui(void *param) +{ + HWND hparentwnd; + HANDLE hinst; + WNDCLASSEX wndclass; + char szFile[80]; + + hinst = GetModuleHandle(NULL); + GetModuleFileName (hinst, szFile, sizeof(szFile)); +#ifdef DEBUG + printf ("hinst = %x\n", hinst); + printf ("File = %s\n", szFile); +#endif + /* Fill in window class structure with parameters that describe + the main window. */ + /* CS_OWNDC : un DC pour chaque fenêtre de la classe */ + wndclass.cbSize = sizeof(wndclass); + wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; + wndclass.lpfnWndProc = (WNDPROC)WndProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = hinst; + wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); + wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); + wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); + wndclass.hbrBackground = GetStockObject(WHITE_BRUSH); + wndclass.lpszClassName = szFile; + wndclass.lpszMenuName = NULL; + + if (!RegisterClassEx(&wndclass)) + Win32Error("Register class"); + + hparentwnd = GetFocus(); + my_window = CreateWindow(szFile, szTitle, + WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, + CW_USEDEFAULT, 0, + CW_USEDEFAULT, 0, + /* screenwidth, screendepth, */ + hparentwnd, NULL, hinst, NULL); + if (!my_window) { + Win32Error("Create window"); + } +#ifdef DEBUG + fprintf(stderr, "my_window = %x\n", my_window); +#endif + +#ifdef LOOPMSG + /* Acknowledge for UpdateWindow() (WM_PAINT message generated) */ + hMutex = CreateMutex(NULL, FALSE, "DrawingMutex"); + my_dc = GetDC(my_window); + /* Device context for drawing and the associated bitmap. */ + drawing_dc = CreateCompatibleDC(my_dc); + hbm = CreateCompatibleBitmap(my_dc, screenwidth, screendepth); + SelectObject(drawing_dc, hbm); + /* Blank the bitmap */ + SelectObject(drawing_dc, GetStockObject(WHITE_BRUSH)); + PatBlt(drawing_dc, 0, 0, screenwidth, screendepth, PATCOPY); + hAccelTable = LoadAccelerators (hinst, szTitle); + + ShowWindow(my_window, SW_SHOWNORMAL); + UpdateWindow(my_window); + + /* Running the message loop */ + while (GetMessage(&msg, my_window, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + +#else + drawing_dc = my_dc = GetDC(my_window); +#endif +} + +/* Make sure the screen is up to date. (section 8.6 Handling the output +buffer) */ + +void +mf_win32_updatescreen(void) +{ + RECT r; + r.left = 0; + r.top = 0; + r.right = screenwidth; + r.bottom = screendepth; + + /* Send a WM_PAINT message to the window. + The rectangle should be invalidated for the message being sent. */ + InvalidateRect(my_window, &r, FALSE); + UpdateWindow(my_window); +} + + +/* Blank the rectangular inside the given coordinates. We don't need to +reset the foreground to black because we always set it at the beginning +of paintrow (below). */ + +void +mf_win32_blankrectangle (screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + RECT r; + r.left = left; + r.top = top; + r.right = right+1; /* FIXME: must we fill the last row/column ? */ + r.bottom = bottom+1; + /* Fixme : should synchronize with message processing. */ + WaitForSingleObject(hMutex, INFINITE); + FillRect(drawing_dc, &r, GetStockObject(WHITE_BRUSH)); + ReleaseMutex(hMutex); +} + + +/* Paint a row with the given ``transition specifications''. We might be +able to do something here with drawing many lines. */ + +void +mf_win32_paintrow (screenrow row, + pixelcolor init_color, + transspec tvect, + register screencol vector_size) +{ + register int col; + HGDIOBJ CurrentPen; + HGDIOBJ WhitePen = GetStockObject(WHITE_PEN); + HGDIOBJ BlackPen = GetStockObject(BLACK_PEN); + /* FIXME: should sync with msg processing */ + WaitForSingleObject(hMutex, INFINITE); + CurrentPen = (init_color == 0) ? WhitePen : BlackPen; + do { + col = *tvect++; + MoveToEx(drawing_dc, col, (int) row, NULL); + SelectObject(drawing_dc, CurrentPen); + + /* (section 6.3.2 Drawing single and multiple lines) + */ + LineTo(drawing_dc, (int) *tvect, (int) row); + CurrentPen = (CurrentPen == WhitePen) ? BlackPen : WhitePen; + } while (--vector_size > 0); + SelectObject(drawing_dc, GetStockObject(NULL_PEN)); + ReleaseMutex(hMutex); +} + +static void Win32Error(const char *caller) +{ + LPVOID lpMsgBuf; + + FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, + GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ + (LPTSTR) &lpMsgBuf, + 0, + NULL + ); + /* Display the string. */ + MessageBox( NULL, lpMsgBuf, caller, MB_OK|MB_ICONINFORMATION ); + /* Free the buffer. */ + LocalFree( lpMsgBuf ); +} + +LRESULT APIENTRY WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) +{ + PAINTSTRUCT ps; + int retval = 0; + +#ifdef DEBUG + fprintf(stderr, "Message %x\n", iMsg); +#endif +#ifdef LOOPMSG + WaitForSingleObject(hMutex, INFINITE); + switch (iMsg) { + case WM_CREATE: + xMinScroll = 0; + xMaxScroll = screenwidth; + xCurrentScroll = 0; + + yMinScroll = 0; + yMaxScroll = screendepth; + yCurrentScroll = 0; + + fScroll = FALSE; + fSize = FALSE; + + break; + case WM_SIZE: + { + int xNewSize, yNewSize; + xNewSize = LOWORD(lParam); + yNewSize = HIWORD(lParam); + + fSize = TRUE; + + xMaxScroll = max(screenwidth, xNewSize); + xCurrentScroll = min(xCurrentScroll, xMaxScroll); + + si.cbSize = sizeof(si); + si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; + si.nMin = xMinScroll; + si.nMax = xMaxScroll; + si.nPage = xNewSize; + si.nPos = xCurrentScroll; + SetScrollInfo(my_window, SB_HORZ, &si, TRUE); + + yMaxScroll = max(screendepth, yNewSize); + yCurrentScroll = min(yCurrentScroll, yMaxScroll); + + si.cbSize = sizeof(si); + si.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; + si.nMin = yMinScroll; + si.nMax = yMaxScroll; + si.nPage = yNewSize; + si.nPos = yCurrentScroll; + SetScrollInfo(my_window, SB_VERT, &si, TRUE); + } + case WM_PAINT: + { +#ifdef DEBUG + fprintf(stderr, "WM_PAINT message hbm = %x\n", hbm); +#endif + BeginPaint(my_window, &ps); + /* Shouldn't repaint all the screen, but so easy! */ + if (!BitBlt(my_dc, + 0, 0, + screenwidth, screendepth, + drawing_dc, + xCurrentScroll, + yCurrentScroll, SRCCOPY)) + Win32Error("Bitblt"); + EndPaint(my_window, &ps); + retval = 0; + break; + } + case WM_HSCROLL: + { + int xDelta; + int xNewPos; + int yDelta = 0; + switch (LOWORD(wParam)) { + case SB_PAGEUP: + xNewPos = xCurrentScroll - 50; + break; + case SB_PAGEDOWN: + xNewPos = xCurrentScroll + 50; + break; + case SB_LINEUP: + xNewPos = xCurrentScroll - 5; + break; + case SB_LINEDOWN: + xNewPos = xCurrentScroll + 5; + break; + case SB_THUMBPOSITION: + xNewPos = HIWORD(wParam); + break; + default: + xNewPos = xCurrentScroll; + } + xNewPos = max(0, xNewPos); + xNewPos = min(xMaxScroll, xNewPos); + + if (xNewPos == xCurrentScroll) + break; + + fScroll = TRUE; + + xDelta = xNewPos - xCurrentScroll; + xCurrentScroll = xNewPos; + + ScrollWindowEx(my_window, -xDelta, -yDelta, (CONST RECT *)NULL, + (CONST RECT *)NULL, (HRGN)NULL, (LPRECT)NULL, + SW_INVALIDATE); + UpdateWindow(my_window); + + si.cbSize = sizeof(si); + si.fMask = SIF_POS; + si.nPos = xCurrentScroll; + SetScrollInfo(my_window, SB_HORZ, &si, TRUE); + } + break; + + case WM_VSCROLL: + { + int xDelta = 0; + int yNewPos; + int yDelta; + switch (LOWORD(wParam)) { + case SB_PAGEUP: + yNewPos = yCurrentScroll - 50; + break; + case SB_PAGEDOWN: + yNewPos = yCurrentScroll + 50; + break; + case SB_LINEUP: + yNewPos = yCurrentScroll - 5; + break; + case SB_LINEDOWN: + yNewPos = yCurrentScroll + 5; + break; + case SB_THUMBPOSITION: + yNewPos = HIWORD(wParam); + break; + default: + yNewPos = yCurrentScroll; + } + yNewPos = max(0, yNewPos); + yNewPos = min(yMaxScroll, yNewPos); + + if (yNewPos == yCurrentScroll) + break; + + fScroll = TRUE; + + yDelta = yNewPos - yCurrentScroll; + yCurrentScroll = yNewPos; + + ScrollWindowEx(my_window, -xDelta, -yDelta, (CONST RECT *)NULL, + (CONST RECT *)NULL, (HRGN)NULL, (LPRECT)NULL, + SW_INVALIDATE); + UpdateWindow(my_window); + + si.cbSize = sizeof(si); + si.fMask = SIF_POS; + si.nPos = yCurrentScroll; + SetScrollInfo(my_window, SB_VERT, &si, TRUE); + } + break; + + case WM_DESTROY: + PostQuitMessage(0); + retval = 0; + break; + default: + retval = DefWindowProc(hwnd, iMsg, wParam, lParam); + break; + } + ReleaseMutex(hMutex); + return retval; +#else + return DefWindowProc(hwnd, iMsg, wParam, lParam); +#endif +} + +#else +int win32_dummy; +#endif /* WIN32WIN */ diff --git a/Build/source/texk/web2c/window/x11-Xlib.c b/Build/source/texk/web2c/window/x11-Xlib.c new file mode 100644 index 00000000000..91580c7fe48 --- /dev/null +++ b/Build/source/texk/web2c/window/x11-Xlib.c @@ -0,0 +1,283 @@ +/* +X Window System version 11 (release 3 et al.) interface for Metafont. + +Modified from Tim Morgan's X Version 11 routines by Richard Johnson. +Modified from that by Karl Berry <karl@umb.edu>. 8/3/89 + +MF can now understand geometry (sort of, at least on a Sun running 3.4 +and using uwm) in the resource database, as in the following in +.Xdefaults to put a window of width 500 and height 600 at (200,50): + +Metafont*geometry: 500x600+200+200 + +You cannot give the geometry on the command line (who would want to)? + +The width and height specified in the resource must not be larger than +the screenwidth and screendepth defined in ../mf/cmf.ch. +If they are, then I reset them to the maximum. + +We don't handle Expose events in general. This means that the window +cannot be moved, resized, or obscured. The problem is that I don't know +when we can look for such events. Adding a check to the main loop of +Metafont was more than I wanted to do. Another problem is that Metafont +does not keep track of the contents of the screen, and so I don't see +how to know what to redraw. The right way to do this is probably to fork +a process, and keep a Pixmap around of the contents of the window. + +I could never have done this without David Rosenthal's Hello World +program for X. See $X/mit/doc/HelloWorld. + +All section numbers refer to Xlib -- C Language X Interface. */ + + +#define EXTERN extern +#include "../mfd.h" + + +#ifdef X11WIN + +#undef input /* the XWMHints structure has a field named `input' */ +#undef output + +#include <X11/Xatom.h> +#include <X11/Xlib.h> +#include <X11/Xutil.h> + + +/* Variables for communicating between the routines we'll write. */ + +static Display *my_display; +static int my_screen; +static Window my_window; +static GC my_gc; +static int white, black; + + +/* Window manager hints. */ + +static XWMHints wm_hints = { + (InputHint|StateHint), /* flags telling which values are set */ + False, /* We don't expect input. */ + NormalState, /* Initial state. */ + 0, /* icon pixmap */ + 0, /* icon window */ + 0, 0, /* icon location (should get from resource?) */ + 0, /* icon mask */ + 0 /* window group */ +}; + + +/* Some constants for the resource database, etc. */ +#define PROGRAM_NAME "Metafont" +#define ARG_GEOMETRY "geometry" +#define BORDER_WIDTH 1 /* Should get this from resource. */ +#define DEFAULT_X_POSITION 0 +#define DEFAULT_Y_POSITION 0 + + +#include <mfdisplay.h> + +/* Return 1 (i.e., true) if display opened successfully, else 0. */ + +int +mf_x11_initscreen(void) +{ + char *geometry; + int geometry_found = 0; + char default_geometry[100]; + XSizeHints sizehints; + XGCValues gcvalues; + + /* We want the default display. (section 2.1 Opening the display) */ + my_display = XOpenDisplay(NULL); + if (my_display == NULL) return 0; + + /* Given a display, we can get the screen and the ``black'' and + ``white'' pixels. (section 2.2.1 Display macros) */ + my_screen = DefaultScreen(my_display); + white = WhitePixel(my_display, my_screen); + black = BlackPixel(my_display, my_screen); + + + sizehints.x = DEFAULT_X_POSITION; + sizehints.y = DEFAULT_Y_POSITION; + sizehints.width = screenwidth; + sizehints.height = screendepth; + sizehints.flags = PPosition|PSize; + + sprintf (default_geometry, "%ux%u+%u+%u", + (unsigned int) screenwidth, (unsigned int) screendepth, + DEFAULT_X_POSITION, DEFAULT_Y_POSITION); + + /* Look up the geometry for this window. (Section 10.2 Obtaining X + environment defaults) */ + geometry = XGetDefault(my_display, PROGRAM_NAME, ARG_GEOMETRY); + + if (geometry != NULL) { + /* (section 10.3 Parsing window geometry) */ + int bitmask = XGeometry(my_display, my_screen, + geometry, default_geometry, + BORDER_WIDTH, + 1, 1, /* ``Font'' width and height. */ + 0, 0, /* Interior padding. */ + &(sizehints.x), &(sizehints.y), + &(sizehints.width), &(sizehints.height)); + + /* (section 9.1.6 Setting and getting window sizing hints) */ + if (bitmask & (XValue|YValue)) { + sizehints.flags |= USPosition; + geometry_found = 1; + } + + if (bitmask & (WidthValue|HeightValue)) { + sizehints.flags |= USSize; + if (sizehints.width > screenwidth) sizehints.width = screenwidth; + if (sizehints.height > screendepth) sizehints.height = screendepth; + geometry_found = 1; + } + } + + + /* Our window is pretty simple. (section 3.3 Creating windows) */ + my_window = XCreateSimpleWindow(my_display, + DefaultRootWindow(my_display), /* parent */ + sizehints.x, sizehints.y, /* upper left */ + sizehints.width, sizehints.height, + BORDER_WIDTH, + black, /* border color */ + white); /* background color */ + + /* (section 9.1.1 Setting standard properties) */ + XSetStandardProperties(my_display, my_window, + PROGRAM_NAME, /* window name */ + PROGRAM_NAME, /* icon name */ + None, /* pixmap for icon */ + 0, 0, /* argv and argc for restarting */ + &sizehints); + XSetWMHints(my_display, my_window, &wm_hints); + + + /* We need a graphics context if we're going to draw anything. + (section 5.3 Manipulating graphics context/state) */ + gcvalues.foreground = black; + gcvalues.background = white; + /* A ``thin'' line. This is much faster than a line of length 1, + although the manual cautions that the results might be less + consistent across screens. */ + gcvalues.line_width = 0; + + my_gc = XCreateGC(my_display, my_window, + GCForeground|GCBackground|GCLineWidth, + &gcvalues); + + /* (section 3.5 Mapping windows) This is the confusing part of the + program, at least to me. If no geometry spec was found, then the + window manager puts up the blinking rectangle, and the user clicks, + all before the following call returns. But if a geometry spec was + found, then we want to do a whole mess of other things, because the + window manager is going to send us an expose event so that we can + bring our window up -- and this is one expose event we have to + handle. */ + XMapWindow(my_display, my_window); + + if (geometry_found) { + /* The window manager sends us an Expose event. Yuck. + */ + XEvent my_event; + /* We certainly don't want to handle anything else. + (section 8.5 Selecting events) + */ + XSelectInput(my_display, my_window, ExposureMask); + + /* We also want to do this right now. This is the confusion. From + stepping through the program under the debugger, it appears + that it is this call to XSync (given the previous call to + XSelectInput) that actually brings the window up -- and yet + without the remaining code, the thing doesn't work right. Very + strange. (section 8.6 Handling the output buffer) + */ + XSync(my_display, 0); + + /* Now get the event. (section 8.8.1 Returning the next event) + */ + XNextEvent(my_display, &my_event); + + /* Ignore all but the last of the Expose events. + (section 8.4.5.1 Expose event processing) + */ + if (my_event.type == Expose && my_event.xexpose.count == 0) { + /* Apparently the network might STILL have my_events coming in. + Let's throw away Expose my_events again. (section 8.8.3 + Selecting my_events using a window or my_event mask) + */ + while (XCheckTypedEvent(my_display, Expose, &my_event)) ; + + /* Finally, let's draw the blank screen. + */ + XClearWindow(my_display, my_window); + } + } + + /* That's it. */ + return 1; +} + + +/* Make sure the screen is up to date. (section 8.6 Handling the output +buffer) */ + +void +mf_x11_updatescreen(void) +{ + XFlush(my_display); +} + + +/* Blank the rectangular inside the given coordinates. We don't need to +reset the foreground to black because we always set it at the beginning +of paintrow (below). */ + +void +mf_x11_blankrectangle(screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + XSetForeground(my_display, my_gc, white); + XFillRectangle(my_display, my_window, my_gc, + (int) left, + (int) top, + (unsigned) (right - left + 1), + (unsigned) (bottom - top + 1)); +} + + +/* Paint a row with the given ``transition specifications''. We might be +able to do something here with drawing many lines. */ + +void +mf_x11_paintrow(screenrow row, + pixelcolor init_color, + transspec tvect, + screencol vector_size) +{ + register int color, col; + + color = (init_color == 0) ? white : black; + + do { + col = *tvect++; + XSetForeground(my_display, my_gc, color); + + /* (section 6.3.2 Drawing single and multiple lines) + */ + XDrawLine(my_display, my_window, my_gc, col, (int) row, + (int) *tvect, (int) row); + + color = (color == white) ? black : white; + } while (--vector_size > 0); +} + +#else +int x11_dummy; +#endif /* X11WIN */ diff --git a/Build/source/texk/web2c/window/x11-Xt.c b/Build/source/texk/web2c/window/x11-Xt.c new file mode 100644 index 00000000000..b7c9c25c405 --- /dev/null +++ b/Build/source/texk/web2c/window/x11-Xt.c @@ -0,0 +1,374 @@ +/* x11.c: X11 window interface for Metafont, using Xt. Original by + rusty@garnet.berkeley.edu. */ + +#define EXTERN extern +#include "../mfd.h" + +#ifdef X11WIN /* almost whole file */ + +/* For wchar_t et al., that the X files might want. */ +#include <kpathsea/systypes.h> + +#undef input /* the XWMHints structure has a field named `input' */ +#undef output +#include <X11/Xlib.h> +#include <X11/Intrinsic.h> +#include <X11/StringDefs.h> +#undef wchar_t + +#define PLANE 0 + +static unsigned int mf_defwidth = 0; +static unsigned int mf_defheight = 0; + +static Display *mf_display; +static Window mf_window; + +static Pixmap mf_pixmap; + +static XtAppContext mf_app; + +static GC mf_dgc; /* draw gc */ +static GC mf_egc; /* erase gc */ +static GC mf_cgc; /* copy plane gc */ + +typedef struct +{ + unsigned int mf_width, mf_height; + Pixel mf_fg, mf_bg; +} mf_resources_struct; + +static mf_resources_struct mf_x11_resources; + + +/* Don't paint anything until we're mapped. */ +static Boolean mf_mapped = False; +static Boolean mf_awaiting_expose = True; + +#ifdef MF_XT_DEBUG +static int mf_max_x, mf_max_y; +static int mf_min_x, mf_min_y; + +static void mf_checkextent (); +#endif + +static XtResource mf_resources[] + = { { "width", "Width", XtRInt, sizeof (int), + XtOffset (mf_resources_struct *, mf_width), XtRInt, + (XtPointer) & mf_defwidth }, + + { "height", "Height", XtRInt, sizeof (int), + XtOffset (mf_resources_struct *, mf_height), XtRInt, + (XtPointer) &mf_defheight }, + + { "foreground", "Foreground", XtRPixel, sizeof (Pixel), + XtOffset (mf_resources_struct *, mf_fg), + XtRString, (XtPointer) "Black" }, + + { "background", "Background", XtRPixel, sizeof (Pixel), + XtOffset (mf_resources_struct *, mf_bg), XtRString, + (XtPointer) "White" }, +}; + +/* Maybe someday we'll read options, until then, this is just here for + the resources. */ +static XrmOptionDescRec mf_optiondesclist[] += { { "-width", "width", XrmoptionSepArg, (XPointer) NULL }, + { "-height", "height", XrmoptionSepArg, (XPointer) NULL }, + { "-fg", "foreground", XrmoptionSepArg, (XPointer) NULL }, + { "-bg", "background", XrmoptionSepArg, (XPointer) NULL }, +}; + +static void mf_events(void); +static void mf_mapstatus(Widget w, XtPointer data, XEvent *ev); +static void mf_newpixmap(unsigned int width, unsigned int height); +static void mf_redraw(void); +static void mf_repaint(Widget w, XtPointer data, XEvent *ev); + +#include <mfdisplay.h> + +/* Return 1 if display opened successfully, else 0. */ + +int +mf_x11_initscreen (void) +{ + XSetWindowAttributes xwa; + Widget mf_toplevel; + Widget mf_canvas; + XGCValues gcv; + Arg args[1]; + int mf_argc; + char *mf_argv[2]; + + mf_argv[0] = "mf"; + mf_argv[1] = NULL; + mf_argc = 1; + + mf_toplevel = XtInitialize ("mf", "Metafont", + mf_optiondesclist, + XtNumber (mf_optiondesclist), + &mf_argc, mf_argv); + + XtGetApplicationResources (mf_toplevel, (XtPointer) & mf_x11_resources, + mf_resources, XtNumber (mf_resources), + NULL, 0); + + if (mf_argc != 1) + { + fprintf (stderr, "Usage: %s\n", mf_argv[0]); + return 0; + } + + /* If nothing specified in their resources (e.g., .Xdefaults) + then use the values of Metafont's "screen". */ + if (mf_x11_resources.mf_width == 0) + mf_x11_resources.mf_width = screenwidth; + if (mf_x11_resources.mf_height == 0) + mf_x11_resources.mf_height = screendepth; + + mf_canvas = XtCreateManagedWidget ("canvas", widgetClass, mf_toplevel, + NULL, 0); + + XtSetArg (args[0], XtNwidth, mf_x11_resources.mf_width); + XtSetValues (mf_canvas, args, 1); + XtSetArg (args[0], XtNheight, mf_x11_resources.mf_height); + XtSetValues (mf_canvas, args, 1); + + /* for mf_x11_updatescreen() */ + mf_app = XtWidgetToApplicationContext (mf_canvas); + + XtAddEventHandler (mf_canvas, (Cardinal) ExposureMask, True, + (XtEventHandler) mf_repaint, NULL); + XtAddEventHandler (mf_canvas, (Cardinal) StructureNotifyMask, True, + (XtEventHandler) mf_mapstatus, NULL); + + XtRealizeWidget (mf_toplevel); + + mf_display = XtDisplay (mf_canvas); + mf_window = XtWindow (mf_canvas); + + /* Since Metafont isn't your typical x window program that + sits in XTMainLoop, if the server supports backing store + and save unders this will help keep the output looking + nice. */ + xwa.backing_store = WhenMapped; + XChangeWindowAttributes (mf_display, mf_window, CWBackingStore, &xwa); + + gcv.background = mf_x11_resources.mf_bg; + gcv.foreground = mf_x11_resources.mf_fg; + gcv.function = GXcopy; + + /* copy plane gc */ + mf_cgc = XCreateGC (mf_display, mf_window, + GCForeground | GCBackground | GCFunction, &gcv); + + mf_newpixmap (screenwidth > mf_x11_resources.mf_width + ? screenwidth : mf_x11_resources.mf_width, + screendepth > mf_x11_resources.mf_height + ? screendepth : mf_x11_resources.mf_height); + + return 1; +} + +void +mf_x11_updatescreen (void) +{ + XEvent event; + + mf_events (); + while (mf_awaiting_expose) + { + XtAppNextEvent (mf_app, &event); + XtDispatchEvent (&event); + } + mf_redraw (); + +#ifdef MF_XT_DEBUG + printf ("max_x=%d, min_x=%d, max_y=%d, min_y=%d\n", + mf_max_x, mf_min_x, + mf_max_y, mf_min_y); +#endif +} + + +void +mf_x11_blankrectangle(screencol left, + screencol right, + screenrow top, + screenrow bottom) +{ + XFillRectangle (mf_display, mf_pixmap, mf_egc, (int) left, (int) top, + (int) (right - left + 1), (int) (bottom - top + 1)); + mf_events (); +} + +void +mf_x11_paintrow(screenrow row, + pixelcolor init_color, + transspec tvect, + screencol vector_size) +{ + GC gc; + int col; + + gc = (init_color == 0) ? mf_egc : mf_dgc; + + do + { + col = *tvect++; + +#ifdef MF_XT_DEBUG + mf_checkextent (col, *tvect, row); +#endif /* MF_XT_DEBUG */ + + XDrawLine (mf_display, mf_pixmap, gc, col, (int) row, + (int) *tvect, (int) row); + + gc = (gc == mf_egc) ? mf_dgc : mf_egc; + } + while (--vector_size > 0); + + mf_events (); +} + +#ifdef MF_XT_DEBUG +static void +mf_checkextent(int x1, int x2, int y) +{ + if (x1 < mf_min_x) + mf_min_x = x1; + if (x1 > mf_max_x) + mf_max_x = x1; + + if (x2 < mf_min_x) + mf_min_x = x2; + if (x2 > mf_max_x) + mf_max_x = x2; + + if (y > mf_max_y) + mf_max_y = y; + if (y < mf_min_y) + mf_min_y = y; +} +#endif /* MF_XT_DEBUG */ + +static void +mf_events (void) +{ + XEvent event; + + if (XtAppPending (mf_app) != 0) + { + while (XtAppPending (mf_app) != 0) + { + XtAppNextEvent (mf_app, &event); + XtDispatchEvent (&event); + } + } +} + +static void +mf_newpixmap(unsigned int width, unsigned int height) +{ + XGCValues gcv; + Pixmap newpixmap; + + /* width == mf_width and height == mf_height + the first time mf_newpixmap() is called. + */ + if (width < mf_x11_resources.mf_width && height < mf_x11_resources.mf_height) + return; + + newpixmap = XCreatePixmap (mf_display, mf_window, width, height, 1); + + gcv.background = 0; + gcv.foreground = 1; + + if (mf_dgc != 0) + XFreeGC (mf_display, mf_dgc); + + /* draw gc */ + gcv.line_width = 1; + mf_dgc = XCreateGC (mf_display, newpixmap, + GCForeground | GCBackground | GCLineWidth, &gcv); + + if (mf_egc != 0) + XFreeGC (mf_display, mf_egc); + + /* erase gc */ + gcv.foreground = 0; + mf_egc = XCreateGC (mf_display, newpixmap, + GCForeground | GCBackground | GCLineWidth, &gcv); + + XFillRectangle (mf_display, newpixmap, mf_egc, 0, 0, width, height); + + if (mf_pixmap != 0) + { + XCopyArea (mf_display, mf_pixmap, newpixmap, mf_dgc, 0, 0, + mf_x11_resources.mf_width, + mf_x11_resources.mf_height, 0, 0); + + XFreePixmap (mf_display, mf_pixmap); + } + + mf_pixmap = newpixmap; + + mf_x11_resources.mf_width = width; + mf_x11_resources.mf_height = height; +} + +static void +mf_repaint(Widget w, XtPointer data, XEvent *ev) +{ + if (!mf_mapped || !ev || ev->type != Expose) + return; + + /* We are a ``simple application''. */ + if (ev->xexpose.count == 0) + { + XEvent event; + + /* skip all excess redraws */ + while (XCheckTypedEvent (mf_display, Expose, &event) != False) + continue; + + mf_redraw (); + mf_awaiting_expose = False; + } +} + + +static void +mf_mapstatus(Widget w, XtPointer data, XEvent *ev) +{ + switch (ev->type) + { + case MapNotify: + mf_mapped = True; + break; + + case UnmapNotify: + mf_mapped = False; + break; + + case ConfigureNotify: + mf_newpixmap (ev->xconfigure.width, ev->xconfigure.height); + mf_redraw (); + break; + } +} + + +static void +mf_redraw (void) +{ + XCopyPlane (mf_display, mf_pixmap, mf_window, mf_cgc, 0, 0, + mf_x11_resources.mf_width, mf_x11_resources.mf_height, + 0, 0, (unsigned long) 1); + + XFlush (mf_display); +} + +#else +int x11_dummy; +#endif /* X11WIN */ |