XEmacs 21.2-b1
[chise/xemacs-chise.git.1] / src / console.c
1 /* The console object.
2    Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
3    Copyright (C) 1996 Ben Wing.
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
24 /* Written by Ben Wing. */
25
26 #include <config.h>
27 #include "lisp.h"
28
29 #include "buffer.h"
30 #include "console-tty.h"
31 #include "events.h"
32 #include "frame.h"
33 #include "redisplay.h"
34 #include "sysdep.h"
35 #include "window.h"
36
37 Lisp_Object Vconsole_list, Vselected_console;
38
39 Lisp_Object Vcreate_console_hook, Vdelete_console_hook;
40
41 Lisp_Object Qconsolep, Qconsole_live_p;
42 Lisp_Object Qcreate_console_hook;
43 Lisp_Object Qdelete_console_hook;
44
45 Lisp_Object Qsuspend_hook;
46 Lisp_Object Qsuspend_resume_hook;
47
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
57 /* This structure marks which slots in a console have corresponding
58    default values in console_defaults.
59    Each such slot has a nonzero value in this structure.
60    The value has only one nonzero bit.
61
62    When a console has its own local value for a slot,
63    the bit for that slot (found in the same slot in this structure)
64    is turned on in the console's local_var_flags slot.
65
66    If a slot in this structure is 0, then there is a DEFVAR_CONSOLE_LOCAL
67    for the slot, but there is no default value for it; the corresponding
68    slot in console_defaults is not used except to initialize newly-created
69    consoles.
70
71    If a slot is -1, then there is a DEFVAR_CONSOLE_LOCAL for it
72    as well as a default value which is used to initialize newly-created
73    consoles and as a reset-value when local-vars are killed.
74
75    If a slot is -2, there is no DEFVAR_CONSOLE_LOCAL for it.
76    (The slot is always local, but there's no lisp variable for it.)
77    The default value is only used to initialize newly-creation consoles.
78
79    If a slot is -3, then there is no DEFVAR_CONSOLE_LOCAL for it but
80    there is a default which is used to initialize newly-creation
81    consoles and as a reset-value when local-vars are killed.
82
83
84    */
85 struct console console_local_flags;
86
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
91 DEFINE_CONSOLE_TYPE (dead);
92
93 Lisp_Object Vconsole_type_list;
94
95 console_type_entry_dynarr *the_console_type_entry_dynarr;
96
97 \f
98 static Lisp_Object
99 mark_console (Lisp_Object obj, void (*markobj) (Lisp_Object))
100 {
101   struct console *con = XCONSOLE (obj);
102
103 #define MARKED_SLOT(x) ((markobj) (con->x));
104 #include "conslots.h"
105 #undef MARKED_SLOT
106
107   /* Can be zero for Vconsole_defaults, Vconsole_local_symbols */
108   if (con->conmeths)
109     {
110       ((markobj) (con->conmeths->symbol));
111       MAYBE_CONMETH (con, mark_console, (con, markobj));
112     }
113
114   return Qnil;
115 }
116
117 static void
118 print_console (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
119 {
120   struct console *con = XCONSOLE (obj);
121   char buf[256];
122
123   if (print_readably)
124     error ("printing unreadable object #<console %s 0x%x>",
125            XSTRING_DATA (con->name), con->header.uid);
126
127   sprintf (buf, "#<%s-console", !CONSOLE_LIVE_P (con) ? "dead" :
128            CONSOLE_TYPE_NAME (con));
129   write_c_string (buf, printcharfun);
130   if (CONSOLE_LIVE_P (con))
131     {
132       write_c_string (" on ", printcharfun);
133       print_internal (CONSOLE_CONNECTION (con), printcharfun, 1);
134     }
135   sprintf (buf, " 0x%x>", con->header.uid);
136   write_c_string (buf, printcharfun);
137 }
138
139 DEFINE_LRECORD_IMPLEMENTATION ("console", console,
140                                mark_console, print_console, 0, 0, 0,
141                                struct console);
142 \f
143 static struct console *
144 allocate_console (void)
145 {
146   Lisp_Object console;
147   struct console *con = alloc_lcrecord_type (struct console, lrecord_console);
148   struct gcpro gcpro1;
149
150   copy_lcrecord (con, XCONSOLE (Vconsole_defaults));
151
152   XSETCONSOLE (console, con);
153   GCPRO1 (console);
154
155   con->quit_char = 7; /* C-g */
156   con->command_builder = allocate_command_builder (console);
157   con->function_key_map = Fmake_sparse_keymap (Qnil);
158
159   UNGCPRO;
160   return con;
161 }
162
163 struct console *
164 decode_console (Lisp_Object console)
165 {
166   if (NILP (console))
167     console = Fselected_console ();
168   /* quietly accept devices and frames for the console arg */
169   if (DEVICEP (console) || FRAMEP (console))
170     console = DEVICE_CONSOLE (decode_device (console));
171   CHECK_LIVE_CONSOLE (console);
172   return XCONSOLE (console);
173 }
174
175
176 struct console_methods *
177 decode_console_type (Lisp_Object type, Error_behavior errb)
178 {
179   int i;
180
181   for (i = 0; i < Dynarr_length (the_console_type_entry_dynarr); i++)
182     if (EQ (type, Dynarr_at (the_console_type_entry_dynarr, i).symbol))
183       return Dynarr_at (the_console_type_entry_dynarr, i).meths;
184
185   maybe_signal_simple_error ("Invalid console type", type, Qconsole, errb);
186
187   return 0;
188 }
189
190 int
191 valid_console_type_p (Lisp_Object type)
192 {
193   return decode_console_type (type, ERROR_ME_NOT) != 0;
194 }
195
196 DEFUN ("valid-console-type-p", Fvalid_console_type_p, 1, 1, 0, /*
197 Given a CONSOLE-TYPE, return t if it is valid.
198 Valid types are 'x, 'tty, and 'stream.
199 */
200        (console_type))
201 {
202   return valid_console_type_p (console_type) ? Qt : Qnil;
203 }
204
205 DEFUN ("console-type-list", Fconsole_type_list, 0, 0, 0, /*
206 Return a list of valid console types.
207 */
208        ())
209 {
210   return Fcopy_sequence (Vconsole_type_list);
211 }
212
213 DEFUN ("cdfw-console", Fcdfw_console, 1, 1, 0, /*
214 Given a console, device, frame, or window, return the associated console.
215 Return nil otherwise.
216 */
217        (obj))
218 {
219   return CDFW_CONSOLE (obj);
220 }
221
222 \f
223 DEFUN ("selected-console", Fselected_console, 0, 0, 0, /*
224 Return the console which is currently active.
225 */
226        ())
227 {
228   return Vselected_console;
229 }
230
231 /* Called from selected_device_1(), called from selected_frame_1(),
232    called from Fselect_window() */
233 void
234 select_console_1 (Lisp_Object console)
235 {
236   /* perhaps this should do something more complicated */
237   Vselected_console = console;
238
239   /* #### Schedule this to be removed in 19.14 */
240 #ifdef HAVE_X_WINDOWS
241   if (CONSOLE_X_P (XCONSOLE (console)))
242     Vwindow_system = Qx;
243   else
244 #endif
245 #ifdef HAVE_MS_WINDOWS
246   if (CONSOLE_MSWINDOWS_P (XCONSOLE (console)))
247     Vwindow_system = Qmswindows;
248   else
249 #endif
250     Vwindow_system = Qnil;
251 }
252
253 DEFUN ("select-console", Fselect_console, 1, 1, 0, /*
254 Select the console CONSOLE.
255 Subsequent editing commands apply to its selected device, selected frame,
256 and selected window.  The selection of CONSOLE lasts until the next time
257 the user does something to select a different console, or until the next
258 time this function is called.
259 */
260        (console))
261 {
262   Lisp_Object device;
263
264   CHECK_LIVE_CONSOLE (console);
265
266   device = CONSOLE_SELECTED_DEVICE (XCONSOLE (console));
267   if (!NILP (device))
268     {
269       struct device *d = XDEVICE (device);
270       Lisp_Object frame = DEVICE_SELECTED_FRAME (d);
271       if (!NILP (frame))
272         {
273           struct frame *f = XFRAME(frame);
274           Fselect_window (FRAME_SELECTED_WINDOW (f), Qnil);
275         }
276       else
277         error ("Can't select console with no frames.");
278     }
279   else
280     error ("Can't select a console with no devices");
281   return Qnil;
282 }
283
284 void
285 set_console_last_nonminibuf_frame (struct console *con,
286                                    Lisp_Object frame)
287 {
288   con->_last_nonminibuf_frame = frame;
289 }
290
291 DEFUN ("consolep", Fconsolep, 1, 1, 0, /*
292 Return non-nil if OBJECT is a console.
293 */
294        (object))
295 {
296   return CONSOLEP (object) ? Qt : Qnil;
297 }
298
299 DEFUN ("console-live-p", Fconsole_live_p, 1, 1, 0, /*
300 Return non-nil if OBJECT is a console that has not been deleted.
301 */
302        (object))
303 {
304   return CONSOLEP (object) && CONSOLE_LIVE_P (XCONSOLE (object)) ? Qt : Qnil;
305 }
306
307 DEFUN ("console-type", Fconsole_type, 0, 1, 0, /*
308 Return the type of the specified console (e.g. `x' or `tty').
309 Value is `tty' for a tty console (a character-only terminal),
310 `x' for a console that is an X display,
311 `mswindows' for a console that is a Windows NT/95/97 connection,
312 `pc' for a console that is a direct-write MS-DOS connection (not yet
313   implemented),
314 `stream' for a stream console (which acts like a stdio stream), and
315 `dead' for a deleted console.
316 */
317        (console))
318 {
319   /* don't call decode_console() because we want to allow for dead
320      consoles. */
321   if (NILP (console))
322     console = Fselected_console ();
323   CHECK_CONSOLE (console);
324   return CONSOLE_TYPE (XCONSOLE (console));
325 }
326
327 DEFUN ("console-name", Fconsole_name, 0, 1, 0, /*
328 Return the name of the specified console.
329 */
330        (console))
331 {
332   return CONSOLE_NAME (decode_console (console));
333 }
334
335 DEFUN ("console-connection", Fconsole_connection, 0, 1, 0, /*
336 Return the connection of the specified console.
337 CONSOLE defaults to the selected console if omitted.
338 */
339        (console))
340 {
341   return CONSOLE_CONNECTION (decode_console (console));
342 }
343
344 Lisp_Object
345 make_console (struct console *con)
346 {
347   Lisp_Object console;
348   XSETCONSOLE (console, con);
349   return console;
350 }
351
352 static Lisp_Object
353 semi_canonicalize_console_connection (struct console_methods *meths,
354                                       Lisp_Object name, Error_behavior errb)
355 {
356   return CONTYPE_METH_OR_GIVEN (meths, semi_canonicalize_console_connection,
357                                 (name, errb), name);
358 }
359
360 static Lisp_Object
361 canonicalize_console_connection (struct console_methods *meths,
362                                  Lisp_Object name, Error_behavior errb)
363 {
364   return CONTYPE_METH_OR_GIVEN (meths, canonicalize_console_connection,
365                                 (name, errb), name);
366 }
367
368 static Lisp_Object
369 find_console_of_type (struct console_methods *meths, Lisp_Object canon)
370 {
371   Lisp_Object concons;
372
373   CONSOLE_LOOP (concons)
374     {
375       Lisp_Object console = XCAR (concons);
376
377       if (EQ (CONMETH_TYPE (meths), CONSOLE_TYPE (XCONSOLE (console)))
378           && internal_equal (CONSOLE_CANON_CONNECTION (XCONSOLE (console)),
379                              canon, 0))
380         return console;
381     }
382
383   return Qnil;
384 }
385
386 DEFUN ("find-console", Ffind_console, 1, 2, 0, /*
387 Look for an existing console attached to connection CONNECTION.
388 Return the console if found; otherwise, return nil.
389
390 If TYPE is specified, only return consoles of that type; otherwise,
391 return consoles of any type. (It is possible, although unlikely,
392 that two consoles of different types could have the same connection
393 name; in such a case, the first console found is returned.)
394 */
395        (connection, type))
396 {
397   Lisp_Object canon = Qnil;
398   struct gcpro gcpro1;
399
400   GCPRO1 (canon);
401
402   if (!NILP (type))
403     {
404       struct console_methods *conmeths = decode_console_type (type, ERROR_ME);
405       canon = canonicalize_console_connection (conmeths, connection,
406                                                ERROR_ME_NOT);
407       if (UNBOUNDP (canon))
408         RETURN_UNGCPRO (Qnil);
409
410       RETURN_UNGCPRO (find_console_of_type (conmeths, canon));
411     }
412   else
413     {
414       int i;
415
416       for (i = 0; i < Dynarr_length (the_console_type_entry_dynarr); i++)
417         {
418           struct console_methods *conmeths =
419             Dynarr_at (the_console_type_entry_dynarr, i).meths;
420           canon = canonicalize_console_connection (conmeths, connection,
421                                                    ERROR_ME_NOT);
422           if (!UNBOUNDP (canon))
423             {
424               Lisp_Object console = find_console_of_type (conmeths, canon);
425               if (!NILP (console))
426                 RETURN_UNGCPRO (console);
427             }
428         }
429
430       RETURN_UNGCPRO (Qnil);
431     }
432 }
433
434 DEFUN ("get-console", Fget_console, 1, 2, 0, /*
435 Look for an existing console attached to connection CONNECTION.
436 Return the console if found; otherwise, signal an error.
437
438 If TYPE is specified, only return consoles of that type; otherwise,
439 return consoles of any type. (It is possible, although unlikely,
440 that two consoles of different types could have the same connection
441 name; in such a case, the first console found is returned.)
442 */
443        (connection, type))
444 {
445   Lisp_Object console = Ffind_console (connection, type);
446   if (NILP (console))
447     {
448       if (NILP (type))
449         signal_simple_error ("No such console", connection);
450       else
451         signal_simple_error_2 ("No such console", type, connection);
452     }
453   return console;
454 }
455
456 Lisp_Object
457 create_console (Lisp_Object name, Lisp_Object type, Lisp_Object connection,
458                 Lisp_Object props)
459 {
460   /* This function can GC */
461   struct console *con;
462   Lisp_Object console;
463   struct gcpro gcpro1;
464
465   console = Ffind_console (connection, type);
466   if (!NILP (console))
467     return console;
468
469   con = allocate_console ();
470   XSETCONSOLE (console, con);
471
472   GCPRO1 (console);
473
474   con->conmeths = decode_console_type (type, ERROR_ME);
475
476   CONSOLE_NAME (con) = name;
477   CONSOLE_CONNECTION (con) =
478     semi_canonicalize_console_connection (con->conmeths, connection,
479                                           ERROR_ME);
480   CONSOLE_CANON_CONNECTION (con) =
481     canonicalize_console_connection (con->conmeths, connection,
482                                      ERROR_ME);
483
484   MAYBE_CONMETH (con, init_console, (con, props));
485
486   /* Do it this way so that the console list is in order of creation */
487   Vconsole_list = nconc2 (Vconsole_list, Fcons (console, Qnil));
488
489   if (CONMETH (con, initially_selected_for_input, (con)))
490     event_stream_select_console (con);
491
492   UNGCPRO;
493   return console;
494 }
495
496 void
497 add_entry_to_console_type_list (Lisp_Object symbol,
498                                 struct console_methods *meths)
499 {
500   struct console_type_entry entry;
501
502   entry.symbol = symbol;
503   entry.meths = meths;
504   Dynarr_add (the_console_type_entry_dynarr, entry);
505   Vconsole_type_list = Fcons (symbol, Vconsole_type_list);
506 }
507
508 /* find a console other than the selected one.  Prefer non-stream
509    consoles over stream consoles. */
510
511 static Lisp_Object
512 find_other_console (Lisp_Object console)
513 {
514   Lisp_Object concons;
515
516   /* look for a non-stream console */
517   CONSOLE_LOOP (concons)
518     {
519       Lisp_Object con = XCAR (concons);
520       if (!CONSOLE_STREAM_P (XCONSOLE (con))
521           && !EQ (con, console)
522           && !NILP (CONSOLE_SELECTED_DEVICE (XCONSOLE (con)))
523           && !NILP (DEVICE_SELECTED_FRAME
524                     (XDEVICE (CONSOLE_SELECTED_DEVICE (XCONSOLE (con))))))
525         break;
526     }
527   if (!NILP (concons))
528     return XCAR (concons);
529
530   /* OK, now look for a stream console */
531   CONSOLE_LOOP (concons)
532     {
533       Lisp_Object con = XCAR (concons);
534       if (!EQ (con, console)
535           && !NILP (CONSOLE_SELECTED_DEVICE (XCONSOLE (con)))
536           && !NILP (DEVICE_SELECTED_FRAME
537                     (XDEVICE (CONSOLE_SELECTED_DEVICE (XCONSOLE (con))))))
538         break;
539     }
540   if (!NILP (concons))
541     return XCAR (concons);
542
543   /* Sorry, there ain't none */
544   return Qnil;
545 }
546
547 static int
548 find_nonminibuffer_frame_not_on_console_predicate (Lisp_Object frame,
549                                                    void *closure)
550 {
551   Lisp_Object console;
552
553   VOID_TO_LISP (console, closure);
554   if (FRAME_MINIBUF_ONLY_P (XFRAME (frame)))
555     return 0;
556   if (EQ (console, FRAME_CONSOLE (XFRAME (frame))))
557     return 0;
558   return 1;
559 }
560
561 static Lisp_Object
562 find_nonminibuffer_frame_not_on_console (Lisp_Object console)
563 {
564   return find_some_frame (find_nonminibuffer_frame_not_on_console_predicate,
565                           LISP_TO_VOID (console));
566 }
567
568 /* Delete console CON.
569
570    If FORCE is non-zero, allow deletion of the only frame.
571
572    If CALLED_FROM_KILL_EMACS is non-zero, then, if
573    deleting the last console, just delete it,
574    instead of calling `save-buffers-kill-emacs'.
575
576    If FROM_IO_ERROR is non-zero, then the console is gone due
577    to an I/O error.  This affects what happens if we exit
578    (we do an emergency exit instead of `save-buffers-kill-emacs'.)
579 */
580
581 void
582 delete_console_internal (struct console *con, int force,
583                          int called_from_kill_emacs, int from_io_error)
584 {
585   /* This function can GC */
586   Lisp_Object console;
587   struct gcpro gcpro1;
588
589   /* OK to delete an already-deleted console. */
590   if (!CONSOLE_LIVE_P (con))
591     return;
592
593   XSETCONSOLE (console, con);
594   GCPRO1 (console);
595
596   if (!called_from_kill_emacs)
597     {
598       int down_we_go = 0;
599
600       if ((XINT (Flength (Vconsole_list)) == 1)
601           /* if we just created the console, it might not be listed,
602              or something ... */
603           && !NILP (memq_no_quit (console, Vconsole_list)))
604         down_we_go = 1;
605       /* If there aren't any nonminibuffer frames that would
606          be left, then exit. */
607       else if (NILP (find_nonminibuffer_frame_not_on_console (console)))
608         down_we_go = 1;
609
610       if (down_we_go)
611         {
612           if (!force)
613             error ("Attempt to delete the only frame");
614           else if (from_io_error)
615             {
616               /* Mayday mayday!  We're going down! */
617               stderr_out ("  Autosaving and exiting...\n");
618               Vwindow_system = Qnil; /* let it lie! */
619               preparing_for_armageddon = 1;
620               Fkill_emacs (make_int (70));
621             }
622           else
623             {
624               call0 (Qsave_buffers_kill_emacs);
625               UNGCPRO;
626               /* If we get here, the user said they didn't want
627                  to exit, so don't. */
628               return;
629             }
630         }
631     }
632
633   /* Breathe a sigh of relief.  We're still alive. */
634
635   {
636     Lisp_Object frmcons, devcons;
637
638     /* First delete all frames without their own minibuffers,
639        to avoid errors coming from attempting to delete a frame
640        that is a surrogate for another frame.
641
642        We don't set "called_from_delete_console" because we want the
643        device to go ahead and get deleted if we delete the last frame
644        on a device.  We won't run into trouble here because for any
645        frame without a minibuffer, there has to be another one on
646        the same console with a minibuffer, and we're not deleting that,
647        so delete_console_internal() won't get recursively called.
648
649        WRONG!  With surrogate minibuffers this isn't true.  Frames
650        with only a minibuffer are not enough to prevent
651        delete_frame_internal from triggering a device deletion. */
652     CONSOLE_FRAME_LOOP_NO_BREAK (frmcons, devcons, con)
653       {
654         struct frame *f = XFRAME (XCAR (frmcons));
655         /* delete_frame_internal() might do anything such as run hooks,
656            so be defensive. */
657         if (FRAME_LIVE_P (f) && !FRAME_HAS_MINIBUF_P (f))
658           delete_frame_internal (f, 1, 1, from_io_error);
659
660         if (!CONSOLE_LIVE_P (con)) /* make sure the delete-*-hook didn't
661                                       go ahead and delete anything */
662           {
663             UNGCPRO;
664             return;
665           }
666       }
667
668     CONSOLE_DEVICE_LOOP (devcons, con)
669       {
670         struct device *d = XDEVICE (XCAR (devcons));
671         /* delete_device_internal() might do anything such as run hooks,
672            so be defensive. */
673         if (DEVICE_LIVE_P (d))
674           delete_device_internal (d, 1, 1, from_io_error);
675         if (!CONSOLE_LIVE_P (con)) /* make sure the delete-*-hook didn't
676                                       go ahead and delete anything */
677           {
678             UNGCPRO;
679             return;
680           }
681       }
682   }
683
684   CONSOLE_SELECTED_DEVICE (con) = Qnil;
685
686   /* try to select another console */
687
688   if (EQ (console, Fselected_console ()))
689     {
690       Lisp_Object other_dev = find_other_console (console);
691       if (!NILP (other_dev))
692         Fselect_console (other_dev);
693       else
694         {
695           /* necessary? */
696           Vselected_console = Qnil;
697           Vwindow_system = Qnil;
698         }
699     }
700
701   if (con->input_enabled)
702     event_stream_unselect_console (con);
703
704   MAYBE_CONMETH (con, delete_console, (con));
705
706   Vconsole_list = delq_no_quit (console, Vconsole_list);
707   RESET_CHANGED_SET_FLAGS;
708   con->conmeths = dead_console_methods;
709
710   UNGCPRO;
711 }
712
713 void
714 io_error_delete_console (Lisp_Object console)
715 {
716   delete_console_internal (XCONSOLE (console), 1, 0, 1);
717 }
718
719 DEFUN ("delete-console", Fdelete_console, 1, 2, 0, /*
720 Delete CONSOLE, permanently eliminating it from use.
721 Normally, you cannot delete the last non-minibuffer-only frame (you must
722 use `save-buffers-kill-emacs' or `kill-emacs').  However, if optional
723 second argument FORCE is non-nil, you can delete the last frame. (This
724 will automatically call `save-buffers-kill-emacs'.)
725 */
726        (console, force))
727 {
728   CHECK_CONSOLE (console);
729   delete_console_internal (XCONSOLE (console), !NILP (force), 0, 0);
730   return Qnil;
731 }
732
733 DEFUN ("console-list", Fconsole_list, 0, 0, 0, /*
734 Return a list of all consoles.
735 */
736        ())
737 {
738   return Fcopy_sequence (Vconsole_list);
739 }
740
741 DEFUN ("console-device-list", Fconsole_device_list, 0, 1, 0, /*
742 Return a list of all devices on CONSOLE.
743 If CONSOLE is nil, the selected console will be used.
744 */
745        (console))
746 {
747   return Fcopy_sequence (CONSOLE_DEVICE_LIST (decode_console (console)));
748 }
749
750 DEFUN ("console-enable-input", Fconsole_enable_input, 1, 1, 0, /*
751 Enable input on console CONSOLE.
752 */
753        (console))
754 {
755   struct console *con = decode_console (console);
756   if (!con->input_enabled)
757     event_stream_select_console (con);
758   return Qnil;
759 }
760
761 DEFUN ("console-disable-input", Fconsole_disable_input, 1, 1, 0, /*
762 Disable input on console CONSOLE.
763 */
764        (console))
765 {
766   struct console *con = decode_console (console);
767   if (con->input_enabled)
768     event_stream_unselect_console (con);
769   return Qnil;
770 }
771
772 DEFUN ("console-on-window-system-p", Fconsole_on_window_system_p, 0, 1, 0, /*
773 Return non-nil if this console is on a window system.
774 This generally means that there is support for the mouse, the menubar,
775 the toolbar, glyphs, etc.
776 */
777        (console))
778 {
779   Lisp_Object type = CONSOLE_TYPE (decode_console (console));
780
781   return !EQ (type, Qtty) && !EQ (type, Qstream) ? Qt : Qnil;
782 }
783
784
785 \f
786 /**********************************************************************/
787 /*               Miscellaneous low-level functions                    */
788 /**********************************************************************/
789
790 static Lisp_Object
791 unwind_init_sys_modes (Lisp_Object console)
792 {
793   reinit_initial_console ();
794
795   if (!no_redraw_on_reenter &&
796       CONSOLEP (console) &&
797       CONSOLE_LIVE_P (XCONSOLE (console)))
798     {
799       struct frame *f =
800         XFRAME (DEVICE_SELECTED_FRAME
801                 (XDEVICE (CONSOLE_SELECTED_DEVICE (XCONSOLE (console)))));
802       MARK_FRAME_CHANGED (f);
803     }
804   return Qnil;
805 }
806
807 DEFUN ("suspend-emacs", Fsuspend_emacs, 0, 1, "", /*
808 Stop Emacs and return to superior process.  You can resume later.
809 On systems that don't have job control, run a subshell instead.
810
811 If optional arg STUFFSTRING is non-nil, its characters are stuffed
812 to be read as terminal input by Emacs's superior shell.
813
814 Before suspending, run the normal hook `suspend-hook'.
815 After resumption run the normal hook `suspend-resume-hook'.
816
817 Some operating systems cannot stop the Emacs process and resume it later.
818 On such systems, Emacs will start a subshell and wait for it to exit.
819 */
820        (stuffstring))
821 {
822   int speccount = specpdl_depth ();
823   struct gcpro gcpro1;
824
825   if (!NILP (stuffstring))
826     CHECK_STRING (stuffstring);
827   GCPRO1 (stuffstring);
828
829   /* There used to be a check that the initial console is TTY.
830      This is bogus.  Even checking to see whether any console
831      is a controlling terminal is not correct -- maybe
832      the user used the -t option or something.  If we want to
833      suspend, then we suspend.  Period. */
834
835   /* Call value of suspend-hook. */
836   run_hook (Qsuspend_hook);
837
838   reset_initial_console ();
839   /* sys_suspend can get an error if it tries to fork a subshell
840      and the system resources aren't available for that.  */
841   record_unwind_protect (unwind_init_sys_modes, Vcontrolling_terminal);
842   stuff_buffered_input (stuffstring);
843   sys_suspend ();
844   /* the console is un-reset inside of the unwind-protect. */
845   unbind_to (speccount, Qnil);
846
847 #ifdef SIGWINCH
848   /* It is possible that a size change occurred while we were
849      suspended.  Assume one did just to be safe.  It won't hurt
850      anything if one didn't. */
851   asynch_device_change_pending++;
852 #endif
853
854   /* Call value of suspend-resume-hook
855      if it is bound and value is non-nil.  */
856   run_hook (Qsuspend_resume_hook);
857
858   UNGCPRO;
859   return Qnil;
860 }
861
862 /* If STUFFSTRING is a string, stuff its contents as pending terminal input.
863    Then in any case stuff anything Emacs has read ahead and not used.  */
864
865 void
866 stuff_buffered_input (Lisp_Object stuffstring)
867 {
868 /* stuff_char works only in BSD, versions 4.2 and up.  */
869 #if defined (BSD)
870   if (!CONSOLEP (Vcontrolling_terminal) ||
871       !CONSOLE_LIVE_P (XCONSOLE (Vcontrolling_terminal)))
872     return;
873
874   if (STRINGP (stuffstring))
875     {
876       Extcount count;
877       Extbyte *p;
878
879       GET_STRING_EXT_DATA_ALLOCA (stuffstring, FORMAT_KEYBOARD, p, count);
880       while (count-- > 0)
881         stuff_char (XCONSOLE (Vcontrolling_terminal), *p++);
882       stuff_char (XCONSOLE (Vcontrolling_terminal), '\n');
883     }
884   /* Anything we have read ahead, put back for the shell to read.  */
885 # if 0 /* oh, who cares about this silliness */
886   while (kbd_fetch_ptr != kbd_store_ptr)
887     {
888       if (kbd_fetch_ptr == kbd_buffer + KBD_BUFFER_SIZE)
889         kbd_fetch_ptr = kbd_buffer;
890       stuff_char (XCONSOLE (Vcontrolling_terminal), *kbd_fetch_ptr++);
891     }
892 # endif
893 #endif /* BSD */
894 }
895
896 DEFUN ("suspend-console", Fsuspend_console, 0, 1, "", /*
897 Suspend a console.  For tty consoles, it sends a signal to suspend
898 the process in charge of the tty, and removes the devices and
899 frames of that console from the display.
900
901 If optional arg CONSOLE is non-nil, it is the console to be suspended.
902 Otherwise it is assumed to be the selected console.
903
904 Some operating systems cannot stop processes and resume them later.
905 On such systems, who knows what will happen.
906 */
907        (console))
908 {
909 #ifdef HAVE_TTY
910   struct console *con = decode_console (console);
911
912   if (CONSOLE_TTY_P (con))
913     {
914       /*
915        * hide all the unhidden frames so the display code won't update
916        * them while the console is suspended.
917        */
918       Lisp_Object device = CONSOLE_SELECTED_DEVICE (con);
919       if (!NILP (device))
920         {
921           struct device *d = XDEVICE (device);
922           Lisp_Object frame_list = DEVICE_FRAME_LIST (d);
923           while (CONSP (frame_list))
924             {
925               struct frame *f = XFRAME (XCAR (frame_list));
926               if (FRAME_REPAINT_P (f))
927                 f->visible = -1;
928               frame_list = XCDR (frame_list);
929             }
930         }
931       reset_one_console (con);
932       event_stream_unselect_console (con);
933       sys_suspend_process (XINT (Fconsole_tty_controlling_process (console)));
934     }
935 #endif /* HAVE_TTY */
936
937   return Qnil;
938 }
939
940 DEFUN ("resume-console", Fresume_console, 1, 1, "", /*
941 Re-initialize a previously suspended console.
942 For tty consoles, do stuff to the tty to make it sane again.
943 */
944        (console))
945 {
946 #ifdef HAVE_TTY
947   struct console *con = decode_console (console);
948
949   if (CONSOLE_TTY_P (con))
950     {
951       /* raise the selected frame */
952       Lisp_Object device = CONSOLE_SELECTED_DEVICE (con);
953       if (!NILP (device))
954         {
955           struct device *d = XDEVICE (device);
956           Lisp_Object frame = DEVICE_SELECTED_FRAME (d);
957           if (!NILP (frame))
958             {
959               /* force the frame to be cleared */
960               SET_FRAME_CLEAR (XFRAME (frame));
961               Fraise_frame (frame);
962             }
963         }
964       init_one_console (con);
965       event_stream_select_console (con);
966 #ifdef SIGWINCH
967       /* The same as in Fsuspend_emacs: it is possible that a size
968          change occurred while we were suspended.  Assume one did just
969          to be safe.  It won't hurt anything if one didn't. */
970       asynch_device_change_pending++;
971 #endif
972     }
973 #endif /* HAVE_TTY */
974
975   return Qnil;
976 }
977
978 DEFUN ("set-input-mode", Fset_input_mode, 3, 5, 0, /*
979 Set mode of reading keyboard input.
980 First arg is ignored, for backward compatibility.
981 Second arg FLOW non-nil means use ^S/^Q flow control for output to terminal
982  (no effect except in CBREAK mode).
983 Third arg META t means accept 8-bit input (for a Meta key).
984  META nil means ignore the top bit, on the assumption it is parity.
985  Otherwise, accept 8-bit input and don't use the top bit for Meta.
986 First three arguments only apply to TTY consoles.
987 Optional fourth arg QUIT if non-nil specifies character to use for quitting.
988 Optional fifth arg CONSOLE specifies console to make changes to; nil means
989  the selected console.
990 See also `current-input-mode'.
991 */
992      (ignored, flow, meta, quit, console))
993 {
994   struct console *con = decode_console (console);
995   int meta_key = (!CONSOLE_TTY_P (con) ? 1 :
996                   EQ (meta, Qnil)      ? 0 :
997                   EQ (meta, Qt)        ? 1 :
998                   2);
999
1000   if (!NILP (quit))
1001     {
1002       CHECK_CHAR_COERCE_INT (quit);
1003       CONSOLE_QUIT_CHAR (con) =
1004         ((unsigned int) XCHAR (quit)) & (meta_key ? 0377 : 0177);
1005     }
1006
1007 #ifdef HAVE_TTY
1008   if (CONSOLE_TTY_P (con))
1009     {
1010       reset_one_console (con);
1011       TTY_FLAGS (con).flow_control = !NILP (flow);
1012       TTY_FLAGS (con).meta_key = meta_key;
1013       init_one_console (con);
1014     }
1015 #endif
1016
1017   return Qnil;
1018 }
1019
1020 DEFUN ("current-input-mode", Fcurrent_input_mode, 0, 1, 0, /*
1021 Return information about the way Emacs currently reads keyboard input.
1022 Optional arg CONSOLE specifies console to return information about; nil means
1023  the selected console.
1024 The value is a list of the form (nil FLOW META QUIT), where
1025   FLOW is non-nil if Emacs uses ^S/^Q flow control for output to the
1026     terminal; this does not apply if Emacs uses interrupt-driven input.
1027   META is t if accepting 8-bit input with 8th bit as Meta flag.
1028     META nil means ignoring the top bit, on the assumption it is parity.
1029     META is neither t nor nil if accepting 8-bit input and using
1030     all 8 bits as the character code.
1031   QUIT is the character Emacs currently uses to quit.
1032 FLOW, and META are only meaningful for TTY consoles.
1033 The elements of this list correspond to the arguments of
1034 `set-input-mode'.
1035 */
1036        (console))
1037 {
1038   struct console *con = decode_console (console);
1039   Lisp_Object flow, meta, quit;
1040
1041 #ifdef HAVE_TTY
1042   flow = CONSOLE_TTY_P (con) && TTY_FLAGS (con).flow_control ? Qt : Qnil;
1043   meta = (!CONSOLE_TTY_P (con) ? Qt :
1044           TTY_FLAGS (con).meta_key == 1 ? Qt :
1045           TTY_FLAGS (con).meta_key == 2 ? Qzero :
1046           Qnil);
1047 #else
1048   flow = Qnil;
1049   meta = Qt;
1050 #endif
1051   quit = make_char (CONSOLE_QUIT_CHAR (con));
1052
1053   return list4 (Qnil, flow, meta, quit);
1054 }
1055
1056 \f
1057 /************************************************************************/
1058 /*                            initialization                            */
1059 /************************************************************************/
1060
1061 void
1062 syms_of_console (void)
1063 {
1064   DEFSUBR (Fvalid_console_type_p);
1065   DEFSUBR (Fconsole_type_list);
1066   DEFSUBR (Fcdfw_console);
1067   DEFSUBR (Fselected_console);
1068   DEFSUBR (Fselect_console);
1069   DEFSUBR (Fconsolep);
1070   DEFSUBR (Fconsole_live_p);
1071   DEFSUBR (Fconsole_type);
1072   DEFSUBR (Fconsole_name);
1073   DEFSUBR (Fconsole_connection);
1074   DEFSUBR (Ffind_console);
1075   DEFSUBR (Fget_console);
1076   DEFSUBR (Fdelete_console);
1077   DEFSUBR (Fconsole_list);
1078   DEFSUBR (Fconsole_device_list);
1079   DEFSUBR (Fconsole_enable_input);
1080   DEFSUBR (Fconsole_disable_input);
1081   DEFSUBR (Fconsole_on_window_system_p);
1082   DEFSUBR (Fsuspend_console);
1083   DEFSUBR (Fresume_console);
1084
1085   DEFSUBR (Fsuspend_emacs);
1086   DEFSUBR (Fset_input_mode);
1087   DEFSUBR (Fcurrent_input_mode);
1088
1089   defsymbol (&Qconsolep, "consolep");
1090   defsymbol (&Qconsole_live_p, "console-live-p");
1091
1092   defsymbol (&Qcreate_console_hook, "create-console-hook");
1093   defsymbol (&Qdelete_console_hook, "delete-console-hook");
1094
1095   defsymbol (&Qsuspend_hook, "suspend-hook");
1096   defsymbol (&Qsuspend_resume_hook, "suspend-resume-hook");
1097 }
1098
1099 void
1100 console_type_create (void)
1101 {
1102   the_console_type_entry_dynarr = Dynarr_new (console_type_entry);
1103
1104   Vconsole_type_list = Qnil;
1105   staticpro (&Vconsole_type_list);
1106
1107   /* Initialize the dead console type */
1108   INITIALIZE_CONSOLE_TYPE (dead, "dead", "console-dead-p");
1109
1110   /* then reset the console-type lists, because `dead' is not really
1111      a valid console type */
1112   Dynarr_reset (the_console_type_entry_dynarr);
1113   Vconsole_type_list = Qnil;
1114 }
1115
1116 void
1117 vars_of_console (void)
1118 {
1119   DEFVAR_LISP ("create-console-hook", &Vcreate_console_hook /*
1120 Function or functions to call when a console is created.
1121 One argument, the newly-created console.
1122 This is called after the first frame has been created, but before
1123   calling the `create-device-hook' or `create-frame-hook'.
1124 Note that in general the console will not be selected.
1125 */ );
1126   Vcreate_console_hook = Qnil;
1127
1128   DEFVAR_LISP ("delete-console-hook", &Vdelete_console_hook /*
1129 Function or functions to call when a console is deleted.
1130 One argument, the to-be-deleted console.
1131 */ );
1132   Vdelete_console_hook = Qnil;
1133
1134   staticpro (&Vconsole_list);
1135   Vconsole_list = Qnil;
1136   staticpro (&Vselected_console);
1137   Vselected_console = Qnil;
1138
1139 #ifdef HAVE_WINDOW_SYSTEM
1140   Fprovide (intern ("window-system"));
1141 #endif
1142 }
1143
1144 /* DOC is ignored because it is snagged and recorded externally
1145  *  by make-docfile */
1146 /* Declaring this stuff as const produces 'Cannot reinitialize' messages
1147    from SunPro C's fix-and-continue feature (a way neato feature that
1148    makes debugging unbelievably more bearable) */
1149 #define DEFVAR_CONSOLE_LOCAL(lname, field_name) do {                    \
1150 static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C          \
1151   = { { { symbol_value_forward_lheader_initializer,                     \
1152     (struct lcrecord_header *) &(console_local_flags.field_name), 69 }, \
1153      SYMVAL_SELECTED_CONSOLE_FORWARD }, 0 };                            \
1154      defvar_console_local ((lname), &I_hate_C);                         \
1155 } while (0)
1156
1157 #define DEFVAR_CONSOLE_LOCAL_MAGIC(lname, field_name, magicfun) do {    \
1158 static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C          \
1159   = { { { symbol_value_forward_lheader_initializer,                     \
1160     (struct lcrecord_header *) &(console_local_flags.field_name), 69 }, \
1161      SYMVAL_SELECTED_CONSOLE_FORWARD }, magicfun };                     \
1162      defvar_console_local ((lname), &I_hate_C);                         \
1163 } while (0)
1164
1165 #define DEFVAR_CONST_CONSOLE_LOCAL(lname, field_name) do {              \
1166 static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C          \
1167   = { { { symbol_value_forward_lheader_initializer,                     \
1168     (struct lcrecord_header *) &(console_local_flags.field_name), 69 }, \
1169      SYMVAL_CONST_SELECTED_CONSOLE_FORWARD }, 0 };                      \
1170      defvar_console_local ((lname), &I_hate_C);                         \
1171 } while (0)
1172
1173 #define DEFVAR_CONST_CONSOLE_LOCAL_MAGIC(lname, field_name, magicfun) do { \
1174 static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C          \
1175   = { { { symbol_value_forward_lheader_initializer,                     \
1176     (struct lcrecord_header *) &(console_local_flags.field_name), 69 }, \
1177      SYMVAL_CONST_SELECTED_CONSOLE_FORWARD }, magicfun };               \
1178      defvar_console_local ((lname), &I_hate_C);                         \
1179 } while (0)
1180
1181 #define DEFVAR_CONSOLE_DEFAULTS(lname, field_name) do {                 \
1182 static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C          \
1183   = { { { symbol_value_forward_lheader_initializer,                     \
1184     (struct lcrecord_header *) &(console_local_flags.field_name), 69 }, \
1185      SYMVAL_DEFAULT_CONSOLE_FORWARD }, 0 };                             \
1186      defvar_mumble ((lname), &I_hate_C, sizeof (I_hate_C));             \
1187 } while (0)
1188
1189 #define DEFVAR_CONSOLE_DEFAULTS_MAGIC(lname, field_name, magicfun) do { \
1190 static CONST_IF_NOT_DEBUG struct symbol_value_forward I_hate_C          \
1191   = { { { symbol_value_forward_lheader_initializer,                     \
1192     (struct lcrecord_header *) &(console_local_flags.field_name), 69 }, \
1193      SYMVAL_DEFAULT_CONSOLE_FORWARD }, magicfun };                      \
1194      defvar_mumble ((lname), &I_hate_C, sizeof (I_hate_C));             \
1195 } while (0)
1196
1197 static void
1198 defvar_console_local (CONST char *namestring,
1199                        CONST struct symbol_value_forward *m)
1200 {
1201   int offset = ((char *)symbol_value_forward_forward (m)
1202                 - (char *)&console_local_flags);
1203
1204   defvar_mumble (namestring, m, sizeof (*m));
1205
1206   *((Lisp_Object *)(offset + (char *)XCONSOLE (Vconsole_local_symbols)))
1207     = intern (namestring);
1208 }
1209
1210 static void
1211 nuke_all_console_slots (struct console *con, Lisp_Object zap)
1212 {
1213   zero_lcrecord (con);
1214
1215 #define MARKED_SLOT(x)  con->x = (zap);
1216 #include "conslots.h"
1217 #undef MARKED_SLOT
1218 }
1219
1220 void
1221 complex_vars_of_console (void)
1222 {
1223   /* Make sure all markable slots in console_defaults
1224      are initialized reasonably, so mark_console won't choke.
1225    */
1226   struct console *defs = alloc_lcrecord_type (struct console, lrecord_console);
1227   struct console *syms = alloc_lcrecord_type (struct console, lrecord_console);
1228
1229   staticpro (&Vconsole_defaults);
1230   staticpro (&Vconsole_local_symbols);
1231   XSETCONSOLE (Vconsole_defaults, defs);
1232   XSETCONSOLE (Vconsole_local_symbols, syms);
1233
1234   nuke_all_console_slots (syms, Qnil);
1235   nuke_all_console_slots (defs, Qnil);
1236
1237   /* Set up the non-nil default values of various console slots.
1238      Must do these before making the first console.
1239      */
1240   /* #### Anything needed here? */
1241
1242   {
1243     /*  0 means var is always local.  Default used only at creation.
1244      * -1 means var is always local.  Default used only at reset and
1245      *    creation.
1246      * -2 means there's no lisp variable corresponding to this slot
1247      *    and the default is only used at creation.
1248      * -3 means no Lisp variable.  Default used only at reset and creation.
1249      * >0 is mask.  Var is local if ((console->local_var_flags & mask) != 0)
1250      *              Otherwise default is used.
1251      *
1252      * #### We don't currently ever reset console variables, so there
1253      * is no current distinction between 0 and -1, and between -2 and -3.
1254      */
1255     Lisp_Object always_local_resettable = make_int (-1);
1256
1257 #if 0 /* not used */
1258     Lisp_Object always_local_no_default = make_int (0);
1259     Lisp_Object resettable = make_int (-3);
1260 #endif
1261
1262     /* Assign the local-flags to the slots that have default values.
1263        The local flag is a bit that is used in the console
1264        to say that it has its own local value for the slot.
1265        The local flag bits are in the local_var_flags slot of the
1266        console.  */
1267
1268     nuke_all_console_slots (&console_local_flags, make_int (-2));
1269     console_local_flags.defining_kbd_macro = always_local_resettable;
1270     console_local_flags.last_kbd_macro = always_local_resettable;
1271     console_local_flags.prefix_arg = always_local_resettable;
1272     console_local_flags.default_minibuffer_frame = always_local_resettable;
1273     console_local_flags.overriding_terminal_local_map =
1274       always_local_resettable;
1275 #ifdef HAVE_TTY
1276     console_local_flags.tty_erase_char = always_local_resettable;
1277 #endif
1278
1279     console_local_flags.function_key_map = make_int (1);
1280
1281     /* #### Warning, 0x4000000 (that's six zeroes) is the largest number
1282        currently allowable due to the XINT() handling of this value.
1283        With some rearrangement you can get 4 more bits. */
1284   }
1285
1286   DEFVAR_CONSOLE_DEFAULTS ("default-function-key-map", function_key_map /*
1287 Default value of `function-key-map' for consoles that don't override it.
1288 This is the same as (default-value 'function-key-map).
1289 */ );
1290
1291   DEFVAR_CONSOLE_LOCAL ("function-key-map", function_key_map /*
1292 Keymap mapping ASCII function key sequences onto their preferred forms.
1293 This allows Emacs to recognize function keys sent from ASCII
1294 terminals at any point in a key sequence.
1295
1296 The `read-key-sequence' function replaces any subsequence bound by
1297 `function-key-map' with its binding.  More precisely, when the active
1298 keymaps have no binding for the current key sequence but
1299 `function-key-map' binds a suffix of the sequence to a vector or string,
1300 `read-key-sequence' replaces the matching suffix with its binding, and
1301 continues with the new sequence.
1302
1303 The events that come from bindings in `function-key-map' are not
1304 themselves looked up in `function-key-map'.
1305
1306 For example, suppose `function-key-map' binds `ESC O P' to [f1].
1307 Typing `ESC O P' to `read-key-sequence' would return
1308 \[#<keypress-event f1>].  Typing `C-x ESC O P' would return
1309 \[#<keypress-event control-X> #<keypress-event f1>].  If [f1]
1310 were a prefix key, typing `ESC O P x' would return
1311 \[#<keypress-event f1> #<keypress-event x>].
1312 */ );
1313
1314 #ifdef HAVE_TTY
1315   /* ### Should this somehow go to TTY data?  How do we make it
1316      accessible from Lisp, then?  */
1317   DEFVAR_CONSOLE_LOCAL ("tty-erase-char", tty_erase_char /*
1318 The ERASE character as set by the user with stty.
1319 When this value cannot be determined or would be meaningless (on non-TTY
1320 consoles, for example), it is set to nil.
1321 */ );
1322 #endif
1323
1324   /* While this should be CONST it can't be because some things
1325      (i.e. edebug) do manipulate it. */
1326   DEFVAR_CONSOLE_LOCAL ("defining-kbd-macro", defining_kbd_macro /*
1327 Non-nil while a console macro is being defined.  Don't set this!
1328 */ );
1329
1330   DEFVAR_CONSOLE_LOCAL ("last-kbd-macro", last_kbd_macro /*
1331 Last kbd macro defined, as a vector of events; nil if none defined.
1332 */ );
1333
1334   DEFVAR_CONSOLE_LOCAL ("prefix-arg", prefix_arg /*
1335 The value of the prefix argument for the next editing command.
1336 It may be a number, or the symbol `-' for just a minus sign as arg,
1337 or a list whose car is a number for just one or more C-U's
1338 or nil if no argument has been specified.
1339
1340 You cannot examine this variable to find the argument for this command
1341 since it has been set to nil by the time you can look.
1342 Instead, you should use the variable `current-prefix-arg', although
1343 normally commands can get this prefix argument with (interactive "P").
1344 */ );
1345
1346   DEFVAR_CONSOLE_LOCAL ("default-minibuffer-frame",
1347                         default_minibuffer_frame /*
1348 Minibufferless frames use this frame's minibuffer.
1349
1350 Emacs cannot create minibufferless frames unless this is set to an
1351 appropriate surrogate.
1352
1353 XEmacs consults this variable only when creating minibufferless
1354 frames; once the frame is created, it sticks with its assigned
1355 minibuffer, no matter what this variable is set to.  This means that
1356 this variable doesn't necessarily say anything meaningful about the
1357 current set of frames, or where the minibuffer is currently being
1358 displayed.
1359 */ );
1360
1361   DEFVAR_CONSOLE_LOCAL ("overriding-terminal-local-map",
1362                         overriding_terminal_local_map /*
1363 Keymap that overrides all other local keymaps, for the selected console only.
1364 If this variable is non-nil, it is used as a keymap instead of the
1365 buffer's local map, and the minor mode keymaps and text property keymaps.
1366 */ );
1367
1368   /* Check for DEFVAR_CONSOLE_LOCAL without initializing the corresponding
1369      slot of console_local_flags and vice-versa.  Must be done after all
1370      DEFVAR_CONSOLE_LOCAL() calls. */
1371 #define MARKED_SLOT(slot)                                       \
1372   if ((XINT (console_local_flags.slot) != -2 &&                 \
1373          XINT (console_local_flags.slot) != -3)                 \
1374       != !(NILP (XCONSOLE (Vconsole_local_symbols)->slot)))     \
1375   abort ()
1376 #include "conslots.h"
1377 #undef MARKED_SLOT
1378 }