X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/c044516d384ff70e820686d4e995dcc23ee22e6f..f76840f36cf60feecaf21d55d24ace948800fef7:/src/terminal.c diff --git a/src/terminal.c b/src/terminal.c index fa6a0a4f51..46ffb3c2dc 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -1,11 +1,11 @@ /* Functions related to terminal devices. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of GNU Emacs. 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 2, or (at your option) +the Free Software Foundation; either version 3, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, @@ -205,24 +205,17 @@ get_terminal (Lisp_Object terminal, int throw) if (NILP (terminal)) terminal = selected_frame; - if (INTEGERP (terminal)) - { - struct terminal *t; + if (TERMINALP (terminal)) + result = XTERMINAL (terminal); - for (t = terminal_list; t; t = t->next_terminal) - { - if (t->id == XINT (terminal)) - { - result = t; - break; - } - } - } else if (FRAMEP (terminal)) { result = FRAME_TERMINAL (XFRAME (terminal)); } + if (result && !result->name) + result = NULL; + if (result == NULL && throw) wrong_type_argument (Qterminal_live_p, terminal); @@ -236,9 +229,9 @@ get_terminal (Lisp_Object terminal, int throw) struct terminal * create_terminal (void) { - struct terminal *terminal = (struct terminal *) xmalloc (sizeof (struct terminal)); - - bzero (terminal, sizeof (struct terminal)); + struct terminal *terminal = allocate_terminal (); + + terminal->name = NULL; terminal->next_terminal = terminal_list; terminal_list = terminal; @@ -256,30 +249,23 @@ create_terminal (void) return terminal; } -/* Mark the Lisp pointers in the terminal objects. - Called by the Fgarbage_collector. */ - -void -mark_terminals (void) -{ - struct terminal *t; - for (t = terminal_list; t; t = t->next_terminal) - { - mark_object (t->param_alist); - } -} - - -/* Remove a terminal from the terminal list and free its memory. */ +/* Low-level function to close all frames on a terminal, remove it + from the terminal list and free its memory. */ void delete_terminal (struct terminal *terminal) { struct terminal **tp; Lisp_Object tail, frame; - - /* Check for and close live frames that are still on this - terminal. */ + + /* Protect against recursive calls. Fdelete_frame calls the + delete_terminal_hook when we delete our last frame. */ + if (!terminal->name) + return; + xfree (terminal->name); + terminal->name = NULL; + + /* Check for live frames that are still on this terminal. */ FOR_EACH_FRAME (tail, frame) { struct frame *f = XFRAME (frame); @@ -294,20 +280,18 @@ delete_terminal (struct terminal *terminal) abort (); *tp = terminal->next_terminal; - if (terminal->keyboard_coding) - xfree (terminal->keyboard_coding); - if (terminal->terminal_coding) - xfree (terminal->terminal_coding); - if (terminal->name) - xfree (terminal->name); + xfree (terminal->keyboard_coding); + 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); + { + delete_kboard (terminal->kboard); + terminal->kboard = NULL; + } #endif - - bzero (terminal, sizeof (struct terminal)); - xfree (terminal); } DEFUN ("delete-terminal", Fdelete_terminal, Sdelete_terminal, 0, 2, 0, @@ -358,12 +342,16 @@ The terminal device is represented by its integer identifier. */) CHECK_LIVE_FRAME (frame); - t = get_terminal (frame, 0); + t = FRAME_TERMINAL (XFRAME (frame)); if (!t) return Qnil; else - return make_number (t->id); + { + Lisp_Object terminal; + XSETTERMINAL (terminal, t); + return terminal; + } } DEFUN ("terminal-live-p", Fterminal_live_p, Sterminal_live_p, 1, 1, 0, @@ -371,17 +359,12 @@ DEFUN ("terminal-live-p", Fterminal_live_p, Sterminal_live_p, 1, 1, 0, Value is nil if OBJECT is not a live display terminal. If object is a live display terminal, the return value indicates what sort of output terminal it uses. See the documentation of `framep' for -possible return values. - -Display terminals are represented by their integer identifiers. */) +possible return values. */) (object) Lisp_Object object; { struct terminal *t; - if (!INTEGERP (object)) - return Qnil; - t = get_terminal (object, 0); if (!t) @@ -406,15 +389,17 @@ Display terminals are represented by their integer identifiers. */) } DEFUN ("terminal-list", Fterminal_list, Sterminal_list, 0, 0, 0, - doc: /* Return a list of all terminal devices. -Terminal devices are represented by their integer identifiers. */) + doc: /* Return a list of all terminal devices. */) () { - Lisp_Object terminals = Qnil; + Lisp_Object terminal, terminals = Qnil; struct terminal *t; for (t = terminal_list; t; t = t->next_terminal) - terminals = Fcons (make_number (t->id), terminals); + { + XSETTERMINAL (terminal, t); + terminals = Fcons (terminal, terminals); + } return terminals; } @@ -428,12 +413,10 @@ selected frame's terminal). */) (terminal) Lisp_Object terminal; { - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t + = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); - if (t->name) - return build_string (t->name); - else - return Qnil; + return t->name ? build_string (t->name) : Qnil; } @@ -484,7 +467,8 @@ frame's terminal). */) (terminal) Lisp_Object terminal; { - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t + = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); return Fcopy_alist (t->param_alist); } @@ -497,54 +481,13 @@ frame's terminal). */) Lisp_Object parameter; { Lisp_Object value; - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t + = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); CHECK_SYMBOL (parameter); value = Fcdr (Fassq (parameter, t->param_alist)); return value; } -DEFUN ("modify-terminal-parameters", Fmodify_terminal_parameters, - Smodify_terminal_parameters, 2, 2, 0, - doc: /* Modify the parameters of terminal TERMINAL according to ALIST. -ALIST is an alist of parameters to change and their new values. -Each element of ALIST has the form (PARM . VALUE), where PARM is a symbol. - -TERMINAL can be a terminal id, a frame or nil (meaning the selected -frame's terminal). */) - (terminal, alist) - Lisp_Object terminal; - Lisp_Object alist; -{ - Lisp_Object tail, prop, val; - struct terminal *t = get_terminal (terminal, 1); - int length = XINT (Fsafe_length (alist)); - int i; - Lisp_Object *parms = (Lisp_Object *) alloca (length * sizeof (Lisp_Object)); - Lisp_Object *values = (Lisp_Object *) alloca (length * sizeof (Lisp_Object)); - - /* Extract parm names and values into those vectors. */ - - i = 0; - for (tail = alist; CONSP (tail); tail = Fcdr (tail)) - { - Lisp_Object elt; - - elt = Fcar (tail); - parms[i] = Fcar (elt); - values[i] = Fcdr (elt); - i++; - } - - /* Now process them in reverse of specified order. */ - for (i--; i >= 0; i--) - { - prop = parms[i]; - val = values[i]; - store_terminal_param (t, prop, val); - } - return Qnil; -} - DEFUN ("set-terminal-parameter", Fset_terminal_parameter, Sset_terminal_parameter, 3, 3, 0, doc: /* Set TERMINAL's value for parameter PARAMETER to VALUE. @@ -557,7 +500,8 @@ frame's terminal). */) Lisp_Object parameter; Lisp_Object value; { - struct terminal *t = get_terminal (terminal, 1); + struct terminal *t + = TERMINALP (terminal) ? XTERMINAL (terminal) : get_terminal (terminal, 1); return store_terminal_param (t, parameter, value); } @@ -575,8 +519,9 @@ 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. */ @@ -612,7 +557,6 @@ The function should accept no arguments. */); defsubr (&Sterminal_name); defsubr (&Sterminal_parameters); defsubr (&Sterminal_parameter); - defsubr (&Smodify_terminal_parameters); defsubr (&Sset_terminal_parameter); Fprovide (intern ("multi-tty"), Qnil);