- if (!doc)
- return;
- page1 = atoi(text->getCString());
- if (page1 >= 1 && page1 <= doc->getNumPages()) {
- if (page1 != page)
- displayPage(page1, zoom, rotate);
- } else {
- XBell(display, 0);
- sprintf(s, "%d", page);
- pageNumText->setText(s);
- }
-}
-
-static void zoomInCbk(LTKWidget *button, int n, GBool on) {
- if (!doc)
- return;
- if (zoom < maxZoom)
- displayPage(page, zoom + 1, rotate);
- else
- XBell(display, 0);
-}
-
-static void zoomOutCbk(LTKWidget *button, int n, GBool on) {
- if (!doc)
- return;
- if (zoom > minZoom)
- displayPage(page, zoom - 1, rotate);
- else
- XBell(display, 0);
-}
-
-static void postScriptCbk(LTKWidget *button, int n, GBool on) {
- if (!doc)
- return;
- mapPSDialog();
-}
-
-static void aboutCbk(LTKWidget *button, int n, GBool on) {
- mapAboutWin();
-}
-
-static void quitCbk(LTKWidget *button, int n, GBool on) {
- quit = gTrue;
-}
-
-//------------------------------------------------------------------------
-// scrollbar callbacks
-//------------------------------------------------------------------------
-
-static void scrollVertCbk(LTKWidget *scrollbar, int n, int val) {
- canvas->scroll(hScrollbar->getPos(), val);
- XSync(display, False);
-}
-
-static void scrollHorizCbk(LTKWidget *scrollbar, int n, int val) {
- canvas->scroll(val, vScrollbar->getPos());
- XSync(display, False);
-}
-
-//------------------------------------------------------------------------
-// misc callbacks
-//------------------------------------------------------------------------
-
-static void layoutCbk(LTKWindow *win1) {
- hScrollbar->setLimits(0, canvas->getRealWidth() - 1);
- hScrollbar->setPos(hScrollbar->getPos(), canvas->getWidth());
- hScrollbar->setScrollDelta(16);
- vScrollbar->setLimits(0, canvas->getRealHeight() - 1);
- vScrollbar->setPos(vScrollbar->getPos(), canvas->getHeight());
- vScrollbar->setScrollDelta(16);
- canvas->scroll(hScrollbar->getPos(), vScrollbar->getPos());
-}
-
-static void propChangeCbk(LTKWindow *win1, Atom atom) {
- Window xwin;
- char *cmd;
- Atom type;
- int format;
- Gulong size, remain;
- char *p;
- GString *newFileName;
- int newPage;
-
- // get command
- xwin = win1->getXWindow();
- if (XGetWindowProperty(display, xwin, remoteAtom,
- 0, remoteCmdLength/4, True, remoteAtom,
- &type, &format, &size, &remain,
- (Guchar **)&cmd) != Success)
- return;
- if (size == 0)
- return;
-
- // raise window
- if (cmd[0] == 'D' || cmd[0] == 'r'){
- win->raise();
- XFlush(display);
- }
-
- // display file / page
- if (cmd[0] == 'd' || cmd[0] == 'D') {
- p = cmd + 2;
- newPage = atoi(p);
- if (!(p = strchr(p, ' ')))
- return;
- newFileName = new GString(p + 1);
- XFree((XPointer)cmd);
- if (!doc || newFileName->cmp(doc->getFileName())) {
- if (!loadFile(newFileName))
- return;
- } else {
- delete newFileName;
- }
- if (newPage != page && newPage >= 1 && newPage <= doc->getNumPages())
- displayPage(newPage, zoom, rotate);
-
- // quit
- } else if (cmd[0] == 'q') {
- quit = gTrue;
- }
-}
-
-//------------------------------------------------------------------------
-// selection
-//------------------------------------------------------------------------
-
-static void setSelection(int newXMin, int newYMin, int newXMax, int newYMax) {
- int x, y, w, h;
- GBool needRedraw, needScroll;
- GBool moveLeft, moveRight, moveTop, moveBottom;
-
- // erase old selection on canvas pixmap
- needRedraw = gFalse;
- if (selectXMin < selectXMax && selectYMin < selectYMax) {
- XFillRectangle(canvas->getDisplay(), canvas->getPixmap(),
- selectGC, selectXMin, selectYMin,
- selectXMax - selectXMin, selectYMax - selectYMin);
- needRedraw = gTrue;
- }
-
- // draw new selection on canvas pixmap
- if (newXMin < newXMax && newYMin < newYMax) {
- XFillRectangle(canvas->getDisplay(), canvas->getPixmap(),
- selectGC, newXMin, newYMin,
- newXMax - newXMin, newYMax - newYMin);
- needRedraw = gTrue;
- }
-
- // check which edges moved
- moveLeft = newXMin != selectXMin;
- moveTop = newYMin != selectYMin;
- moveRight = newXMax != selectXMax;
- moveBottom = newYMax != selectYMax;
-
- // redraw currently visible part of canvas
- if (needRedraw) {
- if (moveLeft) {
- canvas->redrawRect((newXMin < selectXMin) ? newXMin : selectXMin,
- (newYMin < selectYMin) ? newYMin : selectYMin,
- (newXMin > selectXMin) ? newXMin : selectXMin,
- (newYMax > selectYMax) ? newYMax : selectYMax);
- }
- if (moveRight) {
- canvas->redrawRect((newXMax < selectXMax) ? newXMax : selectXMax,
- (newYMin < selectYMin) ? newYMin : selectYMin,
- (newXMax > selectXMax) ? newXMax : selectXMax,
- (newYMax > selectYMax) ? newYMax : selectYMax);
- }
- if (moveTop) {
- canvas->redrawRect((newXMin < selectXMin) ? newXMin : selectXMin,
- (newYMin < selectYMin) ? newYMin : selectYMin,
- (newXMax > selectXMax) ? newXMax : selectXMax,
- (newYMin > selectYMin) ? newYMin : selectYMin);
- }
- if (moveBottom) {
- canvas->redrawRect((newXMin < selectXMin) ? newXMin : selectXMin,
- (newYMax < selectYMax) ? newYMax : selectYMax,
- (newXMax > selectXMax) ? newXMax : selectXMax,
- (newYMax > selectYMax) ? newYMax : selectYMax);
- }
- }
-
- // switch to new selection coords
- selectXMin = newXMin;
- selectXMax = newXMax;
- selectYMin = newYMin;
- selectYMax = newYMax;
-
- // scroll canvas if necessary
- needScroll = gFalse;
- w = canvas->getWidth();
- h = canvas->getHeight();
- x = hScrollbar->getPos();
- y = vScrollbar->getPos();
- if (moveLeft && selectXMin < x) {
- x = selectXMin;
- needScroll = gTrue;
- } else if (moveRight && selectXMax >= x + w) {
- x = selectXMax - w;
- needScroll = gTrue;
- } else if (moveLeft && selectXMin >= x + w) {
- x = selectXMin - w;
- needScroll = gTrue;
- } else if (moveRight && selectXMax < x) {
- x = selectXMax;
- needScroll = gTrue;
- }
- if (moveTop && selectYMin < y) {
- y = selectYMin;
- needScroll = gTrue;
- } else if (moveBottom && selectYMax >= y + h) {
- y = selectYMax - h;
- needScroll = gTrue;
- } else if (moveTop && selectYMin >= y + h) {
- y = selectYMin - h;
- needScroll = gTrue;
- } else if (moveBottom && selectYMax < y) {
- y = selectYMax;
- needScroll = gTrue;