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 )

Reply via email to