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 <qfileinfo.h>
extern "C" {
#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))
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;
}

@ -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 <setjmp.h>
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<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()
{
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<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()
@ -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);

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

@ -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.") );

@ -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)

Loading…
Cancel
Save