Mercurial > hg > xemacs-beta
annotate src/console.c @ 5013:ae48681c47fa
changes to VOID_TO_LISP et al.
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-02-08 Ben Wing <ben@xemacs.org>
* casetab.c (compute_canon_mapper):
* casetab.c (initialize_identity_mapper):
* casetab.c (compute_up_or_eqv_mapper):
* casetab.c (recompute_case_table):
* casetab.c (set_case_table):
* chartab.c (copy_mapper):
* chartab.c (copy_char_table_range):
* chartab.c (get_range_char_table_1):
* console.c (find_nonminibuffer_frame_not_on_console_predicate):
* console.c (find_nonminibuffer_frame_not_on_console):
* console.c (nuke_all_console_slots):
* device.c:
* device.c (find_nonminibuffer_frame_not_on_device_predicate):
* device.c (find_nonminibuffer_frame_not_on_device):
* dialog-msw.c (dialog_proc):
* dialog-msw.c (handle_question_dialog_box):
* dialog-x.c (maybe_run_dbox_text_callback):
* eval.c:
* eval.c (safe_run_hook_trapping_problems_1):
* eval.c (safe_run_hook_trapping_problems):
* event-msw.c:
* event-msw.c (mswindows_wnd_proc):
* event-msw.c (mswindows_find_frame):
* faces.c (update_face_inheritance_mapper):
* frame-msw.c (mswindows_init_frame_1):
* frame-msw.c (mswindows_get_mouse_position):
* frame-msw.c (mswindows_get_frame_parent):
* glade.c (connector):
* glade.c (Fglade_xml_signal_connect):
* glade.c (Fglade_xml_signal_autoconnect):
* glade.c (Fglade_xml_textdomain):
* glyphs-msw.c (mswindows_subwindow_instantiate):
* glyphs-msw.c (mswindows_widget_instantiate):
* glyphs.c (check_instance_cache_mapper):
* glyphs.c (check_window_subwindow_cache):
* glyphs.c (check_image_instance_structure):
* gui-x.c (snarf_widget_value_mapper):
* gui-x.c (popup_selection_callback):
* gui-x.c (button_item_to_widget_value):
* keymap.c (map_keymap_mapper):
* keymap.c (Fmap_keymap):
* menubar-gtk.c (__torn_off_sir):
* menubar-gtk.c (__activate_menu):
* menubar-gtk.c (menu_convert):
* menubar-gtk.c (__generic_button_callback):
* menubar-gtk.c (menu_descriptor_to_widget_1):
* menubar-msw.c:
* menubar-msw.c (EMPTY_ITEM_ID):
* menubar-x.c (menu_item_descriptor_to_widget_value_1):
* menubar-x.c (pre_activate_callback):
* menubar-x.c (command_builder_operate_menu_accelerator):
* menubar-x.c (command_builder_find_menu_accelerator):
* print.c (print_internal):
* process-unix.c (close_process_descs_mapfun):
* process.c (get_process_from_usid):
* process.c (init_process_io_handles):
* profile.c (sigprof_handler):
* profile.c (get_profiling_info_timing_maphash):
* profile.c (Fget_profiling_info):
* profile.c (set_profiling_info_timing_maphash):
* profile.c (mark_profiling_info_maphash):
* scrollbar-msw.c (mswindows_create_scrollbar_instance):
* scrollbar-msw.c (mswindows_free_scrollbar_instance):
* scrollbar-msw.c (mswindows_handle_scrollbar_event):
* specifier.c (recompute_cached_specifier_everywhere_mapfun):
* specifier.c (recompute_cached_specifier_everywhere):
* syntax.c (copy_to_mirrortab):
* syntax.c (copy_if_not_already_present):
* syntax.c (update_just_this_syntax_table):
* text.c (new_dfc_convert_now_damn_it):
* text.h (LISP_STRING_TO_EXTERNAL):
* tooltalk.c:
* tooltalk.c (tooltalk_message_callback):
* tooltalk.c (tooltalk_pattern_callback):
* tooltalk.c (Fcreate_tooltalk_message):
* tooltalk.c (Fcreate_tooltalk_pattern):
* ui-byhand.c (__generic_toolbar_callback):
* ui-byhand.c (generic_toolbar_insert_item):
* ui-byhand.c (__emacs_gtk_ctree_recurse_internal):
* ui-byhand.c (Fgtk_ctree_recurse):
* ui-gtk.c (__internal_callback_destroy):
* ui-gtk.c (__internal_callback_marshal):
* ui-gtk.c (Fgtk_signal_connect):
* ui-gtk.c (gtk_type_to_lisp):
* ui-gtk.c (lisp_to_gtk_type):
* ui-gtk.c (lisp_to_gtk_ret_type):
* lisp-disunion.h:
* lisp-disunion.h (NON_LVALUE):
* lisp-union.h:
* lisp.h (LISP_HASH):
Rename:
LISP_TO_VOID -> STORE_LISP_IN_VOID
VOID_TO_LISP -> GET_LISP_FROM_VOID
These new names are meant to clearly identify that the Lisp object
is the source and void the sink, and that they can't be used the
other way around -- they aren't exact opposites despite the old
names. The names are also important given the new functions
created just below. Also, clarify comments in lisp-union.h and
lisp-disunion.h about the use of the functions.
* lisp.h:
New functions STORE_VOID_IN_LISP and GET_VOID_FROM_LISP. These
are different from the above in that the source is a void *
(previously, you had to use make_opaque_ptr()).
* eval.c (restore_lisp_object):
* eval.c (record_unwind_protect_restoring_lisp_object):
* eval.c (struct restore_int):
* eval.c (restore_int):
* eval.c (record_unwind_protect_restoring_int):
* eval.c (free_pointer):
* eval.c (record_unwind_protect_freeing):
* eval.c (free_dynarr):
* eval.c (record_unwind_protect_freeing_dynarr):
* eval.c (unbind_to_1):
Use STORE_VOID_IN_LISP and GET_VOID_FROM_LISP to eliminate the
use of make_opaque_ptr() and mostly eliminate Lisp consing
entirely in the use of these various record_unwind_protect_*
functions as well as internal_bind_* (e.g. internal_bind_int).
* tests.c:
* tests.c (Ftest_store_void_in_lisp):
* tests.c (syms_of_tests):
* tests.c (vars_of_tests):
Add an C-assert-style test to test STORE_VOID_IN_LISP and
GET_VOID_FROM_LISP to make sure the same value comes back that
was put in.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 08 Feb 2010 06:42:16 -0600 |
parents | 4aebb0131297 |
children | d4f666cda5e6 6f2158fa75ed b5df3737028a |
rev | line source |
---|---|
428 | 1 /* The console object. |
2 Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. | |
800 | 3 Copyright (C) 1996, 2002 Ben Wing. |
428 | 4 |
5 This file is part of XEmacs. | |
6 | |
7 XEmacs is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 2, or (at your option) any | |
10 later version. | |
11 | |
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with XEmacs; see the file COPYING. If not, write to | |
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
20 Boston, MA 02111-1307, USA. */ | |
21 | |
22 /* Synched up with: Not in FSF. */ | |
23 | |
853 | 24 /* Written by Ben Wing, late 1995?. |
25 suspend-console, set-input-mode, and related stuff largely based on | |
26 existing code. | |
27 */ | |
428 | 28 |
29 #include <config.h> | |
30 #include "lisp.h" | |
31 | |
32 #include "buffer.h" | |
872 | 33 #include "console-impl.h" |
34 #include "device-impl.h" | |
428 | 35 #include "events.h" |
872 | 36 #include "frame-impl.h" |
428 | 37 #include "redisplay.h" |
38 #include "sysdep.h" | |
39 #include "window.h" | |
40 | |
1204 | 41 #include "console-stream-impl.h" |
872 | 42 #ifdef HAVE_TTY |
43 #include "console-tty-impl.h" | |
44 #endif | |
800 | 45 |
2340 | 46 #ifdef HAVE_TTY |
47 #define USED_IF_TTY(decl) decl | |
48 #else | |
49 #define USED_IF_TTY(decl) UNUSED (decl) | |
50 #endif | |
51 | |
428 | 52 Lisp_Object Vconsole_list, Vselected_console; |
53 | |
54 Lisp_Object Vcreate_console_hook, Vdelete_console_hook; | |
55 | |
56 Lisp_Object Qconsolep, Qconsole_live_p; | |
57 Lisp_Object Qcreate_console_hook; | |
58 Lisp_Object Qdelete_console_hook; | |
59 | |
60 Lisp_Object Qsuspend_hook; | |
61 Lisp_Object Qsuspend_resume_hook; | |
62 | |
63 /* This structure holds the default values of the console-local | |
64 variables defined with DEFVAR_CONSOLE_LOCAL, that have special | |
65 slots in each console. The default value occupies the same slot | |
66 in this structure as an individual console's value occupies in | |
67 that console. Setting the default value also goes through the | |
68 list of consoles and stores into each console that does not say | |
69 it has a local value. */ | |
70 Lisp_Object Vconsole_defaults; | |
71 static void *console_defaults_saved_slots; | |
72 | |
73 /* This structure marks which slots in a console have corresponding | |
74 default values in console_defaults. | |
75 Each such slot has a nonzero value in this structure. | |
76 The value has only one nonzero bit. | |
77 | |
78 When a console has its own local value for a slot, | |
79 the bit for that slot (found in the same slot in this structure) | |
80 is turned on in the console's local_var_flags slot. | |
81 | |
82 If a slot in this structure is 0, then there is a DEFVAR_CONSOLE_LOCAL | |
83 for the slot, but there is no default value for it; the corresponding | |
84 slot in console_defaults is not used except to initialize newly-created | |
85 consoles. | |
86 | |
87 If a slot is -1, then there is a DEFVAR_CONSOLE_LOCAL for it | |
88 as well as a default value which is used to initialize newly-created | |
89 consoles and as a reset-value when local-vars are killed. | |
90 | |
91 If a slot is -2, there is no DEFVAR_CONSOLE_LOCAL for it. | |
92 (The slot is always local, but there's no lisp variable for it.) | |
93 The default value is only used to initialize newly-creation consoles. | |
94 | |
95 If a slot is -3, then there is no DEFVAR_CONSOLE_LOCAL for it but | |
96 there is a default which is used to initialize newly-creation | |
97 consoles and as a reset-value when local-vars are killed. | |
98 | |
99 | |
100 */ | |
101 struct console console_local_flags; | |
102 | |
103 /* This structure holds the names of symbols whose values may be | |
104 console-local. It is indexed and accessed in the same way as the above. */ | |
105 static Lisp_Object Vconsole_local_symbols; | |
106 static void *console_local_symbols_saved_slots; | |
107 | |
108 DEFINE_CONSOLE_TYPE (dead); | |
109 | |
110 Lisp_Object Vconsole_type_list; | |
111 | |
112 console_type_entry_dynarr *the_console_type_entry_dynarr; | |
113 | |
114 | |
934 | 115 |
1204 | 116 static const struct memory_description console_data_description_1 []= { |
117 #ifdef HAVE_TTY | |
3092 | 118 #ifdef NEW_GC |
119 { XD_LISP_OBJECT, tty_console }, | |
120 #else /* not NEW_GC */ | |
2551 | 121 { XD_BLOCK_PTR, tty_console, 1, { &tty_console_data_description} }, |
3092 | 122 #endif /* not NEW_GC */ |
1204 | 123 #endif |
3092 | 124 #ifdef NEW_GC |
125 { XD_LISP_OBJECT, stream_console }, | |
126 #else /* not NEW_GC */ | |
2551 | 127 { XD_BLOCK_PTR, stream_console, 1, { &stream_console_data_description} }, |
3092 | 128 #endif /* not NEW_GC */ |
934 | 129 { XD_END } |
130 }; | |
131 | |
1204 | 132 static const struct sized_memory_description console_data_description = { |
133 sizeof (void *), console_data_description_1 | |
934 | 134 }; |
135 | |
1204 | 136 static const struct memory_description console_description [] = { |
934 | 137 { XD_INT, offsetof (struct console, contype) }, |
1204 | 138 #define MARKED_SLOT(x) { XD_LISP_OBJECT, offsetof (struct console, x) }, |
139 #include "conslots.h" | |
2367 | 140 { XD_BLOCK_PTR, offsetof (struct console, conmeths), 1, |
2551 | 141 { &console_methods_description } }, |
934 | 142 { XD_UNION, offsetof (struct console, console_data), |
2551 | 143 XD_INDIRECT (0, 0), { &console_data_description } }, |
934 | 144 { XD_END } |
145 }; | |
146 | |
428 | 147 static Lisp_Object |
148 mark_console (Lisp_Object obj) | |
149 { | |
150 struct console *con = XCONSOLE (obj); | |
151 | |
1204 | 152 #define MARKED_SLOT(x) mark_object (con->x); |
428 | 153 #include "conslots.h" |
154 | |
155 /* Can be zero for Vconsole_defaults, Vconsole_local_symbols */ | |
156 if (con->conmeths) | |
157 { | |
158 mark_object (con->conmeths->symbol); | |
159 MAYBE_CONMETH (con, mark_console, (con)); | |
160 } | |
161 | |
162 return Qnil; | |
163 } | |
164 | |
165 static void | |
2286 | 166 print_console (Lisp_Object obj, Lisp_Object printcharfun, |
167 int UNUSED (escapeflag)) | |
428 | 168 { |
169 struct console *con = XCONSOLE (obj); | |
170 | |
171 if (print_readably) | |
4846 | 172 printing_unreadable_lcrecord (obj, XSTRING_DATA (con->name)); |
428 | 173 |
800 | 174 write_fmt_string (printcharfun, "#<%s-console", |
175 !CONSOLE_LIVE_P (con) ? "dead" : CONSOLE_TYPE_NAME (con)); | |
440 | 176 if (CONSOLE_LIVE_P (con) && !NILP (CONSOLE_CONNECTION (con))) |
800 | 177 write_fmt_string_lisp (printcharfun, " on %S", 1, |
178 CONSOLE_CONNECTION (con)); | |
179 write_fmt_string (printcharfun, " 0x%x>", con->header.uid); | |
428 | 180 } |
181 | |
934 | 182 DEFINE_LRECORD_IMPLEMENTATION ("console", console, |
183 0, /*dumpable-flag*/ | |
184 mark_console, print_console, 0, 0, 0, | |
185 console_description, | |
186 struct console); | |
428 | 187 |
1204 | 188 |
189 static void | |
190 set_quit_events (struct console *con, Lisp_Object key) | |
191 { | |
192 /* Make sure to run Fcharacter_to_event() *BEFORE* setting QUIT_CHAR, | |
193 so that nothing is changed when invalid values trigger an error! */ | |
194 con->quit_event = Fcharacter_to_event (key, Qnil, wrap_console (con), Qnil); | |
195 con->quit_char = key; | |
196 con->critical_quit_event = Fcopy_event (con->quit_event, Qnil); | |
197 upshift_event (con->critical_quit_event); | |
198 } | |
199 | |
428 | 200 static struct console * |
1204 | 201 allocate_console (Lisp_Object type) |
428 | 202 { |
203 Lisp_Object console; | |
3017 | 204 struct console *con = ALLOC_LCRECORD_TYPE (struct console, &lrecord_console); |
428 | 205 struct gcpro gcpro1; |
206 | |
3017 | 207 COPY_LCRECORD (con, XCONSOLE (Vconsole_defaults)); |
428 | 208 |
793 | 209 console = wrap_console (con); |
428 | 210 GCPRO1 (console); |
211 | |
1204 | 212 con->conmeths = decode_console_type (type, ERROR_ME); |
213 con->contype = get_console_variant (type); | |
771 | 214 con->command_builder = allocate_command_builder (console, 1); |
428 | 215 con->function_key_map = Fmake_sparse_keymap (Qnil); |
1204 | 216 set_quit_events (con, make_char (7)); /* C-g */ |
428 | 217 |
218 UNGCPRO; | |
219 return con; | |
220 } | |
221 | |
222 struct console * | |
223 decode_console (Lisp_Object console) | |
224 { | |
225 if (NILP (console)) | |
226 console = Fselected_console (); | |
227 /* quietly accept devices and frames for the console arg */ | |
228 if (DEVICEP (console) || FRAMEP (console)) | |
229 console = DEVICE_CONSOLE (decode_device (console)); | |
230 CHECK_LIVE_CONSOLE (console); | |
231 return XCONSOLE (console); | |
232 } | |
233 | |
234 | |
235 struct console_methods * | |
578 | 236 decode_console_type (Lisp_Object type, Error_Behavior errb) |
428 | 237 { |
238 int i; | |
239 | |
240 for (i = 0; i < Dynarr_length (the_console_type_entry_dynarr); i++) | |
241 if (EQ (type, Dynarr_at (the_console_type_entry_dynarr, i).symbol)) | |
242 return Dynarr_at (the_console_type_entry_dynarr, i).meths; | |
243 | |
563 | 244 maybe_invalid_constant ("Invalid console type", type, Qconsole, errb); |
428 | 245 |
246 return 0; | |
247 } | |
248 | |
934 | 249 enum console_variant |
250 get_console_variant (Lisp_Object type) | |
251 { | |
252 if (EQ (type, Qtty)) | |
1204 | 253 return tty_console; |
934 | 254 |
255 if (EQ (type, Qgtk)) | |
1204 | 256 return gtk_console; |
934 | 257 |
258 if (EQ (type, Qx)) | |
1204 | 259 return x_console; |
934 | 260 |
261 if (EQ (type, Qmswindows)) | |
1204 | 262 return mswindows_console; |
934 | 263 |
1346 | 264 if (EQ (type, Qmsprinter)) |
265 return msprinter_console; | |
266 | |
934 | 267 if (EQ (type, Qstream)) |
1204 | 268 return stream_console; |
934 | 269 |
2500 | 270 ABORT (); /* should never happen */ |
934 | 271 return dead_console; |
272 } | |
273 | |
428 | 274 int |
275 valid_console_type_p (Lisp_Object type) | |
276 { | |
277 return decode_console_type (type, ERROR_ME_NOT) != 0; | |
278 } | |
279 | |
280 DEFUN ("valid-console-type-p", Fvalid_console_type_p, 1, 1, 0, /* | |
444 | 281 Return t if CONSOLE-TYPE is a valid console type. |
3025 | 282 Valid types are `x', `tty', `mswindows', `msprinter', `gtk', and `stream'. |
428 | 283 */ |
284 (console_type)) | |
285 { | |
286 return valid_console_type_p (console_type) ? Qt : Qnil; | |
287 } | |
288 | |
289 DEFUN ("console-type-list", Fconsole_type_list, 0, 0, 0, /* | |
290 Return a list of valid console types. | |
291 */ | |
292 ()) | |
293 { | |
294 return Fcopy_sequence (Vconsole_type_list); | |
295 } | |
296 | |
297 DEFUN ("cdfw-console", Fcdfw_console, 1, 1, 0, /* | |
298 Given a console, device, frame, or window, return the associated console. | |
299 Return nil otherwise. | |
300 */ | |
444 | 301 (object)) |
428 | 302 { |
444 | 303 return CDFW_CONSOLE (object); |
428 | 304 } |
305 | |
872 | 306 int |
307 console_live_p (struct console *c) | |
308 { | |
309 return CONSOLE_LIVE_P (c); | |
310 } | |
311 | |
312 Lisp_Object | |
313 console_device_list (struct console *c) | |
314 { | |
315 return CONSOLE_DEVICE_LIST (c); | |
316 } | |
317 | |
428 | 318 |
319 DEFUN ("selected-console", Fselected_console, 0, 0, 0, /* | |
320 Return the console which is currently active. | |
321 */ | |
322 ()) | |
323 { | |
324 return Vselected_console; | |
325 } | |
326 | |
327 /* Called from selected_device_1(), called from selected_frame_1(), | |
328 called from Fselect_window() */ | |
329 void | |
330 select_console_1 (Lisp_Object console) | |
331 { | |
332 /* perhaps this should do something more complicated */ | |
333 Vselected_console = console; | |
334 | |
335 /* #### Schedule this to be removed in 19.14 */ | |
336 #ifdef HAVE_X_WINDOWS | |
337 if (CONSOLE_X_P (XCONSOLE (console))) | |
338 Vwindow_system = Qx; | |
339 else | |
340 #endif | |
462 | 341 #ifdef HAVE_GTK |
342 if (CONSOLE_GTK_P (XCONSOLE (console))) | |
343 Vwindow_system = Qgtk; | |
344 else | |
345 #endif | |
428 | 346 #ifdef HAVE_MS_WINDOWS |
347 if (CONSOLE_MSWINDOWS_P (XCONSOLE (console))) | |
348 Vwindow_system = Qmswindows; | |
349 else | |
350 #endif | |
351 Vwindow_system = Qnil; | |
352 } | |
353 | |
354 DEFUN ("select-console", Fselect_console, 1, 1, 0, /* | |
355 Select the console CONSOLE. | |
356 Subsequent editing commands apply to its selected device, selected frame, | |
357 and selected window. The selection of CONSOLE lasts until the next time | |
358 the user does something to select a different console, or until the next | |
359 time this function is called. | |
360 */ | |
361 (console)) | |
362 { | |
363 Lisp_Object device; | |
364 | |
365 CHECK_LIVE_CONSOLE (console); | |
366 | |
367 device = CONSOLE_SELECTED_DEVICE (XCONSOLE (console)); | |
368 if (!NILP (device)) | |
369 { | |
370 struct device *d = XDEVICE (device); | |
371 Lisp_Object frame = DEVICE_SELECTED_FRAME (d); | |
372 if (!NILP (frame)) | |
373 { | |
374 struct frame *f = XFRAME(frame); | |
375 Fselect_window (FRAME_SELECTED_WINDOW (f), Qnil); | |
376 } | |
377 else | |
563 | 378 invalid_operation ("Can't select console with no frames", Qunbound); |
428 | 379 } |
380 else | |
563 | 381 invalid_operation ("Can't select a console with no devices", Qunbound); |
428 | 382 return Qnil; |
383 } | |
384 | |
385 void | |
386 set_console_last_nonminibuf_frame (struct console *con, | |
387 Lisp_Object frame) | |
388 { | |
389 con->last_nonminibuf_frame = frame; | |
390 } | |
391 | |
392 DEFUN ("consolep", Fconsolep, 1, 1, 0, /* | |
393 Return non-nil if OBJECT is a console. | |
394 */ | |
395 (object)) | |
396 { | |
397 return CONSOLEP (object) ? Qt : Qnil; | |
398 } | |
399 | |
400 DEFUN ("console-live-p", Fconsole_live_p, 1, 1, 0, /* | |
401 Return non-nil if OBJECT is a console that has not been deleted. | |
402 */ | |
403 (object)) | |
404 { | |
405 return CONSOLEP (object) && CONSOLE_LIVE_P (XCONSOLE (object)) ? Qt : Qnil; | |
406 } | |
407 | |
408 DEFUN ("console-type", Fconsole_type, 0, 1, 0, /* | |
444 | 409 Return the console type (e.g. `x' or `tty') of CONSOLE. |
1346 | 410 Value is |
411 `tty' for a tty console (a character-only terminal), | |
428 | 412 `x' for a console that is an X display, |
1346 | 413 `mswindows' for a console that is an MS Windows connection, |
414 `msprinter' for a console that is an MS Windows printer connection, | |
415 `gtk' for a console that is a GTK connection, | |
428 | 416 `stream' for a stream console (which acts like a stdio stream), and |
417 `dead' for a deleted console. | |
418 */ | |
419 (console)) | |
420 { | |
421 /* don't call decode_console() because we want to allow for dead | |
422 consoles. */ | |
423 if (NILP (console)) | |
424 console = Fselected_console (); | |
425 CHECK_CONSOLE (console); | |
426 return CONSOLE_TYPE (XCONSOLE (console)); | |
427 } | |
428 | |
429 DEFUN ("console-name", Fconsole_name, 0, 1, 0, /* | |
444 | 430 Return the name of CONSOLE. |
428 | 431 */ |
432 (console)) | |
433 { | |
434 return CONSOLE_NAME (decode_console (console)); | |
435 } | |
436 | |
437 DEFUN ("console-connection", Fconsole_connection, 0, 1, 0, /* | |
438 Return the connection of the specified console. | |
439 CONSOLE defaults to the selected console if omitted. | |
440 */ | |
441 (console)) | |
442 { | |
443 return CONSOLE_CONNECTION (decode_console (console)); | |
444 } | |
445 | |
446 static Lisp_Object | |
447 semi_canonicalize_console_connection (struct console_methods *meths, | |
578 | 448 Lisp_Object name, Error_Behavior errb) |
428 | 449 { |
440 | 450 if (HAS_CONTYPE_METH_P (meths, semi_canonicalize_console_connection)) |
451 return CONTYPE_METH (meths, semi_canonicalize_console_connection, | |
452 (name, errb)); | |
453 else | |
454 return CONTYPE_METH_OR_GIVEN (meths, canonicalize_console_connection, | |
455 (name, errb), name); | |
428 | 456 } |
457 | |
458 static Lisp_Object | |
459 canonicalize_console_connection (struct console_methods *meths, | |
578 | 460 Lisp_Object name, Error_Behavior errb) |
428 | 461 { |
440 | 462 if (HAS_CONTYPE_METH_P (meths, canonicalize_console_connection)) |
463 return CONTYPE_METH (meths, canonicalize_console_connection, | |
464 (name, errb)); | |
465 else | |
466 return CONTYPE_METH_OR_GIVEN (meths, semi_canonicalize_console_connection, | |
467 (name, errb), name); | |
428 | 468 } |
469 | |
470 static Lisp_Object | |
471 find_console_of_type (struct console_methods *meths, Lisp_Object canon) | |
472 { | |
473 Lisp_Object concons; | |
474 | |
475 CONSOLE_LOOP (concons) | |
476 { | |
477 Lisp_Object console = XCAR (concons); | |
478 | |
479 if (EQ (CONMETH_TYPE (meths), CONSOLE_TYPE (XCONSOLE (console))) | |
480 && internal_equal (CONSOLE_CANON_CONNECTION (XCONSOLE (console)), | |
481 canon, 0)) | |
482 return console; | |
483 } | |
484 | |
485 return Qnil; | |
486 } | |
487 | |
488 DEFUN ("find-console", Ffind_console, 1, 2, 0, /* | |
489 Look for an existing console attached to connection CONNECTION. | |
490 Return the console if found; otherwise, return nil. | |
491 | |
492 If TYPE is specified, only return consoles of that type; otherwise, | |
493 return consoles of any type. (It is possible, although unlikely, | |
494 that two consoles of different types could have the same connection | |
495 name; in such a case, the first console found is returned.) | |
496 */ | |
497 (connection, type)) | |
498 { | |
499 Lisp_Object canon = Qnil; | |
500 struct gcpro gcpro1; | |
501 | |
502 GCPRO1 (canon); | |
503 | |
504 if (!NILP (type)) | |
505 { | |
506 struct console_methods *conmeths = decode_console_type (type, ERROR_ME); | |
507 canon = canonicalize_console_connection (conmeths, connection, | |
508 ERROR_ME_NOT); | |
509 if (UNBOUNDP (canon)) | |
510 RETURN_UNGCPRO (Qnil); | |
511 | |
512 RETURN_UNGCPRO (find_console_of_type (conmeths, canon)); | |
513 } | |
514 else | |
515 { | |
516 int i; | |
517 | |
518 for (i = 0; i < Dynarr_length (the_console_type_entry_dynarr); i++) | |
519 { | |
520 struct console_methods *conmeths = | |
521 Dynarr_at (the_console_type_entry_dynarr, i).meths; | |
522 canon = canonicalize_console_connection (conmeths, connection, | |
523 ERROR_ME_NOT); | |
524 if (!UNBOUNDP (canon)) | |
525 { | |
526 Lisp_Object console = find_console_of_type (conmeths, canon); | |
527 if (!NILP (console)) | |
528 RETURN_UNGCPRO (console); | |
529 } | |
530 } | |
531 | |
532 RETURN_UNGCPRO (Qnil); | |
533 } | |
534 } | |
535 | |
536 DEFUN ("get-console", Fget_console, 1, 2, 0, /* | |
537 Look for an existing console attached to connection CONNECTION. | |
538 Return the console if found; otherwise, signal an error. | |
539 | |
540 If TYPE is specified, only return consoles of that type; otherwise, | |
541 return consoles of any type. (It is possible, although unlikely, | |
542 that two consoles of different types could have the same connection | |
543 name; in such a case, the first console found is returned.) | |
544 */ | |
545 (connection, type)) | |
546 { | |
547 Lisp_Object console = Ffind_console (connection, type); | |
548 if (NILP (console)) | |
549 { | |
550 if (NILP (type)) | |
563 | 551 invalid_argument ("No such console", connection); |
428 | 552 else |
563 | 553 invalid_argument_2 ("No such console", type, connection); |
428 | 554 } |
555 return console; | |
556 } | |
557 | |
558 Lisp_Object | |
559 create_console (Lisp_Object name, Lisp_Object type, Lisp_Object connection, | |
560 Lisp_Object props) | |
561 { | |
562 /* This function can GC */ | |
563 struct console *con; | |
564 Lisp_Object console; | |
565 struct gcpro gcpro1; | |
566 | |
567 console = Ffind_console (connection, type); | |
568 if (!NILP (console)) | |
569 return console; | |
570 | |
1204 | 571 con = allocate_console (type); |
793 | 572 console = wrap_console (con); |
428 | 573 |
574 GCPRO1 (console); | |
575 | |
576 CONSOLE_NAME (con) = name; | |
577 CONSOLE_CONNECTION (con) = | |
578 semi_canonicalize_console_connection (con->conmeths, connection, | |
579 ERROR_ME); | |
580 CONSOLE_CANON_CONNECTION (con) = | |
581 canonicalize_console_connection (con->conmeths, connection, | |
582 ERROR_ME); | |
583 | |
584 MAYBE_CONMETH (con, init_console, (con, props)); | |
585 | |
586 /* Do it this way so that the console list is in order of creation */ | |
587 Vconsole_list = nconc2 (Vconsole_list, Fcons (console, Qnil)); | |
853 | 588 note_object_created (console); |
428 | 589 |
440 | 590 if (CONMETH_OR_GIVEN (con, initially_selected_for_input, (con), 0)) |
428 | 591 event_stream_select_console (con); |
592 | |
593 UNGCPRO; | |
594 return console; | |
595 } | |
596 | |
597 void | |
598 add_entry_to_console_type_list (Lisp_Object symbol, | |
599 struct console_methods *meths) | |
600 { | |
601 struct console_type_entry entry; | |
602 | |
603 entry.symbol = symbol; | |
604 entry.meths = meths; | |
605 Dynarr_add (the_console_type_entry_dynarr, entry); | |
606 Vconsole_type_list = Fcons (symbol, Vconsole_type_list); | |
607 } | |
608 | |
609 /* find a console other than the selected one. Prefer non-stream | |
610 consoles over stream consoles. */ | |
611 | |
612 static Lisp_Object | |
613 find_other_console (Lisp_Object console) | |
614 { | |
615 Lisp_Object concons; | |
616 | |
617 /* look for a non-stream console */ | |
618 CONSOLE_LOOP (concons) | |
619 { | |
620 Lisp_Object con = XCAR (concons); | |
621 if (!CONSOLE_STREAM_P (XCONSOLE (con)) | |
622 && !EQ (con, console) | |
623 && !NILP (CONSOLE_SELECTED_DEVICE (XCONSOLE (con))) | |
624 && !NILP (DEVICE_SELECTED_FRAME | |
625 (XDEVICE (CONSOLE_SELECTED_DEVICE (XCONSOLE (con)))))) | |
626 break; | |
627 } | |
628 if (!NILP (concons)) | |
629 return XCAR (concons); | |
630 | |
631 /* OK, now look for a stream console */ | |
632 CONSOLE_LOOP (concons) | |
633 { | |
634 Lisp_Object con = XCAR (concons); | |
635 if (!EQ (con, console) | |
636 && !NILP (CONSOLE_SELECTED_DEVICE (XCONSOLE (con))) | |
637 && !NILP (DEVICE_SELECTED_FRAME | |
638 (XDEVICE (CONSOLE_SELECTED_DEVICE (XCONSOLE (con)))))) | |
639 break; | |
640 } | |
641 if (!NILP (concons)) | |
642 return XCAR (concons); | |
643 | |
644 /* Sorry, there ain't none */ | |
645 return Qnil; | |
646 } | |
647 | |
648 static int | |
649 find_nonminibuffer_frame_not_on_console_predicate (Lisp_Object frame, | |
650 void *closure) | |
651 { | |
652 Lisp_Object console; | |
653 | |
5013 | 654 console = GET_LISP_FROM_VOID (closure); |
428 | 655 if (FRAME_MINIBUF_ONLY_P (XFRAME (frame))) |
656 return 0; | |
657 if (EQ (console, FRAME_CONSOLE (XFRAME (frame)))) | |
658 return 0; | |
659 return 1; | |
660 } | |
661 | |
662 static Lisp_Object | |
663 find_nonminibuffer_frame_not_on_console (Lisp_Object console) | |
664 { | |
665 return find_some_frame (find_nonminibuffer_frame_not_on_console_predicate, | |
5013 | 666 STORE_LISP_IN_VOID (console)); |
428 | 667 } |
668 | |
617 | 669 static void |
670 nuke_all_console_slots (struct console *con, Lisp_Object zap) | |
671 { | |
3017 | 672 ZERO_LCRECORD (con); |
617 | 673 |
1204 | 674 #define MARKED_SLOT(x) con->x = zap; |
617 | 675 #include "conslots.h" |
676 } | |
677 | |
428 | 678 /* Delete console CON. |
679 | |
680 If FORCE is non-zero, allow deletion of the only frame. | |
681 | |
682 If CALLED_FROM_KILL_EMACS is non-zero, then, if | |
683 deleting the last console, just delete it, | |
684 instead of calling `save-buffers-kill-emacs'. | |
685 | |
686 If FROM_IO_ERROR is non-zero, then the console is gone due | |
687 to an I/O error. This affects what happens if we exit | |
688 (we do an emergency exit instead of `save-buffers-kill-emacs'.) | |
689 */ | |
690 | |
691 void | |
692 delete_console_internal (struct console *con, int force, | |
693 int called_from_kill_emacs, int from_io_error) | |
694 { | |
695 /* This function can GC */ | |
696 Lisp_Object console; | |
697 struct gcpro gcpro1; | |
698 | |
699 /* OK to delete an already-deleted console. */ | |
700 if (!CONSOLE_LIVE_P (con)) | |
701 return; | |
702 | |
793 | 703 console = wrap_console (con); |
853 | 704 |
705 if (!force) | |
706 check_allowed_operation (OPERATION_DELETE_OBJECT, console, Qnil); | |
707 | |
428 | 708 GCPRO1 (console); |
709 | |
710 if (!called_from_kill_emacs) | |
711 { | |
712 int down_we_go = 0; | |
713 | |
714 if ((XINT (Flength (Vconsole_list)) == 1) | |
715 /* if we just created the console, it might not be listed, | |
716 or something ... */ | |
717 && !NILP (memq_no_quit (console, Vconsole_list))) | |
718 down_we_go = 1; | |
719 /* If there aren't any nonminibuffer frames that would | |
720 be left, then exit. */ | |
721 else if (NILP (find_nonminibuffer_frame_not_on_console (console))) | |
722 down_we_go = 1; | |
723 | |
724 if (down_we_go) | |
725 { | |
726 if (!force) | |
563 | 727 invalid_operation ("Attempt to delete the only frame", Qunbound); |
428 | 728 else if (from_io_error) |
729 { | |
730 /* Mayday mayday! We're going down! */ | |
731 stderr_out (" Autosaving and exiting...\n"); | |
732 Vwindow_system = Qnil; /* let it lie! */ | |
733 preparing_for_armageddon = 1; | |
734 Fkill_emacs (make_int (70)); | |
735 } | |
736 else | |
737 { | |
738 call0 (Qsave_buffers_kill_emacs); | |
739 UNGCPRO; | |
740 /* If we get here, the user said they didn't want | |
741 to exit, so don't. */ | |
742 return; | |
743 } | |
744 } | |
745 } | |
746 | |
747 /* Breathe a sigh of relief. We're still alive. */ | |
748 | |
749 { | |
750 Lisp_Object frmcons, devcons; | |
751 | |
752 /* First delete all frames without their own minibuffers, | |
753 to avoid errors coming from attempting to delete a frame | |
754 that is a surrogate for another frame. | |
755 | |
756 We don't set "called_from_delete_console" because we want the | |
757 device to go ahead and get deleted if we delete the last frame | |
758 on a device. We won't run into trouble here because for any | |
759 frame without a minibuffer, there has to be another one on | |
760 the same console with a minibuffer, and we're not deleting that, | |
761 so delete_console_internal() won't get recursively called. | |
762 | |
763 WRONG! With surrogate minibuffers this isn't true. Frames | |
764 with only a minibuffer are not enough to prevent | |
765 delete_frame_internal from triggering a device deletion. */ | |
766 CONSOLE_FRAME_LOOP_NO_BREAK (frmcons, devcons, con) | |
767 { | |
768 struct frame *f = XFRAME (XCAR (frmcons)); | |
769 /* delete_frame_internal() might do anything such as run hooks, | |
770 so be defensive. */ | |
771 if (FRAME_LIVE_P (f) && !FRAME_HAS_MINIBUF_P (f)) | |
772 delete_frame_internal (f, 1, 1, from_io_error); | |
773 | |
774 if (!CONSOLE_LIVE_P (con)) /* make sure the delete-*-hook didn't | |
775 go ahead and delete anything */ | |
776 { | |
777 UNGCPRO; | |
778 return; | |
779 } | |
780 } | |
781 | |
782 CONSOLE_DEVICE_LOOP (devcons, con) | |
783 { | |
784 struct device *d = XDEVICE (XCAR (devcons)); | |
785 /* delete_device_internal() might do anything such as run hooks, | |
786 so be defensive. */ | |
787 if (DEVICE_LIVE_P (d)) | |
788 delete_device_internal (d, 1, 1, from_io_error); | |
789 if (!CONSOLE_LIVE_P (con)) /* make sure the delete-*-hook didn't | |
790 go ahead and delete anything */ | |
791 { | |
792 UNGCPRO; | |
793 return; | |
794 } | |
795 } | |
796 } | |
797 | |
798 CONSOLE_SELECTED_DEVICE (con) = Qnil; | |
799 | |
800 /* try to select another console */ | |
801 | |
802 if (EQ (console, Fselected_console ())) | |
803 { | |
804 Lisp_Object other_dev = find_other_console (console); | |
805 if (!NILP (other_dev)) | |
806 Fselect_console (other_dev); | |
807 else | |
808 { | |
809 /* necessary? */ | |
810 Vselected_console = Qnil; | |
811 Vwindow_system = Qnil; | |
812 } | |
813 } | |
814 | |
815 if (con->input_enabled) | |
816 event_stream_unselect_console (con); | |
817 | |
818 MAYBE_CONMETH (con, delete_console, (con)); | |
819 | |
820 Vconsole_list = delq_no_quit (console, Vconsole_list); | |
617 | 821 |
428 | 822 RESET_CHANGED_SET_FLAGS; |
617 | 823 |
824 /* Nobody should be accessing anything in this object any more, and | |
825 making all Lisp_Objects Qnil allows for better GC'ing in case a | |
826 pointer to the dead console continues to hang around. Zero all | |
827 other structs in case someone tries to access something through | |
828 them. */ | |
829 nuke_all_console_slots (con, Qnil); | |
428 | 830 con->conmeths = dead_console_methods; |
1204 | 831 con->contype = dead_console; |
853 | 832 note_object_deleted (console); |
428 | 833 |
834 UNGCPRO; | |
835 } | |
836 | |
837 void | |
838 io_error_delete_console (Lisp_Object console) | |
839 { | |
840 delete_console_internal (XCONSOLE (console), 1, 0, 1); | |
841 } | |
842 | |
843 DEFUN ("delete-console", Fdelete_console, 1, 2, 0, /* | |
844 Delete CONSOLE, permanently eliminating it from use. | |
845 Normally, you cannot delete the last non-minibuffer-only frame (you must | |
846 use `save-buffers-kill-emacs' or `kill-emacs'). However, if optional | |
847 second argument FORCE is non-nil, you can delete the last frame. (This | |
848 will automatically call `save-buffers-kill-emacs'.) | |
849 */ | |
850 (console, force)) | |
851 { | |
852 CHECK_CONSOLE (console); | |
853 delete_console_internal (XCONSOLE (console), !NILP (force), 0, 0); | |
854 return Qnil; | |
855 } | |
856 | |
857 DEFUN ("console-list", Fconsole_list, 0, 0, 0, /* | |
858 Return a list of all consoles. | |
859 */ | |
860 ()) | |
861 { | |
862 return Fcopy_sequence (Vconsole_list); | |
863 } | |
864 | |
865 DEFUN ("console-device-list", Fconsole_device_list, 0, 1, 0, /* | |
866 Return a list of all devices on CONSOLE. | |
444 | 867 If CONSOLE is nil, the selected console is used. |
428 | 868 */ |
869 (console)) | |
870 { | |
871 return Fcopy_sequence (CONSOLE_DEVICE_LIST (decode_console (console))); | |
872 } | |
873 | |
874 DEFUN ("console-enable-input", Fconsole_enable_input, 1, 1, 0, /* | |
875 Enable input on console CONSOLE. | |
876 */ | |
877 (console)) | |
878 { | |
879 struct console *con = decode_console (console); | |
880 if (!con->input_enabled) | |
881 event_stream_select_console (con); | |
882 return Qnil; | |
883 } | |
884 | |
885 DEFUN ("console-disable-input", Fconsole_disable_input, 1, 1, 0, /* | |
886 Disable input on console CONSOLE. | |
887 */ | |
888 (console)) | |
889 { | |
890 struct console *con = decode_console (console); | |
891 if (con->input_enabled) | |
892 event_stream_unselect_console (con); | |
893 return Qnil; | |
894 } | |
895 | |
896 DEFUN ("console-on-window-system-p", Fconsole_on_window_system_p, 0, 1, 0, /* | |
444 | 897 Return t if CONSOLE is on a window system. |
898 If CONSOLE is nil, the selected console is used. | |
428 | 899 This generally means that there is support for the mouse, the menubar, |
900 the toolbar, glyphs, etc. | |
901 */ | |
902 (console)) | |
903 { | |
904 Lisp_Object type = CONSOLE_TYPE (decode_console (console)); | |
905 | |
906 return !EQ (type, Qtty) && !EQ (type, Qstream) ? Qt : Qnil; | |
907 } | |
908 | |
909 | |
910 | |
911 /**********************************************************************/ | |
912 /* Miscellaneous low-level functions */ | |
913 /**********************************************************************/ | |
914 | |
915 static Lisp_Object | |
916 unwind_init_sys_modes (Lisp_Object console) | |
917 { | |
918 reinit_initial_console (); | |
919 | |
920 if (!no_redraw_on_reenter && | |
921 CONSOLEP (console) && | |
922 CONSOLE_LIVE_P (XCONSOLE (console))) | |
923 { | |
924 struct frame *f = | |
925 XFRAME (DEVICE_SELECTED_FRAME | |
926 (XDEVICE (CONSOLE_SELECTED_DEVICE (XCONSOLE (console))))); | |
927 MARK_FRAME_CHANGED (f); | |
928 } | |
929 return Qnil; | |
930 } | |
931 | |
932 DEFUN ("suspend-emacs", Fsuspend_emacs, 0, 1, "", /* | |
933 Stop Emacs and return to superior process. You can resume later. | |
934 On systems that don't have job control, run a subshell instead. | |
935 | |
936 If optional arg STUFFSTRING is non-nil, its characters are stuffed | |
937 to be read as terminal input by Emacs's superior shell. | |
938 | |
939 Before suspending, run the normal hook `suspend-hook'. | |
940 After resumption run the normal hook `suspend-resume-hook'. | |
941 | |
942 Some operating systems cannot stop the Emacs process and resume it later. | |
943 On such systems, Emacs will start a subshell and wait for it to exit. | |
944 */ | |
945 (stuffstring)) | |
946 { | |
947 int speccount = specpdl_depth (); | |
948 struct gcpro gcpro1; | |
949 | |
950 if (!NILP (stuffstring)) | |
951 CHECK_STRING (stuffstring); | |
952 GCPRO1 (stuffstring); | |
953 | |
954 /* There used to be a check that the initial console is TTY. | |
955 This is bogus. Even checking to see whether any console | |
956 is a controlling terminal is not correct -- maybe | |
957 the user used the -t option or something. If we want to | |
958 suspend, then we suspend. Period. */ | |
959 | |
960 /* Call value of suspend-hook. */ | |
961 run_hook (Qsuspend_hook); | |
962 | |
963 reset_initial_console (); | |
964 /* sys_suspend can get an error if it tries to fork a subshell | |
965 and the system resources aren't available for that. */ | |
966 record_unwind_protect (unwind_init_sys_modes, Vcontrolling_terminal); | |
967 stuff_buffered_input (stuffstring); | |
968 sys_suspend (); | |
969 /* the console is un-reset inside of the unwind-protect. */ | |
771 | 970 unbind_to (speccount); |
428 | 971 |
972 #ifdef SIGWINCH | |
973 /* It is possible that a size change occurred while we were | |
974 suspended. Assume one did just to be safe. It won't hurt | |
975 anything if one didn't. */ | |
976 asynch_device_change_pending++; | |
977 #endif | |
978 | |
979 /* Call value of suspend-resume-hook | |
980 if it is bound and value is non-nil. */ | |
981 run_hook (Qsuspend_resume_hook); | |
982 | |
983 UNGCPRO; | |
984 return Qnil; | |
985 } | |
986 | |
987 /* If STUFFSTRING is a string, stuff its contents as pending terminal input. | |
988 Then in any case stuff anything Emacs has read ahead and not used. */ | |
989 | |
990 void | |
2286 | 991 stuff_buffered_input ( |
3146 | 992 #if defined(BSD) && defined(HAVE_TTY) |
2286 | 993 Lisp_Object stuffstring |
994 #else | |
995 Lisp_Object UNUSED (stuffstring) | |
996 #endif | |
997 ) | |
428 | 998 { |
999 /* stuff_char works only in BSD, versions 4.2 and up. */ | |
3146 | 1000 #if defined(BSD) && defined(HAVE_TTY) |
428 | 1001 if (!CONSOLEP (Vcontrolling_terminal) || |
1002 !CONSOLE_LIVE_P (XCONSOLE (Vcontrolling_terminal))) | |
1003 return; | |
1004 | |
1005 if (STRINGP (stuffstring)) | |
1006 { | |
665 | 1007 Bytecount count; |
428 | 1008 Extbyte *p; |
1009 | |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4846
diff
changeset
|
1010 LISP_STRING_TO_SIZED_EXTERNAL (stuffstring, p, count, Qkeyboard); |
428 | 1011 while (count-- > 0) |
1012 stuff_char (XCONSOLE (Vcontrolling_terminal), *p++); | |
1013 stuff_char (XCONSOLE (Vcontrolling_terminal), '\n'); | |
1014 } | |
1015 /* Anything we have read ahead, put back for the shell to read. */ | |
1016 # if 0 /* oh, who cares about this silliness */ | |
1017 while (kbd_fetch_ptr != kbd_store_ptr) | |
1018 { | |
1019 if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE) | |
1020 kbd_fetch_ptr = kbd_buffer; | |
1021 stuff_char (XCONSOLE (Vcontrolling_terminal), *kbd_fetch_ptr++); | |
1022 } | |
1023 # endif | |
3146 | 1024 #endif /* BSD && HAVE_TTY */ |
428 | 1025 } |
1026 | |
1027 DEFUN ("suspend-console", Fsuspend_console, 0, 1, "", /* | |
1028 Suspend a console. For tty consoles, it sends a signal to suspend | |
1029 the process in charge of the tty, and removes the devices and | |
1030 frames of that console from the display. | |
1031 | |
1032 If optional arg CONSOLE is non-nil, it is the console to be suspended. | |
1033 Otherwise it is assumed to be the selected console. | |
1034 | |
1035 Some operating systems cannot stop processes and resume them later. | |
1036 On such systems, who knows what will happen. | |
1037 */ | |
2340 | 1038 (USED_IF_TTY (console))) |
428 | 1039 { |
1040 #ifdef HAVE_TTY | |
1041 struct console *con = decode_console (console); | |
1042 | |
1043 if (CONSOLE_TTY_P (con)) | |
1044 { | |
1045 /* | |
1046 * hide all the unhidden frames so the display code won't update | |
1047 * them while the console is suspended. | |
1048 */ | |
1049 Lisp_Object device = CONSOLE_SELECTED_DEVICE (con); | |
1050 if (!NILP (device)) | |
1051 { | |
1052 struct device *d = XDEVICE (device); | |
1053 Lisp_Object frame_list = DEVICE_FRAME_LIST (d); | |
1054 while (CONSP (frame_list)) | |
1055 { | |
1056 struct frame *f = XFRAME (XCAR (frame_list)); | |
1057 if (FRAME_REPAINT_P (f)) | |
1058 f->visible = -1; | |
1059 frame_list = XCDR (frame_list); | |
1060 } | |
1061 } | |
1062 reset_one_console (con); | |
1063 event_stream_unselect_console (con); | |
1064 sys_suspend_process (XINT (Fconsole_tty_controlling_process (console))); | |
1065 } | |
1066 #endif /* HAVE_TTY */ | |
1067 | |
1068 return Qnil; | |
1069 } | |
1070 | |
1071 DEFUN ("resume-console", Fresume_console, 1, 1, "", /* | |
1072 Re-initialize a previously suspended console. | |
1073 For tty consoles, do stuff to the tty to make it sane again. | |
1074 */ | |
2340 | 1075 (USED_IF_TTY (console))) |
428 | 1076 { |
1077 #ifdef HAVE_TTY | |
1078 struct console *con = decode_console (console); | |
1079 | |
1080 if (CONSOLE_TTY_P (con)) | |
1081 { | |
1082 /* raise the selected frame */ | |
1083 Lisp_Object device = CONSOLE_SELECTED_DEVICE (con); | |
1084 if (!NILP (device)) | |
1085 { | |
1086 struct device *d = XDEVICE (device); | |
1087 Lisp_Object frame = DEVICE_SELECTED_FRAME (d); | |
1088 if (!NILP (frame)) | |
1089 { | |
1090 /* force the frame to be cleared */ | |
1091 SET_FRAME_CLEAR (XFRAME (frame)); | |
1092 Fraise_frame (frame); | |
1093 } | |
1094 } | |
1095 init_one_console (con); | |
1096 event_stream_select_console (con); | |
1097 #ifdef SIGWINCH | |
1098 /* The same as in Fsuspend_emacs: it is possible that a size | |
1099 change occurred while we were suspended. Assume one did just | |
1100 to be safe. It won't hurt anything if one didn't. */ | |
1101 asynch_device_change_pending++; | |
1102 #endif | |
1103 } | |
1104 #endif /* HAVE_TTY */ | |
1105 | |
1106 return Qnil; | |
1107 } | |
1108 | |
1109 DEFUN ("set-input-mode", Fset_input_mode, 3, 5, 0, /* | |
1110 Set mode of reading keyboard input. | |
1204 | 1111 First arg (formerly INTERRUPT-INPUT) is ignored, for backward compatibility. |
428 | 1112 Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal |
1113 (no effect except in CBREAK mode). | |
1114 Third arg META t means accept 8-bit input (for a Meta key). | |
1115 META nil means ignore the top bit, on the assumption it is parity. | |
1116 Otherwise, accept 8-bit input and don't use the top bit for Meta. | |
1117 First three arguments only apply to TTY consoles. | |
1118 Optional fourth arg QUIT if non-nil specifies character to use for quitting. | |
1119 Optional fifth arg CONSOLE specifies console to make changes to; nil means | |
1120 the selected console. | |
1121 See also `current-input-mode'. | |
1122 */ | |
2340 | 1123 (UNUSED (ignored), USED_IF_TTY (flow), meta, quit, console)) |
428 | 1124 { |
1125 struct console *con = decode_console (console); | |
1126 int meta_key = (!CONSOLE_TTY_P (con) ? 1 : | |
1127 EQ (meta, Qnil) ? 0 : | |
1128 EQ (meta, Qt) ? 1 : | |
1129 2); | |
1130 | |
1131 if (!NILP (quit)) | |
1132 { | |
1204 | 1133 if (CHAR_OR_CHAR_INTP (quit) && !meta_key) |
1134 set_quit_events (con, make_char (XCHAR_OR_CHAR_INT (quit) & 0177)); | |
1135 else | |
1136 set_quit_events (con, quit); | |
428 | 1137 } |
1138 | |
1139 #ifdef HAVE_TTY | |
1140 if (CONSOLE_TTY_P (con)) | |
1141 { | |
1142 reset_one_console (con); | |
1143 TTY_FLAGS (con).flow_control = !NILP (flow); | |
1144 TTY_FLAGS (con).meta_key = meta_key; | |
1145 init_one_console (con); | |
444 | 1146 MARK_FRAME_CHANGED (XFRAME (CONSOLE_SELECTED_FRAME (con))); |
428 | 1147 } |
1148 #endif | |
1149 | |
1150 return Qnil; | |
1151 } | |
1152 | |
1153 DEFUN ("current-input-mode", Fcurrent_input_mode, 0, 1, 0, /* | |
1154 Return information about the way Emacs currently reads keyboard input. | |
1155 Optional arg CONSOLE specifies console to return information about; nil means | |
1156 the selected console. | |
1157 The value is a list of the form (nil FLOW META QUIT), where | |
1158 FLOW is non-nil if Emacs uses ^S/^Q flow control for output to the | |
1159 terminal; this does not apply if Emacs uses interrupt-driven input. | |
1160 META is t if accepting 8-bit input with 8th bit as Meta flag. | |
1161 META nil means ignoring the top bit, on the assumption it is parity. | |
1162 META is neither t nor nil if accepting 8-bit input and using | |
1163 all 8 bits as the character code. | |
1164 QUIT is the character Emacs currently uses to quit. | |
1165 FLOW, and META are only meaningful for TTY consoles. | |
1166 The elements of this list correspond to the arguments of | |
1167 `set-input-mode'. | |
1168 */ | |
1169 (console)) | |
1170 { | |
1171 struct console *con = decode_console (console); | |
1204 | 1172 Lisp_Object flow, meta; |
428 | 1173 |
1174 #ifdef HAVE_TTY | |
1175 flow = CONSOLE_TTY_P (con) && TTY_FLAGS (con).flow_control ? Qt : Qnil; | |
1176 meta = (!CONSOLE_TTY_P (con) ? Qt : | |
1177 TTY_FLAGS (con).meta_key == 1 ? Qt : | |
1178 TTY_FLAGS (con).meta_key == 2 ? Qzero : | |
1179 Qnil); | |
1180 #else | |
1181 flow = Qnil; | |
1182 meta = Qt; | |
1183 #endif | |
1184 | |
1204 | 1185 return list4 (Qnil, flow, meta, CONSOLE_QUIT_CHAR (con)); |
428 | 1186 } |
1187 | |
1188 | |
1189 /************************************************************************/ | |
1190 /* initialization */ | |
1191 /************************************************************************/ | |
1192 | |
1193 void | |
1194 syms_of_console (void) | |
1195 { | |
442 | 1196 INIT_LRECORD_IMPLEMENTATION (console); |
3092 | 1197 #ifdef NEW_GC |
1198 #ifdef HAVE_TTY | |
1199 INIT_LRECORD_IMPLEMENTATION (tty_console); | |
1200 #endif | |
1201 INIT_LRECORD_IMPLEMENTATION (stream_console); | |
3263 | 1202 #endif /* NEW_GC */ |
442 | 1203 |
428 | 1204 DEFSUBR (Fvalid_console_type_p); |
1205 DEFSUBR (Fconsole_type_list); | |
1206 DEFSUBR (Fcdfw_console); | |
1207 DEFSUBR (Fselected_console); | |
1208 DEFSUBR (Fselect_console); | |
1209 DEFSUBR (Fconsolep); | |
1210 DEFSUBR (Fconsole_live_p); | |
1211 DEFSUBR (Fconsole_type); | |
1212 DEFSUBR (Fconsole_name); | |
1213 DEFSUBR (Fconsole_connection); | |
1214 DEFSUBR (Ffind_console); | |
1215 DEFSUBR (Fget_console); | |
1216 DEFSUBR (Fdelete_console); | |
1217 DEFSUBR (Fconsole_list); | |
1218 DEFSUBR (Fconsole_device_list); | |
1219 DEFSUBR (Fconsole_enable_input); | |
1220 DEFSUBR (Fconsole_disable_input); | |
1221 DEFSUBR (Fconsole_on_window_system_p); | |
1222 DEFSUBR (Fsuspend_console); | |
1223 DEFSUBR (Fresume_console); | |
1224 | |
1225 DEFSUBR (Fsuspend_emacs); | |
1226 DEFSUBR (Fset_input_mode); | |
1227 DEFSUBR (Fcurrent_input_mode); | |
1228 | |
563 | 1229 DEFSYMBOL (Qconsolep); |
1230 DEFSYMBOL (Qconsole_live_p); | |
428 | 1231 |
563 | 1232 DEFSYMBOL (Qcreate_console_hook); |
1233 DEFSYMBOL (Qdelete_console_hook); | |
428 | 1234 |
563 | 1235 DEFSYMBOL (Qsuspend_hook); |
1236 DEFSYMBOL (Qsuspend_resume_hook); | |
428 | 1237 } |
1238 | |
1204 | 1239 static const struct memory_description cte_description_1[] = { |
440 | 1240 { XD_LISP_OBJECT, offsetof (console_type_entry, symbol) }, |
2551 | 1241 { XD_BLOCK_PTR, offsetof (console_type_entry, meths), 1, |
1242 { &console_methods_description } }, | |
428 | 1243 { XD_END } |
1244 }; | |
1245 | |
1204 | 1246 static const struct sized_memory_description cte_description = { |
440 | 1247 sizeof (console_type_entry), |
428 | 1248 cte_description_1 |
1249 }; | |
1250 | |
1204 | 1251 static const struct memory_description cted_description_1[] = { |
440 | 1252 XD_DYNARR_DESC (console_type_entry_dynarr, &cte_description), |
428 | 1253 { XD_END } |
1254 }; | |
1255 | |
1204 | 1256 const struct sized_memory_description cted_description = { |
440 | 1257 sizeof (console_type_entry_dynarr), |
428 | 1258 cted_description_1 |
1259 }; | |
1260 | |
1204 | 1261 static const struct memory_description console_methods_description_1[] = { |
440 | 1262 { XD_LISP_OBJECT, offsetof (struct console_methods, symbol) }, |
1263 { XD_LISP_OBJECT, offsetof (struct console_methods, predicate_symbol) }, | |
1264 { XD_LISP_OBJECT, offsetof (struct console_methods, image_conversion_list) }, | |
428 | 1265 { XD_END } |
1266 }; | |
1267 | |
1204 | 1268 const struct sized_memory_description console_methods_description = { |
440 | 1269 sizeof (struct console_methods), |
428 | 1270 console_methods_description_1 |
1271 }; | |
1272 | |
1273 | |
1274 void | |
1275 console_type_create (void) | |
1276 { | |
1277 the_console_type_entry_dynarr = Dynarr_new (console_type_entry); | |
2367 | 1278 dump_add_root_block_ptr (&the_console_type_entry_dynarr, &cted_description); |
428 | 1279 |
1280 Vconsole_type_list = Qnil; | |
1281 staticpro (&Vconsole_type_list); | |
1282 | |
1283 /* Initialize the dead console type */ | |
1284 INITIALIZE_CONSOLE_TYPE (dead, "dead", "console-dead-p"); | |
1285 | |
1286 /* then reset the console-type lists, because `dead' is not really | |
1287 a valid console type */ | |
1288 Dynarr_reset (the_console_type_entry_dynarr); | |
1289 Vconsole_type_list = Qnil; | |
1290 } | |
1291 | |
1292 void | |
1293 reinit_vars_of_console (void) | |
1294 { | |
1295 staticpro_nodump (&Vconsole_list); | |
1296 Vconsole_list = Qnil; | |
1297 staticpro_nodump (&Vselected_console); | |
1298 Vselected_console = Qnil; | |
1299 } | |
1300 | |
1301 void | |
1302 vars_of_console (void) | |
1303 { | |
1304 DEFVAR_LISP ("create-console-hook", &Vcreate_console_hook /* | |
1305 Function or functions to call when a console is created. | |
1306 One argument, the newly-created console. | |
1307 This is called after the first frame has been created, but before | |
1308 calling the `create-device-hook' or `create-frame-hook'. | |
1309 Note that in general the console will not be selected. | |
1310 */ ); | |
1311 Vcreate_console_hook = Qnil; | |
1312 | |
1313 DEFVAR_LISP ("delete-console-hook", &Vdelete_console_hook /* | |
1314 Function or functions to call when a console is deleted. | |
1315 One argument, the to-be-deleted console. | |
1316 */ ); | |
1317 Vdelete_console_hook = Qnil; | |
1318 | |
1319 #ifdef HAVE_WINDOW_SYSTEM | |
1320 Fprovide (intern ("window-system")); | |
1321 #endif | |
1322 } | |
1323 | |
643 | 1324 /* The docstrings for DEFVAR_* are recorded externally by make-docfile. */ |
3263 | 1325 #ifdef NEW_GC |
2720 | 1326 #define DEFVAR_CONSOLE_LOCAL_1(lname, field_name, forward_type, magic_fun) \ |
1327 do { \ | |
1328 struct symbol_value_forward *I_hate_C = \ | |
1329 alloc_lrecord_type (struct symbol_value_forward, \ | |
1330 &lrecord_symbol_value_forward); \ | |
1331 /*mcpro ((Lisp_Object) I_hate_C);*/ \ | |
1332 \ | |
1333 I_hate_C->magic.value = &(console_local_flags.field_name); \ | |
1334 I_hate_C->magic.type = forward_type; \ | |
1335 I_hate_C->magicfun = magic_fun; \ | |
1336 \ | |
1337 MARK_LRECORD_AS_LISP_READONLY (I_hate_C); \ | |
1338 \ | |
1339 { \ | |
1340 int offset = ((char *)symbol_value_forward_forward (I_hate_C) \ | |
1341 - (char *)&console_local_flags); \ | |
1342 \ | |
1343 defvar_magic (lname, I_hate_C); \ | |
1344 \ | |
1345 *((Lisp_Object *)(offset + (char *)XCONSOLE (Vconsole_local_symbols))) \ | |
1346 = intern (lname); \ | |
1347 } \ | |
1348 } while (0) | |
3263 | 1349 #else /* not NEW_GC */ |
617 | 1350 #define DEFVAR_CONSOLE_LOCAL_1(lname, field_name, forward_type, magicfun) \ |
1351 do { \ | |
1352 static const struct symbol_value_forward I_hate_C = \ | |
1353 { /* struct symbol_value_forward */ \ | |
1354 { /* struct symbol_value_magic */ \ | |
3024 | 1355 { /* struct old_lcrecord_header */ \ |
617 | 1356 { /* struct lrecord_header */ \ |
1357 lrecord_type_symbol_value_forward, /* lrecord_type_index */ \ | |
1358 1, /* mark bit */ \ | |
1359 1, /* c_readonly bit */ \ | |
1360 1 /* lisp_readonly bit */ \ | |
1361 }, \ | |
1362 0, /* next */ \ | |
1363 0, /* uid */ \ | |
1364 0 /* free */ \ | |
1365 }, \ | |
1366 &(console_local_flags.field_name), \ | |
1367 forward_type \ | |
1368 }, \ | |
1369 magicfun \ | |
1370 }; \ | |
1371 \ | |
1372 { \ | |
1373 int offset = ((char *)symbol_value_forward_forward (&I_hate_C) \ | |
1374 - (char *)&console_local_flags); \ | |
1375 \ | |
1376 defvar_magic (lname, &I_hate_C); \ | |
1377 \ | |
1378 *((Lisp_Object *)(offset + (char *)XCONSOLE (Vconsole_local_symbols))) \ | |
1379 = intern (lname); \ | |
1380 } \ | |
428 | 1381 } while (0) |
3263 | 1382 #endif /* not NEW_GC */ |
428 | 1383 |
1384 #define DEFVAR_CONSOLE_LOCAL_MAGIC(lname, field_name, magicfun) \ | |
1385 DEFVAR_CONSOLE_LOCAL_1 (lname, field_name, \ | |
1386 SYMVAL_SELECTED_CONSOLE_FORWARD, magicfun) | |
1387 #define DEFVAR_CONSOLE_LOCAL(lname, field_name) \ | |
1388 DEFVAR_CONSOLE_LOCAL_MAGIC (lname, field_name, 0) | |
1389 #define DEFVAR_CONST_CONSOLE_LOCAL_MAGIC(lname, field_name, magicfun) \ | |
1390 DEFVAR_CONSOLE_LOCAL_1 (lname, field_name, \ | |
1391 SYMVAL_CONST_SELECTED_CONSOLE_FORWARD, magicfun) | |
1392 #define DEFVAR_CONST_CONSOLE_LOCAL(lname, field_name) \ | |
1393 DEFVAR_CONST_CONSOLE_LOCAL_MAGIC (lname, field_name, 0) | |
1394 | |
1395 #define DEFVAR_CONSOLE_DEFAULTS_MAGIC(lname, field_name, magicfun) \ | |
1396 DEFVAR_SYMVAL_FWD(lname, &(console_local_flags.field_name), \ | |
1397 SYMVAL_DEFAULT_CONSOLE_FORWARD, magicfun) | |
1398 #define DEFVAR_CONSOLE_DEFAULTS(lname, field_name) \ | |
1399 DEFVAR_CONSOLE_DEFAULTS_MAGIC (lname, field_name, 0) | |
1400 | |
1401 static void | |
1402 common_init_complex_vars_of_console (void) | |
1403 { | |
1404 /* Make sure all markable slots in console_defaults | |
1405 are initialized reasonably, so mark_console won't choke. | |
1406 */ | |
3017 | 1407 struct console *defs = ALLOC_LCRECORD_TYPE (struct console, &lrecord_console); |
1408 struct console *syms = ALLOC_LCRECORD_TYPE (struct console, &lrecord_console); | |
428 | 1409 |
1410 staticpro_nodump (&Vconsole_defaults); | |
1411 staticpro_nodump (&Vconsole_local_symbols); | |
793 | 1412 Vconsole_defaults = wrap_console (defs); |
1413 Vconsole_local_symbols = wrap_console (syms); | |
428 | 1414 |
1415 nuke_all_console_slots (syms, Qnil); | |
1416 nuke_all_console_slots (defs, Qnil); | |
1417 | |
1418 /* Set up the non-nil default values of various console slots. | |
1419 Must do these before making the first console. | |
1420 */ | |
1204 | 1421 |
1422 /* ... Nothing here for the moment. | |
1423 #### Console-local variables should probably be eliminated.*/ | |
428 | 1424 |
1425 { | |
1426 /* 0 means var is always local. Default used only at creation. | |
1427 * -1 means var is always local. Default used only at reset and | |
1428 * creation. | |
1429 * -2 means there's no lisp variable corresponding to this slot | |
1430 * and the default is only used at creation. | |
1431 * -3 means no Lisp variable. Default used only at reset and creation. | |
1432 * >0 is mask. Var is local if ((console->local_var_flags & mask) != 0) | |
1433 * Otherwise default is used. | |
1434 * | |
1435 * #### We don't currently ever reset console variables, so there | |
1436 * is no current distinction between 0 and -1, and between -2 and -3. | |
1437 */ | |
1438 Lisp_Object always_local_resettable = make_int (-1); | |
1439 | |
1440 #if 0 /* not used */ | |
1441 Lisp_Object always_local_no_default = make_int (0); | |
1442 Lisp_Object resettable = make_int (-3); | |
1443 #endif | |
1444 | |
1445 /* Assign the local-flags to the slots that have default values. | |
1446 The local flag is a bit that is used in the console | |
1447 to say that it has its own local value for the slot. | |
1448 The local flag bits are in the local_var_flags slot of the | |
1449 console. */ | |
1450 | |
1451 nuke_all_console_slots (&console_local_flags, make_int (-2)); | |
1452 console_local_flags.defining_kbd_macro = always_local_resettable; | |
1453 console_local_flags.last_kbd_macro = always_local_resettable; | |
1454 console_local_flags.prefix_arg = always_local_resettable; | |
1455 console_local_flags.default_minibuffer_frame = always_local_resettable; | |
1456 console_local_flags.overriding_terminal_local_map = | |
1457 always_local_resettable; | |
1458 #ifdef HAVE_TTY | |
1459 console_local_flags.tty_erase_char = always_local_resettable; | |
1460 #endif | |
1461 | |
1462 console_local_flags.function_key_map = make_int (1); | |
1463 | |
1464 /* #### Warning, 0x4000000 (that's six zeroes) is the largest number | |
1465 currently allowable due to the XINT() handling of this value. | |
1466 With some rearrangement you can get 4 more bits. */ | |
1467 } | |
1468 } | |
1469 | |
1470 | |
1471 #define CONSOLE_SLOTS_SIZE (offsetof (struct console, CONSOLE_SLOTS_LAST_NAME) - offsetof (struct console, CONSOLE_SLOTS_FIRST_NAME) + sizeof (Lisp_Object)) | |
1472 #define CONSOLE_SLOTS_COUNT (CONSOLE_SLOTS_SIZE / sizeof (Lisp_Object)) | |
1473 | |
1474 void | |
771 | 1475 reinit_complex_vars_of_console_runtime_only (void) |
428 | 1476 { |
1477 struct console *defs, *syms; | |
1478 | |
1479 common_init_complex_vars_of_console (); | |
1480 | |
1481 defs = XCONSOLE (Vconsole_defaults); | |
1482 syms = XCONSOLE (Vconsole_local_symbols); | |
1483 memcpy (&defs->CONSOLE_SLOTS_FIRST_NAME, | |
1484 console_defaults_saved_slots, | |
1485 CONSOLE_SLOTS_SIZE); | |
1486 memcpy (&syms->CONSOLE_SLOTS_FIRST_NAME, | |
1487 console_local_symbols_saved_slots, | |
1488 CONSOLE_SLOTS_SIZE); | |
1489 } | |
1490 | |
1491 | |
1204 | 1492 static const struct memory_description console_slots_description_1[] = { |
440 | 1493 { XD_LISP_OBJECT_ARRAY, 0, CONSOLE_SLOTS_COUNT }, |
428 | 1494 { XD_END } |
1495 }; | |
1496 | |
1204 | 1497 static const struct sized_memory_description console_slots_description = { |
428 | 1498 CONSOLE_SLOTS_SIZE, |
1499 console_slots_description_1 | |
1500 }; | |
1501 | |
1502 void | |
1503 complex_vars_of_console (void) | |
1504 { | |
1505 struct console *defs, *syms; | |
1506 | |
1507 common_init_complex_vars_of_console (); | |
1508 | |
1509 defs = XCONSOLE (Vconsole_defaults); | |
1510 syms = XCONSOLE (Vconsole_local_symbols); | |
1511 console_defaults_saved_slots = &defs->CONSOLE_SLOTS_FIRST_NAME; | |
1512 console_local_symbols_saved_slots = &syms->CONSOLE_SLOTS_FIRST_NAME; | |
2367 | 1513 dump_add_root_block_ptr (&console_defaults_saved_slots, &console_slots_description); |
1514 dump_add_root_block_ptr (&console_local_symbols_saved_slots, &console_slots_description); | |
428 | 1515 |
1516 DEFVAR_CONSOLE_DEFAULTS ("default-function-key-map", function_key_map /* | |
1517 Default value of `function-key-map' for consoles that don't override it. | |
1518 This is the same as (default-value 'function-key-map). | |
1519 */ ); | |
1520 | |
1521 DEFVAR_CONSOLE_LOCAL ("function-key-map", function_key_map /* | |
1522 Keymap mapping ASCII function key sequences onto their preferred forms. | |
1523 This allows Emacs to recognize function keys sent from ASCII | |
1524 terminals at any point in a key sequence. | |
1525 | |
1526 The `read-key-sequence' function replaces any subsequence bound by | |
1527 `function-key-map' with its binding. More precisely, when the active | |
1528 keymaps have no binding for the current key sequence but | |
1529 `function-key-map' binds a suffix of the sequence to a vector or string, | |
1530 `read-key-sequence' replaces the matching suffix with its binding, and | |
2027 | 1531 continues with the new sequence. See `key-binding'. |
428 | 1532 |
1533 The events that come from bindings in `function-key-map' are not | |
1534 themselves looked up in `function-key-map'. | |
1535 | |
1536 For example, suppose `function-key-map' binds `ESC O P' to [f1]. | |
1537 Typing `ESC O P' to `read-key-sequence' would return | |
1538 \[#<keypress-event f1>]. Typing `C-x ESC O P' would return | |
1539 \[#<keypress-event control-X> #<keypress-event f1>]. If [f1] | |
1540 were a prefix key, typing `ESC O P x' would return | |
1541 \[#<keypress-event f1> #<keypress-event x>]. | |
1542 */ ); | |
1543 | |
1544 #ifdef HAVE_TTY | |
440 | 1545 /* #### Should this somehow go to TTY data? How do we make it |
428 | 1546 accessible from Lisp, then? */ |
1547 DEFVAR_CONSOLE_LOCAL ("tty-erase-char", tty_erase_char /* | |
1548 The ERASE character as set by the user with stty. | |
1549 When this value cannot be determined or would be meaningless (on non-TTY | |
1550 consoles, for example), it is set to nil. | |
1551 */ ); | |
1552 #endif | |
1553 | |
442 | 1554 /* While this should be const it can't be because some things |
428 | 1555 (i.e. edebug) do manipulate it. */ |
1556 DEFVAR_CONSOLE_LOCAL ("defining-kbd-macro", defining_kbd_macro /* | |
442 | 1557 Non-nil while a keyboard macro is being defined. Don't set this! |
428 | 1558 */ ); |
1559 | |
1560 DEFVAR_CONSOLE_LOCAL ("last-kbd-macro", last_kbd_macro /* | |
442 | 1561 Last keyboard macro defined, as a vector of events; nil if none defined. |
428 | 1562 */ ); |
1563 | |
1564 DEFVAR_CONSOLE_LOCAL ("prefix-arg", prefix_arg /* | |
1565 The value of the prefix argument for the next editing command. | |
1566 It may be a number, or the symbol `-' for just a minus sign as arg, | |
1567 or a list whose car is a number for just one or more C-U's | |
1568 or nil if no argument has been specified. | |
1569 | |
1570 You cannot examine this variable to find the argument for this command | |
1571 since it has been set to nil by the time you can look. | |
1572 Instead, you should use the variable `current-prefix-arg', although | |
1573 normally commands can get this prefix argument with (interactive "P"). | |
1574 */ ); | |
1575 | |
1576 DEFVAR_CONSOLE_LOCAL ("default-minibuffer-frame", | |
1577 default_minibuffer_frame /* | |
1578 Minibufferless frames use this frame's minibuffer. | |
1579 | |
1580 Emacs cannot create minibufferless frames unless this is set to an | |
1581 appropriate surrogate. | |
1582 | |
1583 XEmacs consults this variable only when creating minibufferless | |
1584 frames; once the frame is created, it sticks with its assigned | |
1585 minibuffer, no matter what this variable is set to. This means that | |
1586 this variable doesn't necessarily say anything meaningful about the | |
1587 current set of frames, or where the minibuffer is currently being | |
1588 displayed. | |
1589 */ ); | |
1590 | |
1591 DEFVAR_CONSOLE_LOCAL ("overriding-terminal-local-map", | |
1592 overriding_terminal_local_map /* | |
1593 Keymap that overrides all other local keymaps, for the selected console only. | |
1594 If this variable is non-nil, it is used as a keymap instead of the | |
1595 buffer's local map, and the minor mode keymaps and text property keymaps. | |
1596 */ ); | |
1597 | |
1598 /* Check for DEFVAR_CONSOLE_LOCAL without initializing the corresponding | |
1599 slot of console_local_flags and vice-versa. Must be done after all | |
1600 DEFVAR_CONSOLE_LOCAL() calls. */ | |
1601 #define MARKED_SLOT(slot) \ | |
1602 if ((XINT (console_local_flags.slot) != -2 && \ | |
1603 XINT (console_local_flags.slot) != -3) \ | |
1604 != !(NILP (XCONSOLE (Vconsole_local_symbols)->slot))) \ | |
2500 | 1605 ABORT (); |
428 | 1606 #include "conslots.h" |
1607 } |