From fb18fe0316540d93f1bc2d4faf8eb1822e1481cb Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 23 Sep 2020 12:58:08 +0200 Subject: Windows: Build print support plugin directly into QtPrintSupport MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTBUG-83259 Change-Id: I23042e1eb89d407692a96bfb2d6c4efdddbfb50f Reviewed-by: Tor Arne Vestbø --- src/plugins/printsupport/.prev_CMakeLists.txt | 3 - src/plugins/printsupport/CMakeLists.txt | 3 - src/plugins/printsupport/printsupport.pro | 1 - src/plugins/printsupport/windows/main.cpp | 66 --- .../printsupport/windows/qwindowsprintdevice.cpp | 571 --------------------- .../printsupport/windows/qwindowsprintdevice.h | 153 ------ .../printsupport/windows/qwindowsprinterinfo.cpp | 120 ----- .../windows/qwindowsprintersupport.cpp | 84 --- .../printsupport/windows/qwindowsprintersupport.h | 64 --- src/plugins/printsupport/windows/windows.json | 3 - src/plugins/printsupport/windows/windows.pro | 26 - 11 files changed, 1094 deletions(-) delete mode 100644 src/plugins/printsupport/windows/main.cpp delete mode 100644 src/plugins/printsupport/windows/qwindowsprintdevice.cpp delete mode 100644 src/plugins/printsupport/windows/qwindowsprintdevice.h delete mode 100644 src/plugins/printsupport/windows/qwindowsprinterinfo.cpp delete mode 100644 src/plugins/printsupport/windows/qwindowsprintersupport.cpp delete mode 100644 src/plugins/printsupport/windows/qwindowsprintersupport.h delete mode 100644 src/plugins/printsupport/windows/windows.json delete mode 100644 src/plugins/printsupport/windows/windows.pro (limited to 'src/plugins') diff --git a/src/plugins/printsupport/.prev_CMakeLists.txt b/src/plugins/printsupport/.prev_CMakeLists.txt index 14b36b4b7f..6d265f9285 100644 --- a/src/plugins/printsupport/.prev_CMakeLists.txt +++ b/src/plugins/printsupport/.prev_CMakeLists.txt @@ -1,8 +1,5 @@ # Generated from printsupport.pro. -if(WIN32) - add_subdirectory(windows) -endif() if(QT_FEATURE_cups AND UNIX AND NOT APPLE) add_subdirectory(cups) endif() diff --git a/src/plugins/printsupport/CMakeLists.txt b/src/plugins/printsupport/CMakeLists.txt index 811e33c93f..6d265f9285 100644 --- a/src/plugins/printsupport/CMakeLists.txt +++ b/src/plugins/printsupport/CMakeLists.txt @@ -1,8 +1,5 @@ # Generated from printsupport.pro. -if(WIN32) - # add_subdirectory(windows) # special case TODO -endif() if(QT_FEATURE_cups AND UNIX AND NOT APPLE) add_subdirectory(cups) endif() diff --git a/src/plugins/printsupport/printsupport.pro b/src/plugins/printsupport/printsupport.pro index c7110ec338..a7397a7390 100644 --- a/src/plugins/printsupport/printsupport.pro +++ b/src/plugins/printsupport/printsupport.pro @@ -1,5 +1,4 @@ TEMPLATE = subdirs QT_FOR_CONFIG += printsupport-private -win32: SUBDIRS += windows unix:!darwin:qtConfig(cups): SUBDIRS += cups diff --git a/src/plugins/printsupport/windows/main.cpp b/src/plugins/printsupport/windows/main.cpp deleted file mode 100644 index 7575006569..0000000000 --- a/src/plugins/printsupport/windows/main.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - - -#include -#include - -#include "qwindowsprintersupport.h" - -QT_BEGIN_NAMESPACE - -class QWindowsPrinterSupportPlugin : public QPlatformPrinterSupportPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QPlatformPrinterSupportFactoryInterface_iid FILE "windows.json") - -public: - QPlatformPrinterSupport *create(const QString &); -}; - -QPlatformPrinterSupport *QWindowsPrinterSupportPlugin::create(const QString &key) -{ - if (key.compare(key, QLatin1String("windowsprintsupport"), Qt::CaseInsensitive) == 0) - return new QWindowsPrinterSupport; - return 0; -} - -QT_END_NAMESPACE - -#include "main.moc" diff --git a/src/plugins/printsupport/windows/qwindowsprintdevice.cpp b/src/plugins/printsupport/windows/qwindowsprintdevice.cpp deleted file mode 100644 index bfd7a9a946..0000000000 --- a/src/plugins/printsupport/windows/qwindowsprintdevice.cpp +++ /dev/null @@ -1,571 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 John Layt -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwindowsprintdevice.h" - -#include - -#ifndef DC_COLLATE -# define DC_COLLATE 22 -#endif - -QT_BEGIN_NAMESPACE - -QT_WARNING_DISABLE_GCC("-Wsign-compare") -typedef QList WindowsPrinterLookup; -Q_GLOBAL_STATIC(WindowsPrinterLookup, windowsDeviceLookup); - -extern qreal qt_pointMultiplier(QPageLayout::Unit unit); - -static inline uint qwcsnlen(const wchar_t *str, uint maxlen) -{ - uint length = 0; - if (str) { - while (length < maxlen && *str++) - length++; - } - return length; -} - -static QPrint::InputSlot paperBinToInputSlot(int windowsId, const QString &name) -{ - QPrint::InputSlot slot; - slot.name = name; - int i; - for (i = 0; inputSlotMap[i].id != QPrint::CustomInputSlot; ++i) { - if (inputSlotMap[i].windowsId == windowsId) { - slot.key = inputSlotMap[i].key; - slot.id = inputSlotMap[i].id; - slot.windowsId = inputSlotMap[i].windowsId; - return slot; - } - } - slot.key = inputSlotMap[i].key; - slot.id = inputSlotMap[i].id; - slot.windowsId = windowsId; - return slot; -} - -static LPDEVMODE getDevmode(HANDLE hPrinter, const QString &printerId) -{ - LPWSTR printerIdUtf16 = const_cast(reinterpret_cast(printerId.utf16())); - // Allocate the required DEVMODE buffer - LONG dmSize = DocumentProperties(NULL, hPrinter, printerIdUtf16, NULL, NULL, 0); - if (dmSize <= 0) - return nullptr; - LPDEVMODE pDevMode = reinterpret_cast(malloc(dmSize)); - // Get the default DevMode - LONG result = DocumentProperties(NULL, hPrinter, printerIdUtf16, pDevMode, NULL, DM_OUT_BUFFER); - if (result != IDOK) { - free(pDevMode); - pDevMode = nullptr; - } - return pDevMode; -} - -QWindowsPrintDevice::QWindowsPrintDevice() - : QPlatformPrintDevice(), - m_hPrinter(0) -{ -} - -QWindowsPrintDevice::QWindowsPrintDevice(const QString &id) - : QPlatformPrintDevice(id), - m_hPrinter(0) -{ - // First do a fast lookup to see if printer exists, if it does then open it - if (!id.isEmpty() && QWindowsPrintDevice::availablePrintDeviceIds().contains(id)) { - if (OpenPrinter(const_cast(wcharId()), &m_hPrinter, nullptr)) { - DWORD needed = 0; - GetPrinter(m_hPrinter, 2, 0, 0, &needed); - QScopedArrayPointer buffer(new BYTE[needed]); - if (GetPrinter(m_hPrinter, 2, buffer.data(), needed, &needed)) { - PPRINTER_INFO_2 info = reinterpret_cast(buffer.data()); - m_name = QString::fromWCharArray(info->pPrinterName); - m_location = QString::fromWCharArray(info->pLocation); - m_makeAndModel = QString::fromWCharArray(info->pDriverName); // TODO Check is not available elsewhere - m_isRemote = info->Attributes & PRINTER_ATTRIBUTE_NETWORK; - } - QWindowsPrinterInfo m_info; - m_info.m_id = m_id; - m_info.m_name = m_name; - m_info.m_location = m_location; - m_info.m_makeAndModel = m_makeAndModel; - m_info.m_isRemote = m_isRemote; - m_infoIndex = windowsDeviceLookup()->indexOf(m_info); - if (m_infoIndex != -1) { - m_info = windowsDeviceLookup()->at(m_infoIndex); - m_havePageSizes = m_info.m_havePageSizes; - m_pageSizes = m_info.m_pageSizes; - m_haveResolutions = m_info.m_haveResolutions; - m_resolutions = m_info.m_resolutions; - m_haveCopies = m_info.m_haveCopies; - m_supportsMultipleCopies = m_info.m_supportsMultipleCopies; - m_supportsCollateCopies = m_info.m_supportsCollateCopies; - m_haveMinMaxPageSizes = m_info.m_haveMinMaxPageSizes; - m_minimumPhysicalPageSize = m_info.m_minimumPhysicalPageSize; - m_maximumPhysicalPageSize = m_info.m_maximumPhysicalPageSize; - m_supportsCustomPageSizes = m_info.m_supportsCustomPageSizes; - m_haveInputSlots = m_info.m_haveInputSlots; - m_inputSlots = m_info.m_inputSlots; - m_haveOutputBins = m_info.m_haveOutputBins; - m_outputBins = m_info.m_outputBins; - m_haveDuplexModes = m_info.m_haveDuplexModes; - m_duplexModes = m_info.m_duplexModes; - m_haveColorModes = m_info.m_haveColorModes; - m_colorModes = m_info.m_colorModes; - m_infoIndex = windowsDeviceLookup()->indexOf(m_info); - } else { - windowsDeviceLookup()->append(m_info); - m_infoIndex = windowsDeviceLookup()->count() - 1; - } - } - } -} - -QWindowsPrintDevice::~QWindowsPrintDevice() -{ - ClosePrinter(m_hPrinter); -} - -bool QWindowsPrintDevice::isValid() const -{ - return m_hPrinter; -} - -bool QWindowsPrintDevice::isDefault() const -{ - return m_id == defaultPrintDeviceId(); -} - -QPrint::DeviceState QWindowsPrintDevice::state() const -{ - DWORD needed = 0; - GetPrinter(m_hPrinter, 6, 0, 0, &needed); - QScopedArrayPointer buffer(new BYTE[needed]); - - if (GetPrinter(m_hPrinter, 6, buffer.data(), needed, &needed)) { - PPRINTER_INFO_6 info = reinterpret_cast(buffer.data()); - // TODO Check mapping - if (info->dwStatus == 0 - || (info->dwStatus & PRINTER_STATUS_WAITING) == PRINTER_STATUS_WAITING - || (info->dwStatus & PRINTER_STATUS_POWER_SAVE) == PRINTER_STATUS_POWER_SAVE) { - return QPrint::Idle; - } else if ((info->dwStatus & PRINTER_STATUS_PRINTING) == PRINTER_STATUS_PRINTING - || (info->dwStatus & PRINTER_STATUS_BUSY) == PRINTER_STATUS_BUSY - || (info->dwStatus & PRINTER_STATUS_INITIALIZING) == PRINTER_STATUS_INITIALIZING - || (info->dwStatus & PRINTER_STATUS_IO_ACTIVE) == PRINTER_STATUS_IO_ACTIVE - || (info->dwStatus & PRINTER_STATUS_PROCESSING) == PRINTER_STATUS_PROCESSING - || (info->dwStatus & PRINTER_STATUS_WARMING_UP) == PRINTER_STATUS_WARMING_UP) { - return QPrint::Active; - } - } - - return QPrint::Error; -} - -void QWindowsPrintDevice::loadPageSizes() const -{ - // Get the number of paper sizes and check all 3 attributes have same count - DWORD paperCount = DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERNAMES, NULL, NULL); - if (int(paperCount) > 0 - && DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERSIZE, NULL, NULL) == paperCount - && DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERS, NULL, NULL) == paperCount) { - - QScopedArrayPointer paperNames(new wchar_t[paperCount*64]); - QScopedArrayPointer winSizes(new POINT[paperCount]); - QScopedArrayPointer papers(new wchar_t[paperCount]); - - // Get the details and match the default paper size - if (DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERNAMES, paperNames.data(), NULL) == paperCount - && DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERSIZE, (wchar_t *)winSizes.data(), NULL) == paperCount - && DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_PAPERS, papers.data(), NULL) == paperCount) { - - // Returned size is in tenths of a millimeter - const qreal multiplier = qt_pointMultiplier(QPageLayout::Millimeter); - for (int i = 0; i < int(paperCount); ++i) { - QSize size = QSize(qRound((winSizes[i].x / 10.0) * multiplier), qRound((winSizes[i].y / 10.0) * multiplier)); - wchar_t *paper = paperNames.data() + (i * 64); - QString name = QString::fromWCharArray(paper, qwcsnlen(paper, 64)); - m_pageSizes.append(createPageSize(papers[i], size, name)); - } - - } - } - - m_havePageSizes = true; - QWindowsPrinterInfo *info = windowsDeviceLookup()->data(); - info[m_infoIndex].m_havePageSizes = true; - info[m_infoIndex].m_pageSizes = m_pageSizes; -} - -QPageSize QWindowsPrintDevice::defaultPageSize() const -{ - if (!m_havePageSizes) - loadPageSizes(); - - QPageSize pageSize; - - if (LPDEVMODE pDevMode = getDevmode(m_hPrinter, m_id)) { - // Get the default paper size - if (pDevMode->dmFields & DM_PAPERSIZE) { - // Find the supported page size that matches, in theory default should be one of them - foreach (const QPageSize &ps, m_pageSizes) { - if (ps.windowsId() == pDevMode->dmPaperSize) { - pageSize = ps; - break; - } - } - } - // Clean-up - free(pDevMode); - } - - return pageSize; -} - -QMarginsF QWindowsPrintDevice::printableMargins(const QPageSize &pageSize, - QPageLayout::Orientation orientation, - int resolution) const -{ - // TODO This is slow, need to cache values or find better way! - // Modify the DevMode to get the DC printable margins in device pixels - QMarginsF margins = QMarginsF(0, 0, 0, 0); - DWORD needed = 0; - GetPrinter(m_hPrinter, 2, 0, 0, &needed); - QScopedArrayPointer buffer(new BYTE[needed]); - if (GetPrinter(m_hPrinter, 2, buffer.data(), needed, &needed)) { - PPRINTER_INFO_2 info = reinterpret_cast(buffer.data()); - LPDEVMODE devMode = info->pDevMode; - bool separateDevMode = false; - if (!devMode) { - // GetPrinter() didn't include the DEVMODE. Get it a different way. - devMode = getDevmode(m_hPrinter, m_id); - if (!devMode) - return margins; - separateDevMode = true; - } - - HDC pDC = CreateDC(NULL, (LPWSTR)m_id.utf16(), NULL, devMode); - if (pageSize.id() == QPageSize::Custom || pageSize.windowsId() <= 0 || pageSize.windowsId() > DMPAPER_LAST) { - devMode->dmPaperSize = 0; - devMode->dmPaperWidth = pageSize.size(QPageSize::Millimeter).width() * 10.0; - devMode->dmPaperLength = pageSize.size(QPageSize::Millimeter).height() * 10.0; - } else { - devMode->dmPaperSize = pageSize.windowsId(); - } - devMode->dmPrintQuality = resolution; - devMode->dmOrientation = orientation == QPageLayout::Portrait ? DMORIENT_PORTRAIT : DMORIENT_LANDSCAPE; - ResetDC(pDC, devMode); - const int dpiWidth = GetDeviceCaps(pDC, LOGPIXELSX); - const int dpiHeight = GetDeviceCaps(pDC, LOGPIXELSY); - const qreal wMult = 72.0 / dpiWidth; - const qreal hMult = 72.0 / dpiHeight; - const qreal physicalWidth = GetDeviceCaps(pDC, PHYSICALWIDTH) * wMult; - const qreal physicalHeight = GetDeviceCaps(pDC, PHYSICALHEIGHT) * hMult; - const qreal printableWidth = GetDeviceCaps(pDC, HORZRES) * wMult; - const qreal printableHeight = GetDeviceCaps(pDC, VERTRES) * hMult; - const qreal leftMargin = GetDeviceCaps(pDC, PHYSICALOFFSETX)* wMult; - const qreal topMargin = GetDeviceCaps(pDC, PHYSICALOFFSETY) * hMult; - const qreal rightMargin = physicalWidth - leftMargin - printableWidth; - const qreal bottomMargin = physicalHeight - topMargin - printableHeight; - margins = QMarginsF(leftMargin, topMargin, rightMargin, bottomMargin); - if (separateDevMode) - free(devMode); - DeleteDC(pDC); - } - return margins; -} - -void QWindowsPrintDevice::loadResolutions() const -{ - DWORD resCount = DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_ENUMRESOLUTIONS, NULL, NULL); - if (int(resCount) > 0) { - QScopedArrayPointer resolutions(new LONG[resCount*2]); - // Get the details and match the default paper size - if (DeviceCapabilities((LPWSTR)m_id.utf16(), NULL, DC_ENUMRESOLUTIONS, (LPWSTR)resolutions.data(), NULL) == resCount) { - for (int i = 0; i < int(resCount * 2); i += 2) - m_resolutions.append(resolutions[i+1]); - } - } - m_haveResolutions = true; - QWindowsPrinterInfo *info = windowsDeviceLookup()->data(); - info[m_infoIndex].m_haveResolutions = true; - info[m_infoIndex].m_resolutions = m_resolutions; -} - -int QWindowsPrintDevice::defaultResolution() const -{ - int resolution = 72; // TODO Set a sensible default? - - if (LPDEVMODE pDevMode = getDevmode(m_hPrinter, m_id)) { - // Get the default resolution - if (pDevMode->dmFields & DM_YRESOLUTION) { - if (pDevMode->dmPrintQuality > 0) - resolution = pDevMode->dmPrintQuality; - else - resolution = pDevMode->dmYResolution; - } - // Clean-up - free(pDevMode); - } - return resolution; -} - -void QWindowsPrintDevice::loadInputSlots() const -{ - const auto printerId = wcharId(); - DWORD binCount = DeviceCapabilities(printerId, nullptr, DC_BINS, nullptr, nullptr); - if (int(binCount) > 0 - && DeviceCapabilities(printerId, nullptr, DC_BINNAMES, nullptr, nullptr) == binCount) { - - QScopedArrayPointer bins(new WORD[binCount]); - QScopedArrayPointer binNames(new wchar_t[binCount*24]); - - // Get the details and match the default paper size - if (DeviceCapabilities(printerId, nullptr, DC_BINS, - reinterpret_cast(bins.data()), nullptr) == binCount - && DeviceCapabilities(printerId, nullptr, DC_BINNAMES, binNames.data(), - nullptr) == binCount) { - - for (int i = 0; i < int(binCount); ++i) { - wchar_t *binName = binNames.data() + (i * 24); - QString name = QString::fromWCharArray(binName, qwcsnlen(binName, 24)); - m_inputSlots.append(paperBinToInputSlot(bins[i], name)); - } - - } - } - - m_haveInputSlots = true; - QWindowsPrinterInfo *info = windowsDeviceLookup()->data(); - info[m_infoIndex].m_haveInputSlots = true; - info[m_infoIndex].m_inputSlots = m_inputSlots; -} - -QPrint::InputSlot QWindowsPrintDevice::defaultInputSlot() const -{ - QPrint::InputSlot inputSlot = QPlatformPrintDevice::defaultInputSlot();; - - if (LPDEVMODE pDevMode = getDevmode(m_hPrinter, m_id)) { - // Get the default input slot - if (pDevMode->dmFields & DM_DEFAULTSOURCE) { - QPrint::InputSlot tempSlot = paperBinToInputSlot(pDevMode->dmDefaultSource, QString()); - foreach (const QPrint::InputSlot &slot, supportedInputSlots()) { - if (slot.key == tempSlot.key) { - inputSlot = slot; - break; - } - } - } - // Clean-up - free(pDevMode); - } - return inputSlot; -} - -void QWindowsPrintDevice::loadOutputBins() const -{ - m_outputBins.append(QPlatformPrintDevice::defaultOutputBin()); - m_haveOutputBins = true; - QWindowsPrinterInfo *info = windowsDeviceLookup()->data(); - info[m_infoIndex].m_haveOutputBins = true; - info[m_infoIndex].m_outputBins = m_outputBins; -} - -void QWindowsPrintDevice::loadDuplexModes() const -{ - m_duplexModes.append(QPrint::DuplexNone); - DWORD duplex = DeviceCapabilities(wcharId(), nullptr, DC_DUPLEX, nullptr, nullptr); - if (int(duplex) == 1) { - // TODO Assume if duplex flag supports both modes - m_duplexModes.append(QPrint::DuplexAuto); - m_duplexModes.append(QPrint::DuplexLongSide); - m_duplexModes.append(QPrint::DuplexShortSide); - } - m_haveDuplexModes = true; - QWindowsPrinterInfo *info = windowsDeviceLookup()->data(); - info[m_infoIndex].m_haveDuplexModes = true; - info[m_infoIndex].m_duplexModes = m_duplexModes; -} - -QPrint::DuplexMode QWindowsPrintDevice::defaultDuplexMode() const -{ - QPrint::DuplexMode duplexMode = QPrint::DuplexNone; - - if (LPDEVMODE pDevMode = getDevmode(m_hPrinter, m_id)) { - // Get the default duplex mode - if (pDevMode->dmFields & DM_DUPLEX) { - if (pDevMode->dmDuplex == DMDUP_VERTICAL) - duplexMode = QPrint::DuplexLongSide; - else if (pDevMode->dmDuplex == DMDUP_HORIZONTAL) - duplexMode = QPrint::DuplexShortSide; - } - // Clean-up - free(pDevMode); - } - return duplexMode; -} - -void QWindowsPrintDevice::loadColorModes() const -{ - m_colorModes.append(QPrint::GrayScale); - DWORD color = DeviceCapabilities(wcharId(), nullptr, DC_COLORDEVICE, nullptr, nullptr); - if (int(color) == 1) - m_colorModes.append(QPrint::Color); - m_haveColorModes = true; - QWindowsPrinterInfo *info = windowsDeviceLookup()->data(); - info[m_infoIndex].m_haveColorModes = true; - info[m_infoIndex].m_colorModes = m_colorModes; -} - -QPrint::ColorMode QWindowsPrintDevice::defaultColorMode() const -{ - if (!m_haveColorModes) - loadColorModes(); - if (!m_colorModes.contains(QPrint::Color)) - return QPrint::GrayScale; - - QPrint::ColorMode colorMode = QPrint::GrayScale; - - if (LPDEVMODE pDevMode = getDevmode(m_hPrinter, m_id)) { - // Get the default color mode - if (pDevMode->dmFields & DM_COLOR && pDevMode->dmColor == DMCOLOR_COLOR) - colorMode = QPrint::Color; - // Clean-up - free(pDevMode); - } - return colorMode; -} - -QStringList QWindowsPrintDevice::availablePrintDeviceIds() -{ - QStringList list; - DWORD needed = 0; - DWORD returned = 0; - if ((!EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, 0, 0, &needed, &returned) && GetLastError() != ERROR_INSUFFICIENT_BUFFER) - || !needed) { - return list; - } - QScopedArrayPointer buffer(new BYTE[needed]); - if (!EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, buffer.data(), needed, &needed, &returned)) - return list; - PPRINTER_INFO_4 infoList = reinterpret_cast(buffer.data()); - for (uint i = 0; i < returned; ++i) - list.append(QString::fromWCharArray(infoList[i].pPrinterName)); - return list; -} - -QString QWindowsPrintDevice::defaultPrintDeviceId() -{ - DWORD size = 0; - if (GetDefaultPrinter(NULL, &size) == ERROR_FILE_NOT_FOUND) - return QString(); - - QScopedArrayPointer name(new wchar_t[size]); - GetDefaultPrinter(name.data(), &size); - return QString::fromWCharArray(name.data()); -} - -void QWindowsPrintDevice::loadCopiesSupport() const -{ - auto printerId = wcharId(); - m_supportsMultipleCopies = (DeviceCapabilities(printerId, NULL, DC_COPIES, NULL, NULL) > 1); - m_supportsCollateCopies = DeviceCapabilities(printerId, NULL, DC_COLLATE, NULL, NULL); - m_haveCopies = true; - QWindowsPrinterInfo *info = windowsDeviceLookup()->data(); - info[m_infoIndex].m_haveCopies = true; - info[m_infoIndex].m_supportsMultipleCopies = m_supportsMultipleCopies; - info[m_infoIndex].m_supportsCollateCopies = m_supportsCollateCopies; -} - -bool QWindowsPrintDevice::supportsCollateCopies() const -{ - if (!m_haveCopies) - loadCopiesSupport(); - return m_supportsCollateCopies; -} - -bool QWindowsPrintDevice::supportsMultipleCopies() const -{ - if (!m_haveCopies) - loadCopiesSupport(); - return m_supportsMultipleCopies; -} - -bool QWindowsPrintDevice::supportsCustomPageSizes() const -{ - if (!m_haveMinMaxPageSizes) - loadMinMaxPageSizes(); - return m_supportsCustomPageSizes; -} - -QSize QWindowsPrintDevice::minimumPhysicalPageSize() const -{ - if (!m_haveMinMaxPageSizes) - loadMinMaxPageSizes(); - return m_minimumPhysicalPageSize; -} - -QSize QWindowsPrintDevice::maximumPhysicalPageSize() const -{ - if (!m_haveMinMaxPageSizes) - loadMinMaxPageSizes(); - return m_maximumPhysicalPageSize; -} - -void QWindowsPrintDevice::loadMinMaxPageSizes() const -{ - // Min/Max custom size is in tenths of a millimeter - const qreal multiplier = qt_pointMultiplier(QPageLayout::Millimeter); - auto printerId = wcharId(); - DWORD min = DeviceCapabilities(printerId, NULL, DC_MINEXTENT, NULL, NULL); - m_minimumPhysicalPageSize = QSize((LOWORD(min) / 10.0) * multiplier, (HIWORD(min) / 10.0) * multiplier); - DWORD max = DeviceCapabilities(printerId, NULL, DC_MAXEXTENT, NULL, NULL); - m_maximumPhysicalPageSize = QSize((LOWORD(max) / 10.0) * multiplier, (HIWORD(max) / 10.0) * multiplier); - m_supportsCustomPageSizes = (m_maximumPhysicalPageSize.width() > 0 && m_maximumPhysicalPageSize.height() > 0); - m_haveMinMaxPageSizes = true; - QWindowsPrinterInfo *info = windowsDeviceLookup()->data(); - info[m_infoIndex].m_haveCopies = true; - info[m_infoIndex].m_supportsMultipleCopies = m_supportsMultipleCopies; - info[m_infoIndex].m_supportsCollateCopies = m_supportsCollateCopies; -} - -QT_END_NAMESPACE diff --git a/src/plugins/printsupport/windows/qwindowsprintdevice.h b/src/plugins/printsupport/windows/qwindowsprintdevice.h deleted file mode 100644 index 8b63998181..0000000000 --- a/src/plugins/printsupport/windows/qwindowsprintdevice.h +++ /dev/null @@ -1,153 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2014 John Layt -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QWINDOWSPRINTDEVICE_H -#define QWINDOWSPRINTDEVICE_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists for the convenience -// of internal files. This header file may change from version to version -// without notice, or even be removed. -// -// We mean it. -// - -#include - -#include - -QT_BEGIN_NAMESPACE - -class QWindowsPrinterInfo -{ -public: - bool operator==(const QWindowsPrinterInfo &other) const - { - // We only need to check if these are the same for matching up - return m_id == other.m_id && m_name == other.m_name && - m_location == other.m_location && - m_makeAndModel == other.m_makeAndModel && - m_isRemote == other.m_isRemote; - } - QString m_id; - QString m_name; - QString m_location; - QString m_makeAndModel; - QList m_pageSizes; - QList m_resolutions; - QList m_inputSlots; - QList m_outputBins; - QList m_duplexModes; - QList m_colorModes; - QSize m_minimumPhysicalPageSize; - QSize m_maximumPhysicalPageSize; - bool m_isRemote = false; - bool m_havePageSizes = false; - bool m_haveResolutions = false; - bool m_haveCopies = false; - bool m_supportsMultipleCopies = false; - bool m_supportsCollateCopies = false; - bool m_haveMinMaxPageSizes = false; - bool m_supportsCustomPageSizes = false; - bool m_haveInputSlots = false; - bool m_haveOutputBins = false; - bool m_haveDuplexModes = false; - bool m_haveColorModes = false; -}; - -class QWindowsPrintDevice : public QPlatformPrintDevice -{ -public: - QWindowsPrintDevice(); - explicit QWindowsPrintDevice(const QString &id); - virtual ~QWindowsPrintDevice(); - - bool isValid() const override; - bool isDefault() const override; - - QPrint::DeviceState state() const override; - - QPageSize defaultPageSize() const override; - - QMarginsF printableMargins(const QPageSize &pageSize, QPageLayout::Orientation orientation, - int resolution) const override; - - int defaultResolution() const override; - - QPrint::InputSlot defaultInputSlot() const override; - - QPrint::DuplexMode defaultDuplexMode() const override; - - QPrint::ColorMode defaultColorMode() const override; - - static QStringList availablePrintDeviceIds(); - static QString defaultPrintDeviceId(); - - bool supportsCollateCopies() const override; - bool supportsMultipleCopies() const override; - bool supportsCustomPageSizes() const override; - QSize minimumPhysicalPageSize() const override; - QSize maximumPhysicalPageSize() const override; - -protected: - void loadPageSizes() const override; - void loadResolutions() const override; - void loadInputSlots() const override; - void loadOutputBins() const override; - void loadDuplexModes() const override; - void loadColorModes() const override; - void loadCopiesSupport() const; - void loadMinMaxPageSizes() const; - -private: - LPCWSTR wcharId() const { return reinterpret_cast(m_id.utf16()); } - - HANDLE m_hPrinter; - mutable bool m_haveCopies; - mutable bool m_haveMinMaxPageSizes; - int m_infoIndex; -}; - -QT_END_NAMESPACE - -#endif // QWINDOWSPRINTDEVICE_H diff --git a/src/plugins/printsupport/windows/qwindowsprinterinfo.cpp b/src/plugins/printsupport/windows/qwindowsprinterinfo.cpp deleted file mode 100644 index e416dd7a21..0000000000 --- a/src/plugins/printsupport/windows/qwindowsprinterinfo.cpp +++ /dev/null @@ -1,120 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qprinterinfo.h" -#include "qprinterinfo_p.h" - -#include - -#include - -QT_BEGIN_NAMESPACE - -#ifndef QT_NO_PRINTER - -extern QPrinter::PaperSize mapDevmodePaperSize(int s); - -//QList QPrinterInfo::availablePrinters() -//{ -// QList printers; - -// DWORD needed = 0; -// DWORD returned = 0; -// if (!EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, 0, 0, &needed, &returned)) { -// LPBYTE buffer = new BYTE[needed]; -// if (EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, buffer, needed, &needed, &returned)) { -// PPRINTER_INFO_4 infoList = reinterpret_cast(buffer); -// QPrinterInfo defPrn = defaultPrinter(); -// for (uint i = 0; i < returned; ++i) { -// QString printerName(QString::fromWCharArray(infoList[i].pPrinterName)); - -// QPrinterInfo printerInfo(printerName); -// if (printerInfo.printerName() == defPrn.printerName()) -// printerInfo.d_ptr->isDefault = true; -// printers.append(printerInfo); -// } -// } -// delete [] buffer; -// } - -// return printers; -//} - -//QPrinterInfo QPrinterInfo::defaultPrinter() -//{ -// QString noPrinters(QLatin1String("qt_no_printers")); -// wchar_t buffer[256]; -// GetProfileString(L"windows", L"device", (wchar_t*)noPrinters.utf16(), buffer, 256); -// QString output = QString::fromWCharArray(buffer); -// if (output != noPrinters) { -// // Filter out the name of the printer, which should be everything before a comma. -// QString printerName = output.split(QLatin1Char(',')).value(0); -// QPrinterInfo printerInfo(printerName); -// printerInfo.d_ptr->isDefault = true; -// return printerInfo; -// } - -// return QPrinterInfo(); -//} - -//QList QPrinterInfo::supportedPaperSizes() const -//{ -// const Q_D(QPrinterInfo); - -// QList paperSizes; -// if (isNull()) -// return paperSizes; - -// DWORD size = DeviceCapabilities(reinterpret_cast(d->name.utf16()), -// NULL, DC_PAPERS, NULL, NULL); -// if ((int)size != -1) { -// wchar_t *papers = new wchar_t[size]; -// size = DeviceCapabilities(reinterpret_cast(d->name.utf16()), -// NULL, DC_PAPERS, papers, NULL); -// for (int c = 0; c < (int)size; ++c) -// paperSizes.append(mapDevmodePaperSize(papers[c])); -// delete [] papers; -// } - -// return paperSizes; -//} - -#endif // QT_NO_PRINTER - -QT_END_NAMESPACE diff --git a/src/plugins/printsupport/windows/qwindowsprintersupport.cpp b/src/plugins/printsupport/windows/qwindowsprintersupport.cpp deleted file mode 100644 index a52ad55576..0000000000 --- a/src/plugins/printsupport/windows/qwindowsprintersupport.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qwindowsprintersupport.h" -#include "qwindowsprintdevice.h" - -#include -#include -#include - -QT_BEGIN_NAMESPACE - -QWindowsPrinterSupport::QWindowsPrinterSupport() - : QPlatformPrinterSupport() -{ -} - -QWindowsPrinterSupport::~QWindowsPrinterSupport() -{ -} - -QPrintEngine *QWindowsPrinterSupport::createNativePrintEngine(QPrinter::PrinterMode printerMode, const QString &deviceId) -{ - return new QWin32PrintEngine(printerMode, deviceId); -} - -QPaintEngine *QWindowsPrinterSupport::createPaintEngine(QPrintEngine *engine, QPrinter::PrinterMode printerMode) -{ - Q_UNUSED(printerMode); - return static_cast(engine); -} - -QPrintDevice QWindowsPrinterSupport::createPrintDevice(const QString &id) -{ - return QPlatformPrinterSupport::createPrintDevice(new QWindowsPrintDevice(id)); -} - -QStringList QWindowsPrinterSupport::availablePrintDeviceIds() const -{ - return QWindowsPrintDevice::availablePrintDeviceIds(); -} - -QString QWindowsPrinterSupport::defaultPrintDeviceId() const -{ - return QWindowsPrintDevice::defaultPrintDeviceId(); -} - -QT_END_NAMESPACE diff --git a/src/plugins/printsupport/windows/qwindowsprintersupport.h b/src/plugins/printsupport/windows/qwindowsprintersupport.h deleted file mode 100644 index 400701628e..0000000000 --- a/src/plugins/printsupport/windows/qwindowsprintersupport.h +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef WINDOWSPRINTERSUPPORT_H -#define WINDOWSPRINTERSUPPORT_H - -#include - -QT_BEGIN_NAMESPACE - -class QWindowsPrinterSupport : public QPlatformPrinterSupport -{ - Q_DISABLE_COPY_MOVE(QWindowsPrinterSupport) -public: - QWindowsPrinterSupport(); - ~QWindowsPrinterSupport() override; - - QPrintEngine *createNativePrintEngine(QPrinter::PrinterMode printerMode, const QString &deviceId = QString()) override; - QPaintEngine *createPaintEngine(QPrintEngine *printEngine, QPrinter::PrinterMode) override; - - QPrintDevice createPrintDevice(const QString &id) override; - QStringList availablePrintDeviceIds() const override; - QString defaultPrintDeviceId() const override; -}; - -QT_END_NAMESPACE - -#endif // WINDOWSPRINTERSUPPORT_H diff --git a/src/plugins/printsupport/windows/windows.json b/src/plugins/printsupport/windows/windows.json deleted file mode 100644 index 803052854e..0000000000 --- a/src/plugins/printsupport/windows/windows.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "Keys": [ "windowsprintsupport" ] -} diff --git a/src/plugins/printsupport/windows/windows.pro b/src/plugins/printsupport/windows/windows.pro deleted file mode 100644 index 6ca601b2a4..0000000000 --- a/src/plugins/printsupport/windows/windows.pro +++ /dev/null @@ -1,26 +0,0 @@ -TARGET = windowsprintersupport -MODULE = windowsprintersupport - -QT *= core-private -QT *= gui-private -QT *= printsupport-private - -INCLUDEPATH *= $$QT_SOURCE_TREE/src/printsupport/kernel - -SOURCES += \ - main.cpp \ - qwindowsprintersupport.cpp \ - qwindowsprintdevice.cpp \ - -HEADERS += \ - qwindowsprintersupport.h \ - qwindowsprintdevice.h \ - -OTHER_FILES += windows.json - -LIBS += -lwinspool -lcomdlg32 -QMAKE_USE_PRIVATE += user32 gdi32 - -PLUGIN_TYPE = printsupport -PLUGIN_CLASS_NAME = QWindowsPrinterSupportPlugin -load(qt_plugin) -- cgit v1.2.3