summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/platforms/cocoa/qprintengine_mac.mm14
-rw-r--r--src/plugins/printsupport/cups/qcupsprintengine.cpp5
-rw-r--r--src/printsupport/kernel/qprintengine_win.cpp5
-rw-r--r--tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp45
4 files changed, 66 insertions, 3 deletions
diff --git a/src/plugins/platforms/cocoa/qprintengine_mac.mm b/src/plugins/platforms/cocoa/qprintengine_mac.mm
index b3d48c1ec3..eade407500 100644
--- a/src/plugins/platforms/cocoa/qprintengine_mac.mm
+++ b/src/plugins/platforms/cocoa/qprintengine_mac.mm
@@ -574,6 +574,11 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va
d->setPageSize(QPageSize(QPageSize::id(value.toInt())));
break;
case PPK_PrinterName: {
+ QVariant pageSize = QVariant::fromValue(d->m_pageLayout.pageSize());
+ const bool isFullPage = d->m_pageLayout.mode() == QPageLayout::FullPageMode;
+ QVariant orientation = QVariant::fromValue(d->m_pageLayout.orientation());
+ QVariant margins = QVariant::fromValue(QPair<QMarginsF, QPageLayout::Unit>(d->m_pageLayout.margins(),
+ d->m_pageLayout.units()));
QString id = value.toString();
if (id.isEmpty())
id = QCocoaPrinterSupport().defaultPrintDeviceId();
@@ -583,7 +588,14 @@ void QMacPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &va
PMPrinter printer = d->m_printDevice->macPrinter();
PMRetain(printer);
PMSessionSetCurrentPMPrinter(d->session(), printer);
- // TODO Do we need to check if the page size, etc, are valid on new printer?
+ // Ensure the settings are up to date and valid
+ if (d->m_printDevice->supportedPageSize(pageSize.value<QPageSize>()).isValid())
+ setProperty(PPK_QPageSize, pageSize);
+ else
+ setProperty(PPK_CustomPaperSize, pageSize.value<QPageSize>().size(QPageSize::Point));
+ setProperty(PPK_FullPage, QVariant(isFullPage));
+ setProperty(PPK_Orientation, orientation);
+ setProperty(PPK_QPageMargins, margins);
break;
}
case PPK_CustomPaperSize:
diff --git a/src/plugins/printsupport/cups/qcupsprintengine.cpp b/src/plugins/printsupport/cups/qcupsprintengine.cpp
index bd0d641e79..6c29a99705 100644
--- a/src/plugins/printsupport/cups/qcupsprintengine.cpp
+++ b/src/plugins/printsupport/cups/qcupsprintengine.cpp
@@ -276,7 +276,10 @@ void QCupsPrintEnginePrivate::changePrinter(const QString &newPrinter)
grayscale = m_printDevice.defaultColorMode() == QPrint::GrayScale;
// Get the equivalent page size for this printer as supported names may be different
- setPageSize(m_pageLayout.pageSize());
+ if (m_printDevice.supportedPageSize(m_pageLayout.pageSize()).isValid())
+ setPageSize(m_pageLayout.pageSize());
+ else
+ setPageSize(QPageSize(m_pageLayout.pageSize().size(QPageSize::Point), QPageSize::Point));
}
void QCupsPrintEnginePrivate::setPageSize(const QPageSize &pageSize)
diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp
index a943d24cb1..ca4d1d0bd6 100644
--- a/src/printsupport/kernel/qprintengine_win.cpp
+++ b/src/printsupport/kernel/qprintengine_win.cpp
@@ -1234,7 +1234,10 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &
if (printDevice.isValid()) {
d->m_printDevice = printDevice;
d->initialize();
- setProperty(PPK_QPageSize, pageSize);
+ if (d->m_printDevice.supportedPageSize(pageSize.value<QPageSize>()).isValid())
+ setProperty(PPK_QPageSize, pageSize);
+ else
+ setProperty(PPK_CustomPaperSize, pageSize.value<QPageSize>().size(QPageSize::Point));
setProperty(PPK_FullPage, QVariant(isFullPage));
setProperty(PPK_Orientation, orientation);
setProperty(PPK_QPageMargins, margins);
diff --git a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp
index f68cf5c59c..4f86e74117 100644
--- a/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp
+++ b/tests/auto/printsupport/kernel/qprinter/tst_qprinter.cpp
@@ -122,6 +122,7 @@ private slots:
void testPageMetrics_data();
void testPageMetrics();
+ void reusePageMetrics();
#endif
private:
QString testFileName(const QString &prefix, const QString &suffix);
@@ -1955,6 +1956,50 @@ QString tst_QPrinter::testFileName(const QString &prefix, const QString &suffix)
return result;
}
+void tst_QPrinter::reusePageMetrics()
+{
+ QList<QPrinterInfo> availablePrinters = QPrinterInfo::availablePrinters();
+ if (availablePrinters.size() < 2)
+ QSKIP("Not enough printers to do this test with, need at least 2 setup");
+ QPrinter defaultP;
+ QPrinterInfo info(defaultP);
+ QString otherPrinterName;
+ for (QPrinterInfo i : qAsConst(availablePrinters)) {
+ if (i.printerName() != defaultP.printerName()) {
+ otherPrinterName = i.printerName();
+ break;
+ }
+ }
+ QPrinter otherP(QPrinterInfo::printerInfo(otherPrinterName));
+ QList<QPageSize> defaultPageSizes = info.supportedPageSizes();
+ QList<QPageSize> otherPageSizes = QPrinterInfo(otherP).supportedPageSizes();
+ QPageSize unavailableSizeToSet;
+ for (QPageSize s : qAsConst(defaultPageSizes)) {
+ bool found = false;
+ for (QPageSize os : qAsConst(otherPageSizes)) {
+ if (os.isEquivalentTo(s)) {
+ found = true;
+ break;
+ }
+ }
+ const QPageSize tmpSize(s.size(QPageSize::Point), QPageSize::Point);
+ if (!tmpSize.name().startsWith("Custom"))
+ found = true;
+ if (!found) {
+ unavailableSizeToSet = s;
+ break;
+ }
+ }
+ if (!unavailableSizeToSet.isValid())
+ QSKIP("Could not find a size that was not available on the non default printer. The test "
+ "requires this");
+ defaultP.setPageSize(unavailableSizeToSet);
+ defaultP.setPrinterName(otherP.printerName());
+ QVERIFY(defaultP.pageLayout().pageSize().isEquivalentTo(unavailableSizeToSet));
+ QVERIFY(defaultP.pageLayout().pageSize().name() != unavailableSizeToSet.name());
+ QCOMPARE(defaultP.pageLayout().pageSize().sizePoints(), unavailableSizeToSet.sizePoints());
+}
+
#endif // QT_CONFIG(printer)
QTEST_MAIN(tst_QPrinter)