Mercurial > hg > xemacs-beta
annotate src/console-msw.c @ 5043:d0c14ea98592
various frame-geometry fixes
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-02-15 Ben Wing <ben@xemacs.org>
* EmacsFrame.c:
* EmacsFrame.c (EmacsFrameResize):
* console-msw-impl.h:
* console-msw-impl.h (struct mswindows_frame):
* console-msw-impl.h (FRAME_MSWINDOWS_TARGET_RECT):
* device-tty.c:
* device-tty.c (tty_asynch_device_change):
* event-msw.c:
* event-msw.c (mswindows_wnd_proc):
* faces.c (Fface_list):
* faces.h:
* frame-gtk.c:
* frame-gtk.c (gtk_set_initial_frame_size):
* frame-gtk.c (gtk_set_frame_size):
* frame-msw.c:
* frame-msw.c (mswindows_init_frame_1):
* frame-msw.c (mswindows_set_frame_size):
* frame-msw.c (mswindows_size_frame_internal):
* frame-msw.c (msprinter_init_frame_3):
* frame.c:
* frame.c (enum):
* frame.c (Fmake_frame):
* frame.c (adjust_frame_size):
* frame.c (store_minibuf_frame_prop):
* frame.c (Fframe_property):
* frame.c (Fframe_properties):
* frame.c (Fframe_displayable_pixel_height):
* frame.c (Fframe_displayable_pixel_width):
* frame.c (internal_set_frame_size):
* frame.c (Fset_frame_height):
* frame.c (Fset_frame_pixel_height):
* frame.c (Fset_frame_displayable_pixel_height):
* frame.c (Fset_frame_width):
* frame.c (Fset_frame_pixel_width):
* frame.c (Fset_frame_displayable_pixel_width):
* frame.c (Fset_frame_size):
* frame.c (Fset_frame_pixel_size):
* frame.c (Fset_frame_displayable_pixel_size):
* frame.c (frame_conversion_internal_1):
* frame.c (get_frame_displayable_pixel_size):
* frame.c (change_frame_size_1):
* frame.c (change_frame_size):
* frame.c (generate_title_string):
* frame.h:
* gtk-xemacs.c:
* gtk-xemacs.c (gtk_xemacs_size_request):
* gtk-xemacs.c (gtk_xemacs_size_allocate):
* gtk-xemacs.c (gtk_xemacs_paint):
* gutter.c:
* gutter.c (update_gutter_geometry):
* redisplay.c (end_hold_frame_size_changes):
* redisplay.c (redisplay_frame):
* toolbar.c:
* toolbar.c (update_frame_toolbars_geometry):
* window.c:
* window.c (frame_pixsize_valid_p):
* window.c (check_frame_size):
Various fixes to frame geometry to make it a bit easier to understand
and fix some bugs.
1. IMPORTANT: Some renamings. Will need to be applied carefully to
the carbon repository, in the following order:
-- pixel_to_char_size -> pixel_to_frame_unit_size
-- char_to_pixel_size -> frame_unit_to_pixel_size
-- pixel_to_real_char_size -> pixel_to_char_size
-- char_to_real_pixel_size -> char_to_pixel_size
-- Reverse second and third arguments of change_frame_size() and
change_frame_size_1() to try to make functions consistent in
putting width before height.
-- Eliminate old round_size_to_char, because it didn't really
do anything differently from round_size_to_real_char()
-- round_size_to_real_char -> round_size_to_char; any places that
called the old round_size_to_char should just call the new one.
2. IMPORTANT FOR CARBON: The set_frame_size() method is now passed
sizes in "frame units", like all other frame-sizing functions,
rather than some hacked-up combination of char-cell units and
total pixel size. This only affects window systems that use
"pixelated geometry", and I'm not sure if Carbon is one of them.
MS Windows is pixelated, X and GTK are not. For pixelated-geometry
systems, the size in set_frame_size() is in displayable pixels
rather than total pixels and needs to be converted appropriately;
take a look at the changes made to mswindows_set_frame_size()
method if necessary.
3. Add a big long comment in frame.c describing how frame geometry
works.
4. Remove MS Windows-specific character height and width fields,
duplicative and unused.
5. frame-displayable-pixel-* and set-frame-displayable-pixel-*
didn't use to work on MS Windows, but they do now.
6. In general, clean up the handling of "pixelated geometry" so
that fewer functions have to worry about this. This is really
an abomination that should be removed entirely but that will
have to happen later. Fix some buggy code in
frame_conversion_internal() that happened to "work" because it
was countered by oppositely buggy code in change_frame_size().
7. Clean up some frame-size code in toolbar.c and use functions
already provided in frame.c instead of rolling its own.
8. Fix check_frame_size() in window.c, which formerly didn't take
pixelated geometry into account.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 15 Feb 2010 22:14:11 -0600 |
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 } |