diff options
Diffstat (limited to 'systems/unix/tex-fpc/xdvi/macxdvi.h')
-rw-r--r-- | systems/unix/tex-fpc/xdvi/macxdvi.h | 1299 |
1 files changed, 1299 insertions, 0 deletions
diff --git a/systems/unix/tex-fpc/xdvi/macxdvi.h b/systems/unix/tex-fpc/xdvi/macxdvi.h new file mode 100644 index 0000000000..c72024fa51 --- /dev/null +++ b/systems/unix/tex-fpc/xdvi/macxdvi.h @@ -0,0 +1,1299 @@ +/*========================================================================*\ + +Copyright (c) 1990-2004 Paul Vojta + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +PAUL VOJTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +NOTE: + xdvi is based on prior work, as noted in the modification history + in xdvi.c. + +\*========================================================================*/ + /* helbig changed this file to make it work on Mac OS X */ + /* it defined XOPEN_SOURCE, which causes NSIG to be not defined, + which breaks signal.h included by event.c */ + +/* + * Written by Eric C. Cooper, CMU + */ + +#ifndef XDVI_H +#define XDVI_H + +/******************************** + * The C environment * + *******************************/ + +#ifdef __hpux +/* On HP-UX 10.10 B and 20.10, compiling with _XOPEN_SOURCE + ..._EXTENDED + * leads to poll() not realizing that a file descriptor is writable in psgs.c. + */ +#define _HPUX_SOURCE 1 +#else +#undef _XOPEN_SOURCE /* needed because of imake */ +#define _XOPEN_SOURCE_EXTENDED 1 +#define __EXTENSIONS__ 1 /* needed to get struct timeval on SunOS 5.5 */ +#define _SVID_SOURCE 1 /* needed to get S_IFLNK in glibc */ +#define _BSD_SOURCE 1 /* needed to get F_SETOWN in glibc-2.1.3 */ +#endif + +#include "config.h" + +/* Some O/S dependent kludges. */ +#ifdef _AIX +#define _ALL_SOURCE 1 +#endif + +/* If xmkmf is broken and there's a symlink from /usr/include/X11 to the right + * place, then there will be no -I... argument on the cc command line for the + * X include files. Since gcc version 3 and higher sets __STDC__ to 0 when + * including system header files on some platforms, we may end up with + * NeedFunctionPrototypes set to 0 when it should be 1. So, let's force the + * issue. + */ + +#if __STDC__ && !defined(FUNCPROTO) +# define FUNCPROTO (-1) +#endif + +#if STDC_HEADERS +# include <stddef.h> +# include <stdlib.h> + /* the following works around the wchar_t problem */ +# include <X11/X.h> +# if HAVE_X11_XOSDEFS_H +# include <X11/Xosdefs.h> +# endif +# ifdef X_NOT_STDC_ENV +# undef X_NOT_STDC_ENV +# undef X_WCHAR +# include <X11/Xlib.h> +# define X_NOT_STDC_ENV +# endif +#endif + +#include <X11/Xlib.h> /* include Xfuncs.h, if available */ +#include <X11/Xutil.h> /* needed for XDestroyImage */ +#include <X11/Xos.h> + +#if XlibSpecificationRelease >= 5 +#include <X11/Xfuncs.h> +#endif + +#undef TOOLKIT + +#if XAW || MOTIF + +#define TOOLKIT 1 +#include <X11/Intrinsic.h> +#if (defined(VMS) && (XtSpecificationRelease <= 4)) || defined(lint) +# include <X11/IntrinsicP.h> +#endif +#if MOTIF +# include <Xm/Xm.h> +# ifndef MOTIF_TIMERS /* see comment in events.c */ +# define MOTIF_TIMERS (XmVERSION >= 2) +# endif +#endif + +#else /* not TOOLKIT */ + +#define XtNumber(arr) (sizeof(arr)/sizeof(arr[0])) +#define XtWindow(win) (win) +typedef unsigned long Pixel; +typedef char Boolean; +typedef unsigned int Dimension; +#undef BUTTONS +#undef EXTRA_APP_DEFAULTS + +#endif /* not TOOLKIT */ + +#if EXTRA_APP_DEFAULTS && !SELFAUTO +#define SELFAUTO 1 +#endif + +#if SELFAUTO && !defined(DEFAULT_CONFIG_PATH) +#define DEFAULT_CONFIG_PATH \ + ".:$SELFAUTOLOC:$SELFAUTODIR:$SELFAUTOPARENT:$SELFAUTODIR/share/texmf/web2c:$SELFAUTOPARENT/share/texmf/web2c:$SELFAUTODIR/texmf/web2c:$SELFAUTOPARENT/texmf/web2c:$TETEXDIR:$TEXMF/web2c" +#endif + +#undef CFGFILE /* no cheating */ + +#if defined(DEFAULT_CONFIG_PATH) +#define CFGFILE 1 +#endif + +typedef char Bool3; /* Yes/No/Maybe */ + +#define True 1 +#define False 0 +#define Maybe 2 + +#ifdef VMS +#include <string.h> +#define index strchr +#define rindex strrchr +#define bzero(a, b) (void) memset ((void *) (a), 0, (size_t) (b)) +#define bcopy(a, b, c) (void) memmove ((void *) (b), (void *) (a), (size_t) (c)) +#endif + +#include <stdio.h> +#include <setjmp.h> + +#if HAVE_UNISTD_H +#include <unistd.h> +#endif + +#if HAVE_DIRENT_H +# include <dirent.h> +# define NAMLEN(dirent) strlen((dirent)->d_name) +#else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# if HAVE_SYS_NDIR_H +# include <sys/ndir.h> +# endif +# if HAVE_SYS_DIR_H +# include <sys/dir.h> +# endif +# if HAVE_NDIR_H +# include <ndir.h> +# endif +#endif + +#ifndef NeedFunctionPrototypes +#if __STDC__ +#define NeedFunctionPrototypes 1 +#else /* STDC */ +#define NeedFunctionPrototypes 0 +#endif /* STDC */ +#endif /* NeedFunctionPrototypes */ + +#if NeedFunctionPrototypes +#define ARGS(x) x +#else +#define ARGS(x) () +#endif + +#ifndef KPATHSEA + +/* These macros munge function declarations to make them work in both + cases. The P?H macros are used for declarations, the P?C for + definitions. See <ansidecl.h> from the GNU C library. P1H(void) + also works for definitions of routines which take no args. */ + +#if NeedFunctionPrototypes /* Don't use __STDC__ here (gcc + SunOS 4) */ + +#define P1H(p1) (p1) +#define P2H(p1, p2) (p1, p2) + +#define P1C(t1,n1)(t1 n1) +#define P2C(t1,n1, t2,n2)(t1 n1, t2 n2) +#define P3C(t1,n1, t2,n2, t3,n3)(t1 n1, t2 n2, t3 n3) +#define P4C(t1,n1, t2,n2, t3,n3, t4,n4)(t1 n1, t2 n2, t3 n3, t4 n4) + +#else /* not NeedFunctionPrototypes */ + +#define P1H(p1) () +#define P2H(p1, p2) () + +#define P1C(t1,n1) (n1) t1 n1; +#define P2C(t1,n1, t2,n2) (n1,n2) t1 n1; t2 n2; +#define P3C(t1,n1, t2,n2, t3,n3) (n1,n2,n3) t1 n1; t2 n2; t3 n3; +#define P4C(t1,n1, t2,n2, t3,n3, t4,n4) (n1,n2,n3,n4) \ + t1 n1; t2 n2; t3 n3; t4 n4; + +#endif /* not NeedFunctionPrototypes */ + +#endif /* not KPATHSEA */ + +#ifndef NeedWidePrototypes +#define NeedWidePrototypes NeedFunctionPrototypes +#endif + +#ifndef NeedVarargsPrototypes +#define NeedVarargsPrototypes NeedFunctionPrototypes +#endif + +#if NeedVarargsPrototypes +#define VARGS(x) x +#else +#define VARGS(x) () +#endif + +#ifndef _XFUNCPROTOBEGIN +#define _XFUNCPROTOBEGIN +#define _XFUNCPROTOEND +#endif + +#ifndef _Xconst +#if __STDC__ +#define _Xconst const +#else /* STDC */ +#define _Xconst +#endif /* STDC */ +#endif /* _Xconst */ + +#ifndef VOLATILE +#if __STDC__ || (defined(__stdc__) && defined(__convex__)) +#define VOLATILE volatile +#else +#define VOLATILE /* nothing */ +#endif +#endif + +#ifndef NORETURN +# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 5) +# define NORETURN __attribute__((__noreturn__)) +# else +# define NORETURN /* nothing */ +# endif +#endif + +#ifndef UNUSED +# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95) +# define UNUSED __attribute__((__unused__)) +# else +# define UNUSED /* nothing */ +# endif +#endif + +#ifndef OPEN_MODE +#ifndef VMS +#define OPEN_MODE "r" +#else /* VMS */ +#define OPEN_MODE "r", "ctx=stm" +#endif /* VMS */ +#endif /* OPEN_MODE */ + +#ifndef VMS +#define OPEN_MODE_ARGS _Xconst char * +#else +#define OPEN_MODE_ARGS _Xconst char *, _Xconst char * +#endif + +#define Printf (void) printf +#define Puts (void) puts +#define Fprintf (void) fprintf +#define Sprintf (void) sprintf +#define Fseek (void) fseek +#define Fread (void) fread +#define Fputs (void) fputs +#define Putc (void) putc +#define Putchar (void) putchar +#define Fclose (void) fclose +#define Fflush (void) fflush +#define Strcat (void) strcat +#define Strcpy (void) strcpy + +/******************************** + * Types and data * + *******************************/ + +#ifndef EXTERN +#define EXTERN extern +#define INIT(x) +#endif + +#define MAXDIM 32767 + +typedef unsigned char ubyte; + +#if NeedWidePrototypes +typedef unsigned int wide_ubyte; +typedef int wide_bool; +#define WIDENINT (int) +#else +typedef ubyte wide_ubyte; +typedef Boolean wide_bool; +#define WIDENINT +#endif + +#if defined(MAKETEXPK) && !defined(MKTEXPK) +#define MKTEXPK 1 +#endif + +/* + * pixel_conv is currently used only for converting absolute positions + * to pixel values; although normally it should be + * ((int) ((x) / shrink_factor + (1 << 15) >> 16)), + * the rounding is achieved instead by moving the constant 1 << 15 to + * PAGE_OFFSET in dvi-draw.c. + */ +#define pixel_conv(x) ((int) ((x) / shrink_factor >> 16)) +#define pixel_round(x) ((int) ROUNDUP(x, shrink_factor << 16)) +#define spell_conv0(n, f) ((long) (n * f)) +#define spell_conv(n) spell_conv0(n, dimconv) + +#define BMUNIT unsigned BMTYPE +#define BMBITS (8 * BMBYTES) + +#define ADD(a, b) ((BMUNIT *) (((char *) a) + b)) +#define SUB(a, b) ((BMUNIT *) (((char *) a) - b)) + +extern BMUNIT bit_masks[BMBITS + 1]; + +struct frame { + struct framedata { + long dvi_h, dvi_v, w, x, y, z; + int pxl_v; + } data; + struct frame *next, *prev; +}; + +#ifndef TEXXET +typedef long (*set_char_proc) ARGS((wide_ubyte)); +#else +typedef void (*set_char_proc) ARGS((wide_ubyte, wide_ubyte)); +#endif + +typedef void (*home_proc) ARGS((wide_bool)); + +struct drawinf { /* this information is saved when using virtual fonts */ + struct framedata data; + struct font *fontp; + set_char_proc set_char_p; + int tn_table_len; + struct font **tn_table; + struct tn *tn_head; + ubyte *pos, *end; + struct font *virtual; +#ifdef TEXXET + int dir; +#endif +}; + +EXTERN struct drawinf currinf; + +/* entries below with the characters 'dvi' in them are actually stored in + scaled pixel units */ + +#define DVI_H currinf.data.dvi_h +#define PXL_H pixel_conv(currinf.data.dvi_h) +#define DVI_V currinf.data.dvi_v +#define PXL_V currinf.data.pxl_v +#define WW currinf.data.w +#define XX currinf.data.x +#define YY currinf.data.y +#define ZZ currinf.data.z +#define ROUNDUP(x,y) (((x)+(y)-1)/(y)) + +EXTERN int current_page; +EXTERN int total_pages; +EXTERN int pageno_correct INIT(1); +EXTERN long magnification; +EXTERN double dimconv; +EXTERN double tpic_conv; +EXTERN int n_files_left INIT(32767); /* for LRU closing of fonts */ +EXTERN unsigned int page_w, page_h; + +#if defined(GS_PATH) && !defined(PS_GS) +#define PS_GS 1 +#endif + +#if defined(PS_DPS) || defined(PS_NEWS) || defined(PS_GS) +#define PS 1 +#else +#define PS 0 +#endif + +EXTERN int scanned_page; /* last page prescanned */ + +#if PS +EXTERN int scanned_page_ps; /* last page scanned for PS specials */ +EXTERN int scanned_page_ps_bak; /* save the above if PS is turned off */ +#endif + +#if COLOR +EXTERN int scanned_page_color; /* last page scanned for color spcls */ +#endif + +EXTERN int scanned_page_reset; /* number to reset the above to */ + +/* + * The following is set when we're prescanning before opening up the windows, + * and we hit a PostScript header file. We can't start up gs until we get + * a window to associate the process to, so we have to prescan twice. + */ +#if PS_GS +EXTERN Boolean gs_postpone_prescan INIT(False); +#endif + +/* + * Per-page data in DVI file, indexed by page number - 1. + * Offset is initialized in prepare_pages(). + * Page size is initialized while prescanning. + */ +struct per_page { + long offset; + unsigned int pw, ph; /* page size */ + unsigned int ww, wh; /* window size */ +}; + +EXTERN struct per_page *page_info; + +/* + * Set if the -paper option overrides papersize specials. + */ +EXTERN Boolean ignore_papersize_specials INIT(False); + +/* + * Mechanism for reducing repeated warning about specials, lost characters, etc. + */ +EXTERN Boolean warn_spec_now; + +/* + * If we're in the middle of a PSFIG special. + */ +EXTERN Boolean psfig_begun INIT(False); + +/* + * Page on which to draw box from forward source special searching. + */ +EXTERN int source_fwd_box_page INIT(-1); /* -1 means no box */ + +/* + * Information on deferred source operation. See do_pages() for meaning. + */ +EXTERN _Xconst char *source_forward_string INIT(NULL); +EXTERN int source_reverse_x, source_reverse_y; +EXTERN int source_show_all; + + +/* + * Bitmap structure for raster ops. + */ +struct bitmap { + unsigned short w, h; /* width and height in pixels */ + short bytes_wide; /* scan-line width in bytes */ + char *bits; /* pointer to the bits */ +}; + +/* + * Per-character information. + * There is one of these for each character in a font (raster fonts only). + * All fields are filled in at font definition time, + * except for the bitmap, which is "faulted in" + * when the character is first referenced. + */ +struct glyph { + long addr; /* address of bitmap in font file */ + long dvi_adv; /* DVI units to move reference point */ + short x, y; /* x and y offset in pixels */ + struct bitmap bitmap; /* bitmap for character */ + short x2, y2; /* x and y offset in pixels (shrunken bitmap) */ +#if GREY +# if COLOR + struct fgrec *fg; /* fgrec for which these pixmaps are valid */ +# endif + XImage *image2; + char *pixmap2; + char *pixmap2_t; +#endif /* GREY */ + struct bitmap bitmap2; /* shrunken bitmap for character */ +}; + +/* + * Per-character information for virtual fonts + */ +struct macro { + ubyte *pos; /* address of first byte of macro */ + ubyte *end; /* address of last+1 byte */ + long dvi_adv; /* DVI units to move reference point */ + Boolean free_me; /* if free(pos) should be called when */ + /* freeing space */ +}; + +/* + * The layout of a font information block. + * There is one of these for every loaded font or magnification thereof. + * Duplicates are eliminated: this is necessary because of possible recursion + * in virtual fonts. + * + * Also note the strange units. The design size is in 1/2^20 point + * units (also called micro-points), and the individual character widths + * are in the TFM file in 1/2^20 ems units, i.e., relative to the design size. + * + * We then change the sizes to SPELL units (unshrunk pixel / 2^16). + */ + +#define NOMAGSTP (-29999) + +typedef void (*read_char_proc) ARGS((struct font *, wide_ubyte)); + +struct font { + struct font *next; /* link to next font info block */ + char *fontname; /* name of font */ + float fsize; /* size information (dots per inch) */ + int magstepval; /* magstep number * two, or NOMAGSTP */ + FILE *file; /* open font file or NULL */ + char *filename; /* name of font file */ + long checksum; /* checksum */ + unsigned short timestamp; /* for LRU management of fonts */ + ubyte flags; /* flags byte (see values below) */ + ubyte maxchar; /* largest character code */ + double dimconv; /* size conversion factor */ + set_char_proc set_char_p; /* proc used to set char */ + /* these fields are used by (loaded) raster fonts */ + read_char_proc read_char; /* function to read bitmap */ + struct glyph *glyph; + /* these fields are used by (loaded) virtual fonts */ + struct font **vf_table; /* list of fonts used by this vf */ + struct tn *vf_chain; /* ditto, if TeXnumber >= VFTABLELEN */ + struct font *first_font; /* first font defined */ + struct macro *macro; + /* I suppose the above could be put into a union, but we */ + /* wouldn't save all that much space. */ +}; + +#define FONT_IN_USE 1 /* used for housekeeping */ +#define FONT_LOADED 2 /* if font file has been read */ +#define FONT_VIRTUAL 4 /* if font is virtual */ + +#define TNTABLELEN 30 /* length of TeXnumber array (dvi file) */ +#define VFTABLELEN 5 /* length of TeXnumber array (virtual fonts) */ + +struct tn { + struct tn *next; /* link to next TeXnumber info block */ + int TeXnumber; /* font number (in DVI file) */ + struct font *fontp; /* pointer to the rest of the info */ +}; + +EXTERN struct font *tn_table[TNTABLELEN]; +EXTERN struct font *font_head INIT(NULL); +EXTERN struct tn *tn_head INIT(NULL); +EXTERN ubyte maxchar; +EXTERN unsigned short current_timestamp INIT(0); + +/* + * Command line flags. + */ + +extern struct _resource { +#if TOOLKIT && CFGFILE + _Xconst char *progname; +#endif +#if TOOLKIT + int shrinkfactor; + _Xconst char *main_translations; + _Xconst char *wheel_translations; + int dvips_hang; + int dvips_fail_hang; +#endif + int wheel_unit; + int _density; +#ifdef GREY + float _gamma; +#endif + int _pixels_per_inch; + _Xconst char *sidemargin; + _Xconst char *topmargin; + _Xconst char *xoffset; + _Xconst char *yoffset; + _Xconst char *paper; + _Xconst char *_alt_font; +#ifdef MKTEXPK + Boolean makepk; +#endif + _Xconst char *mfmode; + _Xconst char *editor; + _Xconst char *src_pos; + Boolean src_fork; + Boolean _list_fonts; + Boolean reverse; + Boolean _warn_spec; + Boolean _hush_chars; + Boolean _hush_chk; + Boolean safer; +#if defined(VMS) || !defined(TOOLKIT) + _Xconst char *fore_color; + _Xconst char *back_color; +#endif + Pixel _fore_Pixel; + Pixel _back_Pixel; +#ifdef TOOLKIT + Pixel _brdr_Pixel; + Pixel _hl_Pixel; + Pixel _cr_Pixel; +#endif + _Xconst char *icon_geometry; + Boolean keep_flag; + Boolean copy; + Boolean thorough; +#if PS + /* default is to use DPS, then NEWS, then GhostScript; + * we will figure out later on which one we will use */ + Boolean _postscript; + Boolean allow_shell; +#ifdef PS_DPS + Boolean useDPS; +#endif +#ifdef PS_NEWS + Boolean useNeWS; +#endif +#ifdef PS_GS + Boolean useGS; + Boolean gs_safer; + Boolean gs_alpha; + _Xconst char *gs_path; + _Xconst char *gs_palette; +#endif +#endif /* PS */ + Boolean prescan; + _Xconst char *debug_arg; + Boolean version_flag; +#if BUTTONS + Boolean expert; + _Xconst char *button_translations; + int shrinkbutton[9]; + Dimension btn_side_spacing; + Dimension btn_top_spacing; + Dimension btn_between_spacing; + Dimension btn_between_extra; + Dimension btn_border_width; +#endif + _Xconst char *mg_arg[5]; +#if COLOR + Boolean _use_color; +#endif +#ifdef GREY + Boolean _use_grey; + Bool3 install; +#endif +#if TOOLKIT + _Xconst char *dvips_path; +#endif +} resource; + +/* As a convenience, we define the field names without leading underscores + * to point to the field of the above record. Here are the global ones; + * the local ones are defined in each module. */ + +#define density resource._density +#define pixels_per_inch resource._pixels_per_inch +#define alt_font resource._alt_font +#define list_fonts resource._list_fonts +#define warn_spec resource._warn_spec +#define hush_chars resource._hush_chars +#define hush_chk resource._hush_chk +#if COLOR +#define use_color resource._use_color +#endif +#ifdef GREY +#define use_grey resource._use_grey +#endif + +#ifndef TOOLKIT +EXTERN Pixel brdr_Pixel; +#endif + +#if GREY +EXTERN Pixel plane_masks[4]; +#endif + +#if GREY || COLOR +EXTERN XColor color_data[2]; +#define fore_color_data color_data[0] +#define back_color_data color_data[1] +#endif + +#if COLOR + +struct rgb { + unsigned short r, g, b; +}; + +struct pagecolor { + struct rgb bg; + unsigned int stacksize; + _Xconst struct rgb *colorstack; +}; + +/* Information on background color and initial color stack for each page. */ +EXTERN struct pagecolor *page_colors INIT(NULL); + +/* The initial color stack is gotten from the pagecolor record for a page. */ +EXTERN _Xconst struct rgb *color_bottom; +EXTERN unsigned int color_bot_size; /* number of entries */ + +/* Additions to the runtime color stack on a given page are stored in a linked + list. "struct colorframe" is defined in special.c. */ +EXTERN struct colorframe *rcs_top; + +/* Color states. */ +EXTERN struct rgb fg_initial; /* Initial fg (from command line) */ +EXTERN struct rgb bg_initial; /* Initial bg */ + +/* + * For each (foreground, background) color pair, we keep information (depending + * on the color model). It is organized as a linked list of linked lists, + * with background color more significant. + */ + +struct bgrec { + struct bgrec *next; + struct rgb color; + struct fgrec *fg_head; + Boolean pixel_good; /* if the pixel entry is valid */ + Pixel pixel; +}; + +struct fgrec { + struct fgrec *next; + struct rgb color; + Boolean pixel_good; /* if the pixel entry is valid */ + Pixel pixel; +#if GREY + Boolean palette_good; /* if the palette entry is valid */ + Pixel palette[16]; /* non-TrueColor only */ +#endif +}; + +EXTERN struct bgrec *bg_head INIT(NULL); /* head of list */ +EXTERN struct bgrec *bg_current INIT(NULL); /* current bg value */ +EXTERN struct fgrec *fg_current; /* current fg value */ +EXTERN struct fgrec *fg_active INIT(NULL); /* where the GCs are */ + +/* List of allocated colors (to be deallocated upon document change) */ +EXTERN Pixel *color_list; /* list of colors */ +EXTERN unsigned int color_list_len INIT(0); /* current len of list*/ +EXTERN unsigned int color_list_max INIT(0); /* allocated size */ + +/* Whether the color situation has been warned about. */ +EXTERN Boolean color_warned INIT(False); + +/* Cursor color (for XRecolorCursor). */ +extern XColor cr_Color; + +#endif /* COLOR */ + +extern struct mg_size_rec { + int w; + int h; +} + mg_size[5]; + +EXTERN int debug INIT(0); + +#define DBG_BITMAP 1 +#define DBG_DVI 2 +#define DBG_PK 4 +#define DBG_BATCH 8 +#define DBG_EVENT 16 +#define DBG_OPEN 32 +#define DBG_PS 64 +#define DBG_CLIENT 128 +#define DBG_ALL (~DBG_BATCH) + +EXTERN int offset_x, offset_y; +EXTERN unsigned int unshrunk_paper_w, unshrunk_paper_h; +EXTERN unsigned int unshrunk_page_w, unshrunk_page_h; + +EXTERN char *dvi_name INIT(NULL); /* dvi file name */ +EXTERN FILE *dvi_file; /* user's file */ +EXTERN time_t dvi_time; /* last modification time */ +EXTERN ino_t dvi_inode; /* used for source specials */ +EXTERN unsigned char *dvi_property; /* for setting in window */ +EXTERN size_t dvi_property_length; +#if TOOLKIT +EXTERN Boolean titles_are_stale INIT(True); + /* replace icon/window titles */ +#endif +EXTERN _Xconst char *prog; +EXTERN int bak_shrink; /* last shrink factor != 1 */ +EXTERN Dimension window_w, window_h; +EXTERN XImage *image; +EXTERN int backing_store; +EXTERN int home_x, home_y; + +EXTERN Display *DISP; +EXTERN Screen *SCRN; +#if TOOLKIT +extern XtActionsRec Actions[]; +extern Cardinal num_actions; +#endif +#if XAW +EXTERN XtAccelerators accels_cr, accels_cr_click; +#endif +#ifdef GREY +EXTERN Visual *our_visual; +EXTERN unsigned int our_depth; +EXTERN Colormap our_colormap; +#else +#define our_depth (unsigned int) DefaultDepthOfScreen(SCRN) +#define our_visual DefaultVisualOfScreen(SCRN) +#define our_colormap DefaultColormapOfScreen(SCRN) +#endif +EXTERN GC ruleGC; +EXTERN GC foreGC, highGC; +EXTERN GC foreGC2; +EXTERN GC copyGC; +EXTERN Boolean copy; + +EXTERN Cursor redraw_cursor, ready_cursor, drag_cursor[3]; + +#if TOOLKIT +struct xdvi_action { + struct xdvi_action *next; + XtActionProc proc; + Cardinal num_params; + String param; +}; + +struct wheel_acts { + struct wheel_acts *next; + Modifiers mask; + Modifiers value; + struct _LateBindings *late_bindings; + unsigned int button; + struct xdvi_action *action; +}; + +EXTERN struct wheel_acts *wheel_actions; +#endif + +#if MOTIF && BUTTONS +EXTERN XtTranslations wheel_trans_table INIT(NULL); +#endif + +#ifdef GREY +EXTERN Pixel *pixeltbl; +EXTERN Pixel *pixeltbl_t; +#endif /* GREY */ + +/* + * Flag values and masks for event_flags + */ + +#define EV_IDLE (1<<0) /* non-event */ +#define EV_CURSOR (1<<1) /* cursor needs to revert back to ready */ +#define EV_EXPOSE (1<<2) /* expose occurred somewhere */ +#define EV_MAG_MOVE (1<<3) /* magnifier moved */ +#define EV_MAG_GONE (1<<4) /* magnifier gone while being drawn */ +#define EV_ACK (1<<5) /* used internally */ +#define EV_SRC (1<<6) /* source special operation is pending */ +#define EV_NEWPAGE (1<<7) /* new page requested */ +#define EV_PS_TOGGLE (1<<8) /* PostScript toggled on or off */ +#define EV_NEWDOC (1<<9) /* new dvi file requested */ +#define EV_TERM (1<<10) /* quit */ +#define EV_MAXPLUS1 (1<<11) + +#define EV_GE_IDLE (EV_MAXPLUS1 - EV_IDLE) +#define EV_GT_IDLE (EV_MAXPLUS1 - EV_CURSOR) +#define EV_GE_CURSOR (EV_MAXPLUS1 - EV_CURSOR) +#define EV_GE_EXPOSE (EV_MAXPLUS1 - EV_EXPOSE) +#define EV_GE_MAG_MOVE (EV_MAXPLUS1 - EV_MAG_MOVE) +#define EV_GE_MAG_GONE (EV_MAXPLUS1 - EV_MAG_GONE) +#define EV_GE_ACK (EV_MAXPLUS1 - EV_ACK) +#define EV_GE_NEWPAGE (EV_MAXPLUS1 - EV_NEWPAGE) +#define EV_GE_PS_TOGGLE (EV_MAXPLUS1 - EV_PS_TOGGLE) +#define EV_GE_NEWDOC (EV_MAXPLUS1 - EV_NEWDOC) +#define EV_GE_TERM (EV_MAXPLUS1 - EV_TERM) + +#define EV_NOWAIT EV_GE_IDLE + +EXTERN unsigned int ev_flags INIT(EV_IDLE); +EXTERN VOLATILE int event_counter INIT(0); +EXTERN jmp_buf canit_env; + +struct xchild { + struct xchild *next; /* link to next in list */ + pid_t pid; /* pid of process, or 0 */ + Boolean killable; /* if can be killed with SIGKILL */ + void (*proc) ARGS((int)); /* procedure to call */ +}; + +struct xio { + struct xio *next; /* link to next in list */ + int fd; /* file descriptor */ + int xio_events; /* same as in struct pollfd (can't call + it events because poll.h on AIX + defines events to something else) */ +#if HAVE_POLL + struct pollfd *pfd; +#endif + void (*read_proc) ARGS((void)); /* call to read */ + void (*write_proc) ARGS((void)); /* call to write */ +}; + +struct xtimer { + struct xtimer *next; /* link to next in chain */ + struct timeval when; /* when to call the routine */ + void (*proc) ARGS((struct xtimer *)); /* procedure to call */ +#if MOTIF_TIMERS + XtTimerCallbackProc xt_proc; /* additional data for Xm */ + XtPointer closure; +#endif +}; + +#if MOTIF_TIMERS +# define TIMER_INIT(proc) {NULL, {0, 0}, proc, NULL, NULL} +#else +# define TIMER_INIT(proc) {NULL, {0, 0}, proc} +#endif + +struct WindowRec { + Window win; + int shrinkfactor; + int base_x, base_y; + unsigned int width, height; + int min_x, max_x, min_y, max_y; /* for pending expose events */ +}; + +extern struct WindowRec mane, alt, currwin; +EXTERN int min_x, max_x, min_y, max_y; +EXTERN Boolean drawing_mag INIT(False); + +#define shrink_factor currwin.shrinkfactor + +#if TOOLKIT +EXTERN Widget top_level INIT(0); +EXTERN Widget vport_widget, draw_widget, clip_widget; +# if MOTIF +EXTERN Widget shrink_button[4]; +EXTERN Widget x_bar, y_bar; /* horizontal and vert. scroll bars */ +# endif +# if BUTTONS +EXTERN Widget form_widget; +EXTERN int xtra_wid INIT(0); +extern _Xconst char default_button_config[]; /* defined in events.c */ +# if XAW +EXTERN Widget panel_widget; +EXTERN Cursor panel_cursor INIT(0); +# endif +# endif +#else /* not TOOLKIT */ +EXTERN Window top_level INIT(0); + +#define BAR_WID 12 /* width of darkened area */ +#define BAR_THICK 15 /* gross amount removed */ +#endif /* not TOOLKIT */ + +#if XAW +#define WARN(t, s) (void) warning_popup(s, "OK", NULL) +#define WARN1(t, s, s1) (void) warning_popup_long(s, "OK", NULL, s1) +#define WARN2(t, s, s1, s2) (void) warning_popup_long(s, "OK", NULL, s1, s2) +#elif MOTIF +#define WARN(t, s) (void) warning_popup(s, t, NULL, NULL) +#define WARN1(t, s, s1) (void) warning_popup_long(s, t, NULL, NULL, s1) +#define WARN2(t, s, s1, s2) (void) warning_popup_long(s, t, NULL, NULL, s1, s2) +#elif CC_K_AND_R +#define WARN(t, s) (void) fputs(s "\n", stderr) +#define WARN1(t, s, s1) (void) fprintf(stderr, s "\n", s1) +#else +#define WARN(t, s) (void) (fputs(s, stderr), putc('\n', stderr)) +#define WARN1(t, s, s1) (void) (fprintf(stderr, s, s1), putc('\n', stderr)) +#endif + +/* + * If a popup is popped up before the main window, then the main window is + * likely to cover it. So we have to postpone popping them up until after + * realizing the main window. It is not workable to pop them up immediately + * and then raise them later, due to unpredictable window manager behavior. + */ + +#if TOOLKIT +EXTERN Boolean postpone_popups INIT(True); +EXTERN size_t n_init_popups INIT(0); +EXTERN Widget *init_popups; +EXTERN size_t alloc_init_popups INIT(0); +#endif + +/* + * Structure to use for status popups. + */ + +#if TOOLKIT +struct status_popup { + Widget shell; + Widget label; + int expected_type; + Boolean popped; + Boolean spurious; +}; +#endif + +EXTERN char *ffline INIT(NULL); /* an array used by filefind to store */ + /* the file name being formed. */ + /* It expands as needed. */ + /* Also used elsewhere. */ +EXTERN size_t ffline_len INIT(0); /* current length of ffline[] */ + +/* + * Used by the geometry-scanning routines. + * It passes pointers to routines to be called at certain + * points in the dvi file, and other information. + */ + +struct geom_info { + void (*geom_box) ARGS((struct geom_info *, + long, long, long, long)); + void (*geom_special) ARGS((struct geom_info *, _Xconst char *)); + jmp_buf done_env; + void *geom_data; +}; + +typedef void (*mouse_proc) ARGS((XEvent *)); +extern void null_mouse ARGS((XEvent *)); + +EXTERN mouse_proc mouse_motion INIT(null_mouse); +EXTERN mouse_proc mouse_release INIT(null_mouse); + +/* Used for source special lookup (forward search) and for window manager + delete protocol (toolkit only). */ + +#if XAW +EXTERN Atom atoms[5]; +#elif MOTIF +EXTERN Atom atoms[4]; +#else +EXTERN Atom atoms[3]; +#endif + +#define ATOM_XDVI_WINDOWS (atoms[0]) +#define ATOM_DVI_FILE (atoms[1]) +#define ATOM_SRC_GOTO (atoms[2]) +#if TOOLKIT +#define XA_WM_DELETE_WINDOW (atoms[3]) +#endif +#if XAW +#define XA_WM_PROTOCOLS (atoms[4]) +#endif + +#ifdef SELFAUTO +EXTERN _Xconst char *argv0; /* argv[0] */ +#endif + +#if PS + +extern struct psprocs { + void (*toggle) ARGS((void)); + void (*destroy) ARGS((void)); + void (*interrupt) ARGS((void)); + void (*endpage) ARGS((void)); + void (*drawbegin) ARGS((int, int, _Xconst char *)); + void (*drawraw) ARGS((_Xconst char *)); + void (*drawfile) ARGS((_Xconst char *, FILE *)); + void (*drawend) ARGS((_Xconst char *)); + void (*beginheader) ARGS((void)); + void (*endheader) ARGS((void)); + void (*newdoc) ARGS((void)); +} psp, no_ps_procs; + +#endif /* PS */ + +/******************************** + * Procedures * + *******************************/ + +_XFUNCPROTOBEGIN + +extern int atopix ARGS((_Xconst char *, wide_bool)); +#if TOOLKIT +extern Bool compile_action ARGS((_Xconst char *, struct xdvi_action **)); +#endif +#if BUTTONS +extern void create_buttons ARGS((void)); +#if XAW +extern void set_button_panel_height ARGS((XtArgVal)); +#endif +#endif /* BUTTONS */ +#if GREY +extern void init_plane_masks ARGS((void)); +#endif +#if COLOR +extern Pixel alloc_color ARGS((_Xconst struct rgb *, Pixel)); +extern void do_color_change ARGS((void)); +#elif GREY +extern void init_pix ARGS((void)); +#endif +extern void expose ARGS((struct WindowRec *, int, int, + unsigned int, unsigned int)); +extern void home ARGS((wide_bool)); +extern void reconfig ARGS((void)); +#if TOOLKIT +extern void handle_resize ARGS((Widget, XtPointer, XEvent *, Boolean *)); +extern void handle_expose ARGS((Widget, XtPointer, XEvent *, Boolean *)); +extern void handle_property_change ARGS((Widget, XtPointer, XEvent *, + Boolean *)); +#endif +#if XAW +extern void handle_messages ARGS((Widget, XtPointer, XEvent *, Boolean *)); +#elif MOTIF +extern void handle_wm_delete ARGS((Widget, XtPointer, XtPointer)); +#endif +extern void goto_page ARGS((int, home_proc)); +#if MOTIF +extern void file_pulldown_callback ARGS((Widget, XtPointer, XtPointer)); +extern void navigate_pulldown_callback ARGS((Widget, XtPointer, XtPointer)); +extern void scale_pulldown_callback ARGS((Widget, XtPointer, XtPointer)); +extern void set_shrink_factor ARGS((int)); +extern void popdown_callback ARGS((Widget, XtPointer, XtPointer)); +#endif +#if !TOOLKIT +extern void showmessage ARGS((_Xconst char *)); +#endif +extern void set_chld ARGS((struct xchild *)); +extern void clear_chld ARGS((struct xchild *)); +extern void set_io ARGS((struct xio *)); +extern void clear_io ARGS((struct xio *)); +extern void set_timer ARGS((struct xtimer *, int)); +extern void cancel_timer ARGS((struct xtimer *)); +extern unsigned int read_events ARGS((unsigned int)); +extern void enable_intr ARGS((void)); +extern void do_pages ARGS((void)) NORETURN; +#if XAW +extern void simple_popup ARGS((struct status_popup *, _Xconst char *, + XtCallbackProc)); +extern void simple_popdown ARGS((struct status_popup *)); +extern void do_popup ARGS((Widget)); +extern Widget warning_popup ARGS((_Xconst char *, _Xconst char *, + XtCallbackProc)); +extern Widget warning_popup_long VARGS((_Xconst char *, _Xconst char *, + XtCallbackProc, ...)); +extern void Act_print ARGS((Widget, XEvent *, String *, Cardinal *)); +extern void Act_open_dvi_file ARGS((Widget, XEvent *, String *, + Cardinal *)); +#elif MOTIF +extern void simple_popup ARGS((struct status_popup *, _Xconst char *, + XtCallbackProc)); +extern void simple_popdown ARGS((struct status_popup *)); +extern void do_popup ARGS((Widget)); +extern Widget warning_popup ARGS((_Xconst char *, int, _Xconst char *, + XtCallbackProc)); +extern Widget warning_popup_long ARGS((_Xconst char *, int, _Xconst char *, + XtCallbackProc, ...)); +extern void Act_print ARGS((Widget, XEvent *, String *, Cardinal *)); +extern void Act_open_dvi_file ARGS((Widget, XEvent *, String *, + Cardinal *)); +#endif +extern void reset_fonts ARGS((void)); +#if COLOR +extern void reset_colors ARGS((void)); +extern void full_reset_colors ARGS((void)); +#endif +extern void realloc_font ARGS((struct font *, wide_ubyte)); +extern void realloc_virtual_font ARGS((struct font *, wide_ubyte)); +extern Boolean load_font ARGS((struct font *)); +extern struct font *define_font ARGS((FILE *, wide_ubyte, + struct font *, struct font **, unsigned int, + struct tn **)); +extern void init_page ARGS((void)); +extern Boolean open_dvi_file ARGS((_Xconst char *)); +extern void form_dvi_property ARGS((ino_t)); +extern void init_dvi_file ARGS((void)); +extern void set_dvi_property ARGS((void)); +extern Boolean check_dvi_file ARGS((void)); +extern void reload_dvi_file ARGS((void)); +#ifndef TEXXET +extern long set_char ARGS((wide_ubyte)); +extern long load_n_set_char ARGS((wide_ubyte)); +extern long set_vf_char ARGS((wide_ubyte)); +#else +extern void set_char ARGS((wide_ubyte, wide_ubyte)); +extern void load_n_set_char ARGS((wide_ubyte, wide_ubyte)); +extern void set_vf_char ARGS((wide_ubyte, wide_ubyte)); +#endif +extern void prescan ARGS((void)); +extern void draw_page ARGS((void)); +extern void source_reverse_search ARGS((int, int)); +extern void source_special_show ARGS((wide_bool)); +extern void source_forward_search ARGS((_Xconst char *)); +#if CFGFILE +extern void readconfig ARGS((void)); +#endif +extern void init_font_open ARGS((void)); +extern FILE *font_open ARGS((_Xconst char *, char **, double, int *, int, + char **)); +#if PS +extern void ps_clear_cache ARGS((void)); +extern void ps_destroy ARGS((void)); +#endif +extern void init_prescan ARGS((void)); +#if COLOR +extern void scan_color_eop ARGS((void)); +extern void set_fg_color ARGS((_Xconst struct rgb *)); +#endif +extern void applicationDoSpecial ARGS((char *)); +extern void scan_special ARGS((char *)); +extern void geom_do_special ARGS((struct geom_info *, char *, double)); +extern void xdvi_exit ARGS((int)) NORETURN; +extern void oops VARGS((_Xconst char *, ...)) NORETURN; +#ifndef KPATHSEA +extern void *xmalloc ARGS((unsigned)); +extern void *xrealloc ARGS((void *, unsigned)); +extern char *xstrdup ARGS((_Xconst char *)); +extern char *xmemdup ARGS((_Xconst char *, size_t)); +#endif +#if TOOLKIT && !HAVE_STRERROR && !defined strerror +extern char *strerror ARGS((int)); +#endif +extern void expandline ARGS((size_t)); +extern void alloc_bitmap ARGS((struct bitmap *)); +#ifndef KPATHSEA +extern void xputenv ARGS((_Xconst char *, _Xconst char *)); +#endif +extern int memicmp ARGS((_Xconst char *, _Xconst char *, size_t)); +extern FILE *xfopen ARGS((_Xconst char *, OPEN_MODE_ARGS)); +#if XAW +extern int xopen ARGS((_Xconst char *, int)); +#endif +extern int xpipe ARGS((int *)); +extern DIR *xopendir ARGS((_Xconst char *)); +extern _Xconst struct passwd *ff_getpw ARGS((_Xconst char **, _Xconst char *)); +extern unsigned long num ARGS((FILE *, int)); +extern long snum ARGS((FILE *, int)); +extern size_t property_get_data ARGS((Window, Atom, unsigned char **, + int (*x_get_property) (Display *, Window, Atom, long, + long, Bool, Atom, Atom *, int *, unsigned long *, + unsigned long *, unsigned char **))); +#if PS +extern int xdvi_temp_fd ARGS((char **)); +#endif +extern void prep_fd ARGS((int, wide_bool)); +extern void read_PK_index ARGS((struct font *, wide_bool)); +extern void read_GF_index ARGS((struct font *, wide_bool)); +extern void read_VF_index ARGS((struct font *, wide_bool)); + +#if PS +extern void ps_init_paths ARGS((void)); +extern void drawbegin_none ARGS((int, int, _Xconst char *)); +extern void draw_bbox ARGS((void)); +extern void NullProc ARGS((void)); +#ifdef PS_DPS +extern Boolean initDPS ARGS((void)); +#endif +#ifdef PS_NEWS +extern Boolean initNeWS ARGS((void)); +#endif +#ifdef PS_GS +extern Boolean initGS ARGS((void)); +extern void gs_resume_prescan ARGS((void)); +#endif +#endif /* PS */ + +_XFUNCPROTOEND + +#define one(fp) ((unsigned char) getc(fp)) +#define sone(fp) ((long) one(fp)) +#define two(fp) num (fp, 2) +#define stwo(fp) snum(fp, 2) +#define four(fp) num (fp, 4) +#define sfour(fp) snum(fp, 4) + +#endif /* XDVI_H */ |