2 Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
3 Copyright (C) 1996 Ben Wing.
5 This file is part of SXEmacs
7 SXEmacs is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 SXEmacs is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 /* Synched up with: Not in FSF. */
23 /* Written by Ben Wing. */
29 #include "TTY/console-tty.h" /* for Fconsole_tty_controlling process ins
30 suspend-console. Needs refactoring...*/
31 #include "events/events.h"
33 #include "redisplay.h"
37 Lisp_Object Vconsole_list, Vselected_console;
39 Lisp_Object Vcreate_console_hook, Vdelete_console_hook;
41 Lisp_Object Qconsolep, Qconsole_live_p;
42 Lisp_Object Qcreate_console_hook;
43 Lisp_Object Qdelete_console_hook;
45 Lisp_Object Qsuspend_hook;
46 Lisp_Object Qsuspend_resume_hook;
48 /* This structure holds the default values of the console-local
49 variables defined with DEFVAR_CONSOLE_LOCAL, that have special
50 slots in each console. The default value occupies the same slot
51 in this structure as an individual console's value occupies in
52 that console. Setting the default value also goes through the
53 list of consoles and stores into each console that does not say
54 it has a local value. */
55 Lisp_Object Vconsole_defaults;
56 static void *console_defaults_saved_slots;
58 /* This structure marks which slots in a console have corresponding
59 default values in console_defaults.
60 Each such slot has a nonzero value in this structure.
61 The value has only one nonzero bit.
63 When a console has its own local value for a slot,
64 the bit for that slot (found in the same slot in this structure)
65 is turned on in the console's local_var_flags slot.
67 If a slot in this structure is 0, then there is a DEFVAR_CONSOLE_LOCAL
68 for the slot, but there is no default value for it; the corresponding
69 slot in console_defaults is not used except to initialize newly-created
72 If a slot is -1, then there is a DEFVAR_CONSOLE_LOCAL for it
73 as well as a default value which is used to initialize newly-created
74 consoles and as a reset-value when local-vars are killed.
76 If a slot is -2, there is no DEFVAR_CONSOLE_LOCAL for it.
77 (The slot is always local, but there's no lisp variable for it.)
78 The default value is only used to initialize newly-creation consoles.
80 If a slot is -3, then there is no DEFVAR_CONSOLE_LOCAL for it but
81 there is a default which is used to initialize newly-creation
82 consoles and as a reset-value when local-vars are killed.
85 struct console console_local_flags;
87 /* This structure holds the names of symbols whose values may be
88 console-local. It is indexed and accessed in the same way as the above. */
89 static Lisp_Object Vconsole_local_symbols;
90 static void *console_local_symbols_saved_slots;
92 DEFINE_CONSOLE_TYPE(dead);
94 Lisp_Object Vconsole_type_list;
96 console_type_entry_dynarr *the_console_type_entry_dynarr;
98 static Lisp_Object mark_console(Lisp_Object obj)
100 struct console *con = XCONSOLE(obj);
102 #define MARKED_SLOT(x) mark_object (con->x)
103 #include "conslots.h"
106 /* Can be zero for Vconsole_defaults, Vconsole_local_symbols */
108 mark_object(con->conmeths->symbol);
109 MAYBE_CONMETH(con, mark_console, (con));
116 print_console(Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
118 struct console *con = XCONSOLE(obj);
122 error("printing unreadable object #<console %s 0x%x>",
123 XSTRING_DATA(con->name), con->header.uid);
125 snprintf(buf, sizeof(buf), "#<%s-console", !CONSOLE_LIVE_P(con) ? "dead" :
126 CONSOLE_TYPE_NAME(con));
127 write_c_string(buf, printcharfun);
128 if (CONSOLE_LIVE_P(con) && !NILP(CONSOLE_CONNECTION(con))) {
129 write_c_string(" on ", printcharfun);
130 print_internal(CONSOLE_CONNECTION(con), printcharfun, 1);
132 sprintf(buf, " 0x%x>", con->header.uid);
133 write_c_string(buf, printcharfun);
136 DEFINE_LRECORD_IMPLEMENTATION("console", console,
137 mark_console, print_console, 0, 0, 0, 0,
140 static struct console *allocate_console(void)
143 struct console *con =
144 alloc_lcrecord_type(struct console, &lrecord_console);
147 copy_lcrecord(con, XCONSOLE(Vconsole_defaults));
149 XSETCONSOLE(console, con);
152 con->quit_char = 7; /* C-g */
153 con->command_builder = allocate_command_builder(console);
154 con->function_key_map = Fmake_sparse_keymap(Qnil);
160 struct console *decode_console(Lisp_Object console)
163 console = Fselected_console();
164 /* quietly accept devices and frames for the console arg */
165 if (DEVICEP(console) || FRAMEP(console))
166 console = DEVICE_CONSOLE(decode_device(console));
167 CHECK_LIVE_CONSOLE(console);
168 return XCONSOLE(console);
171 struct console_methods *decode_console_type(Lisp_Object type,
176 for (i = 0; i < Dynarr_length(the_console_type_entry_dynarr); i++)
178 (type, Dynarr_at(the_console_type_entry_dynarr, i).symbol))
179 return Dynarr_at(the_console_type_entry_dynarr,
182 maybe_signal_simple_error("Invalid console type", type, Qconsole, errb);
187 int valid_console_type_p(Lisp_Object type)
189 return decode_console_type(type, ERROR_ME_NOT) != 0;
192 DEFUN("valid-console-type-p", Fvalid_console_type_p, 1, 1, 0, /*
193 Return t if CONSOLE-TYPE is a valid console type.
194 Valid types are 'x, 'tty, and 'stream.
198 return valid_console_type_p(console_type) ? Qt : Qnil;
201 DEFUN("console-type-list", Fconsole_type_list, 0, 0, 0, /*
202 Return a list of valid console types.
206 return Fcopy_sequence(Vconsole_type_list);
209 DEFUN("cdfw-console", Fcdfw_console, 1, 1, 0, /*
210 Given a console, device, frame, or window, return the associated console.
211 Return nil otherwise.
215 return CDFW_CONSOLE(object);
218 DEFUN("selected-console", Fselected_console, 0, 0, 0, /*
219 Return the console which is currently active.
223 return Vselected_console;
226 /* Called from selected_device_1(), called from selected_frame_1(),
227 called from Fselect_window() */
228 void select_console_1(Lisp_Object console)
230 /* perhaps this should do something more complicated */
231 Vselected_console = console;
233 /* #### Schedule this to be removed in 19.14 */
234 #ifdef HAVE_X_WINDOWS
235 if (CONSOLE_X_P(XCONSOLE(console)))
240 if (CONSOLE_GTK_P(XCONSOLE(console)))
241 Vwindow_system = Qgtk;
244 Vwindow_system = Qnil;
247 DEFUN("select-console", Fselect_console, 1, 1, 0, /*
248 Select the console CONSOLE.
249 Subsequent editing commands apply to its selected device, selected frame,
250 and selected window. The selection of CONSOLE lasts until the next time
251 the user does something to select a different console, or until the next
252 time this function is called.
258 CHECK_LIVE_CONSOLE(console);
260 device = CONSOLE_SELECTED_DEVICE(XCONSOLE(console));
262 struct device *d = XDEVICE(device);
263 Lisp_Object frame = DEVICE_SELECTED_FRAME(d);
265 struct frame *f = XFRAME(frame);
266 Fselect_window(FRAME_SELECTED_WINDOW(f), Qnil);
268 error("Can't select console with no frames.");
270 error("Can't select a console with no devices");
274 void set_console_last_nonminibuf_frame(struct console *con, Lisp_Object frame)
276 con->last_nonminibuf_frame = frame;
279 DEFUN("consolep", Fconsolep, 1, 1, 0, /*
280 Return non-nil if OBJECT is a console.
284 return CONSOLEP(object) ? Qt : Qnil;
287 DEFUN("console-live-p", Fconsole_live_p, 1, 1, 0, /*
288 Return non-nil if OBJECT is a console that has not been deleted.
292 return CONSOLEP(object) && CONSOLE_LIVE_P(XCONSOLE(object)) ? Qt : Qnil;
295 DEFUN("console-type", Fconsole_type, 0, 1, 0, /*
296 Return the console type (e.g. `x' or `tty') of CONSOLE.
297 Value is `tty' for a tty console (a character-only terminal),
298 `x' for a console that is an X display,
299 `mswindows' for a console that is a Windows NT/95/97 connection,
300 `pc' for a console that is a direct-write MS-DOS connection (not yet
302 `stream' for a stream console (which acts like a stdio stream), and
303 `dead' for a deleted console.
307 /* don't call decode_console() because we want to allow for dead
310 console = Fselected_console();
311 CHECK_CONSOLE(console);
312 return CONSOLE_TYPE(XCONSOLE(console));
315 DEFUN("console-name", Fconsole_name, 0, 1, 0, /*
316 Return the name of CONSOLE.
320 return CONSOLE_NAME(decode_console(console));
323 DEFUN("console-connection", Fconsole_connection, 0, 1, 0, /*
324 Return the connection of the specified console.
325 CONSOLE defaults to the selected console if omitted.
329 return CONSOLE_CONNECTION(decode_console(console));
332 Lisp_Object make_console(struct console * con)
335 XSETCONSOLE(console, con);
340 semi_canonicalize_console_connection(struct console_methods *meths,
341 Lisp_Object name, Error_behavior errb)
343 if (HAS_CONTYPE_METH_P(meths, semi_canonicalize_console_connection))
344 return CONTYPE_METH(meths, semi_canonicalize_console_connection,
347 return CONTYPE_METH_OR_GIVEN(meths,
348 canonicalize_console_connection,
353 canonicalize_console_connection(struct console_methods *meths,
354 Lisp_Object name, Error_behavior errb)
356 if (HAS_CONTYPE_METH_P(meths, canonicalize_console_connection))
357 return CONTYPE_METH(meths, canonicalize_console_connection,
360 return CONTYPE_METH_OR_GIVEN(meths,
361 semi_canonicalize_console_connection,
366 find_console_of_type(struct console_methods *meths, Lisp_Object canon)
370 CONSOLE_LOOP(concons) {
371 Lisp_Object console = XCAR(concons);
373 if (EQ(CONMETH_TYPE(meths), CONSOLE_TYPE(XCONSOLE(console)))
375 internal_equal(CONSOLE_CANON_CONNECTION(XCONSOLE(console)),
383 DEFUN("find-console", Ffind_console, 1, 2, 0, /*
384 Look for an existing console attached to connection CONNECTION.
385 Return the console if found; otherwise, return nil.
387 If TYPE is specified, only return consoles of that type; otherwise,
388 return consoles of any type. (It is possible, although unlikely,
389 that two consoles of different types could have the same connection
390 name; in such a case, the first console found is returned.)
394 Lisp_Object canon = Qnil;
400 struct console_methods *conmeths =
401 decode_console_type(type, ERROR_ME);
403 canonicalize_console_connection(conmeths, connection,
406 RETURN_UNGCPRO(Qnil);
408 RETURN_UNGCPRO(find_console_of_type(conmeths, canon));
412 for (i = 0; i < Dynarr_length(the_console_type_entry_dynarr);
414 struct console_methods *conmeths =
415 Dynarr_at(the_console_type_entry_dynarr, i).meths;
417 canonicalize_console_connection(conmeths,
420 if (!UNBOUNDP(canon)) {
421 Lisp_Object console =
422 find_console_of_type(conmeths, canon);
424 RETURN_UNGCPRO(console);
428 RETURN_UNGCPRO(Qnil);
432 DEFUN("get-console", Fget_console, 1, 2, 0, /*
433 Look for an existing console attached to connection CONNECTION.
434 Return the console if found; otherwise, signal an error.
436 If TYPE is specified, only return consoles of that type; otherwise,
437 return consoles of any type. (It is possible, although unlikely,
438 that two consoles of different types could have the same connection
439 name; in such a case, the first console found is returned.)
443 Lisp_Object console = Ffind_console(connection, type);
446 signal_simple_error("No such console", connection);
448 signal_simple_error_2("No such console", type,
455 create_console(Lisp_Object name, Lisp_Object type, Lisp_Object connection,
458 /* This function can GC */
463 console = Ffind_console(connection, type);
467 con = allocate_console();
468 XSETCONSOLE(console, con);
472 con->conmeths = decode_console_type(type, ERROR_ME);
474 CONSOLE_NAME(con) = name;
475 CONSOLE_CONNECTION(con) =
476 semi_canonicalize_console_connection(con->conmeths, connection,
478 CONSOLE_CANON_CONNECTION(con) =
479 canonicalize_console_connection(con->conmeths, connection,
482 MAYBE_CONMETH(con, init_console, (con, props));
484 /* Do it this way so that the console list is in order of creation */
485 Vconsole_list = nconc2(Vconsole_list, Fcons(console, Qnil));
487 if (CONMETH_OR_GIVEN(con, initially_selected_for_input, (con), 0))
488 event_stream_select_console(con);
495 add_entry_to_console_type_list(Lisp_Object symbol,
496 struct console_methods *meths)
498 struct console_type_entry entry;
500 entry.symbol = symbol;
502 Dynarr_add(the_console_type_entry_dynarr, entry);
503 Vconsole_type_list = Fcons(symbol, Vconsole_type_list);
506 /* find a console other than the selected one. Prefer non-stream
507 consoles over stream consoles. */
509 static Lisp_Object find_other_console(Lisp_Object console)
513 /* look for a non-stream console */
514 CONSOLE_LOOP(concons) {
515 Lisp_Object con = XCAR(concons);
516 if (!CONSOLE_STREAM_P(XCONSOLE(con))
518 && !NILP(CONSOLE_SELECTED_DEVICE(XCONSOLE(con)))
519 && !NILP(DEVICE_SELECTED_FRAME
520 (XDEVICE(CONSOLE_SELECTED_DEVICE(XCONSOLE(con))))))
524 return XCAR(concons);
526 /* OK, now look for a stream console */
527 CONSOLE_LOOP(concons) {
528 Lisp_Object con = XCAR(concons);
529 if (!EQ(con, console)
530 && !NILP(CONSOLE_SELECTED_DEVICE(XCONSOLE(con)))
531 && !NILP(DEVICE_SELECTED_FRAME
532 (XDEVICE(CONSOLE_SELECTED_DEVICE(XCONSOLE(con))))))
536 return XCAR(concons);
538 /* Sorry, there ain't none */
543 find_nonminibuffer_frame_not_on_console_predicate(Lisp_Object frame,
548 VOID_TO_LISP(console, closure);
549 if (FRAME_MINIBUF_ONLY_P(XFRAME(frame)))
551 if (EQ(console, FRAME_CONSOLE(XFRAME(frame))))
556 static Lisp_Object find_nonminibuffer_frame_not_on_console(Lisp_Object console)
559 find_some_frame(find_nonminibuffer_frame_not_on_console_predicate,
560 LISP_TO_VOID(console));
563 /* Delete console CON.
565 If FORCE is non-zero, allow deletion of the only frame.
567 If CALLED_FROM_KILL_EMACS is non-zero, then, if
568 deleting the last console, just delete it,
569 instead of calling `save-buffers-kill-emacs'.
571 If FROM_IO_ERROR is non-zero, then the console is gone due
572 to an I/O error. This affects what happens if we exit
573 (we do an emergency exit instead of `save-buffers-kill-emacs'.)
577 delete_console_internal(struct console *con, int force,
578 int called_from_kill_emacs, int from_io_error)
580 /* This function can GC */
584 /* OK to delete an already-deleted console. */
585 if (!CONSOLE_LIVE_P(con))
588 XSETCONSOLE(console, con);
591 if (!called_from_kill_emacs) {
594 if ((XINT(Flength(Vconsole_list)) == 1)
595 /* if we just created the console, it might not be listed,
597 && !NILP(memq_no_quit(console, Vconsole_list)))
599 /* If there aren't any nonminibuffer frames that would
600 be left, then exit. */
601 else if (NILP(find_nonminibuffer_frame_not_on_console(console)))
606 error("Attempt to delete the only frame");
607 else if (from_io_error) {
608 /* Mayday mayday! We're going down! */
609 stderr_out(" Autosaving and exiting...\n");
610 Vwindow_system = Qnil; /* let it lie! */
611 preparing_for_armageddon = 1;
612 Fkill_emacs(make_int(70));
614 call0(Qsave_buffers_kill_emacs);
616 /* If we get here, the user said they didn't want
617 to exit, so don't. */
623 /* Breathe a sigh of relief. We're still alive. */
626 Lisp_Object frmcons, devcons;
628 /* First delete all frames without their own minibuffers,
629 to avoid errors coming from attempting to delete a frame
630 that is a surrogate for another frame.
632 We don't set "called_from_delete_console" because we want the
633 device to go ahead and get deleted if we delete the last frame
634 on a device. We won't run into trouble here because for any
635 frame without a minibuffer, there has to be another one on
636 the same console with a minibuffer, and we're not deleting that,
637 so delete_console_internal() won't get recursively called.
639 WRONG! With surrogate minibuffers this isn't true. Frames
640 with only a minibuffer are not enough to prevent
641 delete_frame_internal from triggering a device deletion. */
642 CONSOLE_FRAME_LOOP_NO_BREAK(frmcons, devcons, con) {
643 struct frame *f = XFRAME(XCAR(frmcons));
644 /* delete_frame_internal() might do anything such as run hooks,
646 if (FRAME_LIVE_P(f) && !FRAME_HAS_MINIBUF_P(f))
647 delete_frame_internal(f, 1, 1, from_io_error);
649 if (!CONSOLE_LIVE_P(con)) { /* make sure the delete-*-hook didn't
650 go ahead and delete anything */
656 CONSOLE_DEVICE_LOOP(devcons, con) {
657 struct device *d = XDEVICE(XCAR(devcons));
658 /* delete_device_internal() might do anything such as run hooks,
660 if (DEVICE_LIVE_P(d))
661 delete_device_internal(d, 1, 1, from_io_error);
662 if (!CONSOLE_LIVE_P(con)) { /* make sure the delete-*-hook didn't
663 go ahead and delete anything */
670 CONSOLE_SELECTED_DEVICE(con) = Qnil;
672 /* try to select another console */
674 if (EQ(console, Fselected_console())) {
675 Lisp_Object other_dev = find_other_console(console);
676 if (!NILP(other_dev))
677 Fselect_console(other_dev);
680 Vselected_console = Qnil;
681 Vwindow_system = Qnil;
685 if (con->input_enabled)
686 event_stream_unselect_console(con);
688 MAYBE_CONMETH(con, delete_console, (con));
690 Vconsole_list = delq_no_quit(console, Vconsole_list);
691 RESET_CHANGED_SET_FLAGS;
692 con->conmeths = dead_console_methods;
697 void io_error_delete_console(Lisp_Object console)
699 delete_console_internal(XCONSOLE(console), 1, 0, 1);
702 DEFUN("delete-console", Fdelete_console, 1, 2, 0, /*
703 Delete CONSOLE, permanently eliminating it from use.
704 Normally, you cannot delete the last non-minibuffer-only frame (you must
705 use `save-buffers-kill-emacs' or `kill-emacs'). However, if optional
706 second argument FORCE is non-nil, you can delete the last frame. (This
707 will automatically call `save-buffers-kill-emacs'.)
711 CHECK_CONSOLE(console);
712 delete_console_internal(XCONSOLE(console), !NILP(force), 0, 0);
716 DEFUN("console-list", Fconsole_list, 0, 0, 0, /*
717 Return a list of all consoles.
721 return Fcopy_sequence(Vconsole_list);
724 DEFUN("console-device-list", Fconsole_device_list, 0, 1, 0, /*
725 Return a list of all devices on CONSOLE.
726 If CONSOLE is nil, the selected console is used.
730 return Fcopy_sequence(CONSOLE_DEVICE_LIST(decode_console(console)));
733 DEFUN("console-enable-input", Fconsole_enable_input, 1, 1, 0, /*
734 Enable input on console CONSOLE.
738 struct console *con = decode_console(console);
739 if (!con->input_enabled)
740 event_stream_select_console(con);
744 DEFUN("console-disable-input", Fconsole_disable_input, 1, 1, 0, /*
745 Disable input on console CONSOLE.
749 struct console *con = decode_console(console);
750 if (con->input_enabled)
751 event_stream_unselect_console(con);
755 DEFUN("console-on-window-system-p", Fconsole_on_window_system_p, 0, 1, 0, /*
756 Return t if CONSOLE is on a window system.
757 If CONSOLE is nil, the selected console is used.
758 This generally means that there is support for the mouse, the menubar,
759 the toolbar, glyphs, etc.
763 Lisp_Object type = CONSOLE_TYPE(decode_console(console));
765 return !EQ(type, Qtty) && !EQ(type, Qstream) ? Qt : Qnil;
768 /**********************************************************************/
769 /* Miscellaneous low-level functions */
770 /**********************************************************************/
772 static Lisp_Object unwind_init_sys_modes(Lisp_Object console)
774 reinit_initial_console();
776 if (!no_redraw_on_reenter &&
777 CONSOLEP(console) && CONSOLE_LIVE_P(XCONSOLE(console))) {
779 XFRAME(DEVICE_SELECTED_FRAME
781 (CONSOLE_SELECTED_DEVICE(XCONSOLE(console)))));
782 MARK_FRAME_CHANGED(f);
787 DEFUN("suspend-emacs", Fsuspend_emacs, 0, 1, "", /*
788 Stop Emacs and return to superior process. You can resume later.
789 On systems that don't have job control, run a subshell instead.
791 If optional arg STUFFSTRING is non-nil, its characters are stuffed
792 to be read as terminal input by Emacs's superior shell.
794 Before suspending, run the normal hook `suspend-hook'.
795 After resumption run the normal hook `suspend-resume-hook'.
797 Some operating systems cannot stop the Emacs process and resume it later.
798 On such systems, Emacs will start a subshell and wait for it to exit.
802 int speccount = specpdl_depth();
805 if (!NILP(stuffstring))
806 CHECK_STRING(stuffstring);
809 /* There used to be a check that the initial console is TTY.
810 This is bogus. Even checking to see whether any console
811 is a controlling terminal is not correct -- maybe
812 the user used the -t option or something. If we want to
813 suspend, then we suspend. Period. */
815 /* Call value of suspend-hook. */
816 run_hook(Qsuspend_hook);
818 reset_initial_console();
819 /* sys_suspend can get an error if it tries to fork a subshell
820 and the system resources aren't available for that. */
821 record_unwind_protect(unwind_init_sys_modes, Vcontrolling_terminal);
822 stuff_buffered_input(stuffstring);
824 /* the console is un-reset inside of the unwind-protect. */
825 unbind_to(speccount, Qnil);
828 /* It is possible that a size change occurred while we were
829 suspended. Assume one did just to be safe. It won't hurt
830 anything if one didn't. */
831 asynch_device_change_pending++;
834 /* Call value of suspend-resume-hook
835 if it is bound and value is non-nil. */
836 run_hook(Qsuspend_resume_hook);
842 /* If STUFFSTRING is a string, stuff its contents as pending terminal input.
843 Then in any case stuff anything Emacs has read ahead and not used. */
845 void stuff_buffered_input(Lisp_Object stuffstring)
847 /* stuff_char works only in BSD, versions 4.2 and up. */
848 #if defined (BSD) && defined (HAVE_TTY)
849 if (!CONSOLEP(Vcontrolling_terminal) ||
850 !CONSOLE_LIVE_P(XCONSOLE(Vcontrolling_terminal)))
853 if (STRINGP(stuffstring)) {
857 TO_EXTERNAL_FORMAT(LISP_STRING, stuffstring,
858 ALLOCA, (p, count), Qkeyboard);
860 stuff_char(XCONSOLE(Vcontrolling_terminal), *p++);
861 stuff_char(XCONSOLE(Vcontrolling_terminal), '\n');
863 /* Anything we have read ahead, put back for the shell to read. */
864 # if 0 /* oh, who cares about this silliness */
865 while (kbd_fetch_ptr != kbd_store_ptr) {
866 if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
867 kbd_fetch_ptr = kbd_buffer;
868 stuff_char(XCONSOLE(Vcontrolling_terminal), *kbd_fetch_ptr++);
871 #endif /* BSD && HAVE_TTY */
874 DEFUN("suspend-console", Fsuspend_console, 0, 1, "", /*
875 Suspend a console. For tty consoles, it sends a signal to suspend
876 the process in charge of the tty, and removes the devices and
877 frames of that console from the display.
879 If optional arg CONSOLE is non-nil, it is the console to be suspended.
880 Otherwise it is assumed to be the selected console.
882 Some operating systems cannot stop processes and resume them later.
883 On such systems, who knows what will happen.
888 struct console *con = decode_console(console);
890 if (CONSOLE_TTY_P(con)) {
892 * hide all the unhidden frames so the display code won't update
893 * them while the console is suspended.
895 Lisp_Object device = CONSOLE_SELECTED_DEVICE(con);
897 struct device *d = XDEVICE(device);
898 Lisp_Object frame_list = DEVICE_FRAME_LIST(d);
899 while (CONSP(frame_list)) {
900 struct frame *f = XFRAME(XCAR(frame_list));
901 if (FRAME_REPAINT_P(f))
903 frame_list = XCDR(frame_list);
906 reset_one_console(con);
907 event_stream_unselect_console(con);
908 sys_suspend_process(XINT
909 (Fconsole_tty_controlling_process
912 #endif /* HAVE_TTY */
917 DEFUN("resume-console", Fresume_console, 1, 1, "", /*
918 Re-initialize a previously suspended console.
919 For tty consoles, do stuff to the tty to make it sane again.
924 struct console *con = decode_console(console);
926 if (CONSOLE_TTY_P(con)) {
927 /* raise the selected frame */
928 Lisp_Object device = CONSOLE_SELECTED_DEVICE(con);
930 struct device *d = XDEVICE(device);
931 Lisp_Object frame = DEVICE_SELECTED_FRAME(d);
933 /* force the frame to be cleared */
934 SET_FRAME_CLEAR(XFRAME(frame));
938 init_one_console(con);
939 event_stream_select_console(con);
941 /* The same as in Fsuspend_emacs: it is possible that a size
942 change occurred while we were suspended. Assume one did just
943 to be safe. It won't hurt anything if one didn't. */
944 asynch_device_change_pending++;
947 #endif /* HAVE_TTY */
952 DEFUN("set-input-mode", Fset_input_mode, 3, 5, 0, /*
953 Set mode of reading keyboard input.
954 First arg is ignored, for backward compatibility.
955 Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal
956 (no effect except in CBREAK mode).
957 Third arg META t means accept 8-bit input (for a Meta key).
958 META nil means ignore the top bit, on the assumption it is parity.
959 Otherwise, accept 8-bit input and don't use the top bit for Meta.
960 First three arguments only apply to TTY consoles.
961 Optional fourth arg QUIT if non-nil specifies character to use for quitting.
962 Optional fifth arg CONSOLE specifies console to make changes to; nil means
963 the selected console.
964 See also `current-input-mode'.
966 (ignored, flow, meta, quit, console))
968 struct console *con = decode_console(console);
969 int meta_key = (!CONSOLE_TTY_P(con) ? 1 :
970 EQ(meta, Qnil) ? 0 : EQ(meta, Qt) ? 1 : 2);
973 CHECK_CHAR_COERCE_INT(quit);
974 CONSOLE_QUIT_CHAR(con) =
975 ((unsigned int)XCHAR(quit)) & (meta_key ? 0377 : 0177);
978 if (CONSOLE_TTY_P(con)) {
979 reset_one_console(con);
980 TTY_FLAGS(con).flow_control = !NILP(flow);
981 TTY_FLAGS(con).meta_key = meta_key;
982 init_one_console(con);
983 MARK_FRAME_CHANGED(XFRAME(CONSOLE_SELECTED_FRAME(con)));
990 DEFUN("current-input-mode", Fcurrent_input_mode, 0, 1, 0, /*
991 Return information about the way Emacs currently reads keyboard input.
992 Optional arg CONSOLE specifies console to return information about; nil means
993 the selected console.
994 The value is a list of the form (nil FLOW META QUIT), where
995 FLOW is non-nil if Emacs uses ^S/^Q flow control for output to the
996 terminal; this does not apply if Emacs uses interrupt-driven input.
997 META is t if accepting 8-bit input with 8th bit as Meta flag.
998 META nil means ignoring the top bit, on the assumption it is parity.
999 META is neither t nor nil if accepting 8-bit input and using
1000 all 8 bits as the character code.
1001 QUIT is the character Emacs currently uses to quit.
1002 FLOW, and META are only meaningful for TTY consoles.
1003 The elements of this list correspond to the arguments of
1008 struct console *con = decode_console(console);
1009 Lisp_Object flow, meta, quit;
1012 flow = CONSOLE_TTY_P(con) && TTY_FLAGS(con).flow_control ? Qt : Qnil;
1013 meta = (!CONSOLE_TTY_P(con) ? Qt :
1014 TTY_FLAGS(con).meta_key == 1 ? Qt :
1015 TTY_FLAGS(con).meta_key == 2 ? Qzero : Qnil);
1020 quit = make_char(CONSOLE_QUIT_CHAR(con));
1022 return list4(Qnil, flow, meta, quit);
1025 /************************************************************************/
1026 /* initialization */
1027 /************************************************************************/
1029 void syms_of_console(void)
1031 INIT_LRECORD_IMPLEMENTATION(console);
1033 DEFSUBR(Fvalid_console_type_p);
1034 DEFSUBR(Fconsole_type_list);
1035 DEFSUBR(Fcdfw_console);
1036 DEFSUBR(Fselected_console);
1037 DEFSUBR(Fselect_console);
1039 DEFSUBR(Fconsole_live_p);
1040 DEFSUBR(Fconsole_type);
1041 DEFSUBR(Fconsole_name);
1042 DEFSUBR(Fconsole_connection);
1043 DEFSUBR(Ffind_console);
1044 DEFSUBR(Fget_console);
1045 DEFSUBR(Fdelete_console);
1046 DEFSUBR(Fconsole_list);
1047 DEFSUBR(Fconsole_device_list);
1048 DEFSUBR(Fconsole_enable_input);
1049 DEFSUBR(Fconsole_disable_input);
1050 DEFSUBR(Fconsole_on_window_system_p);
1051 DEFSUBR(Fsuspend_console);
1052 DEFSUBR(Fresume_console);
1054 DEFSUBR(Fsuspend_emacs);
1055 DEFSUBR(Fset_input_mode);
1056 DEFSUBR(Fcurrent_input_mode);
1058 defsymbol(&Qconsolep, "consolep");
1059 defsymbol(&Qconsole_live_p, "console-live-p");
1061 defsymbol(&Qcreate_console_hook, "create-console-hook");
1062 defsymbol(&Qdelete_console_hook, "delete-console-hook");
1064 defsymbol(&Qsuspend_hook, "suspend-hook");
1065 defsymbol(&Qsuspend_resume_hook, "suspend-resume-hook");
1068 static const struct lrecord_description cte_description_1[] = {
1069 {XD_LISP_OBJECT, offsetof(console_type_entry, symbol)},
1070 {XD_STRUCT_PTR, offsetof(console_type_entry, meths), 1,
1071 &console_methods_description},
1075 static const struct struct_description cte_description = {
1076 sizeof(console_type_entry),
1080 static const struct lrecord_description cted_description_1[] = {
1081 XD_DYNARR_DESC(console_type_entry_dynarr, &cte_description),
1085 const struct struct_description cted_description = {
1086 sizeof(console_type_entry_dynarr),
1090 static const struct lrecord_description console_methods_description_1[] = {
1091 {XD_LISP_OBJECT, offsetof(struct console_methods, symbol)},
1092 {XD_LISP_OBJECT, offsetof(struct console_methods, predicate_symbol)},
1094 offsetof(struct console_methods, image_conversion_list)},
1098 const struct struct_description console_methods_description = {
1099 sizeof(struct console_methods),
1100 console_methods_description_1
1103 void console_type_create(void)
1105 the_console_type_entry_dynarr = Dynarr_new(console_type_entry);
1106 dump_add_root_struct_ptr(&the_console_type_entry_dynarr,
1109 Vconsole_type_list = Qnil;
1110 staticpro(&Vconsole_type_list);
1112 /* Initialize the dead console type */
1113 INITIALIZE_CONSOLE_TYPE(dead, "dead", "console-dead-p");
1115 /* then reset the console-type lists, because `dead' is not really
1116 a valid console type */
1117 Dynarr_reset(the_console_type_entry_dynarr);
1118 Vconsole_type_list = Qnil;
1121 void reinit_vars_of_console(void)
1123 staticpro_nodump(&Vconsole_list);
1124 Vconsole_list = Qnil;
1125 staticpro_nodump(&Vselected_console);
1126 Vselected_console = Qnil;
1129 void vars_of_console(void)
1131 reinit_vars_of_console();
1133 DEFVAR_LISP("create-console-hook", &Vcreate_console_hook /*
1134 Function or functions to call when a console is created.
1135 One argument, the newly-created console.
1136 This is called after the first frame has been created, but before
1137 calling the `create-device-hook' or `create-frame-hook'.
1138 Note that in general the console will not be selected.
1140 Vcreate_console_hook = Qnil;
1142 DEFVAR_LISP("delete-console-hook", &Vdelete_console_hook /*
1143 Function or functions to call when a console is deleted.
1144 One argument, the to-be-deleted console.
1146 Vdelete_console_hook = Qnil;
1148 #ifdef HAVE_WINDOW_SYSTEM
1149 Fprovide(intern("window-system"));
1153 /* The docstrings for DEFVAR_* are recorded externally by make-docfile. */
1154 #if defined HAVE_BDWGC && defined EF_USE_BDWGC
1156 #define DEFVAR_CONSOLE_LOCAL_1(lname, field_name, forward_type, magicfun) do { \
1157 static const struct symbol_value_forward I_hate_C = \
1158 { /* struct symbol_value_forward */ \
1159 { /* struct symbol_value_magic */ \
1160 { /* struct lcrecord_header */ \
1161 { /* struct lrecord_header */ \
1162 lrecord_type_symbol_value_forward, /* lrecord_type_index */ \
1164 1, /* c_readonly bit */ \
1165 1 /* lisp_readonly bit */ \
1170 &(console_local_flags.field_name), \
1177 int offset = ((char *)symbol_value_forward_forward (&I_hate_C) \
1178 - (char *)&console_local_flags); \
1180 defvar_magic (lname, &I_hate_C); \
1182 *((Lisp_Object *)(offset + (char *)XCONSOLE (Vconsole_local_symbols))) \
1189 #define DEFVAR_CONSOLE_LOCAL_1(lname, field_name, forward_type, magicfun) do { \
1190 static const struct symbol_value_forward I_hate_C = \
1191 { /* struct symbol_value_forward */ \
1192 { /* struct symbol_value_magic */ \
1193 { /* struct lcrecord_header */ \
1194 { /* struct lrecord_header */ \
1195 lrecord_type_symbol_value_forward, /* lrecord_type_index */ \
1197 1, /* c_readonly bit */ \
1198 1 /* lisp_readonly bit */ \
1204 &(console_local_flags.field_name), \
1211 int offset = ((char *)symbol_value_forward_forward (&I_hate_C) \
1212 - (char *)&console_local_flags); \
1214 defvar_magic (lname, &I_hate_C); \
1216 *((Lisp_Object *)(offset + (char *)XCONSOLE (Vconsole_local_symbols))) \
1223 #define DEFVAR_CONSOLE_LOCAL_MAGIC(lname, field_name, magicfun) \
1224 DEFVAR_CONSOLE_LOCAL_1 (lname, field_name, \
1225 SYMVAL_SELECTED_CONSOLE_FORWARD, magicfun)
1226 #define DEFVAR_CONSOLE_LOCAL(lname, field_name) \
1227 DEFVAR_CONSOLE_LOCAL_MAGIC (lname, field_name, 0)
1228 #define DEFVAR_CONST_CONSOLE_LOCAL_MAGIC(lname, field_name, magicfun) \
1229 DEFVAR_CONSOLE_LOCAL_1 (lname, field_name, \
1230 SYMVAL_CONST_SELECTED_CONSOLE_FORWARD, magicfun)
1231 #define DEFVAR_CONST_CONSOLE_LOCAL(lname, field_name) \
1232 DEFVAR_CONST_CONSOLE_LOCAL_MAGIC (lname, field_name, 0)
1234 #define DEFVAR_CONSOLE_DEFAULTS_MAGIC(lname, field_name, magicfun) \
1235 DEFVAR_SYMVAL_FWD(lname, &(console_local_flags.field_name), \
1236 SYMVAL_DEFAULT_CONSOLE_FORWARD, magicfun)
1237 #define DEFVAR_CONSOLE_DEFAULTS(lname, field_name) \
1238 DEFVAR_CONSOLE_DEFAULTS_MAGIC (lname, field_name, 0)
1240 static void nuke_all_console_slots(struct console *con, Lisp_Object zap)
1244 #define MARKED_SLOT(x) con->x = zap
1245 #include "conslots.h"
1249 static void common_init_complex_vars_of_console(void)
1251 /* Make sure all markable slots in console_defaults
1252 are initialized reasonably, so mark_console won't choke.
1254 struct console *defs =
1255 alloc_lcrecord_type(struct console, &lrecord_console);
1256 struct console *syms =
1257 alloc_lcrecord_type(struct console, &lrecord_console);
1259 staticpro_nodump(&Vconsole_defaults);
1260 staticpro_nodump(&Vconsole_local_symbols);
1261 XSETCONSOLE(Vconsole_defaults, defs);
1262 XSETCONSOLE(Vconsole_local_symbols, syms);
1264 nuke_all_console_slots(syms, Qnil);
1265 nuke_all_console_slots(defs, Qnil);
1267 /* Set up the non-nil default values of various console slots.
1268 Must do these before making the first console.
1270 /* #### Anything needed here? */
1273 /* 0 means var is always local. Default used only at creation.
1274 * -1 means var is always local. Default used only at reset and
1276 * -2 means there's no lisp variable corresponding to this slot
1277 * and the default is only used at creation.
1278 * -3 means no Lisp variable. Default used only at reset and creation.
1279 * >0 is mask. Var is local if ((console->local_var_flags & mask) != 0)
1280 * Otherwise default is used.
1282 * #### We don't currently ever reset console variables, so there
1283 * is no current distinction between 0 and -1, and between -2 and -3.
1285 Lisp_Object always_local_resettable = make_int(-1);
1287 #if 0 /* not used */
1288 Lisp_Object always_local_no_default = make_int(0);
1289 Lisp_Object resettable = make_int(-3);
1292 /* Assign the local-flags to the slots that have default values.
1293 The local flag is a bit that is used in the console
1294 to say that it has its own local value for the slot.
1295 The local flag bits are in the local_var_flags slot of the
1298 nuke_all_console_slots(&console_local_flags, make_int(-2));
1299 console_local_flags.defining_kbd_macro =
1300 always_local_resettable;
1301 console_local_flags.last_kbd_macro = always_local_resettable;
1302 console_local_flags.prefix_arg = always_local_resettable;
1303 console_local_flags.default_minibuffer_frame =
1304 always_local_resettable;
1305 console_local_flags.overriding_terminal_local_map =
1306 always_local_resettable;
1308 console_local_flags.tty_erase_char = always_local_resettable;
1311 console_local_flags.function_key_map = make_int(1);
1313 /* #### Warning, 0x4000000 (that's six zeroes) is the largest number
1314 currently allowable due to the XINT() handling of this value.
1315 With some rearrangement you can get 4 more bits. */
1319 #define CONSOLE_SLOTS_SIZE (offsetof (struct console, CONSOLE_SLOTS_LAST_NAME) - offsetof (struct console, CONSOLE_SLOTS_FIRST_NAME) + sizeof (Lisp_Object))
1320 #define CONSOLE_SLOTS_COUNT (CONSOLE_SLOTS_SIZE / sizeof (Lisp_Object))
1322 void reinit_complex_vars_of_console(void)
1324 struct console *defs, *syms;
1326 common_init_complex_vars_of_console();
1328 defs = XCONSOLE(Vconsole_defaults);
1329 syms = XCONSOLE(Vconsole_local_symbols);
1330 memcpy(&defs->CONSOLE_SLOTS_FIRST_NAME,
1331 console_defaults_saved_slots, CONSOLE_SLOTS_SIZE);
1332 memcpy(&syms->CONSOLE_SLOTS_FIRST_NAME,
1333 console_local_symbols_saved_slots, CONSOLE_SLOTS_SIZE);
1336 static const struct lrecord_description console_slots_description_1[] = {
1337 {XD_LISP_OBJECT_ARRAY, 0, CONSOLE_SLOTS_COUNT},
1341 static const struct struct_description console_slots_description = {
1343 console_slots_description_1
1346 void complex_vars_of_console(void)
1348 struct console *defs, *syms;
1350 common_init_complex_vars_of_console();
1352 defs = XCONSOLE(Vconsole_defaults);
1353 syms = XCONSOLE(Vconsole_local_symbols);
1354 console_defaults_saved_slots = &defs->CONSOLE_SLOTS_FIRST_NAME;
1355 console_local_symbols_saved_slots = &syms->CONSOLE_SLOTS_FIRST_NAME;
1356 dump_add_root_struct_ptr(&console_defaults_saved_slots,
1357 &console_slots_description);
1358 dump_add_root_struct_ptr(&console_local_symbols_saved_slots,
1359 &console_slots_description);
1361 DEFVAR_CONSOLE_DEFAULTS("default-function-key-map", function_key_map /*
1362 Default value of `function-key-map' for consoles that don't override it.
1363 This is the same as (default-value 'function-key-map).
1366 DEFVAR_CONSOLE_LOCAL("function-key-map", function_key_map /*
1367 Keymap mapping ASCII function key sequences onto their preferred forms.
1368 This allows Emacs to recognize function keys sent from ASCII
1369 terminals at any point in a key sequence.
1371 The `read-key-sequence' function replaces any subsequence bound by
1372 `function-key-map' with its binding. More precisely, when the active
1373 keymaps have no binding for the current key sequence but
1374 `function-key-map' binds a suffix of the sequence to a vector or string,
1375 `read-key-sequence' replaces the matching suffix with its binding, and
1376 continues with the new sequence. See `key-binding'.
1378 The events that come from bindings in `function-key-map' are not
1379 themselves looked up in `function-key-map'.
1381 For example, suppose `function-key-map' binds `ESC O P' to [f1].
1382 Typing `ESC O P' to `read-key-sequence' would return
1383 \[#<keypress-event f1>]. Typing `C-x ESC O P' would return
1384 \[#<keypress-event control-X> #<keypress-event f1>]. If [f1]
1385 were a prefix key, typing `ESC O P x' would return
1386 \[#<keypress-event f1> #<keypress-event x>].
1390 /* #### Should this somehow go to TTY data? How do we make it
1391 accessible from Lisp, then? */
1392 DEFVAR_CONSOLE_LOCAL("tty-erase-char", tty_erase_char /*
1393 The ERASE character as set by the user with stty.
1394 When this value cannot be determined or would be meaningless (on non-TTY
1395 consoles, for example), it is set to nil.
1399 /* While this should be const it can't be because some things
1400 (i.e. edebug) do manipulate it. */
1401 DEFVAR_CONSOLE_LOCAL("defining-kbd-macro", defining_kbd_macro /*
1402 Non-nil while a keyboard macro is being defined. Don't set this!
1405 DEFVAR_CONSOLE_LOCAL("last-kbd-macro", last_kbd_macro /*
1406 Last keyboard macro defined, as a vector of events; nil if none defined.
1409 DEFVAR_CONSOLE_LOCAL("prefix-arg", prefix_arg /*
1410 The value of the prefix argument for the next editing command.
1411 It may be a number, or the symbol `-' for just a minus sign as arg,
1412 or a list whose car is a number for just one or more C-U's
1413 or nil if no argument has been specified.
1415 You cannot examine this variable to find the argument for this command
1416 since it has been set to nil by the time you can look.
1417 Instead, you should use the variable `current-prefix-arg', although
1418 normally commands can get this prefix argument with (interactive "P").
1421 DEFVAR_CONSOLE_LOCAL("default-minibuffer-frame", default_minibuffer_frame /*
1422 Minibufferless frames use this frame's minibuffer.
1424 Emacs cannot create minibufferless frames unless this is set to an
1425 appropriate surrogate.
1427 SXEmacs consults this variable only when creating minibufferless
1428 frames; once the frame is created, it sticks with its assigned
1429 minibuffer, no matter what this variable is set to. This means that
1430 this variable doesn't necessarily say anything meaningful about the
1431 current set of frames, or where the minibuffer is currently being
1435 DEFVAR_CONSOLE_LOCAL("overriding-terminal-local-map", overriding_terminal_local_map /*
1436 Keymap that overrides all other local keymaps, for the selected console only.
1437 If this variable is non-nil, it is used as a keymap instead of the
1438 buffer's local map, and the minor mode keymaps and text property keymaps.
1441 /* Check for DEFVAR_CONSOLE_LOCAL without initializing the corresponding
1442 slot of console_local_flags and vice-versa. Must be done after all
1443 DEFVAR_CONSOLE_LOCAL() calls. */
1444 #define MARKED_SLOT(slot) \
1445 if ((XINT (console_local_flags.slot) != -2 && \
1446 XINT (console_local_flags.slot) != -3) \
1447 != !(NILP (XCONSOLE (Vconsole_local_symbols)->slot))) \
1449 #include "conslots.h"