vcl/inc/printdlg.hxx | 12 ++- vcl/source/window/printdlg.cxx | 153 +++++++++++++++++++---------------------- 2 files changed, 83 insertions(+), 82 deletions(-)
New commits: commit 25fa5e4f3565fdf80f269575f4f4df5a787b1cb6 Author: Mike Kaganski <[email protected]> AuthorDate: Fri Feb 20 11:46:19 2026 +0500 Commit: Mike Kaganski <[email protected]> CommitDate: Fri Feb 20 09:42:26 2026 +0100 Avoid duplicate preview timers The only difference between them was disabled cache in one of them. Instead of having two timers (and potentially having them both fire and flicker), use a bool flag to disable cache once (reset when the timer fires). If some event starts the timer several times in different functions, the most strict setting will be used for "use cache" ("disable" has priority) in the single eventual invocation. Change-Id: I21ad6513d3d635cc915b89506e931d0eb6a71d3f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199780 Tested-by: Jenkins Reviewed-by: Mike Kaganski <[email protected]> diff --git a/vcl/inc/printdlg.hxx b/vcl/inc/printdlg.hxx index c82139287a91..74937440318c 100644 --- a/vcl/inc/printdlg.hxx +++ b/vcl/inc/printdlg.hxx @@ -201,13 +201,13 @@ namespace vcl Size maFirstPageSize; bool mbShowLayoutFrame; + // cache is allowed, unless explicitly disabled for this update + bool mbUseCacheForPreview = true; Paper mePaper; Idle maUpdatePreviewIdle; DECL_LINK(updatePreviewIdle, Timer*, void); - Idle maUpdatePreviewNoCacheIdle; - DECL_LINK(updatePreviewNoCacheIdle, Timer*, void); DECL_LINK(ClickOKCancelHdl, weld::Button&, void); DECL_LINK(ClickForwardHdl, weld::Button&, void); @@ -242,6 +242,7 @@ namespace vcl void ImplDestroy(); void preparePreview( bool i_bMayUseCache ); + void schedulePreviewUpdate(bool i_bMayUseCache); void setupPaperSidesBox(); void storeToSettings(); void readFromSettings(); diff --git a/vcl/source/window/printdlg.cxx b/vcl/source/window/printdlg.cxx index da8c7c0559f6..5c461ddd59d9 100644 --- a/vcl/source/window/printdlg.cxx +++ b/vcl/source/window/printdlg.cxx @@ -584,7 +584,6 @@ PrintDialog::PrintDialog(weld::Window* i_pWindow, std::shared_ptr<PrinterControl , mnCachedPages( 0 ) , mbShowLayoutFrame( true ) , maUpdatePreviewIdle("Print Dialog Update Preview Idle") - , maUpdatePreviewNoCacheIdle("Print Dialog Update Preview (no cache) Idle") { // save printbutton text, gets exchanged occasionally with print to file maPrintText = mxOKButton->get_label(); @@ -652,8 +651,6 @@ PrintDialog::PrintDialog(weld::Window* i_pWindow, std::shared_ptr<PrinterControl maUpdatePreviewIdle.SetPriority(TaskPriority::POST_PAINT); maUpdatePreviewIdle.SetInvokeHandler(LINK( this, PrintDialog, updatePreviewIdle)); - maUpdatePreviewNoCacheIdle.SetPriority(TaskPriority::POST_PAINT); - maUpdatePreviewNoCacheIdle.SetInvokeHandler(LINK(this, PrintDialog, updatePreviewNoCacheIdle)); initFromMultiPageSetup( maPController->getMultipage() ); @@ -910,14 +907,17 @@ void PrintDialog::setPreviewText() mxNumPagesText->set_label( aNewText ); } -IMPL_LINK_NOARG(PrintDialog, updatePreviewIdle, Timer*, void) +void PrintDialog::schedulePreviewUpdate(bool i_bMayUseCache) { - preparePreview(true); + if (!i_bMayUseCache) + mbUseCacheForPreview = false; // Disable cache once + maUpdatePreviewIdle.Start(); } -IMPL_LINK_NOARG(PrintDialog, updatePreviewNoCacheIdle, Timer*, void) +IMPL_LINK_NOARG(PrintDialog, updatePreviewIdle, Timer*, void) { - preparePreview(false); + // cache is allowed, unless explicitly disabled for this update + preparePreview(std::exchange(mbUseCacheForPreview, true)); } void PrintDialog::preparePreview( bool i_bMayUseCache ) @@ -1205,10 +1205,7 @@ void PrintDialog::updateNup( bool i_bMayUseCache ) mxNupOrder->setValues( aMPS.nOrder, nCols, nRows ); - if (i_bMayUseCache) - maUpdatePreviewIdle.Start(); - else - maUpdatePreviewNoCacheIdle.Start(); + schedulePreviewUpdate(i_bMayUseCache); } void PrintDialog::updateNupFromPages( bool i_bMayUseCache ) @@ -1846,7 +1843,7 @@ PropertyValue* PrintDialog::getValueForWindow( weld::Widget* i_pWindow ) const IMPL_LINK_NOARG(PrintDialog, TogglePreviewHdl, weld::Toggleable&, void) { - maUpdatePreviewIdle.Start(); + schedulePreviewUpdate(true); } IMPL_LINK_NOARG(PrintDialog, ToggleBorderHdl, weld::Toggleable&, void) @@ -1871,7 +1868,7 @@ IMPL_LINK_NOARG(PrintDialog, ToggleReverseOrderHdl, weld::Toggleable&, void) bool bChecked = mxReverseOrderBox->get_active(); maPController->setReversePrint(bChecked); maPController->setValue(u"PrintReverse"_ustr, Any(bChecked)); - maUpdatePreviewIdle.Start(); + schedulePreviewUpdate(true); } IMPL_LINK_NOARG(PrintDialog, ToggleBrochureHdl, weld::Toggleable&, void) @@ -1885,7 +1882,7 @@ IMPL_LINK_NOARG(PrintDialog, ToggleBrochureHdl, weld::Toggleable&, void) checkOptionalControlDependencies(); // update preview and page settings - maUpdatePreviewNoCacheIdle.Start(); + schedulePreviewUpdate(false); } if (mxBrochureBtn->get_active()) { @@ -1962,7 +1959,7 @@ IMPL_LINK_NOARG(PrintDialog, ClickSetupHdl, weld::Button&, void) setupPaperSidesBox(); // tdf#63905 don't use cache: page size may change - maUpdatePreviewNoCacheIdle.Start(); + schedulePreviewUpdate(false); checkControlDependencies(); } @@ -1985,7 +1982,7 @@ IMPL_LINK_NOARG( PrintDialog, SelectPrinterHdl, weld::ComboBox&, void ) updatePrinterText(); updateNup(false); setPaperSizes(); - maUpdatePreviewIdle.Start(); + schedulePreviewUpdate(true); } else // print to file { @@ -1996,7 +1993,7 @@ IMPL_LINK_NOARG( PrintDialog, SelectPrinterHdl, weld::ComboBox&, void ) setPaperSizes(); updateOrientationBox(); - maUpdatePreviewIdle.Start(); + schedulePreviewUpdate(true); } setupPaperSidesBox(); @@ -2056,7 +2053,7 @@ IMPL_LINK_NOARG(PrintDialog, SelectPaperSizeHdl, weld::ComboBox&, void) updatePageSize(mxOrientationBox->get_active()); - maUpdatePreviewNoCacheIdle.Start(); + schedulePreviewUpdate(false); } IMPL_LINK_NOARG(PrintDialog, MetricSpinModifyHdl, weld::MetricSpinButton&, void) @@ -2087,7 +2084,7 @@ IMPL_LINK_NOARG(PrintDialog, ActivateHdl, weld::Entry&, bool) if (nNewCurPage != mnCurPage) { mnCurPage = nNewCurPage; - maUpdatePreviewIdle.Start(); + schedulePreviewUpdate(true); } return true; } @@ -2121,7 +2118,7 @@ IMPL_LINK( PrintDialog, UIOption_CheckHdl, weld::Toggleable&, i_rBox, void ) checkOptionalControlDependencies(); // update preview and page settings - maUpdatePreviewNoCacheIdle.Start(); + schedulePreviewUpdate(false); } } @@ -2152,7 +2149,7 @@ IMPL_LINK( PrintDialog, UIOption_RadioHdl, weld::Toggleable&, i_rBtn, void ) mxPageRangeEdit->grab_focus(); // update preview and page settings - maUpdatePreviewNoCacheIdle.Start(); + schedulePreviewUpdate(false); } IMPL_LINK( PrintDialog, UIOption_SelectHdl, weld::ComboBox&, i_rBox, void ) @@ -2189,7 +2186,7 @@ IMPL_LINK( PrintDialog, UIOption_SelectHdl, weld::ComboBox&, i_rBox, void ) updatePageSize(mxOrientationBox->get_active()); // update preview and page settings - maUpdatePreviewNoCacheIdle.Start(); + schedulePreviewUpdate(false); } IMPL_LINK( PrintDialog, UIOption_SpinModifyHdl, weld::SpinButton&, i_rBox, void ) @@ -2205,7 +2202,7 @@ IMPL_LINK( PrintDialog, UIOption_SpinModifyHdl, weld::SpinButton&, i_rBox, void checkOptionalControlDependencies(); // update preview and page settings - maUpdatePreviewNoCacheIdle.Start(); + schedulePreviewUpdate(false); } } @@ -2222,7 +2219,7 @@ IMPL_LINK( PrintDialog, UIOption_EntryModifyHdl, weld::Entry&, i_rBox, void ) checkOptionalControlDependencies(); // update preview and page settings - maUpdatePreviewNoCacheIdle.Start(); + schedulePreviewUpdate(false); } } commit 0470118f7dbbcd21746fdcf66cf66e1ddd4d2a14 Author: Mike Kaganski <[email protected]> AuthorDate: Fri Feb 20 11:06:06 2026 +0500 Commit: Mike Kaganski <[email protected]> CommitDate: Fri Feb 20 09:42:19 2026 +0100 Split click handler function per control Similar to commit 2f28a17f01526f748859ad76bf73cb41fdfa7d6d (Split handler function per control, 2025-11-14). Change-Id: I07135823b3aa9f3b9346cf77280156b46e1df4fd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199779 Reviewed-by: Mike Kaganski <[email protected]> Tested-by: Jenkins diff --git a/vcl/inc/printdlg.hxx b/vcl/inc/printdlg.hxx index 2c352e1b992d..c82139287a91 100644 --- a/vcl/inc/printdlg.hxx +++ b/vcl/inc/printdlg.hxx @@ -209,7 +209,12 @@ namespace vcl Idle maUpdatePreviewNoCacheIdle; DECL_LINK(updatePreviewNoCacheIdle, Timer*, void); - DECL_LINK( ClickHdl, weld::Button&, void ); + DECL_LINK(ClickOKCancelHdl, weld::Button&, void); + DECL_LINK(ClickForwardHdl, weld::Button&, void); + DECL_LINK(ClickBackwardHdl, weld::Button&, void); + DECL_LINK(ClickFirstHdl, weld::Button&, void); + DECL_LINK(ClickLastHdl, weld::Button&, void); + DECL_LINK(ClickSetupHdl, weld::Button&, void); DECL_LINK(SelectPrinterHdl, weld::ComboBox&, void); DECL_LINK(SelectPaperSidesHdl, weld::ComboBox&, void); DECL_LINK(SelectOrientationHdl, weld::ComboBox&, void); diff --git a/vcl/source/window/printdlg.cxx b/vcl/source/window/printdlg.cxx index 69b83bed6a18..da8c7c0559f6 100644 --- a/vcl/source/window/printdlg.cxx +++ b/vcl/source/window/printdlg.cxx @@ -667,13 +667,13 @@ PrintDialog::PrintDialog(weld::Window* i_pWindow, std::shared_ptr<PrinterControl readFromSettings(); // setup click hdl - mxOKButton->connect_clicked(LINK(this, PrintDialog, ClickHdl)); - mxCancelButton->connect_clicked(LINK(this, PrintDialog, ClickHdl)); - mxSetupButton->connect_clicked( LINK( this, PrintDialog, ClickHdl ) ); - mxBackwardBtn->connect_clicked(LINK(this, PrintDialog, ClickHdl)); - mxForwardBtn->connect_clicked(LINK(this, PrintDialog, ClickHdl)); - mxFirstBtn->connect_clicked(LINK(this, PrintDialog, ClickHdl)); - mxLastBtn->connect_clicked( LINK( this, PrintDialog, ClickHdl ) ); + mxOKButton->connect_clicked(LINK(this, PrintDialog, ClickOKCancelHdl)); + mxCancelButton->connect_clicked(LINK(this, PrintDialog, ClickOKCancelHdl)); + mxSetupButton->connect_clicked(LINK(this, PrintDialog, ClickSetupHdl)); + mxBackwardBtn->connect_clicked(LINK(this, PrintDialog, ClickBackwardHdl)); + mxForwardBtn->connect_clicked(LINK(this, PrintDialog, ClickForwardHdl)); + mxFirstBtn->connect_clicked(LINK(this, PrintDialog, ClickFirstHdl)); + mxLastBtn->connect_clicked(LINK(this, PrintDialog, ClickLastHdl)); // setup toggle hdl mxReverseOrderBox->connect_toggled(LINK(this, PrintDialog, ToggleReverseOrderHdl)); @@ -1906,66 +1906,64 @@ IMPL_LINK_NOARG(PrintDialog, ToggleBrochureHdl, weld::Toggleable&, void) } } -IMPL_LINK(PrintDialog, ClickHdl, weld::Button&, rButton, void) +IMPL_LINK(PrintDialog, ClickOKCancelHdl, weld::Button&, rButton, void) { - if (&rButton == mxOKButton.get() || &rButton == mxCancelButton.get()) - { - storeToSettings(); - m_xDialog->response(&rButton == mxOKButton.get() ? RET_OK : RET_CANCEL); - } - else if( &rButton == mxForwardBtn.get() ) - { - previewForward(); - } - else if( &rButton == mxBackwardBtn.get() ) - { - previewBackward(); - } - else if( &rButton == mxFirstBtn.get() ) - { - previewFirst(); - } - else if( &rButton == mxLastBtn.get() ) - { - previewLast(); - } - else - { - if( &rButton == mxSetupButton.get() ) - { - maPController->setupPrinter(m_xDialog.get()); + storeToSettings(); + m_xDialog->response(&rButton == mxOKButton.get() ? RET_OK : RET_CANCEL); +} - if ( !isPrintToFile() ) - { - VclPtr<Printer> aPrt( maPController->getPrinter() ); - mePaper = aPrt->GetPaper(); +IMPL_LINK_NOARG(PrintDialog, ClickForwardHdl, weld::Button&, void) +{ + previewForward(); +} - for (int nPaper = 0; nPaper < aPrt->GetPaperInfoCount(); nPaper++ ) - { - PaperInfo aInfo = aPrt->GetPaperInfo( nPaper ); - aInfo.doSloppyFit(true); - Paper ePaper = aInfo.getPaper(); +IMPL_LINK_NOARG(PrintDialog, ClickBackwardHdl, weld::Button&, void) +{ + previewBackward(); +} - if ( mePaper == ePaper ) - { - mxPaperSizeBox->set_active( nPaper ); - break; - } - } - } +IMPL_LINK_NOARG(PrintDialog, ClickFirstHdl, weld::Button&, void) +{ + previewFirst(); +} - updateOrientationBox( false ); +IMPL_LINK_NOARG(PrintDialog, ClickLastHdl, weld::Button&, void) +{ + previewLast(); +} - updatePageSize(mxOrientationBox->get_active()); +IMPL_LINK_NOARG(PrintDialog, ClickSetupHdl, weld::Button&, void) +{ + maPController->setupPrinter(m_xDialog.get()); - setupPaperSidesBox(); + if (!isPrintToFile()) + { + VclPtr<Printer> aPrt( maPController->getPrinter() ); + mePaper = aPrt->GetPaper(); - // tdf#63905 don't use cache: page size may change - maUpdatePreviewNoCacheIdle.Start(); + for (int nPaper = 0; nPaper < aPrt->GetPaperInfoCount(); nPaper++) + { + PaperInfo aInfo = aPrt->GetPaperInfo(nPaper); + aInfo.doSloppyFit(true); + Paper ePaper = aInfo.getPaper(); + + if (mePaper == ePaper) + { + mxPaperSizeBox->set_active(nPaper); + break; + } } - checkControlDependencies(); } + updateOrientationBox(false); + + updatePageSize(mxOrientationBox->get_active()); + + setupPaperSidesBox(); + + // tdf#63905 don't use cache: page size may change + maUpdatePreviewNoCacheIdle.Start(); + checkControlDependencies(); } IMPL_LINK_NOARG( PrintDialog, SelectPrinterHdl, weld::ComboBox&, void )
