From e9742b01fa1b49f789fc8a6d20b5b82657e4ed1f Mon Sep 17 00:00:00 2001 From: Stefan Kebekus Date: Thu, 30 Mar 2000 09:09:58 +0000 Subject: [PATCH] Bugfix: kdvi did not always notice when the dvifile was changed; doesn't always go to first page any more svn path=/trunk/kdegraphics/kdvi/; revision=45126 --- dvi_init.cpp | 70 ++++++++--------- dviwin.cpp | 211 ++++++++++++++++++++++++--------------------------- dviwin.h | 1 - kdvi.cpp | 23 +++--- xdvi.h | 1 - 5 files changed, 143 insertions(+), 163 deletions(-) diff --git a/dvi_init.cpp b/dvi_init.cpp index 391e3badb..00d4ad942 100644 --- a/dvi_init.cpp +++ b/dvi_init.cpp @@ -51,6 +51,7 @@ #include +#include extern "C" { #include @@ -79,12 +80,11 @@ extern FILE *font_open (char *font, char **font_ret, double dpi, int *dpi_ret, i #define dvi_oops(str) (dvi_oops_msg = (str), longjmp(dvi_env, 1)) -static struct stat fstatbuf; - static Boolean font_not_found; Boolean _hush_spec; Boolean _hush_chk; Boolean _list_fonts; +QDateTime dvi_time; /* * DVI preamble and postamble information. @@ -447,8 +447,7 @@ find_postamble() * It also takes care of reading in all of the pixel files for the fonts * used in the job. */ -static void -read_postamble() +static void read_postamble() { ubyte cmnd; struct font *fontp; @@ -520,8 +519,7 @@ read_postamble() } } -static void -prepare_pages() +static void prepare_pages() { int i; @@ -546,30 +544,25 @@ void init_page() page_h = ROUNDUP(unshrunk_page_h, mane.shrinkfactor) + 2; } -#ifndef S_ISDIR -#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -#endif - /* * init_dvi_file is the main subroutine for reading the startup * information from the dvi file. Returns True on success. */ -static Boolean -init_dvi_file() +static Boolean init_dvi_file() { - (void) fstat(fileno(dvi_file), &fstatbuf); - if (S_ISDIR(fstatbuf.st_mode)) - return False; - dvi_time = fstatbuf.st_mtime; - process_preamble(); - find_postamble(); - read_postamble(); - prepare_pages(); - init_page(); - if (current_page >= total_pages) current_page = total_pages - 1; - hush_spec_now = hush_spec; - return True; + if (QFileInfo(dvi_name).isDir()) + return False; + dvi_time = QFileInfo(dvi_name).lastModified(); + process_preamble(); + find_postamble(); + read_postamble(); + prepare_pages(); + init_page(); + if (current_page >= total_pages) + current_page = total_pages - 1; + hush_spec_now = hush_spec; + return True; } @@ -579,20 +572,17 @@ init_dvi_file() extern Boolean check_dvi_file(void) { - struct font *fontp; - - if (dvi_file == NULL || fstat(fileno(dvi_file), &fstatbuf) != 0 - || fstatbuf.st_mtime != dvi_time) { - if (dvi_file) { - Fclose(dvi_file); - dvi_file = NULL; - if (list_fonts) Putchar('\n'); - } - dvi_file = fopen(dvi_name, OPEN_MODE); - if (dvi_file == NULL - || !init_dvi_file()) - dvi_oops("Cannot reopen dvi file."); - return False; - } - return True; + if (dvi_file == NULL || (dvi_time != QFileInfo(dvi_name).lastModified())) { + if (dvi_file) { + Fclose(dvi_file); + dvi_file = NULL; + if (list_fonts) + Putchar('\n'); + } + dvi_file = fopen(dvi_name, OPEN_MODE); + if (dvi_file == NULL || !init_dvi_file()) + dvi_oops("Cannot reopen dvi file."); + return False; + } + return True; } diff --git a/dviwin.cpp b/dviwin.cpp index 906f0880c..01e6bc17c 100644 --- a/dviwin.cpp +++ b/dviwin.cpp @@ -97,9 +97,7 @@ extern void qt_processEvents(void) //------ now comes the dviWindow class implementation ---------- -dviWindow::dviWindow( int bdpi, const char *mfm, const char *ppr, - int mkpk, QWidget *parent, const char *name ) - : QScrollView( parent, name ) +dviWindow::dviWindow( int bdpi, const char *mfm, const char *ppr, int mkpk, QWidget *parent, const char *name ) : QScrollView( parent, name ) { ChangesPossible = 1; FontPath = QString::null; @@ -366,79 +364,68 @@ void dviWindow::initDVI() #include extern jmp_buf dvi_env; /* mechanism to communicate dvi file errors */ extern char *dvi_oops_msg; -extern time_t dvi_time; +extern QDateTime dvi_time; //------ this function calls the dvi interpreter ---------- -void dviWindow::drawDVI() -{ - psp_interrupt(); - if (filename.isEmpty()) // must call setFile first - return; - if (!dvi_name) - { // dvi file not initialized yet - QApplication::setOverrideCursor( waitCursor ); - dvi_name = const_cast(filename.ascii()); - - dvi_file = NULL; - if (setjmp(dvi_env)) - { // dvi_oops called - dvi_time = 0; // force init_dvi_file - QApplication::restoreOverrideCursor(); - KMessageBox::error( this, - i18n("What's this? DVI problem!\n") - + dvi_oops_msg); - return; - } - if ( !check_dvi_file() ) - emit fileChanged(); - - QApplication::restoreOverrideCursor(); - gotoPage(1); - changePageSize(); - emit viewSizeChanged( QSize( visibleWidth(),visibleHeight() )); - timer->start( 1000 ); - return; - } - min_x = 0; - min_y = 0; - max_x = page_w; - max_y = page_h; - - if ( !pixmap ) return; - if ( !pixmap->paintingActive() ) - { - QPainter paint; - paint.begin( pixmap ); - QApplication::setOverrideCursor( waitCursor ); - dcp = &paint; - if (setjmp(dvi_env)) - { // dvi_oops called - dvi_time = 0; // force init_dvi_file - QApplication::restoreOverrideCursor(); - paint.end(); - KMessageBox::error( this, - i18n("What's this? DVI problem!\n") - + dvi_oops_msg); - return; - } - else - { - if ( !check_dvi_file() ) - emit fileChanged(); - pixmap->fill( white ); - draw_page(); - } - QApplication::restoreOverrideCursor(); - paint.end(); - } -} void dviWindow::drawPage() { - drawDVI(); - repaintContents(contentsX(), contentsY(), - visibleWidth(), visibleHeight(), FALSE); + psp_interrupt(); + if (filename.isEmpty()) // must call setFile first + return; + if (!dvi_name) { // dvi file not initialized yet + QApplication::setOverrideCursor( waitCursor ); + dvi_name = const_cast(filename.ascii()); + + dvi_file = NULL; + if (setjmp(dvi_env)) { // dvi_oops called + dvi_time.setTime_t(0); // force init_dvi_file + QApplication::restoreOverrideCursor(); + KMessageBox::error( this, + i18n("What's this? DVI problem!\n") + + dvi_oops_msg); + return; + } + if ( !check_dvi_file() ) + emit fileChanged(); + QApplication::restoreOverrideCursor(); + gotoPage(1); + changePageSize(); + emit viewSizeChanged( QSize( visibleWidth(),visibleHeight() )); + timer->start( 1000 ); + return; + } + min_x = 0; + min_y = 0; + max_x = page_w; + max_y = page_h; + + if ( !pixmap ) + return; + if ( !pixmap->paintingActive() ) { + QPainter paint; + paint.begin( pixmap ); + QApplication::setOverrideCursor( waitCursor ); + dcp = &paint; + if (setjmp(dvi_env)) { // dvi_oops called + dvi_time.setTime_t(0); // force init_dvi_file + QApplication::restoreOverrideCursor(); + paint.end(); + KMessageBox::error( this, + i18n("What's this? DVI problem!\n") + + dvi_oops_msg); + return; + } else { + if ( !check_dvi_file() ) + emit fileChanged(); + pixmap->fill( white ); + draw_page(); + } + QApplication::restoreOverrideCursor(); + paint.end(); + } + repaintContents(contentsX(), contentsY(), visibleWidth(), visibleHeight(), FALSE); } bool dviWindow::changedDVI() @@ -448,36 +435,38 @@ bool dviWindow::changedDVI() bool dviWindow::correctDVI() { - QFile f(filename); - if (!f.open(IO_ReadOnly)) - return FALSE; - int n = f.size(); - if ( n < 134 ) // Too short for a dvi file - return FALSE; - f.at( n-4 ); - char test[4]; - unsigned char trailer[4] = { 0xdf,0xdf,0xdf,0xdf }; - if ( f.readBlock( test, 4 )<4 || strncmp( test, (char *) trailer, 4 ) ) - return FALSE; - // We suppose now that the dvi file is complete and OK - return TRUE; + QFile f(filename); + if (!f.open(IO_ReadOnly)) + return FALSE; + int n = f.size(); + if ( n < 134 ) // Too short for a dvi file + return FALSE; + f.at( n-4 ); + char test[4]; + unsigned char trailer[4] = { 0xdf,0xdf,0xdf,0xdf }; + if ( f.readBlock( test, 4 )<4 || strncmp( test, (char *) trailer, 4 ) ) + return FALSE; + // We suppose now that the dvi file is complete and OK + return TRUE; } + void dviWindow::timerEvent() { - static int changing = 0; + static int changing = 0; - if ( !changedDVI() ) - return; - if ( !changing ) - emit statusChange( i18n("File status changed.") ); - changing = 1; - if ( !correctDVI() ) - return; - changing = 0; - emit statusChange( i18n("File reloaded.") ); - changetime = QFileInfo(filename).lastModified(); - drawPage(); - emit fileChanged(); + if ( !changedDVI() ) + return; + if ( !changing ) + emit statusChange( i18n("File status changed.") ); + changing = 1; + if ( !correctDVI() ) + return; + changing = 0; + emit statusChange( i18n("File reloaded.") ); + changetime = QFileInfo(filename).lastModified(); + + drawPage(); + emit fileChanged(); } void dviWindow::changePageSize() @@ -557,15 +546,15 @@ void dviWindow::nextPage() void dviWindow::gotoPage(int new_page) { - if (new_page<1) - new_page = 1; - if (new_page>total_pages) - new_page = total_pages; - if (new_page-1==current_page) - return; - current_page = new_page-1; - emit currentPage(new_page); - drawPage(); + if (new_page<1) + new_page = 1; + if (new_page>total_pages) + new_page = total_pages; + if (new_page-1==current_page) + return; + current_page = new_page-1; + emit currentPage(new_page); + drawPage(); } void dviWindow::firstPage() @@ -618,21 +607,19 @@ void dviWindow::setShrink(int s) emit shrinkChanged( shrink() ); } -void dviWindow::resizeEvent(QResizeEvent *e) +void dviWindow::resizeEvent(QResizeEvent *e) { - QScrollView::resizeEvent(e); - emit viewSizeChanged( QSize( visibleWidth(),visibleHeight() )); + QScrollView::resizeEvent(e); + emit viewSizeChanged( QSize( visibleWidth(),visibleHeight() )); } -void dviWindow::contentsMoving( int x, int y ) +void dviWindow::contentsMoving( int x, int y ) { emit currentPosChanged( QPoint(x, y) ); } -void dviWindow::drawContents(QPainter *p, - int clipx, int clipy, - int clipw, int cliph ) +void dviWindow::drawContents(QPainter *p, int clipx, int clipy, int clipw, int cliph ) { if ( pixmap ) p->drawPixmap(clipx, clipy, *pixmap, clipx, clipy, clipw, cliph); diff --git a/dviwin.h b/dviwin.h index e264098e5..4b8c36cd9 100644 --- a/dviwin.h +++ b/dviwin.h @@ -90,7 +90,6 @@ private: bool changedDVI(); bool correctDVI(); void initDVI(); - void drawDVI(); void changePageSize(); QPoint mouse; QString filename; diff --git a/kdvi.cpp b/kdvi.cpp index 98022b72e..7e1824cf8 100644 --- a/kdvi.cpp +++ b/kdvi.cpp @@ -473,7 +473,7 @@ void kdvi::updateMarklist() s.sprintf( "%4d", i ); marklist->insertItem( s, 0 ); } - marklist->select(0); + // marklist->select(0); //@@@ marklist->setAutoUpdate( TRUE ); marklist->update(); } @@ -822,16 +822,18 @@ void kdvi::pageActivated( const QString & text) void kdvi::setPage( int pg ) { - QString str; + QString str; - if (!pg) pg = dviwin->page(); - if (!pg) return; - str.setNum( pg ); - str = i18n("Page: ") + str + i18n(" / ") + QString().setNum(dviwin->totalPages()); - statusBar()->changeItem( str, ID_STAT_PAGE ); + if (!pg) + pg = dviwin->page(); + if (!pg) + return; + str.setNum( pg ); + str = i18n("Page: ") + str + i18n(" / ") + QString().setNum(dviwin->totalPages()); + statusBar()->changeItem( str, ID_STAT_PAGE ); - if ( marklist ) - marklist->select( pg - 1 ); + if ( marklist ) + marklist->select( pg - 1 ); } void kdvi::selectShrink( QPoint p ) @@ -887,6 +889,9 @@ void kdvi::shrinkChanged(int s) statusBar()->changeItem( t, ID_STAT_SHRINK); } + +// This slot is called after the dvi-file has been reloaded. + void kdvi::fileChanged() { message( i18n("File reloaded.") ); diff --git a/xdvi.h b/xdvi.h index 1d6e3d08d..dff6f16c5 100644 --- a/xdvi.h +++ b/xdvi.h @@ -266,7 +266,6 @@ EXTERN long magnification; EXTERN double dimconv; EXTERN double tpic_conv; EXTERN int n_files_left; /* for LRU closing of fonts */ -EXTERN time_t dvi_time; /* last mod. time for dvi file */ EXTERN unsigned int page_w, page_h; #if defined(PS_DPS) || defined(PS_NEWS) || defined(PS_GS)