Mercurial > hg > xemacs-beta
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 */ |