summaryrefslogtreecommitdiff
path: root/Build/source/texk/xdvik/dvi-init.c
diff options
context:
space:
mode:
authorPeter Breitenlohner <peb@mppmu.mpg.de>2008-07-01 15:42:36 +0000
committerPeter Breitenlohner <peb@mppmu.mpg.de>2008-07-01 15:42:36 +0000
commit6552be7f745c5a8d506148c8af9d367c9d996d24 (patch)
treeb9d673871a1490b64273a265d4d961316a2174db /Build/source/texk/xdvik/dvi-init.c
parent48e2b240973977c208bc840b589b75b91a6f4c30 (diff)
xdvik 22.84.14
git-svn-id: svn://tug.org/texlive/trunk@9142 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/texk/xdvik/dvi-init.c')
-rw-r--r--Build/source/texk/xdvik/dvi-init.c400
1 files changed, 320 insertions, 80 deletions
diff --git a/Build/source/texk/xdvik/dvi-init.c b/Build/source/texk/xdvik/dvi-init.c
index d62b170f620..411f8e3c72b 100644
--- a/Build/source/texk/xdvik/dvi-init.c
+++ b/Build/source/texk/xdvik/dvi-init.c
@@ -21,8 +21,8 @@ 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.
+xdvi is based on prior work, as noted in the modification history
+in xdvi.c.
\*========================================================================*/
@@ -33,6 +33,7 @@ NOTE:
#include "dvi-draw.h"
#include "util.h"
#include "x_util.h"
+#include "exit-handlers.h"
#include "mime.h"
#include "pagesel.h"
#include "special.h"
@@ -48,6 +49,12 @@ NOTE:
#include "xm_toolbar.h"
#include "pagehist.h"
+#if DELAYED_MKTEXPK
+#include "font-open.h" /* for reinit_missing_font_count() */
+#endif
+
+
+
#ifdef T1LIB
#include "t1lib.h"
#endif
@@ -133,6 +140,21 @@ get_dvi_error(dviErrFlagT flag) {
return dvi_err_list[flag];
}
+
+/*
+ * Extract the unit used in paper size specification. This information is used
+ * to decide the initial grid separation.
+ */
+static int
+atopixunit(const char *arg)
+{
+ int len = strlen(arg);
+
+ /* check if the unit 'mm' or 'cm' occurs in the arg string */
+ return (len > 2 && (arg[len - 2] == 'c' || arg[len - 2] == 'm') && arg[len - 1] == 'm' ?
+ 1.0 / 2.54 : 1.0) * resource.pixels_per_inch + 0.5;
+}
+
/*
* free_vf_chain frees the vf_chain structure.
*/
@@ -222,7 +244,7 @@ free_unused_fonts(void)
for (m = fontp->macro;
m <= fontp->macro + fontp->maxchar; ++m)
- if (m->free_me) free((char *)m->pos);
+ if (m->free_me) free((char *)m->pos);
free((char *)fontp->macro);
free((char *)fontp->vf_table);
free_vf_chain(fontp->vf_chain);
@@ -327,7 +349,7 @@ realloc_font(struct font *fontp, wide_ubyte newsize)
(unsigned int)(newsize + 1) * sizeof(struct glyph));
if (newsize > fontp->maxchar)
memset((char *)(glyph + fontp->maxchar + 1), 0,
- (int)(newsize - fontp->maxchar) * sizeof(struct glyph));
+ (int)(newsize - fontp->maxchar) * sizeof(struct glyph));
maxchar = fontp->maxchar = newsize;
}
@@ -345,7 +367,7 @@ realloc_virtual_font(struct font *fontp, wide_ubyte newsize)
(unsigned int)(newsize + 1) * sizeof(struct macro));
if (newsize > fontp->maxchar)
memset((char *)(macro + fontp->maxchar + 1), 0,
- (int)(newsize - fontp->maxchar) * sizeof(struct macro));
+ (int)(newsize - fontp->maxchar) * sizeof(struct macro));
maxchar = fontp->maxchar = newsize;
}
@@ -359,7 +381,11 @@ realloc_virtual_font(struct font *fontp, wide_ubyte newsize)
*/
Boolean
-load_font(struct font *fontp, Boolean use_t1lib)
+load_font(struct font *fontp, Boolean use_t1lib
+#if DELAYED_MKTEXPK
+ , Boolean load_font_now
+#endif
+ )
{
double fsize = fontp->fsize;
int dpi = fsize + 0.5;
@@ -389,16 +415,23 @@ load_font(struct font *fontp, Boolean use_t1lib)
* appear before the main window comes up ...
*/
+ fontp->file = font_open(
+#if DELAYED_MKTEXPK
+ load_font_now,
+#endif
+ fontp,
+ &font_found,
+ &size_found,
#ifdef T1LIB
- fontp->file = font_open(fontp->fontname, &font_found,
- fsize, &size_found,
- &fontp->filename, &fontp->t1id);
-#else
- fontp->file = font_open(fontp->fontname, &font_found,
- fsize, &size_found,
- &fontp->filename);
-#endif /* T1LIB */
+ &fontp->t1id,
+#endif
+ use_t1lib);
+#if DELAYED_MKTEXPK
+ if (!load_font_now)
+ return True;
+#endif
+
#ifdef T1LIB
if (fontp->t1id >= 0 && use_t1lib) {
/* It's a type1 font */
@@ -412,7 +445,7 @@ load_font(struct font *fontp, Boolean use_t1lib)
memset((char *) fontp->glyph, 0, 256 * sizeof (struct glyph));
fontp->flags |= FONT_LOADED;
if (font_found != NULL) {
- statusline_print(STATUS_MEDIUM,
+ statusline_error(STATUS_MEDIUM,
"Error: Can't find font %s; using %s instead. Expect ugly output.",
fontp->fontname, font_found);
force_statusline_update();
@@ -432,9 +465,9 @@ load_font(struct font *fontp, Boolean use_t1lib)
}
fontp->flags |= FONT_LOADED;
- if (font_found != NULL && strcmp(fontp->fontname, font_found) != 0) {
+ if (font_found != NULL && strcmp(fontp->fontname, font_found) != 0) {
/* some other font used - FIXME: is there a more efficient way than strcmp() for checking this? */
- statusline_print(STATUS_MEDIUM,
+ statusline_error(STATUS_MEDIUM,
"Can't find pixel font %s; using %s instead at %d dpi.",
fontp->fontname, font_found, dpi);
force_statusline_update();
@@ -443,7 +476,7 @@ load_font(struct font *fontp, Boolean use_t1lib)
hushcs = True;
}
else if (!kpse_bitmap_tolerance((double)size_found, fsize)) { /* a different size used */
- statusline_print(STATUS_MEDIUM,
+ statusline_error(STATUS_MEDIUM,
"Can't find pixel font %s at %d dpi; using %d dpi instead.",
fontp->fontname, dpi, size_found);
force_statusline_update();
@@ -489,8 +522,9 @@ load_font(struct font *fontp, Boolean use_t1lib)
else {
while (maxchar > 0 && fontp->glyph[maxchar].addr == 0)
--maxchar;
- if (maxchar < 255)
+ if (maxchar < 255) {
realloc_font(fontp, (wide_ubyte)maxchar);
+ }
}
return True;
}
@@ -571,8 +605,15 @@ reuse_font(struct font *fontp)
* all of the fonts used in the job.
*/
struct font *
-define_font(Boolean load_font_now, /* only scanning, or also loading the font? */
- FILE *file, wide_ubyte cmnd,
+define_font(
+#if DELAYED_MKTEXPK
+ Boolean read_fonts, /* reading font definitions */
+ Boolean initialize_fonts, /* also initializing internal data structures for fonts */
+#else
+ Boolean load_font_now, /* only scanning, or also loading the font? */
+#endif
+ FILE *file,
+ wide_ubyte cmnd,
struct font *vfparent, /* vf parent of this font, or NULL */
struct font **tntable, /* table for low TeXnumbers */
unsigned int tn_table_len, /* length of table for TeXnumbers */
@@ -598,12 +639,20 @@ define_font(Boolean load_font_now, /* only scanning, or also loading the font? *
len = get_byte(file);
len += get_byte(file); /* sequence point in the middle */
+#if DELAYED_MKTEXPK
+ if (!read_fonts) {
+ get_bytes(file, len);
+ return NULL;
+ }
+#else
if (!load_font_now)
return NULL;
+#endif
fontname = xmalloc((unsigned)len + 1);
- fread(fontname, sizeof(char), len, file);
+ (void)fread(fontname, sizeof(char), len, file);
fontname[len] = '\0';
+
if (globals.debug & DBG_PK)
printf("xdvi: Define font \"%s\" scale=%d design=%d number=%d\n",
fontname, scale, design, TeXnumber);
@@ -645,7 +694,11 @@ define_font(Boolean load_font_now, /* only scanning, or also loading the font? *
fontp->set_char_p = load_n_set_char;
fontp->scale = scale;
if (vfparent == NULL)
- if (!load_font(fontp, resource.t1lib)) {
+ if (!load_font(fontp, resource.t1lib
+#if DELAYED_MKTEXPK
+ , initialize_fonts
+#endif
+ )) {
if (globals.ev.flags & EV_GE_NEWDOC) { /* if aborting */
free(fontname);
free(fontp);
@@ -711,7 +764,7 @@ process_preamble(FILE *fp, dviErrFlagT *errflag)
dimconv = dimconv * (((long)resource.pixels_per_inch) << 16) / 254000;
tpic_conv = resource.pixels_per_inch * magnification / 1000000.0;
k = get_byte(fp);
- fread(job_id, sizeof(char), (int)k, fp);
+ (void)fread(job_id, sizeof(char), (int)k, fp);
job_id[k] = '\0';
TRACE_FILES((stderr, "process_preamble: fp = %p, errflag = %d, returning True", (void *)fp, *errflag));
@@ -812,6 +865,8 @@ set_paper_type(const char *arg)
m_paper_unshrunk_w = atopix(arg, False);
m_paper_unshrunk_h = atopix(arg1 + 1, False);
+ globals.grid_paper_unit = atopixunit(arg);
+
return (m_paper_unshrunk_w != 0 && m_paper_unshrunk_h != 0);
}
@@ -825,12 +880,37 @@ set_paper_type(const char *arg)
* and allow to open window on first page) if the font loading was done on-demand later!
*/
Boolean
-read_postamble(FILE *fp, dviErrFlagT *errflag, Boolean load_fonts)
+read_postamble(FILE *fp, dviErrFlagT *errflag,
+#if DELAYED_MKTEXPK
+ Boolean read_fonts, Boolean initialize_fonts
+#else
+ Boolean load_fonts
+#endif
+ )
{
ubyte cmnd;
Boolean font_not_found = False;
struct font *fontp;
+#if DELAYED_MKTEXPK
+ int tmp_total_pages;
+ unsigned long tmp_numerator = numerator;
+ unsigned long tmp_denominator = denominator;
+ unsigned long tmp_magnification = magnification;
+ unsigned int tmp_dvi_unshrunk_page_w, tmp_dvi_unshrunk_page_h;
+ long tmp_last_page_offset;
+
+ TRACE_FILES((stderr, "read_postamble: reading %p (%d, %d)", (void *)fp, read_fonts, initialize_fonts));
+
+ if (read_fonts && initialize_fonts) {
+ /* clear existing font table */
+ memset((char *)tn_table, 0, (int)sizeof tn_table);
+ free_vf_chain(tn_head);
+ tn_head = NULL;
+ for (fontp = font_head; fontp != NULL; fontp = fontp->next)
+ fontp->flags &= ~FONT_IN_USE;
+ }
+#else /* DELAYED_MKTEXPK */
TRACE_FILES((stderr, "read_postamble: reading %p (%d)", (void *)fp, load_fonts));
/* clear existing font table */
@@ -839,13 +919,47 @@ read_postamble(FILE *fp, dviErrFlagT *errflag, Boolean load_fonts)
tn_head = NULL;
for (fontp = font_head; fontp != NULL; fontp = fontp->next)
fontp->flags &= ~FONT_IN_USE;
-
+#endif /* DELAYED_MKTEXPK */
if (get_byte(fp) != POST) {
*errflag = POSTAMBLE_NO_POST;
TRACE_FILES((stderr, "read_postamble: returning FALSE"));
return False;
}
+#if DELAYED_MKTEXPK
+ tmp_last_page_offset = get_bytes(fp, 4);
+ if (read_fonts && initialize_fonts)
+ m_last_page_offset = tmp_last_page_offset;
+
+ if (tmp_numerator != get_bytes(fp, 4)
+ || tmp_denominator != get_bytes(fp, 4)
+ || tmp_magnification != get_bytes(fp, 4)) {
+ *errflag = POSTAMBLE_NO_MATCH;
+ TRACE_FILES((stderr, "read_postamble: returning FALSE"));
+ return False;
+ }
+ else if (read_fonts && initialize_fonts) {
+ numerator = tmp_numerator;
+ denominator = tmp_denominator;
+ magnification = tmp_magnification;
+ }
+
+ /* read largest box height and width */
+ tmp_dvi_unshrunk_page_h = (spell_conv(get_lbytes(fp, 4)) >> 16) + resource.yoffset_int;
+ tmp_dvi_unshrunk_page_w = (spell_conv(get_lbytes(fp, 4)) >> 16) + resource.xoffset_int;
+ (void)get_bytes(fp, 2); /* max stack size */
+ tmp_total_pages = get_bytes(fp, 2);
+
+ if (read_fonts && initialize_fonts) {
+ dvi_unshrunk_page_h = tmp_dvi_unshrunk_page_h;
+ if (dvi_unshrunk_page_h < m_paper_unshrunk_h)
+ dvi_unshrunk_page_h = m_paper_unshrunk_h;
+ dvi_unshrunk_page_w = tmp_dvi_unshrunk_page_w;
+ if (dvi_unshrunk_page_w < m_paper_unshrunk_w)
+ dvi_unshrunk_page_w = m_paper_unshrunk_w;
+ total_pages = tmp_total_pages;
+ }
+#else /* DELAYED_MKTEXPK */
m_last_page_offset = get_bytes(fp, 4);
if (numerator != get_bytes(fp, 4)
|| denominator != get_bytes(fp, 4)
@@ -864,31 +978,56 @@ read_postamble(FILE *fp, dviErrFlagT *errflag, Boolean load_fonts)
dvi_unshrunk_page_w = m_paper_unshrunk_w;
(void)get_bytes(fp, 2); /* max stack size */
total_pages = get_bytes(fp, 2);
+#endif /* DELAYED_MKTEXPK */
/* read font definitions */
while ((cmnd = get_byte(fp)) >= FNTDEF1 && cmnd <= FNTDEF4) {
- struct font *f = define_font(load_fonts, fp, cmnd, (struct font *)NULL, tn_table,
+ struct font *f = define_font(
+#if DELAYED_MKTEXPK
+ read_fonts, initialize_fonts,
+#else
+ load_fonts,
+#endif
+ fp, cmnd, (struct font *)NULL, tn_table,
TNTABLELEN, &tn_head, &font_not_found);
- if (load_fonts && f == NULL) {
+ if (
+#if DELAYED_MKTEXPK
+ read_fonts && initialize_fonts
+#else
+ load_fonts
+#endif
+ && f == NULL) {
TRACE_FILES((stderr, "read_postamble: returning FALSE"));
return False;
}
+#if !DELAYED_MKTEXPK
else if (!load_fonts) { /* return early */
TRACE_FILES((stderr, "read_postamble: returning TRUE"));
return True;
}
+#endif
}
+
if (cmnd != POSTPOST) {
*errflag = POSTAMBLE_NON_FNTDEF;
TRACE_FILES((stderr, "read_postamble: returning FALSE"));
return False;
}
- if (font_not_found) {
+ if (
+#if DELAYED_MKTEXPK
+ read_fonts && initialize_fonts &&
+#endif
+ font_not_found) {
*errflag = NOT_ALL_PIXEL_FILES_FOUND;
TRACE_FILES((stderr, "read_postamble: returning FALSE"));
return False;
}
+#if DELAYED_MKTEXPK
+ if (read_fonts && initialize_fonts)
+ free_unused_fonts();
+#else
free_unused_fonts();
+#endif
TRACE_FILES((stderr, "read_postamble: returning TRUE"));
return True;
@@ -960,18 +1099,22 @@ init_page(void)
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif
-static char *tmp_dvi_name = NULL; /* name of backup file for useTempFp */
+static char *m_tmp_dvi_name = NULL; /* name of backup file for useTempFp */
/* access function for backup file name */
char *get_tmp_dvi_name() {
- return tmp_dvi_name;
+ return m_tmp_dvi_name;
}
-void
-remove_tmp_dvi_file(void)
+static void
+remove_tmp_dvi_file(void *dummy)
{
- if (tmp_dvi_name != NULL)
- unlink(tmp_dvi_name);
+ UNUSED(dummy);
+ if (m_tmp_dvi_name != NULL) {
+ unlink(m_tmp_dvi_name);
+ free(m_tmp_dvi_name);
+ }
+ m_tmp_dvi_name = NULL;
}
@@ -984,26 +1127,27 @@ make_backup_fp(FILE *source_fp, FILE *target_fp)
#if !HAVE_FTRUNCATE
/* in this case, we can't use ftruncate() on the existing temp file -
just close the existing one, and set flag to open a new one */
- if (tmp_dvi_name != NULL)
- unlink(tmp_dvi_name);
+ remove_tmp_dvi_file(NULL);
if (target_fp != NULL)
fclose(target_fp);
/* make sure we use a new temp file, else we'd have a race condition
after closing it */
- free(tmp_dvi_name);
- tmp_dvi_name = NULL;
first_time = True;
#endif
if (first_time) { /* doesn't exist yet, create it */
- if ((tmp_fd = xdvi_temp_fd(&tmp_dvi_name)) == -1) {
+ if ((tmp_fd = xdvi_temp_fd(&m_tmp_dvi_name)) == -1) {
XDVI_ERROR((stderr, "error creating temporary file - disabling `useTempFp'."));
+ resource.use_temp_fp = False;
+ remove_tmp_dvi_file(NULL);
return NULL;
}
-/* fprintf(stderr, "temporary file name: |%s|, %d\n", tmp_dvi_name, tmp_fd); */
- TRACE_EVENTS((stderr, "Created temp file: |%s|\n", tmp_dvi_name));
+ /* fprintf(stderr, "temporary file name: |%s|, %d\n", m_tmp_dvi_name, tmp_fd); */
+ TRACE_EVENTS((stderr, "Created temp file: |%s|\n", m_tmp_dvi_name));
if ((target_fp = try_fdopen(tmp_fd, "wb+")) == NULL) {
XDVI_ERROR((stderr, "error opening temporary file (%s) - disabling `useTempFp'.", strerror(errno)));
+ resource.use_temp_fp = False;
+ remove_tmp_dvi_file(NULL);
return NULL;
}
first_time = False;
@@ -1012,12 +1156,14 @@ make_backup_fp(FILE *source_fp, FILE *target_fp)
and position both files at beginning */
ASSERT(target_fp != NULL, "");
ASSERT(source_fp != NULL, "");
-
+
#if HAVE_FTRUNCATE
if (ftruncate(tmp_fd, 0) < 0) {
- XDVI_ERROR((stderr, "Couldn't truncate file %s: %s - disabling `useTempFp'.",
- tmp_dvi_name, strerror(errno)));
- unlink(tmp_dvi_name);
+
+ XDVI_ERROR((stderr, "Couldn't truncate file %s: %s - disabling `useTempFp'; target_fp: %p.",
+ m_tmp_dvi_name, strerror(errno), target_fp));
+ resource.use_temp_fp = False;
+ remove_tmp_dvi_file(NULL);
fclose(target_fp);
return NULL;
}
@@ -1032,12 +1178,16 @@ make_backup_fp(FILE *source_fp, FILE *target_fp)
"Error creating temporary file: %s\n"
"- disabling `useTempFp'.",
strerror(errno)));
+ remove_tmp_dvi_file(NULL);
+ resource.use_temp_fp = False;
fclose(target_fp);
target_fp = NULL;
}
/* rewind both files, else DVI parsing will fail! */
- fflush(target_fp);
+ if (target_fp != NULL) {
+ fflush(target_fp);
+ }
fseek(source_fp, 0L, SEEK_SET);
if (target_fp != NULL) {
fseek(target_fp, 0L, SEEK_SET);
@@ -1052,12 +1202,12 @@ file_exists_p(const char *path, dviErrFlagT *errflag)
TRACE_FILES((stderr, "file_exists_p for |%s|", path));
*errflag = UNKNOWN_ERROR;
if ((m_dvi_fp = XFOPEN(path, OPEN_MODE)) == NULL) {
-/* fprintf(stderr, "after internal_open_dvi1: xfopen\n"); */
+ /* fprintf(stderr, "after internal_open_dvi1: xfopen\n"); */
*errflag = FILE_DOESNT_EXIST;
return False;
}
TRACE_FILES((stderr, "m_dvi_fp for |%s| = %p", path, (void *)m_dvi_fp));
-/* fprintf(stderr, "after internal_open_dvi2: xfopen\n"); */
+ /* fprintf(stderr, "after internal_open_dvi2: xfopen\n"); */
/* shouldn't happen */
if (fstat(fileno(m_dvi_fp), &fstatbuf) != 0 || S_ISDIR(fstatbuf.st_mode)) { /* if it's a directory */
@@ -1089,7 +1239,13 @@ file_exists_p(const char *path, dviErrFlagT *errflag)
*/
static Boolean
-internal_init_dvi(dviErrFlagT *errflag, Boolean load_fonts)
+internal_init_dvi(dviErrFlagT *errflag,
+#if DELAYED_MKTEXPK
+ Boolean read_fonts, Boolean initialize_fonts
+#else
+ Boolean load_fonts
+#endif
+ )
{
char *icon_name = NULL, *title_name = NULL;
@@ -1099,10 +1255,23 @@ internal_init_dvi(dviErrFlagT *errflag, Boolean load_fonts)
if (!process_preamble(globals.dvi_file.bak_fp, errflag)
|| !find_postamble(globals.dvi_file.bak_fp, errflag)
+#if DELAYED_MKTEXPK
+ || !read_postamble(globals.dvi_file.bak_fp, errflag, read_fonts, initialize_fonts)
+#else
|| !read_postamble(globals.dvi_file.bak_fp, errflag, load_fonts)
- || !prepare_pages(errflag))
+ || !prepare_pages(errflag)
+#endif
+ ) {
return False;
-
+ }
+#if DELAYED_MKTEXPK
+ if (!read_fonts || !initialize_fonts) /* return early */
+ return True;
+
+ if (!prepare_pages(errflag))
+ return False;
+#endif
+
if (current_page >= total_pages)
current_page = total_pages - 1;
@@ -1141,13 +1310,23 @@ internal_init_dvi(dviErrFlagT *errflag, Boolean load_fonts)
*/
Boolean
-internal_open_dvi(const char *path, dviErrFlagT *errflag, Boolean load_fonts)
+internal_open_dvi(const char *path, dviErrFlagT *errflag,
+#if DELAYED_MKTEXPK
+ Boolean read_fonts, Boolean initialize_fonts
+#else
+ Boolean load_fonts
+#endif
+ )
{
-/* FILE *tmp_fp = NULL; */
-/* static FILE *bak_fp = NULL; /\* re-use the temporary backup fp *\/ */
-/* fprintf(stderr, "------------ opening: |%s|\n", path); */
+ /* FILE *tmp_fp = NULL; */
+ /* static FILE *bak_fp = NULL; /\* re-use the temporary backup fp *\/ */
+ /* fprintf(stderr, "------------ opening: |%s|\n", path); */
+#if DELAYED_MKTEXPK
+ TRACE_FILES((stderr, "internal_open_dvi for |%s|; loading fonts: %d, %d", path, read_fonts, initialize_fonts));
+#else
TRACE_FILES((stderr, "internal_open_dvi for |%s|", path));
+#endif
close_old_filep();
if (!file_exists_p(path, errflag)) { /* this should set fstatbuf.st_mtime */
@@ -1157,9 +1336,18 @@ internal_open_dvi(const char *path, dviErrFlagT *errflag, Boolean load_fonts)
if (!resource.use_temp_fp || (globals.dvi_file.bak_fp = make_backup_fp(m_dvi_fp, globals.dvi_file.bak_fp)) == NULL) {
globals.dvi_file.bak_fp = m_dvi_fp;
}
- globals.dvi_file.time = fstatbuf.st_mtime;
+
+ register_exit_handler(remove_tmp_dvi_file, NULL);
- if (!internal_init_dvi(errflag, load_fonts)) {
+ globals.dvi_file.time = fstatbuf.st_mtime;
+
+ if (!internal_init_dvi(errflag,
+#if DELAYED_MKTEXPK
+ read_fonts, initialize_fonts
+#else
+ load_fonts
+#endif
+ )) {
return False;
}
@@ -1346,7 +1534,7 @@ open_dvi_file_wrapper(const char *filename,
people, who meant to launch *xdvi*). `find_dvi_file' tries to locate the
file and does all error handling; on success, it returns a fully expanded
filename.
- */
+ */
real_filename = find_dvi_file(filename, tried_dvi_ext, from_file_history); /* this allocates real_filename */
if (real_filename == NULL)
return False;
@@ -1363,7 +1551,7 @@ open_dvi_file_wrapper(const char *filename,
if it's not from the command line (e.g. result of clicking Mouse-1 on a link);
in this case we might fall back to using the browser.
Check whether it's a local file:
- */
+ */
const char *filename_no_prefix;
char *expanded_filename;
TRACE_HTEX((stderr, "filename NOT from commandline"));
@@ -1416,8 +1604,11 @@ open_dvi_file(const char *filename, Boolean open_new_instance)
else {
dviErrFlagT errflag = NO_ERROR;
TRACE_HTEX((stderr, "internal_open_dvi: |%s|", filename));
- if (!internal_open_dvi(filename, &errflag, True)) {
-/* || !internal_init_dvi(&errflag, True)) { */
+ if (!internal_open_dvi(filename, &errflag, True
+#if DELAYED_MKTEXPK
+ , TRUE
+#endif
+ )) {
report_open_error("Cannot open DVI file", filename, errflag);
retval = False;
}
@@ -1478,28 +1669,37 @@ dvi_file_changed(void)
{
TRACE_FILES((stderr, "dvi_file_changed: fp = %p?", (void *)m_dvi_fp));
-/* fprintf(stderr, "m_dvi_fp3: %p (%s)\n", m_dvi_fp, globals.dvi_name); */
+ /* fprintf(stderr, "m_dvi_fp3: %p (%s)\n", m_dvi_fp, globals.dvi_name); */
if (m_dvi_fp == NULL) {
TRACE_FILES((stderr, "m_dvi_fp == NULL"));
if (stat(globals.dvi_name, &fstatbuf) == 0 && fstatbuf.st_mtime != globals.dvi_file.time) {
TRACE_FILES((stderr, "file changed"));
if (resource.use_temp_fp) {
dviErrFlagT errflag = NO_ERROR;
-
+#if !DELAYED_MKTEXPK
if (resource.watch_file == 0.0)
- statusline_print(STATUS_MEDIUM, "File changed ...");
+ statusline_info(STATUS_MEDIUM, "File changed ...");
TRACE_FILES((stderr, "returning FALSE"));
-
+#endif
if (file_exists_p(globals.dvi_name, &errflag)
&& process_preamble(m_dvi_fp, &errflag)
&& find_postamble(m_dvi_fp, &errflag)
- && read_postamble(m_dvi_fp, &errflag, False)) {
+ && read_postamble(m_dvi_fp, &errflag, False
+#if DELAYED_MKTEXPK
+ , False
+#endif
+ )) {
TRACE_FILES((stderr, "File OK, reloading ..."));
globals.ev.flags |= EV_RELOAD;
return True;
}
else {
+#if DELAYED_MKTEXPK
+ if (resource.watch_file == 0.0)
+ statusline_info(STATUS_MEDIUM, "File corrupted (click on window to reload) ...");
+ TRACE_FILES((stderr, "returning FALSE"));
+#endif
return False;
}
}
@@ -1509,9 +1709,9 @@ dvi_file_changed(void)
on the canvas.
*/
/*
- else {
- globals.ev.flags |= EV_RELOAD;
- }
+ else {
+ globals.ev.flags |= EV_RELOAD;
+ }
*/
TRACE_FILES((stderr, "returning TRUE"));
return True;
@@ -1531,18 +1731,22 @@ dvi_file_changed(void)
if (resource.use_temp_fp) { /* in this case, reload only if file has been written completely */
if (resource.watch_file == 0.0) {
- statusline_print(STATUS_MEDIUM, "File corrupted (click on window to reload) ...");
+ statusline_info(STATUS_MEDIUM, "File corrupted (click on window to reload) ...");
globals.cursor.flags |= CURSOR_CORRUPTED;
globals.ev.flags |= EV_CURSOR;
}
else {
- statusline_print(STATUS_MEDIUM, "File corrupted (will try to reload) ...");
+ statusline_info(STATUS_MEDIUM, "File corrupted (will try to reload) ...");
}
close_old_filep();
if (file_exists_p(globals.dvi_name, &errflag)
&& process_preamble(m_dvi_fp, &errflag)
&& find_postamble(m_dvi_fp, &errflag)
- && read_postamble(m_dvi_fp, &errflag, False)) {
+ && read_postamble(m_dvi_fp, &errflag, False
+#if DELAYED_MKTEXPK
+ , False
+#endif
+ )) {
TRACE_FILES((stderr, "File OK, reloading ..."));
globals.ev.flags |= EV_RELOAD;
@@ -1550,7 +1754,7 @@ dvi_file_changed(void)
}
else {
TRACE_FILES((stderr, "NO successful load: %s", get_dvi_error(errflag)));
-/* fprintf(stderr, "=========== NO successful load: %s\n", get_dvi_error(errflag)); */
+ /* fprintf(stderr, "=========== NO successful load: %s\n", get_dvi_error(errflag)); */
return False;
}
}
@@ -1568,7 +1772,11 @@ dvi_file_changed(void)
**/
Boolean
-load_dvi_file(Boolean load_fonts, dviErrFlagT *errflag)
+load_dvi_file(
+#if !DELAYED_MKTEXPK
+ Boolean load_fonts,
+#endif
+ dviErrFlagT *errflag)
{
unsigned int old_page_w, old_page_h;
static ino_t dvi_inode = 0;
@@ -1581,7 +1789,13 @@ load_dvi_file(Boolean load_fonts, dviErrFlagT *errflag)
fseek(m_dvi_fp, 0L, SEEK_SET);
if (!process_preamble(m_dvi_fp, errflag)
|| !find_postamble(m_dvi_fp, errflag)
- || !read_postamble(m_dvi_fp, errflag, True)) {
+ || !read_postamble(m_dvi_fp, errflag,
+#if DELAYED_MKTEXPK
+ False, False
+#else
+ True
+#endif
+ )) {
TRACE_FILES((stderr, "reading of %p failed: %s!",
(void *)m_dvi_fp,
get_dvi_error(*errflag)));
@@ -1593,16 +1807,42 @@ load_dvi_file(Boolean load_fonts, dviErrFlagT *errflag)
old_page_h = globals.page.h;
*errflag = NO_ERROR;
- if (!internal_open_dvi(globals.dvi_name, errflag, load_fonts)) {
-/* || !internal_init_dvi(errflag, load_fonts)) { */
+
+#if DELAYED_MKTEXPK
+ /* use same trick with reading postamble twice to first find names of PK fonts
+ that need to be created. */
+ reset_missing_font_count();
+ kpse_set_program_enabled(kpse_any_glyph_format, False, kpse_src_compile);
+#endif
+
+ if (!internal_open_dvi(globals.dvi_name, errflag,
+#if DELAYED_MKTEXPK
+ True, False
+#else
+ load_fonts
+#endif
+ )) {
XClearWindow(DISP, mane.win);
- XBell(DISP, 0);
- statusline_print(STATUS_MEDIUM, "%s: %s%s", globals.dvi_name, get_dvi_error(*errflag),
+ xdvi_bell();
+ statusline_info(STATUS_MEDIUM, "%s: %s%s", globals.dvi_name, get_dvi_error(*errflag),
resource.watch_file > 0.0 ? "; will try to reload ..." : " (click on window to reload)");
close_old_filep();
return False;
}
+#if DELAYED_MKTEXPK
+ /* second time */
+ kpse_set_program_enabled(kpse_any_glyph_format, True, kpse_src_compile);
+
+ if (!internal_open_dvi(globals.dvi_name, errflag, True, True)) {
+ XClearWindow(DISP, mane.win);
+ xdvi_bell();
+ statusline_info(STATUS_MEDIUM, "%s: %s%s", globals.dvi_name, get_dvi_error(*errflag),
+ resource.watch_file > 0.0 ? "; will try to reload ..." : " (click on window to reload)");
+ close_old_filep();
+ return False;
+ }
+#endif
else { /* success */
if (fstatbuf.st_ino != dvi_inode) {
dvi_inode = fstatbuf.st_ino;