Mercurial > hg > xemacs-beta
annotate src/console-msw.c @ 5179:14fda1dbdb26
add memory usage info for specifiers
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-03-29 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (lisp_object_storage_size):
* alloc.c (Fobject_memory_usage):
* alloc.c (lisp_object_memory_usage_full):
Don't crash if passed a non-record object (int or char).
* alloc.c (tree_memory_usage_1):
* lrecord.h:
New function tree_memory_usage() to return the memory usage of
a tree of conses and/or vectors.
* lisp.h:
* lisp.h (PRIVATE_UNVERIFIED_LIST_LOOP_7):
Add SAFE_LIST_LOOP_* functions for looping over a list not known
to be correct or non-circular, but without signalling an error --
instead, just stop enumerating when an error detected.
* emacs.c (main_1):
* specifier.c:
* specifier.c (specifier_memory_usage):
* specifier.c (vars_of_specifier):
* symsinit.h:
Add memory usage info for specifiers.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 29 Mar 2010 22:47:55 -0500 |
parents | 4aebb0131297 |
children | 71ee43b8a74d |
rev | line source |
---|---|
428 | 1 /* Console functions for mswindows. |
793 | 2 Copyright (C) 1996, 2000, 2001, 2002 Ben Wing. |
428 | 3 |
4 This file is part of XEmacs. | |
5 | |
6 XEmacs is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with XEmacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Synched up with: Not in FSF. */ | |
22 | |
771 | 23 /* This file essentially Mule-ized (except perhaps some Unicode splitting). |
24 5-2000. */ | |
25 | |
428 | 26 /* Authorship: |
27 | |
28 Ben Wing: January 1996, for 19.14. | |
29 Rewritten for mswindows by Jonathan Harris, November 1997 for 21.0 | |
30 */ | |
31 | |
2367 | 32 /* See win32.c for info about the different Windows files in XEmacs. */ |
33 | |
428 | 34 #include <config.h> |
35 #include "lisp.h" | |
36 | |
872 | 37 #include "console-msw-impl.h" |
442 | 38 #include "events.h" |
39 #include "opaque.h" | |
2828 | 40 #include "elhash.h" |
428 | 41 |
440 | 42 DEFINE_CONSOLE_TYPE (mswindows); |
43 DEFINE_CONSOLE_TYPE (msprinter); | |
428 | 44 |
442 | 45 Lisp_Object Qabortretryignore; |
46 Lisp_Object Qapplmodal; | |
47 Lisp_Object Qdefault_desktop_only; | |
48 Lisp_Object Qdefbutton1; | |
49 Lisp_Object Qdefbutton2; | |
50 Lisp_Object Qdefbutton3; | |
51 Lisp_Object Qdefbutton4; | |
52 /* Lisp_Object Qhelp; */ | |
53 Lisp_Object Qiconasterisk; | |
54 Lisp_Object Qiconexclamation; | |
55 Lisp_Object Qiconhand; | |
56 Lisp_Object Qiconinformation; | |
57 Lisp_Object Qiconquestion; | |
58 Lisp_Object Qiconstop; | |
59 /* Lisp_Object Qok; */ | |
60 Lisp_Object Qokcancel; | |
61 Lisp_Object Qretrycancel; | |
62 /* Lisp_Object Qright; */ | |
63 Lisp_Object Qrtlreading; | |
64 Lisp_Object Qservice_notification; | |
65 Lisp_Object Qsetforeground; | |
66 Lisp_Object Qsystemmodal; | |
67 Lisp_Object Qtaskmodal; | |
68 Lisp_Object Qtopmost; | |
69 Lisp_Object Qyesno; | |
70 Lisp_Object Qyesnocancel; | |
2850 | 71 Lisp_Object Vmswindows_seen_characters; |
442 | 72 |
73 /* Lisp_Object Qabort; */ | |
74 /* Lisp_Object Qcancel; */ | |
75 /* Lisp_Object Qignore; */ | |
76 /* Lisp_Object Qno; */ | |
77 /* Lisp_Object Qok; */ | |
78 /* Lisp_Object Qretry; */ | |
79 /* Lisp_Object Qyes; */ | |
80 | |
81 | |
440 | 82 /************************************************************************/ |
83 /* mswindows console methods */ | |
84 /************************************************************************/ | |
428 | 85 |
86 static int | |
2286 | 87 mswindows_initially_selected_for_input (struct console *UNUSED (con)) |
428 | 88 { |
89 return 1; | |
90 } | |
91 | |
442 | 92 static HWND mswindows_console_hwnd = 0; |
93 | |
800 | 94 /* Based on Microsoft KB article Q124103 */ |
442 | 95 static HWND |
96 GetConsoleHwnd (void) | |
97 { | |
800 | 98 HWND hwndFound; |
2367 | 99 Ascbyte newtitle[100]; |
800 | 100 Extbyte *oldtitle; |
101 int numchars; | |
442 | 102 |
103 /* fetch current window title */ | |
104 | |
800 | 105 { |
106 int size = 64; | |
107 do | |
108 { | |
109 size *= 2; | |
110 oldtitle = alloca_extbytes (size * XETCHAR_SIZE); | |
111 numchars = qxeGetConsoleTitle (oldtitle, size); | |
112 } | |
113 while (numchars >= size - 1); | |
114 } | |
442 | 115 |
800 | 116 /* format a "unique" new title */ |
117 | |
2367 | 118 sprintf (newtitle, "%ld/%ld", GetTickCount (), GetCurrentProcessId ()); |
800 | 119 |
2367 | 120 /* change current window title; we may be called during armageddon |
121 so don't do any conversion */ | |
442 | 122 |
2367 | 123 SetConsoleTitleA (newtitle); |
442 | 124 |
125 /* ensure window title has been updated */ | |
126 | |
771 | 127 Sleep (40); |
442 | 128 |
129 /* look for NewWindowTitle */ | |
130 | |
2367 | 131 hwndFound = FindWindowA (NULL, newtitle); |
442 | 132 |
133 /* restore original window title */ | |
134 | |
800 | 135 qxeSetConsoleTitle (oldtitle); |
442 | 136 |
800 | 137 return hwndFound; |
442 | 138 } |
139 | |
771 | 140 static HWND |
442 | 141 mswindows_get_console_hwnd (void) |
142 { | |
143 if (!mswindows_console_hwnd) | |
144 mswindows_console_hwnd = GetConsoleHwnd (); | |
145 return mswindows_console_hwnd; | |
146 } | |
147 | |
148 static int | |
149 mswindows_ensure_console_allocated (void) | |
150 { | |
151 HWND fgwin = GetForegroundWindow (); | |
152 /* stupid mswin api won't let you create the console window | |
153 hidden! creating it changes the focus! fuck me! */ | |
154 if (AllocConsole ()) | |
155 { | |
156 SetForegroundWindow (fgwin); | |
157 return 1; | |
158 } | |
159 return 0; | |
160 } | |
161 | |
440 | 162 static Lisp_Object |
163 mswindows_canonicalize_console_connection (Lisp_Object connection, | |
578 | 164 Error_Behavior errb) |
440 | 165 { |
166 /* Do not allow more than one mswindows device, by explicitly | |
167 requiring that CONNECTION is nil, the only allowed connection in | |
168 Windows. */ | |
169 if (!NILP (connection)) | |
170 { | |
171 if (ERRB_EQ (errb, ERROR_ME)) | |
563 | 172 invalid_argument |
440 | 173 ("Invalid (non-nil) connection for mswindows device/console", |
174 connection); | |
175 else | |
176 return Qunbound; | |
177 } | |
428 | 178 |
440 | 179 return Qnil; |
180 } | |
181 | |
182 static Lisp_Object | |
183 mswindows_canonicalize_device_connection (Lisp_Object connection, | |
578 | 184 Error_Behavior errb) |
440 | 185 { |
186 return mswindows_canonicalize_console_connection (connection, errb); | |
187 } | |
428 | 188 |
2828 | 189 /* The actual console doesn't matter, because the global map is global. See |
190 console-x.c for a corner case, though. */ | |
191 | |
192 static Lisp_Object | |
193 mswindows_perhaps_init_unseen_key_defaults (struct console *UNUSED(con), | |
194 Lisp_Object key) | |
195 { | |
196 Ichar val; | |
197 extern Lisp_Object Vcurrent_global_map; | |
198 | |
199 if (SYMBOLP(key)) | |
200 { | |
201 /* We've no idea what to default a symbol to on MS Windows, and most | |
202 of the keys I'm aware of that have | |
203 symbols--cf. event-msw.c--_shouldn't_ have associated chars. */ | |
204 return Qnil; | |
205 } | |
206 | |
207 CHECK_CHAR(key); | |
208 | |
2850 | 209 if (!(HASH_TABLEP(Vmswindows_seen_characters))) |
2828 | 210 { |
211 /* All the keysym we deal with are character objects; therefore, we | |
212 can use eq as the test without worrying. */ | |
2850 | 213 Vmswindows_seen_characters = make_lisp_hash_table (128, |
214 HASH_TABLE_NON_WEAK, | |
215 HASH_TABLE_EQ); | |
2828 | 216 } |
217 /* Might give the user an opaque error if make_lisp_hash_table fails, | |
218 but it shouldn't crash. */ | |
2850 | 219 CHECK_HASH_TABLE(Vmswindows_seen_characters); |
2828 | 220 |
221 val = XCHAR(key); | |
222 | |
223 /* Same logic as in x_has_keysym; I'm not convinced it's sane. */ | |
224 if (val < 0x80) | |
225 { | |
226 return Qnil; | |
227 } | |
228 | |
2850 | 229 if (!NILP(Fgethash(key, Vmswindows_seen_characters, Qnil))) |
2828 | 230 { |
231 return Qnil; | |
232 } | |
233 | |
234 if (NILP (Flookup_key (Vcurrent_global_map, key, Qnil))) | |
235 { | |
2850 | 236 Fputhash(key, Qt, Vmswindows_seen_characters); |
2828 | 237 Fdefine_key (Vcurrent_global_map, key, Qself_insert_command); |
238 return Qt; | |
239 } | |
240 | |
241 return Qnil; | |
242 } | |
243 | |
442 | 244 void |
245 mswindows_hide_console (void) | |
246 { | |
247 ShowWindow (mswindows_get_console_hwnd (), SW_HIDE); | |
248 } | |
249 | |
771 | 250 static void |
442 | 251 mswindows_show_console (void) |
252 { | |
253 /* What I really want is for the console window to appear on top of other | |
254 windows, but NOT get the focus. This seems hard-to-impossible under | |
255 Windows. The following sequence seems to do the best possible, along | |
256 with keeping the console window on top when xemacs --help is used. */ | |
257 HWND hwnd = mswindows_get_console_hwnd (); | |
258 HWND hwndf = GetFocus (); | |
771 | 259 if (!IsWindowVisible (hwnd)) |
260 ShowWindow (hwnd, SW_SHOWNA); | |
261 if (noninteractive) | |
262 BringWindowToTop (hwnd); | |
263 else | |
264 SetWindowPos (hwnd, hwndf, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | |
265 | SWP_NOACTIVATE); | |
442 | 266 } |
267 | |
268 static int mswindows_console_buffered = 0; | |
269 HANDLE mswindows_console_buffer; | |
270 | |
271 static void | |
272 mswindows_ensure_console_buffered (void) | |
273 { | |
274 if (!mswindows_console_buffered) | |
275 { | |
276 COORD new_size; | |
277 | |
278 new_size.X = 80; | |
279 new_size.Y = 1000; | |
280 mswindows_ensure_console_allocated (); | |
281 mswindows_console_buffer = | |
282 CreateConsoleScreenBuffer (GENERIC_WRITE, 0, NULL, | |
283 CONSOLE_TEXTMODE_BUFFER, NULL); | |
284 SetConsoleScreenBufferSize (mswindows_console_buffer, new_size); | |
285 SetConsoleActiveScreenBuffer (mswindows_console_buffer); | |
286 mswindows_console_buffered = 1; | |
287 } | |
288 } | |
289 | |
290 int mswindows_message_outputted; | |
291 | |
292 int | |
867 | 293 mswindows_output_console_string (const Ibyte *ptr, Bytecount len) |
442 | 294 { |
295 DWORD num_written; | |
296 | |
297 mswindows_message_outputted = 1; | |
298 mswindows_ensure_console_buffered (); | |
299 mswindows_show_console (); | |
300 | |
2367 | 301 if (initialized && !inhibit_non_essential_conversion_operations) |
771 | 302 { |
303 const Extbyte *extptr; | |
304 Bytecount extlen; | |
305 TO_EXTERNAL_FORMAT (DATA, (ptr, len), | |
306 ALLOCA, (extptr, extlen), | |
307 Qmswindows_tstr); | |
308 return qxeWriteConsole (mswindows_console_buffer, extptr, | |
309 extlen / XETCHAR_SIZE, &num_written, NULL); | |
310 } | |
311 else | |
2367 | 312 #ifdef NON_ASCII_INTERNAL_FORMAT |
313 #error Do something here | |
314 #endif | |
315 return WriteConsoleA (mswindows_console_buffer, (Chbyte *) ptr, len, | |
771 | 316 &num_written, NULL); |
442 | 317 } |
318 | |
319 DEFUN ("mswindows-debugging-output", Fmswindows_debugging_output, 1, 1, 0, /* | |
320 Write CHAR-OR-STRING to the Windows debugger, using OutputDebugString(). | |
321 This function can be used as the STREAM argument of Fprint() or the like. | |
322 */ | |
323 (char_or_string)) | |
324 { | |
325 if (STRINGP (char_or_string)) | |
771 | 326 /* It's safe to pass in string data because TO_EXTERNAL_FORMAT |
327 inhibits GC. */ | |
328 write_string_to_mswindows_debugging_output | |
329 (XSTRING_DATA (char_or_string), XSTRING_LENGTH (char_or_string)); | |
442 | 330 else |
331 { | |
867 | 332 Ibyte str[MAX_ICHAR_LEN]; |
442 | 333 Bytecount len; |
334 | |
335 CHECK_CHAR_COERCE_INT (char_or_string); | |
867 | 336 len = set_itext_ichar (str, XCHAR (char_or_string)); |
771 | 337 write_string_to_mswindows_debugging_output (str, len); |
442 | 338 } |
339 | |
340 return char_or_string; | |
341 } | |
342 | |
771 | 343 void |
1346 | 344 write_string_to_mswindows_debugging_output (const Ibyte *str, Bytecount len) |
771 | 345 { |
346 const Extbyte *extptr; | |
2367 | 347 if (initialized && !inhibit_non_essential_conversion_operations) |
771 | 348 { |
349 TO_EXTERNAL_FORMAT (DATA, (str, len), | |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
2850
diff
changeset
|
350 C_STRING_ALLOCA, extptr, Qmswindows_tstr); |
771 | 351 qxeOutputDebugString (extptr); |
352 } | |
353 else | |
1204 | 354 { |
2367 | 355 #ifdef NON_ASCII_INTERNAL_FORMAT |
356 #error Do something here | |
357 #endif | |
1204 | 358 /* STR may not be null-terminated so make it that way. */ |
359 Extbyte *ext = alloca_extbytes (len + 1); | |
360 memcpy (ext, str, len); | |
361 ext[len] = '\0'; | |
362 OutputDebugStringA (ext); | |
363 } | |
771 | 364 } |
365 | |
442 | 366 #ifdef DEBUG_XEMACS |
367 | |
368 /* | |
369 * Random helper functions for debugging. | |
370 * Intended for use in the MSVC "Watch" window which doesn't like | |
371 * the aborts that the error_check_foo() functions can make. | |
372 */ | |
373 struct lrecord_header *DHEADER (Lisp_Object obj); | |
374 struct lrecord_header * | |
375 DHEADER (Lisp_Object obj) | |
376 { | |
377 return LRECORDP (obj) ? XRECORD_LHEADER (obj) : NULL; | |
378 } | |
379 | |
380 void *DOPAQUE_DATA (Lisp_Object obj); | |
381 void * | |
382 DOPAQUE_DATA (Lisp_Object obj) | |
383 { | |
384 return OPAQUEP (obj) ? OPAQUE_DATA (XOPAQUE (obj)) : NULL; | |
385 } | |
386 | |
387 Lisp_Event *DEVENT (Lisp_Object obj); | |
388 Lisp_Event * | |
389 DEVENT (Lisp_Object obj) | |
390 { | |
391 return EVENTP (obj) ? XEVENT (obj) : NULL; | |
392 } | |
393 | |
394 Lisp_Cons *DCONS (Lisp_Object obj); | |
395 Lisp_Cons * | |
396 DCONS (Lisp_Object obj) | |
397 { | |
398 return CONSP (obj) ? XCONS (obj) : NULL; | |
399 } | |
400 | |
401 Lisp_Cons *DCONSCDR (Lisp_Object obj); | |
402 Lisp_Cons * | |
403 DCONSCDR (Lisp_Object obj) | |
404 { | |
405 return (CONSP (obj) && CONSP (XCDR (obj))) ? XCONS (XCDR (obj)) : 0; | |
406 } | |
407 | |
867 | 408 Ibyte *DSTRING (Lisp_Object obj); |
409 Ibyte * | |
442 | 410 DSTRING (Lisp_Object obj) |
411 { | |
412 return STRINGP (obj) ? XSTRING_DATA (obj) : NULL; | |
413 } | |
414 | |
415 Lisp_Vector *DVECTOR (Lisp_Object obj); | |
416 Lisp_Vector * | |
417 DVECTOR (Lisp_Object obj) | |
418 { | |
419 return VECTORP (obj) ? XVECTOR (obj) : NULL; | |
420 } | |
421 | |
422 Lisp_Symbol *DSYMBOL (Lisp_Object obj); | |
423 Lisp_Symbol * | |
424 DSYMBOL (Lisp_Object obj) | |
425 { | |
426 return SYMBOLP (obj) ? XSYMBOL (obj) : NULL; | |
427 } | |
428 | |
867 | 429 Ibyte *DSYMNAME (Lisp_Object obj); |
430 Ibyte * | |
442 | 431 DSYMNAME (Lisp_Object obj) |
432 { | |
793 | 433 return SYMBOLP (obj) ? XSTRING_DATA (XSYMBOL (obj)->name) : NULL; |
442 | 434 } |
435 | |
436 #endif /* DEBUG_XEMACS */ | |
437 | |
438 DEFUN ("mswindows-message-box", Fmswindows_message_box, 1, 3, 0, /* | |
439 Pop up an MS Windows message box. | |
440 MESSAGE is the string to display. Optional argument FLAG controls | |
441 what appears in the box and how it behaves; it is a symbol or list of | |
442 symbols, described below. Second optional argument TITLE controls the | |
443 title bar; if omitted, a standard title bar will be used, probably | |
444 displaying "XEmacs". | |
445 | |
446 Possible flags are | |
447 | |
448 | |
449 -- To specify the buttons in the message box: | |
450 | |
451 abortretryignore | |
452 The message box contains three push buttons: Abort, Retry, and Ignore. | |
453 ok | |
454 The message box contains one push button: OK. This is the default. | |
455 okcancel | |
456 The message box contains two push buttons: OK and Cancel. | |
457 retrycancel | |
458 The message box contains two push buttons: Retry and Cancel. | |
459 yesno | |
460 The message box contains two push buttons: Yes and No. | |
461 yesnocancel | |
462 The message box contains three push buttons: Yes, No, and Cancel. | |
463 | |
464 | |
465 -- To display an icon in the message box: | |
466 | |
467 iconexclamation, iconwarning | |
468 An exclamation-point icon appears in the message box. | |
469 iconinformation, iconasterisk | |
470 An icon consisting of a lowercase letter i in a circle appears in | |
471 the message box. | |
472 iconquestion | |
473 A question-mark icon appears in the message box. | |
474 iconstop, iconerror, iconhand | |
475 A stop-sign icon appears in the message box. | |
476 | |
477 | |
478 -- To indicate the default button: | |
479 | |
480 defbutton1 | |
481 The first button is the default button. This is the default. | |
482 defbutton2 | |
483 The second button is the default button. | |
484 defbutton3 | |
485 The third button is the default button. | |
486 defbutton4 | |
487 The fourth button is the default button. | |
488 | |
489 | |
490 -- To indicate the modality of the dialog box: | |
491 | |
492 applmodal | |
493 The user must respond to the message box before continuing work in | |
494 the window identified by the hWnd parameter. However, the user can | |
495 move to the windows of other applications and work in those windows. | |
496 Depending on the hierarchy of windows in the application, the user | |
497 may be able to move to other windows within the application. All | |
498 child windows of the parent of the message box are automatically | |
499 disabled, but popup windows are not. This is the default. | |
500 systemmodal | |
501 Same as applmodal except that the message box has the WS_EX_TOPMOST | |
502 style. Use system-modal message boxes to notify the user of serious, | |
503 potentially damaging errors that require immediate attention (for | |
504 example, running out of memory). This flag has no effect on the | |
505 user's ability to interact with windows other than those associated | |
506 with hWnd. | |
507 taskmodal | |
508 Same as applmodal except that all the top-level windows belonging to | |
509 the current task are disabled if the hWnd parameter is NULL. Use | |
510 this flag when the calling application or library does not have a | |
511 window handle available but still needs to prevent input to other | |
512 windows in the current application without suspending other | |
513 applications. | |
514 | |
515 | |
516 In addition, you can specify the following flags: | |
517 | |
518 default-desktop-only | |
519 The desktop currently receiving input must be a default desktop; | |
520 otherwise, the function fails. A default desktop is one an | |
521 application runs on after the user has logged on. | |
522 help | |
523 Adds a Help button to the message box. Choosing the Help button or | |
524 pressing F1 generates a Help event. | |
525 right | |
526 The text is right-justified. | |
527 rtlreading | |
528 Displays message and caption text using right-to-left reading order | |
529 on Hebrew and Arabic systems. | |
530 setforeground | |
531 The message box becomes the foreground window. Internally, Windows | |
532 calls the SetForegroundWindow function for the message box. | |
533 topmost | |
534 The message box is created with the WS_EX_TOPMOST window style. | |
535 service-notification | |
536 Windows NT only: The caller is a service notifying the user of an | |
537 event. The function displays a message box on the current active | |
538 desktop, even if there is no user logged on to the computer. If | |
539 this flag is set, the hWnd parameter must be NULL. This is so the | |
540 message box can appear on a desktop other than the desktop | |
541 corresponding to the hWnd. | |
542 | |
543 | |
544 | |
545 The return value is one of the following menu-item values returned by | |
546 the dialog box: | |
547 | |
548 abort | |
549 Abort button was selected. | |
550 cancel | |
551 Cancel button was selected. | |
552 ignore | |
553 Ignore button was selected. | |
554 no | |
555 No button was selected. | |
556 ok | |
557 OK button was selected. | |
558 retry | |
559 Retry button was selected. | |
560 yes | |
561 Yes button was selected. | |
562 | |
563 If a message box has a Cancel button, the function returns the | |
564 `cancel' value if either the ESC key is pressed or the Cancel button | |
565 is selected. If the message box has no Cancel button, pressing ESC has | |
566 no effect. */ | |
567 (message_, flags, title)) | |
568 { | |
569 Extbyte *msgout; | |
570 Extbyte *titleout = 0; | |
571 UINT sty = 0; | |
572 | |
573 if (!LISTP (flags)) | |
574 { | |
575 CHECK_SYMBOL (flags); | |
576 flags = list1 (flags); | |
577 } | |
578 | |
579 CHECK_STRING (message_); | |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
2850
diff
changeset
|
580 msgout = LISP_STRING_TO_TSTR (message_); |
442 | 581 |
582 if (!NILP (title)) | |
583 { | |
584 CHECK_STRING (title); | |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
2850
diff
changeset
|
585 titleout = LISP_STRING_TO_TSTR (title); |
442 | 586 } |
587 | |
2367 | 588 { |
589 EXTERNAL_LIST_LOOP_2 (st, flags) | |
590 { | |
591 CHECK_SYMBOL (st); | |
592 if (0) | |
593 ; | |
442 | 594 #define FROB(sym, val) else if (EQ (st, sym)) sty |= val |
2367 | 595 FROB (Qabortretryignore, MB_ABORTRETRYIGNORE); |
596 FROB (Qapplmodal, MB_APPLMODAL); | |
597 FROB (Qdefault_desktop_only, MB_DEFAULT_DESKTOP_ONLY); | |
598 FROB (Qdefbutton1, MB_DEFBUTTON1); | |
599 FROB (Qdefbutton2, MB_DEFBUTTON2); | |
600 FROB (Qdefbutton3, MB_DEFBUTTON3); | |
601 FROB (Qdefbutton4, MB_DEFBUTTON4); | |
602 FROB (Qhelp, MB_HELP); | |
603 FROB (Qiconasterisk, MB_ICONASTERISK); | |
604 FROB (Qiconexclamation, MB_ICONEXCLAMATION); | |
605 FROB (Qiconhand, MB_ICONHAND); | |
606 FROB (Qiconinformation, MB_ICONINFORMATION); | |
607 FROB (Qiconquestion, MB_ICONQUESTION); | |
608 FROB (Qiconstop, MB_ICONSTOP); | |
609 FROB (Qok, MB_OK); | |
610 FROB (Qokcancel, MB_OKCANCEL); | |
611 FROB (Qretrycancel, MB_RETRYCANCEL); | |
612 FROB (Qright, MB_RIGHT); | |
613 FROB (Qrtlreading, MB_RTLREADING); | |
614 FROB (Qservice_notification, MB_SERVICE_NOTIFICATION); | |
615 FROB (Qsetforeground, MB_SETFOREGROUND); | |
616 FROB (Qsystemmodal, MB_SYSTEMMODAL); | |
617 FROB (Qtaskmodal, MB_TASKMODAL); | |
618 FROB (Qtopmost, MB_TOPMOST); | |
619 FROB (Qyesno, MB_YESNO); | |
620 FROB (Qyesnocancel, MB_YESNOCANCEL); | |
442 | 621 #undef FROB |
622 | |
2367 | 623 else |
624 invalid_constant ("Unrecognized flag", st); | |
625 } | |
626 } | |
442 | 627 |
628 { | |
771 | 629 int retval = qxeMessageBox (NULL, msgout, titleout, sty); |
442 | 630 |
631 if (retval == 0) | |
563 | 632 out_of_memory ("When calling `mswindows-message-box'", Qunbound); |
442 | 633 |
634 #define FROB(sym, val) if (retval == val) return sym | |
635 FROB (Qabort, IDABORT); | |
636 FROB (Qcancel, IDCANCEL); | |
637 FROB (Qignore, IDIGNORE); | |
638 FROB (Qno, IDNO); | |
639 FROB (Qok, IDOK); | |
640 FROB (Qretry, IDRETRY); | |
641 FROB (Qyes, IDYES); | |
642 #undef FROB | |
643 | |
563 | 644 invalid_argument ("Unknown return value from MessageBox()", |
645 make_int (retval)); | |
442 | 646 } |
647 | |
648 return Qnil; | |
649 } | |
650 | |
651 static Lisp_Object | |
652 msprinter_canonicalize_console_connection (Lisp_Object connection, | |
578 | 653 Error_Behavior errb) |
442 | 654 { |
655 /* If nil connection is specified, transform it into the name | |
656 of the default printer */ | |
657 if (NILP (connection)) | |
658 { | |
659 connection = msprinter_default_printer (); | |
660 if (NILP (connection)) | |
661 { | |
662 if (ERRB_EQ (errb, ERROR_ME)) | |
563 | 663 invalid_state ("There is no default printer in the system", |
664 Qunbound); | |
442 | 665 else |
666 return Qunbound; | |
667 } | |
668 } | |
669 | |
670 CHECK_STRING (connection); | |
671 return connection; | |
672 } | |
673 | |
674 static Lisp_Object | |
675 msprinter_canonicalize_device_connection (Lisp_Object connection, | |
578 | 676 Error_Behavior errb) |
442 | 677 { |
678 return msprinter_canonicalize_console_connection (connection, errb); | |
679 } | |
680 | |
428 | 681 |
682 /************************************************************************/ | |
683 /* initialization */ | |
684 /************************************************************************/ | |
685 | |
686 void | |
687 syms_of_console_mswindows (void) | |
688 { | |
442 | 689 DEFSUBR (Fmswindows_debugging_output); |
690 | |
563 | 691 DEFSYMBOL (Qabortretryignore); |
692 DEFSYMBOL (Qapplmodal); | |
693 DEFSYMBOL (Qdefault_desktop_only); | |
694 DEFSYMBOL (Qdefbutton1); | |
695 DEFSYMBOL (Qdefbutton2); | |
696 DEFSYMBOL (Qdefbutton3); | |
697 DEFSYMBOL (Qdefbutton4); | |
698 /* DEFSYMBOL (Qhelp); */ | |
699 DEFSYMBOL (Qiconasterisk); | |
700 DEFSYMBOL (Qiconexclamation); | |
701 DEFSYMBOL (Qiconhand); | |
702 DEFSYMBOL (Qiconinformation); | |
703 DEFSYMBOL (Qiconquestion); | |
704 DEFSYMBOL (Qiconstop); | |
705 /* DEFSYMBOL (Qok); */ | |
706 DEFSYMBOL (Qokcancel); | |
707 DEFSYMBOL (Qretrycancel); | |
708 /* DEFSYMBOL (Qright); */ | |
709 DEFSYMBOL (Qrtlreading); | |
710 DEFSYMBOL (Qservice_notification); | |
711 DEFSYMBOL (Qsetforeground); | |
712 DEFSYMBOL (Qsystemmodal); | |
713 DEFSYMBOL (Qtaskmodal); | |
714 DEFSYMBOL (Qtopmost); | |
715 DEFSYMBOL (Qyesno); | |
716 DEFSYMBOL (Qyesnocancel); | |
442 | 717 |
563 | 718 /* DEFSYMBOL (Qabort); */ |
719 /* DEFSYMBOL (Qcancel); */ | |
720 /* DEFSYMBOL (Qignore); */ | |
721 /* DEFSYMBOL (Qno); */ | |
722 /* DEFSYMBOL (Qok); */ | |
723 /* DEFSYMBOL (Qretry); */ | |
724 /* DEFSYMBOL (Qyes); */ | |
442 | 725 |
726 DEFSUBR (Fmswindows_message_box); | |
428 | 727 } |
728 | |
729 void | |
730 console_type_create_mswindows (void) | |
731 { | |
732 INITIALIZE_CONSOLE_TYPE (mswindows, "mswindows", "console-mswindows-p"); | |
733 | |
734 /* console methods */ | |
735 /* CONSOLE_HAS_METHOD (mswindows, init_console); */ | |
736 /* CONSOLE_HAS_METHOD (mswindows, mark_console); */ | |
737 CONSOLE_HAS_METHOD (mswindows, initially_selected_for_input); | |
738 /* CONSOLE_HAS_METHOD (mswindows, delete_console); */ | |
440 | 739 CONSOLE_HAS_METHOD (mswindows, canonicalize_console_connection); |
740 CONSOLE_HAS_METHOD (mswindows, canonicalize_device_connection); | |
428 | 741 /* CONSOLE_HAS_METHOD (mswindows, semi_canonicalize_console_connection); */ |
742 /* CONSOLE_HAS_METHOD (mswindows, semi_canonicalize_device_connection); */ | |
2828 | 743 CONSOLE_HAS_METHOD (mswindows, perhaps_init_unseen_key_defaults); |
440 | 744 |
745 INITIALIZE_CONSOLE_TYPE (msprinter, "msprinter", "console-msprinter-p"); | |
442 | 746 CONSOLE_HAS_METHOD (msprinter, canonicalize_console_connection); |
747 CONSOLE_HAS_METHOD (msprinter, canonicalize_device_connection); | |
428 | 748 } |
749 | |
750 void | |
751 reinit_console_type_create_mswindows (void) | |
752 { | |
753 REINITIALIZE_CONSOLE_TYPE (mswindows); | |
440 | 754 REINITIALIZE_CONSOLE_TYPE (msprinter); |
428 | 755 } |
756 | |
757 void | |
758 vars_of_console_mswindows (void) | |
759 { | |
2850 | 760 DEFVAR_LISP ("mswindows-seen-characters", &Vmswindows_seen_characters /* |
761 Hash table of non-ASCII characters the MS Windows subsystem has seen. | |
762 */ ); | |
763 Vmswindows_seen_characters = Qnil; | |
428 | 764 Fprovide (Qmswindows); |
765 } |