From 906c0168c564ccbc6722dc9bafc482137317085c Mon Sep 17 00:00:00 2001 From: Teemu Katajisto Date: Wed, 22 Aug 2012 12:05:53 +0300 Subject: [PATCH] QtPrintSupport: use PPD defaults in CUPS plugin Initialize CUPS plugin with default values from the PPD file. Implement paper size handling when using CUPS paper sizes to make paper sizes to map properly when used through QPrinter interface. Change-Id: I84d20aa4b1c7250fca754aecde419467f57ef16b Reviewed-by: Eskil Abrahamsen Blomfeldt Reviewed-by: Lars Knoll --- .../printsupport/cups/qcupsprintengine.cpp | 110 ++++++++++++++++++ .../printsupport/cups/qcupsprintengine_p.h | 2 + 2 files changed, 112 insertions(+) diff --git a/src/plugins/printsupport/cups/qcupsprintengine.cpp b/src/plugins/printsupport/cups/qcupsprintengine.cpp index 3d360a5a8c..82735ee44a 100644 --- a/src/plugins/printsupport/cups/qcupsprintengine.cpp +++ b/src/plugins/printsupport/cups/qcupsprintengine.cpp @@ -70,6 +70,7 @@ QCupsPrintEngine::QCupsPrintEngine(QPrinter::PrinterMode m) for (int i = 0; i < prnCount; ++i) { if (printers[i].is_default) { d->printerName = QString::fromLocal8Bit(printers[i].name); + d->setCupsDefaults(); break; } } @@ -88,6 +89,10 @@ void QCupsPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &v Q_D(QCupsPrintEngine); switch (int(key)) { + case PPK_PaperSize: + d->printerPaperSize = QPrinter::PaperSize(value.toInt()); + d->setPaperSize(); + break; case PPK_CupsPageRect: d->cupsPageRect = value.toRect(); break; @@ -100,6 +105,13 @@ void QCupsPrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &v case PPK_CupsStringPageSize: d->cupsStringPageSize = value.toString(); break; + case PPK_PrinterName: + // prevent setting the defaults again for the same printer + if (d->printerName != value.toString()) { + d->printerName = value.toString(); + d->setCupsDefaults(); + } + break; default: QPdfPrintEngine::setProperty(key, value); break; @@ -264,6 +276,104 @@ void QCupsPrintEnginePrivate::updatePaperSize() } } +void QCupsPrintEnginePrivate::setPaperSize() +{ + if (QCUPSSupport::isAvailable()) { + QCUPSSupport cups; + QPdf::PaperSize size = QPdf::paperSize(QPrinter::PaperSize(printerPaperSize)); + + if (cups.currentPPD()) { + const ppd_option_t* pageSizes = cups.pageSizes(); + for (int i = 0; i < pageSizes->num_choices; ++i) { + QByteArray cupsPageSize = pageSizes->choices[i].choice; + QRect tmpCupsPaperRect = cups.paperRect(cupsPageSize); + QRect tmpCupsPageRect = cups.pageRect(cupsPageSize); + + if (qAbs(size.width - tmpCupsPaperRect.width()) < 5 && qAbs(size.height - tmpCupsPaperRect.height()) < 5) { + cupsPaperRect = tmpCupsPaperRect; + cupsPageRect = tmpCupsPageRect; + + leftMargin = cupsPageRect.x() - cupsPaperRect.x(); + topMargin = cupsPageRect.y() - cupsPaperRect.y(); + rightMargin = cupsPaperRect.right() - cupsPageRect.right(); + bottomMargin = cupsPaperRect.bottom() - cupsPageRect.bottom(); + + updatePaperSize(); + break; + } + } + } + } +} + +void QCupsPrintEnginePrivate::setCupsDefaults() +{ + if (QCUPSSupport::isAvailable()) { + int cupsPrinterIndex = -1; + QCUPSSupport cups; + + const cups_dest_t* printers = cups.availablePrinters(); + int prnCount = cups.availablePrintersCount(); + for (int i = 0; i < prnCount; ++i) { + QString name = QString::fromLocal8Bit(printers[i].name); + if (name == printerName) { + cupsPrinterIndex = i; + break; + } + } + + if (cupsPrinterIndex < 0) + return; + + cups.setCurrentPrinter(cupsPrinterIndex); + + if (cups.currentPPD()) { + const ppd_option_t *ppdDuplex = cups.ppdOption("Duplex"); + if (ppdDuplex) { + if (qstrcmp(ppdDuplex->defchoice, "DuplexTumble") == 0) + duplex = QPrinter::DuplexShortSide; + else if (qstrcmp(ppdDuplex->defchoice, "DuplexNoTumble") == 0) + duplex = QPrinter::DuplexLongSide; + else + duplex = QPrinter::DuplexNone; + } + + grayscale = !cups.currentPPD()->color_device; + + const ppd_option_t *ppdCollate = cups.ppdOption("Collate"); + if (ppdCollate) + collate = qstrcmp(ppdCollate->defchoice, "True") == 0; + + const ppd_option_t* pageSizes = cups.pageSizes(); + QByteArray cupsPageSize; + for (int i = 0; i < pageSizes->num_choices; ++i) { + if (static_cast(pageSizes->choices[i].marked) == 1) + cupsPageSize = pageSizes->choices[i].choice; + } + + cupsOptions = cups.options(); + cupsPaperRect = cups.paperRect(cupsPageSize); + cupsPageRect = cups.pageRect(cupsPageSize); + + for (int ps = 0; ps < QPrinter::NPageSize; ++ps) { + QPdf::PaperSize size = QPdf::paperSize(QPrinter::PaperSize(ps)); + if (qAbs(size.width - cupsPaperRect.width()) < 5 && qAbs(size.height - cupsPaperRect.height()) < 5) { + printerPaperSize = static_cast(ps); + + leftMargin = cupsPageRect.x() - cupsPaperRect.x(); + topMargin = cupsPageRect.y() - cupsPaperRect.y(); + rightMargin = cupsPaperRect.right() - cupsPageRect.right(); + bottomMargin = cupsPaperRect.bottom() - cupsPageRect.bottom(); + + updatePaperSize(); + break; + } + } + } + } +} + + QT_END_NAMESPACE #endif // QT_NO_PRINTER diff --git a/src/plugins/printsupport/cups/qcupsprintengine_p.h b/src/plugins/printsupport/cups/qcupsprintengine_p.h index e67c888aec..6124ea063d 100644 --- a/src/plugins/printsupport/cups/qcupsprintengine_p.h +++ b/src/plugins/printsupport/cups/qcupsprintengine_p.h @@ -96,6 +96,8 @@ public: void closePrintDevice(); void updatePaperSize(); + void setPaperSize(); + void setCupsDefaults(); private: Q_DISABLE_COPY(QCupsPrintEnginePrivate)