comparison src/console.c @ 0:376386a54a3c r19-14

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