2 * Exported functions from the PostScript driver.
4 * [Ext]DeviceMode, DeviceCapabilities, AdvancedSetupDialog.
6 * Will need ExtTextOut for winword6 (urgh!)
8 * Copyright 1998 Huw D M Davies
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
25 #define NONAMELESSUNION
26 #define NONAMELESSSTRUCT
32 #include "wine/debug.h"
40 WINE_DEFAULT_DEBUG_CHANNEL(psdrv
);
43 /************************************************************************
47 * Updates dm1 with some fields from dm2
50 void PSDRV_MergeDevmodes(PSDRV_DEVMODEA
*dm1
, PSDRV_DEVMODEA
*dm2
,
53 /* some sanity checks here on dm2 */
55 if(dm2
->dmPublic
.dmFields
& DM_ORIENTATION
) {
56 dm1
->dmPublic
.u1
.s1
.dmOrientation
= dm2
->dmPublic
.u1
.s1
.dmOrientation
;
57 TRACE("Changing orientation to %d (%s)\n",
58 dm1
->dmPublic
.u1
.s1
.dmOrientation
,
59 dm1
->dmPublic
.u1
.s1
.dmOrientation
== DMORIENT_PORTRAIT
?
61 (dm1
->dmPublic
.u1
.s1
.dmOrientation
== DMORIENT_LANDSCAPE
?
62 "Landscape" : "unknown"));
65 /* NB PaperWidth is always < PaperLength */
66 if(dm2
->dmPublic
.dmFields
& DM_PAPERSIZE
) {
69 LIST_FOR_EACH_ENTRY(page
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
) {
70 if(page
->WinPage
== dm2
->dmPublic
.u1
.s1
.dmPaperSize
)
73 if(&page
->entry
!= &pi
->ppd
->PageSizes
) {
74 dm1
->dmPublic
.u1
.s1
.dmPaperSize
= dm2
->dmPublic
.u1
.s1
.dmPaperSize
;
75 dm1
->dmPublic
.u1
.s1
.dmPaperWidth
= page
->PaperDimension
->x
*
77 dm1
->dmPublic
.u1
.s1
.dmPaperLength
= page
->PaperDimension
->y
*
79 dm1
->dmPublic
.dmFields
&= ~(DM_PAPERLENGTH
| DM_PAPERWIDTH
);
80 dm1
->dmPublic
.dmFields
|= DM_PAPERSIZE
;
81 TRACE("Changing page to %s %d x %d\n", page
->FullName
,
82 dm1
->dmPublic
.u1
.s1
.dmPaperWidth
,
83 dm1
->dmPublic
.u1
.s1
.dmPaperLength
);
85 TRACE("Trying to change to unsupported pagesize %d\n",
86 dm2
->dmPublic
.u1
.s1
.dmPaperSize
);
88 } else if((dm2
->dmPublic
.dmFields
& DM_PAPERLENGTH
) &&
89 (dm2
->dmPublic
.dmFields
& DM_PAPERWIDTH
)) {
90 dm1
->dmPublic
.u1
.s1
.dmPaperLength
= dm2
->dmPublic
.u1
.s1
.dmPaperLength
;
91 dm1
->dmPublic
.u1
.s1
.dmPaperWidth
= dm2
->dmPublic
.u1
.s1
.dmPaperWidth
;
92 TRACE("Changing PaperLength|Width to %dx%d\n",
93 dm2
->dmPublic
.u1
.s1
.dmPaperLength
,
94 dm2
->dmPublic
.u1
.s1
.dmPaperWidth
);
95 dm1
->dmPublic
.dmFields
&= ~DM_PAPERSIZE
;
96 dm1
->dmPublic
.dmFields
|= (DM_PAPERLENGTH
| DM_PAPERWIDTH
);
97 } else if(dm2
->dmPublic
.dmFields
& (DM_PAPERLENGTH
| DM_PAPERWIDTH
)) {
98 /* You might think that this would be allowed if dm1 is in custom size
99 mode, but apparently Windows reverts to standard paper mode even in
101 FIXME("Trying to change only paperlength or paperwidth\n");
102 dm1
->dmPublic
.dmFields
&= ~(DM_PAPERLENGTH
| DM_PAPERWIDTH
);
103 dm1
->dmPublic
.dmFields
|= DM_PAPERSIZE
;
106 if(dm2
->dmPublic
.dmFields
& DM_SCALE
) {
107 dm1
->dmPublic
.u1
.s1
.dmScale
= dm2
->dmPublic
.u1
.s1
.dmScale
;
108 TRACE("Changing Scale to %d\n", dm2
->dmPublic
.u1
.s1
.dmScale
);
111 if(dm2
->dmPublic
.dmFields
& DM_COPIES
) {
112 dm1
->dmPublic
.u1
.s1
.dmCopies
= dm2
->dmPublic
.u1
.s1
.dmCopies
;
113 TRACE("Changing Copies to %d\n", dm2
->dmPublic
.u1
.s1
.dmCopies
);
116 if(dm2
->dmPublic
.dmFields
& DM_DEFAULTSOURCE
) {
119 for(slot
= pi
->ppd
->InputSlots
; slot
; slot
= slot
->next
) {
120 if(slot
->WinBin
== dm2
->dmPublic
.u1
.s1
.dmDefaultSource
)
124 dm1
->dmPublic
.u1
.s1
.dmDefaultSource
= dm2
->dmPublic
.u1
.s1
.dmDefaultSource
;
125 TRACE("Changing bin to '%s'\n", slot
->FullName
);
127 TRACE("Trying to change to unsupported bin %d\n",
128 dm2
->dmPublic
.u1
.s1
.dmDefaultSource
);
132 if (dm2
->dmPublic
.dmFields
& DM_DEFAULTSOURCE
)
133 dm1
->dmPublic
.u1
.s1
.dmDefaultSource
= dm2
->dmPublic
.u1
.s1
.dmDefaultSource
;
134 if (dm2
->dmPublic
.dmFields
& DM_PRINTQUALITY
)
135 dm1
->dmPublic
.u1
.s1
.dmPrintQuality
= dm2
->dmPublic
.u1
.s1
.dmPrintQuality
;
136 if (dm2
->dmPublic
.dmFields
& DM_COLOR
)
137 dm1
->dmPublic
.dmColor
= dm2
->dmPublic
.dmColor
;
138 if (dm2
->dmPublic
.dmFields
& DM_DUPLEX
&& pi
->ppd
->DefaultDuplex
&& pi
->ppd
->DefaultDuplex
->WinDuplex
!= 0)
139 dm1
->dmPublic
.dmDuplex
= dm2
->dmPublic
.dmDuplex
;
140 if (dm2
->dmPublic
.dmFields
& DM_YRESOLUTION
)
141 dm1
->dmPublic
.dmYResolution
= dm2
->dmPublic
.dmYResolution
;
142 if (dm2
->dmPublic
.dmFields
& DM_TTOPTION
)
143 dm1
->dmPublic
.dmTTOption
= dm2
->dmPublic
.dmTTOption
;
144 if (dm2
->dmPublic
.dmFields
& DM_COLLATE
)
145 dm1
->dmPublic
.dmCollate
= dm2
->dmPublic
.dmCollate
;
146 if (dm2
->dmPublic
.dmFields
& DM_FORMNAME
)
147 lstrcpynA((LPSTR
)dm1
->dmPublic
.dmFormName
, (LPCSTR
)dm2
->dmPublic
.dmFormName
, CCHFORMNAME
);
148 if (dm2
->dmPublic
.dmFields
& DM_BITSPERPEL
)
149 dm1
->dmPublic
.dmBitsPerPel
= dm2
->dmPublic
.dmBitsPerPel
;
150 if (dm2
->dmPublic
.dmFields
& DM_PELSWIDTH
)
151 dm1
->dmPublic
.dmPelsWidth
= dm2
->dmPublic
.dmPelsWidth
;
152 if (dm2
->dmPublic
.dmFields
& DM_PELSHEIGHT
)
153 dm1
->dmPublic
.dmPelsHeight
= dm2
->dmPublic
.dmPelsHeight
;
154 if (dm2
->dmPublic
.dmFields
& DM_DISPLAYFLAGS
)
155 dm1
->dmPublic
.u2
.dmDisplayFlags
= dm2
->dmPublic
.u2
.dmDisplayFlags
;
156 if (dm2
->dmPublic
.dmFields
& DM_DISPLAYFREQUENCY
)
157 dm1
->dmPublic
.dmDisplayFrequency
= dm2
->dmPublic
.dmDisplayFrequency
;
158 if (dm2
->dmPublic
.dmFields
& DM_POSITION
)
159 dm1
->dmPublic
.u1
.s2
.dmPosition
= dm2
->dmPublic
.u1
.s2
.dmPosition
;
160 if (dm2
->dmPublic
.dmFields
& DM_LOGPIXELS
)
161 dm1
->dmPublic
.dmLogPixels
= dm2
->dmPublic
.dmLogPixels
;
162 if (dm2
->dmPublic
.dmFields
& DM_ICMMETHOD
)
163 dm1
->dmPublic
.dmICMMethod
= dm2
->dmPublic
.dmICMMethod
;
164 if (dm2
->dmPublic
.dmFields
& DM_ICMINTENT
)
165 dm1
->dmPublic
.dmICMIntent
= dm2
->dmPublic
.dmICMIntent
;
166 if (dm2
->dmPublic
.dmFields
& DM_MEDIATYPE
)
167 dm1
->dmPublic
.dmMediaType
= dm2
->dmPublic
.dmMediaType
;
168 if (dm2
->dmPublic
.dmFields
& DM_DITHERTYPE
)
169 dm1
->dmPublic
.dmDitherType
= dm2
->dmPublic
.dmDitherType
;
170 if (dm2
->dmPublic
.dmFields
& DM_PANNINGWIDTH
)
171 dm1
->dmPublic
.dmPanningWidth
= dm2
->dmPublic
.dmPanningWidth
;
172 if (dm2
->dmPublic
.dmFields
& DM_PANNINGHEIGHT
)
173 dm1
->dmPublic
.dmPanningHeight
= dm2
->dmPublic
.dmPanningHeight
;
179 /****************************************************************
182 * Dialog proc for 'Paper' propsheet
184 static INT_PTR CALLBACK
PSDRV_PaperDlgProc(HWND hwnd
, UINT msg
,
185 WPARAM wParam
, LPARAM lParam
)
194 di
= (PSDRV_DLGINFO
*)((PROPSHEETPAGEA
*)lParam
)->lParam
;
195 SetWindowLongPtrW(hwnd
, DWLP_USER
, (LONG_PTR
)di
);
198 LIST_FOR_EACH_ENTRY(ps
, &di
->pi
->ppd
->PageSizes
, PAGESIZE
, entry
) {
199 SendDlgItemMessageA(hwnd
, IDD_PAPERS
, LB_INSERTSTRING
, i
,
200 (LPARAM
)ps
->FullName
);
201 if(di
->pi
->Devmode
->dmPublic
.u1
.s1
.dmPaperSize
== ps
->WinPage
)
205 SendDlgItemMessageA(hwnd
, IDD_PAPERS
, LB_SETCURSEL
, Cursel
, 0);
207 CheckRadioButton(hwnd
, IDD_ORIENT_PORTRAIT
, IDD_ORIENT_LANDSCAPE
,
208 di
->pi
->Devmode
->dmPublic
.u1
.s1
.dmOrientation
==
209 DMORIENT_PORTRAIT
? IDD_ORIENT_PORTRAIT
:
210 IDD_ORIENT_LANDSCAPE
);
212 if(!di
->pi
->ppd
->Duplexes
) {
213 ShowWindow(GetDlgItem(hwnd
, IDD_DUPLEX
), SW_HIDE
);
214 ShowWindow(GetDlgItem(hwnd
, IDD_DUPLEX_NAME
), SW_HIDE
);
217 for(duplex
= di
->pi
->ppd
->Duplexes
, i
= 0; duplex
; duplex
= duplex
->next
, i
++) {
218 SendDlgItemMessageA(hwnd
, IDD_DUPLEX
, CB_INSERTSTRING
, i
,
219 (LPARAM
)(duplex
->FullName
? duplex
->FullName
: duplex
->Name
));
220 if(di
->pi
->Devmode
->dmPublic
.dmDuplex
== duplex
->WinDuplex
)
223 SendDlgItemMessageA(hwnd
, IDD_DUPLEX
, CB_SETCURSEL
, Cursel
, 0);
228 di
= (PSDRV_DLGINFO
*)GetWindowLongPtrW(hwnd
, DWLP_USER
);
229 switch(LOWORD(wParam
)) {
231 if(HIWORD(wParam
) == LBN_SELCHANGE
) {
232 Cursel
= SendDlgItemMessageA(hwnd
, LOWORD(wParam
), LB_GETCURSEL
, 0, 0);
234 LIST_FOR_EACH_ENTRY(ps
, &di
->pi
->ppd
->PageSizes
, PAGESIZE
, entry
) {
235 if(i
>= Cursel
) break;
238 TRACE("Setting pagesize to item %d Winpage = %d\n", Cursel
,
240 di
->dlgdm
->dmPublic
.u1
.s1
.dmPaperSize
= ps
->WinPage
;
243 case IDD_ORIENT_PORTRAIT
:
244 case IDD_ORIENT_LANDSCAPE
:
245 TRACE("Setting orientation to %s\n", wParam
== IDD_ORIENT_PORTRAIT
?
246 "portrait" : "landscape");
247 di
->dlgdm
->dmPublic
.u1
.s1
.dmOrientation
= wParam
== IDD_ORIENT_PORTRAIT
?
248 DMORIENT_PORTRAIT
: DMORIENT_LANDSCAPE
;
251 if(HIWORD(wParam
) == CBN_SELCHANGE
) {
252 Cursel
= SendDlgItemMessageA(hwnd
, LOWORD(wParam
), CB_GETCURSEL
, 0, 0);
253 for(i
= 0, duplex
= di
->pi
->ppd
->Duplexes
; i
< Cursel
; i
++, duplex
= duplex
->next
)
255 TRACE("Setting duplex to item %d Winduplex = %d\n", Cursel
,
257 di
->dlgdm
->dmPublic
.dmDuplex
= duplex
->WinDuplex
;
265 NMHDR
*nmhdr
= (NMHDR
*)lParam
;
266 di
= (PSDRV_DLGINFO
*)GetWindowLongPtrW(hwnd
, DWLP_USER
);
267 switch(nmhdr
->code
) {
269 *di
->pi
->Devmode
= *di
->dlgdm
;
270 SetWindowLongPtrW(hwnd
, DWLP_MSGRESULT
, PSNRET_NOERROR
);
286 static void (WINAPI
*pInitCommonControls
) (void);
287 static HPROPSHEETPAGE (WINAPI
*pCreatePropertySheetPage
) (LPCPROPSHEETPAGEW
);
288 static int (WINAPI
*pPropertySheet
) (LPCPROPSHEETHEADERW
);
291 /******************************************************************
292 * PSDRV_ExtDeviceMode
294 * Retrieves or modifies device-initialization information for the PostScript
295 * driver, or displays a driver-supplied dialog box for configuring the driver.
298 * lpszDriver -- Driver name
299 * hwnd -- Parent window for the dialog box
300 * lpdmOutput -- Address of a DEVMODE structure for writing initialization information
301 * lpszDevice -- Device name
302 * lpszPort -- Port name
303 * lpdmInput -- Address of a DEVMODE structure for reading initialization information
304 * lpProfile -- Name of initialization file, defaults to WIN.INI if NULL
305 * wMode -- Operation to perform. Can be a combination if > 0.
306 * (0) -- Returns number of bytes required by DEVMODE structure
307 * DM_UPDATE (1) -- Write current settings to environment and initialization file
308 * DM_COPY (2) -- Write current settings to lpdmOutput
309 * DM_PROMPT (4) -- Presents the driver's modal dialog box (USER.240)
310 * DM_MODIFY (8) -- Changes current settings according to lpdmInput before any other operation
313 * Returns size of DEVMODE structure if wMode is 0. Otherwise, IDOK is returned for success
314 * for both dialog and non-dialog operations. IDCANCEL is returned if the dialog box was cancelled.
315 * A return value less than zero is returned if a non-dialog operation fails.
319 * Just returns default devmode at the moment. No use of initialization file.
321 INT CDECL
PSDRV_ExtDeviceMode(LPSTR lpszDriver
, HWND hwnd
, LPDEVMODEA lpdmOutput
,
322 LPSTR lpszDevice
, LPSTR lpszPort
, LPDEVMODEA lpdmInput
,
323 LPSTR lpszProfile
, DWORD dwMode
)
325 PRINTERINFO
*pi
= PSDRV_FindPrinterInfo(lpszDevice
);
328 TRACE("(Driver=%s, hwnd=%p, devOut=%p, Device='%s', Port='%s', devIn=%p, Profile='%s', Mode=%04x)\n",
329 lpszDriver
, hwnd
, lpdmOutput
, lpszDevice
, lpszPort
, lpdmInput
, lpszProfile
, dwMode
);
331 /* If dwMode == 0, return size of DEVMODE structure */
333 return pi
->Devmode
->dmPublic
.dmSize
+ pi
->Devmode
->dmPublic
.dmDriverExtra
;
335 /* If DM_MODIFY is set, change settings in accordance with lpdmInput */
336 if((dwMode
& DM_MODIFY
) && lpdmInput
) {
337 TRACE("DM_MODIFY set. devIn->dmFields = %08x\n", lpdmInput
->dmFields
);
338 PSDRV_MergeDevmodes(pi
->Devmode
, (PSDRV_DEVMODEA
*)lpdmInput
, pi
);
341 /* If DM_PROMPT is set, present modal dialog box */
342 if(dwMode
& DM_PROMPT
) {
343 HINSTANCE hinstComctl32
;
344 HPROPSHEETPAGE hpsp
[1];
346 PROPSHEETHEADERW psh
;
348 PSDRV_DEVMODEA
*dlgdm
;
349 static const WCHAR PAPERW
[] = {'P','A','P','E','R','\0'};
350 static const WCHAR SetupW
[] = {'S','e','t','u','p','\0'};
352 hinstComctl32
= LoadLibraryA("comctl32.dll");
353 pInitCommonControls
= (void*)GetProcAddress(hinstComctl32
,
354 "InitCommonControls");
355 pCreatePropertySheetPage
= (void*)GetProcAddress(hinstComctl32
,
356 "CreatePropertySheetPageW");
357 pPropertySheet
= (void*)GetProcAddress(hinstComctl32
, "PropertySheetW");
358 memset(&psp
,0,sizeof(psp
));
359 dlgdm
= HeapAlloc( PSDRV_Heap
, 0, sizeof(*dlgdm
) );
360 *dlgdm
= *pi
->Devmode
;
361 di
= HeapAlloc( PSDRV_Heap
, 0, sizeof(*di
) );
364 psp
.dwSize
= sizeof(psp
);
365 psp
.hInstance
= PSDRV_hInstance
;
366 psp
.u
.pszTemplate
= PAPERW
;
367 psp
.u2
.pszIcon
= NULL
;
368 psp
.pfnDlgProc
= PSDRV_PaperDlgProc
;
369 psp
.lParam
= (LPARAM
)di
;
370 hpsp
[0] = pCreatePropertySheetPage(&psp
);
372 memset(&psh
, 0, sizeof(psh
));
373 psh
.dwSize
= sizeof(psh
);
374 psh
.pszCaption
= SetupW
;
376 psh
.hwndParent
= HWND_32(hwnd
);
377 psh
.u3
.phpage
= hpsp
;
379 pPropertySheet(&psh
);
383 /* If DM_UPDATE is set, should write settings to environment and initialization file */
384 if(dwMode
& DM_UPDATE
)
385 FIXME("Mode DM_UPDATE. Just do the same as DM_COPY\n");
387 /* If DM_COPY is set, should write settings to lpdmOutput */
388 if((dwMode
& DM_COPY
) || (dwMode
& DM_UPDATE
)) {
390 memcpy(lpdmOutput
, pi
->Devmode
, pi
->Devmode
->dmPublic
.dmSize
+ pi
->Devmode
->dmPublic
.dmDriverExtra
);
392 FIXME("lpdmOutput is NULL what should we do??\n");
396 /***********************************************************************
397 * PSDRV_DeviceCapabilities
399 * Retrieves the capabilities of a printer device driver.
402 * lpszDriver -- printer driver name
403 * lpszDevice -- printer name
404 * lpszPort -- port name
405 * fwCapability -- device capability
406 * lpszOutput -- output buffer
407 * lpDevMode -- device data buffer
410 * Result depends on the setting of fwCapability. -1 indicates failure.
412 DWORD CDECL
PSDRV_DeviceCapabilities(LPSTR lpszDriver
, LPCSTR lpszDevice
, LPCSTR lpszPort
,
413 WORD fwCapability
, LPSTR lpszOutput
, LPDEVMODEA lpDevMode
)
418 pi
= PSDRV_FindPrinterInfo(lpszDevice
);
420 TRACE("%s %s %s, %u, %p, %p\n", debugstr_a(lpszDriver
), debugstr_a(lpszDevice
),
421 debugstr_a(lpszPort
), fwCapability
, lpszOutput
, lpDevMode
);
424 ERR("no printer info for %s %s, return 0!\n",
425 debugstr_a(lpszDriver
), debugstr_a(lpszDevice
));
429 lpdm
= lpDevMode
? lpDevMode
: (DEVMODEA
*)pi
->Devmode
;
431 switch(fwCapability
) {
436 WORD
*wp
= (WORD
*)lpszOutput
;
439 LIST_FOR_EACH_ENTRY(ps
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
)
441 TRACE("DC_PAPERS: %u\n", ps
->WinPage
);
443 if(lpszOutput
!= NULL
)
452 POINT16
*pt
= (POINT16
*)lpszOutput
;
455 LIST_FOR_EACH_ENTRY(ps
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
)
457 TRACE("DC_PAPERSIZE: %f x %f\n", ps
->PaperDimension
->x
, ps
->PaperDimension
->y
);
459 if(lpszOutput
!= NULL
) {
460 pt
->x
= ps
->PaperDimension
->x
* 254.0 / 72.0;
461 pt
->y
= ps
->PaperDimension
->y
* 254.0 / 72.0;
471 char *cp
= lpszOutput
;
474 LIST_FOR_EACH_ENTRY(ps
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
)
476 TRACE("DC_PAPERNAMES: %s\n", debugstr_a(ps
->FullName
));
478 if(lpszOutput
!= NULL
) {
479 lstrcpynA(cp
, ps
->FullName
, 64);
487 return pi
->ppd
->LandscapeOrientation
? pi
->ppd
->LandscapeOrientation
: 90;
492 WORD
*wp
= (WORD
*)lpszOutput
;
495 for(slot
= pi
->ppd
->InputSlots
; slot
; slot
= slot
->next
, i
++)
496 if(lpszOutput
!= NULL
)
497 *wp
++ = slot
->WinBin
;
504 char *cp
= lpszOutput
;
507 for(slot
= pi
->ppd
->InputSlots
; slot
; slot
= slot
->next
, i
++)
508 if(lpszOutput
!= NULL
) {
509 lstrcpynA(cp
, slot
->FullName
, 24);
516 FIXME("DC_BINADJUST: stub.\n");
517 return DCBA_FACEUPNONE
;
519 case DC_ENUMRESOLUTIONS
:
521 LONG
*lp
= (LONG
*)lpszOutput
;
523 if(lpszOutput
!= NULL
) {
524 lp
[0] = pi
->ppd
->DefaultResolution
;
525 lp
[1] = pi
->ppd
->DefaultResolution
;
530 /* Windows returns 9999 too */
532 TRACE("DC_COPIES: returning 9999\n");
536 return lpdm
->dmDriverVersion
;
538 case DC_DATATYPE_PRODUCED
:
539 FIXME("DATA_TYPE_PRODUCED: stub.\n");
540 return -1; /* simulate that the driver supports 'RAW' */
544 if(pi
->ppd
->DefaultDuplex
&& pi
->ppd
->DefaultDuplex
->WinDuplex
!= 0)
546 TRACE("DC_DUPLEX: returning %d\n", ret
);
549 case DC_EMF_COMPLIANT
:
550 FIXME("DC_EMF_COMPLIANT: stub.\n");
551 return -1; /* simulate that the driver do not support EMF */
554 return lpdm
->dmDriverExtra
;
557 return lpdm
->dmFields
;
559 case DC_FILEDEPENDENCIES
:
560 FIXME("DC_FILEDEPENDENCIES: stub.\n");
567 ptMax
.x
= ptMax
.y
= 0;
569 LIST_FOR_EACH_ENTRY(ps
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
)
571 if(ps
->PaperDimension
->x
> ptMax
.x
)
572 ptMax
.x
= ps
->PaperDimension
->x
;
573 if(ps
->PaperDimension
->y
> ptMax
.y
)
574 ptMax
.y
= ps
->PaperDimension
->y
;
576 return MAKELONG(ptMax
.x
* 254.0 / 72.0, ptMax
.y
* 254.0 / 72.0 );
583 ptMin
.x
= ptMin
.y
= -1;
585 LIST_FOR_EACH_ENTRY(ps
, &pi
->ppd
->PageSizes
, PAGESIZE
, entry
)
587 if(ptMin
.x
== -1 || ps
->PaperDimension
->x
< ptMin
.x
)
588 ptMin
.x
= ps
->PaperDimension
->x
;
589 if(ptMin
.y
== -1 || ps
->PaperDimension
->y
< ptMin
.y
)
590 ptMin
.y
= ps
->PaperDimension
->y
;
592 return MAKELONG(ptMin
.x
* 254.0 / 72.0, ptMin
.y
* 254.0 / 72.0);
599 FIXME("DC_TRUETYPE: stub\n");
603 return lpdm
->dmSpecVersion
;
605 /* We'll just return false here, very few printers can collate anyway */
607 TRACE("DC_COLLATE: returning FALSE\n");
610 /* Printer supports colour printing - 1 if yes, 0 if no (Win2k/XP only) */
612 return (pi
->ppd
->ColorDevice
!= CD_False
) ? TRUE
: FALSE
;
614 /* Identification number of the printer manufacturer for use with ICM (Win9x only) */
615 case DC_MANUFACTURER
:
616 FIXME("DC_MANUFACTURER: stub\n");
619 /* Identification number of the printer model for use with ICM (Win9x only) */
621 FIXME("DC_MODEL: stub\n");
624 /* Nonzero if the printer supports stapling, zero otherwise (Win2k/XP only) */
625 case DC_STAPLE
: /* WINVER >= 0x0500 */
626 FIXME("DC_STAPLE: stub\n");
629 /* Returns an array of 64-character string buffers containing the names of the paper forms
630 * available for use, unless pOutput is NULL. The return value is the number of paper forms.
633 case DC_MEDIAREADY
: /* WINVER >= 0x0500 */
634 FIXME("DC_MEDIAREADY: stub\n");
637 /* Returns an array of 64-character string buffers containing the names of the supported
638 * media types, unless pOutput is NULL. The return value is the number of supported.
639 * media types (XP only)
641 case DC_MEDIATYPENAMES
: /* WINVER >= 0x0501 */
642 FIXME("DC_MEDIATYPENAMES: stub\n");
645 /* Returns an array of DWORD values which represent the supported media types, unless
646 * pOutput is NULL. The return value is the number of supported media types. (XP only)
648 case DC_MEDIATYPES
: /* WINVER >= 0x0501 */
649 FIXME("DC_MEDIATYPES: stub\n");
652 /* Returns an array of DWORD values, each representing a supported number of document
653 * pages per printed page, unless pOutput is NULL. The return value is the number of
654 * array entries. (Win2k/XP only)
657 FIXME("DC_NUP: stub\n");
660 /* Returns an array of 32-character string buffers containing a list of printer description
661 * languages supported by the printer, unless pOutput is NULL. The return value is
662 * number of array entries. (Win2k/XP only)
665 case DC_PERSONALITY
: /* WINVER >= 0x0500 */
666 FIXME("DC_PERSONALITY: stub\n");
669 /* Returns the amount of printer memory in kilobytes. (Win2k/XP only) */
670 case DC_PRINTERMEM
: /* WINVER >= 0x0500 */
671 FIXME("DC_PRINTERMEM: stub\n");
674 /* Returns the printer's print rate in PRINTRATEUNIT units. (Win2k/XP only) */
675 case DC_PRINTRATE
: /* WINVER >= 0x0500 */
676 FIXME("DC_PRINTRATE: stub\n");
679 /* Returns the printer's print rate in pages per minute. (Win2k/XP only) */
680 case DC_PRINTRATEPPM
: /* WINVER >= 0x0500 */
681 FIXME("DC_PRINTRATEPPM: stub\n");
684 /* Returns the printer rate unit used for DC_PRINTRATE, which is one of
685 * PRINTRATEUNIT_{CPS,IPM,LPM,PPM} (Win2k/XP only)
687 case DC_PRINTRATEUNIT
: /* WINVER >= 0x0500 */
688 FIXME("DC_PRINTRATEUNIT: stub\n");
692 FIXME("Unsupported capability %d\n", fwCapability
);
701 HPROPSHEETPAGE hPages
[10];
704 INT
PSDRV_ExtDeviceModePropSheet(HWND hwnd
, LPSTR lpszDevice
, LPSTR lpszPort
,
707 EDMPS
*ps
= pPropSheet
;
710 psp
->dwSize
= sizeof(psp
);
711 psp
->hInstance
= 0x1234;