X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/5b8de9c5e6ae9df7de19ad97143553eeb8a2573a..d66c02414328a8aa8c305853cea8c591c0278a11:/src/terminal.c diff --git a/src/terminal.c b/src/terminal.c index bbc2fd74c2..0b1e9f3257 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -3,10 +3,10 @@ This file is part of GNU Emacs. -GNU Emacs is free software; you can redistribute it and/or modify +GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,9 +14,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -Boston, MA 02110-1301, USA. */ +along with GNU Emacs. If not, see . */ #include #include @@ -258,7 +256,7 @@ delete_terminal (struct terminal *terminal) struct terminal **tp; Lisp_Object tail, frame; - /* Protect against recursive calls. Fdelete_frame calls the + /* Protect against recursive calls. delete_frame calls the delete_terminal_hook when we delete our last frame. */ if (!terminal->name) return; @@ -271,8 +269,8 @@ delete_terminal (struct terminal *terminal) struct frame *f = XFRAME (frame); if (FRAME_LIVE_P (f) && f->terminal == terminal) { - /* Maybe this should pass Qnoelisp rather than Qt? */ - Fdelete_frame (frame, Qt); + /* Pass Qnoelisp rather than Qt. */ + delete_frame (frame, Qnoelisp); } } @@ -285,16 +283,18 @@ delete_terminal (struct terminal *terminal) terminal->keyboard_coding = NULL; xfree (terminal->terminal_coding); terminal->terminal_coding = NULL; - -#ifdef MULTI_KBOARD + if (terminal->kboard && --terminal->kboard->reference_count == 0) { delete_kboard (terminal->kboard); terminal->kboard = NULL; } -#endif } +Lisp_Object Qrun_hook_with_args; +static Lisp_Object Qdelete_terminal_functions; +static Lisp_Object Vdelete_terminal_functions; + DEFUN ("delete-terminal", Fdelete_terminal, Sdelete_terminal, 0, 2, 0, doc: /* Delete TERMINAL by deleting all frames on it and closing the terminal. TERMINAL may be a terminal id, a frame, or nil (meaning the selected @@ -315,11 +315,21 @@ but if the second argument FORCE is non-nil, you may do so. */) struct terminal *p = terminal_list; while (p && (p == t || !TERMINAL_ACTIVE_P (p))) p = p->next_terminal; - + if (!p) error ("Attempt to delete the sole active display terminal"); } + if (NILP (Vrun_hooks)) + ; + else if (EQ (force, Qnoelisp)) + pending_funcalls + = Fcons (list3 (Qrun_hook_with_args, + Qdelete_terminal_functions, terminal), + pending_funcalls); + else + safe_call2 (Qrun_hook_with_args, Qdelete_terminal_functions, terminal); + if (t->delete_terminal_hook) (*t->delete_terminal_hook) (t); else @@ -366,7 +376,7 @@ possible return values. */) Lisp_Object object; { struct terminal *t; - + t = get_terminal (object, 0); if (!t) @@ -385,6 +395,8 @@ possible return values. */) return Qpc; case output_mac: return Qmac; + case output_ns: + return Qns; default: abort (); } @@ -521,9 +533,7 @@ init_initial_terminal (void) initial_terminal = create_terminal (); initial_terminal->type = output_initial; initial_terminal->name = xstrdup ("initial_terminal"); -#ifdef MULTI_KBOARD initial_terminal->kboard = initial_kboard; -#endif initial_terminal->delete_terminal_hook = &delete_initial_terminal; /* All other hooks are NULL. */ @@ -552,6 +562,17 @@ syms_of_terminal () The function should accept no arguments. */); Vring_bell_function = Qnil; + DEFVAR_LISP ("delete-terminal-functions", &Vdelete_terminal_functions, + doc: /* Special hook run when a terminal is deleted. +Each function is called with argument, the terminal. +This may be called just before actually deleting the terminal, +or some time later. */); + Vdelete_terminal_functions = Qnil; + Qdelete_terminal_functions = intern ("delete-terminal-functions"); + staticpro (&Qdelete_terminal_functions); + Qrun_hook_with_args = intern ("run-hook-with-args"); + staticpro (&Qrun_hook_with_args); + defsubr (&Sdelete_terminal); defsubr (&Sframe_terminal); defsubr (&Sterminal_live_p);