comparison src/device-msw.c @ 404:2f8bb876ab1d r21-2-32

Import from CVS: tag r21-2-32
author cvs
date Mon, 13 Aug 2007 11:16:07 +0200
parents a86b2b5e0111
children 501cfd01ee6d
comparison
equal deleted inserted replaced
403:9f011ab08d48 404:2f8bb876ab1d
38 #include "events.h" 38 #include "events.h"
39 #include "faces.h" 39 #include "faces.h"
40 #include "frame.h" 40 #include "frame.h"
41 #include "sysdep.h" 41 #include "sysdep.h"
42 42
43 #if (defined (__CYGWIN32__) || defined(__MINGW32__)) && \
44 CYGWIN_VERSION_DLL_MAJOR < 21
45 extern BOOL WINAPI DdeFreeStringHandle(DWORD,HSZ);
46 #else
43 #include <winspool.h> 47 #include <winspool.h>
48 #endif
49
50 #if !(defined (__CYGWIN32__) || defined(__MINGW32__))
51 # include <objbase.h> /* For CoInitialize */
52 #endif
44 53
45 /* win32 DDE management library globals */ 54 /* win32 DDE management library globals */
46 #ifdef HAVE_DRAGNDROP 55 #ifdef HAVE_DRAGNDROP
47 DWORD mswindows_dde_mlid; 56 DWORD mswindows_dde_mlid;
48 HSZ mswindows_dde_service; 57 HSZ mswindows_dde_service;
127 DEVICE_MSWINDOWS_VERTRES(d) = GetDeviceCaps(hdc, VERTRES); 136 DEVICE_MSWINDOWS_VERTRES(d) = GetDeviceCaps(hdc, VERTRES);
128 DEVICE_MSWINDOWS_HORZSIZE(d) = GetDeviceCaps(hdc, HORZSIZE); 137 DEVICE_MSWINDOWS_HORZSIZE(d) = GetDeviceCaps(hdc, HORZSIZE);
129 DEVICE_MSWINDOWS_VERTSIZE(d) = GetDeviceCaps(hdc, VERTSIZE); 138 DEVICE_MSWINDOWS_VERTSIZE(d) = GetDeviceCaps(hdc, VERTSIZE);
130 DEVICE_MSWINDOWS_BITSPIXEL(d) = GetDeviceCaps(hdc, BITSPIXEL); 139 DEVICE_MSWINDOWS_BITSPIXEL(d) = GetDeviceCaps(hdc, BITSPIXEL);
131 DEVICE_MSWINDOWS_FONTLIST (d) = mswindows_enumerate_fonts (hdc); 140 DEVICE_MSWINDOWS_FONTLIST (d) = mswindows_enumerate_fonts (hdc);
132 141
133 DeleteDC (hdc); 142 DEVICE_MSWINDOWS_HCDC(d) = hdc;
134 143
135 /* Register the main window class */ 144 /* Register the main window class */
136 wc.cbSize = sizeof (WNDCLASSEX); 145 wc.cbSize = sizeof (WNDCLASSEX);
137 wc.style = CS_OWNDC; /* One DC per window */ 146 wc.style = CS_OWNDC; /* One DC per window */
138 wc.lpfnWndProc = (WNDPROC) mswindows_wnd_proc; 147 wc.lpfnWndProc = (WNDPROC) mswindows_wnd_proc;
172 mswindows_finish_init_device (struct device *d, Lisp_Object props) 181 mswindows_finish_init_device (struct device *d, Lisp_Object props)
173 { 182 {
174 /* Initialize DDE management library and our related globals. We execute a 183 /* Initialize DDE management library and our related globals. We execute a
175 * dde Open("file") by simulating a drop, so this depends on dnd support. */ 184 * dde Open("file") by simulating a drop, so this depends on dnd support. */
176 #ifdef HAVE_DRAGNDROP 185 #ifdef HAVE_DRAGNDROP
186 # if !(defined(__CYGWIN32__) || defined(__MINGW32__))
187 CoInitialize (NULL);
188 # endif
189
177 mswindows_dde_mlid = 0; 190 mswindows_dde_mlid = 0;
178 DdeInitialize (&mswindows_dde_mlid, (PFNCALLBACK)mswindows_dde_callback, 191 DdeInitialize (&mswindows_dde_mlid, (PFNCALLBACK)mswindows_dde_callback,
179 APPCMD_FILTERINITS|CBF_FAIL_SELFCONNECTIONS|CBF_FAIL_ADVISES| 192 APPCMD_FILTERINITS|CBF_FAIL_SELFCONNECTIONS|CBF_FAIL_ADVISES|
180 CBF_FAIL_POKES|CBF_FAIL_REQUESTS|CBF_SKIP_ALLNOTIFICATIONS, 0); 193 CBF_FAIL_POKES|CBF_FAIL_REQUESTS|CBF_SKIP_ALLNOTIFICATIONS,
194 0);
181 195
182 mswindows_dde_service = DdeCreateStringHandle (mswindows_dde_mlid, XEMACS_CLASS, 0); 196 mswindows_dde_service = DdeCreateStringHandle (mswindows_dde_mlid,
183 mswindows_dde_topic_system = DdeCreateStringHandle (mswindows_dde_mlid, SZDDESYS_TOPIC, 0); 197 XEMACS_CLASS, 0);
198 mswindows_dde_topic_system = DdeCreateStringHandle (mswindows_dde_mlid,
199 SZDDESYS_TOPIC, 0);
184 mswindows_dde_item_open = DdeCreateStringHandle (mswindows_dde_mlid, 200 mswindows_dde_item_open = DdeCreateStringHandle (mswindows_dde_mlid,
185 TEXT(MSWINDOWS_DDE_ITEM_OPEN), 0); 201 TEXT(MSWINDOWS_DDE_ITEM_OPEN), 0);
186 DdeNameService (mswindows_dde_mlid, mswindows_dde_service, 0L, DNS_REGISTER); 202 DdeNameService (mswindows_dde_mlid, mswindows_dde_service, 0L, DNS_REGISTER);
187 #endif 203 #endif
188 } 204 }
194 DdeNameService (mswindows_dde_mlid, 0L, 0L, DNS_UNREGISTER); 210 DdeNameService (mswindows_dde_mlid, 0L, 0L, DNS_UNREGISTER);
195 DdeFreeStringHandle (mswindows_dde_mlid, mswindows_dde_item_open); 211 DdeFreeStringHandle (mswindows_dde_mlid, mswindows_dde_item_open);
196 DdeFreeStringHandle (mswindows_dde_mlid, mswindows_dde_topic_system); 212 DdeFreeStringHandle (mswindows_dde_mlid, mswindows_dde_topic_system);
197 DdeFreeStringHandle (mswindows_dde_mlid, mswindows_dde_service); 213 DdeFreeStringHandle (mswindows_dde_mlid, mswindows_dde_service);
198 DdeUninitialize (mswindows_dde_mlid); 214 DdeUninitialize (mswindows_dde_mlid);
199 #endif 215
200 216 # if !(defined(__CYGWIN32__) || defined(__MINGW32__))
217 CoUninitialize ();
218 # endif
219 #endif
220
221 DeleteDC (DEVICE_MSWINDOWS_HCDC(d));
201 free (d->device_data); 222 free (d->device_data);
223 }
224
225 void
226 msw_get_workspace_coords (RECT *rc)
227 {
228 SystemParametersInfo (SPI_GETWORKAREA, 0, rc, 0);
202 } 229 }
203 230
204 static void 231 static void
205 mswindows_mark_device (struct device *d) 232 mswindows_mark_device (struct device *d)
206 { 233 {
269 #undef FROB 296 #undef FROB
270 297
271 case DM_size_workspace: 298 case DM_size_workspace:
272 { 299 {
273 RECT rc; 300 RECT rc;
274 SystemParametersInfo (SPI_GETWORKAREA, 0, &rc, 0); 301 msw_get_workspace_coords (&rc);
275 return Fcons (make_int (rc.right - rc.left), 302 return Fcons (make_int (rc.right - rc.left),
276 make_int (rc.bottom - rc.top)); 303 make_int (rc.bottom - rc.top));
277 } 304 }
305
306 case DM_offset_workspace:
307 {
308 RECT rc;
309 msw_get_workspace_coords (&rc);
310 return Fcons (make_int (rc.left), make_int (rc.top));
311 }
312
278 /* 313 /*
279 case DM_size_toolbar: 314 case DM_size_toolbar:
280 case DM_size_toolbar_button: 315 case DM_size_toolbar_button:
281 case DM_size_toolbar_border: 316 case DM_size_toolbar_border:
282 */ 317 */
342 DEVICE_MSPRINTER_HDC (d) = CreateDC ("WINSPOOL", printer_name, 377 DEVICE_MSPRINTER_HDC (d) = CreateDC ("WINSPOOL", printer_name,
343 NULL, NULL); 378 NULL, NULL);
344 if (DEVICE_MSPRINTER_HDC (d) == NULL) 379 if (DEVICE_MSPRINTER_HDC (d) == NULL)
345 signal_open_printer_error (d); 380 signal_open_printer_error (d);
346 381
382 DEVICE_MSPRINTER_HCDC(d) =
383 CreateCompatibleDC (DEVICE_MSPRINTER_HDC (d));
384
347 /* Determinie DEVMODE size and store the default DEVMODE */ 385 /* Determinie DEVMODE size and store the default DEVMODE */
348 DEVICE_MSPRINTER_DEVMODE_SIZE(d) = 386 DEVICE_MSPRINTER_DEVMODE_SIZE(d) =
349 DocumentProperties (NULL, DEVICE_MSPRINTER_HPRINTER(d), 387 DocumentProperties (NULL, DEVICE_MSPRINTER_HPRINTER(d),
350 printer_name, NULL, NULL, 0); 388 printer_name, NULL, NULL, 0);
351 if (DEVICE_MSPRINTER_DEVMODE_SIZE(d) <= 0) 389 if (DEVICE_MSPRINTER_DEVMODE_SIZE(d) <= 0)
352 signal_open_printer_error (d); 390 signal_open_printer_error (d);
353 391
409 { 447 {
410 if (DEVICE_MSPRINTER_HPRINTER (d)) 448 if (DEVICE_MSPRINTER_HPRINTER (d))
411 ClosePrinter (DEVICE_MSPRINTER_HPRINTER (d)); 449 ClosePrinter (DEVICE_MSPRINTER_HPRINTER (d));
412 if (DEVICE_MSPRINTER_HDC (d)) 450 if (DEVICE_MSPRINTER_HDC (d))
413 DeleteDC (DEVICE_MSPRINTER_HDC (d)); 451 DeleteDC (DEVICE_MSPRINTER_HDC (d));
452 if (DEVICE_MSPRINTER_HCDC (d))
453 DeleteDC (DEVICE_MSPRINTER_HCDC (d));
414 if (DEVICE_MSPRINTER_NAME (d)) 454 if (DEVICE_MSPRINTER_NAME (d))
415 free (DEVICE_MSPRINTER_NAME (d)); 455 free (DEVICE_MSPRINTER_NAME (d));
416 if (DEVICE_MSPRINTER_DEVMODE (d)) 456 if (DEVICE_MSPRINTER_DEVMODE (d))
417 free (DEVICE_MSPRINTER_DEVMODE (d)); 457 free (DEVICE_MSPRINTER_DEVMODE (d));
418 if (DEVICE_MSPRINTER_DEVMODE_MIRROR (d)) 458 if (DEVICE_MSPRINTER_DEVMODE_MIRROR (d))
479 DEVICE_MSPRINTER_HPRINTER(d), 519 DEVICE_MSPRINTER_HPRINTER(d),
480 DEVICE_MSPRINTER_NAME(d), 520 DEVICE_MSPRINTER_NAME(d),
481 devmode, devmode, 521 devmode, devmode,
482 DM_IN_BUFFER | DM_OUT_BUFFER); 522 DM_IN_BUFFER | DM_OUT_BUFFER);
483 523
484 ResetDC (DEVICE_MSPRINTER_HDC (d), devmode); 524 /* #### ResetDC fails sometimes, Bill only know s why.
525 The solution below looks more like a workaround to me,
526 although it might be fine. --kkm */
527 if (ResetDC (DEVICE_MSPRINTER_HDC (d), devmode) == NULL)
528 {
529 DeleteDC (DEVICE_MSPRINTER_HDC (d));
530 DEVICE_MSPRINTER_HDC (d) =
531 CreateDC ("WINSPOOL", DEVICE_MSPRINTER_NAME(d), NULL, devmode);
532 }
485 } 533 }
486 534
487 535
488 /************************************************************************/ 536 /************************************************************************/
489 /* initialization */ 537 /* initialization */