📄 qpdf.cpp
字号:
#include <qwindowsystem_qws.h>#include <qgfx_qws.h>#include <qapplication.h>#include <qwidgetstack.h>#include <qtimer.h>#include <qfileinfo.h>#include <qstring.h>#include <qthread.h>#include <qlayout.h>#include <qlabel.h>#include <stdlib.h>#include <qtextcodec.h>#include <poppler/poppler-qt.h>#include <qpushbutton.h>#include <linux/fb.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/ioctl.h>#include <unistd.h>#include <errno.h>#include <archos/screen.h>#include <archos/atr.h>#include "qpdf.h"#include "gotopage.h"#include "general/sidemenu.h"#include "general/style.h"#include "general/spinbar.h"#include "general/fontchooser.h"using namespace Poppler;using namespace archos;#define HIDE_ENTRY 0#define HOME_ENTRY 1#define ZIN_ENTRY 2#define ZOUT_ENTRY 3#define LBACK_ENTRY 4#define GOTOPAGE_ENTRY 5#define NPAGE_ENTRY 6#define PPAGE_ENTRY 7static const char *tr_path = "/tmp/pdf.trex";int main ( int argc, char **argv ) { QApplication app(argc, argv); QWSServer::setDesktopBackground(QColor(123, 123, 123)); // gray if (atr_load(tr_path) ) { qWarning("failed to load translations!\n"); return 1; } qApp->setFont(FontChooser::getFont()); QStringList args; for (int i = 1; i < argc; i++) { args.append(QString::fromUtf8(argv[i])); } QStringList file_arg = args.grep("-file=", 1); if (file_arg.count() != 1) { return -1; } QString file(file_arg[0].remove(0, 6)); int time12 = 0; if (args.contains("-time=12h") ) { time12 = 1; } int cancelSetZoom = 0; if ( args.contains("-cancelSetZoom") ) { cancelSetZoom = 1; } QPdfDlg *dlg = new QPdfDlg(time12, cancelSetZoom); app.setMainWidget(dlg); dlg->showMaximized(); dlg->toggleVideo(); // adjust fb4 to the current setting of fb0 dlg->openFile(file); return app.exec();}QPdfDlg::QPdfDlg(int time12, int cancelSetZoom) : QWidget(NULL, "mainwidget", QWidget::WStyle_Customize | QWidget::WStyle_NoBorder) , m_docLoaded(false) , m_pages(0) , m_doc(0) , m_time12Flag(time12) , m_cancelSetZoom(cancelSetZoom){#ifndef SIM avossocket = archos::AvosSocket::getInstance(); if ( avossocket->start() ) { qWarning("failed to setup the avossocket"); qApp->quit(); } connect(avossocket, SIGNAL(packetReady(extapp_msg_t*)), this, SLOT(handleMsg(extapp_msg_t*))); QTimer *timer = new QTimer( this ); connect( timer, SIGNAL(timeout()), this, SLOT(timerDone()) ); timer->start( 2000, TRUE ); if ( avossocket ) { extapp_msg_t msg = { { EXTAPP_MAGIC, EXTAPP_PACKET_REQUEST_BATTERY_STATUS, 0 }, NULL }; avossocket->sendMsg( &msg ); }#endif m_mode = Screen::mode(); QLayout *l = new QVBoxLayout(this, 0, 0); pdfWidget = new PDFWidget(0, this, "pdfWidget", false); l->add(pdfWidget); createSpinbar(); spinbar->hide(); createGotoPage(); gotoPage->hide(); createMenu(); sideMenu->hide(); qApp->installEventFilter(this); connect(pdfWidget, SIGNAL(rendererRunning(bool)), this, SLOT(rendererRunning(bool))); connect(pdfWidget, SIGNAL(isLastPage(bool)), this, SLOT(isLastPage(bool))); connect(pdfWidget, SIGNAL(isFirstPage(bool)), this, SLOT(isFirstPage(bool))); connect(pdfWidget, SIGNAL(zoomChanged()), this, SLOT(zoomChanged())); connect(pdfWidget, SIGNAL(pagesInHistory(bool)), this, SLOT(pagesInHistory(bool)));}QPdfDlg::~QPdfDlg(){ delete m_doc; delete sideMenu; delete spinbar; delete gotoPage;}void QPdfDlg::reloadLanguage(char* lang){ if ( lang && strlen(lang) > 2 ) { setenv("LANG", lang, 1); setenv("LC_ALL", lang, 1); qWarning("locale changed to '%s'", lang); atr_unload(); if (atr_load(tr_path) ) { qWarning("failed to load translations!\n"); } qApp->setFont(FontChooser::getFont(lang)); restartGui(); }}void QPdfDlg::handleMsg(extapp_msg_t* msg){ extapp_msg_timeformat_t t; switch ( msg->header.packet_type ) { case EXTAPP_PACKET_LANG_CHANGED: reloadLanguage((char*)msg->data); break; case EXTAPP_PACKET_BATTERY_STATUS: qWarning("** New battery status 0x%x\n", *((int*)msg->data)); emit signalBatteryLevel( *((int*) msg->data) ); break; case EXTAPP_PACKET_TIMEFORMAT_CHANGED: qWarning("** New timeformat 0x%x\n", *((int*)msg->data)); t = *(extapp_msg_timeformat_t*)msg->data; emit updateTime12(t == time24 ? 0 : 1 ); break; case EXTAPP_PACKET_TERMINATE: qWarning("shutting down..."); qApp->quit(); break; default: qWarning("apdf: unkown message (%x).\n", msg->header.packet_type); break; } avossocket->freeMsg(msg);}bool QPdfDlg::eventFilter(QObject *target, QEvent *event){ if (gotoPage->isVisible() && target == pdfWidget->viewport() && event->type() == QEvent::MouseButtonPress) { gotoPage->hide(); sideMenu->show(); pdfWidget->jumpToPage(gotoPage->selectedPage() - 1); } else if (target == pdfWidget->viewport() && event->type() == QEvent::MouseButtonPress) { sideMenu->hideLabels(); } else if (target == pdfWidget->viewport() && (event->type() == QEvent::MouseMove || event->type() == QEvent::MouseButtonRelease)) { sideMenu->strobeHideTimer(); } else if ((event->type() == QEvent::KeyRelease || ( event->type() == QEvent::KeyPress && ((QKeyEvent*)event)->isAutoRepeat())) && ((QKeyEvent*)event)->key() == Key_F6) { toggleVideo(); return true; } return QWidget::eventFilter(target, event);}void QPdfDlg::timerDone(void){ extapp_msg_t msg = { { EXTAPP_MAGIC, EXTAPP_PACKET_STARTUP_READY, 0 }, NULL }; avossocket->sendMsg(&msg);}bool QPdfDlg::event(QEvent* e){ static int last_key = -1; static int press_rep_factor = 1; bool handled = false; if (pdfWidget && pdfWidget->isVisible()) { if (e->type() == QEvent::KeyRelease || (e->type() == QEvent::KeyPress && ((QKeyEvent*)e)->isAutoRepeat()) ) { QKeyEvent* keyEvent = (QKeyEvent*)e; sideMenu->strobeHideTimer(); // till the docLoader hasn't finished ESC is the only input if (!m_docLoaded) { if (keyEvent->key() == Key_F2) { close(); handled = true; } } else { // if the user keeps one of the direction keys pressed // increase the scrolling speed. int rep_factor = 1; if ( e->type() == QEvent::KeyPress ) { if ( last_key == -1 ) { last_key = keyEvent->key(); } else { if ( last_key == keyEvent->key() ) { press_rep_factor = press_rep_factor + 1 <= 3 ? press_rep_factor + 1 : 3; } else { last_key = -1; press_rep_factor = 1; } } rep_factor = press_rep_factor; } else { last_key = -1; press_rep_factor = 1; } switch (keyEvent->key()) { case Key_Up: pdfWidget->scrollUp(rep_factor); handled = true; break; case Key_Down: pdfWidget->scrollDown(rep_factor); handled = true; break; case Key_Left: pdfWidget->scrollLeft(rep_factor); handled = true; break; case Key_Right: pdfWidget->scrollRight(rep_factor); handled = true; break; case Key_Return: pdfWidget->followLink(); handled = true; break; case Key_PageUp: pdfWidget->prevPage(); handled = true; break; case Key_PageDown: pdfWidget->nextPage(); handled = true; break; case Key_F1: // having an autorepeat on the menu key is cumbersome. if (!keyEvent->isAutoRepeat()) { sideMenu->showMenuAndLabels(); handled = true; } break; case Key_F2: if (pdfWidget->zoomIsDefault()) { close(); } else { pdfWidget->setFitToWidth(); } handled = true; break;#ifdef SIM// // spinbar debugging case Key_F11: spinbar->setText("test123"); spinbar->start(); spinbar->show(); break; case Key_F12: spinbar->hide(); spinbar->stop(); break;#endif default: qWarning("unknown key %x\n", keyEvent->key()); break; } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -