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>bb10
parent
5ddc5df350
commit
f05e48381b
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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...
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue