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),
|
|
350 C_STRING_ALLOCA, extptr,
|
|
351 Qmswindows_tstr);
|
|
352 qxeOutputDebugString (extptr);
|
|
353 }
|
|
354 else
|
1204
|
355 {
|
2367
|
356 #ifdef NON_ASCII_INTERNAL_FORMAT
|
|
357 #error Do something here
|
|
358 #endif
|
1204
|
359 /* STR may not be null-terminated so make it that way. */
|
|
360 Extbyte *ext = alloca_extbytes (len + 1);
|
|
361 memcpy (ext, str, len);
|
|
362 ext[len] = '\0';
|
|
363 OutputDebugStringA (ext);
|
|
364 }
|
771
|
365 }
|
|
366
|
442
|
367 #ifdef DEBUG_XEMACS
|
|
368
|
|
369 /*
|
|
370 * Random helper functions for debugging.
|
|
371 * Intended for use in the MSVC "Watch" window which doesn't like
|
|
372 * the aborts that the error_check_foo() functions can make.
|
|
373 */
|
|
374 struct lrecord_header *DHEADER (Lisp_Object obj);
|
|
375 struct lrecord_header *
|
|
376 DHEADER (Lisp_Object obj)
|
|
377 {
|
|
378 return LRECORDP (obj) ? XRECORD_LHEADER (obj) : NULL;
|
|
379 }
|
|
380
|
|
381 void *DOPAQUE_DATA (Lisp_Object obj);
|
|
382 void *
|
|
383 DOPAQUE_DATA (Lisp_Object obj)
|
|
384 {
|
|
385 return OPAQUEP (obj) ? OPAQUE_DATA (XOPAQUE (obj)) : NULL;
|
|
386 }
|
|
387
|
|
388 Lisp_Event *DEVENT (Lisp_Object obj);
|
|
389 Lisp_Event *
|
|
390 DEVENT (Lisp_Object obj)
|
|
391 {
|
|
392 return EVENTP (obj) ? XEVENT (obj) : NULL;
|
|
393 }
|
|
394
|
|
395 Lisp_Cons *DCONS (Lisp_Object obj);
|
|
396 Lisp_Cons *
|
|
397 DCONS (Lisp_Object obj)
|
|
398 {
|
|
399 return CONSP (obj) ? XCONS (obj) : NULL;
|
|
400 }
|
|
401
|
|
402 Lisp_Cons *DCONSCDR (Lisp_Object obj);
|
|
403 Lisp_Cons *
|
|
404 DCONSCDR (Lisp_Object obj)
|
|
405 {
|
|
406 return (CONSP (obj) && CONSP (XCDR (obj))) ? XCONS (XCDR (obj)) : 0;
|
|
407 }
|
|
408
|
867
|
409 Ibyte *DSTRING (Lisp_Object obj);
|
|
410 Ibyte *
|
442
|
411 DSTRING (Lisp_Object obj)
|
|
412 {
|
|
413 return STRINGP (obj) ? XSTRING_DATA (obj) : NULL;
|
|
414 }
|
|
415
|
|
416 Lisp_Vector *DVECTOR (Lisp_Object obj);
|
|
417 Lisp_Vector *
|
|
418 DVECTOR (Lisp_Object obj)
|
|
419 {
|
|
420 return VECTORP (obj) ? XVECTOR (obj) : NULL;
|
|
421 }
|
|
422
|
|
423 Lisp_Symbol *DSYMBOL (Lisp_Object obj);
|
|
424 Lisp_Symbol *
|
|
425 DSYMBOL (Lisp_Object obj)
|
|
426 {
|
|
427 return SYMBOLP (obj) ? XSYMBOL (obj) : NULL;
|
|
428 }
|
|
429
|
867
|
430 Ibyte *DSYMNAME (Lisp_Object obj);
|
|
431 Ibyte *
|
442
|
432 DSYMNAME (Lisp_Object obj)
|
|
433 {
|
793
|
434 return SYMBOLP (obj) ? XSTRING_DATA (XSYMBOL (obj)->name) : NULL;
|
442
|
435 }
|
|
436
|
|
437 #endif /* DEBUG_XEMACS */
|
|
438
|
|
439 DEFUN ("mswindows-message-box", Fmswindows_message_box, 1, 3, 0, /*
|
|
440 Pop up an MS Windows message box.
|
|
441 MESSAGE is the string to display. Optional argument FLAG controls
|
|
442 what appears in the box and how it behaves; it is a symbol or list of
|
|
443 symbols, described below. Second optional argument TITLE controls the
|
|
444 title bar; if omitted, a standard title bar will be used, probably
|
|
445 displaying "XEmacs".
|
|
446
|
|
447 Possible flags are
|
|
448
|
|
449
|
|
450 -- To specify the buttons in the message box:
|
|
451
|
|
452 abortretryignore
|
|
453 The message box contains three push buttons: Abort, Retry, and Ignore.
|
|
454 ok
|
|
455 The message box contains one push button: OK. This is the default.
|
|
456 okcancel
|
|
457 The message box contains two push buttons: OK and Cancel.
|
|
458 retrycancel
|
|
459 The message box contains two push buttons: Retry and Cancel.
|
|
460 yesno
|
|
461 The message box contains two push buttons: Yes and No.
|
|
462 yesnocancel
|
|
463 The message box contains three push buttons: Yes, No, and Cancel.
|
|
464
|
|
465
|
|
466 -- To display an icon in the message box:
|
|
467
|
|
468 iconexclamation, iconwarning
|
|
469 An exclamation-point icon appears in the message box.
|
|
470 iconinformation, iconasterisk
|
|
471 An icon consisting of a lowercase letter i in a circle appears in
|
|
472 the message box.
|
|
473 iconquestion
|
|
474 A question-mark icon appears in the message box.
|
|
475 iconstop, iconerror, iconhand
|
|
476 A stop-sign icon appears in the message box.
|
|
477
|
|
478
|
|
479 -- To indicate the default button:
|
|
480
|
|
481 defbutton1
|
|
482 The first button is the default button. This is the default.
|
|
483 defbutton2
|
|
484 The second button is the default button.
|
|
485 defbutton3
|
|
486 The third button is the default button.
|
|
487 defbutton4
|
|
488 The fourth button is the default button.
|
|
489
|
|
490
|
|
491 -- To indicate the modality of the dialog box:
|
|
492
|
|
493 applmodal
|
|
494 The user must respond to the message box before continuing work in
|
|
495 the window identified by the hWnd parameter. However, the user can
|
|
496 move to the windows of other applications and work in those windows.
|
|
497 Depending on the hierarchy of windows in the application, the user
|
|
498 may be able to move to other windows within the application. All
|
|
499 child windows of the parent of the message box are automatically
|
|
500 disabled, but popup windows are not. This is the default.
|
|
501 systemmodal
|
|
502 Same as applmodal except that the message box has the WS_EX_TOPMOST
|
|
503 style. Use system-modal message boxes to notify the user of serious,
|
|
504 potentially damaging errors that require immediate attention (for
|
|
505 example, running out of memory). This flag has no effect on the
|
|
506 user's ability to interact with windows other than those associated
|
|
507 with hWnd.
|
|
508 taskmodal
|
|
509 Same as applmodal except that all the top-level windows belonging to
|
|
510 the current task are disabled if the hWnd parameter is NULL. Use
|
|
511 this flag when the calling application or library does not have a
|
|
512 window handle available but still needs to prevent input to other
|
|
513 windows in the current application without suspending other
|
|
514 applications.
|
|
515
|
|
516
|
|
517 In addition, you can specify the following flags:
|
|
518
|
|
519 default-desktop-only
|
|
520 The desktop currently receiving input must be a default desktop;
|
|
521 otherwise, the function fails. A default desktop is one an
|
|
522 application runs on after the user has logged on.
|
|
523 help
|
|
524 Adds a Help button to the message box. Choosing the Help button or
|
|
525 pressing F1 generates a Help event.
|
|
526 right
|
|
527 The text is right-justified.
|
|
528 rtlreading
|
|
529 Displays message and caption text using right-to-left reading order
|
|
530 on Hebrew and Arabic systems.
|
|
531 setforeground
|
|
532 The message box becomes the foreground window. Internally, Windows
|
|
533 calls the SetForegroundWindow function for the message box.
|
|
534 topmost
|
|
535 The message box is created with the WS_EX_TOPMOST window style.
|
|
536 service-notification
|
|
537 Windows NT only: The caller is a service notifying the user of an
|
|
538 event. The function displays a message box on the current active
|
|
539 desktop, even if there is no user logged on to the computer. If
|
|
540 this flag is set, the hWnd parameter must be NULL. This is so the
|
|
541 message box can appear on a desktop other than the desktop
|
|
542 corresponding to the hWnd.
|
|
543
|
|
544
|
|
545
|
|
546 The return value is one of the following menu-item values returned by
|
|
547 the dialog box:
|
|
548
|
|
549 abort
|
|
550 Abort button was selected.
|
|
551 cancel
|
|
552 Cancel button was selected.
|
|
553 ignore
|
|
554 Ignore button was selected.
|
|
555 no
|
|
556 No button was selected.
|
|
557 ok
|
|
558 OK button was selected.
|
|
559 retry
|
|
560 Retry button was selected.
|
|
561 yes
|
|
562 Yes button was selected.
|
|
563
|
|
564 If a message box has a Cancel button, the function returns the
|
|
565 `cancel' value if either the ESC key is pressed or the Cancel button
|
|
566 is selected. If the message box has no Cancel button, pressing ESC has
|
|
567 no effect. */
|
|
568 (message_, flags, title))
|
|
569 {
|
|
570 Extbyte *msgout;
|
|
571 Extbyte *titleout = 0;
|
|
572 UINT sty = 0;
|
|
573
|
|
574 if (!LISTP (flags))
|
|
575 {
|
|
576 CHECK_SYMBOL (flags);
|
|
577 flags = list1 (flags);
|
|
578 }
|
|
579
|
|
580 CHECK_STRING (message_);
|
771
|
581 LISP_STRING_TO_TSTR (message_, msgout);
|
442
|
582
|
|
583 if (!NILP (title))
|
|
584 {
|
|
585 CHECK_STRING (title);
|
771
|
586 LISP_STRING_TO_TSTR (title, titleout);
|
442
|
587 }
|
|
588
|
2367
|
589 {
|
|
590 EXTERNAL_LIST_LOOP_2 (st, flags)
|
|
591 {
|
|
592 CHECK_SYMBOL (st);
|
|
593 if (0)
|
|
594 ;
|
442
|
595 #define FROB(sym, val) else if (EQ (st, sym)) sty |= val
|
2367
|
596 FROB (Qabortretryignore, MB_ABORTRETRYIGNORE);
|
|
597 FROB (Qapplmodal, MB_APPLMODAL);
|
|
598 FROB (Qdefault_desktop_only, MB_DEFAULT_DESKTOP_ONLY);
|
|
599 FROB (Qdefbutton1, MB_DEFBUTTON1);
|
|
600 FROB (Qdefbutton2, MB_DEFBUTTON2);
|
|
601 FROB (Qdefbutton3, MB_DEFBUTTON3);
|
|
602 FROB (Qdefbutton4, MB_DEFBUTTON4);
|
|
603 FROB (Qhelp, MB_HELP);
|
|
604 FROB (Qiconasterisk, MB_ICONASTERISK);
|
|
605 FROB (Qiconexclamation, MB_ICONEXCLAMATION);
|
|
606 FROB (Qiconhand, MB_ICONHAND);
|
|
607 FROB (Qiconinformation, MB_ICONINFORMATION);
|
|
608 FROB (Qiconquestion, MB_ICONQUESTION);
|
|
609 FROB (Qiconstop, MB_ICONSTOP);
|
|
610 FROB (Qok, MB_OK);
|
|
611 FROB (Qokcancel, MB_OKCANCEL);
|
|
612 FROB (Qretrycancel, MB_RETRYCANCEL);
|
|
613 FROB (Qright, MB_RIGHT);
|
|
614 FROB (Qrtlreading, MB_RTLREADING);
|
|
615 FROB (Qservice_notification, MB_SERVICE_NOTIFICATION);
|
|
616 FROB (Qsetforeground, MB_SETFOREGROUND);
|
|
617 FROB (Qsystemmodal, MB_SYSTEMMODAL);
|
|
618 FROB (Qtaskmodal, MB_TASKMODAL);
|
|
619 FROB (Qtopmost, MB_TOPMOST);
|
|
620 FROB (Qyesno, MB_YESNO);
|
|
621 FROB (Qyesnocancel, MB_YESNOCANCEL);
|
442
|
622 #undef FROB
|
|
623
|
2367
|
624 else
|
|
625 invalid_constant ("Unrecognized flag", st);
|
|
626 }
|
|
627 }
|
442
|
628
|
|
629 {
|
771
|
630 int retval = qxeMessageBox (NULL, msgout, titleout, sty);
|
442
|
631
|
|
632 if (retval == 0)
|
563
|
633 out_of_memory ("When calling `mswindows-message-box'", Qunbound);
|
442
|
634
|
|
635 #define FROB(sym, val) if (retval == val) return sym
|
|
636 FROB (Qabort, IDABORT);
|
|
637 FROB (Qcancel, IDCANCEL);
|
|
638 FROB (Qignore, IDIGNORE);
|
|
639 FROB (Qno, IDNO);
|
|
640 FROB (Qok, IDOK);
|
|
641 FROB (Qretry, IDRETRY);
|
|
642 FROB (Qyes, IDYES);
|
|
643 #undef FROB
|
|
644
|
563
|
645 invalid_argument ("Unknown return value from MessageBox()",
|
|
646 make_int (retval));
|
442
|
647 }
|
|
648
|
|
649 return Qnil;
|
|
650 }
|
|
651
|
|
652 static Lisp_Object
|
|
653 msprinter_canonicalize_console_connection (Lisp_Object connection,
|
578
|
654 Error_Behavior errb)
|
442
|
655 {
|
|
656 /* If nil connection is specified, transform it into the name
|
|
657 of the default printer */
|
|
658 if (NILP (connection))
|
|
659 {
|
|
660 connection = msprinter_default_printer ();
|
|
661 if (NILP (connection))
|
|
662 {
|
|
663 if (ERRB_EQ (errb, ERROR_ME))
|
563
|
664 invalid_state ("There is no default printer in the system",
|
|
665 Qunbound);
|
442
|
666 else
|
|
667 return Qunbound;
|
|
668 }
|
|
669 }
|
|
670
|
|
671 CHECK_STRING (connection);
|
|
672 return connection;
|
|
673 }
|
|
674
|
|
675 static Lisp_Object
|
|
676 msprinter_canonicalize_device_connection (Lisp_Object connection,
|
578
|
677 Error_Behavior errb)
|
442
|
678 {
|
|
679 return msprinter_canonicalize_console_connection (connection, errb);
|
|
680 }
|
|
681
|
428
|
682
|
|
683 /************************************************************************/
|
|
684 /* initialization */
|
|
685 /************************************************************************/
|
|
686
|
|
687 void
|
|
688 syms_of_console_mswindows (void)
|
|
689 {
|
442
|
690 DEFSUBR (Fmswindows_debugging_output);
|
|
691
|
563
|
692 DEFSYMBOL (Qabortretryignore);
|
|
693 DEFSYMBOL (Qapplmodal);
|
|
694 DEFSYMBOL (Qdefault_desktop_only);
|
|
695 DEFSYMBOL (Qdefbutton1);
|
|
696 DEFSYMBOL (Qdefbutton2);
|
|
697 DEFSYMBOL (Qdefbutton3);
|
|
698 DEFSYMBOL (Qdefbutton4);
|
|
699 /* DEFSYMBOL (Qhelp); */
|
|
700 DEFSYMBOL (Qiconasterisk);
|
|
701 DEFSYMBOL (Qiconexclamation);
|
|
702 DEFSYMBOL (Qiconhand);
|
|
703 DEFSYMBOL (Qiconinformation);
|
|
704 DEFSYMBOL (Qiconquestion);
|
|
705 DEFSYMBOL (Qiconstop);
|
|
706 /* DEFSYMBOL (Qok); */
|
|
707 DEFSYMBOL (Qokcancel);
|
|
708 DEFSYMBOL (Qretrycancel);
|
|
709 /* DEFSYMBOL (Qright); */
|
|
710 DEFSYMBOL (Qrtlreading);
|
|
711 DEFSYMBOL (Qservice_notification);
|
|
712 DEFSYMBOL (Qsetforeground);
|
|
713 DEFSYMBOL (Qsystemmodal);
|
|
714 DEFSYMBOL (Qtaskmodal);
|
|
715 DEFSYMBOL (Qtopmost);
|
|
716 DEFSYMBOL (Qyesno);
|
|
717 DEFSYMBOL (Qyesnocancel);
|
442
|
718
|
563
|
719 /* DEFSYMBOL (Qabort); */
|
|
720 /* DEFSYMBOL (Qcancel); */
|
|
721 /* DEFSYMBOL (Qignore); */
|
|
722 /* DEFSYMBOL (Qno); */
|
|
723 /* DEFSYMBOL (Qok); */
|
|
724 /* DEFSYMBOL (Qretry); */
|
|
725 /* DEFSYMBOL (Qyes); */
|
442
|
726
|
|
727 DEFSUBR (Fmswindows_message_box);
|
428
|
728 }
|
|
729
|
|
730 void
|
|
731 console_type_create_mswindows (void)
|
|
732 {
|
|
733 INITIALIZE_CONSOLE_TYPE (mswindows, "mswindows", "console-mswindows-p");
|
|
734
|
|
735 /* console methods */
|
|
736 /* CONSOLE_HAS_METHOD (mswindows, init_console); */
|
|
737 /* CONSOLE_HAS_METHOD (mswindows, mark_console); */
|
|
738 CONSOLE_HAS_METHOD (mswindows, initially_selected_for_input);
|
|
739 /* CONSOLE_HAS_METHOD (mswindows, delete_console); */
|
440
|
740 CONSOLE_HAS_METHOD (mswindows, canonicalize_console_connection);
|
|
741 CONSOLE_HAS_METHOD (mswindows, canonicalize_device_connection);
|
428
|
742 /* CONSOLE_HAS_METHOD (mswindows, semi_canonicalize_console_connection); */
|
|
743 /* CONSOLE_HAS_METHOD (mswindows, semi_canonicalize_device_connection); */
|
2828
|
744 CONSOLE_HAS_METHOD (mswindows, perhaps_init_unseen_key_defaults);
|
440
|
745
|
|
746 INITIALIZE_CONSOLE_TYPE (msprinter, "msprinter", "console-msprinter-p");
|
442
|
747 CONSOLE_HAS_METHOD (msprinter, canonicalize_console_connection);
|
|
748 CONSOLE_HAS_METHOD (msprinter, canonicalize_device_connection);
|
428
|
749 }
|
|
750
|
|
751 void
|
|
752 reinit_console_type_create_mswindows (void)
|
|
753 {
|
|
754 REINITIALIZE_CONSOLE_TYPE (mswindows);
|
440
|
755 REINITIALIZE_CONSOLE_TYPE (msprinter);
|
428
|
756 }
|
|
757
|
|
758 void
|
|
759 vars_of_console_mswindows (void)
|
|
760 {
|
2850
|
761 DEFVAR_LISP ("mswindows-seen-characters", &Vmswindows_seen_characters /*
|
|
762 Hash table of non-ASCII characters the MS Windows subsystem has seen.
|
|
763 */ );
|
|
764 Vmswindows_seen_characters = Qnil;
|
428
|
765 Fprovide (Qmswindows);
|
|
766 }
|