Mercurial > hg > xemacs-beta
annotate src/console-msw.c @ 5008:cad59a0a3b19
Add license information from Marcus Thiessel.
See xemacs-beta message <20100208091453.25900@gmx.net>.
| author | Jerry James <james@xemacs.org> |
|---|---|
| date | Tue, 09 Feb 2010 09:50:49 -0700 |
| 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 } |
