-Fixed MESSAGE functions that were thunking down to 16 bits implementation.
[wine] / graphics / psdrv / driver.c
1 /*
2  * Exported functions from the PostScript driver.
3  *
4  * [Ext]DeviceMode, DeviceCapabilities, AdvancedSetupDialog. 
5  *
6  * Will need ExtTextOut for winword6 (urgh!)
7  *
8  * Copyright 1998  Huw D M Davies
9  *
10  */
11
12 #include <string.h>
13 #include "windows.h"
14 #include "psdrv.h"
15 #include "debug.h"
16 #include "resource.h"
17 #include "win.h"
18 #include "print.h"
19
20 static LONG Resolutions[][2] = { {600,600} };
21
22
23 /************************************************************************
24  *
25  *              PSDRV_MergeDevmodes
26  *
27  * Updates dm1 with some fields from dm2
28  *
29  */
30 void PSDRV_MergeDevmodes(PSDRV_DEVMODE16 *dm1, PSDRV_DEVMODE16 *dm2,
31                          PRINTERINFO *pi)
32 {
33     /* some sanity checks here on dm2 */
34     if(dm2->dmPublic.dmFields & DM_ORIENTATION)
35         dm1->dmPublic.dmOrientation = dm2->dmPublic.dmOrientation;
36             /* NB PaperWidth is always < PaperLength */
37         
38     if(dm2->dmPublic.dmFields & DM_PAPERSIZE) {
39         PAGESIZE *page;
40
41         for(page = pi->ppd->PageSizes; page; page = page->next) {
42             if(page->WinPage == dm2->dmPublic.dmPaperSize)
43                 break;
44         }
45         if(page) {
46             dm1->dmPublic.dmPaperSize = dm2->dmPublic.dmPaperSize;
47             dm1->dmPublic.dmPaperWidth = page->PaperDimension->x * 
48                                                                 254.0 / 72.0;
49             dm1->dmPublic.dmPaperLength = page->PaperDimension->y *
50                                                                 254.0 / 72.0;
51             TRACE(psdrv, "Changing page to %s %d x %d\n", page->FullName,
52                      dm1->dmPublic.dmPaperWidth, dm1->dmPublic.dmPaperLength );
53         } else {
54             TRACE(psdrv, "Trying to change to unsupported pagesize %d\n",
55                       dm2->dmPublic.dmPaperSize);
56         }
57     }
58
59     if(dm2->dmPublic.dmFields & DM_DEFAULTSOURCE) {
60         INPUTSLOT *slot;
61         
62         for(slot = pi->ppd->InputSlots; slot; slot = slot->next) {
63             if(slot->WinBin == dm2->dmPublic.dmDefaultSource)
64                 break;
65         }
66         if(slot) {
67             dm1->dmPublic.dmDefaultSource = dm2->dmPublic.dmDefaultSource;
68             TRACE(psdrv, "Changing bin to '%s'\n", slot->FullName);
69         } else {
70           TRACE(psdrv, "Trying to change to unsupported bin %d\n",
71                 dm2->dmPublic.dmDefaultSource);
72         }
73     }
74
75     /* etc */
76
77     return;
78 }
79
80
81 #if 0
82 /*******************************************************************
83  *
84  *              PSDRV_NewPrinterDlgProc32
85  *
86  *
87  */
88 LRESULT WINAPI PSDRV_NewPrinterDlgProc32(HWND32 hWnd, UINT32 wMsg,
89                                             WPARAM32 wParam, LPARAM lParam)
90 {
91   switch (wMsg) {
92   case WM_INITDIALOG:
93     TRACE(psdrv,"WM_INITDIALOG lParam=%08lX\n", lParam);
94     ShowWindow32(hWnd, SW_SHOWNORMAL);
95     return TRUE;
96  
97   case WM_COMMAND:
98     switch (LOWORD(wParam)) {
99     case IDOK:
100       EndDialog32(hWnd, TRUE);
101       return TRUE;
102   
103     case IDCANCEL:
104       EndDialog32(hWnd, FALSE);
105       return TRUE;
106     
107     default:
108       return FALSE;
109     }
110   
111   default:
112     return FALSE;
113   }
114 }
115
116 LRESULT WINAPI PSDRV_AdvancedSetupDlgProc32(HWND32 hWnd, UINT32 wMsg,
117                                             WPARAM32 wParam, LPARAM lParam)
118 {
119   switch (wMsg) {
120   case WM_INITDIALOG:
121     TRACE(psdrv,"WM_INITDIALOG lParam=%08lX\n", lParam);
122     SendDlgItemMessage32A(hWnd, 99, CB_ADDSTRING32, 0, 
123                           (LPARAM)"Default Tray");
124     ShowWindow32(hWnd, SW_SHOWNORMAL);
125     return TRUE;
126
127   case WM_COMMAND:
128     switch (LOWORD(wParam)) {
129     case IDOK:
130       EndDialog32(hWnd, TRUE);
131       return TRUE;
132
133     case IDCANCEL:
134       EndDialog32(hWnd, FALSE);
135       return TRUE;
136
137     case 200:
138       DialogBoxIndirectParam32A( WIN_GetWindowInstance( hWnd ),
139                           SYSRES_GetResPtr( SYSRES_DIALOG_PSDRV_NEWPRINTER ),
140                           hWnd, PSDRV_NewPrinterDlgProc32, (LPARAM) NULL );
141       return TRUE;
142
143     default:
144       return FALSE;
145     }
146
147   default:    
148     return FALSE;
149   }
150 }
151 #endif /* 0 */
152
153 /**************************************************************
154  *
155  *      PSDRV_AdvancedSetupDialog16     [WINEPS.93]
156  *
157  */
158 WORD WINAPI PSDRV_AdvancedSetupDialog16(HWND16 hwnd, HANDLE16 hDriver,
159                                          LPDEVMODE16 devin, LPDEVMODE16 devout)
160 {
161
162   TRACE(psdrv, "hwnd = %04x, hDriver = %04x devin=%p devout=%p\n", hwnd,
163         hDriver, devin, devout);
164   return IDCANCEL;
165
166
167 #if 0
168   return DialogBoxIndirectParam32A( WIN_GetWindowInstance( hwnd ),
169         SYSRES_GetResPtr( SYSRES_DIALOG_PSDRV_ADVANCEDSETUP ),
170         hwnd, PSDRV_AdvancedSetupDlgProc32, (LPARAM) NULL );
171 #endif
172
173
174 }
175
176 /***************************************************************
177  *
178  *      PSDRV_ExtDeviceMode16   [WINEPS.90]
179  *
180  * Just returns default devmode at the moment
181  */
182 INT16 WINAPI PSDRV_ExtDeviceMode16(HWND16 hwnd, HANDLE16 hDriver,
183 LPDEVMODE16 lpdmOutput, LPSTR lpszDevice, LPSTR lpszPort,
184 LPDEVMODE16 lpdmInput, LPSTR lpszProfile, WORD fwMode)
185 {
186   PRINTERINFO *pi = PSDRV_FindPrinterInfo(lpszDevice);
187
188   TRACE(psdrv,
189 "(hwnd=%04x, hDriver=%04x, devOut=%p, Device='%s', Port='%s', devIn=%p, Profile='%s', Mode=%04x)\n",
190 hwnd, hDriver, lpdmOutput, lpszDevice, lpszPort, lpdmInput, lpszProfile,
191 fwMode);
192
193   if(!fwMode)
194     return sizeof(DEVMODE16); /* Just copy dmPublic bit of PSDRV_DEVMODE */
195
196   if((fwMode & DM_PROMPT) || (fwMode & DM_UPDATE))
197     FIXME(psdrv, "Mode %d not implemented\n", fwMode);
198
199   if(fwMode & DM_MODIFY) {
200     TRACE(psdrv, "DM_MODIFY set. devIn->dmFields = %08lx\n", lpdmInput->dmFields);
201     PSDRV_MergeDevmodes(pi->Devmode, (PSDRV_DEVMODE16 *)lpdmInput, pi);
202   }
203
204   if(fwMode & DM_COPY) {
205     memcpy(lpdmOutput, pi->Devmode, sizeof(DEVMODE16));
206   }
207   return IDOK;
208 }
209
210
211 /***************************************************************
212  *
213  *      PSDRV_DeviceCapabilities16      [WINEPS.91]
214  *
215  */
216 DWORD WINAPI PSDRV_DeviceCapabilities16(LPSTR lpszDevice, LPSTR lpszPort,
217   WORD fwCapability, LPSTR lpszOutput, LPDEVMODE16 lpdm)
218 {
219   PRINTERINFO *pi;
220
221   pi = PSDRV_FindPrinterInfo(lpszDevice);
222   TRACE(psdrv, "Cap=%d. Got PrinterInfo = %p\n", fwCapability, pi);
223
224   switch(fwCapability) {
225
226   case DC_PAPERS:
227     {
228       PAGESIZE *ps;
229       WORD *wp = (WORD *)lpszOutput;
230       int i = 0;
231
232       for(ps = pi->ppd->PageSizes; ps; ps = ps->next, i++)
233         if(lpszOutput != NULL)
234           *wp++ = ps->WinPage;
235       return i;
236     }
237
238   case DC_PAPERSIZE:
239     {
240       PAGESIZE *ps;
241       POINT16 *pt = (POINT16 *)lpszOutput;
242       int i = 0;
243
244       for(ps = pi->ppd->PageSizes; ps; ps = ps->next, i++)
245         if(lpszOutput != NULL) {
246           pt->x = ps->PaperDimension->x * 254.0 / 72.0;
247           pt->y = ps->PaperDimension->y * 254.0 / 72.0;
248           pt++;
249         }
250       return i;
251     }
252
253   case DC_PAPERNAMES:
254     {
255       PAGESIZE *ps;
256       char *cp = lpszOutput;
257       int i = 0;
258
259       for(ps = pi->ppd->PageSizes; ps; ps = ps->next, i++)
260         if(lpszOutput != NULL) {
261           strncpy(cp, ps->FullName, 64);
262           *(cp + 63) = '\0';
263           cp += 64;
264         }
265       return i;
266     }
267
268   case DC_ORIENTATION:
269     return pi->ppd->LandscapeOrientation ? pi->ppd->LandscapeOrientation : 90;
270
271   case DC_BINS:
272     {
273       INPUTSLOT *slot;
274       WORD *wp = (WORD *)lpszOutput;
275       int i = 0;
276
277       for(slot = pi->ppd->InputSlots; slot; slot = slot->next, i++)
278         if(lpszOutput != NULL)
279           *wp++ = slot->WinBin;
280       return i;
281     }
282
283   case DC_BINNAMES:
284     {
285       INPUTSLOT *slot;
286       char *cp = lpszOutput;
287       int i = 0;
288       
289       for(slot = pi->ppd->InputSlots; slot; slot = slot->next, i++)
290         if(lpszOutput != NULL) {
291           strncpy(cp, slot->FullName, 24);
292           *(cp + 23) = '\0';
293           cp += 24;
294         }
295       return i;
296     }
297
298   case DC_ENUMRESOLUTIONS:
299     if(lpszOutput != NULL)
300       memcpy(lpszOutput, Resolutions, sizeof(Resolutions));
301     return sizeof(Resolutions) / sizeof(Resolutions[0]);
302
303
304   default:
305     FIXME(psdrv, "Unsupported capability %d\n", fwCapability);
306   }
307   return -1;
308 }
309
310 /***************************************************************
311  *
312  *      PSDRV_DeviceMode16      [WINEPS.13]
313  *
314  */
315 void WINAPI PSDRV_DeviceMode16(HWND16 hwnd, HANDLE16 hDriver,
316 LPSTR lpszDevice, LPSTR lpszPort)
317 {
318     PSDRV_ExtDeviceMode16( hwnd, hDriver, NULL, lpszDevice, lpszPort, NULL, 
319                            NULL, DM_PROMPT );
320     return;
321 }