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
remotes/origin/kdvi-2.0
Stefan Kebekus 26 years ago
parent 9b2bf9ee0c
commit e9742b01fa
  1. 70
      dvi_init.cpp
  2. 211
      dviwin.cpp
  3. 1
      dviwin.h
  4. 23
      kdvi.cpp
  5. 1
      xdvi.h

@ -51,6 +51,7 @@
#include <qbitmap.h> #include <qbitmap.h>
#include <qfileinfo.h>
extern "C" { extern "C" {
#include <kpathsea/config.h> #include <kpathsea/config.h>
@ -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)) #define dvi_oops(str) (dvi_oops_msg = (str), longjmp(dvi_env, 1))
static struct stat fstatbuf;
static Boolean font_not_found; static Boolean font_not_found;
Boolean _hush_spec; Boolean _hush_spec;
Boolean _hush_chk; Boolean _hush_chk;
Boolean _list_fonts; Boolean _list_fonts;
QDateTime dvi_time;
/* /*
* DVI preamble and postamble information. * 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 * It also takes care of reading in all of the pixel files for the fonts
* used in the job. * used in the job.
*/ */
static void static void read_postamble()
read_postamble()
{ {
ubyte cmnd; ubyte cmnd;
struct font *fontp; struct font *fontp;
@ -520,8 +519,7 @@ read_postamble()
} }
} }
static void static void prepare_pages()
prepare_pages()
{ {
int i; int i;
@ -546,30 +544,25 @@ void init_page()
page_h = ROUNDUP(unshrunk_page_h, mane.shrinkfactor) + 2; 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 * init_dvi_file is the main subroutine for reading the startup
* information from the dvi file. Returns True on success. * information from the dvi file. Returns True on success.
*/ */
static Boolean static Boolean init_dvi_file()
init_dvi_file()
{ {
(void) fstat(fileno(dvi_file), &fstatbuf); if (QFileInfo(dvi_name).isDir())
if (S_ISDIR(fstatbuf.st_mode)) return False;
return False; dvi_time = QFileInfo(dvi_name).lastModified();
dvi_time = fstatbuf.st_mtime; process_preamble();
process_preamble(); find_postamble();
find_postamble(); read_postamble();
read_postamble(); prepare_pages();
prepare_pages(); init_page();
init_page(); if (current_page >= total_pages)
if (current_page >= total_pages) current_page = total_pages - 1; current_page = total_pages - 1;
hush_spec_now = hush_spec; hush_spec_now = hush_spec;
return True; return True;
} }
@ -579,20 +572,17 @@ init_dvi_file()
extern Boolean check_dvi_file(void) extern Boolean check_dvi_file(void)
{ {
struct font *fontp; if (dvi_file == NULL || (dvi_time != QFileInfo(dvi_name).lastModified())) {
if (dvi_file) {
if (dvi_file == NULL || fstat(fileno(dvi_file), &fstatbuf) != 0 Fclose(dvi_file);
|| fstatbuf.st_mtime != dvi_time) { dvi_file = NULL;
if (dvi_file) { if (list_fonts)
Fclose(dvi_file); Putchar('\n');
dvi_file = NULL; }
if (list_fonts) Putchar('\n'); dvi_file = fopen(dvi_name, OPEN_MODE);
} if (dvi_file == NULL || !init_dvi_file())
dvi_file = fopen(dvi_name, OPEN_MODE); dvi_oops("Cannot reopen dvi file.");
if (dvi_file == NULL return False;
|| !init_dvi_file()) }
dvi_oops("Cannot reopen dvi file."); return True;
return False;
}
return True;
} }

@ -97,9 +97,7 @@ extern void qt_processEvents(void)
//------ now comes the dviWindow class implementation ---------- //------ now comes the dviWindow class implementation ----------
dviWindow::dviWindow( int bdpi, const char *mfm, const char *ppr, dviWindow::dviWindow( int bdpi, const char *mfm, const char *ppr, int mkpk, QWidget *parent, const char *name ) : QScrollView( parent, name )
int mkpk, QWidget *parent, const char *name )
: QScrollView( parent, name )
{ {
ChangesPossible = 1; ChangesPossible = 1;
FontPath = QString::null; FontPath = QString::null;
@ -366,79 +364,68 @@ void dviWindow::initDVI()
#include <setjmp.h> #include <setjmp.h>
extern jmp_buf dvi_env; /* mechanism to communicate dvi file errors */ extern jmp_buf dvi_env; /* mechanism to communicate dvi file errors */
extern char *dvi_oops_msg; extern char *dvi_oops_msg;
extern time_t dvi_time; extern QDateTime dvi_time;
//------ this function calls the dvi interpreter ---------- //------ 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<char*>(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() void dviWindow::drawPage()
{ {
drawDVI(); psp_interrupt();
repaintContents(contentsX(), contentsY(), if (filename.isEmpty()) // must call setFile first
visibleWidth(), visibleHeight(), FALSE); return;
if (!dvi_name) { // dvi file not initialized yet
QApplication::setOverrideCursor( waitCursor );
dvi_name = const_cast<char*>(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() bool dviWindow::changedDVI()
@ -448,36 +435,38 @@ bool dviWindow::changedDVI()
bool dviWindow::correctDVI() bool dviWindow::correctDVI()
{ {
QFile f(filename); QFile f(filename);
if (!f.open(IO_ReadOnly)) if (!f.open(IO_ReadOnly))
return FALSE; return FALSE;
int n = f.size(); int n = f.size();
if ( n < 134 ) // Too short for a dvi file if ( n < 134 ) // Too short for a dvi file
return FALSE; return FALSE;
f.at( n-4 ); f.at( n-4 );
char test[4]; char test[4];
unsigned char trailer[4] = { 0xdf,0xdf,0xdf,0xdf }; unsigned char trailer[4] = { 0xdf,0xdf,0xdf,0xdf };
if ( f.readBlock( test, 4 )<4 || strncmp( test, (char *) trailer, 4 ) ) if ( f.readBlock( test, 4 )<4 || strncmp( test, (char *) trailer, 4 ) )
return FALSE; return FALSE;
// We suppose now that the dvi file is complete and OK // We suppose now that the dvi file is complete and OK
return TRUE; return TRUE;
} }
void dviWindow::timerEvent() void dviWindow::timerEvent()
{ {
static int changing = 0; static int changing = 0;
if ( !changedDVI() ) if ( !changedDVI() )
return; return;
if ( !changing ) if ( !changing )
emit statusChange( i18n("File status changed.") ); emit statusChange( i18n("File status changed.") );
changing = 1; changing = 1;
if ( !correctDVI() ) if ( !correctDVI() )
return; return;
changing = 0; changing = 0;
emit statusChange( i18n("File reloaded.") ); emit statusChange( i18n("File reloaded.") );
changetime = QFileInfo(filename).lastModified(); changetime = QFileInfo(filename).lastModified();
drawPage();
emit fileChanged(); drawPage();
emit fileChanged();
} }
void dviWindow::changePageSize() void dviWindow::changePageSize()
@ -557,15 +546,15 @@ void dviWindow::nextPage()
void dviWindow::gotoPage(int new_page) void dviWindow::gotoPage(int new_page)
{ {
if (new_page<1) if (new_page<1)
new_page = 1; new_page = 1;
if (new_page>total_pages) if (new_page>total_pages)
new_page = total_pages; new_page = total_pages;
if (new_page-1==current_page) if (new_page-1==current_page)
return; return;
current_page = new_page-1; current_page = new_page-1;
emit currentPage(new_page); emit currentPage(new_page);
drawPage(); drawPage();
} }
void dviWindow::firstPage() void dviWindow::firstPage()
@ -618,21 +607,19 @@ void dviWindow::setShrink(int s)
emit shrinkChanged( shrink() ); emit shrinkChanged( shrink() );
} }
void dviWindow::resizeEvent(QResizeEvent *e) void dviWindow::resizeEvent(QResizeEvent *e)
{ {
QScrollView::resizeEvent(e); QScrollView::resizeEvent(e);
emit viewSizeChanged( QSize( visibleWidth(),visibleHeight() )); emit viewSizeChanged( QSize( visibleWidth(),visibleHeight() ));
} }
void dviWindow::contentsMoving( int x, int y ) void dviWindow::contentsMoving( int x, int y )
{ {
emit currentPosChanged( QPoint(x, y) ); emit currentPosChanged( QPoint(x, y) );
} }
void dviWindow::drawContents(QPainter *p, void dviWindow::drawContents(QPainter *p, int clipx, int clipy, int clipw, int cliph )
int clipx, int clipy,
int clipw, int cliph )
{ {
if ( pixmap ) if ( pixmap )
p->drawPixmap(clipx, clipy, *pixmap, clipx, clipy, clipw, cliph); p->drawPixmap(clipx, clipy, *pixmap, clipx, clipy, clipw, cliph);

@ -90,7 +90,6 @@ private:
bool changedDVI(); bool changedDVI();
bool correctDVI(); bool correctDVI();
void initDVI(); void initDVI();
void drawDVI();
void changePageSize(); void changePageSize();
QPoint mouse; QPoint mouse;
QString filename; QString filename;

@ -473,7 +473,7 @@ void kdvi::updateMarklist()
s.sprintf( "%4d", i ); s.sprintf( "%4d", i );
marklist->insertItem( s, 0 ); marklist->insertItem( s, 0 );
} }
marklist->select(0); // marklist->select(0); //@@@
marklist->setAutoUpdate( TRUE ); marklist->setAutoUpdate( TRUE );
marklist->update(); marklist->update();
} }
@ -822,16 +822,18 @@ void kdvi::pageActivated( const QString & text)
void kdvi::setPage( int pg ) void kdvi::setPage( int pg )
{ {
QString str; QString str;
if (!pg) pg = dviwin->page(); if (!pg)
if (!pg) return; pg = dviwin->page();
str.setNum( pg ); if (!pg)
str = i18n("Page: ") + str + i18n(" / ") + QString().setNum(dviwin->totalPages()); return;
statusBar()->changeItem( str, ID_STAT_PAGE ); str.setNum( pg );
str = i18n("Page: ") + str + i18n(" / ") + QString().setNum(dviwin->totalPages());
statusBar()->changeItem( str, ID_STAT_PAGE );
if ( marklist ) if ( marklist )
marklist->select( pg - 1 ); marklist->select( pg - 1 );
} }
void kdvi::selectShrink( QPoint p ) void kdvi::selectShrink( QPoint p )
@ -887,6 +889,9 @@ void kdvi::shrinkChanged(int s)
statusBar()->changeItem( t, ID_STAT_SHRINK); statusBar()->changeItem( t, ID_STAT_SHRINK);
} }
// This slot is called after the dvi-file has been reloaded.
void kdvi::fileChanged() void kdvi::fileChanged()
{ {
message( i18n("File reloaded.") ); message( i18n("File reloaded.") );

@ -266,7 +266,6 @@ EXTERN long magnification;
EXTERN double dimconv; EXTERN double dimconv;
EXTERN double tpic_conv; EXTERN double tpic_conv;
EXTERN int n_files_left; /* for LRU closing of fonts */ 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; EXTERN unsigned int page_w, page_h;
#if defined(PS_DPS) || defined(PS_NEWS) || defined(PS_GS) #if defined(PS_DPS) || defined(PS_NEWS) || defined(PS_GS)

Loading…
Cancel
Save