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 }