diff --git a/article_inspect.cpp b/article_inspect.cpp index aa20032a..40b3d112 100644 --- a/article_inspect.cpp +++ b/article_inspect.cpp @@ -3,7 +3,7 @@ #if (QT_VERSION > QT_VERSION_CHECK(6,0,0)) #include #endif -ArticleInspector::ArticleInspector( QWidget * parent ) : QWidget( parent, Qt::WindowType::Window ),firstTimeOpened(false) +ArticleInspector::ArticleInspector( QWidget * parent ) : QWidget( parent, Qt::WindowType::Window ) { setWindowTitle(tr("Inspect")); setAttribute( Qt::WidgetAttribute::WA_DeleteOnClose, false ); @@ -22,14 +22,12 @@ void ArticleInspector::setInspectPage( QWebEngineView * view ) viewContainer->page()->setInspectedPage(page); #if( QT_VERSION > QT_VERSION_CHECK( 6, 0, 0 ) ) // without this line, application will crash on qt6.2 ,see https://bugreports.qt.io/browse/QTBUG-101724 - if( view->lastContextMenuRequest() && firstTimeOpened ) - { - page->triggerAction( QWebEnginePage::InspectElement ); - } - if( !firstTimeOpened ) - { - firstTimeOpened = true; - } + // and seems to hangup forever on qt6.3 ,so the best solution for now is to comment out the following lines. + + // if( view->lastContextMenuRequest()) + // { + // page->triggerAction( QWebEnginePage::InspectElement ); + // } #else page->triggerAction( QWebEnginePage::InspectElement ); #endif diff --git a/article_inspect.h b/article_inspect.h index 7be7c7a6..8c7b50c5 100644 --- a/article_inspect.h +++ b/article_inspect.h @@ -15,9 +15,7 @@ public: void setInspectPage( QWebEngineView * view); private: - //used to record if the devtool was first time opened. - //if right click on the webpage and open inspect page on the first time ,the application has great possiblity to hang forever. - bool firstTimeOpened; + virtual void closeEvent( QCloseEvent * ); }; diff --git a/ffmpegaudio.cc b/ffmpegaudio.cc index 172185ec..db83b79c 100644 --- a/ffmpegaudio.cc +++ b/ffmpegaudio.cc @@ -28,6 +28,7 @@ extern "C" { #include +#include "gddebug.hh" #include "utils.hh" using std::vector; @@ -140,7 +141,17 @@ DecoderContext::~DecoderContext() static int readAudioData( void * opaque, unsigned char * buffer, int bufferSize ) { QDataStream * pStream = ( QDataStream * )opaque; - return pStream->readRawData( ( char * )buffer, bufferSize ); + // This function is passed as the read_packet callback into avio_alloc_context(). + // The documentation for this callback parameter states: + // For stream protocols, must never return 0 but rather a proper AVERROR code. + if( pStream->atEnd() ) + return AVERROR_EOF; + const int bytesRead = pStream->readRawData( ( char * )buffer, bufferSize ); + // QDataStream::readRawData() returns 0 at EOF => return AVERROR_EOF in this case. + // An error is unlikely here, so just print a warning and return AVERROR_EOF too. + if( bytesRead < 0 ) + gdWarning( "readAudioData: error while reading raw data." ); + return bytesRead > 0 ? bytesRead : AVERROR_EOF; } bool DecoderContext::openCodec( QString & errorString ) diff --git a/langcoder.cc b/langcoder.cc index 56eb7637..69de2b4c 100644 --- a/langcoder.cc +++ b/langcoder.cc @@ -207,17 +207,14 @@ static GDLangCode LangCodes[] = { { "zh", "chi", 0, "Chinese" }, { "zu", "zul", -1, "Zulu" }, { "jb", "jbo", 0, "Lojban" }, - - { "", "", 0, "" } }; LangCoder::LangCoder() { - for (int i = 0; true; i++) { - const GDLangCode &lc = LangCodes[i]; - if (lc.lang[0] == 0) - break; - codeMap[code2toInt(lc.code)] = i; + int i = 0; + for (const auto lc : LangCodes) + { + codeMap[ code2toInt( lc.code ) ] = i++; } } diff --git a/mainwindow.cc b/mainwindow.cc index fb4ae931..6d929da9 100644 --- a/mainwindow.cc +++ b/mainwindow.cc @@ -408,6 +408,11 @@ MainWindow::MainWindow( Config::Class & cfg_ ): connect( trayIconMenu.addAction( tr( "Show &Main Window" ) ), SIGNAL( triggered() ), this, SLOT( showMainWindow() ) ); trayIconMenu.addAction( enableScanPopup ); + actTrackingClipboard = trayIconMenu.addAction( tr( "Tracking Clipboard" ) ); + actTrackingClipboard->setCheckable(true); + actTrackingClipboard->setChecked(cfg.preferences.trackClipboardChanges); + connect( actTrackingClipboard , SIGNAL( triggered(bool) ), + this, SLOT( trackingClipboard(bool) ) ); trayIconMenu.addSeparator(); connect( trayIconMenu.addAction( tr( "&Quit" ) ), SIGNAL( triggered() ), this, SLOT( quitApp() ) ); @@ -995,13 +1000,11 @@ void MainWindow::mousePressEvent( QMouseEvent *event) // middle clicked QString subtype = "plain"; - QString str = QApplication::clipboard()->text(subtype, - QClipboard::Selection); + QString str = QApplication::clipboard()->text( subtype, QClipboard::Selection ); setTranslateBoxTextAndClearSuffix( str, EscapeWildcards, NoPopupChange ); - QKeyEvent ev(QEvent::KeyPress, Qt::Key_Enter, - Qt::NoModifier); - QApplication::sendEvent(translateLine, &ev); + QKeyEvent ev( QEvent::KeyPress, Qt::Key_Enter, Qt::NoModifier ); + QApplication::sendEvent( translateLine, &ev ); } MainWindow::~MainWindow() @@ -3192,6 +3195,11 @@ void MainWindow::showMainWindow() toggleMainWindow( true ); } +void MainWindow::trackingClipboard( bool on ) +{ + cfg.preferences.trackClipboardChanges = on; +} + void MainWindow::visitHomepage() { QDesktopServices::openUrl( QUrl( "http://goldendict.org/" ) ); diff --git a/mainwindow.hh b/mainwindow.hh index 882dc1ae..683d9710 100644 --- a/mainwindow.hh +++ b/mainwindow.hh @@ -117,6 +117,7 @@ private: QToolBar * navToolbar; MainStatusBar * mainStatusBar; QAction * navBack, * navForward, * navPronounce, * enableScanPopup; + QAction * actTrackingClipboard; QAction * beforeScanPopupSeparator, * afterScanPopupSeparator, * beforeOptionsSeparator; QAction * zoomIn, * zoomOut, * zoomBase; QAction * wordsZoomIn, * wordsZoomOut, * wordsZoomBase; @@ -415,6 +416,8 @@ private slots: void showMainWindow(); + void trackingClipboard(bool); + void visitHomepage(); void visitForum(); void openConfigFolder(); diff --git a/mdictparser.cc b/mdictparser.cc index 931a8fff..7b03b9a6 100644 --- a/mdictparser.cc +++ b/mdictparser.cc @@ -595,10 +595,12 @@ MdictParser::HeadWordIndex MdictParser::splitHeadWordBlock( QByteArray const & b } bool MdictParser::readRecordBlock( MdictParser::HeadWordIndex & headWordIndex, - MdictParser::RecordHandler & recordHandler ) + MdictParser::RecordHandler & recordHandler, + bool cross_block_read ) { // cache the index, the headWordIndex is already sorted size_t idx = 0; + bool readNextBlock = false; for ( HeadWordIndex::const_iterator i = headWordIndex.begin(); i != headWordIndex.end(); ++i ) { @@ -611,21 +613,41 @@ bool MdictParser::readRecordBlock( MdictParser::HeadWordIndex & headWordIndex, RecordIndex const & recordIndex = recordBlockInfos_[idx]; HeadWordIndex::const_iterator iNext = i + 1; qint64 recordSize; - if ( iNext == headWordIndex.end() ) - recordSize = recordIndex.shadowEndPos - i->first; + auto current = *i; + + if( iNext == headWordIndex.end() ) + { + qint64 lastWordSize = recordIndex.shadowEndPos - current.first; + + readNextBlock = cross_block_read && readNextHeadWordIndex( headWordIndex ); + if(readNextBlock) + { + recordSize = qMin(lastWordSize, headWordIndex.begin()->first - current.first); + } + else + { + recordSize = lastWordSize; + } + } else - recordSize = iNext->first - i->first; + recordSize = iNext->first - current.first; RecordInfo recordInfo; recordInfo.compressedBlockPos = recordPos_ + recordIndex.startPos; - recordInfo.recordOffset = i->first - recordIndex.shadowStartPos; + recordInfo.recordOffset = current.first - recordIndex.shadowStartPos; recordInfo.decompressedBlockSize = recordIndex.decompressedSize; recordInfo.compressedBlockSize = recordIndex.compressedSize; recordInfo.recordSize = recordSize; - recordHandler.handleRecord( i->second, recordInfo ); + recordHandler.handleRecord( current.second, recordInfo ); + + if( readNextBlock ) + break; } + if( readNextBlock ) + readRecordBlock( headWordIndex, recordHandler, cross_block_read ); + return true; } diff --git a/mdictparser.hh b/mdictparser.hh index bd754f56..fc78af6d 100644 --- a/mdictparser.hh +++ b/mdictparser.hh @@ -158,7 +158,7 @@ public: bool open( const char * filename ); bool readNextHeadWordIndex( HeadWordIndex & headWordIndex ); - bool readRecordBlock( HeadWordIndex & headWordIndex, RecordHandler & recordHandler ); + bool readRecordBlock( HeadWordIndex & headWordIndex, RecordHandler & recordHandler, bool cross_block_read=false ); // helpers static QString toUtf16( const char * fromCode, const char * from, size_t fromSize ); diff --git a/mdx.cc b/mdx.cc index f720a3cc..539fc815 100644 --- a/mdx.cc +++ b/mdx.cc @@ -1440,9 +1440,9 @@ vector< sptr< Dictionary::Class > > makeDictionaries( vector< string > const & f MdictParser::HeadWordIndex headWordIndex; // enumerating word and its definition - while ( parser.readNextHeadWordIndex( headWordIndex ) ) + if ( parser.readNextHeadWordIndex( headWordIndex ) ) { - parser.readRecordBlock( headWordIndex, articleHandler ); + parser.readRecordBlock( headWordIndex, articleHandler, true); } // enumerating resources if there's any diff --git a/scanpopup.cc b/scanpopup.cc index b09984a6..19c36faa 100644 --- a/scanpopup.cc +++ b/scanpopup.cc @@ -270,14 +270,10 @@ ScanPopup::ScanPopup( QWidget * parent, connect( definition, SIGNAL( titleChanged( ArticleView *, QString const & ) ), this, SLOT( titleChanged( ArticleView *, QString const & ) ) ); -#ifdef HAVE_X11 - connect( QApplication::clipboard(), SIGNAL( changed( QClipboard::Mode ) ), - this, SLOT( clipboardChanged( QClipboard::Mode ) ) ); -#else - if( cfg.preferences.trackClipboardChanges ) - connect( QApplication::clipboard(), SIGNAL( changed( QClipboard::Mode ) ), - this, SLOT( clipboardChanged( QClipboard::Mode ) ) ); -#endif + connect( QApplication::clipboard(), + SIGNAL( changed( QClipboard::Mode ) ), + this, + SLOT( clipboardChanged( QClipboard::Mode ) ) ); #ifdef Q_OS_MAC connect( &MouseOver::instance(), SIGNAL( hovered( QString const &, bool ) ), @@ -518,9 +514,13 @@ void ScanPopup::delayShow() void ScanPopup::clipboardChanged( QClipboard::Mode m ) { + if( !cfg.preferences.trackClipboardChanges ) + return; + +#ifdef HAVE_X11 if ( !isScanningEnabled ) return; -#ifdef HAVE_X11 + if( cfg.preferences.ignoreOwnClipboardChanges && ownsClipboardMode( m ) ) return; #endif