📄 xpdfviewer.cc
字号:
}void XPDFViewer::reloadFile() { int pg; if (!core->getDoc()) { return; } pg = core->getPageNum(); loadFile(core->getDoc()->getFileName()); if (pg > core->getDoc()->getNumPages()) { pg = core->getDoc()->getNumPages(); } displayPage(pg, core->getZoom(), core->getRotate(), gFalse, gFalse);}void XPDFViewer::displayPage(int pageA, double zoomA, int rotateA, GBool scrollToTop, GBool addToHist) { core->displayPage(pageA, zoomA, rotateA, scrollToTop, addToHist);}void XPDFViewer::displayDest(LinkDest *dest, double zoomA, int rotateA, GBool addToHist) { core->displayDest(dest, zoomA, rotateA, addToHist);}void XPDFViewer::getPageAndDest(int pageA, GString *destName, int *pageOut, LinkDest **destOut) { Ref pageRef; // find the page number for a named destination *pageOut = pageA; *destOut = NULL; if (destName && (*destOut = core->getDoc()->findDest(destName))) { if ((*destOut)->isPageRef()) { pageRef = (*destOut)->getPageRef(); *pageOut = core->getDoc()->findPage(pageRef.num, pageRef.gen); } else { *pageOut = (*destOut)->getPageNum(); } } if (*pageOut <= 0) { *pageOut = 1; } if (*pageOut > core->getDoc()->getNumPages()) { *pageOut = core->getDoc()->getNumPages(); }}//------------------------------------------------------------------------// hyperlinks / actions//------------------------------------------------------------------------void XPDFViewer::doLink(int wx, int wy, GBool onlyIfNoSelection, GBool newWin) { XPDFViewer *newViewer; LinkAction *action; int pg, selPg; double xu, yu, selULX, selULY, selLRX, selLRY; if (core->getHyperlinksEnabled() && core->cvtWindowToUser(wx, wy, &pg, &xu, &yu) && !(onlyIfNoSelection && core->getSelection(&selPg, &selULX, &selULY, &selLRX, &selLRY))) { if ((action = core->findLink(pg, xu, yu))) { if (newWin && core->getDoc()->getFileName() && (action->getKind() == actionGoTo || action->getKind() == actionGoToR || (action->getKind() == actionNamed && ((LinkNamed *)action)->getName()->cmp("Quit")))) { newViewer = app->open(core->getDoc()->getFileName()); newViewer->core->doAction(action); } else { core->doAction(action); } } }}void XPDFViewer::actionCbk(void *data, char *action) { XPDFViewer *viewer = (XPDFViewer *)data; if (!strcmp(action, "Quit")) { viewer->app->quit(); }}//------------------------------------------------------------------------// keyboard/mouse input//------------------------------------------------------------------------void XPDFViewer::keyPressCbk(void *data, KeySym key, Guint modifiers, XEvent *event) { XPDFViewer *viewer = (XPDFViewer *)data; int keyCode; GList *cmds; int i; if (key >= 0x20 && key <= 0xfe) { keyCode = (int)key; } else if (key == XK_Tab || key == XK_KP_Tab) { keyCode = xpdfKeyCodeTab; } else if (key == XK_Return) { keyCode = xpdfKeyCodeReturn; } else if (key == XK_KP_Enter) { keyCode = xpdfKeyCodeEnter; } else if (key == XK_BackSpace) { keyCode = xpdfKeyCodeBackspace; } else if (key == XK_Insert || key == XK_KP_Insert) { keyCode = xpdfKeyCodeInsert; } else if (key == XK_Delete || key == XK_KP_Delete) { keyCode = xpdfKeyCodeDelete; } else if (key == XK_Home || key == XK_KP_Home) { keyCode = xpdfKeyCodeHome; } else if (key == XK_End || key == XK_KP_End) { keyCode = xpdfKeyCodeEnd; } else if (key == XK_Page_Up || key == XK_KP_Page_Up) { keyCode = xpdfKeyCodePgUp; } else if (key == XK_Page_Down || key == XK_KP_Page_Down) { keyCode = xpdfKeyCodePgDn; } else if (key == XK_Left || key == XK_KP_Left) { keyCode = xpdfKeyCodeLeft; } else if (key == XK_Right || key == XK_KP_Right) { keyCode = xpdfKeyCodeRight; } else if (key == XK_Up || key == XK_KP_Up) { keyCode = xpdfKeyCodeUp; } else if (key == XK_Down || key == XK_KP_Down) { keyCode = xpdfKeyCodeDown; } else if (key >= XK_F1 && key <= XK_F35) { keyCode = xpdfKeyCodeF1 + (key - XK_F1); } else { return; } if ((cmds = globalParams->getKeyBinding(keyCode, viewer->getModifiers(modifiers), viewer->getContext(modifiers)))) { for (i = 0; i < cmds->getLength(); ++i) { viewer->execCmd((GString *)cmds->get(i), event); } deleteGList(cmds, GString); }}void XPDFViewer::mouseCbk(void *data, XEvent *event) { XPDFViewer *viewer = (XPDFViewer *)data; int keyCode; GList *cmds; int i; if (event->type == ButtonPress) { if (event->xbutton.button >= 1 && event->xbutton.button <= 7) { keyCode = xpdfKeyCodeMousePress1 + event->xbutton.button - 1; } else { return; } } else if (event->type == ButtonRelease) { if (event->xbutton.button >= 1 && event->xbutton.button <= 7) { keyCode = xpdfKeyCodeMouseRelease1 + event->xbutton.button - 1; } else { return; } } else { return; } if ((cmds = globalParams->getKeyBinding(keyCode, viewer->getModifiers( event->xkey.state), viewer->getContext( event->xkey.state)))) { for (i = 0; i < cmds->getLength(); ++i) { viewer->execCmd((GString *)cmds->get(i), event); } deleteGList(cmds, GString); }}int XPDFViewer::getModifiers(Guint modifiers) { int mods; mods = 0; if (modifiers & ShiftMask) { mods |= xpdfKeyModShift; } if (modifiers & ControlMask) { mods |= xpdfKeyModCtrl; } if (modifiers & Mod1Mask) { mods |= xpdfKeyModAlt; } return mods;}int XPDFViewer::getContext(Guint modifiers) { int context; context = (core->getFullScreen() ? xpdfKeyContextFullScreen : xpdfKeyContextWindow) | (core->getContinuousMode() ? xpdfKeyContextContinuous : xpdfKeyContextSinglePage) | (core->getLinkAction() ? xpdfKeyContextOverLink : xpdfKeyContextOffLink) | ((modifiers & Mod5Mask) ? xpdfKeyContextScrLockOn : xpdfKeyContextScrLockOff); return context;}void XPDFViewer::execCmd(GString *cmd, XEvent *event) { GString *name; GString *args[cmdMaxArgs]; char *p0, *p1; int nArgs, i; int a, b, m, cmp; //----- parse the command name = NULL; nArgs = 0; for (i = 0; i < cmdMaxArgs; ++i) { args[i] = NULL; } p0 = cmd->getCString(); for (p1 = p0; *p1 && isalnum(*p1); ++p1) ; if (p1 == p0) { goto err1; } name = new GString(p0, p1 - p0); if (*p1 == '(') { while (nArgs < cmdMaxArgs) { p0 = p1 + 1; for (p1 = p0; *p1 && *p1 != ',' && *p1 != ')'; ++p1) ; args[nArgs++] = new GString(p0, p1 - p0); if (*p1 != ',') { break; } } if (*p1 != ')') { goto err1; } ++p1; } if (*p1) { goto err1; } //----- find the command a = -1; b = nCmds; // invariant: cmdTab[a].name < name < cmdTab[b].name while (b - a > 1) { m = (a + b) / 2; cmp = strcmp(cmdTab[m].name, name->getCString()); if (cmp < 0) { a = m; } else if (cmp > 0) { b = m; } else { a = b = m; } } if (cmp != 0) { goto err1; } //----- execute the command if (nArgs != cmdTab[a].nArgs || (cmdTab[a].requiresEvent && !event)) { goto err1; } if (cmdTab[a].requiresDoc && !core->getDoc()) { // don't issue an error message for this -- it happens, e.g., when // clicking in a window with no open PDF file goto err2; } (this->*cmdTab[a].func)(args, nArgs, event); //----- clean up delete name; for (i = 0; i < nArgs; ++i) { if (args[i]) { delete args[i]; } } return; err1: error(-1, "Invalid command syntax: '%s'", cmd->getCString()); err2: if (name) { delete name; } for (i = 0; i < nArgs; ++i) { if (args[i]) { delete args[i]; } }}//------------------------------------------------------------------------// command functions//------------------------------------------------------------------------static int mouseX(XEvent *event) { switch (event->type) { case ButtonPress: case ButtonRelease: return event->xbutton.x; case KeyPress: return event->xkey.x; } return 0;}static int mouseY(XEvent *event) { switch (event->type) { case ButtonPress: case ButtonRelease: return event->xbutton.y; case KeyPress: return event->xkey.y; } return 0;}void XPDFViewer::cmdAbout(GString *args[], int nArgs, XEvent *event) { XtManageChild(aboutDialog);}void XPDFViewer::cmdCloseOutline(GString *args[], int nArgs, XEvent *event) {#ifndef DISABLE_OUTLINE Dimension w; if (outlineScroll == None) { return; } XtVaGetValues(outlineScroll, XmNwidth, &w, NULL); if (w > 1) { outlinePaneWidth = w; // this ugly kludge is apparently the only way to resize the panes // within an XmPanedWindow XtVaSetValues(outlineScroll, XmNpaneMinimum, 1, XmNpaneMaximum, 1, NULL); XtVaSetValues(outlineScroll, XmNpaneMinimum, 1, XmNpaneMaximum, 10000, NULL); }#endif}void XPDFViewer::cmdCloseWindow(GString *args[], int nArgs, XEvent *event) { app->close(this, gFalse);}void XPDFViewer::cmdContinuousMode(GString *args[], int nArgs, XEvent *event) { Widget btn; if (core->getContinuousMode()) { return; } core->setContinuousMode(gTrue); btn = XtNameToWidget(popupMenu, "continuousMode"); XtVaSetValues(btn, XmNset, XmSET, NULL);}void XPDFViewer::cmdEndPan(GString *args[], int nArgs, XEvent *event) { core->endPan(mouseX(event), mouseY(event));}void XPDFViewer::cmdEndSelection(GString *args[], int nArgs, XEvent *event) { core->endSelection(mouseX(event), mouseY(event));}void XPDFViewer::cmdFind(GString *args[], int nArgs, XEvent *event) { mapFindDialog();}void XPDFViewer::cmdFindNext(GString *args[], int nArgs, XEvent *event) { doFind(gTrue);}void XPDFViewer::cmdFocusToDocWin(GString *args[], int nArgs, XEvent *event) { core->takeFocus();}void XPDFViewer::cmdFocusToPageNum(GString *args[], int nArgs, XEvent *event) { XmTextFieldSetSelection(pageNumText, 0, strlen(XmTextFieldGetString(pageNumText)), XtLastTimestampProcessed(display)); XmProcessTraversal(pageNumText, XmTRAVERSE_CURRENT);}void XPDFViewer::cmdFollowLink(GString *args[], int nArgs, XEvent *event) { doLink(mouseX(event), mouseY(event), gFalse, gFalse);}void XPDFViewer::cmdFollowLinkInNewWin(GString *args[], int nArgs, XEvent *event) { doLink(mouseX(event), mouseY(event), gFalse, gTrue);}void XPDFViewer::cmdFollowLinkInNewWinNoSel(GString *args[], int nArgs, XEvent *event) { doLink(mouseX(event), mouseY(event), gTrue, gTrue);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -