- // check for legal page number
- if (doc && (pg < 1 || pg > doc->getNumPages()))
- pg = 1;
-
- // create window
- menu = makeMenu();
- zoomMenu = makeZoomMenu();
- win = makeWindow(app);
- win->setMenu(menu);
- canvas = (LTKScrollingCanvas *)win->findWidget("canvas");
- hScrollbar = (LTKScrollbar *)win->findWidget("hScrollbar");
- vScrollbar = (LTKScrollbar *)win->findWidget("vScrollbar");
- pageNumText = (LTKTextIn *)win->findWidget("pageNum");
- numPagesLabel = (LTKLabel *)win->findWidget("numPages");
- linkLabel = (LTKLabel *)win->findWidget("link");
- zoomMenuBtn = (LTKMenuButton *)win->findWidget("zoom");
- win->setKeyCbk(&keyPressCbk);
- win->setLayoutCbk(&layoutCbk);
- canvas->setButtonPressCbk(&buttonPressCbk);
- canvas->setButtonReleaseCbk(&buttonReleaseCbk);
- canvas->setMouseMoveCbk(&mouseMoveCbk);
- canvas->setMouseDragCbk(&mouseDragCbk);
- hScrollbar->setRepeatPeriod(0);
- vScrollbar->setRepeatPeriod(0);
-
- // get X resources
- paperWidth = app->getIntResource("psPaperWidth", defPaperWidth);
- paperHeight = app->getIntResource("psPaperHeight", defPaperHeight);
- psOutLevel1 = app->getBoolResource("psLevel1", gFalse);
- urlCommand = app->getStringResource("urlCommand", NULL);
- installCmap = app->getBoolResource("installCmap", gFalse);
- if (installCmap)
- win->setInstallCmap(gTrue);
- rgbCubeSize = app->getIntResource("rgbCubeSize", defaultRGBCube);
- paperColor = app->getColorResource("paperColor", "white",
- WhitePixel(display, app->getScreenNum()),
- NULL);
-#if JAPANESE_SUPPORT
- useEUCJP = app->getBoolResource("eucjp", gFalse);
-#else
- useEUCJP = gFalse;
-#endif
-#if HAVE_T1LIB_H
- t1libControl = app->getStringResource("t1libControl", "low");
-#endif
- t1Courier = app->getStringResource("t1Courier", NULL);
- t1CourierBold = app->getStringResource("t1CourierBold", NULL);
- t1CourierBoldOblique = app->getStringResource("t1CourierBoldOblique", NULL);
- t1CourierOblique = app->getStringResource("t1CourierOblique", NULL);
- t1Helvetica = app->getStringResource("t1Helvetica", NULL);
- t1HelveticaBold = app->getStringResource("t1HelveticaBold", NULL);
- t1HelveticaBoldOblique =
- app->getStringResource("t1HelveticaBoldOblique", NULL);
- t1HelveticaOblique = app->getStringResource("t1HelveticaOblique", NULL);
- t1Symbol = app->getStringResource("t1Symbol", NULL);
- t1TimesBold = app->getStringResource("t1TimesBold", NULL);
- t1TimesBoldItalic = app->getStringResource("t1TimesBoldItalic", NULL);
- t1TimesItalic = app->getStringResource("t1TimesItalic", NULL);
- t1TimesRoman = app->getStringResource("t1TimesRoman", NULL);
- t1ZapfDingbats = app->getStringResource("t1ZapfDingbats", NULL);
-#if JAPANESE_SUPPORT
- japan12Font = app->getStringResource("japaneseFont", NULL);
-#endif
- zoomStr = app->getStringResource("initialZoom", defZoomStr);
- if (!zoomStr->cmp("page")) {
- zoom = zoomPage;
- i = maxZoom - minZoom + 2;
- } else if (!zoomStr->cmp("width")) {
- zoom = zoomWidth;
- i = maxZoom - minZoom + 3;
- } else {
- zoom = atoi(zoomStr->getCString());
- if (zoom < minZoom)
- zoom = minZoom;
- else if (zoom > maxZoom)
- zoom = maxZoom;
- i = zoom - minZoom;
- }
- delete zoomStr;
- zoomMenuBtn->setInitialMenuItem(zoomMenu->getItem(i));
- viKeys = app->getBoolResource("viKeys", gFalse);
-
- // get geometry
- x = y = -1;
- width = height = 0;
- app->getGeometryResource("geometry", &x, &y, &width, &height);
- if (width == 0 || height == 0) {
- if (!doc || doc->getNumPages() == 0) {
- width = 612;
- height = 792;
- } else if (doc->getPageRotate(pg) == 90 || doc->getPageRotate(pg) == 270) {
- width = (int)(doc->getPageHeight(pg) + 0.5);
- height = (int)(doc->getPageWidth(pg) + 0.5);
- } else {
- width = (int)(doc->getPageWidth(pg) + 0.5);
- height = (int)(doc->getPageHeight(pg) + 0.5);
- }
- if (zoom == zoomPage || zoom == zoomWidth) {
- width = (width * zoomDPI[defZoom - minZoom]) / 72 + 28;
- height = (height * zoomDPI[defZoom - minZoom]) / 72 + 56;
- } else {
- width = (width * zoomDPI[zoom - minZoom]) / 72 + 28;
- height = (height * zoomDPI[zoom - minZoom]) / 72 + 56;
- }
- if (width > (Guint)app->getDisplayWidth() - 100) {
- width = app->getDisplayWidth() - 100;
- }
- if (height > (Guint)app->getDisplayHeight() - 100) {
- height = app->getDisplayHeight() - 100;
- }
- }
-
- // finish setting up window
- sprintf(s, "of %d", doc ? doc->getNumPages() : 0);
- numPagesLabel->setText(s);
- if (name) {
- title = new GString("xpdf: ");
- title->append(name);
- } else {
- title = new GString("xpdf");
- }
- win->setTitle(title);
- win->layout(x, y, width, height);
- win->map();
- aboutWin = NULL;
- psDialog = NULL;
- openDialog = NULL;
- saveDialog = NULL;
- findWin = NULL;
- gcValues.foreground = BlackPixel(display, win->getScreenNum()) ^
- WhitePixel(display, win->getScreenNum());
- gcValues.function = GXxor;
- selectGC = XCreateGC(display, win->getXWindow(),
- GCForeground | GCFunction, &gcValues);
-
- // set up remote server
- if (remoteAtom != None) {
- win->setPropChangeCbk(&propChangeCbk);
- xwin = win->getXWindow();
- XSetSelectionOwner(display, remoteAtom, xwin, CurrentTime);
- }
-
- // create output device
- out = new LTKOutputDev(win, paperColor);
- out->startDoc();
-
- // display first page
- displayPage(pg, zoom, 0, gTrue);
-
- // event loop
- quit = gFalse;
- do {
- app->doEvent(gTrue);
- } while (!quit);
-
- done1:
- // release remote control atom
- if (remoteAtom != None)
- XSetSelectionOwner(display, remoteAtom, None, CurrentTime);
-
- done2:
- // free stuff
- if (out)
- delete out;
- if (win)
- delete win;
- if (aboutWin)
- delete aboutWin;
- if (findWin)
- delete findWin;
- if (app)
- delete app;
- if (doc)
- delete doc;
- if (psFileName)
- delete psFileName;
- if (defPSFileName)
- delete defPSFileName;
- if (fileReqDir)
- delete fileReqDir;
- if (urlCommand)
- delete urlCommand;
-#if HAVE_T1LIB_H
- if (t1libControl)
- delete t1libControl;
-#endif
- if (t1Courier)
- delete t1Courier;
- if (t1CourierBold)
- delete t1CourierBold;
- if (t1CourierBoldOblique)
- delete t1CourierBoldOblique;
- if (t1CourierOblique)
- delete t1CourierOblique;
- if (t1Helvetica)
- delete t1Helvetica;
- if (t1HelveticaBold)
- delete t1HelveticaBold;
- if (t1HelveticaBoldOblique)
- delete t1HelveticaBoldOblique;
- if (t1HelveticaOblique)
- delete t1HelveticaOblique;
- if (t1Symbol)
- delete t1Symbol;
- if (t1TimesBold)
- delete t1TimesBold;
- if (t1TimesBoldItalic)
- delete t1TimesBoldItalic;
- if (t1TimesItalic)
- delete t1TimesItalic;
- if (t1TimesRoman)
- delete t1TimesRoman;
- if (t1ZapfDingbats)
- delete t1ZapfDingbats;
-#if JAPANESE_FONT
- if (japan12Font)
- delete japan12Font;
-#endif
- for (i = 0; i < historySize; ++i) {
- if (history[i].fileName)
- delete history[i].fileName;
- }
- freeParams();
-
- // check for memory leaks
- Object::memCheck(errFile ? errFile : stderr);
- gMemReport(errFile ? errFile : stderr);
-
- return ret;
-}
-
-//------------------------------------------------------------------------
-// loadFile / displayPage
-//------------------------------------------------------------------------
-
-static GBool loadFile(GString *fileName) {
- GString *title;
- PDFDoc *newDoc;
- char s[20];
- char *p;
-
- // busy cursor
- if (win)
- win->setBusyCursor(gTrue);
-
- // open PDF file
- newDoc = new PDFDoc(fileName);
- if (!newDoc->isOk()) {
- delete newDoc;
- if (win)
- win->setBusyCursor(gFalse);
- return gFalse;
- }
-
- // replace old document
- if (doc)
- delete doc;
- doc = newDoc;
- if (out)
- out->startDoc();
-
- // nothing displayed yet
- page = -99;
-
- // init PostScript output params
- if (psFileName)
- delete psFileName;
- if (defPSFileName) {
- psFileName = defPSFileName->copy();
- } else {
- p = fileName->getCString() + fileName->getLength() - 4;
- if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF"))
- psFileName = new GString(fileName->getCString(),
- fileName->getLength() - 4);
- else
- psFileName = fileName->copy();
- psFileName->append(".ps");
- }
- psFirstPage = 1;
- psLastPage = doc->getNumPages();
-
- // set up title, number-of-pages display; back to normal cursor
- if (win) {
- title = new GString("xpdf: ");
- title->append(fileName);
- win->setTitle(title);
- sprintf(s, "of %d", doc->getNumPages());
- numPagesLabel->setText(s);
- win->setBusyCursor(gFalse);
- }
-
- // done
- return gTrue;
-}
-
-static void displayPage(int page1, int zoom1, int rotate1, GBool addToHist) {
- double hDPI, vDPI, dpi;
- int rot;
- char s[20];
- History *h;
-
- // check for document
- if (!doc || doc->getNumPages() == 0)
- return;
-
- // busy cursor
- if (win)
- win->setBusyCursor(gTrue);
-
- // new page/zoom/rotate values
- page = page1;
- zoom = zoom1;
- rotate = rotate1;
-
- // initialize mouse-related stuff
- linkAction = NULL;
- win->setDefaultCursor();
- linkLabel->setText(NULL);
- selectXMin = selectXMax = 0;
- selectYMin = selectYMax = 0;
- lastDragLeft = lastDragTop = gTrue;
-
- // draw the page
- rot = rotate + doc->getPageRotate(page);
- if (rot >= 360)
- rot -= 360;
- else if (rotate < 0)
- rot += 360;
- if (zoom == zoomPage) {
- if (rot == 90 || rot == 270) {
- hDPI = ((win->getWidth() - 28) / doc->getPageHeight(page)) * 72;
- vDPI = ((win->getHeight() - 56) / doc->getPageWidth(page)) * 72;
- } else {
- hDPI = ((win->getWidth() - 28) / doc->getPageWidth(page)) * 72;
- vDPI = ((win->getHeight() - 56) / doc->getPageHeight(page)) * 72;
- }
- dpi = (hDPI < vDPI) ? hDPI : vDPI;
- } else if (zoom == zoomWidth) {
- if (rot == 90 || rot == 270) {
- dpi = ((win->getWidth() - 28) / doc->getPageHeight(page)) * 72;
- } else {
- dpi = ((win->getWidth() - 28) / doc->getPageWidth(page)) * 72;