diff options
Diffstat (limited to 'Build/source/texk/windvi/winevt.c')
-rw-r--r-- | Build/source/texk/windvi/winevt.c | 1235 |
1 files changed, 0 insertions, 1235 deletions
diff --git a/Build/source/texk/windvi/winevt.c b/Build/source/texk/windvi/winevt.c deleted file mode 100644 index 77b9ef0ba43..00000000000 --- a/Build/source/texk/windvi/winevt.c +++ /dev/null @@ -1,1235 +0,0 @@ -/* - * Copyright (c) 1994 Paul Vojta. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * NOTE: - * xdvi is based on prior work as noted in the modification history, below. - */ - -/* - * DVI previewer for X. - * - * Eric Cooper, CMU, September 1985. - * - * Code derived from dvi-imagen.c. - * - * Modification history: - * 1/1986 Modified for X.10 --Bob Scheifler, MIT LCS. - * 7/1988 Modified for X.11 --Mark Eichin, MIT - * 12/1988 Added 'R' option, toolkit, magnifying glass - * --Paul Vojta, UC Berkeley. - * 2/1989 Added tpic support --Jeffrey Lee, U of Toronto - * 4/1989 Modified for System V --Donald Richardson, Clarkson Univ. - * 3/1990 Added VMS support --Scott Allendorf, U of Iowa - * 7/1990 Added reflection mode --Michael Pak, Hebrew U of Jerusalem - * 1/1992 Added greyscale code --Till Brychcy, Techn. Univ. Muenchen - * and Lee Hetherington, MIT - * 7/1992 Added extra menu buttons--Nelson H. F. Beebe <beebe@math.utah.edu> - * 4/1994 Added DPS support, bounding box - * --Ricardo Telichevesky - * and Luis Miguel Silveira, MIT RLE. - * 2/1995 Added rulers support --Nelson H. F. Beebe <beebe@math.utah.edu> - * - * Compilation options: - * SYSV compile for System V - * VMS compile for VMS - * NOTOOL compile without toolkit - * BUTTONS compile with buttons on the side of the window (needs toolkit) - * MSBITFIRST store bitmaps internally with most significant bit first - * BMSHORT store bitmaps in shorts instead of bytes - * BMLONG store bitmaps in longs instead of bytes - * ALTFONT default for -altfont option - * A4 use European size paper - * TEXXET support reflection dvi codes (right-to-left typesetting) - * GREY use grey levels to shrink fonts - * PS_DPS use display postscript to render pictures/bounding boxes - * PS_NEWS use the NeWS server to render pictures/bounding boxes - * PS_GS use Ghostscript to render pictures/bounding boxes - * GS_PATH path to call the Ghostscript interpreter by - */ - -#if 0 -static char copyright[] = -"@(#) Copyright (c) 1994 Paul Vojta. All rights reserved.\n"; -#endif - -#define EXTERN -#define INIT(x) =x - -#include <windows.h> -#include <commdlg.h> -#include <direct.h> -#include "wingui.h" -#include "xdvi-config.h" - -#include "dvi.h" - -#define get_xy() -static Position window_x, window_y; -#define clip_w mane.width -#define clip_h mane.height - -struct mg_size_rec mg_size[5] = {{200, 150}, {400, 250}, {700, 500}, - {1000, 800}, {1200, 1200}}; - -struct WindowRec mane = {(Window) 0, 1, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0}; -struct WindowRec alt = {(Window) 0, 1, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0}; -/* currwin is temporary storage except for within redraw() */ -struct WindowRec currwin = {(Window) 0, 3, 0, 0, 0, 0, MAXDIM, 0, MAXDIM, 0}; - - -/* - * Mechanism to keep track of the magnifier window. The problems are, - * (a) if the button is released while the window is being drawn, this - * could cause an X error if we continue drawing in it after it is - * destroyed, and - * (b) creating and destroying the window too quickly confuses the window - * manager, which is avoided by waiting for an expose event before - * destroying it. - */ -static short alt_stat; /* 1 = wait for expose, */ -/* -1 = destroy upon expose */ -static Boolean alt_canit; /* stop drawing this window */ - -/* - * Data for buffered events. - */ - -static VOLATILE short event_freq = 70; - -static void can_exposures(), keystroke(); - - -/* We split this help string into smaller pieces, because some C -implementations have been known to croak on large strings. */ - -static char* help_string[] = -{ - "", - "----------------------------Help and Exiting----------------------------", - "", - "h or H or ? or Help", - " Displays this help text.", - "", - "q or Control-C or Control-D or Cancel or Stop or Control-Z (VAX VMS)", - " Quits the program.", - "", - "------------------------------Page Motion-------------------------------", - "", - "n or f or Space or Return or LineFeed or PgDn", - " Moves to the next page (or to the nth next page if a", - " number is given).", - "", - "p or b or Control-H or BackSpace or DELete or PgUp", - " Moves to the previous page (or back n pages).", - "", - "u or Up-arrow", - " Moves up two thirds of a window-full.", - "", - "d or Down-arrow", - " Moves down two thirds of a window-full.", - "", - "l or Left-arrow", - " Moves left two thirds of a window-full.", - "", - "r or Right-arrow", - " Moves right two thirds of a window-full.", - "", - "g or j or End", - " Moves to the page with the given number. Initially,", - " the first page is assumed to be page number 1, but this", - " can be changed with the `P' keystroke, below. If no", - " page number is given, then it goes to the last page.", - "", - "< Move to first page in document.", - "> Move to last page in document.", - "", - "-----------------------------Other Commands-----------------------------", - "", - "Control-A or Again", - " Repeat last command (including its argument).", - "", - "Control-L or Clear", - " Redisplays the current page.", - "", - "Control-P", - " Prints bitmap unit, bit order, and byte order.", - "", - "^ or Home", - " Move to the ``home'' position of the page. This is", - " normally the upper left-hand corner of the page,", - " depending on the margins as described in the -margins", - " option, above.", - "", - "c Moves the page so that the point currently beneath the", - " cursor is moved to the middle of the window. It also", - " (gasp!) warps the cursor to the same place.", - "", - "G This key toggles the use of greyscale anti-aliasing for", - " displaying shrunken bitmaps. In addition, the key", - " sequences `0G' and `1G' clear and set this flag,", - " respectively. See also the -nogrey option.", - "", - "k Normally when xdvi switches pages, it moves to the home", - " position as well. The `k' keystroke toggles a `keep-", - " position' flag which, when set, will keep the same", - " position when moving between pages. Also `0k' and `1k'", - " clear and set this flag, respectively. See also the", - " -keep option.", - "", - "M Sets the margins so that the point currently under the", - " cursor is the upper left-hand corner of the text in the", - " page. Note that this command itself does not move the", - " image at all. For details on how the margins are used,", - " see the -margins option.", - "", - "P ``This is page number n.'' This can be used to make", - " the `g' keystroke refer to actual page numbers instead", - " of absolute page numbers.", - "", - "R Forces the dvi file to be reread. This allows you to", - " preview many versions of the same file while running", - " xdvi only once.", - "", - "s Changes the shrink factor to the given number. If no", - " number is given, the smallest factor that makes the", - " entire page fit in the window will be used. (Margins", - " are ignored in this computation.)", - "", - "S Sets the density factor to be used when shrinking", - " bitmaps. This should be a number between 0 and 100;", - " higher numbers produce lighter characters.", - "", - "t Toggles to the next unit in a sorted list of TeX dimension", - " units for the popup magnifier ruler.", - "", - "x Toggles expert mode (in which the buttons do not appear).", - " Also `0x' and `1x' clear and enable this mode,", - " respectively. See also the -expert option.", - "", - "V Toggles Ghostscript anti-aliasing. Also `0V' and `1V' clear", - " and enables this mode, respectively. See also the the -gsalpha", - " option.", - "", -#ifdef SELFILE - "Control-F Find another DVI file.", - "", -#endif -#ifdef HTEX - "B Go back to the previous anchor.", - "F Follow hyperlink forward.", - "", -#endif - "------------------------------------------------------------------------", -}; - -static char *TmpDir=NULL; - -void -show_help() -{ - int k; - - for (k = 0; k < (sizeof(help_string)/sizeof(help_string[0])); ++k) - (void)puts(help_string[k]); -} - -/* - * Ruler routines - */ - -static int -tick_scale(k) - int k; -{ - if (k == 0) - return 3; - else if ((k % 1000) == 0) - return 7; - else if ((k % 500) == 0) - return 6; - else if ((k % 100) == 0) - return 5; - else if ((k % 50) == 0) - return 4; - else if ((k % 10) == 0) - return 3; - else if ((k % 5) == 0) - return 2; - else - return 1; -} - - -void -draw_rulers(width, height, ourGC) - unsigned int width, height; - GC ourGC; -{ -#ifdef WIN32 - int k; /* tick counter */ - double old_pixels_per_tick; - double pixels_per_tick; - int scale; - int tick_offset; /* offset along axes */ - int x; /* coordinates of top-left popup */ - int y; /* window corner */ - double xx; /* coordinates of tick */ - double yy; /* coordinates of tick */ - static char *last_tick_units = ""; /* memory of last tick units */ - - if (tick_length <= 0) /* user doesn't want tick marks */ - return; - - x = 0; /* the pop-up window always has origin (0,0) */ - y = 0; - - /* We need to clear the existing window to remove old rulers. I think - that this could be avoided if draw_rulers() could be invoked earlier. - The expose argument in XClearArea() must be True to force redrawing - of the text inside the popup window. Also, it would be better to draw - the rulers before painting the text, so that rulers would not - overwrite the text, but I haven't figured out yet how to arrange - that. */ - -#if 1 - XClearArea(DISP, alt.win, x, y, width, height, True); -#endif - /* The global resource._pixels_per_inch tells us how to find the ruler - scale. For example, 300dpi corresponds to these TeX units: - - 1 TeX point (pt) = 4.151 pixels - 1 big point (bp) = 4.167 pixels - 1 pica (pc) = 49.813 pixels - 1 cicero (cc) = 53.501 pixels - 1 didot point (dd) = 4.442 pixels - 1 millimeter (mm) = 11.811 pixels - 1 centimeter (cm) = 118.110 pixels - 1 inch (in) = 300.000 pixels - 1 scaled point (sp) = 0.00006334 pixels - - The user can select the units via a resource (e.g. XDvi*tickUnits: bp), - or a command-line option (e.g. -xrm '*tickUnits: cm'). The length of - the ticks can be controlled by a resource (e.g. XDvi*tickLength: 10), or - a command-line option (e.g. -xrm '*tickLength: 10000'). If the tick - length exceeds the popup window size, then a graph-paper grid is drawn - over the whole window. Zero, or negative, tick length completely - suppresses rulers. */ - - pixels_per_tick = (double)resource._pixels_per_inch; - if (strcmp(tick_units,"pt") == 0) - pixels_per_tick /= 72.27; - else if (strcmp(tick_units,"bp") == 0) - pixels_per_tick /= 72.0; - else if (strcmp(tick_units,"in") == 0) - /* NO-OP */; - else if (strcmp(tick_units,"cm") == 0) - pixels_per_tick /= 2.54; - else if (strcmp(tick_units,"mm") == 0) - pixels_per_tick /= 25.4; - else if (strcmp(tick_units,"dd") == 0) - pixels_per_tick *= (1238.0 / 1157.0) / 72.27; - else if (strcmp(tick_units,"cc") == 0) - pixels_per_tick *= 12.0 * (1238.0 / 1157.0) / 72.27; - else if (strcmp(tick_units,"pc") == 0) - pixels_per_tick *= 12.0 /72.27; - else if (strcmp(tick_units,"sp") == 0) - pixels_per_tick /= (65536.0 * 72.27); - else - { - Printf("Unrecognized tickUnits [%s]: defaulting to TeX points [pt]\n", - tick_units); - tick_units = "pt"; - pixels_per_tick /= 72.27; - } - - /* To permit accurate measurement in the popup window, we can reasonably - place tick marks about 3 to 10 pixels apart, so we scale the computed - pixels_per_tick by a power of ten to bring it into that range. */ - - old_pixels_per_tick = pixels_per_tick; /* remember the original scale */ - while (pixels_per_tick < 3.0) - pixels_per_tick *= 10.0; - while (pixels_per_tick > 30.0) - pixels_per_tick /= 10.0; - if (strcmp(last_tick_units, tick_units) != 0) - { /* tell user what the ruler scale is, but only when it changes */ - if (old_pixels_per_tick != pixels_per_tick) - Printf("Ruler tick interval adjusted to represent %.2f%s\n", - pixels_per_tick/old_pixels_per_tick, tick_units); - else if (debug & DBG_EVENT) - Printf("Ruler tick interval represents 1%s\n", tick_units); - } - - /* In order to make the ruler as accurate as possible, given the coarse - screen resolution, we compute tick positions in floating-point - arithmetic, then round to nearest integer values. */ - - for (k = 0, xx = 0.0; xx < (double)width; k++, xx += pixels_per_tick) - { /* draw vertical ticks on top and bottom */ - tick_offset = (int)(0.5 + xx); /* round to nearest pixel */ - scale = tick_scale(k); - XDrawLine(DISP, alt.win, ourGC, - x + tick_offset, y, - x + tick_offset, y + scale*tick_length); - XDrawLine(DISP, alt.win, ourGC, - x + tick_offset, y + height, - x + tick_offset, y + height - scale*tick_length); - } - - for (k = 0, yy = 0.0; yy < (double)height; k++, yy += pixels_per_tick) - { /* draw horizontal ticks on left and right */ - tick_offset = (int)(0.5 + yy); /* round to nearest pixel */ - scale = tick_scale(k); - XDrawLine(DISP, alt.win, ourGC, - x, y + tick_offset, - x + scale*tick_length, y + tick_offset); - XDrawLine(DISP, alt.win, ourGC, - x + width, y + tick_offset, - x + width - scale*tick_length, y + tick_offset); - } - - last_tick_units = tick_units; - -#if 0 - XFlush(DISP); /* bring window up-to-date */ -#endif -#endif -} - - /* The global resource._pixels_per_inch tells us how to find the ruler - scale. For example, 300dpi corresponds to these TeX units: - - 1 TeX point (pt) = 4.151 pixels - 1 big point (bp) = 4.167 pixels - 1 pica (pc) = 49.813 pixels - 1 cicero (cc) = 53.501 pixels - 1 didot point (dd) = 4.442 pixels - 1 millimeter (mm) = 11.811 pixels - 1 centimeter (cm) = 118.110 pixels - 1 inch (in) = 300.000 pixels - 1 scaled point (sp) = 0.00006334 pixels - - The user can select the units via a resource (e.g. XDvi*tickUnits: bp), - or a command-line option (e.g. -xrm '*tickUnits: cm'). The length of - the ticks can be controlled by a resource (e.g. XDvi*tickLength: 10), or - a command-line option (e.g. -xrm '*tickLength: 10000'). If the tick - length exceeds the popup window size, then a graph-paper grid is drawn - over the whole window. Zero, or negative, tick length completely - suppresses rulers. */ -const_string pos_format; -double p2u_factor; - -void pixel_to_unit() -{ - double pixels_per_tick = (double)resource._pixels_per_inch; - - if (strcmp(tick_units,"pt") == 0) { - p2u_factor = 72.27 / pixels_per_tick; - pos_format = "%10.3fpt x %10.3fpt"; - } - else if (strcmp(tick_units,"bp") == 0) { - p2u_factor = 72.0 / pixels_per_tick; - pos_format = "%10.3fbp x %10.3fbp"; - } - else if (strcmp(tick_units,"in") == 0) { - p2u_factor = 1.0 / pixels_per_tick; - pos_format = "%10.3fin x %10.3fin"; - } - else if (strcmp(tick_units,"cm") == 0) { - p2u_factor = 2.54 / pixels_per_tick; - pos_format = "%10.3lfcm x %10.3lfcm"; - } - else if (strcmp(tick_units,"mm") == 0) { - p2u_factor = 25.4 / pixels_per_tick; - pos_format = "%10.3lfmm x %10.3lfmm"; - } - else if (strcmp(tick_units,"dd") == 0) { - p2u_factor = 1.0 / pixels_per_tick / ((1238.0 / 1157.0) / 72.27); - pos_format = "%10.3lfdd x %10.3lfdd"; - } - else if (strcmp(tick_units,"cc") == 0) { - p2u_factor = 1.0 / pixels_per_tick / (12.0 * (1238.0 / 1157.0) / 72.27); - pos_format = "%10.3lfcc x %10.3lfcc"; - } - else if (strcmp(tick_units,"pc") == 0) { - p2u_factor = 1.0 / pixels_per_tick / (12.0 /72.27); - pos_format = "%10.3lfpc x %10.3lfpc"; - } - else if (strcmp(tick_units,"sp") == 0) { - p2u_factor = 1.0 / pixels_per_tick * (65536.0 * 72.27); - pos_format = "%10.3lfsp x %10.3lfsp"; - } - else - { - Printf("Unrecognized tickUnits [%s]: defaulting to TeX points [pt]\n", - tick_units); - tick_units = "pt"; - p2u_factor = 72.27 / pixels_per_tick; - pos_format = "%10.3fpt x %10.3fpt"; - } -} - - - -#ifndef WIN32 -/* - * Event-handling routines - */ - -static void -expose(windowrec, x, y, w, h) - register struct WindowRec *windowrec; - int x, y; - unsigned int w, h; -{ - if (windowrec->min_x > x) windowrec->min_x = x; - if (windowrec->max_x < x + w) - windowrec->max_x = x + w; - if (windowrec->min_y > y) windowrec->min_y = y; - if (windowrec->max_y < y + h) - windowrec->max_y = y + h; -} - -static void -clearexpose(windowrec, x, y, w, h) - struct WindowRec *windowrec; - int x, y; - unsigned int w, h; -{ - XClearArea(DISP, windowrec->win, x, y, w, h, False); - expose(windowrec, x, y, w, h); -} - -static void -scrollwindow(windowrec, x0, y0) - register struct WindowRec *windowrec; - int x0, y0; -{ - int x, y; - int x2 = 0, y2 = 0; - int ww, hh; - - x = x0 - windowrec->base_x; - y = y0 - windowrec->base_y; - ww = windowrec->width - x; - hh = windowrec->height - y; - windowrec->base_x = x0; - windowrec->base_y = y0; - if (currwin.win == windowrec->win) { - currwin.base_x = x0; - currwin.base_y = y0; - } - windowrec->min_x -= x; - if (windowrec->min_x < 0) windowrec->min_x = 0; - windowrec->max_x -= x; - if (windowrec->max_x > windowrec->width) - windowrec->max_x = windowrec->width; - windowrec->min_y -= y; - if (windowrec->min_y < 0) windowrec->min_y = 0; - windowrec->max_y -= y; - if (windowrec->max_y > windowrec->height) - windowrec->max_y = windowrec->height; - if (x < 0) { - x2 = -x; - x = 0; - ww = windowrec->width - x2; - } - if (y < 0) { - y2 = -y; - y = 0; - hh = windowrec->height - y2; - } - if (ww <= 0 || hh <= 0) { - XClearWindow(DISP, windowrec->win); - windowrec->min_x = windowrec->min_y = 0; - windowrec->max_x = windowrec->width; - windowrec->max_y = windowrec->height; - } - else { - XCopyArea(DISP, windowrec->win, windowrec->win, - DefaultGCOfScreen(SCRN), x, y, - (unsigned int) ww, (unsigned int) hh, x2, y2); - if (x > 0) - clearexpose(windowrec, ww, 0, - (unsigned int) x, windowrec->height); - if (x2 > 0) - clearexpose(windowrec, 0, 0, - (unsigned int) x2, windowrec->height); - if (y > 0) - clearexpose(windowrec, 0, hh, - windowrec->width, (unsigned int) y); - if (y2 > 0) - clearexpose(windowrec, 0, 0, - windowrec->width, (unsigned int) y2); - } -} -#endif - - - -_Xconst char *paper_types[] = { - "us", "8.5in x 11in", - "usr", "11in x 8.5in", - "legal", "8.5in x 14in", - "foolscap", "13.5in x 17.0in", /* ??? */ - - /* ISO `A' formats, Portrait */ - "a1", "59.4cm x 84.0cm", - "a2", "42.0cm x 59.4cm", - "a3", "29.7cm x 42.0cm", - "a4", "21.0cm x 29.7cm", - "a5", "14.85cm x 21.0cm", - "a6", "10.5cm x 14.85cm", - "a7", "7.42cm x 10.5cm", - - /* ISO `A' formats, Landscape */ - "a1r", "84.0cm x 59.4cm", - "a2r", "59.4cm x 42.0cm", - "a3r", "42.0cm x 29.7cm", - "a4r", "29.7cm x 21.0cm", - "a5r", "21.0cm x 14.85cm", - "a6r", "14.85cm x 10.5cm", - "a7r", "10.5cm x 7.42cm", - - /* ISO `B' formats, Portrait */ - "b1", "70.6cm x 100.0cm", - "b2", "50.0cm x 70.6cm", - "b3", "35.3cm x 50.0cm", - "b4", "25.0cm x 35.3cm", - "b5", "17.6cm x 25.0cm", - "b6", "13.5cm x 17.6cm", - "b7", "8.8cm x 13.5cm", - - /* ISO `B' formats, Landscape */ - "b1r", "100.0cm x 70.6cm", - "b2r", "70.6cm x 50.0cm", - "b3r", "50.0cm x 35.3cm", - "b4r", "35.3cm x 25.0cm", - "b5r", "25.0cm x 17.6cm", - "b6r", "17.6cm x 13.5cm", - "b7r", "13.5cm x 8.8cm", - - /* ISO `C' formats, Portrait */ - "c1", "64.8cm x 91.6cm", - "c2", "45.8cm x 64.8cm", - "c3", "32.4cm x 45.8cm", - "c4", "22.9cm x 32.4cm", - "c5", "16.2cm x 22.9cm", - "c6", "11.46cm x 16.2cm", - "c7", "8.1cm x 11.46cm", - - /* ISO `C' formats, Landscape */ - "c1r", "91.6cm x 64.8cm", - "c2r", "64.8cm x 45.8cm", - "c3r", "45.8cm x 32.4cm", - "c4r", "32.4cm x 22.9cm", - "c5r", "22.9cm x 16.2cm", - "c6r", "16.2cm x 11.46cm", - "c7r", "11.46cm x 8.1cm", -}; - -int paper_types_number = sizeof(paper_types)/sizeof(char *); - -Boolean -set_paper_type() { - _Xconst char *arg, *arg1; - char temp[64]; - _Xconst char **p; - char *q; - - /* fprintf(stderr, "Setting paper type to %s\n", resource.paper); */ - if (!resource.paper) { -#ifdef A4 - resource.paper = strdup("a4"); -#else - resource.paper = strdup("us"); -#endif - } - if (strlen(resource.paper) > sizeof(temp) - 1) return False; - arg = resource.paper; - q = temp; - for (;;) { /* convert to lower case */ - char c = *arg++; - if (c >= 'A' && c <= 'Z') c ^= ('a' ^ 'A'); - *q++ = c; - if (c == '\0') break; - } - arg = temp; - /* perform substitutions */ - for (p = paper_types; p < paper_types + XtNumber(paper_types); p += 2) - if (strcmp(temp, *p) == 0) { - arg = p[1]; - break; - } - - arg1 = strchr(arg, 'x'); - if (arg1 == NULL) return False; - unshrunk_paper_w = atopix(arg); - unshrunk_paper_h = atopix(arg1 + 1); -#ifdef GRID - unshrunk_paper_unit = atopixunit(arg); -#endif /* GRID */ - - unshrunk_page_w = unshrunk_dvifile_page_w; - unshrunk_page_h = unshrunk_dvifile_page_h; - if (unshrunk_page_h < unshrunk_paper_h) - unshrunk_page_h = unshrunk_paper_h; - if (unshrunk_page_w < unshrunk_paper_w) - unshrunk_page_w = unshrunk_paper_w; - init_page(); - -#if 0 - fprintf(stderr, "paper (%d x %d)\n", unshrunk_paper_w, unshrunk_paper_h); - fprintf(stderr, "dvi unshrunk page (%d x %d)\n", unshrunk_page_w, unshrunk_page_h); - fprintf(stderr, "dvi shrunk page (%d x %d)\n", page_w, page_h); -#endif - - if (! isPrinting && hWndDraw) - SendMessage(hWndDraw, WM_ERASEBKGND, (WPARAM)GetDC(currwin.win), 0); - - return (unshrunk_paper_w != 0 && unshrunk_paper_h != 0); -} - -/* Set the icon name and title name standard properties on `top_level' - (which we don't pass in because it is a different type for TOOLKIT - !and TOOLKIT). We use the basename of the DVI file (without the - .dvi), so different xdvi invocations can be distinguished, yet - do not use up too much real estate. */ - -void -set_icon_and_title (dvi_name, icon_ret, title_ret, set_std) - char *dvi_name; - char **icon_ret; - char **title_ret; - int set_std; -{ - /* Use basename of DVI file for name in icon and title. */ - unsigned baselen; - char *icon_name, *title_name; - - icon_name = strrchr(dvi_name, '/'); - if (icon_name != NULL) ++icon_name; else icon_name = dvi_name; - baselen = strlen(icon_name); - if (baselen >= sizeof(".dvi") - && strcmp(icon_name + baselen - sizeof(".dvi") + 1, ".dvi") - == 0) { /* remove the .dvi */ - char *p; - - baselen -= sizeof(".dvi") - 1; - p = xmalloc(baselen + 1); - (void) strncpy(p, icon_name, (int) baselen); - p[baselen] = '\0'; - icon_name = p; - } -#ifdef Omega - title_name = xmalloc(baselen + sizeof("(Omega) OWindvi: ")); - Strcpy(title_name, "(Omega) OWindvi: "); -#else - title_name = xmalloc(baselen + sizeof("Windvi: ")); - Strcpy(title_name, "Windvi: "); -#endif - Strcat(title_name, icon_name); - - if (icon_ret) *icon_ret = icon_name; - if (title_ret) *title_ret = title_name; - if (set_std) { -#ifdef WIN32 - SetWindowText(hWndMain, title_name); -#else - Window top_window = -#ifdef TOOLKIT - XtWindow (top_level); -#else - top_level; -#endif - - XSetStandardProperties(DISP, top_window, title_name, icon_name, - (Pixmap) 0, NULL, 0, NULL); -#endif - } -} - -void -showmessage(message) - _Xconst char *message; -{ - UpdateStatusBar(message, 0, 0); - /* XDrawImageString(DISP, mane.win, foreGC, - 5 - window_x, 5 + X11HEIGHT - window_y, message, strlen(message)) */ -} - - -void -home(Boolean scrl) -{ - if (resource.keep_flag) { - /* Send messages to go to (0,0) */ - SendMessage(mane.win, WM_HSCROLL, - MAKEWPARAM(SB_THUMBPOSITION, (home_x/mane.shrinkfactor)), 0); - SendMessage(mane.win, WM_VSCROLL, - MAKEWPARAM(SB_THUMBPOSITION, (home_y/mane.shrinkfactor)), 0); - } - else { - SendMessage(mane.win, WM_HSCROLL, - MAKEWPARAM(SB_THUMBPOSITION, 0), 0); - SendMessage(mane.win, WM_VSCROLL, - MAKEWPARAM(SB_THUMBPOSITION, 0), 0); - } -} - -void -#if PS -ps_read_events(wait, allow_can) - wide_bool wait; - wide_bool allow_can; -#else - read_events(wait) - wide_bool wait; -#define allow_can True -#endif -{ - -} - -void -redraw(windowrec) - struct WindowRec *windowrec; -{ - bDrawKeep = FALSE; - - /* restore color state at the beginning of the new page */ - init_colors(); - - currwin = *windowrec; - min_x = currwin.min_x + currwin.base_x; - min_y = currwin.min_y + currwin.base_y; - max_x = currwin.max_x + currwin.base_x; - max_y = currwin.max_y + currwin.base_y; -#ifndef WIN32 - can_exposures(windowrec); -#endif - if (debug & DBG_EVENT) - Printf("Redraw %d x %d at (%d, %d) (base=%d,%d)\n", max_x - min_x, - max_y - min_y, min_x, min_y, currwin.base_x, currwin.base_y); -#ifdef WIN32 - /* FIXME : change cursor */ - if (!bMagDisp) - SetCursor(hCursWait); -#else - if (!busycurs) { - XDefineCursor(DISP, mane.win, redraw_cursor); - XFlush(DISP); - busycurs = True; - } -#endif - if (setjmp(dvi_env)) { - XClearWindow(DISP, mane.win); - showmessage(dvi_oops_msg); - if (dvi_file) { - Fclose(dvi_file); - dvi_file = NULL; - } - } - else { -#ifdef BOOKMODE - if (resource.book_mode) { - int old_min_x = min_x, - old_max_x = max_x; - if (min_x <= page_w) { - if (max_x > page_w) { - max_x = currwin.max_x = page_w; - } - draw_page(); - max_x = currwin.max_x = old_max_x; - } - if (max_x > page_w) { - if (min_x <= page_w) { - min_x = currwin.min_x = 0; - } - max_x = currwin.max_x = max_x - page_w; - current_page += 1; - draw_page(); - max_x = currwin.max_x = old_max_x; - min_x = currwin.min_x = old_min_x; - } - warn_spec_now = True; - } - else { - draw_page(); - warn_spec_now = True; - } -#else - draw_page(); - warn_spec_now = True; -#endif - } - if (!bMagDisp) - SetCursor(hCursArrow); -} - -void -redraw_page() -{ -#ifdef WIN32 - RECT maneRect; - GdiFlush(); - GetClientRect(mane.win, &maneRect); - - if (mane.win == hWndDraw && GetClientRect(hWndDraw, &maneRect)) { - int xorg = (int)(page_w - maneRect.right)/2; - int yorg = (int)(page_h - maneRect.bottom)/2; - xorg = min(0, xorg); - yorg = min(0, yorg); -#if 0 - fprintf(stderr, "New org %ld %ld page %d %d rect %d %d\n", - xorg, yorg, page_w, page_h, maneRect.right, maneRect.bottom); -#endif - if (SetWindowOrgEx(maneDC, xorg, yorg, NULL) == 0) { - Win32Error("MsgDrawPaint/SetWindowOrgEx(x,y)"); - } - } - else { - Win32Error("MsgDrawPaint/GetClientRect(hwnd)"); - } - - if (debug & DBG_EVENT) Fputs("Redraw page: ", stdout); - -#if 0 - if (resource.in_memory) { - mane.base_x = 0; - mane.base_y = 0; - mane.min_x = mane.min_y = 0; - mane.max_x = page_w; - mane.max_y = page_h; - allowDrawingChars = True; - maneRect.top = maneRect.left = 0; - maneRect.right = page_w+1; - maneRect.bottom = page_h+1; -#if 0 - if (!FillRect(foreGC, &maneRect, backBrush)) - Win32Error("Redraw Page background"); -#endif - redraw(&mane); - } -#endif - - if (resource.keep_flag) home(False); - - bDrawKeep = FALSE; - InvalidateRect(mane.win, &maneRect, TRUE); - -#else /* ! WIN32 */ - if (debug & DBG_EVENT) Fputs("Redraw page: ", stdout); - XClearWindow(DISP, mane.win); - if (backing_store != NotUseful) { - mane.min_x = mane.min_y = 0; - mane.max_x = page_w; - mane.max_y = page_h; - } - else { - get_xy(); - mane.min_x = -window_x; - mane.max_x = -window_x + clip_w; - mane.min_y = -window_y; - mane.max_y = -window_y + clip_h; - } - redraw(&mane); -#endif /* ! WIN32 */ -} - -Boolean -reconfig() -{ - RECT maneRect; - int x_thick = 0, y_thick = 0; - - /* FIXME : this should change the size of the drawing surface */ - /* XdviResizeWidget(draw_widget, page_w, page_h); - get_geom(); */ - - if (resource.in_memory) { - /* FIXME: - - if the bitmap can't be generated, return en error, and switch back - to the previous shrink_factor - - at s=1, no antialiasing should occur - */ - if (maneDrawMemDC == NULL) - if ((maneDrawMemDC = CreateCompatibleDC(maneDC)) == NULL) - Win32Error("CreateCompatibleDC maneDrawMemDC"); - foreGC = ruleGC = highGC = maneDrawDC = maneDrawMemDC; - - grid1GC = grid2GC = grid3GC = maneDrawDC; - foreGC2 = NULL; /* not used under Win32 */ - -#ifdef TRANSFORM - if (IS_WIN98 || IS_NT) - SetGraphicsMode(maneDrawDC, GM_ADVANCED); -#endif - - if (oldmaneDIB) { - /* There is an old maneDIB, put it back in the DC - and delete the current one */ - if ((maneDIB = SelectObject(foreGC, oldmaneDIB)) == NULL) - Win32Error("reconfig/SelectObject"); - if (DeleteObject(maneDIB) == FALSE) - Win32Error("DeleteObject/maneDIB"); - } - - if ((maneDIB = CreateDIB(maneDC, page_w, page_h, numColors, NULL, NULL)) == NULL) - return False; - if ((oldmaneDIB = SelectObject(foreGC, maneDIB)) == NULL) - Win32Error("reconfig/SelectObject"); - -#if 0 - if (PatBlt(foreGC, 0, 0, page_w, page_h, PATCOPY) == 0) - Win32Error("Reconfig background"); -#else - maneRect.top = maneRect.left = 0; - maneRect.right = page_w; - maneRect.bottom = page_h; -#if 0 - fprintf(stderr, "reconfig() is erasing background\n"); -#endif - if (!FillRect(foreGC, &maneRect, backBrush)) - Win32Error("Reconfig background"); -#endif - } - else { - foreGC = ruleGC = highGC = maneDrawDC = GetDC(hWndDraw); - grid1GC = grid2GC = grid3GC = foreGC; - magMemDC = foreGC2 = NULL; /* not used under Win32 */ - } - -#ifdef HTEX - if (anchor_info) { - /* XMoveResizeWindow(DPY anchor_info, - y_thick - 1, x_thick - BAR_THICK - 1, - clip_w/2, BAR_THICK - 1); */ - if (SetWindowPos(anchor_info, HWND_TOPMOST, - y_thick - 1, x_thick - BAR_THICK - 1, - clip_w/2, BAR_THICK - 1, - SWP_NOACTIVATE | SWP_NOSIZE /* | SWP_SHOWWINDOW */ - | SWP_NOOWNERZORDER | SWP_NOZORDER) == 0) - Win32Error("SetWindowPos"); - paint_anchor(NULL); - /* XMoveResizeWindow(DPY anchor_search, - y_thick + clip_w/2 - 1, x_thick - BAR_THICK - 1, - clip_w/2, BAR_THICK - 1); */ - if (SetWindowPos(anchor_search, HWND_TOPMOST, - y_thick + clip_w/2 - 1, x_thick - BAR_THICK - 1, - clip_w/2, BAR_THICK - 1, - SWP_NOACTIVATE | SWP_NOSIZE /* | SWP_SHOWWINDOW */ - | SWP_NOOWNERZORDER | SWP_NOZORDER) == 0) - Win32Error("SetWindowPos"); - } else { - /* anchor_info = XCreateSimpleWindow(DISP, top_level, y_thick - 1, - x_thick - BAR_THICK -1, - (unsigned int) clip_w/2, BAR_THICK - 1, 1, - brdr_Pixel, back_Pixel); */ - anchor_info = CreateWindow("EDIT", - NULL, - WS_BORDER | WS_POPUP | WS_DISABLED, - /* | WS_CLIPSIBLINGS, */ - y_thick - 1, x_thick - BAR_THICK -1, - (unsigned int) clip_w/2, BAR_THICK - 1, - hWndDraw, - NULL, - hInst, - NULL); - if (anchor_info == NULL) { - Win32Error("CreateWindow/Magnify"); - return FALSE; - } - /* XSelectInput(DISP, anchor_info, ExposureMask); - anchor_search = XCreateSimpleWindow(DISP, top_level, - y_thick + clip_w/2 - 1, - x_thick - BAR_THICK -1, - (unsigned int) clip_w/2, BAR_THICK - 1, 1, - brdr_Pixel, back_Pixel); */ - anchor_search = CreateWindow("EDIT", - NULL, - WS_BORDER | WS_POPUP | WS_DISABLED, - /* | WS_CLIPSIBLINGS, */ - y_thick + clip_w/2 - 1, x_thick - BAR_THICK -1, - (unsigned int) clip_w/2, BAR_THICK - 1, - hWndDraw, - NULL, - hInst, - NULL); - if (anchor_search == NULL) { - Win32Error("CreateWindow/Magnify"); - return FALSE; - } - ShowWindow(anchor_info, SW_SHOW); - ShowWindow(anchor_search, SW_SHOW); -#if 0 - XSelectInput(DISP, anchor_search, ExposureMask|KeyPressMask); - XMapWindow(DPY anchor_info); - XMapWindow(DPY anchor_search); -#endif - } -#endif - /* Now, the scrollbars */ - SetScrollBars(mane.win); - return True; -} - -int -atopix(arg) - _Xconst char *arg; -{ - int len = strlen(arg); - _Xconst char *arg_end = arg; - char tmp[11]; - double factor; - - /* Skip whithe spaces */ - while (arg_end && *arg_end && isspace(*arg_end)) arg_end++; - - while ((*arg_end >= '0' && *arg_end <= '9') || *arg_end == '.') - if (arg_end >= arg + XtNumber(tmp) - 1) return 0; - else ++arg_end; - bcopy(arg, tmp, arg_end - arg); - tmp[arg_end - arg] = '\0'; - -#if A4 - factor = 1.0 / 2.54; /* cm */ -#else - factor = 1.0; /* inches */ -#endif - if (len > 2) - switch (arg[len - 2] << 8 | arg[len - 1]) { - case 'i' << 8 | 'n': factor = 1.0; break; - case 'c' << 8 | 'm': factor = 1.0 / 2.54; break; - case 'm' << 8 | 'm': factor = 1.0 / 25.4; break; - case 'p' << 8 | 't': factor = 1.0 / 72.27; break; - case 'p' << 8 | 'c': factor = 12.0 / 72.27; break; - case 'b' << 8 | 'p': factor = 1.0 / 72.0; break; - case 'd' << 8 | 'd': factor = 1238.0 / 1157.0 / 72.27; break; - case 'c' << 8 | 'c': factor = 12 * 1238.0 / 1157.0 / 72.27; - break; - case 's' << 8 | 'p': factor = 1.0 / 72.27 / 65536; break; - } - - return factor * atof(tmp) * pixels_per_inch + 0.5; -} - -string -pixtoa(int arg) -{ - char buf[64]; - sprintf(buf, "%.2fcm", (arg * 2.54) / pixels_per_inch); - return strdup(buf); -} - -#ifdef GRID -/* extract the unit used in paper size specification */ -/* the information is used to decide the initial grid separation */ -int -atopixunit(arg) - _Xconst char *arg; -{ - int len = strlen(arg); - - return (int)((len > 2 && arg[len - 2] == 'c' && arg[len - 1] == 'm' ? - 1.0 / 2.54 : 1.0) * pixels_per_inch + 0.5); -} -#endif /* GRID */ - -void remove_temporary_dir(void) - -{ - int err; - - if (TmpDir!=NULL) { - err=rmdir(TmpDir); - if (err!=0 && errno!=ENOENT) { - char *buffer=malloc(160); - if (buffer==NULL) oops("Please buy more RAM"); - sprintf(buffer,"xdvik: Warning: Could not remove temporary directory %s", - TmpDir); - perror(buffer); - } - } -} - -/* Create a temporary directory where we can write files from this program */ -void -make_temporary_dir(tmpdir) -char **tmpdir; -{ - int ret, idval; - char * tmp; - - *tmpdir = tempnam(NULL,"xdvi"); - - if (*tmpdir == NULL) - oops("Out of memory. Exiting."); - -#ifdef HTEX - if (debug & DBG_HYPER) - fprintf(stderr,"Making temporary directory %s\n",*tmpdir); -#endif - -#ifdef WIN32 - ret = mkdir(*tmpdir); -#else - ret = mkdir(*tmpdir, 0700); -#endif - - /* The use of atexit and one variable to store the directory name - makes this procedure a oneoff. Enforce it */ - if (TmpDir!=NULL) - oops("make_temporary_dir called twice!\n"); - - TmpDir=strdup(*tmpdir); -#ifndef WIN32 - atexit(remove_temporary_dir); -#endif - if (ret != 0) - /* Didn't work, PANIC! */ - oops("Could not create temporary directory. Exiting."); - -} - -#ifdef HTEX -/* The anchor window stuff: */ - -void paint_anchor(text) -char *text; -{ -#ifdef WIN32 - extern Widget anchor_info; -#if 0 - if (text != NULL) - SetWindowText(anchor_info, text); -#endif -#else - ClearArea(anchor_info, 1, 1, clip_w/2, BAR_THICK); - if (text != NULL) XDrawString(DISP, anchor_info, foreGC, - 1 , BAR_WID, text, strlen(text)); -#endif -} - -#endif |