summaryrefslogtreecommitdiffstats
path: root/src/printsupport
diff options
context:
space:
mode:
authorJohn Layt <jlayt@kde.org>2014-01-20 15:40:23 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-26 12:58:00 +0100
commitf05e48381b309447297a290f699a3389ac41af41 (patch)
treeec69b3247b7db8f48ef782feea03f4a120e08a69 /src/printsupport
parent5ddc5df3501675fc4cd2a6994b46b00969b7c02c (diff)
QPrintEngine - Improve devMode handling
Improve the sharing of the devMode between the QPrintEngine and the print dialogs, in particular start to change the dialogs from directly accessing the QPrintEngine internals. Change-Id: Ieb4649c19b936433c85207297a0b6e59356c3880 Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/printsupport')
-rw-r--r--src/printsupport/dialogs/qpagesetupdialog_win.cpp15
-rw-r--r--src/printsupport/dialogs/qprintdialog_win.cpp15
-rw-r--r--src/printsupport/kernel/qprintengine_win.cpp64
-rw-r--r--src/printsupport/kernel/qprintengine_win_p.h12
4 files changed, 49 insertions, 57 deletions
diff --git a/src/printsupport/dialogs/qpagesetupdialog_win.cpp b/src/printsupport/dialogs/qpagesetupdialog_win.cpp
index 688f4ac314..345e698b82 100644
--- a/src/printsupport/dialogs/qpagesetupdialog_win.cpp
+++ b/src/printsupport/dialogs/qpagesetupdialog_win.cpp
@@ -82,7 +82,7 @@ int QPageSetupDialog::exec()
// we need a temp DEVMODE struct if we don't have a global DEVMODE
HGLOBAL hDevMode = 0;
int devModeSize = 0;
- if (!ep->globalDevMode) {
+ if (!engine->globalDevMode()) {
devModeSize = sizeof(DEVMODE) + ep->devMode->dmDriverExtra;
hDevMode = GlobalAlloc(GHND, devModeSize);
if (hDevMode) {
@@ -92,10 +92,10 @@ int QPageSetupDialog::exec()
}
psd.hDevMode = hDevMode;
} else {
- psd.hDevMode = ep->devMode;
+ psd.hDevMode = engine->globalDevMode();
}
- HGLOBAL *tempDevNames = ep->createDevNames();
+ HGLOBAL *tempDevNames = engine->createGlobalDevNames();
psd.hDevNames = tempDevNames;
QWidget *parent = parentWidget();
@@ -129,8 +129,7 @@ int QPageSetupDialog::exec()
bool result = PageSetupDlg(&psd);
QDialog::setVisible(false);
if (result) {
- ep->readDevnames(psd.hDevNames);
- ep->readDevmode(psd.hDevMode);
+ engine->setGlobalDevMode(psd.hDevNames, psd.hDevMode);
QRect theseMargins = QRect(psd.rtMargin.left * multiplier,
psd.rtMargin.top * multiplier,
@@ -144,17 +143,15 @@ int QPageSetupDialog::exec()
psd.rtMargin.bottom * multiplier);
}
- ep->updateCustomPaperSize();
-
// copy from our temp DEVMODE struct
- if (!ep->globalDevMode && hDevMode) {
+ if (!engine->globalDevMode() && hDevMode) {
void *src = GlobalLock(hDevMode);
memcpy(ep->devMode, src, devModeSize);
GlobalUnlock(hDevMode);
}
}
- if (!ep->globalDevMode && hDevMode)
+ if (!engine->globalDevMode() && hDevMode)
GlobalFree(hDevMode);
GlobalFree(tempDevNames);
done(result);
diff --git a/src/printsupport/dialogs/qprintdialog_win.cpp b/src/printsupport/dialogs/qprintdialog_win.cpp
index 9d972ef5c4..722f0e186f 100644
--- a/src/printsupport/dialogs/qprintdialog_win.cpp
+++ b/src/printsupport/dialogs/qprintdialog_win.cpp
@@ -68,12 +68,13 @@ class QPrintDialogPrivate : public QAbstractPrintDialogPrivate
Q_DECLARE_PUBLIC(QPrintDialog)
public:
QPrintDialogPrivate()
- : ep(0)
+ : engine(0), ep(0)
{
}
int openWindowsPrintDialogModally();
+ QWin32PrintEngine *engine;
QWin32PrintEnginePrivate *ep;
};
@@ -141,7 +142,7 @@ static void qt_win_setup_PRINTDLGEX(PRINTDLGEX *pd, QWidget *parent,
pd->hwndOwner = parentWindow ? (HWND)QGuiApplication::platformNativeInterface()->nativeResourceForWindow("handle", parentWindow) : 0;
pd->lpPageRanges[0].nFromPage = qMax(pdlg->fromPage(), pdlg->minPage());
pd->lpPageRanges[0].nToPage = (pdlg->toPage() > 0) ? qMin(pdlg->toPage(), pdlg->maxPage()) : 1;
- pd->nCopies = d->ep->num_copies;
+ pd->nCopies = d->printer->copyCount();
}
static void qt_win_read_back_PRINTDLGEX(PRINTDLGEX *pd, QPrintDialog *pdlg, QPrintDialogPrivate *d)
@@ -162,9 +163,7 @@ static void qt_win_read_back_PRINTDLGEX(PRINTDLGEX *pd, QPrintDialog *pdlg, QPri
d->ep->printToFile = (pd->Flags & PD_PRINTTOFILE) != 0;
- d->ep->readDevnames(pd->hDevNames);
- d->ep->readDevmode(pd->hDevMode);
- d->ep->updateCustomPaperSize();
+ d->engine->setGlobalDevMode(pd->hDevNames, pd->hDevMode);
if (d->ep->printToFile && d->ep->fileName.isEmpty())
d->ep->fileName = QLatin1String("FILE:");
@@ -187,6 +186,7 @@ QPrintDialog::QPrintDialog(QPrinter *printer, QWidget *parent)
Q_D(QPrintDialog);
if (!warnIfNotNative(d->printer))
return;
+ d->engine = static_cast<QWin32PrintEngine *>(d->printer->printEngine());
d->ep = static_cast<QWin32PrintEngine *>(d->printer->printEngine())->d_func();
setAttribute(Qt::WA_DontShowOnScreen);
}
@@ -197,6 +197,7 @@ QPrintDialog::QPrintDialog(QWidget *parent)
Q_D(QPrintDialog);
if (!warnIfNotNative(d->printer))
return;
+ d->engine = static_cast<QWin32PrintEngine *>(d->printer->printEngine());
d->ep = static_cast<QWin32PrintEngine *>(d->printer->printEngine())->d_func();
setAttribute(Qt::WA_DontShowOnScreen);
}
@@ -229,7 +230,7 @@ int QPrintDialogPrivate::openWindowsPrintDialogModally()
q->QDialog::setVisible(true);
- HGLOBAL *tempDevNames = ep->createDevNames();
+ HGLOBAL *tempDevNames = engine->createGlobalDevNames();
bool done;
bool result;
@@ -278,7 +279,7 @@ int QPrintDialogPrivate::openWindowsPrintDialogModally()
{
qt_win_read_back_PRINTDLGEX(&pd, q, this);
// update printer validity
- printer->d_func()->validPrinter = !ep->name.isEmpty();
+ printer->d_func()->validPrinter = !printer->printerName().isEmpty();
}
// Cleanup...
diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp
index ce2316d0e0..02b5d824f4 100644
--- a/src/printsupport/kernel/qprintengine_win.cpp
+++ b/src/printsupport/kernel/qprintengine_win.cpp
@@ -1798,9 +1798,11 @@ void QWin32PrintEngine::queryDefaultPrinter(QString &name)
}
}
-HGLOBAL *QWin32PrintEnginePrivate::createDevNames()
+HGLOBAL *QWin32PrintEngine::createGlobalDevNames()
{
- int size = sizeof(DEVNAMES) + name.length() * 2 + 2;
+ Q_D(QWin32PrintEngine);
+
+ int size = sizeof(DEVNAMES) + d->name.length() * 2 + 2;
HGLOBAL *hGlobal = (HGLOBAL *) GlobalAlloc(GMEM_MOVEABLE, size);
DEVNAMES *dn = (DEVNAMES*) GlobalLock(hGlobal);
@@ -1808,52 +1810,44 @@ HGLOBAL *QWin32PrintEnginePrivate::createDevNames()
dn->wDeviceOffset = sizeof(DEVNAMES) / sizeof(wchar_t);
dn->wOutputOffset = 0;
- memcpy((ushort*)dn + dn->wDeviceOffset, name.utf16(), name.length() * 2 + 2);
+ memcpy((ushort*)dn + dn->wDeviceOffset, d->name.utf16(), d->name.length() * 2 + 2);
dn->wDefault = 0;
GlobalUnlock(hGlobal);
-
-// printf("QPrintDialogWinPrivate::createDevNames()\n"
-// " -> wDriverOffset: %d\n"
-// " -> wDeviceOffset: %d\n"
-// " -> wOutputOffset: %d\n",
-// dn->wDriverOffset,
-// dn->wDeviceOffset,
-// dn->wOutputOffset);
-
-// printf("QPrintDialogWinPrivate::createDevNames(): %s, %s, %s\n",
-// QString::fromWCharArray((wchar_t*)(dn) + dn->wDriverOffset).latin1(),
-// QString::fromWCharArray((wchar_t*)(dn) + dn->wDeviceOffset).latin1(),
-// QString::fromWCharArray((wchar_t*)(dn) + dn->wOutputOffset).latin1());
-
return hGlobal;
}
-void QWin32PrintEnginePrivate::readDevnames(HGLOBAL globalDevnames)
+void QWin32PrintEngine::setGlobalDevMode(HGLOBAL globalDevNames, HGLOBAL globalDevMode)
{
- if (globalDevnames) {
- DEVNAMES *dn = (DEVNAMES*) GlobalLock(globalDevnames);
- name = QString::fromWCharArray((wchar_t*)(dn) + dn->wDeviceOffset);
- GlobalUnlock(globalDevnames);
+ Q_D(QWin32PrintEngine);
+ if (globalDevNames) {
+ DEVNAMES *dn = (DEVNAMES*) GlobalLock(globalDevNames);
+ d->name = QString::fromWCharArray((wchar_t*)(dn) + dn->wDeviceOffset);
+ GlobalUnlock(globalDevNames);
}
-}
-void QWin32PrintEnginePrivate::readDevmode(HGLOBAL globalDevmode)
-{
- if (globalDevmode) {
- DEVMODE *dm = (DEVMODE*) GlobalLock(globalDevmode);
- release();
- globalDevMode = globalDevmode;
- devMode = dm;
- hdc = CreateDC(NULL, reinterpret_cast<const wchar_t *>(name.utf16()), 0, dm);
+ if (globalDevMode) {
+ DEVMODE *dm = (DEVMODE*) GlobalLock(globalDevMode);
+ d->release();
+ d->globalDevMode = globalDevMode;
+ d->devMode = dm;
+ d->hdc = CreateDC(NULL, reinterpret_cast<const wchar_t *>(d->name.utf16()), 0, dm);
- num_copies = devMode->dmCopies;
- if (!OpenPrinter((wchar_t*)name.utf16(), &hPrinter, 0))
+ d->num_copies = d->devMode->dmCopies;
+ d->updateCustomPaperSize();
+
+ if (!OpenPrinter((wchar_t*)d->name.utf16(), &d->hPrinter, 0))
qWarning("QPrinter: OpenPrinter() failed after reading DEVMODE.");
}
- if (hdc)
- initHDC();
+ if (d->hdc)
+ d->initHDC();
+}
+
+HGLOBAL QWin32PrintEngine::globalDevMode()
+{
+ Q_D(QWin32PrintEngine);
+ return d->globalDevMode;
}
static void draw_text_item_win(const QPointF &pos, const QTextItemInt &ti, HDC hdc,
diff --git a/src/printsupport/kernel/qprintengine_win_p.h b/src/printsupport/kernel/qprintengine_win_p.h
index b651487a13..d720561c2a 100644
--- a/src/printsupport/kernel/qprintengine_win_p.h
+++ b/src/printsupport/kernel/qprintengine_win_p.h
@@ -107,6 +107,12 @@ public:
static QList<QPrinter::PaperSize> supportedPaperSizes(const QPrinterInfo &printerInfo);
static QList<QPair<QString, QSizeF> > supportedSizesWithNames(const QPrinterInfo &printerInfo);
+
+ /* Used by print/page setup dialogs */
+ void setGlobalDevMode(HGLOBAL globalDevNames, HGLOBAL globalDevMode);
+ HGLOBAL *createGlobalDevNames();
+ HGLOBAL globalDevMode();
+
static void queryDefaultPrinter(QString &name);
private:
@@ -166,12 +172,6 @@ public:
is handled in the next begin or newpage. */
void doReinit();
- /* Used by print/page setup dialogs */
- HGLOBAL *createDevNames();
-
- void readDevmode(HGLOBAL globalDevmode);
- void readDevnames(HGLOBAL globalDevnames);
-
inline bool resetDC() {
hdc = ResetDC(hdc, devMode);
return hdc != 0;